diff --git a/docs/swagger-schema.yaml b/docs/swagger-schema.yaml index 16343c6637639060d1b5015db64d980189d165f1..3cbb6f1d62d860bbb77ebc23a53fee7f80980a79 100644 --- a/docs/swagger-schema.yaml +++ b/docs/swagger-schema.yaml @@ -1522,7 +1522,7 @@ parameters: type: "array" items: type: "string" - required: true + required: false casa-telescope: name: "telescope" in: query diff --git a/services/capability/capability/views/capability.py b/services/capability/capability/views/capability.py index 866747c399b7e2c217f705d0a2cc35a6b9b98a1e..9bd8df64438970b1910451871660b9965cee3d1f 100644 --- a/services/capability/capability/views/capability.py +++ b/services/capability/capability/views/capability.py @@ -360,10 +360,10 @@ def add_casa_version(request: Request) -> Response: """ added = request.casa_matrix_service.add_version( version=request.params["version"], - capabilities=request.params["capabilities"], - is_cluster_compatible=request.params["is_cluster_compatible"] - if "is_cluster_compatible" in request.params - else True, + capabilities=request.params["capabilities"].split(',') if "capabilities" in request.params else [], + is_cluster_compatible=False if "is_cluster_compatible" in request.params + and request.params["is_cluster_compatible"].lower() in ["0", "false"] + else True, ) if added: @@ -383,10 +383,10 @@ def update_casa_version(request: Request) -> Response: """ updated = request.casa_matrix_service.update_version( version=request.params["version"], - capabilities=request.params["capabilities"], - is_cluster_compatible=request.params["is_cluster_compatible"] - if "is_cluster_compatible" in request.params - else True, + capabilities=request.params["capabilities"].split(',') if "capabilities" in request.params else [], + is_cluster_compatible=False if "is_cluster_compatible" in request.params + and request.params["is_cluster_compatible"].lower() in ["0", "false"] + else True, ) if updated: diff --git a/shared/workspaces/workspaces/system/services/casa_matrix_service.py b/shared/workspaces/workspaces/system/services/casa_matrix_service.py index 7c37372267d2a38b044b7d888442cc899266ee2c..5941b93ef1112f72204dfa6ce7c6020f2b737a39 100644 --- a/shared/workspaces/workspaces/system/services/casa_matrix_service.py +++ b/shared/workspaces/workspaces/system/services/casa_matrix_service.py @@ -21,7 +21,7 @@ import re import shutil from pycapo import CapoConfig -from sqlalchemy import exc +from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import Session @@ -161,7 +161,7 @@ class CasaMatrixService(CasaMatrixServiceIF): result = self.session.query(CasaMatrixCasaVersion).filter_by(is_cluster_compatible=True).all() for v in result: - if capability in v.capabilities: + if capability in [c.name for c in v.capabilities]: versions.append(v.casa_version) if not versions: @@ -229,7 +229,6 @@ class CasaMatrixService(CasaMatrixServiceIF): default_version = self.get_default_version(capability, telescope) if not version: - logger.info(f"No CASA version specified, returning default version for {capability}") return default_version # Installed versions are a flat list of dicts containing version names and paths @@ -240,12 +239,11 @@ class CasaMatrixService(CasaMatrixServiceIF): if not installed_version: logger.info(f"CASA version {version} is not installed, returning default version for {capability}") return default_version - # Keep in mind the table stores the installed CASA version name, not necessarily what we're given here + # Keep in mind the table stores the installed CASA version name, not what we're given here elif not self.is_allowed(os.path.basename(installed_version["path"]), capability): logger.info(f"CASA version {version} is not allowed, returning default version for {capability}") return default_version else: - logger.info(f"CASA version {installed_version} is allowed and installed") return installed_version def get_versions(self, capability: str | None = DEFAULT_CAPABILITY) -> list[dict[str, str]]: @@ -268,7 +266,7 @@ class CasaMatrixService(CasaMatrixServiceIF): if installed_version: versions.append(installed_version) - logger.debug(f"Found CASA versions for {capability}: {versions}") + logger.info(f"Found CASA versions for {capability}: {versions}") return versions @@ -314,7 +312,7 @@ class CasaMatrixService(CasaMatrixServiceIF): self.session.add(entity) self.session.flush() - def add_version(self, version: str, capabilities: list[str], is_cluster_compatible: bool = True) -> bool: + def add_version(self, version: str, capabilities: list[str] = None, is_cluster_compatible: bool = True) -> bool: """ Adds a new CASA version to the matrix using the provided version string and capability name list. By default, the new version will be flagged as being cluster compatible. @@ -324,33 +322,35 @@ class CasaMatrixService(CasaMatrixServiceIF): matrix_version = CasaMatrixCasaVersion( casa_version=version, is_cluster_compatible=is_cluster_compatible, - capabilities=capabilities, + capabilities=capabilities if capabilities else [], ) try: self.save_entity(matrix_version) return True - except exc.SQLAlchemyError: - logger.debug(f"Unable to add CASA version {version}") + except SQLAlchemyError as e: + logger.critical(f"Unable to add CASA version {version}: %s", e) return False - def update_version(self, version: str, capabilities: list[str], is_cluster_compatible: bool = True) -> bool: + def update_version(self, version: str, capabilities: list[str] = None, is_cluster_compatible: bool = True) -> bool: """ Updates a CASA version in the matrix. :return: True if updated successfully """ - matrix_version = CasaMatrixCasaVersion( - casa_version=version, - is_cluster_compatible=is_cluster_compatible, - capabilities=capabilities, - ) - + logger.info(f"Full list = {capabilities}") + for thing in capabilities: + logger.info(f"Thing = {thing}") try: - self.save_entity(matrix_version) + self.session.query(CasaMatrixCasaVersion).filter_by(casa_version=version).update({ + 'casa_version': version, + 'is_cluster_compatible': is_cluster_compatible, + 'capabilities': capabilities if capabilities else [], + }) + self.session.flush() return True - except exc.SQLAlchemyError: - logger.debug(f"Unable to update CASA version {version}") + except SQLAlchemyError as e: + logger.critical(f"Unable to update CASA version {version} %s", e) return False def delete_version(self, version: str) -> bool: @@ -363,8 +363,8 @@ class CasaMatrixService(CasaMatrixServiceIF): self.session.query(CasaMatrixCasaVersion).filter_by(casa_version=version).delete() self.session.flush() return True - except exc.SQLAlchemyError: - logger.debug(f"Unable to delete CASA version {version}") + except SQLAlchemyError as e: + logger.critical(f"Unable to delete CASA version {version} %s", e) return False def make_links(self, dry_run: bool = False) -> dict[str, list[str]]: diff --git a/shared/workspaces/workspaces/system/services/interfaces.py b/shared/workspaces/workspaces/system/services/interfaces.py index 80a360960fe2ff2a298567af3c31081fe1295bd2..60e98b48727cc1d1bc29ebdd2d7b74b2edf0c347 100644 --- a/shared/workspaces/workspaces/system/services/interfaces.py +++ b/shared/workspaces/workspaces/system/services/interfaces.py @@ -77,11 +77,11 @@ class CasaMatrixServiceIF(ABC): raise NotImplementedError @abstractmethod - def add_version(self, version: str, capabilities: list[str], is_cluster_compatible: bool = True) -> bool: + def add_version(self, version: str, capabilities: list[str] | None, is_cluster_compatible: bool = True) -> bool: raise NotImplementedError @abstractmethod - def update_version(self, version: str, capabilities: list[str], is_cluster_compatible: bool = True) -> bool: + def update_version(self, version: str, capabilities: list[str] | None, is_cluster_compatible: bool = True) -> bool: raise NotImplementedError @abstractmethod