From aba49444120119d9f7abcbe564f025f0e16cd9b8 Mon Sep 17 00:00:00 2001 From: lnakata Date: Mon, 12 Jan 2026 17:59:36 -0800 Subject: [PATCH 01/17] Update data-and-storage.md Added a little clarification to /sdf/data snapshot paths --- data-and-storage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data-and-storage.md b/data-and-storage.md index 0391a3e..eb4690f 100644 --- a/data-and-storage.md +++ b/data-and-storage.md @@ -43,7 +43,7 @@ can be found at\ `/sdf/{home, sw, group}/.snapshots//` GMT_time indicates the time the snapshot directory was created. Choose a time that corresponds to the file versions you want and simply copy back the files. -- Files/objects under `/sdf/data` will be backed up or archived according to a data retention policy defined by the facility. Facilities will be responsible for covering the media costs and overhead required by their policy. Similar to the /sdf/home area, you can also check in /sdf/data/\/.snapshots to see if snapshots are enabled for self-service restores. +- Files/objects under `/sdf/data` will be backed up or archived according to a data retention policy defined by the facility. Facilities will be responsible for covering the media costs and overhead required by their policy. Similar to the /sdf/home area (but with a slightly different path structure), you can also check in /sdf/data/\/.snapshots to see if snapshots are enabled for self-service restores. - The scratch spaces under `/sdf/scratch` and all directories named "nobackup" (located *anywhere* in any /sdf path) will not be backed up or archived. Please use as many "nobackup" subdirectory locations as required for any files that do not need backup. That can save significant tape and processing resources. From 3d98852562b078df8a94cf59d962d0f12bef9e7c Mon Sep 17 00:00:00 2001 From: pjpascual Date: Thu, 22 Jan 2026 16:56:54 -0800 Subject: [PATCH 02/17] Update S3DF conda usage example --- conda.md | 241 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 157 insertions(+), 84 deletions(-) diff --git a/conda.md b/conda.md index ea5035a..ef8bc20 100644 --- a/conda.md +++ b/conda.md @@ -1,26 +1,46 @@ # Conda -> [!IMPORTANT] -> It is not recommended to store your conda environments in your $HOME due to 1) quota limits, and 2) an inability to share conda environments across groups. We generally recommend that you install software into your facility's group space (e.g., `/sdf/group//sw` - please see [facility storage](getting-started.md#group)). The following instructions for deploying Miniconda assume that you have write permissions in those directories. If you require write access, please consult with your facility's computing czar. The czar(s) for an S3DF facility can be found [here](https://coact.slac.stanford.edu/facilities). +[Conda](https://docs.conda.io/projects/conda/en/latest/index.html) and other Python package management tools such as [UV](https://docs.astral.sh/uv/) and [Poetry](https://python-poetry.org/) allow for easier installation and deployment of Python applications with complex dependencies. The following guide covers common usage patterns for Conda on S3DF. -## Option 1) Install Miniconda +## Conda Deployment Methods -Download the latest version of Miniconda from the [conda](https://docs.conda.io/en/latest/miniconda.html) website and follow the [Instructions](https://conda.io/projects/conda/en/latest/user-guide/install/linux.html#installing-on-linux). Change the installion `prefix` to point to an appropriate [facility directory](getting-started.md#group) replacing `` with the name of your facility as follows: +### Facility installation of Miniconda + +An S3DF facility (https://s3df.slac.stanford.edu/#/contact-us?id=poc) typically maintains software deployments relevant to its users under a path in that facility's group space, such as `/sdf/group//sw`. The computing czar for a facility, and those they grant permissions to, can install/manage software such as Conda under that facility's group space. + +Miniconda is a minimal distribution of Anaconda that contains Python, Conda, their dependencies, and some other useful packages. It is lightweight and has a smaller footprint than a full-fledged Conda or Anaconda deployment. Maintainers can download [Miniconda](https://docs.conda.io/en/latest/miniconda.html) and follow the [installation instructions](https://conda.io/projects/conda/en/latest/user-guide/install/linux.html#installing-on-linux) guide. The installation path can be overridden to point to an appropriate path under the facility group space as follows (replace `` with the name of the appropriate S3DF facility): ```bash -wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/Miniconda3-latest-Linux-x86_64.sh -bash /tmp/Miniconda3-latest-Linux-x86_64.sh -p /sdf/group//sw/conda/ +$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/Miniconda3-latest-Linux-x86_64.sh +$ bash /tmp/Miniconda3-latest-Linux-x86_64.sh -p /sdf/group//sw/conda/ ``` -Add the newly installed conda binary to your `$PATH` environment variable: +Users can add the newly-installed Conda binary to their `$PATH` environment variable by running: ```bash -export PATH=${PATH}:/sdf/group//sw/conda/bin +$ export PATH=${PATH}:/sdf/group//sw/conda/bin ``` -Modify your local [~/.condarc](https://conda.io/projects/conda/en/latest/user-guide/configuration/use-condarc.html) file to enable the creation of new envs and installation of packages to your facility's conda install directory: +## Conda Environments + +The most common use case for Conda is to resolve and manage Python application dependencies. [Conda environments](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html) allow Python applications to have their own installation environments isolated from each other, with the goal of reducing conflicts between applications that require different versions of the same packages. Users can invoke the environment that has the dependencies required for a specific Python application and run the application within that environment, in isolation from other applications. + +Deploying Conda environments requires the following: +* Access to a `conda` binary executable +* Filesystem permissions to write to the directory where the Conda environment(s) will be stored +* Access (usually over the network) to any Python package repositories required (e.g., [the Python Package Index (PyPI)](https://pypi.org/) for the application +* Sufficient disk space in the env location to store the package artifacts + +### Creating a Conda environment + +Users can modify their individual Conda startup configuration file to set the default Python package channels, any packages, and override the default install path for new Conda envs, among other settings (for a complete list, see: https://conda.io/projects/conda/en/latest/user-guide/configuration/use-condarc.html). The following example configures Conda envs to: +* use the `defaults`, `anaconda`, `conda-forge`, and `pytorch` channels to access Python packages +* sets the environment to be installed under the `envs` directory of the facility's Conda instance +* sets the packages downloaded for environments to be installed under the `pkgs` directory of the facility's Conda instance + ```bash +$ cat ~/.condarc channels: - defaults - anaconda @@ -33,17 +53,16 @@ pkgs_dirs: auto_activate_base: false ``` -> [!TIP] -> This Miniconda installation should be used for an entire facility with conda environment(s) installed for the various facility users. Conda installations and packages can be quite large, so they are not recommended to be placed in $HOME. +Conda environments can be created declaratively using YAML files (see: https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#creating-an-environment-from-an-environment-yml-file). -### Create a conda environment +The following YAML manifest generates a Conda environment called `mytest` with these packages and their dependencies pre-installed: -Conda environments are a nice way of switching between different software versions/packages without multiple conda installs. - -There is no unique way to create a conda environment, we illustrate here how to do so from a .yaml file (see the conda [documentation](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#creating-an-environment-from-an-environment-yml-file) for more details). - -In order to create an environment called `mytest` with `python=3.12` and the `numpy` and `pandas` packages installed, create `mytest-env.yaml`: -```bash +* `python=3.12` +* `numpy` +* `pandas` + +``` +$ cat mytest-env.yaml name: mytest dependencies: - python=3.12 @@ -51,114 +70,168 @@ dependencies: - pandas ``` -Then run the following command: `conda env create -f mytest-env.yaml`. - -If successful, you should see `mytest` when listing your environments: `conda env list`. - -You can now activate your environment and use it: `conda activate mytest`. To double-check that you have the right packages, you can type `conda list` once in the environment and check that you see `numpy` and `pandas`. - -Additionally, existing conda environments can be exported into yaml-formatted files with `conda env export > my-existing-env.yaml`. +Create the Conda environment: +``` +$ conda env create -f mytest-env.yaml +``` -## Option 2) Create and/or pull a Conda container +Once created, the `mytest` env should appear when listing Conda environments (`` is a placeholder): +``` +$ conda env list +# conda environments: +# +base /sdf/group//sw/conda +mytest /sdf/group//sw/conda/envs/mytest +``` + +The Conda environment may be activated by running: +``` +$ conda activate mytest +``` -### Method 1 - Using Apptainer +Once the environment has been activated, the installed package list can be seen by running: +``` +(mytest) $ conda list +# packages in environment at /sdf/group//sw/conda/envs/mytest: +# +# Name Version Build Channel +[...] +numpy 2.1.0 py312h58c1407_1 conda-forge +[...] +pandas 2.2.2 pypi_0 pypi +[...] +python 3.12.5 h2ad013b_0_cpython conda-forge +[...] +``` +Note that the package list will show not only the pre-defined packages from the environment's YAML manifest, but any dependencies installed along with them. -Apptainer can be used directly on S3DF to build a specific Conda environment within a container and run it. In addition to providing a desired Conda enviroment as exampled above in `mytest-env.yaml`, an apptainer definition file specifies the image-building procedure for installing Conda and the desired environment packages. To start, create `mytest-app.def`: -```apptainer -Bootstrap: docker -From: continuumio/miniconda3:latest +Existing Conda environments can be exported into YAML manifests by running the following (change the name of the environment YAML file as desired): +``` +$ conda env export > my-existing-env.yaml +``` -%files - mytest-env.yaml /mytest-env.yaml +> [!Note] +> Conda environments should not be stored in the user $HOME directory due to quota limits (30GB per user) and the inability to share the environment with other users. It is recommended to install Conda and other software into the appropriate facility group space (e.g., `/sdf/group//sw` - please see [facility storage](getting-started.md#group)). To obtain proper filesystem permissions, please consult with the appropriate facility computing czar. The list of czars for S3DF facilities can be found at: https://coact.slac.stanford.edu/facilities. -%post - /opt/conda/bin/conda env create -f /mytest-env.yaml +## Containerizing Conda environments -%environment - source /opt/conda/etc/profile.d/conda.sh - conda activate mytest +Conda environments are designed to isolate a Python application and its dependencies. However, scientific applications frequently have a large number of heavyweight dependencies (e.g., `numpy` and `pandas`) that can utilize a large amount of disk space, as well as needing to be built against specific platforms and architectures for compatibility and performance. Additionally, re-deploying a Python application and its accompanying dependencies within a Conda environment to other systems (e.g., deploying the same application to SLAC and NERSC) can be time-consuming and lead to future maintenance issues as different deployments fall out of sync. Containerization (see: https://aws.amazon.com/what-is/containerization/) allows for the creation of an image that contains a full application stack all the way down to the operating system, which can be run on systems using a compatible container runtime such as `Docker`, `Podman`, `Apptainer`, etc. A Python application, with its accompanying Conda environment, Python packages, and the Conda installation itself, can be built into a container image. This can offer much more portability, especially when running applications in multiple high performance compute environments such as S3DF. -%runscript - exec "$@" -``` +### Creating, Publishing, and Running Conda Container Images in S3DF -To build the image (.sif file) run the command: +Container images can be built with a variety of tools in different container image formats, e.g. `Dockerfile`; it is recommended to use a format that conforms to the [Open Container Initiative (OCI)](https://opencontainers.org/) standard for portability and compatibility with the available userspace container runtime on S3DF ([Apptainer](https://apptainer.org/)). Docker images are supported by most container runtimes including Apptainer, thus allowing the container images to be used at multiple compute facilities. -`apptainer build --fakeroot mytest-env-image.sif mytest-env.def` +Due to the fact that Docker's container build utility (e.g. `docker build...`) requires admin privileges on the host build system, users must create their Docker container images on a non-S3DF host where they have admin privileges (e.g. a work laptop with `sudo` privileges). Once built, the container image can be uploaded to an online container repository such as [GitHub Container Registry (ghcr.io)](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry) or [GitLab Container Registry](https://docs.gitlab.com/user/packages/container_registry/), then pulled onto S3DF interactive or batch nodes using the `apptainer` container runtime. The following diagram shows the development lifecycle for an application container used on S3DF: +![S3DF container lifecycle](assets/S3DF_container_lifecycle.png) -This should create the Singularity image file: `mytest-env-image.sif` which contains the desired conda environment settings. +> [!NOTE] +> The host system platform and architecture where a container image is built may differ from the platform and architecture where the container is run. For example, container images can be built on a MacOS or Windows host system, while S3DF batch nodes are currently running RHEL8/Rocky Linux 8 (and will eventually be migrated to Rocky Linux 9/10 and beyond). Docker and other container build tools can be configured to target different platforms and architectures, so ensure that the built container image is compatible with the target platform and architecture on S3DF nodes. For more information, see: https://docs.docker.com/build/building/multi-platform/. -To use this apptainer interactively, simply run: +The following example shows the workflow for creating a Conda environment in a Docker container image: -`apptainer shell mytest-env-image.sif` +1. Create an example Conda environment using a YAML manifest: +``` +name: test-env +channels: + - default + - conda-forge +dependencies: + - python=3.9 + - bokeh=2.4.2 + - conda-forge::numpy=1.21.* + - nodejs=16.13.* + - flask + - pip + - pip: + - Flask-Testing +``` -which opens a terminal prompt within the image with the conda environment activated. Then, from within the Apptainer shell, running `python` opens a python terminal in the installed conda environment. +2. Create an entrypoint script that will be run whenever the image is invoked by a container runtime: +``` -Alternatively, the apptainer can be used as an executable to run a desired python script (e.g. `my_script.py`) by using the command: +#!/bin/bash --login -`apptainer run mytest-env-image.sif python my_script.py` +# The --login ensures the bash configuration is loaded, enabling Conda. -where the arguments following the .sif image are to be run as code within the container. +# Enable strict mode. -> [!TIP] -> Only the Singularity image file (.sif) needs to be provided to other S3DF users as everything is self-contained! +set -euo pipefail -> [!NOTE] -> Container images are immutable and must be rebuilt any time changes are needed in the conda environment. +# ... Run whatever commands ... -### Method 2 - Using Docker +echo "bash ${MINIFORGE3_DIR}/etc/profile.d/conda.sh" >> ${HOME}/.bashrc +echo "conda init bash" >> ${HOME}/.bashrc -Since Docker is not installed on S3DF, this method relies on building a docker container image on a *different* machine (e.g. a laptop), uploading that image to a repository such as [Docker Hub](https://hub.dockerhub.com), and pulling the remotely hosted image onto S3DF with Apptainer. This method is more complex than building and running a container image locally with Apptainer, but can be useful for users that already have docker container images built elsewhere. +# Temporarily disable strict mode and activate conda: -To begin, install docker on your local machine (not S3DF) by visiting the [Docker homepage](https://www.docker.com/get-started). Additionally, sign up for a free Docker Hub account if an online repository is needed. +set +euo pipefail +conda activate test-env -> [!TIP] -> To build a docker container on a Windows system, consider installing WSL2 (Windows Subsystem for Linux 2) first and then have Docker Desktop link to your WSL2 distribution. Then use docker commands from within WSL2 to ensure container compatibility since S3DF runs on a Linux system. +# Re-enable strict mode: -> [!WARNING] -> Docker Hub repositories are *PUBLIC* by default, so your container images will be visable by anyone on the internet. Be sure to make a private repo if needed, but doing so will require authentication when pushing/pulling images to/from Docker Hub. +set -euo pipefail +``` -Once an appropriate repo has been created (e.g. `docker.io//`), a docker image can be built with a provided Dockerfile: +3. Create a Dockerfile to copy the Conda environment manifest, create the Conda environment, and copy the entrypoint script into the container image ``` FROM continuumio/miniconda3:latest WORKDIR /app -COPY mytest-env.yaml . +COPY test-env.yaml . -RUN conda env create -f /app/mytest-env.yaml && conda clean -afy +RUN conda env create -f /app/test-env.yaml && conda clean -afy ENV PATH=/opt/conda/envs/test-env/bin:$PATH -CMD ["python"] -``` - -> [!NOTE] -> This file must be called `Dockerfile` and is used to build the container in the same directory as the `mytest-env.yaml` file. - -To build the container image, run the command: +COPY entrypoint.sh /entrypoint.sh -`docker build -t / .` +ENTRYPOINT ["/entrypoint.sh"] +``` -This will build the image within the Dockerfile directory and tag it to the name given by `/` with the Docker Hub username and repo name created earlier. Custom version tags can be appended as well for version control (e.g. `/:`), and if not specified, the default tag is `latest`. +4. On a build host with appropriate privileges, use the Docker runtime to build the image (replace `` and `` placeholders as appropriate). For further details, see [https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/](https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/): +``` +# '.' to build and tag an image using a Dockerfile in the current working directory +$ docker build -t / . +``` -> [!TIP] -> Once the docker container is built, it can be tested/debugged locally with `docker run -it /` which runs it in interactive mode. +5. Publish the image (may require authentication for private container repos. See: [https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/#publishing-images](https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/#publishing-images): +``` +$ docker push / +``` -Next, *push* (upload) the docker image to an online repository with the command: +6. Pull the published image onto an S3DF [interactive](https://s3df.slac.stanford.edu/#/interactive-compute?id=interactive-pools) or [batch](https://s3df.slac.stanford.edu/#/interactive-compute?id=interactive-compute-session-using-slurm) node in a specified path with the Apptainer container runtime (see the [S3DF Apptainer Usage documentation](https://s3df.slac.stanford.edu/#/apptainer?id=apptainer)): -`docker push /` +``` +# On an S3DF interactive or batch node +$ apptainer pull /test_img.sif docker:/// +``` -This will upload the container image to Docker Hub (or other specified online repository). +The Apptainer container image (`.sif`) can now be launched within an S3DF batch job or interactive batch session: +* Submit an S3DF batch job and load the Conda environment (see: [https://s3df.slac.stanford.edu/#/slurm?id=create-a-batch-script](https://s3df.slac.stanford.edu/#/slurm?id=create-a-batch-script)): +``` +#!/bin/bash -Now on S3DF, *pull* (download) the docker container image with Apptainer by using the command: +#SBATCH --partition=ampere +#SBATCH --job-name=test +#SBATCH --output=output-%j.txt +#SBATCH --error=output-%j.txt +#SBATCH --ntasks=1 +#SBATCH --cpus-per-task=12 +#SBATCH --mem-per-cpu=1g +#SBATCH --time=0-00:10:00 +#SBATCH --gpus 1 -`apptainer pull docker:///` +# invoke conda environment from container image -This will create a Singularity image file (.sif) with the automatically generated name based on the repo and tag name: `_latest.sif`. +apptainer shell /path/to/test_img.sif -Lastly, run the container image with Apptainer with the command: +``` +* Create an S3DF interactive batch session an invoke the Conda environment using (see: [https://s3df.slac.stanford.edu/#/interactive-compute?id=interactive-compute-session-using-slurm](https://s3df.slac.stanford.edu/#/interactive-compute?id=interactive-compute-session-using-slurm)): -`apptainer run _latest.sif` +``` +$ srun --partition --account : -n 1 --time=01:00:00 --pty /bin/bash -Based on the configuration of the Dockerfile above, the container will immediately open a python interface with the appropriate conda environment. +# once the interactive session has been scheduled, invoke a shell into the container image to load the Conda environment +$ apptainer shell /path/to/test_img.sif +``` From 8d8fadf48dd0946d1165c6f6c5a26a64c5d2fcbd Mon Sep 17 00:00:00 2001 From: pjpascual Date: Thu, 22 Jan 2026 17:00:21 -0800 Subject: [PATCH 03/17] Conda usage guide rendering fix attempt #1 --- conda.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/conda.md b/conda.md index ef8bc20..c1fcb3c 100644 --- a/conda.md +++ b/conda.md @@ -191,7 +191,9 @@ ENTRYPOINT ["/entrypoint.sh"] 4. On a build host with appropriate privileges, use the Docker runtime to build the image (replace `` and `` placeholders as appropriate). For further details, see [https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/](https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/): ``` + # '.' to build and tag an image using a Dockerfile in the current working directory + $ docker build -t / . ``` @@ -201,15 +203,17 @@ $ docker push / ``` 6. Pull the published image onto an S3DF [interactive](https://s3df.slac.stanford.edu/#/interactive-compute?id=interactive-pools) or [batch](https://s3df.slac.stanford.edu/#/interactive-compute?id=interactive-compute-session-using-slurm) node in a specified path with the Apptainer container runtime (see the [S3DF Apptainer Usage documentation](https://s3df.slac.stanford.edu/#/apptainer?id=apptainer)): - ``` + # On an S3DF interactive or batch node + $ apptainer pull /test_img.sif docker:/// ``` The Apptainer container image (`.sif`) can now be launched within an S3DF batch job or interactive batch session: * Submit an S3DF batch job and load the Conda environment (see: [https://s3df.slac.stanford.edu/#/slurm?id=create-a-batch-script](https://s3df.slac.stanford.edu/#/slurm?id=create-a-batch-script)): ``` + #!/bin/bash #SBATCH --partition=ampere From 2f2fc851e45ef28025b19a6044680574d6a04534 Mon Sep 17 00:00:00 2001 From: pjpascual Date: Thu, 22 Jan 2026 17:10:49 -0800 Subject: [PATCH 04/17] Conda usage guide rendering fix attempt #2 --- conda.md | 56 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/conda.md b/conda.md index c1fcb3c..52e0c83 100644 --- a/conda.md +++ b/conda.md @@ -40,7 +40,7 @@ Users can modify their individual Conda startup configuration file to set the de * sets the packages downloaded for environments to be installed under the `pkgs` directory of the facility's Conda instance ```bash -$ cat ~/.condarc +$ cat << EOF > ~/.condarc channels: - defaults - anaconda @@ -51,6 +51,8 @@ envs_dirs: pkgs_dirs: - /sdf/group//sw/conda/pkgs auto_activate_base: false + +EOF ``` Conda environments can be created declaratively using YAML files (see: https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#creating-an-environment-from-an-environment-yml-file). @@ -61,22 +63,24 @@ The following YAML manifest generates a Conda environment called `mytest` with t * `numpy` * `pandas` -``` -$ cat mytest-env.yaml +```bash +$ cat << EOF > mytest-env.yaml name: mytest dependencies: - python=3.12 - numpy - pandas + +EOF ``` Create the Conda environment: -``` +```bash $ conda env create -f mytest-env.yaml ``` Once created, the `mytest` env should appear when listing Conda environments (`` is a placeholder): -``` +```bash $ conda env list # conda environments: # @@ -85,12 +89,12 @@ mytest /sdf/group//sw/conda/envs/mytest ``` The Conda environment may be activated by running: -``` +```bash $ conda activate mytest ``` Once the environment has been activated, the installed package list can be seen by running: -``` +```bash (mytest) $ conda list # packages in environment at /sdf/group//sw/conda/envs/mytest: # @@ -106,7 +110,7 @@ python 3.12.5 h2ad013b_0_cpython conda-forge Note that the package list will show not only the pre-defined packages from the environment's YAML manifest, but any dependencies installed along with them. Existing Conda environments can be exported into YAML manifests by running the following (change the name of the environment YAML file as desired): -``` +```bash $ conda env export > my-existing-env.yaml ``` @@ -130,7 +134,8 @@ Due to the fact that Docker's container build utility (e.g. `docker build...`) r The following example shows the workflow for creating a Conda environment in a Docker container image: 1. Create an example Conda environment using a YAML manifest: -``` +```bash +$ cat << EOF > test-env.yaml name: test-env channels: - default @@ -144,36 +149,37 @@ dependencies: - pip - pip: - Flask-Testing -``` -2. Create an entrypoint script that will be run whenever the image is invoked by a container runtime: +EOF ``` +2. Create an entrypoint script that will be run whenever the image is invoked by a container runtime: +```bash +$ cat << EOF > entrypoint.sh #!/bin/bash --login # The --login ensures the bash configuration is loaded, enabling Conda. - # Enable strict mode. set -euo pipefail # ... Run whatever commands ... - echo "bash ${MINIFORGE3_DIR}/etc/profile.d/conda.sh" >> ${HOME}/.bashrc echo "conda init bash" >> ${HOME}/.bashrc # Temporarily disable strict mode and activate conda: - set +euo pipefail conda activate test-env # Re-enable strict mode: - set -euo pipefail + +EOF ``` 3. Create a Dockerfile to copy the Conda environment manifest, create the Conda environment, and copy the entrypoint script into the container image -``` +```bash +$ cat << EOF > Dockerfile FROM continuumio/miniconda3:latest WORKDIR /app @@ -187,13 +193,13 @@ ENV PATH=/opt/conda/envs/test-env/bin:$PATH COPY entrypoint.sh /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] -``` -4. On a build host with appropriate privileges, use the Docker runtime to build the image (replace `` and `` placeholders as appropriate). For further details, see [https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/](https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/): +EOF ``` +4. On a build host with appropriate privileges, use the Docker runtime to build the image (replace `` and `` placeholders as appropriate). For further details, see [https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/](https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/): +```bash # '.' to build and tag an image using a Dockerfile in the current working directory - $ docker build -t / . ``` @@ -203,17 +209,14 @@ $ docker push / ``` 6. Pull the published image onto an S3DF [interactive](https://s3df.slac.stanford.edu/#/interactive-compute?id=interactive-pools) or [batch](https://s3df.slac.stanford.edu/#/interactive-compute?id=interactive-compute-session-using-slurm) node in a specified path with the Apptainer container runtime (see the [S3DF Apptainer Usage documentation](https://s3df.slac.stanford.edu/#/apptainer?id=apptainer)): -``` - -# On an S3DF interactive or batch node - +```bash $ apptainer pull /test_img.sif docker:/// ``` The Apptainer container image (`.sif`) can now be launched within an S3DF batch job or interactive batch session: * Submit an S3DF batch job and load the Conda environment (see: [https://s3df.slac.stanford.edu/#/slurm?id=create-a-batch-script](https://s3df.slac.stanford.edu/#/slurm?id=create-a-batch-script)): -``` - +```bash +$ cat << EOF > submit_job.bash #!/bin/bash #SBATCH --partition=ampere @@ -227,13 +230,12 @@ The Apptainer container image (`.sif`) can now be launched within an S3DF batch #SBATCH --gpus 1 # invoke conda environment from container image - apptainer shell /path/to/test_img.sif ``` * Create an S3DF interactive batch session an invoke the Conda environment using (see: [https://s3df.slac.stanford.edu/#/interactive-compute?id=interactive-compute-session-using-slurm](https://s3df.slac.stanford.edu/#/interactive-compute?id=interactive-compute-session-using-slurm)): -``` +```bash $ srun --partition --account : -n 1 --time=01:00:00 --pty /bin/bash # once the interactive session has been scheduled, invoke a shell into the container image to load the Conda environment From aab48dd8b5793894c004566ada6c0c1cae130899 Mon Sep 17 00:00:00 2001 From: pjpascual Date: Thu, 22 Jan 2026 17:18:15 -0800 Subject: [PATCH 05/17] Conda usage guide rendering fix attempt #3 --- conda.md | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/conda.md b/conda.md index 52e0c83..9622618 100644 --- a/conda.md +++ b/conda.md @@ -63,7 +63,7 @@ The following YAML manifest generates a Conda environment called `mytest` with t * `numpy` * `pandas` -```bash +```yaml $ cat << EOF > mytest-env.yaml name: mytest dependencies: @@ -134,7 +134,7 @@ Due to the fact that Docker's container build utility (e.g. `docker build...`) r The following example shows the workflow for creating a Conda environment in a Docker container image: 1. Create an example Conda environment using a YAML manifest: -```bash +```yaml $ cat << EOF > test-env.yaml name: test-env channels: @@ -149,10 +149,8 @@ dependencies: - pip - pip: - Flask-Testing - EOF ``` - 2. Create an entrypoint script that will be run whenever the image is invoked by a container runtime: ```bash $ cat << EOF > entrypoint.sh @@ -176,7 +174,6 @@ set -euo pipefail EOF ``` - 3. Create a Dockerfile to copy the Conda environment manifest, create the Conda environment, and copy the entrypoint script into the container image ```bash $ cat << EOF > Dockerfile @@ -193,21 +190,17 @@ ENV PATH=/opt/conda/envs/test-env/bin:$PATH COPY entrypoint.sh /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] - EOF ``` - 4. On a build host with appropriate privileges, use the Docker runtime to build the image (replace `` and `` placeholders as appropriate). For further details, see [https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/](https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/): ```bash # '.' to build and tag an image using a Dockerfile in the current working directory $ docker build -t / . ``` - 5. Publish the image (may require authentication for private container repos. See: [https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/#publishing-images](https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/#publishing-images): ``` $ docker push / ``` - 6. Pull the published image onto an S3DF [interactive](https://s3df.slac.stanford.edu/#/interactive-compute?id=interactive-pools) or [batch](https://s3df.slac.stanford.edu/#/interactive-compute?id=interactive-compute-session-using-slurm) node in a specified path with the Apptainer container runtime (see the [S3DF Apptainer Usage documentation](https://s3df.slac.stanford.edu/#/apptainer?id=apptainer)): ```bash $ apptainer pull /test_img.sif docker:/// @@ -231,7 +224,7 @@ $ cat << EOF > submit_job.bash # invoke conda environment from container image apptainer shell /path/to/test_img.sif - +EOF ``` * Create an S3DF interactive batch session an invoke the Conda environment using (see: [https://s3df.slac.stanford.edu/#/interactive-compute?id=interactive-compute-session-using-slurm](https://s3df.slac.stanford.edu/#/interactive-compute?id=interactive-compute-session-using-slurm)): From bc51f92d1548a1bfa581d9b49620e76bd57f6aaa Mon Sep 17 00:00:00 2001 From: pjpascual Date: Thu, 22 Jan 2026 17:25:23 -0800 Subject: [PATCH 06/17] Conda usage guide rendering fix attempt #4 --- conda.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/conda.md b/conda.md index 9622618..5e5f499 100644 --- a/conda.md +++ b/conda.md @@ -70,7 +70,6 @@ dependencies: - python=3.12 - numpy - pandas - EOF ``` @@ -131,11 +130,9 @@ Due to the fact that Docker's container build utility (e.g. `docker build...`) r > [!NOTE] > The host system platform and architecture where a container image is built may differ from the platform and architecture where the container is run. For example, container images can be built on a MacOS or Windows host system, while S3DF batch nodes are currently running RHEL8/Rocky Linux 8 (and will eventually be migrated to Rocky Linux 9/10 and beyond). Docker and other container build tools can be configured to target different platforms and architectures, so ensure that the built container image is compatible with the target platform and architecture on S3DF nodes. For more information, see: https://docs.docker.com/build/building/multi-platform/. -The following example shows the workflow for creating a Conda environment in a Docker container image: - +The following example shows the workflow for creating a Conda environment in a Docker container image. 1. Create an example Conda environment using a YAML manifest: ```yaml -$ cat << EOF > test-env.yaml name: test-env channels: - default @@ -149,7 +146,6 @@ dependencies: - pip - pip: - Flask-Testing -EOF ``` 2. Create an entrypoint script that will be run whenever the image is invoked by a container runtime: ```bash @@ -171,7 +167,6 @@ conda activate test-env # Re-enable strict mode: set -euo pipefail - EOF ``` 3. Create a Dockerfile to copy the Conda environment manifest, create the Conda environment, and copy the entrypoint script into the container image From 41a730fc654a6add5d948592e7d3c0c0288afb44 Mon Sep 17 00:00:00 2001 From: pjpascual Date: Thu, 22 Jan 2026 17:43:54 -0800 Subject: [PATCH 07/17] Conda usage guide rendering fix attempt #5 --- conda.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/conda.md b/conda.md index 5e5f499..0f8c6b1 100644 --- a/conda.md +++ b/conda.md @@ -67,9 +67,9 @@ The following YAML manifest generates a Conda environment called `mytest` with t $ cat << EOF > mytest-env.yaml name: mytest dependencies: - - python=3.12 - - numpy - - pandas + - python=3.12 + - numpy + - pandas EOF ``` @@ -135,17 +135,17 @@ The following example shows the workflow for creating a Conda environment in a D ```yaml name: test-env channels: - - default - - conda-forge + - default + - conda-forge dependencies: - - python=3.9 - - bokeh=2.4.2 - - conda-forge::numpy=1.21.* - - nodejs=16.13.* - - flask - - pip - - pip: - - Flask-Testing + - python=3.9 + - bokeh=2.4.2 + - conda-forge::numpy=1.21.* + - nodejs=16.13.* + - flask + - pip + - pip: + - Flask-Testing ``` 2. Create an entrypoint script that will be run whenever the image is invoked by a container runtime: ```bash From 30f56b3e034c2cac709abe85973d2fffb3904cd2 Mon Sep 17 00:00:00 2001 From: pjpascual Date: Thu, 22 Jan 2026 18:07:43 -0800 Subject: [PATCH 08/17] Conda usage guide rendering fix attempt #6 --- conda.md | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/conda.md b/conda.md index 0f8c6b1..aa86423 100644 --- a/conda.md +++ b/conda.md @@ -64,13 +64,12 @@ The following YAML manifest generates a Conda environment called `mytest` with t * `pandas` ```yaml -$ cat << EOF > mytest-env.yaml +--- name: mytest dependencies: - - python=3.12 - - numpy - - pandas -EOF + - python=3.12 + - numpy + - pandas ``` Create the Conda environment: @@ -133,38 +132,34 @@ Due to the fact that Docker's container build utility (e.g. `docker build...`) r The following example shows the workflow for creating a Conda environment in a Docker container image. 1. Create an example Conda environment using a YAML manifest: ```yaml +--- name: test-env channels: - - default - - conda-forge + - default + - conda-forge dependencies: - - python=3.9 - - bokeh=2.4.2 - - conda-forge::numpy=1.21.* - - nodejs=16.13.* - - flask - - pip - - pip: - - Flask-Testing + - python=3.9 + - bokeh=2.4.2 + - conda-forge::numpy=1.21.* + - nodejs=16.13.* + - flask + - pip + - pip: + - Flask-Testing ``` 2. Create an entrypoint script that will be run whenever the image is invoked by a container runtime: ```bash $ cat << EOF > entrypoint.sh #!/bin/bash --login - # The --login ensures the bash configuration is loaded, enabling Conda. # Enable strict mode. - set -euo pipefail - # ... Run whatever commands ... echo "bash ${MINIFORGE3_DIR}/etc/profile.d/conda.sh" >> ${HOME}/.bashrc echo "conda init bash" >> ${HOME}/.bashrc - # Temporarily disable strict mode and activate conda: set +euo pipefail conda activate test-env - # Re-enable strict mode: set -euo pipefail EOF From a6db5f1022d1f2125b71467a70c64e183c9131be Mon Sep 17 00:00:00 2001 From: pjpascual Date: Thu, 22 Jan 2026 18:23:47 -0800 Subject: [PATCH 09/17] Task: Add S3DF container lifecycle diagram. --- assets/S3DF_container_lifecycle.png | Bin 0 -> 108001 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/S3DF_container_lifecycle.png diff --git a/assets/S3DF_container_lifecycle.png b/assets/S3DF_container_lifecycle.png new file mode 100644 index 0000000000000000000000000000000000000000..fbf7f2b7e9e4acda7d8927d55586d1d877649e79 GIT binary patch literal 108001 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 z zU+I_M>4nqK%Wt#u+wAvJPrE6 Date: Thu, 22 Jan 2026 19:05:49 -0800 Subject: [PATCH 10/17] Conda usage guide rendering fix attempt #7 --- conda.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/conda.md b/conda.md index aa86423..1ac1668 100644 --- a/conda.md +++ b/conda.md @@ -73,11 +73,13 @@ dependencies: ``` Create the Conda environment: + ```bash $ conda env create -f mytest-env.yaml ``` Once created, the `mytest` env should appear when listing Conda environments (`` is a placeholder): + ```bash $ conda env list # conda environments: @@ -87,11 +89,13 @@ mytest /sdf/group//sw/conda/envs/mytest ``` The Conda environment may be activated by running: + ```bash $ conda activate mytest ``` Once the environment has been activated, the installed package list can be seen by running: + ```bash (mytest) $ conda list # packages in environment at /sdf/group//sw/conda/envs/mytest: @@ -108,6 +112,7 @@ python 3.12.5 h2ad013b_0_cpython conda-forge Note that the package list will show not only the pre-defined packages from the environment's YAML manifest, but any dependencies installed along with them. Existing Conda environments can be exported into YAML manifests by running the following (change the name of the environment YAML file as desired): + ```bash $ conda env export > my-existing-env.yaml ``` @@ -130,7 +135,9 @@ Due to the fact that Docker's container build utility (e.g. `docker build...`) r > The host system platform and architecture where a container image is built may differ from the platform and architecture where the container is run. For example, container images can be built on a MacOS or Windows host system, while S3DF batch nodes are currently running RHEL8/Rocky Linux 8 (and will eventually be migrated to Rocky Linux 9/10 and beyond). Docker and other container build tools can be configured to target different platforms and architectures, so ensure that the built container image is compatible with the target platform and architecture on S3DF nodes. For more information, see: https://docs.docker.com/build/building/multi-platform/. The following example shows the workflow for creating a Conda environment in a Docker container image. + 1. Create an example Conda environment using a YAML manifest: + ```yaml --- name: test-env @@ -147,7 +154,9 @@ dependencies: - pip: - Flask-Testing ``` + 2. Create an entrypoint script that will be run whenever the image is invoked by a container runtime: + ```bash $ cat << EOF > entrypoint.sh #!/bin/bash --login @@ -164,7 +173,9 @@ conda activate test-env set -euo pipefail EOF ``` + 3. Create a Dockerfile to copy the Conda environment manifest, create the Conda environment, and copy the entrypoint script into the container image + ```bash $ cat << EOF > Dockerfile FROM continuumio/miniconda3:latest @@ -182,22 +193,30 @@ COPY entrypoint.sh /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] EOF ``` + 4. On a build host with appropriate privileges, use the Docker runtime to build the image (replace `` and `` placeholders as appropriate). For further details, see [https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/](https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/): + ```bash # '.' to build and tag an image using a Dockerfile in the current working directory $ docker build -t / . ``` + 5. Publish the image (may require authentication for private container repos. See: [https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/#publishing-images](https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/#publishing-images): + ``` $ docker push / ``` + 6. Pull the published image onto an S3DF [interactive](https://s3df.slac.stanford.edu/#/interactive-compute?id=interactive-pools) or [batch](https://s3df.slac.stanford.edu/#/interactive-compute?id=interactive-compute-session-using-slurm) node in a specified path with the Apptainer container runtime (see the [S3DF Apptainer Usage documentation](https://s3df.slac.stanford.edu/#/apptainer?id=apptainer)): + ```bash $ apptainer pull /test_img.sif docker:/// ``` The Apptainer container image (`.sif`) can now be launched within an S3DF batch job or interactive batch session: + * Submit an S3DF batch job and load the Conda environment (see: [https://s3df.slac.stanford.edu/#/slurm?id=create-a-batch-script](https://s3df.slac.stanford.edu/#/slurm?id=create-a-batch-script)): + ```bash $ cat << EOF > submit_job.bash #!/bin/bash @@ -216,6 +235,7 @@ $ cat << EOF > submit_job.bash apptainer shell /path/to/test_img.sif EOF ``` + * Create an S3DF interactive batch session an invoke the Conda environment using (see: [https://s3df.slac.stanford.edu/#/interactive-compute?id=interactive-compute-session-using-slurm](https://s3df.slac.stanford.edu/#/interactive-compute?id=interactive-compute-session-using-slurm)): ```bash From bb792c465f3324c0f80483410c013f1f43b2ce13 Mon Sep 17 00:00:00 2001 From: pjpascual Date: Thu, 22 Jan 2026 19:10:34 -0800 Subject: [PATCH 11/17] Bugfix: Conda usage guide code blocks rendering within lists fixed --- conda.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conda.md b/conda.md index 1ac1668..0f10990 100644 --- a/conda.md +++ b/conda.md @@ -203,7 +203,7 @@ $ docker build -t / . 5. Publish the image (may require authentication for private container repos. See: [https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/#publishing-images](https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/#publishing-images): -``` +```bash $ docker push / ``` From b2c8c0dde7bf062fb0568851a609325a0cc1dc73 Mon Sep 17 00:00:00 2001 From: YemBot Date: Fri, 23 Jan 2026 18:05:45 -0800 Subject: [PATCH 12/17] Update interactive-compute.md --- interactive-compute.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/interactive-compute.md b/interactive-compute.md index 38c9574..01665fe 100644 --- a/interactive-compute.md +++ b/interactive-compute.md @@ -13,12 +13,12 @@ The currently available pools are shown in the table below (The facility can be |Pool name | Facility | Resources | | --- | --- | --- | |iana | For all S3DF users | 4 servers, 40 HT cores and 384 GB per server | -|rubin-devl | Rubin | 4 servers, 128 cores and 512 GB per server | -|psana | LCLS | 4 servers, 40 HT cores and 384 GB per server | -|fermi-devl | Fermi | 1 server, 64 HT cores and 512 GB per server | +|rubin-devl | Rubin | 11 servers, 128 cores and 512 GB per server | +|psana | LCLS | 7 servers, 40 HT cores and 384 GB per server | +|fermi-devl | Fermi | 2 server, 64 HT cores and 512 GB per server | |faders | FADERS | 1 server, 128 HT cores and 512 GB per server | |ldmx | LDMX | 1 server, 128 HT cores and 512 GB per server | -|ad | AD | 3 servers, 128 HT cores and 512 GB per server | +|ad | AD | 2 servers, 128 HT cores and 512 GB per server | |epptheory | EPPTheory | 2 servers, 128 HT cores and 512 GB per server | |cdms | SuperCDMS | (points to iana) | |suncat | SUNCAT | (points to iana) | @@ -67,4 +67,4 @@ Users are welcome to submit a github pull-request to have their Jupyter environm ### Other Custom Ondemand Applications -If you wish to deploy your own custom Open Ondemand applications/services to the SLAC Ondemand Service, please [contact us](contact-us.md). \ No newline at end of file +If you wish to deploy your own custom Open Ondemand applications/services to the SLAC Ondemand Service, please [contact us](contact-us.md). From 71b26a948d9ae98c0f0e36cca62730c3918d11b9 Mon Sep 17 00:00:00 2001 From: YemBot Date: Thu, 29 Jan 2026 18:14:35 -0800 Subject: [PATCH 13/17] Update changelog.md --- changelog.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog.md b/changelog.md index 026676e..0426c6e 100644 --- a/changelog.md +++ b/changelog.md @@ -6,6 +6,10 @@ ### Upcoming +|When |Duration | What | +| --- | --- | --- | +| February 4th 2026 | 9:00-13:00 PST (planned) | Shutdown the Globus node  “sdfdtn004” for a network card upgrade. + ### Past |When |Duration | What | From e9e6c5d22a3ffc34b70423c6cccc08d601b61250 Mon Sep 17 00:00:00 2001 From: YemBot Date: Thu, 29 Jan 2026 18:20:39 -0800 Subject: [PATCH 14/17] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index f499dee..38b5fdc 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +***Globus Data Transfer outage scheduled for 2/4/26 09:00-13:00 PST. [More details here](changelog.md)*** + + Welcome to the SLAC Shared Scientific Data Facility (S3DF) at SLAC National Accelerator Laboratory. S3DF is a compute, storage, and network architecture designed to support From 7c95408deda531890b328c99c696723eaffdb883 Mon Sep 17 00:00:00 2001 From: YemBot Date: Thu, 29 Jan 2026 18:23:31 -0800 Subject: [PATCH 15/17] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 38b5fdc..da90a78 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -***Globus Data Transfer outage scheduled for 2/4/26 09:00-13:00 PST. [More details here](changelog.md)*** +***Globus Data Transfer outage scheduled for February 4th 2026 09:00-13:00 PST. [More details here](changelog.md)*** Welcome to the SLAC Shared Scientific Data Facility (S3DF) at SLAC National Accelerator Laboratory. From d6ffa1cdd9dac3935628c4a4c881de7c4639605b Mon Sep 17 00:00:00 2001 From: YemBot Date: Fri, 30 Jan 2026 11:16:33 -0800 Subject: [PATCH 16/17] Update batch-compute.md --- batch-compute.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/batch-compute.md b/batch-compute.md index 21ada7f..017a1ce 100644 --- a/batch-compute.md +++ b/batch-compute.md @@ -79,6 +79,8 @@ See the table below to determine the specifications for each cluster (slurm part | Partition name | CPU model | Useable cores per node | Useable memory per node | GPU model | GPUs per node | Local scratch | Number of nodes | | --- | --- | --- | --- | --- | --- | --- | --- | +| torino | AMD Turin 9555 | 120 | 720 GB | - | - | 6 TB | 52 | +| hopper | AMD Turin 9575F | 224 (hyperthreaded) | 1344 GB | NVIDIA H200 | 4 | 21 TB | 3 | | roma | AMD Rome 7702 | 120 | 480 GB | - | - | 300 GB | 131 | | milano | AMD Milan 7713 | 120 | 480 GB | - | - | 6 TB | 270 | | ampere | AMD Rome 7542 | 112 (hyperthreaded) | 952 GB | Tesla A100 (40GB) | 4 | 14 TB | 42 | From 8c4e0557f07aca80774b348c6da796eecd252fe0 Mon Sep 17 00:00:00 2001 From: YemBot Date: Wed, 4 Mar 2026 20:36:25 -0800 Subject: [PATCH 17/17] Update accounts.md --- accounts.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/accounts.md b/accounts.md index 972fee0..f7c2281 100644 --- a/accounts.md +++ b/accounts.md @@ -53,5 +53,18 @@ You can change your password via the SLAC Account self-service password update s If you have forgotten your password and need to reset it, please contact the [SLAC IT Service Desk](https://it.slac.stanford.edu/support). +## Support for urgent account-related issues + +Staff and users needing assistance outside of business hours should call the main IT Service Desk line at (650) 926-4357. They will be presented with a new menu for after-hours support: + +Option 1: For Account Lockouts and Password Resets + +Option 2: For all other issues + +When a user selects Option 1, the system is designed to maximize the chance of reaching an on-call technician promptly. The user can choose to wait on hold or go directly to voicemail. If they wait, the system will cycle between the primary and secondary on-call staff members in 15-second intervals to avoid rolling to personal voicemail. If the caller is unable to reach the scheduled agents, they will be asked to leave a detailed voicemail. Total hold time will be two minutes if all scheduled agents are unable to answer the call. + +The service level objective for these urgent off-hours account issues is to provide a response within 30 minutes during non-business hours (from 5 PM to midnight during weekdays and 8 AM - midnight on the weekends). +Between the hours of midnight and 8:00 AM, support will be provided on a best-effort basis. +