From 42103ef55181d0cd34ff95703201a25acce55cf3 Mon Sep 17 00:00:00 2001 From: Prathamesh Musale Date: Thu, 6 Feb 2025 15:14:12 +0530 Subject: [PATCH] Publish multiple DNS records and set all deployment names --- .../webapp/deploy_webapp_from_registry.py | 15 ++-- stack_orchestrator/deploy/webapp/util.py | 72 ++++++++++--------- 2 files changed, 50 insertions(+), 37 deletions(-) diff --git a/stack_orchestrator/deploy/webapp/deploy_webapp_from_registry.py b/stack_orchestrator/deploy/webapp/deploy_webapp_from_registry.py index a62f24f7..c9c990a4 100644 --- a/stack_orchestrator/deploy/webapp/deploy_webapp_from_registry.py +++ b/stack_orchestrator/deploy/webapp/deploy_webapp_from_registry.py @@ -97,9 +97,15 @@ def process_app_deployment_request( fqdns = [fqdn.lower() for fqdn in fqdns] # 3. check ownership of existing dnsrecord(s) vs this request + dns_lrns = [] + existing_dns_records_by_lrns = {} for fqdn in fqdns: dns_lrn = f"{dns_record_namespace}/{fqdn}" + dns_lrns.append(dns_lrn) + dns_record = laconic.get_record(dns_lrn) + existing_dns_records_by_lrns[dns_lrn] = dns_record + if dns_record: matched_owner = match_owner(app_deployment_request, dns_record) if not matched_owner and dns_record.attributes.request: @@ -281,15 +287,14 @@ def process_app_deployment_request( deploy_to_k8s(deployment_record, deployment_dir, recreate_on_deploy, logger) logger.log("Publishing deployment to registry.") - # TODO: Publish multiple DNS records - # TODO: Point all app_deployment_lrns publish_deployment( laconic, app, deployment_record, - app_deployment_lrn, - dns_record, - dns_lrn, + app_deployment_lrns, + existing_dns_records_by_lrns, + dns_lrns, + dns_record_namespace, deployment_dir, dns_value, app_deployment_request, diff --git a/stack_orchestrator/deploy/webapp/util.py b/stack_orchestrator/deploy/webapp/util.py index ebcd2526..0c8e6f2f 100644 --- a/stack_orchestrator/deploy/webapp/util.py +++ b/stack_orchestrator/deploy/webapp/util.py @@ -685,9 +685,10 @@ def publish_deployment( laconic: LaconicRegistryClient, app_record, deploy_record, - deployment_lrn, - dns_record, - dns_lrn, + deployment_lrns, + existing_dns_records_by_lrns, + dns_lrns: list[str], + dns_record_namespace, deployment_dir, dns_value=None, app_deployment_request=None, @@ -701,42 +702,49 @@ def publish_deployment( int(deploy_record.attributes.version.split(".")[-1]) + 1 ) - if not dns_record: - dns_ver = "0.0.1" - else: - dns_ver = "0.0.%d" % (int(dns_record.attributes.version.split(".")[-1]) + 1) + + dns_ids = [] + for dns_lrn in dns_lrns: + dns_record = existing_dns_records_by_lrns[dns_lrn] + if not dns_record: + dns_ver = "0.0.1" + else: + dns_ver = "0.0.%d" % (int(dns_record.attributes.version.split(".")[-1]) + 1) + + fqdn = dns_lrn.removeprefix(f"${dns_record_namespace}/") + uniq = uuid.uuid4() + + new_dns_record = { + "record": { + "type": "DnsRecord", + "version": dns_ver, + "name": fqdn, + "resource_type": "A", + "meta": {"so": uniq.hex}, + } + } + if app_deployment_request: + new_dns_record["record"]["request"] = app_deployment_request.id + if dns_value: + new_dns_record["record"]["value"] = dns_value + + if logger: + logger.log("Publishing DnsRecord.") + dns_id = laconic.publish(new_dns_record, [dns_lrn]) + dns_ids.append(dns_id) spec = yaml.full_load(open(os.path.join(deployment_dir, "spec.yml"))) - fqdn = spec["network"]["http-proxy"][0]["host-name"] - - uniq = uuid.uuid4() - - new_dns_record = { - "record": { - "type": "DnsRecord", - "version": dns_ver, - "name": fqdn, - "resource_type": "A", - "meta": {"so": uniq.hex}, - } - } - if app_deployment_request: - new_dns_record["record"]["request"] = app_deployment_request.id - if dns_value: - new_dns_record["record"]["value"] = dns_value - - if logger: - logger.log("Publishing DnsRecord.") - dns_id = laconic.publish(new_dns_record, [dns_lrn]) + last_fqdn = spec["network"]["http-proxy"][-1]["host-name"] + last_dns_id = dns_ids[-1] new_deployment_record = { "record": { "type": "ApplicationDeploymentRecord", "version": deploy_ver, - "url": f"https://{fqdn}", + "url": f"https://{last_fqdn}", "name": app_record.attributes.name, "application": app_record.id, - "dns": dns_id, + "dns": last_dns_id, "meta": { "config": file_hash(os.path.join(deployment_dir, "config.env")), "so": uniq.hex, @@ -758,8 +766,8 @@ def publish_deployment( if logger: logger.log("Publishing ApplicationDeploymentRecord.") - deployment_id = laconic.publish(new_deployment_record, [deployment_lrn]) - return {"dns": dns_id, "deployment": deployment_id} + deployment_id = laconic.publish(new_deployment_record, [deployment_lrns]) + return {"dns": dns_ids, "deployment": deployment_id} def get_requested_names(app_deployment_request): request_dns = app_deployment_request.attributes.dns