From a6c7030f494686bc2b4307b6d07e5293835afab3 Mon Sep 17 00:00:00 2001
From: adrianciu <adrian.ciu@codemart.ro>
Date: Wed, 5 Feb 2025 15:18:03 +0200
Subject: [PATCH] esd-spack-installation: added spack env exceptions

---
 esd/error_handling/exceptions.py     |  5 +++++
 esd/spack_manager/SpackManager.py    | 26 +++++++++++++++++---------
 esd/tests/spack_from_scratch_test.py | 24 ++++++++++++++++--------
 3 files changed, 38 insertions(+), 17 deletions(-)

diff --git a/esd/error_handling/exceptions.py b/esd/error_handling/exceptions.py
index 2acca54e..79f8051f 100644
--- a/esd/error_handling/exceptions.py
+++ b/esd/error_handling/exceptions.py
@@ -11,3 +11,8 @@ class BashCommandException(SpackException):
     """
     To be thrown when an invalid input is received.
     """
+
+class NoSpackEnvironmentException(SpackException):
+    """
+    To be thrown when an invalid input is received.
+    """
\ No newline at end of file
diff --git a/esd/spack_manager/SpackManager.py b/esd/spack_manager/SpackManager.py
index f7bb00b4..340b1b95 100644
--- a/esd/spack_manager/SpackManager.py
+++ b/esd/spack_manager/SpackManager.py
@@ -2,7 +2,7 @@ import os
 from abc import ABC, abstractmethod
 from pathlib import Path
 
-from esd.error_handling.exceptions import BashCommandException
+from esd.error_handling.exceptions import BashCommandException, NoSpackEnvironmentException
 from esd.logger.logger_builder import get_logger
 from esd.model.SpackModel import SpackModel
 from esd.utils.utils import run_command, git_clone_repo
@@ -90,7 +90,7 @@ class SpackManager(ABC):
                 else:
                     self.logger.debug(f'Spack repository {repo.env_name} already added')
 
-    def spack_repo_exists(self, repo_name: str) -> bool:
+    def spack_repo_exists(self, repo_name: str) -> bool | None:
         """Check if the given Spack repository exists."""
         if self.env is None:
             result = run_command("bash", "-c",
@@ -101,11 +101,15 @@ class SpackManager(ABC):
             if result is None:
                 return False
         else:
-            result = run_command("bash", "-c",
+            if self.spack_env_exists():
+                result = run_command("bash", "-c",
                                  f'source {self.spack_setup_script} && spack env activate -p {self.env_path} && spack repo list',
                                  check=True,
                                  capture_output=True, text=True, logger=self.logger,
                                  debug_msg=f'Checking if repository {repo_name} was added')
+            else:
+                self.logger.debug('No spack environment defined')
+                raise NoSpackEnvironmentException('No spack environment defined')
             if result is None:
                 return False
         return any(line.strip().endswith(repo_name) for line in result.stdout.splitlines())
@@ -122,12 +126,16 @@ class SpackManager(ABC):
 
     def add_spack_repo(self, repo_path: Path, repo_name: str):
         """Add the Spack repository if it does not exist."""
-        run_command("bash", "-c",
-                    f'source {self.spack_setup_script} && spack env activate -p {self.env_path} && spack repo add {repo_path}/{repo_name}',
-                    check=True, logger=self.logger,
-                    debug_msg=f"Added {repo_name} to spack environment {self.env.env_name}",
-                    exception_msg=f"Failed to add {repo_name} to spack environment {self.env.env_name}",
-                    exception=BashCommandException)
+        if self.spack_env_exists():
+            run_command("bash", "-c",
+                        f'source {self.spack_setup_script} && spack env activate -p {self.env_path} && spack repo add {repo_path}/{repo_name}',
+                        check=True, logger=self.logger,
+                        debug_msg=f"Added {repo_name} to spack environment {self.env.env_name}",
+                        exception_msg=f"Failed to add {repo_name} to spack environment {self.env.env_name}",
+                        exception=BashCommandException)
+        else:
+            self.logger.debug('No spack environment defined')
+            raise NoSpackEnvironmentException('No spack environment defined')
 
     def get_spack_installed_version(self):
         spack_version = run_command("bash", "-c", f'source {self.spack_setup_script} && spack --version',
diff --git a/esd/tests/spack_from_scratch_test.py b/esd/tests/spack_from_scratch_test.py
index 71c84a21..cca0d2e9 100644
--- a/esd/tests/spack_from_scratch_test.py
+++ b/esd/tests/spack_from_scratch_test.py
@@ -2,21 +2,30 @@ from pathlib import Path
 
 import pytest
 
-from esd.error_handling.exceptions import BashCommandException
+from esd.error_handling.exceptions import BashCommandException, NoSpackEnvironmentException
 from esd.model.SpackModel import SpackModel
 from esd.spack_manager.factory.SpackManagerScratch import SpackManagerScratch
 
 
 def test_spack_repo_exists_1():
+    spack_manager = SpackManagerScratch()
+    assert spack_manager.spack_repo_exists('ebrains-spack-builds') == False
+
+
+def test_spack_repo_exists_2():
     install_dir = Path('./install').resolve()
     env = SpackModel('ebrains-spack-builds', install_dir)
     spack_manager = SpackManagerScratch(env=env)
-    assert spack_manager.spack_repo_exists(env.env_name) == False
+    with pytest.raises(NoSpackEnvironmentException):
+        spack_manager.spack_repo_exists(env.env_name)
 
 
-def test_spack_repo_exists_2():
-    spack_manager = SpackManagerScratch()
-    assert spack_manager.spack_repo_exists('ebrains-spack-builds') == False
+# def test_spack_repo_exists_3():
+#     install_dir = Path('./install').resolve()
+#     env = SpackModel('ebrains-spack-builds', install_dir)
+#     spack_manager = SpackManagerScratch(env=env)
+#     spack_manager.setup_spack_env()
+#     assert spack_manager.spack_repo_exists(env.env_name) == False
 
 
 def test_spack_from_scratch_setup_1():
@@ -55,10 +64,9 @@ def test_spack_from_scratch_setup_4():
     assert spack_manager.spack_env_exists() == True
 
 
-def test_spack_from_scratch_bash_error():
+def test_spack_not_a_valid_repo():
     env = SpackModel('ebrains-spack-builds', Path(), None)
     repo = env
-    #
     spack_manager = SpackManagerScratch(env=env, repos=[repo], system_name='ebrainslab')
-    with pytest.raises(BashCommandException):
+    with pytest.raises(NoSpackEnvironmentException):
         spack_manager.add_spack_repo(repo.path, repo.env_name)
-- 
GitLab