blob: 286f0fc05b135e7be53402b5472523b66d908d70 [file] [log] [blame]
David Garcia4fee80e2020-05-13 12:18:38 +02001# Copyright 2020 Canonical Ltd.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
David Garcia475a7222020-09-21 16:19:15 +020015import base64
16import re
17import binascii
ksaikiranrb816d822021-03-17 12:50:20 +053018import yaml
Pedro Escaleira0ebadd82022-03-21 17:54:45 +000019import string
20import secrets
David Garcia4fee80e2020-05-13 12:18:38 +020021from enum import Enum
22from juju.machine import Machine
23from juju.application import Application
24from juju.action import Action
25from juju.unit import Unit
David Garcia475a7222020-09-21 16:19:15 +020026from n2vc.exceptions import N2VCInvalidCertificate
David Garcia582b9232021-10-26 12:30:44 +020027from typing import Tuple
David Garcia475a7222020-09-21 16:19:15 +020028
29
30def base64_to_cacert(b64string):
31 """Convert the base64-encoded string containing the VCA CACERT.
32
33 The input string....
34
35 """
36 try:
37 cacert = base64.b64decode(b64string).decode("utf-8")
38
garciadeblas82b591c2021-03-24 09:22:13 +010039 cacert = re.sub(
40 r"\\n",
41 r"\n",
42 cacert,
43 )
David Garcia475a7222020-09-21 16:19:15 +020044 except binascii.Error as e:
45 raise N2VCInvalidCertificate(message="Invalid CA Certificate: {}".format(e))
46
47 return cacert
David Garcia4fee80e2020-05-13 12:18:38 +020048
49
50class N2VCDeploymentStatus(Enum):
51 PENDING = "pending"
52 RUNNING = "running"
53 COMPLETED = "completed"
54 FAILED = "failed"
55 UNKNOWN = "unknown"
56
57
58class Dict(dict):
59 """
60 Dict class that allows to access the keys like attributes
61 """
62
63 def __getattribute__(self, name):
64 if name in self:
65 return self[name]
66
67
68class EntityType(Enum):
69 MACHINE = Machine
70 APPLICATION = Application
71 ACTION = Action
72 UNIT = Unit
73
74 @classmethod
75 def has_value(cls, value):
76 return value in cls._value2member_map_ # pylint: disable=E1101
77
78 @classmethod
79 def get_entity(cls, value):
80 return (
81 cls._value2member_map_[value] # pylint: disable=E1101
82 if value in cls._value2member_map_ # pylint: disable=E1101
83 else None # pylint: disable=E1101
84 )
85
86 @classmethod
87 def get_entity_from_delta(cls, delta_entity: str):
88 """
89 Get Value from delta entity
90
91 :param: delta_entity: Possible values are "machine", "application", "unit", "action"
92 """
93 for v in cls._value2member_map_: # pylint: disable=E1101
94 if v.__name__.lower() == delta_entity:
95 return cls.get_entity(v)
96
97
David Garcia4fee80e2020-05-13 12:18:38 +020098JujuStatusToOSM = {
David Garciac38a6962020-09-16 13:31:33 +020099 "machine": {
David Garcia4fee80e2020-05-13 12:18:38 +0200100 "pending": N2VCDeploymentStatus.PENDING,
101 "started": N2VCDeploymentStatus.COMPLETED,
102 },
David Garciac38a6962020-09-16 13:31:33 +0200103 "application": {
David Garcia4fee80e2020-05-13 12:18:38 +0200104 "waiting": N2VCDeploymentStatus.RUNNING,
105 "maintenance": N2VCDeploymentStatus.RUNNING,
106 "blocked": N2VCDeploymentStatus.RUNNING,
107 "error": N2VCDeploymentStatus.FAILED,
108 "active": N2VCDeploymentStatus.COMPLETED,
109 },
David Garciac38a6962020-09-16 13:31:33 +0200110 "action": {
David Garcia2f66c4d2020-06-19 11:40:18 +0200111 "pending": N2VCDeploymentStatus.PENDING,
David Garcia4fee80e2020-05-13 12:18:38 +0200112 "running": N2VCDeploymentStatus.RUNNING,
113 "completed": N2VCDeploymentStatus.COMPLETED,
114 },
David Garciac38a6962020-09-16 13:31:33 +0200115 "unit": {
David Garcia4fee80e2020-05-13 12:18:38 +0200116 "waiting": N2VCDeploymentStatus.RUNNING,
117 "maintenance": N2VCDeploymentStatus.RUNNING,
118 "blocked": N2VCDeploymentStatus.RUNNING,
119 "error": N2VCDeploymentStatus.FAILED,
120 "active": N2VCDeploymentStatus.COMPLETED,
121 },
122}
David Garcia2f66c4d2020-06-19 11:40:18 +0200123
ksaikiranrb816d822021-03-17 12:50:20 +0530124
125def obj_to_yaml(obj: object) -> str:
126 """
127 Converts object to yaml format
128 :return: yaml data
129 """
130 # dump to yaml
131 dump_text = yaml.dump(obj, default_flow_style=False, indent=2)
132 # split lines
133 lines = dump_text.splitlines()
134 # remove !!python/object tags
135 yaml_text = ""
136 for line in lines:
137 index = line.find("!!python/object")
138 if index >= 0:
139 line = line[:index]
140 yaml_text += line + "\n"
141 return yaml_text
142
143
144def obj_to_dict(obj: object) -> dict:
145 """
146 Converts object to dictionary format
147 :return: dict data
148 """
149 # convert obj to yaml
150 yaml_text = obj_to_yaml(obj)
151 # parse to dict
152 return yaml.load(yaml_text, Loader=yaml.Loader)
David Garcia582b9232021-10-26 12:30:44 +0200153
154
155def get_ee_id_components(ee_id: str) -> Tuple[str, str, str]:
156 """
157 Get model, application and machine components from an execution environment id
158 :param ee_id:
159 :return: model_name, application_name, machine_id
160 """
161 parts = ee_id.split(".")
162 if len(parts) != 3:
163 raise Exception("invalid ee id.")
164 model_name = parts[0]
165 application_name = parts[1]
166 machine_id = parts[2]
167 return model_name, application_name, machine_id
Pedro Escaleira0ebadd82022-03-21 17:54:45 +0000168
169
170def generate_random_alfanum_string(size: int) -> str:
171 """
172 Generate random alfa-numeric string with a size given by argument
173 :param size:
174 :return: random generated string
175 """
176
177 return "".join(
178 secrets.choice(string.ascii_letters + string.digits) for i in range(size)
179 )