From 92059ce826997573d87180cb83278dacc2418cef Mon Sep 17 00:00:00 2001 From: Benoit Seignovert Date: Wed, 31 Jan 2024 18:10:41 +0100 Subject: [PATCH] Parse user micromamba environments --- src/glicid_spawner/pyenv.py | 38 +++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/glicid_spawner/pyenv.py b/src/glicid_spawner/pyenv.py index 3b13d2d..0ecab31 100644 --- a/src/glicid_spawner/pyenv.py +++ b/src/glicid_spawner/pyenv.py @@ -1,5 +1,7 @@ """Python environment module.""" +import shlex +import subprocess from dataclasses import dataclass @@ -32,34 +34,42 @@ class GlobalPyEnv(PyEnv): scope = 'GLOBAL' +def _micromamba_env_list(root_prefix='', base=False): + """List micromamba environment list.""" + env_list = subprocess.run( + shlex.split('/usr/local/bin/micromamba env list --quiet'), # noqa: S603 (FIXME) + env={'MAMBA_ROOT_PREFIX': root_prefix}, + capture_output=True, + text=True, + check=False, + ) + + return [map(str.strip, env.split()) for env in env_list.stdout.splitlines()[2 if base else 3 :]] + + def get_pyenv_user(username: str) -> list: """List of python environment available to the user.""" return [ - # Dummy values - UserPyEnv('base', f'/micromamba/{username}'), - UserPyEnv('pytorch', f'/micromamba/{username}/envs/pytorch'), + UserPyEnv(*env) + for env in _micromamba_env_list(root_prefix=f'/micromamba/{username}/', base=True) ] -def get_pyenv_team() -> list: +def get_pyenv_team(username: str) -> list: """List of python environment available to the user's team.""" + teams = [] # FIXME: pull user teams list from groups return [ - # Dummy values - TeamPyEnv( - 'nuts-workshop', '/micromamba/operator/share/nuts-workshop-team/env/envs/nuts-workshop' - ), + TeamPyEnv(*env) + for team in teams + for env in _micromamba_env_list(root_prefix=f'/micromamba/teams/{team}') ] def get_pyenv_global() -> list: """List of python environment available globally.""" - return [ - # Dummy values - GlobalPyEnv('base', '/micromamba/operator/envs/base'), - GlobalPyEnv('data-science', '/micromamba/operator/envs/data-science'), - ] + return [GlobalPyEnv(*env) for env in _micromamba_env_list(root_prefix='/micromamba/operator/')] def get_pyenv(username: str) -> list: """List of all the python environment available to a user.""" - return get_pyenv_user(username) + get_pyenv_team() + get_pyenv_global() + return get_pyenv_user(username) + get_pyenv_team(username) + get_pyenv_global()