from os import path import subprocess import time import kubernetes import docker from yaml_patch import patch_yaml from experiment import Experiment from experiment_environment import ExperimentEnvironment from scaling_experiment_setting import ScalingExperimentSetting from experiment_autoscaling import ExperimentAutoscaling class ExperimentDeployer: def __init__(self, experiment: Experiment): self.experiment = experiment self.docker_client = docker.from_env() def build_images(self): """ build all the images for the experiment and push them to the docker registry. perform some patching of the build scripts to use buildx (for multi-arch builds) """ exp = self.experiment git = subprocess.check_call( ["git", "switch", exp.target_branch], cwd=path.join(exp.env.teastore_path) ) if git != 0: raise RuntimeError(f"failed to switch git to {exp.target_branch}") print(f"deploying {exp.target_branch}") # ensure mvn build ... # docker run -v foo:/mnt --rm -it --workdir /mnt maven mvn clean install -DskipTests mvn = self.docker_client.containers.run( image="maven", auto_remove=True, volumes={ path.abspath(path.join(exp.env.teastore_path)): { "bind": "/mnt", "mode": "rw", } }, working_dir="/mnt", command="mvn clean install -DskipTests", # command="tail -f /dev/null", ) if "BUILD SUCCESS" not in mvn.decode("utf-8"): raise RuntimeError( "failed to build teastore. Run mvn clean install -DskipTests manually and see why it fails" ) else: print("rebuild java deps") # patch build_docker.sh to use buildx with open( path.join(exp.env.teastore_path, "tools", "build_docker.sh"), "r" ) as f: script = f.read() if "buildx" in script: print("buildx already used") else: script = script.replace( "docker build", f"docker buildx build --platform {exp.env.remote_platform_arch}", ) with open( path.join(exp.env.teastore_path, "tools", "build_docker.sh"), "w" ) as f: f.write(script) # 2. cd tools && ./build_docker.sh -r 0 ): ready_services.add(service) except Exception as e: print(e) pass if services == ready_services: print("!") return True time.sleep(1) print(".", end="", flush=True) raise RuntimeError( "Timeout reached. The following services are not ready: " + str(list(set(services) - set(ready_services))) )