Spack-Manager Structure
=======================

Spack-Manager is a Spack extension that provides a way for software applications
to configure their usage of spack.

.. figure:: ./application-workflow.png
   :width: 100%

   An example of generalized infrastructure requirements that are common across HPC and scientific computing applications. Spack-Manager's goal is to empower these types of infrastructures while still allowing application teams to drive the details.

The code of Spack-Manager is independent of each individual application and each
application code needs to configure a Spack-Manager `Project` to tell Spack-Manager how to work
with their application.

.. figure:: ./Spack-Manager-Org.png
   :width: 50%

   Spack-Manager is designed to provide an abstraction that can support multiple application teams. Each team develops a Project that can be registered with an instance of Spack-Manager.

A `Project` at its core is simply a collection of `spack configuration files`_ and `spack package repositories`_.
A few other optional hooks will be discussed below.

The configuration files in a `Project` are organized based on the configuration bifurcations that the projects supports.
These are called `Machines` based on the guiding principle that spack configurations typically have to be
changed when the machine/system is changed.

`Projects` can be registered with Spack-Manager by adding them to the `spack-manager.yaml` configuration file.
This file lives in the Spack-Manager directory and controls settings for `Spack-Manager` and the `Projects` that
are registered.

.. code-block:: yaml

   spack-manager:
     projects:
       - /path/to/project_a
         default_view: False
       - $HOME/project_b

Information on configuring a new `Project` can be found in the system administrator profile documentation `here`_.

.. figure:: ./ApplicationSpace.png
   :width: 100%

   The end goal of many code application and DevOps teams is to efficiently span the space of platform permutations and project variations.

.. _spack configuration files: https://spack.readthedocs.io/en/latest/configuration.html
.. _spack package repositories: https://spack.readthedocs.io/en/latest/repositories.html
.. _here: https://sandialabs.github.io/spack-manager/user_profiles/system_admins/creating_a_project.html