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/data/stacks/test/stack.yml b/stack_orchestrator/data/stacks/test/stack.yml index ac724c89..93d3ecd3 100644 --- a/stack_orchestrator/data/stacks/test/stack.yml +++ b/stack_orchestrator/data/stacks/test/stack.yml @@ -2,7 +2,6 @@ version: "1.0" name: test description: "A test stack" repos: - - git.vdb.to/cerc-io/laconicd - git.vdb.to/cerc-io/test-project@test-branch containers: - cerc/test-container 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) diff --git a/stack_orchestrator/deploy/deployment_create.py b/stack_orchestrator/deploy/deployment_create.py index 9d45f226..5daffad8 100644 --- a/stack_orchestrator/deploy/deployment_create.py +++ b/stack_orchestrator/deploy/deployment_create.py @@ -443,18 +443,16 @@ def _check_volume_definitions(spec): @click.command() @click.option("--spec-file", required=True, help="Spec file to use to create this deployment") @click.option("--deployment-dir", help="Create deployment files in this directory") -# TODO: Hack -@click.option("--network-dir", help="Network configuration supplied in this directory") -@click.option("--initial-peers", help="Initial set of persistent peers") +@click.argument('extra_args', nargs=-1, type=click.UNPROCESSED) @click.pass_context -def create(ctx, spec_file, deployment_dir, network_dir, initial_peers): +def create(ctx, spec_file, deployment_dir, extra_args): deployment_command_context = ctx.obj - return create_operation(deployment_command_context, spec_file, deployment_dir, network_dir, initial_peers) + return create_operation(deployment_command_context, spec_file, deployment_dir, extra_args) # The init command's implementation is in a separate function so that we can # call it from other commands, bypassing the click decoration stuff -def create_operation(deployment_command_context, spec_file, deployment_dir, network_dir, initial_peers): +def create_operation(deployment_command_context, spec_file, deployment_dir, extra_args): parsed_spec = Spec(os.path.abspath(spec_file), get_parsed_deployment_spec(spec_file)) _check_volume_definitions(parsed_spec) stack_name = parsed_spec["stack"] @@ -541,7 +539,7 @@ def create_operation(deployment_command_context, spec_file, deployment_dir, netw deployer_config_generator = getDeployerConfigGenerator(deployment_type, deployment_context) # TODO: make deployment_dir_path a Path above deployer_config_generator.generate(deployment_dir_path) - call_stack_deploy_create(deployment_context, [network_dir, initial_peers, deployment_command_context]) + call_stack_deploy_create(deployment_context, extra_args) # TODO: this code should be in the stack .py files but diff --git a/stack_orchestrator/deploy/webapp/deploy_webapp.py b/stack_orchestrator/deploy/webapp/deploy_webapp.py index 4c91dec3..0353ad16 100644 --- a/stack_orchestrator/deploy/webapp/deploy_webapp.py +++ b/stack_orchestrator/deploy/webapp/deploy_webapp.py @@ -92,7 +92,6 @@ def create_deployment(ctx, deployment_dir, image, url, kube_config, image_regist spec_file_name, deployment_dir, None, - None ) # Fix up the container tag inside the deployment compose file _fixup_container_tag(deployment_dir, image) diff --git a/tests/deploy/run-deploy-test.sh b/tests/deploy/run-deploy-test.sh index fb574b03..c18c5cb0 100755 --- a/tests/deploy/run-deploy-test.sh +++ b/tests/deploy/run-deploy-test.sh @@ -14,8 +14,13 @@ delete_cluster_exit () { # Test basic stack-orchestrator deploy echo "Running stack-orchestrator deploy test" -# Bit of a hack, test the most recent package -TEST_TARGET_SO=$( ls -t1 ./package/laconic-so* | head -1 ) + +if [ "$1" == "from-path" ]; then + TEST_TARGET_SO="laconic-so" +else + TEST_TARGET_SO=$( ls -t1 ./package/laconic-so* | head -1 ) +fi + # Set a non-default repo dir export CERC_REPO_BASE_DIR=~/stack-orchestrator-test/repo-base-dir echo "Testing this package: $TEST_TARGET_SO"