From 26f9cbd49c2c263d1bd1299dbb3b2be0e13e29ac Mon Sep 17 00:00:00 2001 From: Kevin Veen-Birkenbach Date: Tue, 9 Jan 2024 14:20:30 +0100 Subject: [PATCH] Optimized storage script --- roles/storage/files/optimize.py | 68 +++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 20 deletions(-) diff --git a/roles/storage/files/optimize.py b/roles/storage/files/optimize.py index 631f28e9..85194922 100644 --- a/roles/storage/files/optimize.py +++ b/roles/storage/files/optimize.py @@ -8,39 +8,67 @@ def run_command(command): # Path on the SSD where data will be moved ssd_path = "/path/to/ssd" +hdd_path = "/path/to/hdd" # List all Docker volumes volumes = run_command("docker volume ls -q").splitlines() +def stop_containers(containers): + """Stop a list of containers.""" + container_list = ' '.join(containers) + print(f"Stopping containers {container_list}...") + execute_shell_command(f"docker stop {container_list}") + +def start_containers(containers): + """Start a list of containers.""" + container_list = ' '.join(containers) + print(f"Start containers {container_list}...") + execute_shell_command(f"docker start {container_list}") + +def is_database(image): + return "postgres" in image or "mariadb" in image + +def is_symbolic_link(file_path): + return os.path.islink(file_path) + +def get_volume_path(volume): + return run_command(f"docker volume inspect --format '{{{{ .Mountpoint }}}}' {volume}") + +def get_image(volume): + return run_command(f"docker inspect --format='{{{{.Config.Image}}}}' {container}") + +def pause_and_move(storage_path,volume): + stop_containers(containers) + # Create a new directory on the Storage + storage_volume_path = os.path.join(storage_path, volume) + os.makedirs(storage_volume_path, exist_ok=False) + + # Move the data + for item in os.listdir(volume_path): + shutil.move(os.path.join(volume_path, item), storage_volume_path) + + # Create a symbolic link + os.symlink(storage_volume_path, volume_path) + + start_containers(containers) + for volume in volumes: # List all containers using this volume containers = run_command(f"docker ps -q --filter volume={volume}").splitlines() - + volume_path = get_volume_path(volume) + if is_symbolic_link(volume_path): + print(f"Skipped Volume {volume}. The storage path {volume_path} is a symbolic link.") + for container in containers: # Get the image of the container - image = run_command(f"docker inspect --format='{{{{.Config.Image}}}}' {container}") + image = get_image(container) # Check if the image contains "postgres" or "mariadb" - if "postgres" in image or "mariadb" in image: + if is_database(image): print(f"Container {container} with database image {image} found, using volume {volume}.") - - # Stop the container - run_command(f"docker stop {container}") - - # Get the mount point of the volume - volume_path = run_command(f"docker volume inspect --format '{{{{ .Mountpoint }}}}' {volume}") - - # Create a new directory on the SSD - ssd_volume_path = os.path.join(ssd_path, volume) - os.makedirs(ssd_volume_path, exist_ok=True) - - # Move the data - for item in os.listdir(volume_path): - shutil.move(os.path.join(volume_path, item), ssd_volume_path) - - # Create a symbolic link - os.symlink(ssd_volume_path, volume_path) + pause_and_move(ssd_path,volume) else: print(f"Container {container} with file image {image} found, using volume {volume}.") + pause_and_move(hdd_path,volume) print("Operation completed.")