Skip to content
Snippets Groups Projects

Remove cmd

Merged Ashwin Kumar Karnad requested to merge continue-with-remove-cmd into main
3 unresolved threads
Files
2
@@ -14,7 +14,6 @@ import time
from pathlib import Path
from typing import List, Tuple, Union
import re
import shutil
from functools import cache
import importlib.metadata
@@ -1072,47 +1071,128 @@ def install_environment(
def remove_environment(mpsd_release, root_dir, package_sets="NONE", force_remove=False):
"""Remove release from installation."""
"""Remove release from installation.
Handle 3 situations :
1. remove dosent specify what to remove
-> warn and exit
2. remove all package_sets from release
-> remove release folder except logs
3. remove specific package_sets from release
-> remove spack environments via spack commands
Parameters
----------
mpsd_release : str
A string representing the MPSD release version.
root_dir : pathlib.Path
A Path object representing the path to the directory where
the release and package_sets will be installed.
package_sets : list of str
A list of strings representing the package_sets to install
(e.g., "foss2021a-mpi", "global_generic", "ALL").
force_remove : bool, optional
A boolean indicating whether to force remove the release.
If False, the user will be prompted to confirm the removal.
Defaults to False.
Raises
------
ValueError
"""
msg = (
f"Removing release {mpsd_release}"
f" with package_sets {package_sets} from {root_dir}"
)
logging.warning(msg)
# Handle 3 situations :
# 1. remove dosent specify what to remove -> warn and exit
# 1. remove all package_sets from release -> remove release folder except logs
# 2. remove specific package_sets from release
# -> remove spack environments via spack commands
if package_sets == "NONE":
logging.warning(
"Please specify package_sets to remove, or 'ALL' to remove all toolchains"
)
sys.exit(1)
sys.exit(50) # TODO document this code.
# 2nd case: remove the entire release for microarchitecture
dir_to_remove = root_dir / mpsd_release / get_native_microarchitecture()
if "ALL" in package_sets:
# we need to remove the entire release folder
logging.warning(f"Removing release {mpsd_release} from {root_dir}")
logging.warning(
f"Removing release {mpsd_release}"
f"from {root_dir} for {get_native_microarchitecture()}"
)
if not force_remove:
logging.warning("do you want to continue? [y/n]")
if input().lower() == "y":
force_remove = True
if force_remove:
dir_to_remove = root_dir / mpsd_release / get_native_microarchitecture()
folders_to_remove = os.listdir(dir_to_remove)
# skip logs folder
if "logs" in folders_to_remove:
folders_to_remove.remove("logs")
for folder in folders_to_remove:
shutil.rmtree(dir_to_remove / folder)
return
if input().lower() != "y":
sys.exit(60) # TODO document this code.
folders_to_remove = os.listdir(dir_to_remove)
# skip logs folder
# if "logs" in folders_to_remove:
# folders_to_remove.remove("logs")
for folder in folders_to_remove:
# shutil.rmtree(dir_to_remove / folder) #dosent delete file
run(f"rm -rf {dir_to_remove / folder}", shell=True, check=True)
logging.warning(f"Removed release {mpsd_release} from {root_dir}")
return
# 3rd case: remove specific package_sets from release
for package_set in package_sets:
# we load the spack environment and remove the package_set
spack_env = ""
commands_to_execute = [
f"source {spack_env}",
f"spack env remove -y {package_set}",
]
run(" && ".join(commands_to_execute), shell=True, check=True)
if package_set not in ["global_packages", "global"]:
remove_spack_environment(dir_to_remove / "spack", package_set)
else:
# TODO remove global packages by calling remove_spack_package
pass
def remove_spack_environment(spack_dir, environment_name):
"""Remove spack environment including packages exclusive to it.
First activate the environment,
then uninstall all packages exclusive to the environment,
then deactivate the environment,
and finally remove the environment.
Parameters
----------
spack_dir : pathlib.Path
A Path object representing the path to the spack directory.
environment_name : str
A string representing the name of the spack environment to remove.
"""
logging.warning(f"Removing spack environment {environment_name}")
spack_env = spack_dir / "share" / "spack" / "setup-env.sh"
commands_to_execute = [
f"export SPACK_DIR={spack_dir}", # need to set SPACK_DIR in dash and sh
f". {spack_env}",
f"spack env activate {environment_name}",
f"for spec in $(spack -e {environment_name} find" # this line continues
r' --format "{name}@{version}%{compiler.name}@{compiler.version}");do'
" spack uninstall -y $spec; done",
"spack env deactivate",
f"spack env remove -y {environment_name}",
]
run(" && ".join(commands_to_execute), shell=True, check=True)
def remove_spack_package(spack_dir, package):
"""Remove spack package.
Used to remove global packages.
Parameters
----------
spack_dir : pathlib.Path
A Path object representing the path to the spack directory.
package : str
A string representing the name of the spack package to remove.
"""
logging.info(f"Removing spack package {package}")
spack_env = spack_dir / "share" / "spack" / "setup-env.sh"
commands_to_execute = [
f"source {spack_env}",
f"spack uninstall -y {package}",
]
run(" && ".join(commands_to_execute), shell=True, check=True)
def start_new_environment(release, from_release, target_dir):
@@ -1313,7 +1393,7 @@ def main():
("available", "What is available for installation?"),
("install", "Install a software environment"),
# ("reinstall", "Reinstall a package_set"),
# ("remove", "Remove a package set"),
("remove", "Remove a package set"),
# ("start-new", "Start a new MPSD software release version"),
("status", "Show status: what is installed?"),
("prepare", "Prepare installation of MPSD-release (dev only)"),
Loading