Tags for undeploy #734
@ -29,7 +29,7 @@ from stack_orchestrator.deploy.webapp.util import (LaconicRegistryClient,
|
|||||||
build_container_image, push_container_image,
|
build_container_image, push_container_image,
|
||||||
file_hash, deploy_to_k8s, publish_deployment,
|
file_hash, deploy_to_k8s, publish_deployment,
|
||||||
hostname_for_deployment_request, generate_hostname_for_app,
|
hostname_for_deployment_request, generate_hostname_for_app,
|
||||||
match_owner)
|
match_owner, skip_by_tag)
|
||||||
|
|
||||||
|
|
||||||
def process_app_deployment_request(
|
def process_app_deployment_request(
|
||||||
@ -222,17 +222,6 @@ def command(ctx, kube_config, laconic_config, image_registry, deployment_parent_
|
|||||||
dump_known_requests(state_file, requests)
|
dump_known_requests(state_file, requests)
|
||||||
return
|
return
|
||||||
|
|
||||||
def skip_by_tag(r):
|
|
||||||
for tag in exclude_tags:
|
|
||||||
if tag and r.attributes.tags and tag in r.attributes.tags:
|
|
||||||
return True
|
|
||||||
|
|
||||||
for tag in include_tags:
|
|
||||||
if tag and (not r.attributes.tags or tag not in r.attributes.tags):
|
|
||||||
return True
|
|
||||||
|
|
||||||
return False
|
|
||||||
|
|
||||||
previous_requests = load_known_requests(state_file)
|
previous_requests = load_known_requests(state_file)
|
||||||
|
|
||||||
# Collapse related requests.
|
# Collapse related requests.
|
||||||
@ -256,7 +245,7 @@ def command(ctx, kube_config, laconic_config, image_registry, deployment_parent_
|
|||||||
print("Ignoring request %s, it has been superseded." % r.id)
|
print("Ignoring request %s, it has been superseded." % r.id)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if skip_by_tag(r):
|
if skip_by_tag(r, include_tags, exclude_tags):
|
||||||
print("Skipping request %s, filtered by tag (include %s, exclude %s, present %s)" % (r.id,
|
print("Skipping request %s, filtered by tag (include %s, exclude %s, present %s)" % (r.id,
|
||||||
include_tags,
|
include_tags,
|
||||||
exclude_tags,
|
exclude_tags,
|
||||||
|
@ -20,7 +20,7 @@ import sys
|
|||||||
|
|
||||||
import click
|
import click
|
||||||
|
|
||||||
from stack_orchestrator.deploy.webapp.util import LaconicRegistryClient, match_owner
|
from stack_orchestrator.deploy.webapp.util import LaconicRegistryClient, match_owner, skip_by_tag
|
||||||
|
|
||||||
|
|
||||||
def process_app_removal_request(ctx,
|
def process_app_removal_request(ctx,
|
||||||
@ -107,10 +107,12 @@ def dump_known_requests(filename, requests):
|
|||||||
@click.option("--delete-names/--preserve-names", help="Delete all names associated with removed deployments.", default=True)
|
@click.option("--delete-names/--preserve-names", help="Delete all names associated with removed deployments.", default=True)
|
||||||
@click.option("--delete-volumes/--preserve-volumes", default=True, help="delete data volumes")
|
@click.option("--delete-volumes/--preserve-volumes", default=True, help="delete data volumes")
|
||||||
@click.option("--dry-run", help="Don't do anything, just report what would be done.", is_flag=True)
|
@click.option("--dry-run", help="Don't do anything, just report what would be done.", is_flag=True)
|
||||||
|
@click.option("--include-tags", help="Only include requests with matching tags (comma-separated).", default="")
|
||||||
|
@click.option("--exclude-tags", help="Exclude requests with matching tags (comma-separated).", default="")
|
||||||
@click.pass_context
|
@click.pass_context
|
||||||
def command(ctx, laconic_config, deployment_parent_dir,
|
def command(ctx, laconic_config, deployment_parent_dir,
|
||||||
request_id, discover, state_file, only_update_state,
|
request_id, discover, state_file, only_update_state,
|
||||||
delete_names, delete_volumes, dry_run):
|
delete_names, delete_volumes, dry_run, include_tags, exclude_tags):
|
||||||
if request_id and discover:
|
if request_id and discover:
|
||||||
print("Cannot specify both --request-id and --discover", file=sys.stderr)
|
print("Cannot specify both --request-id and --discover", file=sys.stderr)
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
@ -123,6 +125,10 @@ def command(ctx, laconic_config, deployment_parent_dir,
|
|||||||
print("--only-update-state requires --state-file", file=sys.stderr)
|
print("--only-update-state requires --state-file", file=sys.stderr)
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
|
||||||
|
# Split CSV and clean up values.
|
||||||
|
include_tags = [tag.strip() for tag in include_tags.split(",") if tag]
|
||||||
|
exclude_tags = [tag.strip() for tag in exclude_tags.split(",") if tag]
|
||||||
|
|
||||||
laconic = LaconicRegistryClient(laconic_config)
|
laconic = LaconicRegistryClient(laconic_config)
|
||||||
|
|
||||||
# Find deployment removal requests.
|
# Find deployment removal requests.
|
||||||
@ -155,10 +161,22 @@ def command(ctx, laconic_config, deployment_parent_dir,
|
|||||||
# TODO: should we handle CRNs?
|
# TODO: should we handle CRNs?
|
||||||
removals_by_deployment[r.attributes.deployment] = r
|
removals_by_deployment[r.attributes.deployment] = r
|
||||||
|
|
||||||
requests_to_execute = []
|
one_per_deployment = {}
|
||||||
for r in requests:
|
for r in requests:
|
||||||
if not r.attributes.deployment:
|
if not r.attributes.deployment:
|
||||||
print(f"Skipping removal request {r.id} since it was a cancellation.")
|
print(f"Skipping removal request {r.id} since it was a cancellation.")
|
||||||
|
elif r.attributes.deployment in one_per_deployment:
|
||||||
|
print(f"Skipping removal request {r.id} since it was superseded.")
|
||||||
|
else:
|
||||||
|
one_per_deployment[r.attributes.deployment] = r
|
||||||
|
|
||||||
|
requests_to_execute = []
|
||||||
|
for r in one_per_deployment.values():
|
||||||
|
if skip_by_tag(r, include_tags, exclude_tags):
|
||||||
|
print("Skipping removal request %s, filtered by tag (include %s, exclude %s, present %s)" % (r.id,
|
||||||
|
include_tags,
|
||||||
|
exclude_tags,
|
||||||
|
r.attributes.tags))
|
||||||
elif r.id in removals_by_request:
|
elif r.id in removals_by_request:
|
||||||
print(f"Found satisfied request for {r.id} at {removals_by_request[r.id].id}")
|
print(f"Found satisfied request for {r.id} at {removals_by_request[r.id].id}")
|
||||||
elif r.attributes.deployment in removals_by_deployment:
|
elif r.attributes.deployment in removals_by_deployment:
|
||||||
|
@ -351,3 +351,15 @@ def generate_hostname_for_app(app):
|
|||||||
else:
|
else:
|
||||||
m.update(app.attributes.repository.encode())
|
m.update(app.attributes.repository.encode())
|
||||||
return "%s-%s" % (last_part, m.hexdigest()[0:10])
|
return "%s-%s" % (last_part, m.hexdigest()[0:10])
|
||||||
|
|
||||||
|
|
||||||
|
def skip_by_tag(r, include_tags, exclude_tags):
|
||||||
|
for tag in exclude_tags:
|
||||||
|
if tag and r.attributes.tags and tag in r.attributes.tags:
|
||||||
|
return True
|
||||||
|
|
||||||
|
for tag in include_tags:
|
||||||
|
if tag and (not r.attributes.tags or tag not in r.attributes.tags):
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
Loading…
Reference in New Issue
Block a user