The pruned subclouds are cleared 40/14740/7
authorvpachchi <vineela.pachchipulusu@windriver.com>
Fri, 25 Jul 2025 08:30:11 +0000 (04:30 -0400)
committervpachchi <vineela.pachchipulusu@windriver.com>
Mon, 28 Jul 2025 11:42:09 +0000 (07:42 -0400)
Test Plan:
PASS- Verify if the pruned resourcepool,resource and dms is not displayed

Change-Id: Ideaaa013781d211f293bac99d1b1e847e445abd9
Signed-off-by: vpachchi <vineela.pachchipulusu@windriver.com>
o2ims/service/watcher/ocloud_watcher.py
o2ims/service/watcher/resourcepool_watcher.py

index f66a18f..4111f57 100644 (file)
@@ -73,8 +73,36 @@ class DmsWatcher(BaseWatcher):
     def _targetname(self):
         return "dms"
 
+    def _prune_stale_dms(self, ocloudid):
+        """Prune DMS (deployment managers) from DB if they no longer
+        exist in the authoritative source."""
+        try:
+            with self._bus.uow as uow:
+                # 1. Get current DMS IDs from authoritative source (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())
+
+                    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:
+                        uow.deployment_managers.delete(del_id)
+                    if deleted_ids:
+                        logger.info(f'Pruned DMS: {deleted_ids}')
+                        uow.commit()
+        except Exception as e:
+            logger.error(f'Error pruning stale DMS: {str(e)}')
+
     def _probe(self, parent: StxGenericModel, tags: object = None):
         ocloudid = parent.id
+        self._prune_stale_dms(ocloudid)
         newmodels = self._client.list(ocloudid=ocloudid)
         # for newmodel in newmodels:
         #     super()._compare_and_update(newmodel)
index 20090bf..f6ec02a 100644 (file)
@@ -32,8 +32,44 @@ class ResourcePoolWatcher(BaseWatcher):
     def _targetname(self):
         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."""
+        try:
+            with self._bus.uow as uow:
+                # 1. Get current resource pool IDs from the client
+                current_resourcepools = self._client.list(ocloudid=ocloudid)
+                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_ids = set(r.resourcePoolId for r in db_resourcepools)
+
+                # 3. Delete any in DB not in current
+                deleted_ids = db_ids - current_ids
+
+                # 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()
+                        for res in db_resources:
+                            uow.resources.delete(res.resourceId)
+                    uow.resource_pools.delete(del_id)
+                if deleted_ids:
+                    logger.info(f'Pruned resource pools and \
+                                resources: {deleted_ids}')
+                    uow.commit()
+        except Exception as e:
+            logger.error(f'Error pruning stale resource pools/resources: \
+                         {str(e)}')
+
     def _probe(self, parent: StxGenericModel, tags: object = None):
         ocloudid = parent.id
+        self._prune_stale_resourcepools_and_resources(ocloudid)
         newmodels = self._client.list(ocloudid=ocloudid)
         # for newmodel in newmodels:
         #     logger.info("detect ocloudmodel:" + newmodel.name)