From 86e6765e8f1855402f1eaeb4b8d5e472552653e9 Mon Sep 17 00:00:00 2001 From: vpachchi Date: Fri, 25 Jul 2025 04:30:11 -0400 Subject: [PATCH] The pruned subclouds are cleared Test Plan: PASS- Verify if the pruned resourcepool,resource and dms is not displayed Change-Id: Ideaaa013781d211f293bac99d1b1e847e445abd9 Signed-off-by: vpachchi --- o2ims/service/watcher/ocloud_watcher.py | 28 +++++++++++++++++++++ o2ims/service/watcher/resourcepool_watcher.py | 36 +++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/o2ims/service/watcher/ocloud_watcher.py b/o2ims/service/watcher/ocloud_watcher.py index f66a18f..4111f57 100644 --- a/o2ims/service/watcher/ocloud_watcher.py +++ b/o2ims/service/watcher/ocloud_watcher.py @@ -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) diff --git a/o2ims/service/watcher/resourcepool_watcher.py b/o2ims/service/watcher/resourcepool_watcher.py index 20090bf..f6ec02a 100644 --- a/o2ims/service/watcher/resourcepool_watcher.py +++ b/o2ims/service/watcher/resourcepool_watcher.py @@ -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) -- 2.16.6