From f3e865ebbfbd3fd11981be7b3779344a613f0614 Mon Sep 17 00:00:00 2001 From: Chris Jackson Date: Wed, 25 Dec 2024 08:00:56 +0000 Subject: [PATCH] feat: implemented spring-clean for remote incus --- .../_opt/script/spring-clean-metal.py | 1 + remote-incus/_opt/script/spring-clean.py | 76 +++++++++++++++++++ remote-metal/_opt/script/spring-clean.py | 5 +- .../create_test_image_for_spring_clean.py | 2 +- 4 files changed, 82 insertions(+), 2 deletions(-) create mode 120000 remote-incus/_opt/script/spring-clean-metal.py create mode 100755 remote-incus/_opt/script/spring-clean.py diff --git a/remote-incus/_opt/script/spring-clean-metal.py b/remote-incus/_opt/script/spring-clean-metal.py new file mode 120000 index 0000000..5a80b64 --- /dev/null +++ b/remote-incus/_opt/script/spring-clean-metal.py @@ -0,0 +1 @@ +../../../remote-metal/_opt/script/spring-clean.py \ No newline at end of file diff --git a/remote-incus/_opt/script/spring-clean.py b/remote-incus/_opt/script/spring-clean.py new file mode 100755 index 0000000..9a2a3c3 --- /dev/null +++ b/remote-incus/_opt/script/spring-clean.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 +import argparse +import os.path +import pathlib +import subprocess +import time + +parser = argparse.ArgumentParser(description="Clean out older deploy on incus container and keep the last defined amount") + +parser.add_argument("--keep", default=20, help="The amount of last deploy to keep") +parser.add_argument("--real-run", action='store_true') +parser.add_argument("--incus", required=True) + +args = parser.parse_args() + +arg_keep = int(args.keep) +arg_real_run = args.real_run +arg_incus = args.incus + +unsorted_images = [] +try: + unsorted_images = subprocess.run([ + "incus", "exec", arg_incus, "--", "sh", "-c", "for image in /opt/run-deploy/image/*/*.blame; do (echo ${image}); done" + ], check=True, capture_output=True).stdout.decode('utf-8').strip().splitlines() +except subprocess.CalledProcessError: + exit(0) + +images = {} +for unsorted_image in unsorted_images: + image_key = os.path.dirname(unsorted_image) + if image_key not in images: + images[image_key] = [] + images[image_key].append(unsorted_image) + +images_to_delete = [] +for _, image_list in images.items(): + image_list.sort() + image_list = list(reversed(image_list)) + if len(image_list) > arg_keep: + images_to_delete += image_list[arg_keep:] + +if len(images_to_delete) == 0: + exit(0) + +files_to_delete = [] +for image in images_to_delete: + image = str(image) + files_to_delete.append(f"rm '{image}'") + files_to_delete.append(f"rm '{image.removesuffix('.blame')}'") + files_to_delete.append(f"rm '{image.removesuffix('.blame')}.squashfs'") + +if len(files_to_delete) == 0: + exit(0) + +files_to_delete = "\n".join(files_to_delete) + +script = f"""#!/bin/sh + +{files_to_delete}""" + +if not arg_real_run: + print(script) + exit(0) + +script_name = f"/tmp/run-deploy-spring-clean-incus-{time.time()}" +script_path = pathlib.Path(script_name) +script_path.write_text(script, 'utf-8') +script_path.chmod(0o700) + +subprocess.run([ + "incus", "file", "push", script_name, f"{arg_incus}/tmp/" +], check=True) +subprocess.run([ + "incus", "exec", arg_incus, "--", script_name +], check=True) +os.remove(script_name) \ No newline at end of file diff --git a/remote-metal/_opt/script/spring-clean.py b/remote-metal/_opt/script/spring-clean.py index 28520e0..8523c3f 100755 --- a/remote-metal/_opt/script/spring-clean.py +++ b/remote-metal/_opt/script/spring-clean.py @@ -5,7 +5,7 @@ import subprocess import time -parser = argparse.ArgumentParser(description="Clean out older deply and keep the last defined amount") +parser = argparse.ArgumentParser(description="Clean out older deploy on host and keep the last defined amount") parser.add_argument("--keep", default=20, help="The amount of last deploy to keep") parser.add_argument("--real-run", action='store_true') @@ -33,6 +33,9 @@ if len(image_list) > arg_keep: images_to_delete += image_list[arg_keep:] +if len(images_to_delete) == 0: + exit(0) + files_to_delete = [] for image in images_to_delete: image = str(image) diff --git a/test-util/create_test_image_for_spring_clean.py b/test-util/create_test_image_for_spring_clean.py index 2a919d5..fcf3234 100755 --- a/test-util/create_test_image_for_spring_clean.py +++ b/test-util/create_test_image_for_spring_clean.py @@ -2,7 +2,7 @@ import os import pathlib -os.chdir("/opt/run-deploy/images") +os.chdir("/opt/run-deploy/image") for dir_name in range(5): dir_name = f"run-deploy-test-{dir_name:02}"