Set ElasticSearch as default infra log store
[ta/config-manager.git] / cmdatahandlers / src / cmdatahandlers / caas / config.py
1 # Copyright 2019 Nokia
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
15 from cmdatahandlers.api import config
16 from cmdatahandlers.api import utils
17 from cmdatahandlers.api import configerror
18 from serviceprofiles import profiles
19 import yaml
20 import jinja2
21 import string
22 from random import choice
23
24 CAAS_CONFIG_FILE_PATH = "/etc/cmframework/config/"
25 CAAS_CONFIG_FILE = "caas.yaml"
26 DEFAULT_CAAS_DNS_DOMAIN = "rec.io"
27 VNF_EMBEDDED_SOFT_EVICTION_THRESHOLD = "300Mi"
28 BM_SOFT_EVICTION_THRESHOLD = "4Gi"
29 VNF_EMBEDDED_HARD_EVICTION_THRESHOLD = "200Mi"
30 BM_HARD_EVICTION_THRESHOLD = "2Gi"
31 ADMIN_PWD_LENGTH = 20
32 DEFAULT_CAAS_INFRA_LOG_TYPE = 'elasticsearch'
33
34
35 class Config(config.Config):
36     valid_redundancy_models = ['non-redundant', 'active-cold-standby']
37
38     def __init__(self, confman):
39         super(Config, self).__init__(confman)
40         self.ROOT = 'cloud.caas'
41         self.DOMAIN = 'caas'
42
43     def init(self):
44         pass
45
46     @staticmethod
47     def validate():
48         print("validate")
49
50     def flavour_set(self):
51         hostsconf = self.confman.get_hosts_config_handler()
52         caas_masters = []
53         for host in hostsconf.get_hosts():
54             if 'caas_master' in hostsconf.get_service_profiles(host):
55                 caas_masters.append(host)
56         return "multi" if len(caas_masters) > 1 else "single"
57
58     def set_dynamic_config(self):
59         if utils.is_virtualized():
60             self.config[self.ROOT]['vnf_embedded_deployment'] = self.get_vnf_flag()
61         user_conf = self.confman.get_users_config_handler()
62         self.set_caas_parameter('helm_home', "/home/{}/.helm".format(user_conf.get_admin_user()))
63         self.set_caas_parameter('flavour', self.flavour_set())
64         admin_pwd = self.get_caas_parameter('admin_password')
65         self.config[self.ROOT]['admin_password'] = \
66                 admin_pwd if admin_pwd != '' else self.generate_pwd(ADMIN_PWD_LENGTH)
67         if not self.get_caas_parameter('dns_domain'):
68             self.set_caas_parameter('dns_domain', DEFAULT_CAAS_DNS_DOMAIN)
69         if not self.get_caas_parameter('infra_log_store'):
70             self.set_caas_parameter('infra_log_store', DEFAULT_CAAS_INFRA_LOG_TYPE)
71         if not self.get_caas_parameter('log_forwarding'):
72             self.set_caas_parameter('log_forwarding', [])
73         hostsconf = self.confman.get_hosts_config_handler()
74         hostsconf.set_nodeindex()
75
76     def set_static_config(self):
77         try:
78             template = jinja2.Environment(
79                 loader=jinja2.FileSystemLoader(
80                     CAAS_CONFIG_FILE_PATH)).get_template(CAAS_CONFIG_FILE)
81             with open(CAAS_CONFIG_FILE_PATH + CAAS_CONFIG_FILE) as config_file:
82                 data = yaml.load(config_file)
83             self.config[self.ROOT].update(
84                 self._template_config(template, self.config[self.ROOT], data))
85         except jinja2.exceptions.TemplateNotFound:
86             return
87         except Exception:
88             raise configerror.ConfigError("Unexpected issue has occured!")
89
90     def set_post_config(self):
91         self.config[self.ROOT]['swift_credential'] = \
92             dict(
93                 user=self.get_caas_parameter('swift_credential').get('user'),
94                 tenant=self.get_caas_parameter('swift_credential').get('tenant'),
95                 password=self.generate_pwd(ADMIN_PWD_LENGTH)
96             )
97
98     @staticmethod
99     def _template_config(template, base_config, initial_data):
100         config_data = initial_data.copy()
101         config_data.update(base_config)
102         output_text = template.render(config_data)
103         previous_output_text = ""
104         while output_text != previous_output_text:
105             config_data = yaml.load(output_text)
106             config_data.update(base_config)
107             output_text = template.render(config_data)
108             previous_output_text = output_text
109         return yaml.load(output_text)
110
111     def add_defaults(self):
112         if not self.config.get('cloud.caas', ''):
113             return
114         self.set_dynamic_config()
115         self.set_static_config()
116         self.set_post_config()
117
118     def is_vnf_embedded_deployment(self):
119         return self.get_caas_only() and self.get_vnf_flag()
120
121     def get_vnf_flag(self):
122         return bool(self.config.get(self.ROOT, {}).get('vnf_embedded_deployment',
123                                                   False))
124
125     def get_caas_only(self):
126         return self.is_caas_deployment() and not self.is_openstack_deployment()
127
128     def is_openstack_deployment(self):
129         return bool(self.get_controller_hosts())
130
131     def is_caas_deployment(self):
132         return bool(self.get_caas_master_hosts())
133
134     def is_hybrid_deployment(self):
135         return self.is_caas_deployment() and self.is_openstack_deployment()
136
137     def get_caas_master_hosts(self):
138         service_profiles_lib = profiles.Profiles()
139         return self._get_hosts_for_service_profile(service_profiles_lib.get_caasmaster_service_profile())
140
141     def _get_hosts_for_service_profile(self, profile):
142         hostsconf = self.confman.get_hosts_config_handler()
143         return hostsconf.get_service_profile_hosts(profile)
144
145     def get_controller_hosts(self):
146         service_profiles_lib = profiles.Profiles()
147         return self._get_hosts_for_service_profile(service_profiles_lib.get_controller_service_profile())
148
149     def get_apiserver_in_hosts(self):
150         return self.config.get(self.ROOT, {}).get('apiserver_in_hosts', '')
151
152     def get_registry_url(self):
153         return self.config.get(self.ROOT, {}).get('registry_url', '')
154
155     def get_update_registry_url(self):
156         return self.config.get(self.ROOT, {}).get('update_registry_url', '')
157
158     def get_swift_url(self):
159         return self.config.get(self.ROOT, {}).get('swift_url', '')
160
161     def get_swift_update_url(self):
162         return self.config.get(self.ROOT, {}).get('swift_update_url', '')
163
164     def get_ldap_master_url(self):
165         return self.config.get(self.ROOT, {}).get('ldap_master_url', '')
166
167     def get_ldap_slave_url(self):
168         return self.config.get(self.ROOT, {}).get('ldap_slave_url', '')
169
170     def get_chart_repo_url(self):
171         return self.config.get(self.ROOT, {}).get('chart_repo_url', '')
172
173     def get_tiller_url(self):
174         return self.config.get(self.ROOT, {}).get('tiller_url', '')
175
176     def get_apiserver_svc_ip(self):
177         return self.config.get(self.ROOT, {}).get('apiserver_svc_ip', '')
178
179     def get_caas_parameter(self, parameter):
180         return self.config.get(self.ROOT, {}).get(parameter, '')
181
182     def set_caas_parameter(self, parameter, value):
183         self.config[self.ROOT][parameter] = value
184
185     def get_admin_password(self):
186         return self.config.get(self.ROOT, {}).get('admin_password')
187
188     @staticmethod
189     def generate_pwd(pwd_length):
190         character_pool = string.ascii_letters + string.digits
191         return ''.join(choice(character_pool) for i in range(pwd_length))
192
193     def get_kubernetes_domain(self):
194         return 'kubernetes.default.svc.{}'.format(
195             self.config.get(self.ROOT, {}).get('dns_domain', ''))
196
197     def get_caas_soft_eviction_threshold(self):
198         if self.is_vnf_embedded_deployment():
199             return VNF_EMBEDDED_SOFT_EVICTION_THRESHOLD
200         else:
201             return BM_SOFT_EVICTION_THRESHOLD
202
203     def get_caas_hard_eviction_threshold(self):
204         if self.is_vnf_embedded_deployment():
205             return VNF_EMBEDDED_HARD_EVICTION_THRESHOLD
206         else:
207             return BM_HARD_EVICTION_THRESHOLD