The alarm event records that reference resource to be deleted 50/14750/8
authorvpachchi <vineela.pachchipulusu@windriver.com>
Wed, 30 Jul 2025 17:00:00 +0000 (13:00 -0400)
committervpachchi <vineela.pachchipulusu@windriver.com>
Thu, 31 Jul 2025 06:47:51 +0000 (02:47 -0400)
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 <vineela.pachchipulusu@windriver.com>
o2ims/adapter/ocloud_repository.py
o2ims/domain/ocloud_repo.py
o2ims/service/watcher/ocloud_watcher.py
o2ims/service/watcher/resourcepool_watcher.py

index a026629..3ed8fd5 100644 (file)
@@ -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):
index cf2d979..23a54b7 100644 (file)
@@ -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
index 4111f57..c171488 100644 (file)
@@ -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:
index f6ec02a..edd073b 100644 (file)
@@ -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