diff --git a/stack_orchestrator/data/compose/docker-compose-fixturenet-laconicd.yml b/stack_orchestrator/data/compose/docker-compose-fixturenet-laconicd.yml index 7b48f60d..556ccb21 100644 --- a/stack_orchestrator/data/compose/docker-compose-fixturenet-laconicd.yml +++ b/stack_orchestrator/data/compose/docker-compose-fixturenet-laconicd.yml @@ -7,9 +7,7 @@ services: # The cosmos-sdk node's database directory: - laconicd-data:/root/.laconicd # TODO: look at folding these scripts into the container - - ../config/fixturenet-laconicd/create-fixturenet.sh:/docker-entrypoint-scripts.d/create-fixturenet.sh - - ../config/fixturenet-laconicd/export-mykey.sh:/docker-entrypoint-scripts.d/export-mykey.sh - - ../config/fixturenet-laconicd/export-myaddress.sh:/docker-entrypoint-scripts.d/export-myaddress.sh + - laconicd-scripts:/docker-entrypoint-scripts.d:ro # TODO: determine which of the ports below is really needed ports: - "6060" @@ -24,7 +22,9 @@ services: cli: image: cerc/laconic-registry-cli:local volumes: - - ../config/fixturenet-laconicd/registry-cli-config-template.yml:/registry-cli-config-template.yml + - cli-config:/registry-cli-config volumes: laconicd-data: + laconicd-scripts: + cli-config: diff --git a/stack_orchestrator/data/compose/docker-compose-mainnet-laconicd.yml b/stack_orchestrator/data/compose/docker-compose-mainnet-laconicd.yml index ff2f3376..2d743dc9 100644 --- a/stack_orchestrator/data/compose/docker-compose-mainnet-laconicd.yml +++ b/stack_orchestrator/data/compose/docker-compose-mainnet-laconicd.yml @@ -9,9 +9,7 @@ services: - laconicd-config:/root/.laconicd/config - laconicd-keyring:/root/.laconicd/keyring-test # TODO: look at folding these scripts into the container - - ../config/mainnet-laconicd/scripts/run-laconicd.sh:/opt/run-laconicd.sh - - ../config/mainnet-laconicd/scripts/export-mykey.sh:/docker-entrypoint-scripts.d/export-mykey.sh - - ../config/mainnet-laconicd/scripts/export-myaddress.sh:/docker-entrypoint-scripts.d/export-myaddress.sh + - laconicd-scripts:/docker-entrypoint-scripts.d:ro # TODO: determine which of the ports below is really needed ports: - "6060" @@ -26,9 +24,11 @@ services: cli: image: cerc/laconic-registry-cli:local volumes: - - ../config/mainnet-laconicd/registry-cli-config-template.yml:/registry-cli-config-template.yml + - cli-config:/registry-cli-config volumes: laconicd-data: laconicd-config: + laconicd-scripts: laconicd-keyring: + cli-config: diff --git a/stack_orchestrator/data/config/fixturenet-laconic-loaded/create-fixturenet.sh b/stack_orchestrator/data/config/fixturenet-laconic-loaded/create-fixturenet.sh new file mode 100644 index 00000000..d444fcad --- /dev/null +++ b/stack_orchestrator/data/config/fixturenet-laconic-loaded/create-fixturenet.sh @@ -0,0 +1,125 @@ +#!/bin/bash + +# TODO: this file is now an unmodified copy of cerc-io/laconicd/init.sh +# so we should have a mechanism to bundle it inside the container rather than link from here +# at deploy time. + +KEY="mykey" +CHAINID="laconic_9000-1" +MONIKER="localtestnet" +KEYRING="test" +KEYALGO="eth_secp256k1" +LOGLEVEL="info" +# trace evm +TRACE="--trace" +# TRACE="" + +if [ "$1" == "clean" ] || [ ! -d "$HOME/.laconicd/data/blockstore.db" ]; then + # validate dependencies are installed + command -v jq > /dev/null 2>&1 || { echo >&2 "jq not installed. More info: https://stedolan.github.io/jq/download/"; exit 1; } + + # remove existing daemon and client + rm -rf $HOME/.laconicd/* + rm -rf $HOME/.laconic/* + + if [ -n "`which make`" ]; then + make install + fi + + laconicd config keyring-backend $KEYRING + laconicd config chain-id $CHAINID + + # if $KEY exists it should be deleted + laconicd keys add $KEY --keyring-backend $KEYRING --algo $KEYALGO + + # Set moniker and chain-id for Ethermint (Moniker can be anything, chain-id must be an integer) + laconicd init $MONIKER --chain-id $CHAINID + + # Change parameter token denominations to aphoton + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["staking"]["params"]["bond_denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["crisis"]["constant_fee"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["gov"]["deposit_params"]["min_deposit"][0]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["mint"]["params"]["mint_denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + # Custom modules + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["record_rent"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_rent"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_auction_commit_fee"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_auction_reveal_fee"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_auction_minimum_bid"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + + if [[ "$TEST_REGISTRY_EXPIRY" == "true" ]]; then + echo "Setting timers for expiry tests." + + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["record_rent_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_grace_period"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_rent_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + fi + + if [[ "$TEST_AUCTION_ENABLED" == "true" ]]; then + echo "Enabling auction and setting timers." + + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_auction_enabled"]=true' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_rent_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_grace_period"]="300s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_auction_commits_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_auction_reveals_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + fi + + # increase block time (?) + cat $HOME/.laconicd/config/genesis.json | jq '.consensus_params["block"]["time_iota_ms"]="1000"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + + # Set gas limit in genesis + cat $HOME/.laconicd/config/genesis.json | jq '.consensus_params["block"]["max_gas"]="10000000"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + + # disable produce empty block + if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i '' 's/create_empty_blocks = true/create_empty_blocks = false/g' $HOME/.laconicd/config/config.toml + else + sed -i 's/create_empty_blocks = true/create_empty_blocks = false/g' $HOME/.laconicd/config/config.toml + fi + + if [[ $1 == "pending" ]]; then + if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i '' 's/create_empty_blocks_interval = "0s"/create_empty_blocks_interval = "30s"/g' $HOME/.laconicd/config/config.toml + sed -i '' 's/timeout_propose = "3s"/timeout_propose = "30s"/g' $HOME/.laconicd/config/config.toml + sed -i '' 's/timeout_propose_delta = "500ms"/timeout_propose_delta = "5s"/g' $HOME/.laconicd/config/config.toml + sed -i '' 's/timeout_prevote = "1s"/timeout_prevote = "10s"/g' $HOME/.laconicd/config/config.toml + sed -i '' 's/timeout_prevote_delta = "500ms"/timeout_prevote_delta = "5s"/g' $HOME/.laconicd/config/config.toml + sed -i '' 's/timeout_precommit = "1s"/timeout_precommit = "10s"/g' $HOME/.laconicd/config/config.toml + sed -i '' 's/timeout_precommit_delta = "500ms"/timeout_precommit_delta = "5s"/g' $HOME/.laconicd/config/config.toml + sed -i '' 's/timeout_commit = "5s"/timeout_commit = "150s"/g' $HOME/.laconicd/config/config.toml + sed -i '' 's/timeout_broadcast_tx_commit = "10s"/timeout_broadcast_tx_commit = "150s"/g' $HOME/.laconicd/config/config.toml + else + sed -i 's/create_empty_blocks_interval = "0s"/create_empty_blocks_interval = "30s"/g' $HOME/.laconicd/config/config.toml + sed -i 's/timeout_propose = "3s"/timeout_propose = "30s"/g' $HOME/.laconicd/config/config.toml + sed -i 's/timeout_propose_delta = "500ms"/timeout_propose_delta = "5s"/g' $HOME/.laconicd/config/config.toml + sed -i 's/timeout_prevote = "1s"/timeout_prevote = "10s"/g' $HOME/.laconicd/config/config.toml + sed -i 's/timeout_prevote_delta = "500ms"/timeout_prevote_delta = "5s"/g' $HOME/.laconicd/config/config.toml + sed -i 's/timeout_precommit = "1s"/timeout_precommit = "10s"/g' $HOME/.laconicd/config/config.toml + sed -i 's/timeout_precommit_delta = "500ms"/timeout_precommit_delta = "5s"/g' $HOME/.laconicd/config/config.toml + sed -i 's/timeout_commit = "5s"/timeout_commit = "150s"/g' $HOME/.laconicd/config/config.toml + sed -i 's/timeout_broadcast_tx_commit = "10s"/timeout_broadcast_tx_commit = "150s"/g' $HOME/.laconicd/config/config.toml + fi + fi + + # Allocate genesis accounts (cosmos formatted addresses) + laconicd add-genesis-account $KEY 100000000000000000000000000aphoton --keyring-backend $KEYRING + + # Sign genesis transaction + laconicd gentx $KEY 1000000000000000000000aphoton --keyring-backend $KEYRING --chain-id $CHAINID + + # Collect genesis tx + laconicd collect-gentxs + + # Run this to ensure everything worked and that the genesis file is setup correctly + laconicd validate-genesis + + if [[ $1 == "pending" ]]; then + echo "pending mode is on, please wait for the first block committed." + fi +else + echo "Using existing database at $HOME/.laconicd. To replace, run '`basename $0` clean'" +fi + +# Start the node (remove the --pruning=nothing flag if historical queries are not needed) +laconicd start --pruning=nothing --evm.tracer=json $TRACE --log_level $LOGLEVEL --minimum-gas-prices=0.0001aphoton --json-rpc.api eth,txpool,personal,net,debug,web3,miner --api.enable --gql-server --gql-playground diff --git a/stack_orchestrator/data/config/fixturenet-laconic-loaded/export-myaddress.sh b/stack_orchestrator/data/config/fixturenet-laconic-loaded/export-myaddress.sh new file mode 100644 index 00000000..e454c0b0 --- /dev/null +++ b/stack_orchestrator/data/config/fixturenet-laconic-loaded/export-myaddress.sh @@ -0,0 +1,2 @@ +#!/bin/sh +laconicd keys show mykey | grep address | cut -d ' ' -f 3 diff --git a/stack_orchestrator/data/config/fixturenet-laconic-loaded/export-mykey.sh b/stack_orchestrator/data/config/fixturenet-laconic-loaded/export-mykey.sh new file mode 100644 index 00000000..1a5be86e --- /dev/null +++ b/stack_orchestrator/data/config/fixturenet-laconic-loaded/export-mykey.sh @@ -0,0 +1,2 @@ +#!/bin/sh +echo y | laconicd keys export mykey --unarmored-hex --unsafe diff --git a/stack_orchestrator/data/config/fixturenet-laconic-loaded/registry-cli-config-template.yml b/stack_orchestrator/data/config/fixturenet-laconic-loaded/registry-cli-config-template.yml new file mode 100644 index 00000000..d558956a --- /dev/null +++ b/stack_orchestrator/data/config/fixturenet-laconic-loaded/registry-cli-config-template.yml @@ -0,0 +1,9 @@ +services: + cns: + restEndpoint: 'http://laconicd:1317' + gqlEndpoint: 'http://laconicd:9473/api' + userKey: REPLACE_WITH_MYKEY + bondId: + chainId: laconic_9000-1 + gas: 350000 + fees: 200000aphoton diff --git a/stack_orchestrator/data/container-build/cerc-laconic-registry-cli/import-key.sh b/stack_orchestrator/data/container-build/cerc-laconic-registry-cli/import-key.sh index 3bafec4b..7a662b99 100644 --- a/stack_orchestrator/data/container-build/cerc-laconic-registry-cli/import-key.sh +++ b/stack_orchestrator/data/container-build/cerc-laconic-registry-cli/import-key.sh @@ -1,2 +1,2 @@ #!/bin/sh -sed 's/REPLACE_WITH_MYKEY/'${1}'/' registry-cli-config-template.yml > config.yml +sed 's/REPLACE_WITH_MYKEY/'${1}'/' /registry-cli-config/template.yml > config.yml diff --git a/stack_orchestrator/data/stacks/fixturenet-laconic-loaded/deploy/commands.py b/stack_orchestrator/data/stacks/fixturenet-laconic-loaded/deploy/commands.py new file mode 100644 index 00000000..0859068e --- /dev/null +++ b/stack_orchestrator/data/stacks/fixturenet-laconic-loaded/deploy/commands.py @@ -0,0 +1,71 @@ +# Copyright © 2022-2024 Vulcanize + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +from stack_orchestrator.util import get_yaml, get_config_file_dir +from stack_orchestrator.deploy.deploy_types import DeployCommandContext +from stack_orchestrator.deploy.deployment_context import DeploymentContext +from pathlib import Path +from shutil import copy + +default_spec_file_content = "" + + +def _stack_config_dir(context: DeploymentContext) -> Path: + return get_config_file_dir().joinpath(context.stack.name) + +def _deployment_volume_dir(context: DeploymentContext, volume_name: str) -> Path: + return context.deployment_dir.joinpath("data", volume_name) + + +def _copy_laconicd_scripts(context: DeploymentContext): + scripts = [ + "create-fixturenet.sh", + "export-mykey.sh", + "export-myaddress.sh" + ] + destination_dir = _deployment_volume_dir(context, "laconicd-scripts") + for script in scripts: + # ../config/fixturenet-laconicd/ + source_file = _stack_config_dir(context).joinpath(script) + copy(source_file, destination_dir) + + +def _copy_cli_template(context: DeploymentContext): + destination_dir = _deployment_volume_dir(context, "cli-config") + # ../config/fixturenet-laconicd/ + source_file = _stack_config_dir(context).joinpath("registry-cli-config-template.yml") + copy(source_file, destination_dir) + + +def setup(command_context: DeployCommandContext, parameters, extra_args): + pass + + +def init(command_context: DeployCommandContext): + yaml = get_yaml() + return yaml.load(default_spec_file_content) + + +def create(context: DeploymentContext, extra_args): + _copy_laconicd_scripts(context) + _copy_cli_template(context) + + +def get_state(command_context: DeployCommandContext): + pass + + +def change_state(command_context: DeployCommandContext): + pass diff --git a/stack_orchestrator/deploy/k8s/helpers.py b/stack_orchestrator/deploy/k8s/helpers.py index 62545dfd..cf034de0 100644 --- a/stack_orchestrator/deploy/k8s/helpers.py +++ b/stack_orchestrator/deploy/k8s/helpers.py @@ -153,11 +153,19 @@ def _generate_kind_mounts(parsed_pod_files, deployment_dir): if "volumes" in service_obj: volumes = service_obj["volumes"] for mount_string in volumes: - # Looks like: test-data:/data - (volume_name, mount_path) = mount_string.split(":") + # Looks like: test-data:/data or test-data:/data:ro or test-data:/data:rw + if opts.o.debug: + print(f"mount_string is: {mount_string}") + mount_split = mount_string.split(":") + volume_name = mount_split[0] + mount_path = mount_split[1] + if opts.o.debug: + print(f"volumne_name: {volume_name}") + print(f"map: {volume_host_path_map}") + print(f"mount path: {mount_path}") volume_definitions.append( f" - hostPath: {_make_absolute_host_path(volume_host_path_map[volume_name], deployment_dir)}\n" - f" containerPath: {get_node_pv_mount_path(volume_name)}" + f" containerPath: {get_node_pv_mount_path(volume_name)}\n" ) return ( "" if len(volume_definitions) == 0 else ( diff --git a/stack_orchestrator/util.py b/stack_orchestrator/util.py index 0bd1a609..7aa5e15e 100644 --- a/stack_orchestrator/util.py +++ b/stack_orchestrator/util.py @@ -139,6 +139,13 @@ def get_compose_file_dir(): return source_compose_dir +def get_config_file_dir(): + # TODO: refactor to use common code with deploy command + data_dir = Path(__file__).absolute().parent.joinpath("data") + source_config_dir = data_dir.joinpath("config") + return source_config_dir + + def get_parsed_deployment_spec(spec_file): spec_file_path = Path(spec_file) try: