X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=o2ims%2Fservice%2Fwatcher%2Fbase.py;h=0daf8d43a7fbf37721a1354e3bef2c71d648972f;hb=19ee63847f8eb032009e63634b90eb594f3c0408;hp=4ea23ff1a6a8c729339d9f7dc00a169e4b17d6c1;hpb=f1946a1e90036bb8a758b49f94ac4d3b40bae66e;p=pti%2Fo2.git diff --git a/o2ims/service/watcher/base.py b/o2ims/service/watcher/base.py index 4ea23ff..0daf8d4 100644 --- a/o2ims/service/watcher/base.py +++ b/o2ims/service/watcher/base.py @@ -12,57 +12,87 @@ # See the License for the specific language governing permissions and # limitations under the License. +# from logging import exception +# from cgtsclient import exc from o2ims.service.client.base_client import BaseClient -from o2ims.domain.stx_object import StxGenericModel -from o2ims.adapter.ocloud_repository import OcloudRepository - - -class InvalidOcloudState(Exception): - pass +# from o2ims.domain.stx_object import StxGenericModel +# from o2ims.service.unit_of_work import AbstractUnitOfWork +from o2ims.domain import commands +from o2ims.service.messagebus import MessageBus +from o2common.helper import o2logging +logger = o2logging.get_logger(__name__) class BaseWatcher(object): - def __init__(self, client: BaseClient) -> None: + def __init__(self, client: BaseClient, + bus: MessageBus) -> None: super().__init__() self._client = client + self._bus = bus + # self._uow = bus.uow - def probe(self): - self._probe() + def targetname(self) -> str: + return self._targetname() - def _probe(self): - pass + def probe(self, parent: commands.UpdateStxObject = None): + try: + cmds = self._probe(parent.data if parent else None) + for cmd in cmds: + self._bus.handle(cmd) + # return self._probe(parent) + return cmds + except Exception as ex: + logger.warning("Failed to probe resource due to: " + str(ex)) + return [] -class OcloudWather(BaseWatcher): - def __init__(self, ocloud_client: BaseClient, - repo: OcloudRepository) -> None: - super().__init__(ocloud_client) - self._repo = repo + def _probe(self, parent: object = None) -> commands.UpdateStxObject: + raise NotImplementedError - def _probe(self): - ocloudmodel = self._client.get(None) - if ocloudmodel: - self._compare_and_update(ocloudmodel) + def _targetname(self): + raise NotImplementedError - def _compare_and_update(self, ocloudmodel: StxGenericModel) -> bool: - # localmodel = self._repo.get(ocloudmodel.id) - oclouds = self._repo.list() - if len(oclouds) > 1: - raise InvalidOcloudState("More than 1 ocloud is found") - if len(oclouds) == 0: - self._repo.add(ocloudmodel) - else: - localmodel = oclouds.pop() - if localmodel.is_outdated(ocloudmodel): - localmodel.update_by(ocloudmodel) - self._repo.update(localmodel) + # def _compare_and_update(self, newmodel: StxGenericModel) -> bool: + # with self._uow: + # # localmodel = self._uow.stxobjects.get(ocloudmodel.id) + # localmodel = self._uow.stxobjects.get(str(newmodel.id)) + # if not localmodel: + # logger.info("add entry:" + newmodel.name) + # self._uow.stxobjects.add(newmodel) + # elif localmodel.is_outdated(newmodel): + # logger.info("update entry:" + newmodel.name) + # localmodel.update_by(newmodel) + # self._uow.stxobjects.update(localmodel) + # self._uow.commit() -class ResourcePoolWatcher(object): - def __init__(self) -> None: +# node to organize watchers in tree hierachy +class WatcherTree(object): + def __init__(self, watcher: BaseWatcher) -> None: super().__init__() + self.watcher = watcher + self.children = {} + def addchild(self, watcher: BaseWatcher) -> object: + child = WatcherTree(watcher) + self.children[watcher.targetname()] = child + return child -class ResourceWatcher(object): - def __init__(self) -> None: - super().__init__() + def removechild(self, targetname: str) -> object: + return self.children.pop(targetname) + + # probe all resources by parent, depth = 0 for indefinite recursive + def probe(self, parentresource=None, depth: int = 0): + logger.debug("probe resources with watcher: " + + self.watcher.targetname()) + childdepth = depth - 1 if depth > 0 else 0 + resources = self.watcher.probe(parentresource) + logger.debug("probe returns " + str(len(resources)) + " resources") + + if depth == 1: + # stop recursive + return + + for res in resources: + for targetname in self.children.keys(): + self.children[targetname].probe(res, childdepth)