1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
# This software is distributed under the terms and conditions of the 'Apache-2.0'
# license which can be found in the file 'LICENSE' in this package distribution
# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
import base64
import json
import python_moonutilities.request_wrapper as requests
import logging.config
from python_moonutilities import exceptions
logger = logging.getLogger("moon.utilities.configuration")
CONSUL_HOST = "consul"
CONSUL_PORT = "8500"
DATABASE = "database"
KEYSTONE = "keystone"
DOCKER = "docker"
COMPONENTS = "components"
def init_logging():
config = get_configuration("logging")
logging.config.dictConfig(config['logging'])
def increment_port():
components_object = get_configuration("components/port_start")
if 'components/port_start' in components_object:
components_port_start = int(components_object['components/port_start'])
components_port_start += 1
else:
raise exceptions.ConsulComponentContentError("error={}".format(components_object))
url = "http://{}:{}/v1/kv/components/port_start".format(CONSUL_HOST, CONSUL_PORT)
req = requests.put(url, json=str(components_port_start))
if req.status_code != 200:
logger.info("url={}".format(url))
raise exceptions.ConsulError
return components_port_start
def get_configuration(key):
url = "http://{}:{}/v1/kv/{}".format(CONSUL_HOST, CONSUL_PORT, key)
req = requests.get(url)
if req.status_code != 200:
logger.error("url={}".format(url))
raise exceptions.ConsulComponentNotFound("error={}: {}".format(req.status_code, req.text))
data = req.json()
if len(data) == 1:
data = data[0]
if all( k in data for k in ("Key", "Value")) :
return {data["Key"]: json.loads(base64.b64decode(data["Value"]).decode("utf-8"))}
raise exceptions.ConsulComponentContentError("error={}".format(data))
else:
for item in data:
if not all(k in item for k in ("Key", "Value")):
logger.warning("invalidate content {}".format(item))
raise exceptions.ConsulComponentContentError("error={}".format(data))
return [
{
item["Key"]: json.loads(base64.b64decode(item["Value"]).decode("utf-8"))
} for item in data
]
def add_component(name, uuid, port=None, bind="127.0.0.1", keystone_id="", extra=None, container=None):
data = {
"hostname": name,
"keystone_id": keystone_id,
"bind": bind,
"port": port,
"extra": extra,
"container": container
}
req = requests.put(
"http://{}:{}/v1/kv/components/{}".format(CONSUL_HOST, CONSUL_PORT, uuid),
headers={"content-type": "application/json"},
json=data
)
if req.status_code != 200:
logger.debug("url={}".format("http://{}:{}/v1/kv/components/{}".format(CONSUL_HOST, CONSUL_PORT, uuid)))
logger.debug("data={}".format(data))
raise exceptions.ConsulError
logger.info("Add component {}".format(req.text))
return get_configuration("components/"+uuid)
def get_plugins():
pipeline = get_configuration("components/pipeline")
logger.debug("pipeline={}".format(pipeline))
components = pipeline.get("components/pipeline")
if 'interface' in components:
components.pop('interface')
else:
raise exceptions.ConsulComponentContentError("error= Components pipeline has no interface")
return components
def get_components():
url = "http://{}:{}/v1/kv/components?recurse=true".format(CONSUL_HOST, CONSUL_PORT)
req = requests.get(url)
if req.status_code != 200:
logger.info("url={}".format(url))
raise exceptions.ConsulError
data = req.json()
if len(data) == 1:
data = data[0]
if all(k in data for k in ("Key", "Value")):
return {data["Key"].replace("components/", ""): json.loads(base64.b64decode(data["Value"]).decode("utf-8"))}
raise exceptions.ConsulComponentContentError("error={}".format(data))
else:
for item in data:
if not all(k in item for k in ("Key", "Value")):
logger.warning("invalidate content {}".format(item))
raise exceptions.ConsulComponentContentError("error={}".format(data))
return {
item["Key"].replace("components/", ""): json.loads(base64.b64decode(item["Value"]).decode("utf-8"))
for item in data
}
init_logging()
|