diff --git a/stack_orchestrator/data/stacks/fixturenet-optimism/deploy/commands.py b/stack_orchestrator/data/stacks/fixturenet-optimism/deploy/commands.py index fa757cf5..2e67da77 100644 --- a/stack_orchestrator/data/stacks/fixturenet-optimism/deploy/commands.py +++ b/stack_orchestrator/data/stacks/fixturenet-optimism/deploy/commands.py @@ -14,7 +14,6 @@ # along with this program. If not, see . from stack_orchestrator.deploy.deployment_context import DeploymentContext -from ruamel.yaml import YAML def create(context: DeploymentContext, extra_args): @@ -23,17 +22,12 @@ def create(context: DeploymentContext, extra_args): # deterministic-deployment-proxy contract, which itself is a prereq for Optimism contract deployment fixturenet_eth_compose_file = context.deployment_dir.joinpath('compose', 'docker-compose-fixturenet-eth.yml') - with open(fixturenet_eth_compose_file, 'r') as yaml_file: - yaml = YAML() - yaml_data = yaml.load(yaml_file) - new_script = '../config/fixturenet-optimism/run-geth.sh:/opt/testnet/run.sh' - if new_script not in yaml_data['services']['fixturenet-eth-geth-1']['volumes']: - yaml_data['services']['fixturenet-eth-geth-1']['volumes'].append(new_script) + def add_geth_volume(yaml_data): + if new_script not in yaml_data['services']['fixturenet-eth-geth-1']['volumes']: + yaml_data['services']['fixturenet-eth-geth-1']['volumes'].append(new_script) - with open(fixturenet_eth_compose_file, 'w') as yaml_file: - yaml = YAML() - yaml.dump(yaml_data, yaml_file) + context.modify_yaml(fixturenet_eth_compose_file, add_geth_volume) return None diff --git a/stack_orchestrator/deploy/deployment_context.py b/stack_orchestrator/deploy/deployment_context.py index 239e9c5c..2ffc5b89 100644 --- a/stack_orchestrator/deploy/deployment_context.py +++ b/stack_orchestrator/deploy/deployment_context.py @@ -45,11 +45,14 @@ class DeploymentContext: def get_compose_dir(self): return self.deployment_dir.joinpath(constants.compose_dir_name) + def get_compose_file(self, name: str): + return self.get_compose_dir() / f"docker-compose-{name}.yml" + def get_cluster_id(self): return self.id - def init(self, dir): - self.deployment_dir = dir + def init(self, dir: Path): + self.deployment_dir = dir.absolute() self.spec = Spec() self.spec.init_from_file(self.get_spec_file()) self.stack = Stack(self.spec.obj["stack"]) @@ -66,3 +69,19 @@ class DeploymentContext: unique_cluster_descriptor = f"{path},{self.get_stack_file()},None,None" hash = hashlib.md5(unique_cluster_descriptor.encode()).hexdigest()[:16] self.id = f"{constants.cluster_name_prefix}{hash}" + + def modify_yaml(self, file_path: Path, modifier_func): + """ + Load a YAML from the deployment, apply a modification function, and write it back. + """ + if not file_path.absolute().is_relative_to(self.deployment_dir): + raise ValueError(f"File is not inside deployment directory: {file_path}") + + yaml = get_yaml() + with open(file_path, 'r') as f: + yaml_data = yaml.load(f) + + modifier_func(yaml_data) + + with open(file_path, 'w') as f: + yaml.dump(yaml_data, f)