blob: a1a5c1481279d7f162e29a27b3ee0735411272f9 [file] [log] [blame]
William Kurkian6f436d02019-02-06 16:25:01 -05001#
2# Copyright 2018 the original author or authors.
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16
17"""Resource KV store - interface between Resource Manager and backend store."""
18import structlog
19
20from voltha.core.config.config_backend import ConsulStore
21from voltha.core.config.config_backend import EtcdStore
22
23# KV store uses this prefix to store resource info
24PATH_PREFIX = 'resource_manager/{}'
25
26
27class ResourceKvStore(object):
28 """Implements apis to store/get/remove resource in backend store."""
29
30 def __init__(self, technology, device_id, backend, host, port):
31 """
32 Create ResourceKvStore object.
33
34 Based on backend ('consul' and 'etcd' use the host and port
35 to create the respective object.
36
37 :param technology: PON technology
38 :param device_id: OLT device id
39 :param backend: Type of backend storage (etcd or consul)
40 :param host: host ip info for backend storage
41 :param port: port for the backend storage
42 :raises exception when invalid backend store passed as an argument
43 """
44 # logger
45 self._log = structlog.get_logger()
46
47 path = PATH_PREFIX.format(technology)
48 try:
49 if backend == 'consul':
50 self._kv_store = ConsulStore(host, port, path)
51 elif backend == 'etcd':
52 self._kv_store = EtcdStore(host, port, path)
53 else:
54 self._log.error('Invalid-backend')
55 raise Exception("Invalid-backend-for-kv-store")
56 except Exception as e:
57 self._log.exception("exception-in-init")
58 raise Exception(e)
59
60 def update_to_kv_store(self, path, resource):
61 """
62 Update resource.
63
64 :param path: path to update the resource
65 :param resource: updated resource
66 """
67 try:
68 self._kv_store[path] = str(resource)
69 self._log.debug("Resource-updated-in-kv-store", path=path)
70 return True
71 except BaseException:
72 self._log.exception("Resource-update-in-kv-store-failed",
73 path=path, resource=resource)
74 return False
75
76 def get_from_kv_store(self, path):
77 """
78 Get resource.
79
80 :param path: path to get the resource
81 """
82 resource = None
83 try:
84 resource = self._kv_store[path]
85 self._log.debug("Got-resource-from-kv-store", path=path)
86 except KeyError:
87 self._log.info("Resource-not-found-updating-resource",
88 path=path)
89 except BaseException:
90 self._log.exception("Getting-resource-from-kv-store-failed",
91 path=path)
92 return resource
93
94 def remove_from_kv_store(self, path):
95 """
96 Remove resource.
97
98 :param path: path to remove the resource
99 """
100 try:
101 del self._kv_store[path]
102 self._log.debug("Resource-deleted-in-kv-store", path=path)
103 return True
104 except BaseException:
105 self._log.exception("Resource-delete-in-kv-store-failed",
106 path=path)
107 return False