6a73f48f9be76aa97e02652a4ddd53b5f0d66e29
[pti/o2.git] / o2ims / service / watcher / ocloud_watcher.py
1 # Copyright (C) 2021 Wind River Systems, Inc.\r
2 #\r
3 #  Licensed under the Apache License, Version 2.0 (the "License");\r
4 #  you may not use this file except in compliance with the License.\r
5 #  You may obtain a copy of the License at\r
6 #\r
7 #      http://www.apache.org/licenses/LICENSE-2.0\r
8 #\r
9 #  Unless required by applicable law or agreed to in writing, software\r
10 #  distributed under the License is distributed on an "AS IS" BASIS,\r
11 #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
12 #  See the License for the specific language governing permissions and\r
13 #  limitations under the License.\r
14 \r
15 from o2ims.domain.resource_type import ResourceTypeEnum\r
16 from o2ims.service.client.base_client import BaseClient\r
17 from o2ims.domain.stx_object import StxGenericModel\r
18 from o2ims.service.unit_of_work import AbstractUnitOfWork\r
19 from o2ims.service.watcher.base import BaseWatcher\r
20 \r
21 from o2common.helper import o2logging\r
22 logger = o2logging.get_logger(__name__)\r
23 \r
24 \r
25 class InvalidOcloudState(Exception):\r
26     pass\r
27 \r
28 \r
29 class OcloudWatcher(BaseWatcher):\r
30     def __init__(self, ocloud_client: BaseClient,\r
31                  uow: AbstractUnitOfWork) -> None:\r
32         super().__init__(ocloud_client, uow)\r
33 \r
34     def _targetname(self):\r
35         return "ocloud"\r
36 \r
37     def _probe(self, parent: object = None):\r
38         ocloudmodel = self._client.get(None)\r
39         if ocloudmodel:\r
40             self._compare_and_update(ocloudmodel)\r
41         return [ocloudmodel]\r
42 \r
43     def _compare_and_update(self, ocloudmodel: StxGenericModel) -> bool:\r
44         with self._uow:\r
45             # localmodel = self._uow.stxobjects.get(str(ocloudmodel.id))\r
46             oclouds = self._uow.stxobjects.list(ResourceTypeEnum.OCLOUD)\r
47             if len(oclouds) > 1:\r
48                 raise InvalidOcloudState("More than 1 ocloud is found")\r
49             if len(oclouds) == 0:\r
50                 logger.info("add ocloud:" + ocloudmodel.name\r
51                             + " update_at: " + str(ocloudmodel.updatetime)\r
52                             + " id: " + str(ocloudmodel.id)\r
53                             + " hash: " + str(ocloudmodel.hash))\r
54                 self._uow.stxobjects.add(ocloudmodel)\r
55             else:\r
56                 localmodel = oclouds.pop()\r
57                 if localmodel.is_outdated(ocloudmodel):\r
58                     logger.info("update ocloud:" + ocloudmodel.name\r
59                                 + " update_at: " + str(ocloudmodel.updatetime)\r
60                                 + " id: " + str(ocloudmodel.id)\r
61                                 + " hash: " + str(ocloudmodel.hash))\r
62                     localmodel.update_by(ocloudmodel)\r
63                     self._uow.stxobjects.update(localmodel)\r
64             self._uow.commit()\r
65 \r
66 \r
67 class DmsWatcher(BaseWatcher):\r
68     def __init__(self, client: BaseClient,\r
69                  uow: AbstractUnitOfWork) -> None:\r
70         super().__init__(client, uow)\r
71 \r
72     def _targetname(self):\r
73         return "dms"\r
74 \r
75     def _probe(self, parent: object = None):\r
76         ocloudid = parent.id if parent else None\r
77         newmodels = self._client.list(ocloudid=ocloudid)\r
78         for newmodel in newmodels:\r
79             super()._compare_and_update(newmodel)\r
80         return newmodels\r