From 50508644bed6ddd93f8786465529f755e475b370 Mon Sep 17 00:00:00 2001 From: Prathamesh Musale Date: Thu, 6 Feb 2025 16:12:11 +0530 Subject: [PATCH] Delete deployment and DNS names for removed domains --- .../deploy/webapp/deploy_webapp.py | 24 +++++++++-- .../webapp/deploy_webapp_from_registry.py | 43 +++++++++++-------- stack_orchestrator/deploy/webapp/util.py | 2 +- 3 files changed, 47 insertions(+), 22 deletions(-) diff --git a/stack_orchestrator/deploy/webapp/deploy_webapp.py b/stack_orchestrator/deploy/webapp/deploy_webapp.py index 092bf028..fd51f055 100644 --- a/stack_orchestrator/deploy/webapp/deploy_webapp.py +++ b/stack_orchestrator/deploy/webapp/deploy_webapp.py @@ -13,6 +13,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import shutil import click import os import yaml @@ -20,13 +21,14 @@ from pathlib import Path from urllib.parse import urlparse from tempfile import NamedTemporaryFile +from stack_orchestrator import constants from stack_orchestrator.util import error_exit, global_options2 from stack_orchestrator.deploy.deployment_create import init_operation, create_operation from stack_orchestrator.deploy.deploy import create_deploy_context from stack_orchestrator.deploy.deploy_types import DeployCommandContext -def fixup_container_tag(deployment_dir: str, image: str): +def _fixup_container_tag(deployment_dir: str, image: str): deployment_dir_path = Path(deployment_dir) compose_file = deployment_dir_path.joinpath("compose", "docker-compose-webapp-template.yml") # replace "cerc/webapp-container:local" in the file with our image tag @@ -37,7 +39,7 @@ def fixup_container_tag(deployment_dir: str, image: str): wfile.write(contents) -def fixup_url_spec(spec_file_name: str, urls: list[str]): +def _fixup_url_spec(spec_file_name: str, urls: list[str]): spec_file_path = Path(spec_file_name) # Load existing spec @@ -100,7 +102,7 @@ def create_deployment(ctx, deployment_dir, image, urls, kube_config, image_regis None ) # Add the TLS and DNS spec - fixup_url_spec(spec_file_name, urls) + _fixup_url_spec(spec_file_name, urls) create_operation( deploy_command_context, spec_file_name, @@ -109,10 +111,24 @@ def create_deployment(ctx, deployment_dir, image, urls, kube_config, image_regis None ) # Fix up the container tag inside the deployment compose file - fixup_container_tag(deployment_dir, image) + _fixup_container_tag(deployment_dir, image) os.remove(spec_file_name) +def update_deployment(deployment_dir, image, urls, env_file): + # Update config if required + if env_file: + deployment_config_file = os.path.join(deployment_dir, "config.env") + shutil.copyfile(env_file, deployment_config_file) + + # Update existing deployment spec with new urls + _fixup_url_spec(os.path.join(deployment_dir, constants.spec_file_name), urls) + + # Update the image name if required + if image: + _fixup_container_tag(deployment_dir, image) + + @click.group() @click.pass_context def command(ctx): diff --git a/stack_orchestrator/deploy/webapp/deploy_webapp_from_registry.py b/stack_orchestrator/deploy/webapp/deploy_webapp_from_registry.py index c9c990a4..95b82383 100644 --- a/stack_orchestrator/deploy/webapp/deploy_webapp_from_registry.py +++ b/stack_orchestrator/deploy/webapp/deploy_webapp_from_registry.py @@ -170,7 +170,9 @@ def process_app_deployment_request( # Existing deployment record: take the first lrn that resolves deployment_record = None + fqdns_to_release = [] existing_deployment_dir = deployment_dir # Default to target dir in case the app had been undeployed + for app_deployment_lrn in app_deployment_lrns: deployment_record = laconic.get_record(app_deployment_lrn) if deployment_record: @@ -183,6 +185,10 @@ def process_app_deployment_request( % (app_deployment_lrn, existing_deployment_dir) ) + previous_app_deployment_lrns: list[str] = deployment_record.names + previous_fqdns = [lrn.removeprefix(f"{deployment_record_namespace}/") for lrn in previous_app_deployment_lrns] + fqdns_to_release = list(set(previous_fqdns) - set(fqdns)) + break # Use the last fqdn for unique deployment container tag @@ -209,18 +215,14 @@ def process_app_deployment_request( # Rename deployment dir according to new request (last fqdn from given dns) os.rename(existing_deployment_dir, deployment_dir) - # Update config if required - if env_filename: - deployment_config_file = os.path.join(deployment_dir, "config.env") - shutil.copyfile(env_filename, deployment_config_file) - - # Update existing deployment spec with new urls - deploy_webapp.fixup_url_spec(os.path.join(deployment_dir, constants.spec_file_name)) - # Update the image name deployment_container_tag # Skip for redeployment as deployment_container_tag won't get built + updated_image = None if deployment_record.attributes.application != app.id: - deploy_webapp.fixup_container_tag(deployment_dir, deployment_container_tag) + updated_image = deployment_container_tag + + # Update the existing deployment + deploy_webapp.update_deployment(deployment_dir, updated_image, [f"https://{fqdn}" for fqdn in fqdns], env_filename) needs_k8s_deploy = False if force_rebuild: @@ -270,19 +272,15 @@ def process_app_deployment_request( else: logger.log("Requested app is already deployed, skipping build and image push") - # 7. update config (if needed) - # TODO: Also check if domains set has changed + # 7. restart deployment on config or url spec change if ( not deployment_record - or file_hash(deployment_config_file) != deployment_record.attributes.meta.config + or file_hash(os.path.join(deployment_dir, "config.env")) != deployment_record.attributes.meta.config + or len(fqdns_to_release) != 0 ): needs_k8s_deploy = True - # TODO: 8. delete unused names - # if deployment_record: - # ... - - # 9. update k8s deployment + # 8. update k8s deployment if needs_k8s_deploy: deploy_to_k8s(deployment_record, deployment_dir, recreate_on_deploy, logger) @@ -302,6 +300,17 @@ def process_app_deployment_request( logger, ) logger.log("Publication complete.") + + # 9. delete unused names from previous deployment (app and dns) + for fqdn in fqdns_to_release: + # Delete app deployment name and DNS name + deployment_name = "{deployment_record_namespace}/{fqdn}" + dns_name = "{deployment_record_namespace}/{fqdn}" + + logger.log(f"Removing names {deployment_name} and {dns_name}") + laconic.delete_name(deployment_name) + laconic.delete_name(dns_name) + logger.log("END - process_app_deployment_request") diff --git a/stack_orchestrator/deploy/webapp/util.py b/stack_orchestrator/deploy/webapp/util.py index 0c8e6f2f..6c2bab05 100644 --- a/stack_orchestrator/deploy/webapp/util.py +++ b/stack_orchestrator/deploy/webapp/util.py @@ -711,7 +711,7 @@ def publish_deployment( else: dns_ver = "0.0.%d" % (int(dns_record.attributes.version.split(".")[-1]) + 1) - fqdn = dns_lrn.removeprefix(f"${dns_record_namespace}/") + fqdn = dns_lrn.removeprefix(f"{dns_record_namespace}/") uniq = uuid.uuid4() new_dns_record = {