From 189f95f27a92d5b7c71dca026b05f4aa3294f446 Mon Sep 17 00:00:00 2001 From: Michele Perniola Date: Fri, 6 Dec 2024 11:04:32 +0100 Subject: [PATCH] Added deployment status reset functionality (#27) * - Added deployment status reset functionality - Fixed missing check on "input" field in tosca parameters.yml * updated deployments.html --- app/deployments/routes.py | 18 ++++++++++++++++-- app/deployments/templates/deployments.html | 12 +++++++++--- app/lib/orchestrator.py | 13 +++++++++++++ app/lib/tosca_info.py | 11 ++++++----- 4 files changed, 44 insertions(+), 10 deletions(-) diff --git a/app/deployments/routes.py b/app/deployments/routes.py index b3264a29c..a23df7e96 100644 --- a/app/deployments/routes.py +++ b/app/deployments/routes.py @@ -764,6 +764,20 @@ def depdel(depid=None): return redirect(url_for(SHOW_DEPLOYMENTS_ROUTE)) +@deployments_bp.route("//reset") +@auth.authorized_with_valid_token +def depreset(depid=None): + access_token = iam.token["access_token"] + + dep = dbhelpers.get_deployment(depid) + if dep is not None and dep.status == "DELETE_IN_PROGRESS": + try: + app.orchestrator.patch(access_token, depid, "DELETE_FAILED") + except Exception as e: + flash(str(e), "danger") + + return redirect(url_for(SHOW_DEPLOYMENTS_ROUTE)) + @deployments_bp.route("/depupdate/") @auth.authorized_with_valid_token @@ -1009,7 +1023,7 @@ def configure_post(): def prepare_configure_form(selected_tosca, tosca_info, steps): access_token = iam.token["access_token"] if selected_tosca: - template = copy.deepcopy(tosca_info[selected_tosca]) + template = copy.deepcopy(tosca_info[os.path.normpath(selected_tosca)]) # Manage eventual overrides for k, v in list(template["inputs"].items()): if "group_overrides" in v and session["active_usergroup"] in v["group_overrides"]: @@ -1612,7 +1626,7 @@ def createdep(): tosca_info, _, _ = tosca.get() access_token = iam.token["access_token"] # validate input - request_template = request.args.get("template") + request_template = os.path.normpath(request.args.get("template")) if request_template not in tosca_info.keys(): raise ValueError("Template path invalid (not found in current configuration") diff --git a/app/deployments/templates/deployments.html b/app/deployments/templates/deployments.html index 9e3ac2eae..9cff4c777 100644 --- a/app/deployments/templates/deployments.html +++ b/app/deployments/templates/deployments.html @@ -132,9 +132,15 @@ Lock - - Delete - + {% if deployment.status == 'DELETE_IN_PROGRESS' %} + + Reset Status + + {% else %} + + Delete + + {% endif %} {% else %} Unlock diff --git a/app/lib/orchestrator.py b/app/lib/orchestrator.py index a43ac5412..a2f460654 100644 --- a/app/lib/orchestrator.py +++ b/app/lib/orchestrator.py @@ -226,3 +226,16 @@ def delete(self, access_token, deployment_uuid): raise Exception( "Error deleting deployment {}: {}".format(deployment_uuid, response.text) ) + + def patch(self, access_token, deployment_uuid, status): + headers = { + "Content-Type": "application/json", + "Authorization": "bearer %s" % access_token, + } + url = self.orchestrator_url + "/deployments/" + deployment_uuid + payload = {"status": status} + response = requests.patch(url, timeout=self.timeout, json=payload, headers=headers) + if not response.status_code == 204: + raise Exception( + "Error patching deployment {}: {}".format(deployment_uuid, response.text) + ) diff --git a/app/lib/tosca_info.py b/app/lib/tosca_info.py index 4ff8c5cd7..bcaf269c7 100644 --- a/app/lib/tosca_info.py +++ b/app/lib/tosca_info.py @@ -203,11 +203,12 @@ def extracttoscainfo(self, template, tosca): pars_data = yaml.full_load( io.StringIO(tosca_info["parameters_file"]) ) - pars_inputs = pars_data["inputs"] - tosca_info["inputs"] = { - **tosca_inputs, - **pars_inputs, - } + if "inputs" in pars_data: + pars_inputs = pars_data["inputs"] + tosca_info["inputs"] = { + **tosca_inputs, + **pars_inputs, + } if "outputs" in pars_data: pars_outputs = pars_data["outputs"] tosca_info["outputs"] = {