From: vpachchi Date: Wed, 30 Jul 2025 17:00:00 +0000 (-0400) Subject: The alarm event records that reference resource to be deleted X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=1a2fe9a1913cbc81eef73628ddc3e9d40c2ae3ec;p=pti%2Fo2.git The alarm event records that reference resource to be deleted Test Plan: PASS- Verify if the pruned resourcepool,resource and dms is not displayed PASS- Resgression tests are passed Change-Id: I20ba9052cd57677a93b326477b05c72d0c7e36a8 Signed-off-by: vpachchi --- diff --git a/o2ims/adapter/ocloud_repository.py b/o2ims/adapter/ocloud_repository.py index a026629..3ed8fd5 100644 --- a/o2ims/adapter/ocloud_repository.py +++ b/o2ims/adapter/ocloud_repository.py @@ -100,6 +100,10 @@ class ResourcePoolSqlAlchemyRepository(ResourcePoolRepository): def _update(self, resourcePool: ocloud.ResourcePool): self.session.add(resourcePool) + def _delete(self, resource_pool_id): + self.session.query(ocloud.ResourcePool).filter_by( + resourcePoolId=resource_pool_id).delete() + class ResourceSqlAlchemyRepository(ResourceRepository): def __init__(self, session): @@ -150,6 +154,10 @@ class ResourceSqlAlchemyRepository(ResourceRepository): def _update(self, resource: ocloud.Resource): self.session.add(resource) + def _delete(self, resource_id): + self.session.query(ocloud.Resource).filter_by( + resourceId=resource_id).delete() + class DeploymentManagerSqlAlchemyRepository(DeploymentManagerRepository): def __init__(self, session): @@ -178,6 +186,10 @@ class DeploymentManagerSqlAlchemyRepository(DeploymentManagerRepository): def _update(self, deployment_manager: ocloud.DeploymentManager): self.session.add(deployment_manager) + def _delete(self, deployment_manager_id): + self.session.query(ocloud.DeploymentManager).filter_by( + deploymentManagerId=deployment_manager_id).delete() + class SubscriptionSqlAlchemyRepository(SubscriptionRepository): def __init__(self, session): diff --git a/o2ims/domain/ocloud_repo.py b/o2ims/domain/ocloud_repo.py index cf2d979..23a54b7 100644 --- a/o2ims/domain/ocloud_repo.py +++ b/o2ims/domain/ocloud_repo.py @@ -135,6 +135,9 @@ class ResourcePoolRepository(abc.ABC): self._update(resource_pool) self.seen.add(resource_pool) + def delete(self, resource_pool_id): + self._delete(resource_pool_id) + @abc.abstractmethod def _add(self, resource_pool: ocloud.ResourcePool): raise NotImplementedError @@ -151,6 +154,10 @@ class ResourcePoolRepository(abc.ABC): def _update(self, resource_pool: ocloud.ResourcePool): raise NotImplementedError + @abc.abstractmethod + def _delete(self, resource_pool_id): + raise NotImplementedError + class ResourceRepository(abc.ABC): def __init__(self): @@ -177,6 +184,9 @@ class ResourceRepository(abc.ABC): self._update(resource) self.seen.add(resource) + def delete(self, resource_id): + self._delete(resource_id) + @abc.abstractmethod def _add(self, resource: ocloud.Resource): raise NotImplementedError @@ -194,6 +204,10 @@ class ResourceRepository(abc.ABC): def _update(self, resource: ocloud.Resource): raise NotImplementedError + @abc.abstractmethod + def _delete(self, resource_id): + raise NotImplementedError + class DeploymentManagerRepository(abc.ABC): def __init__(self): @@ -219,6 +233,9 @@ class DeploymentManagerRepository(abc.ABC): def update(self, deployment_manager: ocloud.DeploymentManager): self._update(deployment_manager) + def delete(self, deployment_manager_id): + self._delete(deployment_manager_id) + @abc.abstractmethod def _add(self, deployment_manager: ocloud.DeploymentManager): raise NotImplementedError @@ -234,3 +251,7 @@ class DeploymentManagerRepository(abc.ABC): @abc.abstractmethod def _update(self, deployment_manager: ocloud.DeploymentManager): raise NotImplementedError + + @abc.abstractmethod + def _delete(self, deployment_manager_id): + raise NotImplementedError diff --git a/o2ims/service/watcher/ocloud_watcher.py b/o2ims/service/watcher/ocloud_watcher.py index 4111f57..c171488 100644 --- a/o2ims/service/watcher/ocloud_watcher.py +++ b/o2ims/service/watcher/ocloud_watcher.py @@ -78,18 +78,17 @@ class DmsWatcher(BaseWatcher): exist in the authoritative source.""" try: with self._bus.uow as uow: - # 1. Get current DMS IDs from authoritative source (client) + # 1. Get current DMS IDs from client current_dms = self._client.list(ocloudid=ocloudid) current_ids = set([d.id for d in current_dms]) # 2. Get all DMS IDs from DB if hasattr(uow, 'deployment_managers'): - db_dms = list(uow.deployment_managers.list().all()) - + # The list() method returns a SQLAlchemy query object + db_dms = uow.deployment_managers.list().all() db_ids = set(d.deploymentManagerId for d in db_dms) deleted_ids = db_ids - current_ids - # TODO: When an dms is deleted, the SMO must be notified. for del_id in deleted_ids: diff --git a/o2ims/service/watcher/resourcepool_watcher.py b/o2ims/service/watcher/resourcepool_watcher.py index f6ec02a..edd073b 100644 --- a/o2ims/service/watcher/resourcepool_watcher.py +++ b/o2ims/service/watcher/resourcepool_watcher.py @@ -33,8 +33,8 @@ class ResourcePoolWatcher(BaseWatcher): return "resourcepool" def _prune_stale_resourcepools_and_resources(self, ocloudid): - """Prune resource pools (subclouds) and their related resources from DB - if they no longer exist in the authoritative source.""" + """Prune resource pools (subclouds) and their related resources from + DB if they no longer exist in the authoritative source.""" try: with self._bus.uow as uow: # 1. Get current resource pool IDs from the client @@ -42,7 +42,9 @@ class ResourcePoolWatcher(BaseWatcher): current_ids = set(r.id for r in current_resourcepools) # 2. Get all resource pool IDs from DB - db_resourcepools = uow.resource_pools.list() + db_resourcepools_query = uow.resource_pools.list() + db_resourcepools = db_resourcepools_query.all() + db_ids = set(r.resourcePoolId for r in db_resourcepools) # 3. Delete any in DB not in current @@ -50,22 +52,46 @@ class ResourcePoolWatcher(BaseWatcher): # TODO: When an resource, resource pool is deleted, # the SMO must be notified. - for del_id in deleted_ids: # Delete all related resources first if hasattr(uow, 'resources'): - db_resources = uow.resources.list(del_id) - db_resources = db_resources.all() + db_resources = uow.resources.list(del_id).all() + for res in db_resources: + # First, delete all alarm event records that + # reference this resource + if hasattr(uow, 'alarm_event_records'): + alarm_rec = ( + uow.alarm_event_records.list().all() + ) + + # Find and delete alarm records that reference + # this resource + for alarm_rec in alarm_rec: + if alarm_rec.resourceId == res.resourceId: + logger.info( + f'Deleting alarm record \ + {alarm_rec.alarmEventRecordId} \ + that references \ + resource {res.resourceId}' + ) + uow.alarm_event_records.delete( + alarm_rec + ) + + # Now delete the resource + logger.info(f'Deleting resource {res.resourceId}') uow.resources.delete(res.resourceId) + + # Finally delete the resource pool uow.resource_pools.delete(del_id) if deleted_ids: - logger.info(f'Pruned resource pools and \ - resources: {deleted_ids}') + logger.info(f'Pruned resource pools and related resources\ + :{deleted_ids}') uow.commit() except Exception as e: - logger.error(f'Error pruning stale resource pools/resources: \ - {str(e)}') + logger.error(f'Error pruning stale resource \ + pools/resources:{str(e)}') def _probe(self, parent: StxGenericModel, tags: object = None): ocloudid = parent.id