Update watcher worker
[pti/o2.git] / o2ims / service / watcher / base.py
index 4ea23ff..c3ff3d4 100644 (file)
 #  See the License for the specific language governing permissions and\r
 #  limitations under the License.\r
 \r
+from o2ims.domain.resource_type import ResourceTypeEnum\r
 from o2ims.service.client.base_client import BaseClient\r
 from o2ims.domain.stx_object import StxGenericModel\r
-from o2ims.adapter.ocloud_repository import OcloudRepository\r
+from o2ims.service.unit_of_work import AbstractUnitOfWork\r
+\r
+import logging\r
+logger = logging.getLogger(__name__)\r
 \r
 \r
 class InvalidOcloudState(Exception):\r
@@ -26,18 +30,27 @@ class BaseWatcher(object):
         super().__init__()\r
         self._client = client\r
 \r
+    def targetname(self) -> str:\r
+        return self._targetname()\r
+\r
     def probe(self):\r
         self._probe()\r
 \r
     def _probe(self):\r
-        pass\r
+        raise NotImplementedError\r
 \r
+    def _targetname(self):\r
+        raise NotImplementedError\r
 \r
-class OcloudWather(BaseWatcher):\r
+\r
+class OcloudWatcher(BaseWatcher):\r
     def __init__(self, ocloud_client: BaseClient,\r
-                 repo: OcloudRepository) -> None:\r
+                 uow: AbstractUnitOfWork) -> None:\r
         super().__init__(ocloud_client)\r
-        self._repo = repo\r
+        self._uow = uow\r
+\r
+    def _targetname(self):\r
+        return "ocloud"\r
 \r
     def _probe(self):\r
         ocloudmodel = self._client.get(None)\r
@@ -45,24 +58,105 @@ class OcloudWather(BaseWatcher):
             self._compare_and_update(ocloudmodel)\r
 \r
     def _compare_and_update(self, ocloudmodel: StxGenericModel) -> bool:\r
-        # localmodel = self._repo.get(ocloudmodel.id)\r
-        oclouds = self._repo.list()\r
-        if len(oclouds) > 1:\r
-            raise InvalidOcloudState("More than 1 ocloud is found")\r
-        if len(oclouds) == 0:\r
-            self._repo.add(ocloudmodel)\r
-        else:\r
-            localmodel = oclouds.pop()\r
-            if localmodel.is_outdated(ocloudmodel):\r
-                localmodel.update_by(ocloudmodel)\r
-                self._repo.update(localmodel)\r
-\r
-\r
-class ResourcePoolWatcher(object):\r
-    def __init__(self) -> None:\r
+        with self._uow:\r
+            # localmodel = self._uow.stxobjects.get(str(ocloudmodel.id))\r
+            oclouds = self._uow.stxobjects.list(ResourceTypeEnum.OCLOUD)\r
+            if len(oclouds) > 1:\r
+                raise InvalidOcloudState("More than 1 ocloud is found")\r
+            if len(oclouds) == 0:\r
+                logger.info("add ocloud:" + ocloudmodel.name\r
+                            + " update_at: " + str(ocloudmodel.updatetime)\r
+                            + " id: " + str(ocloudmodel.id)\r
+                            + " hash: " + str(ocloudmodel.hash))\r
+                self._uow.stxobjects.add(ocloudmodel)\r
+            else:\r
+                localmodel = oclouds.pop()\r
+                if localmodel.is_outdated(ocloudmodel):\r
+                    logger.info("update ocloud:" + ocloudmodel.name\r
+                                + " update_at: " + str(ocloudmodel.updatetime)\r
+                                + " id: " + str(ocloudmodel.id)\r
+                                + " hash: " + str(ocloudmodel.hash))\r
+                    localmodel.update_by(ocloudmodel)\r
+                    self._uow.stxobjects.update(localmodel)\r
+            self._uow.commit()\r
+\r
+\r
+class DmsWatcher(BaseWatcher):\r
+    def __init__(self, client: BaseClient,\r
+                 uow: AbstractUnitOfWork) -> None:\r
+        super().__init__(client)\r
+        self._uow = uow\r
+\r
+    def _targetname(self):\r
+        return "dms"\r
+\r
+    def _probe(self):\r
+        ocloudmodel = self._client.get(None)\r
+        if ocloudmodel:\r
+            self._compare_and_update(ocloudmodel)\r
+\r
+    def _compare_and_update(self, newmodel: StxGenericModel) -> bool:\r
+        with self._uow:\r
+            # localmodel = self._uow.stxobjects.get(ocloudmodel.id)\r
+            localmodel = self._uow.stxobjects.get(str(newmodel.id))\r
+            if not localmodel:\r
+                logger.info("add dms:" + newmodel.name)\r
+                self._uow.stxobjects.add(newmodel)\r
+            elif localmodel.is_outdated(newmodel):\r
+                logger.info("update dms:" + newmodel.name)\r
+                localmodel.update_by(newmodel)\r
+                self._uow.stxobjects.update(newmodel)\r
+            self._uow.commit()\r
+\r
+\r
+class ResourcePoolWatcher(BaseWatcher):\r
+    def __init__(self, client: BaseClient,\r
+                 uow: AbstractUnitOfWork) -> None:\r
         super().__init__()\r
+        self._uow = uow\r
 \r
+    def _targetname(self):\r
+        return "resourcepool"\r
 \r
-class ResourceWatcher(object):\r
-    def __init__(self) -> None:\r
+    def _probe(self):\r
+        ocloudmodel = self._client.get(None)\r
+        if ocloudmodel:\r
+            logger.info("detect ocloudmodel:" + ocloudmodel.name)\r
+            self._compare_and_update(ocloudmodel)\r
+\r
+    def _compare_and_update(self, newmodel: StxGenericModel) -> bool:\r
+        with self._uow:\r
+            # localmodel = self._uow.stxobjects.get(ocloudmodel.id)\r
+            localmodel = self._uow.stxobjects.get(str(newmodel.id))\r
+            if not localmodel:\r
+                self._uow.stxobjects.add(newmodel)\r
+            elif localmodel.is_outdated(newmodel):\r
+                localmodel.update_by(newmodel)\r
+                self._uow.stxobjects.update(newmodel)\r
+            self._uow.commit()\r
+\r
+\r
+class ResourceWatcher(BaseWatcher):\r
+    def __init__(self, client: BaseClient,\r
+                 uow: AbstractUnitOfWork) -> None:\r
         super().__init__()\r
+        self._uow = uow\r
+\r
+    def _targetname(self):\r
+        return "resource"\r
+\r
+    def _probe(self):\r
+        ocloudmodel = self._client.get(None)\r
+        if ocloudmodel:\r
+            self._compare_and_update(ocloudmodel)\r
+\r
+    def _compare_and_update(self, newmodel: StxGenericModel) -> bool:\r
+        with self._uow:\r
+            # localmodel = self._repo.get(ocloudmodel.id)\r
+            localmodel = self._uow.stxobjects.get(str(newmodel.id))\r
+            if not localmodel:\r
+                self._uow.stxobjects.add(newmodel)\r
+            elif localmodel.is_outdated(newmodel):\r
+                localmodel.update_by(newmodel)\r
+                self._uow.stxobjects.update(newmodel)\r
+            self._uow.commit()\r