c3ff3d4fd1176d97110d4473929350dc93dbb15a
[pti/o2.git] / o2ims / service / watcher / base.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 \r
20 import logging\r
21 logger = logging.getLogger(__name__)\r
22 \r
23 \r
24 class InvalidOcloudState(Exception):\r
25     pass\r
26 \r
27 \r
28 class BaseWatcher(object):\r
29     def __init__(self, client: BaseClient) -> None:\r
30         super().__init__()\r
31         self._client = client\r
32 \r
33     def targetname(self) -> str:\r
34         return self._targetname()\r
35 \r
36     def probe(self):\r
37         self._probe()\r
38 \r
39     def _probe(self):\r
40         raise NotImplementedError\r
41 \r
42     def _targetname(self):\r
43         raise NotImplementedError\r
44 \r
45 \r
46 class OcloudWatcher(BaseWatcher):\r
47     def __init__(self, ocloud_client: BaseClient,\r
48                  uow: AbstractUnitOfWork) -> None:\r
49         super().__init__(ocloud_client)\r
50         self._uow = uow\r
51 \r
52     def _targetname(self):\r
53         return "ocloud"\r
54 \r
55     def _probe(self):\r
56         ocloudmodel = self._client.get(None)\r
57         if ocloudmodel:\r
58             self._compare_and_update(ocloudmodel)\r
59 \r
60     def _compare_and_update(self, ocloudmodel: StxGenericModel) -> bool:\r
61         with self._uow:\r
62             # localmodel = self._uow.stxobjects.get(str(ocloudmodel.id))\r
63             oclouds = self._uow.stxobjects.list(ResourceTypeEnum.OCLOUD)\r
64             if len(oclouds) > 1:\r
65                 raise InvalidOcloudState("More than 1 ocloud is found")\r
66             if len(oclouds) == 0:\r
67                 logger.info("add ocloud:" + ocloudmodel.name\r
68                             + " update_at: " + str(ocloudmodel.updatetime)\r
69                             + " id: " + str(ocloudmodel.id)\r
70                             + " hash: " + str(ocloudmodel.hash))\r
71                 self._uow.stxobjects.add(ocloudmodel)\r
72             else:\r
73                 localmodel = oclouds.pop()\r
74                 if localmodel.is_outdated(ocloudmodel):\r
75                     logger.info("update ocloud:" + ocloudmodel.name\r
76                                 + " update_at: " + str(ocloudmodel.updatetime)\r
77                                 + " id: " + str(ocloudmodel.id)\r
78                                 + " hash: " + str(ocloudmodel.hash))\r
79                     localmodel.update_by(ocloudmodel)\r
80                     self._uow.stxobjects.update(localmodel)\r
81             self._uow.commit()\r
82 \r
83 \r
84 class DmsWatcher(BaseWatcher):\r
85     def __init__(self, client: BaseClient,\r
86                  uow: AbstractUnitOfWork) -> None:\r
87         super().__init__(client)\r
88         self._uow = uow\r
89 \r
90     def _targetname(self):\r
91         return "dms"\r
92 \r
93     def _probe(self):\r
94         ocloudmodel = self._client.get(None)\r
95         if ocloudmodel:\r
96             self._compare_and_update(ocloudmodel)\r
97 \r
98     def _compare_and_update(self, newmodel: StxGenericModel) -> bool:\r
99         with self._uow:\r
100             # localmodel = self._uow.stxobjects.get(ocloudmodel.id)\r
101             localmodel = self._uow.stxobjects.get(str(newmodel.id))\r
102             if not localmodel:\r
103                 logger.info("add dms:" + newmodel.name)\r
104                 self._uow.stxobjects.add(newmodel)\r
105             elif localmodel.is_outdated(newmodel):\r
106                 logger.info("update dms:" + newmodel.name)\r
107                 localmodel.update_by(newmodel)\r
108                 self._uow.stxobjects.update(newmodel)\r
109             self._uow.commit()\r
110 \r
111 \r
112 class ResourcePoolWatcher(BaseWatcher):\r
113     def __init__(self, client: BaseClient,\r
114                  uow: AbstractUnitOfWork) -> None:\r
115         super().__init__()\r
116         self._uow = uow\r
117 \r
118     def _targetname(self):\r
119         return "resourcepool"\r
120 \r
121     def _probe(self):\r
122         ocloudmodel = self._client.get(None)\r
123         if ocloudmodel:\r
124             logger.info("detect ocloudmodel:" + ocloudmodel.name)\r
125             self._compare_and_update(ocloudmodel)\r
126 \r
127     def _compare_and_update(self, newmodel: StxGenericModel) -> bool:\r
128         with self._uow:\r
129             # localmodel = self._uow.stxobjects.get(ocloudmodel.id)\r
130             localmodel = self._uow.stxobjects.get(str(newmodel.id))\r
131             if not localmodel:\r
132                 self._uow.stxobjects.add(newmodel)\r
133             elif localmodel.is_outdated(newmodel):\r
134                 localmodel.update_by(newmodel)\r
135                 self._uow.stxobjects.update(newmodel)\r
136             self._uow.commit()\r
137 \r
138 \r
139 class ResourceWatcher(BaseWatcher):\r
140     def __init__(self, client: BaseClient,\r
141                  uow: AbstractUnitOfWork) -> None:\r
142         super().__init__()\r
143         self._uow = uow\r
144 \r
145     def _targetname(self):\r
146         return "resource"\r
147 \r
148     def _probe(self):\r
149         ocloudmodel = self._client.get(None)\r
150         if ocloudmodel:\r
151             self._compare_and_update(ocloudmodel)\r
152 \r
153     def _compare_and_update(self, newmodel: StxGenericModel) -> bool:\r
154         with self._uow:\r
155             # localmodel = self._repo.get(ocloudmodel.id)\r
156             localmodel = self._uow.stxobjects.get(str(newmodel.id))\r
157             if not localmodel:\r
158                 self._uow.stxobjects.add(newmodel)\r
159             elif localmodel.is_outdated(newmodel):\r
160                 localmodel.update_by(newmodel)\r
161                 self._uow.stxobjects.update(newmodel)\r
162             self._uow.commit()\r