blob: 767e30b20fe3191082a3af8ec66e7f3718216630 [file] [log] [blame]
garciadeblas96b94f52024-07-08 16:18:21 +02001#######################################################################################
2# Copyright ETSI Contributors and Others.
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
13# implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16#######################################################################################
17
18
19import yaml
20
21
garciadeblasf7dfdb72024-09-25 12:15:40 +020022MAP_PROFILE = {
23 "infra_controller_profiles": "infra-controllers",
garciadeblasa897d122024-12-09 13:31:06 +010024 "infra_config_profiles": "infra-configs",
garciadeblasf7dfdb72024-09-25 12:15:40 +020025 "resource_profiles": "managed_resources",
26 "app_profiles": "apps",
27}
28
29
garciadeblas96b94f52024-07-08 16:18:21 +020030async def create_ksus(self, op_id, op_params_list, content_list):
garciadeblas9e532812024-10-22 14:04:36 +020031 self.logger.info(f"create_ksus Enter. Operation {op_id}. Params: {op_params_list}")
32 # self.logger.debug(f"Content: {content_list}")
garciadeblas96b94f52024-07-08 16:18:21 +020033
34 if len(content_list) > 1:
35 raise Exception("There is no ODU workflow yet able to manage multiple KSUs")
36 db_ksu = content_list[0]
37 ksu_params = op_params_list[0]
38 oka_list = ksu_params["oka"]
39 if len(oka_list) > 1:
40 raise Exception(
41 "There is no ODU workflow yet able to manage multiple OKAs for a KSU"
42 )
garciadeblasf7dfdb72024-09-25 12:15:40 +020043 oka_item = oka_list[0]
garciadeblas1b2933c2024-10-16 11:43:36 +020044 oka_params = oka_item.get("transformation", {})
garciadeblasf7dfdb72024-09-25 12:15:40 +020045 if "sw_catalog_path" in oka_item:
46 oka_path = oka_item["sw_catalog_path"]
47 else:
garciadeblasa897d122024-12-09 13:31:06 +010048 oka_type = MAP_PROFILE[
49 oka_item.get("profile_type", "infra_controller_profiles")
50 ]
garciadeblasf7dfdb72024-09-25 12:15:40 +020051 oka_name = oka_item["git_name"]
52 oka_path = f"{oka_type}/{oka_name}/templates"
garciadeblas96b94f52024-07-08 16:18:21 +020053
54 workflow_template = "launcher-create-ksu-hr.j2"
55 workflow_name = f"create-ksus-{op_id}"
56 ksu_name = db_ksu["git_name"].lower()
57
58 # Additional params for the workflow
59 osm_project_name = "osm_admin" # TODO: get project name from db_ksu
60 kustomization_name = ksu_name
61 helmrelease_name = ksu_name
garciadeblas96b94f52024-07-08 16:18:21 +020062 profile_type = ksu_params.get("profile", {}).get("profile_type")
garciadeblasf7dfdb72024-09-25 12:15:40 +020063 profile_type = MAP_PROFILE[profile_type]
garciadeblas96b94f52024-07-08 16:18:21 +020064 profile_name = ksu_params.get("profile", {}).get("name")
65 age_public_key = ksu_params.get("profile", {}).get("age_pubkey")
garciadeblas1b2933c2024-10-16 11:43:36 +020066 target_ns = oka_params.get("namespace", "default")
67 substitute_environment = oka_params.get("substitute_environment", "false")
68 substitution_filter = oka_params.get("substitution_filter", "")
69 custom_env_vars = oka_params.get("custom_env_vars", "")
garciadeblas96b94f52024-07-08 16:18:21 +020070 if custom_env_vars:
71 custom_env_vars = "|\n" + "\n".join(
garciadeblasf7dfdb72024-09-25 12:15:40 +020072 [" " * 10 + f"{k}={v}" for k, v in custom_env_vars.items()]
garciadeblas96b94f52024-07-08 16:18:21 +020073 )
garciadeblasf7dfdb72024-09-25 12:15:40 +020074 else:
75 custom_env_vars = '""'
garciadeblas1b2933c2024-10-16 11:43:36 +020076 inline_values = oka_params.get("inline_values", "")
garciadeblas96b94f52024-07-08 16:18:21 +020077 if inline_values:
78 yaml_string = yaml.safe_dump(
79 inline_values, sort_keys=False, default_flow_style=False
80 )
81 inline_values = "|\n" + "\n".join(
82 [" " * 8 + line for line in yaml_string.splitlines()]
83 )
garciadeblasf7dfdb72024-09-25 12:15:40 +020084 else:
85 inline_values = '""'
garciadeblas96b94f52024-07-08 16:18:21 +020086 is_preexisting_cm = "false"
garciadeblas1b2933c2024-10-16 11:43:36 +020087 cm_values = oka_params.get("configmap_values", "")
garciadeblas96b94f52024-07-08 16:18:21 +020088 if cm_values:
89 yaml_string = yaml.safe_dump(
90 cm_values, sort_keys=False, default_flow_style=False
91 )
garciadeblasf7dfdb72024-09-25 12:15:40 +020092 cm_values = "|\n" + "\n".join(
garciadeblas96b94f52024-07-08 16:18:21 +020093 [" " * 8 + line for line in yaml_string.splitlines()]
94 )
garciadeblasf7dfdb72024-09-25 12:15:40 +020095 values_configmap_name = f"cm-{ksu_name}"
96 cm_key = "values.yaml"
97 else:
98 values_configmap_name = ""
99 cm_key = ""
100 cm_values = '""'
garciadeblas96b94f52024-07-08 16:18:21 +0200101 is_preexisting_secret = "false"
garciadeblas1b2933c2024-10-16 11:43:36 +0200102 secret_values = oka_params.get("secret_values", "")
garciadeblas96b94f52024-07-08 16:18:21 +0200103 if secret_values:
104 values_secret_name = f"secret-{ksu_name}"
105 reference_secret_for_values = f"ref-secret-{ksu_name}"
106 reference_key_for_values = f"ref-key-{ksu_name}"
107 secret_values = yaml.safe_dump(
108 secret_values, sort_keys=False, default_flow_style=False
109 )
110 else:
111 values_secret_name = ""
garciadeblasf7dfdb72024-09-25 12:15:40 +0200112 reference_secret_for_values = "this-secret-does-not-exist"
113 reference_key_for_values = "this-key-does-not-exist"
garciadeblas96b94f52024-07-08 16:18:21 +0200114 sync = "true"
115
116 if secret_values:
117 secret_namespace = "osm-workflows"
118 # Create secret
119 await self.create_secret(
120 reference_secret_for_values,
121 secret_namespace,
122 reference_key_for_values,
123 secret_values,
124 )
125
126 # Render workflow
127 manifest = self.render_jinja_template(
128 workflow_template,
129 output_file=None,
130 workflow_name=workflow_name,
131 git_fleet_url=f"{self._repo_base_url}/{self._repo_user}/fleet-osm.git",
132 git_sw_catalogs_url=f"{self._repo_base_url}/{self._repo_user}/sw-catalogs-osm.git",
133 templates_path=oka_path,
134 substitute_environment=substitute_environment,
135 substitution_filter=substitution_filter,
136 custom_env_vars=custom_env_vars,
137 kustomization_name=kustomization_name,
138 helmrelease_name=helmrelease_name,
139 inline_values=inline_values,
140 is_preexisting_secret=is_preexisting_secret,
141 target_ns=target_ns,
142 age_public_key=age_public_key,
143 values_secret_name=values_secret_name,
144 reference_secret_for_values=reference_secret_for_values,
145 reference_key_for_values=reference_key_for_values,
146 is_preexisting_cm=is_preexisting_cm,
147 values_configmap_name=values_configmap_name,
garciadeblasf7dfdb72024-09-25 12:15:40 +0200148 cm_key=cm_key,
garciadeblas96b94f52024-07-08 16:18:21 +0200149 cm_values=cm_values,
150 ksu_name=ksu_name,
151 profile_name=profile_name,
152 profile_type=profile_type,
153 osm_project_name=osm_project_name,
154 sync=sync,
155 workflow_debug=self._workflow_debug,
156 workflow_dry_run=self._workflow_dry_run,
157 )
158 self.logger.debug(f"Workflow manifest: {manifest}")
159
160 # Submit workflow
161 self._kubectl.create_generic_object(
162 namespace="osm-workflows",
163 manifest_dict=yaml.safe_load(manifest),
164 api_group="argoproj.io",
165 api_plural="workflows",
166 api_version="v1alpha1",
167 )
garciadeblasadb81e82024-11-08 01:11:46 +0100168 return True, workflow_name
garciadeblas96b94f52024-07-08 16:18:21 +0200169
170
171async def update_ksus(self, op_id, op_params_list, content_list):
garciadeblas9e532812024-10-22 14:04:36 +0200172 self.logger.info(f"update_ksus Enter. Operation {op_id}. Params: {op_params_list}")
173 # self.logger.debug(f"Content: {content_list}")
garciadeblas96b94f52024-07-08 16:18:21 +0200174
175 if len(content_list) > 1:
176 raise Exception("There is no ODU workflow yet able to manage multiple KSUs")
177 db_ksu = content_list[0]
178 ksu_params = op_params_list[0]
179 oka_list = ksu_params["oka"]
180 if len(oka_list) > 1:
181 raise Exception(
182 "There is no ODU workflow yet able to manage multiple OKAs for a KSU"
183 )
garciadeblas1b2933c2024-10-16 11:43:36 +0200184 oka_item = oka_list[0]
185 oka_params = oka_item.get("transformation", {})
186 if "sw_catalog_path" in oka_item:
187 oka_path = oka_item["sw_catalog_path"]
188 else:
garciadeblasa897d122024-12-09 13:31:06 +0100189 oka_type = MAP_PROFILE[
190 oka_item.get("profile_type", "infra_controller_profiles")
191 ]
garciadeblas1b2933c2024-10-16 11:43:36 +0200192 oka_name = oka_item["git_name"]
193 oka_path = f"{oka_type}/{oka_name}/templates"
garciadeblas96b94f52024-07-08 16:18:21 +0200194
195 workflow_template = "launcher-update-ksu-hr.j2"
196 workflow_name = f"update-ksus-{op_id}"
197 ksu_name = db_ksu["git_name"].lower()
198
199 # Additional params for the workflow
200 osm_project_name = "osm_admin" # TODO: get project name from db_ksu
201 kustomization_name = ksu_name
202 helmrelease_name = ksu_name
garciadeblas96b94f52024-07-08 16:18:21 +0200203 profile_type = ksu_params.get("profile", {}).get("profile_type")
garciadeblasf7dfdb72024-09-25 12:15:40 +0200204 profile_type = MAP_PROFILE[profile_type]
garciadeblas96b94f52024-07-08 16:18:21 +0200205 profile_name = ksu_params.get("profile", {}).get("name")
206 age_public_key = ksu_params.get("profile", {}).get("age_pubkey")
garciadeblas1b2933c2024-10-16 11:43:36 +0200207 target_ns = oka_params.get("namespace", "default")
208 substitute_environment = oka_params.get("substitute_environment", "false")
209 substitution_filter = oka_params.get("substitution_filter", "")
210 custom_env_vars = oka_params.get("custom_env_vars", "")
garciadeblas96b94f52024-07-08 16:18:21 +0200211 if custom_env_vars:
212 custom_env_vars = "|\n" + "\n".join(
garciadeblasf7dfdb72024-09-25 12:15:40 +0200213 [" " * 10 + f"{k}={v}" for k, v in custom_env_vars.items()]
garciadeblas96b94f52024-07-08 16:18:21 +0200214 )
garciadeblasf7dfdb72024-09-25 12:15:40 +0200215 else:
216 custom_env_vars = '""'
garciadeblas1b2933c2024-10-16 11:43:36 +0200217 inline_values = oka_params.get("inline_values", "")
garciadeblas96b94f52024-07-08 16:18:21 +0200218 if inline_values:
219 yaml_string = yaml.safe_dump(
220 inline_values, sort_keys=False, default_flow_style=False
221 )
222 inline_values = "|\n" + "\n".join(
223 [" " * 8 + line for line in yaml_string.splitlines()]
224 )
garciadeblasf7dfdb72024-09-25 12:15:40 +0200225 else:
226 inline_values = '""'
garciadeblas96b94f52024-07-08 16:18:21 +0200227 is_preexisting_cm = "false"
garciadeblas1b2933c2024-10-16 11:43:36 +0200228 cm_values = oka_params.get("configmap_values", "")
garciadeblas96b94f52024-07-08 16:18:21 +0200229 if cm_values:
230 yaml_string = yaml.safe_dump(
231 cm_values, sort_keys=False, default_flow_style=False
232 )
garciadeblasf7dfdb72024-09-25 12:15:40 +0200233 cm_values = "|\n" + "\n".join(
garciadeblas96b94f52024-07-08 16:18:21 +0200234 [" " * 8 + line for line in yaml_string.splitlines()]
235 )
garciadeblasf7dfdb72024-09-25 12:15:40 +0200236 values_configmap_name = f"cm-{ksu_name}"
237 cm_key = "values.yaml"
238 else:
239 values_configmap_name = ""
240 cm_key = ""
241 cm_values = '""'
garciadeblas96b94f52024-07-08 16:18:21 +0200242 is_preexisting_secret = "false"
garciadeblas1b2933c2024-10-16 11:43:36 +0200243 secret_values = oka_params.get("secret_values", "")
garciadeblas96b94f52024-07-08 16:18:21 +0200244 if secret_values:
245 values_secret_name = f"secret-{ksu_name}"
246 reference_secret_for_values = f"ref-secret-{ksu_name}"
247 reference_key_for_values = f"ref-key-{ksu_name}"
248 secret_values = yaml.safe_dump(
249 secret_values, sort_keys=False, default_flow_style=False
250 )
251 else:
252 values_secret_name = ""
garciadeblasf7dfdb72024-09-25 12:15:40 +0200253 reference_secret_for_values = "this-secret-does-not-exist"
254 reference_key_for_values = "this-key-does-not-exist"
garciadeblas96b94f52024-07-08 16:18:21 +0200255
256 if secret_values:
257 secret_namespace = "osm-workflows"
258 # Create secret
259 await self.create_secret(
260 reference_secret_for_values,
261 secret_namespace,
262 reference_key_for_values,
263 secret_values,
264 )
265
266 # Render workflow
267 manifest = self.render_jinja_template(
268 workflow_template,
269 output_file=None,
270 workflow_name=workflow_name,
271 git_fleet_url=f"{self._repo_base_url}/{self._repo_user}/fleet-osm.git",
272 git_sw_catalogs_url=f"{self._repo_base_url}/{self._repo_user}/sw-catalogs-osm.git",
273 templates_path=oka_path,
274 substitute_environment=substitute_environment,
275 substitution_filter=substitution_filter,
276 custom_env_vars=custom_env_vars,
277 kustomization_name=kustomization_name,
278 helmrelease_name=helmrelease_name,
279 inline_values=inline_values,
280 is_preexisting_secret=is_preexisting_secret,
281 target_ns=target_ns,
282 age_public_key=age_public_key,
283 values_secret_name=values_secret_name,
284 reference_secret_for_values=reference_secret_for_values,
285 reference_key_for_values=reference_key_for_values,
286 is_preexisting_cm=is_preexisting_cm,
287 values_configmap_name=values_configmap_name,
garciadeblasf7dfdb72024-09-25 12:15:40 +0200288 cm_key=cm_key,
garciadeblas96b94f52024-07-08 16:18:21 +0200289 cm_values=cm_values,
290 ksu_name=ksu_name,
291 profile_name=profile_name,
292 profile_type=profile_type,
293 osm_project_name=osm_project_name,
294 workflow_debug=self._workflow_debug,
295 workflow_dry_run=self._workflow_dry_run,
296 )
297 self.logger.debug(f"Workflow manifest: {manifest}")
298
299 # Submit workflow
300 self._kubectl.create_generic_object(
301 namespace="osm-workflows",
302 manifest_dict=yaml.safe_load(manifest),
303 api_group="argoproj.io",
304 api_plural="workflows",
305 api_version="v1alpha1",
306 )
garciadeblasadb81e82024-11-08 01:11:46 +0100307 return True, workflow_name
garciadeblas96b94f52024-07-08 16:18:21 +0200308
309
310async def delete_ksus(self, op_id, op_params_list, content_list):
garciadeblas9e532812024-10-22 14:04:36 +0200311 self.logger.info(f"delete_ksus Enter. Operation {op_id}. Params: {op_params_list}")
312 # self.logger.debug(f"Content: {content_list}")
garciadeblas96b94f52024-07-08 16:18:21 +0200313
314 if len(content_list) > 1:
315 raise Exception("There is no ODU workflow yet able to manage multiple KSUs")
316 db_ksu = content_list[0]
317 ksu_params = op_params_list[0]
318
319 workflow_template = "launcher-delete-ksu.j2"
320 workflow_name = f"delete-ksus-{op_id}"
321 ksu_name = db_ksu["git_name"].lower()
322
323 # Additional params for the workflow
324 osm_project_name = "osm_admin" # TODO: get project name from db_ksu
325 profile_name = ksu_params.get("profile", {}).get("name")
326 profile_type = ksu_params.get("profile", {}).get("profile_type")
garciadeblasf7dfdb72024-09-25 12:15:40 +0200327 profile_type = MAP_PROFILE[profile_type]
garciadeblas96b94f52024-07-08 16:18:21 +0200328
329 # Render workflow
330 manifest = self.render_jinja_template(
331 workflow_template,
332 output_file=None,
333 workflow_name=workflow_name,
334 git_fleet_url=f"{self._repo_base_url}/{self._repo_user}/fleet-osm.git",
335 git_sw_catalogs_url=f"{self._repo_base_url}/{self._repo_user}/sw-catalogs-osm.git",
336 ksu_name=ksu_name,
337 profile_name=profile_name,
338 profile_type=profile_type,
339 osm_project_name=osm_project_name,
340 workflow_debug=self._workflow_debug,
341 workflow_dry_run=self._workflow_dry_run,
342 )
343 self.logger.debug(f"Workflow manifest: {manifest}")
344
345 # Submit workflow
346 self._kubectl.create_generic_object(
347 namespace="osm-workflows",
348 manifest_dict=yaml.safe_load(manifest),
349 api_group="argoproj.io",
350 api_plural="workflows",
351 api_version="v1alpha1",
352 )
garciadeblasadb81e82024-11-08 01:11:46 +0100353 return True, workflow_name
garciadeblas96b94f52024-07-08 16:18:21 +0200354
355
356async def clone_ksu(self, op_id, op_params, content):
garciadeblas9e532812024-10-22 14:04:36 +0200357 self.logger.info(f"clone_ksu Enter. Operation {op_id}. Params: {op_params}")
358 # self.logger.debug(f"Content: {content}")
garciadeblas96b94f52024-07-08 16:18:21 +0200359 workflow_name = f"clone-ksu-{content['_id']}"
garciadeblasadb81e82024-11-08 01:11:46 +0100360 return True, workflow_name
garciadeblas96b94f52024-07-08 16:18:21 +0200361
362
363async def move_ksu(self, op_id, op_params, content):
garciadeblas9e532812024-10-22 14:04:36 +0200364 self.logger.info(f"move_ksu Enter. Operation {op_id}. Params: {op_params}")
365 # self.logger.debug(f"Content: {content}")
garciadeblas96b94f52024-07-08 16:18:21 +0200366 workflow_name = f"move-ksu-{content['_id']}"
garciadeblasadb81e82024-11-08 01:11:46 +0100367 return True, workflow_name
garciadeblas96b94f52024-07-08 16:18:21 +0200368
369
garciadeblasd8429852024-10-17 15:30:30 +0200370async def clean_items_ksu_create(self, op_id, op_params_list, content_list):
garciadeblasd8429852024-10-17 15:30:30 +0200371 self.logger.info(
garciadeblas9e532812024-10-22 14:04:36 +0200372 f"clean_items_ksu_create Enter. Operation {op_id}. Params: {op_params_list}"
garciadeblasd8429852024-10-17 15:30:30 +0200373 )
garciadeblas9e532812024-10-22 14:04:36 +0200374 # self.logger.debug(f"Content: {content_list}")
garciadeblasd8429852024-10-17 15:30:30 +0200375 try:
376 if len(content_list) > 1:
377 raise Exception("There is no ODU workflow yet able to manage multiple KSUs")
378 db_ksu = content_list[0]
379 ksu_name = db_ksu["git_name"].lower()
380 ksu_params = op_params_list[0]
381 oka_list = ksu_params["oka"]
382 if len(oka_list) > 1:
383 raise Exception(
384 "There is no ODU workflow yet able to manage multiple OKAs for a KSU"
385 )
386 oka_item = oka_list[0]
387 oka_params = oka_item.get("transformation", {})
388 secret_values = oka_params.get("secret_values", "")
389 if secret_values:
390 items = {
391 "secrets": [
392 {
393 "name": f"ref-secret-{ksu_name}",
394 "namespace": "osm-workflows",
395 }
396 ]
397 }
398 await self.clean_items(items)
399 return True, "OK"
400 except Exception as e:
401 return False, f"Error while cleaning items: {e}"
402
403
404async def clean_items_ksu_update(self, op_id, op_params_list, content_list):
garciadeblasd8429852024-10-17 15:30:30 +0200405 self.logger.info(
garciadeblas9e532812024-10-22 14:04:36 +0200406 f"clean_items_ksu_update Enter. Operation {op_id}. Params: {op_params_list}"
garciadeblasd8429852024-10-17 15:30:30 +0200407 )
garciadeblas9e532812024-10-22 14:04:36 +0200408 # self.logger.debug(f"Content: {content_list}")
garciadeblasd8429852024-10-17 15:30:30 +0200409 return await self.clean_items_ksu_create(op_id, op_params_list, content_list)