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 = 'elasticsearch'
33 AUDIT_DISK_LIMIT = 0.87
34 CAAS_AUDIT_DISK_RATIO = 0.25
35 DEFAULT_VALUES_MAP = { "docker0_cidr": "127.17.0.1/16",
36 "oam_cidr": "10.244.0.0/16" }
39 class Config(config.Config):
40 valid_redundancy_models = ['non-redundant', 'active-cold-standby']
42 def __init__(self, confman):
43 super(Config, self).__init__(confman)
44 self.ROOT = 'cloud.caas'
54 def flavour_set(self):
55 hostsconf = self.confman.get_hosts_config_handler()
57 for host in hostsconf.get_hosts():
58 if 'caas_master' in hostsconf.get_service_profiles(host):
59 caas_masters.append(host)
60 return "multi" if len(caas_masters) > 1 else "single"
62 def get_caas_max_audit_size(self):
63 if self.is_caas_deployment():
64 return self.get_audit_disk_limit()*self.get_audit_disk_ratio()
68 def set_dynamic_config(self):
69 if utils.is_virtualized():
70 self.config[self.ROOT]['vnf_embedded_deployment'] = self.get_vnf_flag()
71 user_conf = self.confman.get_users_config_handler()
72 self.set_caas_parameter('helm_home', "/home/{}/.helm".format(user_conf.get_admin_user()))
73 self.set_caas_parameter('flavour', self.flavour_set())
74 self.config[self.ROOT]['caas_max_audit_size'] = self.get_caas_max_audit_size()
75 admin_pwd = self.get_caas_parameter('admin_password')
76 self.config[self.ROOT]['admin_password'] = \
77 admin_pwd if admin_pwd != '' else self.generate_pwd(ADMIN_PWD_LENGTH)
78 if not self.get_caas_parameter('dns_domain'):
79 self.set_caas_parameter('dns_domain', DEFAULT_CAAS_DNS_DOMAIN)
80 if not self.get_caas_parameter('infra_log_store'):
81 self.set_caas_parameter('infra_log_store', DEFAULT_CAAS_INFRA_LOG_TYPE)
82 if not self.get_caas_parameter('log_forwarding'):
83 self.set_caas_parameter('log_forwarding', [])
84 hostsconf = self.confman.get_hosts_config_handler()
85 hostsconf.set_nodeindex()
86 hostsconf.set_noderole()
88 def set_static_config(self):
90 template = jinja2.Environment(
91 loader=jinja2.FileSystemLoader(
92 CAAS_CONFIG_FILE_PATH)).get_template(CAAS_CONFIG_FILE)
93 with open(CAAS_CONFIG_FILE_PATH + CAAS_CONFIG_FILE) as config_file:
94 data = yaml.load(config_file)
95 self.config[self.ROOT].update(
96 self._template_config(template, self.config[self.ROOT], data))
97 except jinja2.exceptions.TemplateNotFound:
100 raise configerror.ConfigError("Unexpected issue has occured!")
102 def set_post_config(self):
103 self.config[self.ROOT]['swift_credential'] = \
105 user=self.get_caas_parameter('swift_credential').get('user'),
106 tenant=self.get_caas_parameter('swift_credential').get('tenant'),
107 password=self.generate_pwd(ADMIN_PWD_LENGTH)
110 def set_default_values_to_optional_params(self):
111 for parameter_name, default_value in DEFAULT_VALUES_MAP.iteritems():
112 if self.config[self.ROOT].get(parameter_name, '') == '':
113 self.config[self.ROOT][parameter_name] = default_value
116 def _template_config(template, base_config, initial_data):
117 config_data = initial_data.copy()
118 config_data.update(base_config)
119 output_text = template.render(config_data)
120 previous_output_text = ""
121 while output_text != previous_output_text:
122 config_data = yaml.load(output_text)
123 config_data.update(base_config)
124 output_text = template.render(config_data)
125 previous_output_text = output_text
126 return yaml.load(output_text)
128 def add_defaults(self):
129 if not self.config.get('cloud.caas', ''):
131 self.set_dynamic_config()
132 self.set_static_config()
133 self.set_default_values_to_optional_params()
134 self.set_post_config()
136 def is_vnf_embedded_deployment(self):
137 return self.get_caas_only() and self.get_vnf_flag()
139 def get_vnf_flag(self):
140 return bool(self.config.get(self.ROOT, {}).get('vnf_embedded_deployment',
143 def get_caas_only(self):
144 return self.is_caas_deployment() and not self.is_openstack_deployment()
146 def is_openstack_deployment(self):
147 return bool(self.get_controller_hosts())
149 def is_caas_deployment(self):
150 return bool(self.get_caas_master_hosts())
152 def is_hybrid_deployment(self):
153 return self.is_caas_deployment() and self.is_openstack_deployment()
155 def get_caas_master_hosts(self):
156 service_profiles_lib = profiles.Profiles()
157 return self._get_hosts_for_service_profile(service_profiles_lib.get_caasmaster_service_profile())
159 def _get_hosts_for_service_profile(self, profile):
160 hostsconf = self.confman.get_hosts_config_handler()
161 return hostsconf.get_service_profile_hosts(profile)
163 def get_controller_hosts(self):
164 service_profiles_lib = profiles.Profiles()
165 return self._get_hosts_for_service_profile(service_profiles_lib.get_controller_service_profile())
167 def get_apiserver_in_hosts(self):
168 return self.config.get(self.ROOT, {}).get('apiserver_in_hosts', '')
170 def get_registry_url(self):
171 return self.config.get(self.ROOT, {}).get('registry_url', '')
173 def get_update_registry_url(self):
174 return self.config.get(self.ROOT, {}).get('update_registry_url', '')
176 def get_swift_url(self):
177 return self.config.get(self.ROOT, {}).get('swift_url', '')
179 def get_swift_update_url(self):
180 return self.config.get(self.ROOT, {}).get('swift_update_url', '')
182 def get_ldap_master_url(self):
183 return self.config.get(self.ROOT, {}).get('ldap_master_url', '')
185 def get_ldap_slave_url(self):
186 return self.config.get(self.ROOT, {}).get('ldap_slave_url', '')
188 def get_chart_repo_url(self):
189 return self.config.get(self.ROOT, {}).get('chart_repo_url', '')
191 def get_tiller_url(self):
192 return self.config.get(self.ROOT, {}).get('tiller_url', '')
194 def get_apiserver_svc_ip(self):
195 return self.config.get(self.ROOT, {}).get('apiserver_svc_ip', '')
197 def get_caas_parameter(self, parameter):
198 return self.config.get(self.ROOT, {}).get(parameter, '')
200 def set_caas_parameter(self, parameter, value):
201 self.config[self.ROOT][parameter] = value
203 def get_admin_password(self):
204 return self.config.get(self.ROOT, {}).get('admin_password')
207 def generate_pwd(pwd_length):
208 character_pool = string.ascii_letters + string.digits
209 return ''.join(choice(character_pool) for i in range(pwd_length))
211 def get_kubernetes_domain(self):
212 return 'kubernetes.default.svc.{}'.format(
213 self.config.get(self.ROOT, {}).get('dns_domain', ''))
215 def get_caas_soft_eviction_threshold(self):
216 if self.is_vnf_embedded_deployment():
217 return VNF_EMBEDDED_SOFT_EVICTION_THRESHOLD
219 return BM_SOFT_EVICTION_THRESHOLD
221 def get_caas_hard_eviction_threshold(self):
222 if self.is_vnf_embedded_deployment():
223 return VNF_EMBEDDED_HARD_EVICTION_THRESHOLD
225 return BM_HARD_EVICTION_THRESHOLD
227 def get_audit_disk_ratio(self):
228 return CAAS_AUDIT_DISK_RATIO
230 def get_audit_disk_limit(self):
231 return AUDIT_DISK_LIMIT