blob: 0bcfc93d9f03f81ce87e3a9a6cc0031890bf9621 [file] [log] [blame]
garciadeblas96b94f52024-07-08 16:18:21 +02001#######################################################################################
2# Licensed under the Apache License, Version 2.0 (the "License");
3# you may not use this file except in compliance with the License.
4# You may obtain a copy of the License at
rshri932105f2024-07-05 15:11:55 +00005#
garciadeblas96b94f52024-07-08 16:18:21 +02006# http://www.apache.org/licenses/LICENSE-2.0
rshri932105f2024-07-05 15:11:55 +00007#
8# Unless required by applicable law or agreed to in writing, software
garciadeblas96b94f52024-07-08 16:18:21 +02009# distributed under the License is distributed on an "AS IS" BASIS,
10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
11# implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14#######################################################################################
rshri932105f2024-07-05 15:11:55 +000015
16
17import logging
18from osm_lcm.lcm_utils import LcmBase
19
garciadeblas98a7a342024-08-22 10:05:47 +020020from n2vc import kubectl
garciadeblas96b94f52024-07-08 16:18:21 +020021
rshri932105f2024-07-05 15:11:55 +000022
23class OduWorkflow(LcmBase):
24 def __init__(self, msg, lcm_tasks, config):
25 """
26 Init, Connect to database, filesystem storage, and messaging
27 :param config: two level dictionary with configuration. Top level should contain 'database', 'storage',
28 :return: None
29 """
30
garciadeblas40539872024-09-11 14:28:38 +020031 self.logger = logging.getLogger("lcm.gitops")
rshri932105f2024-07-05 15:11:55 +000032 self.lcm_tasks = lcm_tasks
33 self.logger.info("Msg: {} lcm_tasks: {} ".format(msg, lcm_tasks))
34
garciadeblas96b94f52024-07-08 16:18:21 +020035 # self._kubeconfig = kubeconfig # TODO: get it from config
garciadeblas3364c472024-09-11 14:30:26 +020036 self.gitops_config = config["gitops"]
37 self.logger.debug(f"Config: {self.gitops_config}")
38 self._kubeconfig = self.gitops_config["mgmtcluster_kubeconfig"]
garciadeblas96b94f52024-07-08 16:18:21 +020039 self._kubectl = kubectl.Kubectl(config_file=self._kubeconfig)
garciadeblas3364c472024-09-11 14:30:26 +020040 self._repo_base_url = self.gitops_config["git_base_url"]
41 self._repo_user = self.gitops_config["user"]
42 self._pubkey = self.gitops_config["pubkey"]
garciadeblas96b94f52024-07-08 16:18:21 +020043 self._workflow_debug = "true"
44 self._workflow_dry_run = "false"
45 self._workflows = {
46 "create_cluster": {
47 "workflow_function": self.create_cluster,
garciadeblas28bff0f2024-09-16 12:53:07 +020048 "clean_function": self.clean_items_cluster_create,
garciadeblas96b94f52024-07-08 16:18:21 +020049 "check_resource_function": self.check_create_cluster,
50 },
51 "update_cluster": {
52 "workflow_function": self.update_cluster,
garciadeblas28bff0f2024-09-16 12:53:07 +020053 "clean_function": self.clean_items_cluster_update,
garciadeblas96b94f52024-07-08 16:18:21 +020054 "check_resource_function": self.check_update_cluster,
55 },
56 "delete_cluster": {
57 "workflow_function": self.delete_cluster,
58 "check_resource_function": self.check_delete_cluster,
59 },
60 "register_cluster": {
61 "workflow_function": self.register_cluster,
garciadeblasdde3a312024-09-17 13:25:06 +020062 "clean_function": self.clean_items_cluster_register,
garciadeblas96b94f52024-07-08 16:18:21 +020063 "check_resource_function": self.check_register_cluster,
64 },
65 "deregister_cluster": {
66 "workflow_function": self.deregister_cluster,
67 "check_resource_function": self.check_deregister_cluster,
68 },
69 "create_profile": {
70 "workflow_function": self.create_profile,
71 "check_resource_function": self.check_create_profile,
72 },
73 "delete_profile": {
74 "workflow_function": self.delete_profile,
75 "check_resource_function": self.check_delete_profile,
76 },
77 "attach_profile_to_cluster": {
78 "workflow_function": self.attach_profile_to_cluster,
79 "check_resource_function": self.check_attach_profile_to_cluster,
80 },
81 "detach_profile_from_cluster": {
82 "workflow_function": self.detach_profile_from_cluster,
83 "check_resource_function": self.check_detach_profile_from_cluster,
84 },
85 "create_oka": {
86 "workflow_function": self.create_oka,
87 "check_resource_function": self.check_create_oka,
88 },
89 "update_oka": {
90 "workflow_function": self.update_oka,
91 "check_resource_function": self.check_update_oka,
92 },
93 "delete_oka": {
94 "workflow_function": self.delete_oka,
95 "check_resource_function": self.check_delete_oka,
96 },
97 "create_ksus": {
98 "workflow_function": self.create_ksus,
garciadeblasd8429852024-10-17 15:30:30 +020099 "clean_function": self.clean_items_ksu_create,
garciadeblas96b94f52024-07-08 16:18:21 +0200100 "check_resource_function": self.check_create_ksus,
101 },
102 "update_ksus": {
103 "workflow_function": self.update_ksus,
garciadeblasd8429852024-10-17 15:30:30 +0200104 "clean_function": self.clean_items_ksu_update,
garciadeblas96b94f52024-07-08 16:18:21 +0200105 "check_resource_function": self.check_update_ksus,
106 },
107 "delete_ksus": {
108 "workflow_function": self.delete_ksus,
109 "check_resource_function": self.check_delete_ksus,
110 },
111 "clone_ksu": {
112 "workflow_function": self.clone_ksu,
113 "check_resource_function": self.check_clone_ksu,
114 },
115 "move_ksu": {
116 "workflow_function": self.move_ksu,
117 "check_resource_function": self.check_move_ksu,
118 },
119 "create_cloud_credentials": {
120 "workflow_function": self.create_cloud_credentials,
garciadeblas28bff0f2024-09-16 12:53:07 +0200121 "clean_function": self.clean_items_cloud_credentials_create,
garciadeblas96b94f52024-07-08 16:18:21 +0200122 "check_resource_function": self.check_create_cloud_credentials,
123 },
124 "update_cloud_credentials": {
125 "workflow_function": self.update_cloud_credentials,
garciadeblas28bff0f2024-09-16 12:53:07 +0200126 "clean_function": self.clean_items_cloud_credentials_update,
garciadeblas96b94f52024-07-08 16:18:21 +0200127 "check_resource_function": self.check_update_cloud_credentials,
128 },
129 "delete_cloud_credentials": {
130 "workflow_function": self.delete_cloud_credentials,
131 "check_resource_function": self.check_delete_cloud_credentials,
132 },
133 "dummy_operation": {
134 "workflow_function": self.dummy_operation,
135 "check_resource_function": self.check_dummy_operation,
136 },
137 }
138
rshri932105f2024-07-05 15:11:55 +0000139 super().__init__(msg, self.logger)
140
garciadeblas96b94f52024-07-08 16:18:21 +0200141 @property
142 def kubeconfig(self):
143 return self._kubeconfig
144
145 # Imported methods
146 from osm_lcm.odu_libs.vim_mgmt import (
147 create_cloud_credentials,
148 update_cloud_credentials,
149 delete_cloud_credentials,
garciadeblas28bff0f2024-09-16 12:53:07 +0200150 clean_items_cloud_credentials_create,
151 clean_items_cloud_credentials_update,
garciadeblas96b94f52024-07-08 16:18:21 +0200152 check_create_cloud_credentials,
153 check_update_cloud_credentials,
154 check_delete_cloud_credentials,
155 )
156 from osm_lcm.odu_libs.cluster_mgmt import (
157 create_cluster,
158 update_cluster,
159 delete_cluster,
160 register_cluster,
161 deregister_cluster,
garciadeblas28bff0f2024-09-16 12:53:07 +0200162 clean_items_cluster_create,
163 clean_items_cluster_update,
garciadeblasdde3a312024-09-17 13:25:06 +0200164 clean_items_cluster_register,
garciadeblas96b94f52024-07-08 16:18:21 +0200165 check_create_cluster,
166 check_update_cluster,
167 check_delete_cluster,
168 check_register_cluster,
169 check_deregister_cluster,
170 get_cluster_credentials,
171 )
172 from osm_lcm.odu_libs.ksu import (
173 create_ksus,
174 update_ksus,
175 delete_ksus,
176 clone_ksu,
177 move_ksu,
garciadeblasd8429852024-10-17 15:30:30 +0200178 clean_items_ksu_create,
179 clean_items_ksu_update,
garciadeblas96b94f52024-07-08 16:18:21 +0200180 check_create_ksus,
181 check_update_ksus,
182 check_delete_ksus,
183 check_clone_ksu,
184 check_move_ksu,
185 )
186 from osm_lcm.odu_libs.oka import (
187 create_oka,
188 update_oka,
189 delete_oka,
190 check_create_oka,
191 check_update_oka,
192 check_delete_oka,
193 )
194 from osm_lcm.odu_libs.profiles import (
195 create_profile,
196 delete_profile,
197 attach_profile_to_cluster,
198 detach_profile_from_cluster,
199 check_create_profile,
200 check_delete_profile,
201 check_attach_profile_to_cluster,
202 check_detach_profile_from_cluster,
203 )
204 from osm_lcm.odu_libs.workflows import (
205 check_workflow_status,
garciadeblas40811852024-10-22 11:35:17 +0200206 readiness_loop,
garciadeblas96b94f52024-07-08 16:18:21 +0200207 )
208 from osm_lcm.odu_libs.render import (
209 render_jinja_template,
210 render_yaml_template,
211 )
garciadeblas28bff0f2024-09-16 12:53:07 +0200212 from osm_lcm.odu_libs.common import (
213 create_secret,
214 delete_secret,
215 )
garciadeblas96b94f52024-07-08 16:18:21 +0200216
217 async def launch_workflow(self, key, op_id, op_params, content):
rshri932105f2024-07-05 15:11:55 +0000218 self.logger.info(
garciadeblas96b94f52024-07-08 16:18:21 +0200219 f"Workflow is getting into launch. Key: {key}. Operation: {op_id}. Params: {op_params}. Content: {content}"
rshri932105f2024-07-05 15:11:55 +0000220 )
garciadeblas96b94f52024-07-08 16:18:21 +0200221 workflow_function = self._workflows[key]["workflow_function"]
222 self.logger.info("workflow function : {}".format(workflow_function))
223 return await workflow_function(op_id, op_params, content)
rshri932105f2024-07-05 15:11:55 +0000224
garciadeblas28bff0f2024-09-16 12:53:07 +0200225 async def clean_items_workflow(self, key, op_id, op_params, content):
226 self.logger.info(
227 f"Cleaning items created during workflow launch. Key: {key}. Operation: {op_id}. Params: {op_params}. Content: {content}"
228 )
229 clean_items_function = self._workflows[key]["clean_function"]
230 self.logger.info("clean items function : {}".format(clean_items_function))
231 return await clean_items_function(op_id, op_params, content)
232
garciadeblas96b94f52024-07-08 16:18:21 +0200233 async def dummy_operation(self, op_id, op_params, content):
234 self.logger.info("Empty operation status Enter")
235 self.logger.info(f"Operation {op_id}. Params: {op_params}. Content: {content}")
236 return content["workflow_name"]
rshri932105f2024-07-05 15:11:55 +0000237
garciadeblas96b94f52024-07-08 16:18:21 +0200238 async def check_resource_status(self, key, op_id, op_params, content):
239 self.logger.info(
240 f"Check resource status. Key: {key}. Operation: {op_id}. Params: {op_params}. Content: {content}"
241 )
242 check_resource_function = self._workflows[key]["check_resource_function"]
243 self.logger.info("check_resource function : {}".format(check_resource_function))
244 return await check_resource_function(op_id, op_params, content)
245
246 async def check_dummy_operation(self, op_id, op_params, content):
247 self.logger.info(f"Operation {op_id}. Params: {op_params}. Content: {content}")
rshri932105f2024-07-05 15:11:55 +0000248 return True, "OK"
garciadeblas28bff0f2024-09-16 12:53:07 +0200249
250 async def clean_items(self, items):
251 # Delete secrets
252 for secret in items.get("secrets", []):
253 name = secret["name"]
254 namespace = secret["namespace"]
255 self.logger.info(f"Deleting secret {name} in namespace {namespace}")
256 self.delete_secret(name, namespace)
257 # Delete pvcs
258 for pvc in items.get("pvcs", []):
259 name = pvc["name"]
260 namespace = pvc["namespace"]
261 self.logger.info(f"Deleting pvc {name} in namespace {namespace}")
262 await self._kubectl.delete_pvc(name, namespace)