From 8f92e2700c5bc70845c5303d95a4c2a3cc4a0611 Mon Sep 17 00:00:00 2001 From: Roy Crihfield Date: Sun, 19 Oct 2025 00:55:09 +0800 Subject: [PATCH 1/4] Pass extra args to custom create command --- stack_orchestrator/deploy/deployment_create.py | 12 +++++------- stack_orchestrator/deploy/webapp/deploy_webapp.py | 1 - 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/stack_orchestrator/deploy/deployment_create.py b/stack_orchestrator/deploy/deployment_create.py index 9d45f226..293aeb2d 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, sync, 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) -- 2.45.2 From b1a489ef1bae2c18fc51745059916eb142d4478e Mon Sep 17 00:00:00 2001 From: Roy Crihfield Date: Sun, 19 Oct 2025 01:17:33 +0800 Subject: [PATCH 2/4] Add DeploymentContext.modify_yaml helper For custom deploy commands --- .../fixturenet-optimism/deploy/commands.py | 14 ++++------- .../deploy/deployment_context.py | 23 +++++++++++++++++-- 2 files changed, 25 insertions(+), 12 deletions(-) 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) -- 2.45.2 From 0aca6d0938a6af66ce9e11789e54e5f71c75f658 Mon Sep 17 00:00:00 2001 From: Roy Crihfield Date: Sun, 19 Oct 2025 14:36:44 +0800 Subject: [PATCH 3/4] patch --- stack_orchestrator/deploy/deployment_create.py | 2 +- tests/deploy/run-deploy-test.sh | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/stack_orchestrator/deploy/deployment_create.py b/stack_orchestrator/deploy/deployment_create.py index 293aeb2d..5daffad8 100644 --- a/stack_orchestrator/deploy/deployment_create.py +++ b/stack_orchestrator/deploy/deployment_create.py @@ -445,7 +445,7 @@ def _check_volume_definitions(spec): @click.option("--deployment-dir", help="Create deployment files in this directory") @click.argument('extra_args', nargs=-1, type=click.UNPROCESSED) @click.pass_context -def create(ctx, spec_file, deployment_dir, sync, extra_args): +def create(ctx, spec_file, deployment_dir, extra_args): deployment_command_context = ctx.obj return create_operation(deployment_command_context, spec_file, deployment_dir, extra_args) 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" -- 2.45.2 From 27ee95d0ffe02f086170776561b4aa463cce2c3a Mon Sep 17 00:00:00 2001 From: Roy Crihfield Date: Sun, 19 Oct 2025 14:36:49 +0800 Subject: [PATCH 4/4] test stack does not need laconicd --- stack_orchestrator/data/stacks/test/stack.yml | 1 - 1 file changed, 1 deletion(-) 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 -- 2.45.2