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
7 # http://www.apache.org/licenses/LICENSE-2.0
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.
15 from cmdatahandlers.api import config
16 from cmdatahandlers.api import utils
17 from cmdatahandlers.api import configerror
18 from serviceprofiles import profiles
22 from random import choice
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"
32 DEFAULT_CAAS_INFRA_LOG_TYPE = 'remote_syslog'
35 class Config(config.Config):
36 valid_redundancy_models = ['non-redundant', 'active-cold-standby']
38 def __init__(self, confman):
39 super(Config, self).__init__(confman)
40 self.ROOT = 'cloud.caas'
50 def flavour_set(self):
51 hostsconf = self.confman.get_hosts_config_handler()
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"
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()
76 def set_static_config(self):
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:
88 raise configerror.ConfigError("Unexpected issue has occured!")
90 def set_post_config(self):
91 self.config[self.ROOT]['swift_credential'] = \
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)
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)
111 def add_defaults(self):
112 if not self.config.get('cloud.caas', ''):
114 self.set_dynamic_config()
115 self.set_static_config()
116 self.set_post_config()
118 def is_vnf_embedded_deployment(self):
119 return self.get_caas_only() and self.get_vnf_flag()
121 def get_vnf_flag(self):
122 return bool(self.config.get(self.ROOT, {}).get('vnf_embedded_deployment',
125 def get_caas_only(self):
126 return self.is_caas_deployment() and not self.is_openstack_deployment()
128 def is_openstack_deployment(self):
129 return bool(self.get_controller_hosts())
131 def is_caas_deployment(self):
132 return bool(self.get_caas_master_hosts())
134 def is_hybrid_deployment(self):
135 return self.is_caas_deployment() and self.is_openstack_deployment()
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())
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)
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())
149 def get_apiserver_in_hosts(self):
150 return self.config.get(self.ROOT, {}).get('apiserver_in_hosts', '')
152 def get_registry_url(self):
153 return self.config.get(self.ROOT, {}).get('registry_url', '')
155 def get_update_registry_url(self):
156 return self.config.get(self.ROOT, {}).get('update_registry_url', '')
158 def get_swift_url(self):
159 return self.config.get(self.ROOT, {}).get('swift_url', '')
161 def get_swift_update_url(self):
162 return self.config.get(self.ROOT, {}).get('swift_update_url', '')
164 def get_ldap_master_url(self):
165 return self.config.get(self.ROOT, {}).get('ldap_master_url', '')
167 def get_ldap_slave_url(self):
168 return self.config.get(self.ROOT, {}).get('ldap_slave_url', '')
170 def get_chart_repo_url(self):
171 return self.config.get(self.ROOT, {}).get('chart_repo_url', '')
173 def get_tiller_url(self):
174 return self.config.get(self.ROOT, {}).get('tiller_url', '')
176 def get_apiserver_svc_ip(self):
177 return self.config.get(self.ROOT, {}).get('apiserver_svc_ip', '')
179 def get_caas_parameter(self, parameter):
180 return self.config.get(self.ROOT, {}).get(parameter, '')
182 def set_caas_parameter(self, parameter, value):
183 self.config[self.ROOT][parameter] = value
185 def get_admin_password(self):
186 return self.config.get(self.ROOT, {}).get('admin_password')
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))
193 def get_kubernetes_domain(self):
194 return 'kubernetes.default.svc.{}'.format(
195 self.config.get(self.ROOT, {}).get('dns_domain', ''))
197 def get_caas_soft_eviction_threshold(self):
198 if self.is_vnf_embedded_deployment():
199 return VNF_EMBEDDED_SOFT_EVICTION_THRESHOLD
201 return BM_SOFT_EVICTION_THRESHOLD
203 def get_caas_hard_eviction_threshold(self):
204 if self.is_vnf_embedded_deployment():
205 return VNF_EMBEDDED_HARD_EVICTION_THRESHOLD
207 return BM_HARD_EVICTION_THRESHOLD