Commit 8d400566 authored by Barnabas Busa's avatar Barnabas Busa Committed by GitHub

feat: enable persistence (#422)

parent 6a945747
...@@ -109,6 +109,13 @@ jobs: ...@@ -109,6 +109,13 @@ jobs:
- checkout - checkout
- run: kurtosis run ${PWD} "$(cat ./.github/tests/mix-with-tools-mev.yaml)" - run: kurtosis run ${PWD} "$(cat ./.github/tests/mix-with-tools-mev.yaml)"
mix_persistence_k8s:
resource_class: xlarge
executor: ubuntu_vm
steps:
- checkout
- run: kurtosis run ${PWD} "$(cat ./.github/tests/mix-persistence-k8s.yaml)"
workflows: workflows:
nightly_tests: nightly_tests:
when: << pipeline.parameters.should-enable-check-latest-version-workflow >> when: << pipeline.parameters.should-enable-check-latest-version-workflow >>
...@@ -155,3 +162,10 @@ workflows: ...@@ -155,3 +162,10 @@ workflows:
branches: branches:
ignore: ignore:
- main - main
- mix_persistence_k8s:
<<: *setup_kurtosis_k3s
filters:
branches:
ignore:
- main
participants:
- el_client_type: besu
cl_client_type: lighthouse
additional_services: []
persistent: true
participants:
- el_client_type: erigon
cl_client_type: lighthouse
additional_services: []
persistent: true
participants:
- el_client_type: geth
cl_client_type: prysm
- el_client_type: nethermind
cl_client_type: nimbus
cl_split_mode_enabled: true
- el_client_type: besu
cl_client_type: lighthouse
- el_client_type: reth
cl_client_type: lodestar
- el_client_type: ethereumjs
cl_client_type: teku
cl_split_mode_enabled: true
- el_client_type: erigon
cl_client_type: teku
- el_client_type: besu
cl_client_type: nimbus
additional_services: []
persistent: true
participants:
- el_client_type: geth
cl_client_type: prysm
- el_client_type: geth
cl_client_type: nimbus
cl_split_mode_enabled: true
- el_client_type: nethermind
cl_client_type: lighthouse
- el_client_type: reth
cl_client_type: lodestar
- el_client_type: ethereumjs
cl_client_type: lighthouse
additional_services:
- dora
persistent: true
participants:
- el_client_type: geth
cl_client_type: teku
additional_services: []
persistent: true
...@@ -32,6 +32,7 @@ jobs: ...@@ -32,6 +32,7 @@ jobs:
"./.github/tests/mev.yaml", "./.github/tests/mev.yaml",
"./.github/tests/mev-mock.yaml", "./.github/tests/mev-mock.yaml",
"./.github/tests/mix-with-tools.yaml", "./.github/tests/mix-with-tools.yaml",
"./.github/tests/mix-persistence.yaml",
"./network_params.yaml" "./network_params.yaml"
] ]
runs-on: ubuntu-latest runs-on: ubuntu-latest
......
...@@ -331,6 +331,7 @@ grafana_additional_dashboards: [] ...@@ -331,6 +331,7 @@ grafana_additional_dashboards: []
# Whether the environment should be persistent; this is WIP and is slowly being rolled out accross services # Whether the environment should be persistent; this is WIP and is slowly being rolled out accross services
# Note this requires Kurtosis greater than 0.85.49 to work # Note this requires Kurtosis greater than 0.85.49 to work
# Note Erigon, Besu, Teku persistence is not currently supported with docker.
# Defaults to False # Defaults to False
persistent: False persistent: False
......
...@@ -86,6 +86,7 @@ def run(plan, args={}): ...@@ -86,6 +86,7 @@ def run(plan, args={}):
args_with_right_defaults.participants, args_with_right_defaults.participants,
network_params, network_params,
args_with_right_defaults.global_client_log_level, args_with_right_defaults.global_client_log_level,
persistent,
parallel_keystore_generation, parallel_keystore_generation,
) )
......
...@@ -10,13 +10,11 @@ blobber_launcher = import_module("../../blobber/blobber_launcher.star") ...@@ -10,13 +10,11 @@ blobber_launcher = import_module("../../blobber/blobber_launcher.star")
LIGHTHOUSE_BINARY_COMMAND = "lighthouse" LIGHTHOUSE_BINARY_COMMAND = "lighthouse"
VALIDATOR_KEYS_MOUNTPOINT_ON_CLIENTS = "/validator-keys"
RUST_BACKTRACE_ENVVAR_NAME = "RUST_BACKTRACE" RUST_BACKTRACE_ENVVAR_NAME = "RUST_BACKTRACE"
RUST_FULL_BACKTRACE_KEYWORD = "full" RUST_FULL_BACKTRACE_KEYWORD = "full"
# ---------------------------------- Beacon client ------------------------------------- # ---------------------------------- Beacon client -------------------------------------
CONSENSUS_DATA_DIRPATH_ON_BEACON_SERVICE_CONTAINER = "/consensus-data" BEACON_DATA_DIRPATH_ON_BEACON_SERVICE_CONTAINER = "/data/lighthouse/beacon-data"
# Port IDs # Port IDs
BEACON_TCP_DISCOVERY_PORT_ID = "tcp-discovery" BEACON_TCP_DISCOVERY_PORT_ID = "tcp-discovery"
...@@ -36,6 +34,7 @@ BEACON_MIN_MEMORY = 256 ...@@ -36,6 +34,7 @@ BEACON_MIN_MEMORY = 256
BEACON_MAX_MEMORY = 1024 BEACON_MAX_MEMORY = 1024
# ---------------------------------- Validator client ------------------------------------- # ---------------------------------- Validator client -------------------------------------
VALIDATOR_KEYS_MOUNTPOINT_ON_CLIENTS = "/data/lighthouse/validator-keys"
VALIDATOR_HTTP_PORT_ID = "http" VALIDATOR_HTTP_PORT_ID = "http"
VALIDATOR_METRICS_PORT_ID = "metrics" VALIDATOR_METRICS_PORT_ID = "metrics"
VALIDATOR_HTTP_PORT_NUM = 5042 VALIDATOR_HTTP_PORT_NUM = 5042
...@@ -121,10 +120,11 @@ def launch( ...@@ -121,10 +120,11 @@ def launch(
extra_validator_params, extra_validator_params,
extra_beacon_labels, extra_beacon_labels,
extra_validator_labels, extra_validator_labels,
persistent,
split_mode_enabled=False, split_mode_enabled=False,
): ):
beacon_node_service_name = "{0}".format(service_name) beacon_service_name = "{0}".format(service_name)
validator_node_service_name = "{0}-{1}".format( validator_service_name = "{0}-{1}".format(
service_name, VALIDATOR_SUFFIX_SERVICE_NAME service_name, VALIDATOR_SUFFIX_SERVICE_NAME
) )
...@@ -141,6 +141,7 @@ def launch( ...@@ -141,6 +141,7 @@ def launch(
beacon_config = get_beacon_config( beacon_config = get_beacon_config(
launcher.el_cl_genesis_data, launcher.el_cl_genesis_data,
image, image,
beacon_service_name,
bootnode_contexts, bootnode_contexts,
el_client_context, el_client_context,
log_level, log_level,
...@@ -152,9 +153,10 @@ def launch( ...@@ -152,9 +153,10 @@ def launch(
snooper_engine_context, snooper_engine_context,
extra_beacon_params, extra_beacon_params,
extra_beacon_labels, extra_beacon_labels,
persistent,
) )
beacon_service = plan.add_service(beacon_node_service_name, beacon_config) beacon_service = plan.add_service(beacon_service_name, beacon_config)
beacon_http_port = beacon_service.ports[BEACON_HTTP_PORT_ID] beacon_http_port = beacon_service.ports[BEACON_HTTP_PORT_ID]
beacon_http_url = "http://{0}:{1}".format( beacon_http_url = "http://{0}:{1}".format(
beacon_service.ip_address, beacon_http_port.number beacon_service.ip_address, beacon_http_port.number
...@@ -162,7 +164,7 @@ def launch( ...@@ -162,7 +164,7 @@ def launch(
# Blobber config # Blobber config
if blobber_enabled: if blobber_enabled:
blobber_service_name = "{0}-{1}".format("blobber", beacon_node_service_name) blobber_service_name = "{0}-{1}".format("blobber", beacon_service_name)
blobber_config = blobber_launcher.get_config( blobber_config = blobber_launcher.get_config(
blobber_service_name, blobber_service_name,
node_keystore_files, node_keystore_files,
...@@ -190,6 +192,7 @@ def launch( ...@@ -190,6 +192,7 @@ def launch(
validator_config = get_validator_config( validator_config = get_validator_config(
launcher.el_cl_genesis_data, launcher.el_cl_genesis_data,
image, image,
validator_service_name,
log_level, log_level,
beacon_http_url, beacon_http_url,
el_client_context, el_client_context,
...@@ -198,14 +201,12 @@ def launch( ...@@ -198,14 +201,12 @@ def launch(
v_max_cpu, v_max_cpu,
v_min_mem, v_min_mem,
v_max_mem, v_max_mem,
validator_node_service_name,
extra_validator_params, extra_validator_params,
extra_validator_labels, extra_validator_labels,
persistent,
) )
validator_service = plan.add_service( validator_service = plan.add_service(validator_service_name, validator_config)
validator_node_service_name, validator_config
)
# TODO(old) add validator availability using the validator API: https://ethereum.github.io/beacon-APIs/?urls.primaryName=v1#/ValidatorRequiredApi | from eth2-merge-kurtosis-module # TODO(old) add validator availability using the validator API: https://ethereum.github.io/beacon-APIs/?urls.primaryName=v1#/ValidatorRequiredApi | from eth2-merge-kurtosis-module
beacon_node_identity_recipe = GetHttpRequestRecipe( beacon_node_identity_recipe = GetHttpRequestRecipe(
...@@ -218,7 +219,7 @@ def launch( ...@@ -218,7 +219,7 @@ def launch(
}, },
) )
response = plan.request( response = plan.request(
recipe=beacon_node_identity_recipe, service_name=beacon_node_service_name recipe=beacon_node_identity_recipe, service_name=beacon_service_name
) )
beacon_node_enr = response["extract.enr"] beacon_node_enr = response["extract.enr"]
beacon_multiaddr = response["extract.multiaddr"] beacon_multiaddr = response["extract.multiaddr"]
...@@ -229,7 +230,7 @@ def launch( ...@@ -229,7 +230,7 @@ def launch(
beacon_service.ip_address, beacon_metrics_port.number beacon_service.ip_address, beacon_metrics_port.number
) )
beacon_node_metrics_info = node_metrics.new_node_metrics_info( beacon_node_metrics_info = node_metrics.new_node_metrics_info(
beacon_node_service_name, METRICS_PATH, beacon_metrics_url beacon_service_name, METRICS_PATH, beacon_metrics_url
) )
nodes_metrics_info = [beacon_node_metrics_info] nodes_metrics_info = [beacon_node_metrics_info]
...@@ -239,7 +240,7 @@ def launch( ...@@ -239,7 +240,7 @@ def launch(
validator_service.ip_address, validator_metrics_port.number validator_service.ip_address, validator_metrics_port.number
) )
validator_node_metrics_info = node_metrics.new_node_metrics_info( validator_node_metrics_info = node_metrics.new_node_metrics_info(
validator_node_service_name, METRICS_PATH, validator_metrics_url validator_service_name, METRICS_PATH, validator_metrics_url
) )
nodes_metrics_info.append(validator_node_metrics_info) nodes_metrics_info.append(validator_node_metrics_info)
...@@ -249,8 +250,8 @@ def launch( ...@@ -249,8 +250,8 @@ def launch(
beacon_service.ip_address, beacon_service.ip_address,
BEACON_HTTP_PORT_NUM, BEACON_HTTP_PORT_NUM,
nodes_metrics_info, nodes_metrics_info,
beacon_node_service_name, beacon_service_name,
validator_node_service_name, validator_service_name,
beacon_multiaddr, beacon_multiaddr,
beacon_peer_id, beacon_peer_id,
snooper_enabled, snooper_enabled,
...@@ -264,6 +265,7 @@ def launch( ...@@ -264,6 +265,7 @@ def launch(
def get_beacon_config( def get_beacon_config(
el_cl_genesis_data, el_cl_genesis_data,
image, image,
service_name,
boot_cl_client_ctxs, boot_cl_client_ctxs,
el_client_context, el_client_context,
log_level, log_level,
...@@ -275,6 +277,7 @@ def get_beacon_config( ...@@ -275,6 +277,7 @@ def get_beacon_config(
snooper_engine_context, snooper_engine_context,
extra_params, extra_params,
extra_labels, extra_labels,
persistent,
): ):
# If snooper is enabled use the snooper engine context, otherwise use the execution client context # If snooper is enabled use the snooper engine context, otherwise use the execution client context
if snooper_enabled: if snooper_enabled:
...@@ -300,7 +303,7 @@ def get_beacon_config( ...@@ -300,7 +303,7 @@ def get_beacon_config(
LIGHTHOUSE_BINARY_COMMAND, LIGHTHOUSE_BINARY_COMMAND,
"beacon_node", "beacon_node",
"--debug-level=" + log_level, "--debug-level=" + log_level,
"--datadir=" + CONSENSUS_DATA_DIRPATH_ON_BEACON_SERVICE_CONTAINER, "--datadir=" + BEACON_DATA_DIRPATH_ON_BEACON_SERVICE_CONTAINER,
"--testnet-dir=" + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER, "--testnet-dir=" + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER,
# vvvvvvvvvvvvvvvvvvv REMOVE THESE WHEN CONNECTING TO EXTERNAL NET vvvvvvvvvvvvvvvvvvvvv # vvvvvvvvvvvvvvvvvvv REMOVE THESE WHEN CONNECTING TO EXTERNAL NET vvvvvvvvvvvvvvvvvvvvv
"--disable-enr-auto-update", "--disable-enr-auto-update",
...@@ -358,14 +361,19 @@ def get_beacon_config( ...@@ -358,14 +361,19 @@ def get_beacon_config(
recipe = GetHttpRequestRecipe( recipe = GetHttpRequestRecipe(
endpoint="/eth/v1/node/identity", port_id=BEACON_HTTP_PORT_ID endpoint="/eth/v1/node/identity", port_id=BEACON_HTTP_PORT_ID
) )
files = {
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid
}
if persistent:
files[BEACON_DATA_DIRPATH_ON_BEACON_SERVICE_CONTAINER] = Directory(
persistent_key="data-{0}".format(service_name),
)
return ServiceConfig( return ServiceConfig(
image=image, image=image,
ports=BEACON_USED_PORTS, ports=BEACON_USED_PORTS,
cmd=cmd, cmd=cmd,
files={ files=files,
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid
},
env_vars={RUST_BACKTRACE_ENVVAR_NAME: RUST_FULL_BACKTRACE_KEYWORD}, env_vars={RUST_BACKTRACE_ENVVAR_NAME: RUST_FULL_BACKTRACE_KEYWORD},
private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER, private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER,
ready_conditions=cl_node_ready_conditions.get_ready_conditions( ready_conditions=cl_node_ready_conditions.get_ready_conditions(
...@@ -388,6 +396,7 @@ def get_beacon_config( ...@@ -388,6 +396,7 @@ def get_beacon_config(
def get_validator_config( def get_validator_config(
el_cl_genesis_data, el_cl_genesis_data,
image, image,
service_name,
log_level, log_level,
beacon_client_http_url, beacon_client_http_url,
el_client_context, el_client_context,
...@@ -396,9 +405,9 @@ def get_validator_config( ...@@ -396,9 +405,9 @@ def get_validator_config(
v_max_cpu, v_max_cpu,
v_min_mem, v_min_mem,
v_max_mem, v_max_mem,
validator_node_service_name,
extra_params, extra_params,
extra_labels, extra_labels,
persistent,
): ):
validator_keys_dirpath = shared_utils.path_join( validator_keys_dirpath = shared_utils.path_join(
VALIDATOR_KEYS_MOUNTPOINT_ON_CLIENTS, VALIDATOR_KEYS_MOUNTPOINT_ON_CLIENTS,
...@@ -442,14 +451,16 @@ def get_validator_config( ...@@ -442,14 +451,16 @@ def get_validator_config(
if len(extra_params): if len(extra_params):
cmd.extend([param for param in extra_params]) cmd.extend([param for param in extra_params])
files = {
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
VALIDATOR_KEYS_MOUNTPOINT_ON_CLIENTS: node_keystore_files.files_artifact_uuid,
}
return ServiceConfig( return ServiceConfig(
image=image, image=image,
ports=VALIDATOR_USED_PORTS, ports=VALIDATOR_USED_PORTS,
cmd=cmd, cmd=cmd,
files={ files=files,
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
VALIDATOR_KEYS_MOUNTPOINT_ON_CLIENTS: node_keystore_files.files_artifact_uuid,
},
env_vars={RUST_BACKTRACE_ENVVAR_NAME: RUST_FULL_BACKTRACE_KEYWORD}, env_vars={RUST_BACKTRACE_ENVVAR_NAME: RUST_FULL_BACKTRACE_KEYWORD},
min_cpu=v_min_cpu, min_cpu=v_min_cpu,
max_cpu=v_max_cpu, max_cpu=v_max_cpu,
......
...@@ -7,7 +7,7 @@ blobber_launcher = import_module("../../blobber/blobber_launcher.star") ...@@ -7,7 +7,7 @@ blobber_launcher = import_module("../../blobber/blobber_launcher.star")
constants = import_module("../../package_io/constants.star") constants = import_module("../../package_io/constants.star")
# ---------------------------------- Beacon client ------------------------------------- # ---------------------------------- Beacon client -------------------------------------
CONSENSUS_DATA_DIRPATH_ON_SERVICE_CONTAINER = "/consensus-data" BEACON_DATA_DIRPATH_ON_SERVICE_CONTAINER = "/data/lodestar/beacon-data"
# Port IDs # Port IDs
TCP_DISCOVERY_PORT_ID = "tcp-discovery" TCP_DISCOVERY_PORT_ID = "tcp-discovery"
UDP_DISCOVERY_PORT_ID = "udp-discovery" UDP_DISCOVERY_PORT_ID = "udp-discovery"
...@@ -28,6 +28,7 @@ BEACON_MAX_MEMORY = 1024 ...@@ -28,6 +28,7 @@ BEACON_MAX_MEMORY = 1024
# ---------------------------------- Validator client ------------------------------------- # ---------------------------------- Validator client -------------------------------------
VALIDATOR_KEYS_MOUNT_DIRPATH_ON_SERVICE_CONTAINER = "/validator-keys" VALIDATOR_KEYS_MOUNT_DIRPATH_ON_SERVICE_CONTAINER = "/validator-keys"
VALIDATOR_DATA_DIRPATH_ON_SERVICE_CONTAINER = "/data/lodestar/validator-data"
# The min/max CPU/memory that the validator node can use # The min/max CPU/memory that the validator node can use
VALIDATOR_MIN_CPU = 50 VALIDATOR_MIN_CPU = 50
VALIDATOR_MAX_CPU = 300 VALIDATOR_MAX_CPU = 300
...@@ -97,10 +98,11 @@ def launch( ...@@ -97,10 +98,11 @@ def launch(
extra_validator_params, extra_validator_params,
extra_beacon_labels, extra_beacon_labels,
extra_validator_labels, extra_validator_labels,
persistent,
split_mode_enabled=False, split_mode_enabled=False,
): ):
beacon_node_service_name = "{0}".format(service_name) beacon_service_name = "{0}".format(service_name)
validator_node_service_name = "{0}-{1}".format( validator_service_name = "{0}-{1}".format(
service_name, VALIDATOR_SUFFIX_SERVICE_NAME service_name, VALIDATOR_SUFFIX_SERVICE_NAME
) )
log_level = input_parser.get_client_log_level_or_default( log_level = input_parser.get_client_log_level_or_default(
...@@ -116,6 +118,7 @@ def launch( ...@@ -116,6 +118,7 @@ def launch(
beacon_config = get_beacon_config( beacon_config = get_beacon_config(
launcher.el_cl_genesis_data, launcher.el_cl_genesis_data,
image, image,
beacon_service_name,
bootnode_contexts, bootnode_contexts,
el_client_context, el_client_context,
log_level, log_level,
...@@ -127,9 +130,10 @@ def launch( ...@@ -127,9 +130,10 @@ def launch(
snooper_engine_context, snooper_engine_context,
extra_beacon_params, extra_beacon_params,
extra_beacon_labels, extra_beacon_labels,
persistent,
) )
beacon_service = plan.add_service(beacon_node_service_name, beacon_config) beacon_service = plan.add_service(beacon_service_name, beacon_config)
beacon_http_port = beacon_service.ports[BEACON_HTTP_PORT_ID] beacon_http_port = beacon_service.ports[BEACON_HTTP_PORT_ID]
...@@ -139,7 +143,7 @@ def launch( ...@@ -139,7 +143,7 @@ def launch(
# Blobber config # Blobber config
if blobber_enabled: if blobber_enabled:
blobber_service_name = "{0}-{1}".format("blobber", beacon_node_service_name) blobber_service_name = "{0}-{1}".format("blobber", beacon_service_name)
blobber_config = blobber_launcher.get_config( blobber_config = blobber_launcher.get_config(
blobber_service_name, blobber_service_name,
node_keystore_files, node_keystore_files,
...@@ -163,9 +167,9 @@ def launch( ...@@ -163,9 +167,9 @@ def launch(
v_min_mem = int(v_min_mem) if int(v_min_mem) > 0 else VALIDATOR_MIN_MEMORY v_min_mem = int(v_min_mem) if int(v_min_mem) > 0 else VALIDATOR_MIN_MEMORY
v_max_mem = int(v_max_mem) if int(v_max_mem) > 0 else VALIDATOR_MAX_MEMORY v_max_mem = int(v_max_mem) if int(v_max_mem) > 0 else VALIDATOR_MAX_MEMORY
validator_config = get_validator_config( validator_config = get_validator_config(
validator_node_service_name,
launcher.el_cl_genesis_data, launcher.el_cl_genesis_data,
image, image,
validator_service_name,
log_level, log_level,
beacon_http_url, beacon_http_url,
el_client_context, el_client_context,
...@@ -174,12 +178,12 @@ def launch( ...@@ -174,12 +178,12 @@ def launch(
v_max_cpu, v_max_cpu,
v_min_mem, v_min_mem,
v_max_mem, v_max_mem,
validator_node_service_name,
extra_validator_params, extra_validator_params,
extra_validator_labels, extra_validator_labels,
persistent,
) )
plan.add_service(validator_node_service_name, validator_config) plan.add_service(validator_service_name, validator_config)
# TODO(old) add validator availability using the validator API: https://ethereum.github.io/beacon-APIs/?urls.primaryName=v1#/ValidatorRequiredApi | from eth2-merge-kurtosis-module # TODO(old) add validator availability using the validator API: https://ethereum.github.io/beacon-APIs/?urls.primaryName=v1#/ValidatorRequiredApi | from eth2-merge-kurtosis-module
...@@ -193,7 +197,7 @@ def launch( ...@@ -193,7 +197,7 @@ def launch(
}, },
) )
response = plan.request( response = plan.request(
recipe=beacon_node_identity_recipe, service_name=beacon_node_service_name recipe=beacon_node_identity_recipe, service_name=beacon_service_name
) )
beacon_node_enr = response["extract.enr"] beacon_node_enr = response["extract.enr"]
beacon_multiaddr = response["extract.multiaddr"] beacon_multiaddr = response["extract.multiaddr"]
...@@ -215,8 +219,8 @@ def launch( ...@@ -215,8 +219,8 @@ def launch(
beacon_service.ip_address, beacon_service.ip_address,
HTTP_PORT_NUM, HTTP_PORT_NUM,
nodes_metrics_info, nodes_metrics_info,
beacon_node_service_name, beacon_service_name,
validator_node_service_name, validator_service_name,
beacon_multiaddr, beacon_multiaddr,
beacon_peer_id, beacon_peer_id,
snooper_enabled, snooper_enabled,
...@@ -230,6 +234,7 @@ def launch( ...@@ -230,6 +234,7 @@ def launch(
def get_beacon_config( def get_beacon_config(
el_cl_genesis_data, el_cl_genesis_data,
image, image,
service_name,
bootnode_contexts, bootnode_contexts,
el_client_context, el_client_context,
log_level, log_level,
...@@ -241,6 +246,7 @@ def get_beacon_config( ...@@ -241,6 +246,7 @@ def get_beacon_config(
snooper_engine_context, snooper_engine_context,
extra_params, extra_params,
extra_labels, extra_labels,
persistent,
): ):
el_client_rpc_url_str = "http://{0}:{1}".format( el_client_rpc_url_str = "http://{0}:{1}".format(
el_client_context.ip_addr, el_client_context.ip_addr,
...@@ -264,7 +270,7 @@ def get_beacon_config( ...@@ -264,7 +270,7 @@ def get_beacon_config(
"--logLevel=" + log_level, "--logLevel=" + log_level,
"--port={0}".format(DISCOVERY_PORT_NUM), "--port={0}".format(DISCOVERY_PORT_NUM),
"--discoveryPort={0}".format(DISCOVERY_PORT_NUM), "--discoveryPort={0}".format(DISCOVERY_PORT_NUM),
"--dataDir=" + CONSENSUS_DATA_DIRPATH_ON_SERVICE_CONTAINER, "--dataDir=" + BEACON_DATA_DIRPATH_ON_SERVICE_CONTAINER,
"--paramsFile=" "--paramsFile="
+ constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER
+ "/config.yaml", + "/config.yaml",
...@@ -306,14 +312,19 @@ def get_beacon_config( ...@@ -306,14 +312,19 @@ def get_beacon_config(
if len(extra_params) > 0: if len(extra_params) > 0:
# this is a repeated<proto type>, we convert it into Starlark # this is a repeated<proto type>, we convert it into Starlark
cmd.extend([param for param in extra_params]) cmd.extend([param for param in extra_params])
files = {
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid
}
if persistent:
files[BEACON_DATA_DIRPATH_ON_SERVICE_CONTAINER] = Directory(
persistent_key="data-{0}".format(service_name)
)
return ServiceConfig( return ServiceConfig(
image=image, image=image,
ports=BEACON_USED_PORTS, ports=BEACON_USED_PORTS,
cmd=cmd, cmd=cmd,
files={ files=files,
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid
},
private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER, private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER,
ready_conditions=cl_node_ready_conditions.get_ready_conditions( ready_conditions=cl_node_ready_conditions.get_ready_conditions(
BEACON_HTTP_PORT_ID BEACON_HTTP_PORT_ID
...@@ -333,9 +344,9 @@ def get_beacon_config( ...@@ -333,9 +344,9 @@ def get_beacon_config(
def get_validator_config( def get_validator_config(
service_name,
el_cl_genesis_data, el_cl_genesis_data,
image, image,
service_name,
log_level, log_level,
beacon_client_http_url, beacon_client_http_url,
el_client_context, el_client_context,
...@@ -344,12 +355,12 @@ def get_validator_config( ...@@ -344,12 +355,12 @@ def get_validator_config(
v_max_cpu, v_max_cpu,
v_min_mem, v_min_mem,
v_max_mem, v_max_mem,
validator_node_service_name,
extra_params, extra_params,
extra_labels, extra_labels,
persistent,
): ):
root_dirpath = shared_utils.path_join( root_dirpath = shared_utils.path_join(
CONSENSUS_DATA_DIRPATH_ON_SERVICE_CONTAINER, service_name VALIDATOR_DATA_DIRPATH_ON_SERVICE_CONTAINER, service_name
) )
validator_keys_dirpath = shared_utils.path_join( validator_keys_dirpath = shared_utils.path_join(
...@@ -365,7 +376,7 @@ def get_validator_config( ...@@ -365,7 +376,7 @@ def get_validator_config(
cmd = [ cmd = [
"validator", "validator",
"--logLevel=" + log_level, "--logLevel=" + log_level,
"--dataDir=" + root_dirpath, # "--dataDir=" + root_dirpath,
"--paramsFile=" "--paramsFile="
+ constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER
+ "/config.yaml", + "/config.yaml",
...@@ -388,14 +399,16 @@ def get_validator_config( ...@@ -388,14 +399,16 @@ def get_validator_config(
# this is a repeated<proto type>, we convert it into Starlark # this is a repeated<proto type>, we convert it into Starlark
cmd.extend([param for param in extra_params]) cmd.extend([param for param in extra_params])
files = {
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
VALIDATOR_KEYS_MOUNT_DIRPATH_ON_SERVICE_CONTAINER: node_keystore_files.files_artifact_uuid,
}
return ServiceConfig( return ServiceConfig(
image=image, image=image,
ports=VALIDATOR_USED_PORTS, ports=VALIDATOR_USED_PORTS,
cmd=cmd, cmd=cmd,
files={ files=files,
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
VALIDATOR_KEYS_MOUNT_DIRPATH_ON_SERVICE_CONTAINER: node_keystore_files.files_artifact_uuid,
},
private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER, private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER,
min_cpu=v_min_cpu, min_cpu=v_min_cpu,
max_cpu=v_max_cpu, max_cpu=v_max_cpu,
......
...@@ -51,7 +51,7 @@ VALIDATOR_METRICS_PATH = "/metrics" ...@@ -51,7 +51,7 @@ VALIDATOR_METRICS_PATH = "/metrics"
# Nimbus requires that its data directory already exists (because it expects you to bind-mount it), so we # Nimbus requires that its data directory already exists (because it expects you to bind-mount it), so we
# have to to create it # have to to create it
CONSENSUS_DATA_DIRPATH_IN_SERVICE_CONTAINER = "$HOME/consensus-data" BEACON_DATA_DIRPATH_ON_SERVICE_CONTAINER = "/data/beacon-data"
# Nimbus wants the data dir to have these perms # Nimbus wants the data dir to have these perms
CONSENSUS_DATA_DIR_PERMS_STR = "0700" CONSENSUS_DATA_DIR_PERMS_STR = "0700"
...@@ -137,10 +137,11 @@ def launch( ...@@ -137,10 +137,11 @@ def launch(
extra_validator_params, extra_validator_params,
extra_beacon_labels, extra_beacon_labels,
extra_validator_labels, extra_validator_labels,
persistent,
split_mode_enabled, split_mode_enabled,
): ):
beacon_node_service_name = "{0}".format(service_name) beacon_service_name = "{0}".format(service_name)
validator_node_service_name = "{0}-{1}".format( validator_service_name = "{0}-{1}".format(
service_name, VALIDATOR_SUFFIX_SERVICE_NAME service_name, VALIDATOR_SUFFIX_SERVICE_NAME
) )
...@@ -156,6 +157,7 @@ def launch( ...@@ -156,6 +157,7 @@ def launch(
beacon_config = get_beacon_config( beacon_config = get_beacon_config(
launcher.el_cl_genesis_data, launcher.el_cl_genesis_data,
image, image,
beacon_service_name,
bootnode_contexts, bootnode_contexts,
el_client_context, el_client_context,
log_level, log_level,
...@@ -164,15 +166,15 @@ def launch( ...@@ -164,15 +166,15 @@ def launch(
bn_max_cpu, bn_max_cpu,
bn_min_mem, bn_min_mem,
bn_max_mem, bn_max_mem,
beacon_node_service_name,
snooper_enabled, snooper_enabled,
snooper_engine_context, snooper_engine_context,
extra_beacon_params, extra_beacon_params,
extra_beacon_labels, extra_beacon_labels,
split_mode_enabled, split_mode_enabled,
persistent,
) )
beacon_service = plan.add_service(beacon_node_service_name, beacon_config) beacon_service = plan.add_service(beacon_service_name, beacon_config)
beacon_http_port = beacon_service.ports[BEACON_HTTP_PORT_ID] beacon_http_port = beacon_service.ports[BEACON_HTTP_PORT_ID]
beacon_metrics_port = beacon_service.ports[BEACON_METRICS_PORT_ID] beacon_metrics_port = beacon_service.ports[BEACON_METRICS_PORT_ID]
beacon_http_url = "http://{0}:{1}".format( beacon_http_url = "http://{0}:{1}".format(
...@@ -214,6 +216,7 @@ def launch( ...@@ -214,6 +216,7 @@ def launch(
validator_config = get_validator_config( validator_config = get_validator_config(
launcher.el_cl_genesis_data, launcher.el_cl_genesis_data,
image, image,
validator_service_name,
log_level, log_level,
beacon_http_url, beacon_http_url,
el_client_context, el_client_context,
...@@ -222,14 +225,12 @@ def launch( ...@@ -222,14 +225,12 @@ def launch(
v_max_cpu, v_max_cpu,
v_min_mem, v_min_mem,
v_max_mem, v_max_mem,
validator_node_service_name,
extra_validator_params, extra_validator_params,
extra_validator_labels, extra_validator_labels,
persistent,
) )
validator_service = plan.add_service( validator_service = plan.add_service(validator_service_name, validator_config)
validator_node_service_name, validator_config
)
if validator_service: if validator_service:
validator_metrics_port = validator_service.ports[VALIDATOR_METRICS_PORT_ID] validator_metrics_port = validator_service.ports[VALIDATOR_METRICS_PORT_ID]
...@@ -237,7 +238,7 @@ def launch( ...@@ -237,7 +238,7 @@ def launch(
validator_service.ip_address, validator_metrics_port.number validator_service.ip_address, validator_metrics_port.number
) )
validator_node_metrics_info = node_metrics.new_node_metrics_info( validator_node_metrics_info = node_metrics.new_node_metrics_info(
validator_node_service_name, VALIDATOR_METRICS_PATH, validator_metrics_url validator_service_name, VALIDATOR_METRICS_PATH, validator_metrics_url
) )
nodes_metrics_info.append(validator_node_metrics_info) nodes_metrics_info.append(validator_node_metrics_info)
...@@ -247,8 +248,8 @@ def launch( ...@@ -247,8 +248,8 @@ def launch(
beacon_service.ip_address, beacon_service.ip_address,
BEACON_HTTP_PORT_NUM, BEACON_HTTP_PORT_NUM,
nodes_metrics_info, nodes_metrics_info,
beacon_node_service_name, beacon_service_name,
validator_node_service_name, validator_service_name,
beacon_multiaddr, beacon_multiaddr,
beacon_peer_id, beacon_peer_id,
snooper_enabled, snooper_enabled,
...@@ -262,6 +263,7 @@ def launch( ...@@ -262,6 +263,7 @@ def launch(
def get_beacon_config( def get_beacon_config(
el_cl_genesis_data, el_cl_genesis_data,
image, image,
service_name,
bootnode_contexts, bootnode_contexts,
el_client_context, el_client_context,
log_level, log_level,
...@@ -270,12 +272,12 @@ def get_beacon_config( ...@@ -270,12 +272,12 @@ def get_beacon_config(
bn_max_cpu, bn_max_cpu,
bn_min_mem, bn_min_mem,
bn_max_mem, bn_max_mem,
beacon_node_service_name,
snooper_enabled, snooper_enabled,
snooper_engine_context, snooper_engine_context,
extra_params, extra_params,
extra_labels, extra_labels,
split_mode_enabled, split_mode_enabled,
persistent,
): ):
validator_keys_dirpath = "" validator_keys_dirpath = ""
validator_secrets_dirpath = "" validator_secrets_dirpath = ""
...@@ -306,7 +308,7 @@ def get_beacon_config( ...@@ -306,7 +308,7 @@ def get_beacon_config(
"--udp-port={0}".format(BEACON_DISCOVERY_PORT_NUM), "--udp-port={0}".format(BEACON_DISCOVERY_PORT_NUM),
"--tcp-port={0}".format(BEACON_DISCOVERY_PORT_NUM), "--tcp-port={0}".format(BEACON_DISCOVERY_PORT_NUM),
"--network=" + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER, "--network=" + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER,
"--data-dir=" + CONSENSUS_DATA_DIRPATH_IN_SERVICE_CONTAINER, "--data-dir=" + BEACON_DATA_DIRPATH_ON_SERVICE_CONTAINER,
"--web3-url=" + EXECUTION_ENGINE_ENDPOINT, "--web3-url=" + EXECUTION_ENGINE_ENDPOINT,
"--nat=extip:" + PRIVATE_IP_ADDRESS_PLACEHOLDER, "--nat=extip:" + PRIVATE_IP_ADDRESS_PLACEHOLDER,
"--enr-auto-update=false", "--enr-auto-update=false",
...@@ -364,6 +366,11 @@ def get_beacon_config( ...@@ -364,6 +366,11 @@ def get_beacon_config(
VALIDATOR_KEYS_MOUNTPOINT_ON_CLIENTS VALIDATOR_KEYS_MOUNTPOINT_ON_CLIENTS
] = node_keystore_files.files_artifact_uuid ] = node_keystore_files.files_artifact_uuid
if persistent:
files[BEACON_DATA_DIRPATH_ON_SERVICE_CONTAINER] = Directory(
persistent_key="data-{0}".format(service_name)
)
return ServiceConfig( return ServiceConfig(
image=image, image=image,
ports=BEACON_USED_PORTS, ports=BEACON_USED_PORTS,
...@@ -390,6 +397,7 @@ def get_beacon_config( ...@@ -390,6 +397,7 @@ def get_beacon_config(
def get_validator_config( def get_validator_config(
el_cl_genesis_data, el_cl_genesis_data,
image, image,
service_name,
log_level, log_level,
beacon_http_url, beacon_http_url,
el_client_context, el_client_context,
...@@ -398,9 +406,9 @@ def get_validator_config( ...@@ -398,9 +406,9 @@ def get_validator_config(
v_max_cpu, v_max_cpu,
v_min_mem, v_min_mem,
v_max_mem, v_max_mem,
validator_node_service_name,
extra_params, extra_params,
extra_labels, extra_labels,
persistent,
): ):
validator_keys_dirpath = "" validator_keys_dirpath = ""
validator_secrets_dirpath = "" validator_secrets_dirpath = ""
...@@ -432,14 +440,16 @@ def get_validator_config( ...@@ -432,14 +440,16 @@ def get_validator_config(
if len(extra_params) > 0: if len(extra_params) > 0:
cmd.extend([param for param in extra_params if param != "--split=true"]) cmd.extend([param for param in extra_params if param != "--split=true"])
files = {
VALIDATOR_KEYS_MOUNTPOINT_ON_CLIENTS: node_keystore_files.files_artifact_uuid,
}
return ServiceConfig( return ServiceConfig(
image=image, image=image,
ports=VALIDATOR_USED_PORTS, ports=VALIDATOR_USED_PORTS,
cmd=cmd, cmd=cmd,
entrypoint=DEFAULT_VALIDATOR_IMAGE_ENTRYPOINT, entrypoint=DEFAULT_VALIDATOR_IMAGE_ENTRYPOINT,
files={ files=files,
VALIDATOR_KEYS_MOUNTPOINT_ON_CLIENTS: node_keystore_files.files_artifact_uuid
},
private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER, private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER,
min_cpu=v_min_cpu, min_cpu=v_min_cpu,
max_cpu=v_max_cpu, max_cpu=v_max_cpu,
......
...@@ -8,7 +8,7 @@ IMAGE_SEPARATOR_DELIMITER = "," ...@@ -8,7 +8,7 @@ IMAGE_SEPARATOR_DELIMITER = ","
EXPECTED_NUM_IMAGES = 2 EXPECTED_NUM_IMAGES = 2
# ---------------------------------- Beacon client ------------------------------------- # ---------------------------------- Beacon client -------------------------------------
CONSENSUS_DATA_DIRPATH_ON_SERVICE_CONTAINER = "/consensus-data" BEACON_DATA_DIRPATH_ON_SERVICE_CONTAINER = "/data/prysm/beacon-data/"
# Port IDs # Port IDs
TCP_DISCOVERY_PORT_ID = "tcp-discovery" TCP_DISCOVERY_PORT_ID = "tcp-discovery"
...@@ -31,6 +31,7 @@ BEACON_MIN_MEMORY = 256 ...@@ -31,6 +31,7 @@ BEACON_MIN_MEMORY = 256
BEACON_MAX_MEMORY = 1024 BEACON_MAX_MEMORY = 1024
# ---------------------------------- Validator client ------------------------------------- # ---------------------------------- Validator client -------------------------------------
VALIDATOR_DATA_DIRPATH_ON_SERVICE_CONTAINER = "/data/prysm/validator-data/"
VALIDATOR_KEYS_MOUNT_DIRPATH_ON_SERVICE_CONTAINER = "/validator-keys" VALIDATOR_KEYS_MOUNT_DIRPATH_ON_SERVICE_CONTAINER = "/validator-keys"
PRYSM_PASSWORD_MOUNT_DIRPATH_ON_SERVICE_CONTAINER = "/prysm-password" PRYSM_PASSWORD_MOUNT_DIRPATH_ON_SERVICE_CONTAINER = "/prysm-password"
...@@ -109,6 +110,7 @@ def launch( ...@@ -109,6 +110,7 @@ def launch(
extra_validator_params, extra_validator_params,
extra_beacon_labels, extra_beacon_labels,
extra_validator_labels, extra_validator_labels,
persistent,
split_mode_enabled=False, split_mode_enabled=False,
): ):
split_images = images.split(IMAGE_SEPARATOR_DELIMITER) split_images = images.split(IMAGE_SEPARATOR_DELIMITER)
...@@ -126,8 +128,8 @@ def launch( ...@@ -126,8 +128,8 @@ def launch(
if validator_image.strip() == "": if validator_image.strip() == "":
fail("An empty validator image was provided") fail("An empty validator image was provided")
beacon_node_service_name = "{0}".format(service_name) beacon_service_name = "{0}".format(service_name)
validator_node_service_name = "{0}-{1}".format( validator_service_name = "{0}-{1}".format(
service_name, VALIDATOR_SUFFIX_SERVICE_NAME service_name, VALIDATOR_SUFFIX_SERVICE_NAME
) )
log_level = input_parser.get_client_log_level_or_default( log_level = input_parser.get_client_log_level_or_default(
...@@ -142,6 +144,7 @@ def launch( ...@@ -142,6 +144,7 @@ def launch(
beacon_config = get_beacon_config( beacon_config = get_beacon_config(
launcher.el_cl_genesis_data, launcher.el_cl_genesis_data,
beacon_image, beacon_image,
beacon_service_name,
bootnode_contexts, bootnode_contexts,
el_client_context, el_client_context,
log_level, log_level,
...@@ -153,9 +156,10 @@ def launch( ...@@ -153,9 +156,10 @@ def launch(
snooper_engine_context, snooper_engine_context,
extra_beacon_params, extra_beacon_params,
extra_beacon_labels, extra_beacon_labels,
persistent,
) )
beacon_service = plan.add_service(beacon_node_service_name, beacon_config) beacon_service = plan.add_service(beacon_service_name, beacon_config)
beacon_http_port = beacon_service.ports[BEACON_HTTP_PORT_ID] beacon_http_port = beacon_service.ports[BEACON_HTTP_PORT_ID]
...@@ -172,7 +176,7 @@ def launch( ...@@ -172,7 +176,7 @@ def launch(
validator_config = get_validator_config( validator_config = get_validator_config(
launcher.el_cl_genesis_data, launcher.el_cl_genesis_data,
validator_image, validator_image,
validator_node_service_name, validator_service_name,
log_level, log_level,
beacon_rpc_endpoint, beacon_rpc_endpoint,
beacon_http_endpoint, beacon_http_endpoint,
...@@ -186,11 +190,10 @@ def launch( ...@@ -186,11 +190,10 @@ def launch(
extra_validator_labels, extra_validator_labels,
launcher.prysm_password_relative_filepath, launcher.prysm_password_relative_filepath,
launcher.prysm_password_artifact_uuid, launcher.prysm_password_artifact_uuid,
persistent,
) )
validator_service = plan.add_service( validator_service = plan.add_service(validator_service_name, validator_config)
validator_node_service_name, validator_config
)
# TODO(old) add validator availability using the validator API: https://ethereum.github.io/beacon-APIs/?urls.primaryName=v1#/ValidatorRequiredApi | from eth2-merge-kurtosis-module # TODO(old) add validator availability using the validator API: https://ethereum.github.io/beacon-APIs/?urls.primaryName=v1#/ValidatorRequiredApi | from eth2-merge-kurtosis-module
beacon_node_identity_recipe = GetHttpRequestRecipe( beacon_node_identity_recipe = GetHttpRequestRecipe(
...@@ -203,7 +206,7 @@ def launch( ...@@ -203,7 +206,7 @@ def launch(
}, },
) )
response = plan.request( response = plan.request(
recipe=beacon_node_identity_recipe, service_name=beacon_node_service_name recipe=beacon_node_identity_recipe, service_name=beacon_service_name
) )
beacon_node_enr = response["extract.enr"] beacon_node_enr = response["extract.enr"]
beacon_multiaddr = response["extract.multiaddr"] beacon_multiaddr = response["extract.multiaddr"]
...@@ -214,7 +217,7 @@ def launch( ...@@ -214,7 +217,7 @@ def launch(
beacon_service.ip_address, beacon_metrics_port.number beacon_service.ip_address, beacon_metrics_port.number
) )
beacon_node_metrics_info = node_metrics.new_node_metrics_info( beacon_node_metrics_info = node_metrics.new_node_metrics_info(
beacon_node_service_name, METRICS_PATH, beacon_metrics_url beacon_service_name, METRICS_PATH, beacon_metrics_url
) )
nodes_metrics_info = [beacon_node_metrics_info] nodes_metrics_info = [beacon_node_metrics_info]
...@@ -224,7 +227,7 @@ def launch( ...@@ -224,7 +227,7 @@ def launch(
validator_service.ip_address, validator_metrics_port.number validator_service.ip_address, validator_metrics_port.number
) )
validator_node_metrics_info = node_metrics.new_node_metrics_info( validator_node_metrics_info = node_metrics.new_node_metrics_info(
validator_node_service_name, METRICS_PATH, validator_metrics_url validator_service_name, METRICS_PATH, validator_metrics_url
) )
nodes_metrics_info.append(validator_node_metrics_info) nodes_metrics_info.append(validator_node_metrics_info)
...@@ -234,8 +237,8 @@ def launch( ...@@ -234,8 +237,8 @@ def launch(
beacon_service.ip_address, beacon_service.ip_address,
HTTP_PORT_NUM, HTTP_PORT_NUM,
nodes_metrics_info, nodes_metrics_info,
beacon_node_service_name, beacon_service_name,
validator_node_service_name, validator_service_name,
beacon_multiaddr, beacon_multiaddr,
beacon_peer_id, beacon_peer_id,
snooper_enabled, snooper_enabled,
...@@ -249,6 +252,7 @@ def launch( ...@@ -249,6 +252,7 @@ def launch(
def get_beacon_config( def get_beacon_config(
el_cl_genesis_data, el_cl_genesis_data,
beacon_image, beacon_image,
service_name,
bootnode_contexts, bootnode_contexts,
el_client_context, el_client_context,
log_level, log_level,
...@@ -260,6 +264,7 @@ def get_beacon_config( ...@@ -260,6 +264,7 @@ def get_beacon_config(
snooper_engine_context, snooper_engine_context,
extra_params, extra_params,
extra_labels, extra_labels,
persistent,
): ):
# If snooper is enabled use the snooper engine context, otherwise use the execution client context # If snooper is enabled use the snooper engine context, otherwise use the execution client context
if snooper_enabled: if snooper_enabled:
...@@ -275,7 +280,7 @@ def get_beacon_config( ...@@ -275,7 +280,7 @@ def get_beacon_config(
cmd = [ cmd = [
"--accept-terms-of-use=true", # it's mandatory in order to run the node "--accept-terms-of-use=true", # it's mandatory in order to run the node
"--datadir=" + CONSENSUS_DATA_DIRPATH_ON_SERVICE_CONTAINER, "--datadir=" + BEACON_DATA_DIRPATH_ON_SERVICE_CONTAINER,
"--chain-config-file=" "--chain-config-file="
+ constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER
+ "/config.yaml", + "/config.yaml",
...@@ -316,13 +321,20 @@ def get_beacon_config( ...@@ -316,13 +321,20 @@ def get_beacon_config(
# we do the for loop as otherwise its a proto repeated array # we do the for loop as otherwise its a proto repeated array
cmd.extend([param for param in extra_params]) cmd.extend([param for param in extra_params])
files = {
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid
}
if persistent:
files[BEACON_DATA_DIRPATH_ON_SERVICE_CONTAINER] = Directory(
persistent_key="data-{0}".format(service_name)
)
return ServiceConfig( return ServiceConfig(
image=beacon_image, image=beacon_image,
ports=BEACON_NODE_USED_PORTS, ports=BEACON_NODE_USED_PORTS,
cmd=cmd, cmd=cmd,
files={ files=files,
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
},
private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER, private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER,
ready_conditions=cl_node_ready_conditions.get_ready_conditions( ready_conditions=cl_node_ready_conditions.get_ready_conditions(
BEACON_HTTP_PORT_ID BEACON_HTTP_PORT_ID
...@@ -358,6 +370,7 @@ def get_validator_config( ...@@ -358,6 +370,7 @@ def get_validator_config(
extra_labels, extra_labels,
prysm_password_relative_filepath, prysm_password_relative_filepath,
prysm_password_artifact_uuid, prysm_password_artifact_uuid,
persistent,
): ):
validator_keys_dirpath = shared_utils.path_join( validator_keys_dirpath = shared_utils.path_join(
VALIDATOR_KEYS_MOUNT_DIRPATH_ON_SERVICE_CONTAINER, VALIDATOR_KEYS_MOUNT_DIRPATH_ON_SERVICE_CONTAINER,
...@@ -377,7 +390,7 @@ def get_validator_config( ...@@ -377,7 +390,7 @@ def get_validator_config(
"--beacon-rpc-provider=" + beacon_rpc_endpoint, "--beacon-rpc-provider=" + beacon_rpc_endpoint,
"--wallet-dir=" + validator_keys_dirpath, "--wallet-dir=" + validator_keys_dirpath,
"--wallet-password-file=" + validator_secrets_dirpath, "--wallet-password-file=" + validator_secrets_dirpath,
"--datadir=" + CONSENSUS_DATA_DIRPATH_ON_SERVICE_CONTAINER, # "--datadir=" + VALIDATOR_DATA_DIRPATH_ON_SERVICE_CONTAINER,
"--monitoring-port={0}".format(VALIDATOR_MONITORING_PORT_NUM), "--monitoring-port={0}".format(VALIDATOR_MONITORING_PORT_NUM),
"--verbosity=" + log_level, "--verbosity=" + log_level,
"--suggested-fee-recipient=" + constants.VALIDATING_REWARDS_ACCOUNT, "--suggested-fee-recipient=" + constants.VALIDATING_REWARDS_ACCOUNT,
...@@ -396,16 +409,21 @@ def get_validator_config( ...@@ -396,16 +409,21 @@ def get_validator_config(
if len(extra_params) > 0: if len(extra_params) > 0:
# we do the for loop as otherwise its a proto repeated array # we do the for loop as otherwise its a proto repeated array
cmd.extend([param for param in extra_params]) cmd.extend([param for param in extra_params])
files = {
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
VALIDATOR_KEYS_MOUNT_DIRPATH_ON_SERVICE_CONTAINER: node_keystore_files.files_artifact_uuid,
PRYSM_PASSWORD_MOUNT_DIRPATH_ON_SERVICE_CONTAINER: prysm_password_artifact_uuid,
}
if persistent:
files[VALIDATOR_DATA_DIRPATH_ON_SERVICE_CONTAINER] = Directory(
persistent_key="data-{0}".format(service_name)
)
return ServiceConfig( return ServiceConfig(
image=validator_image, image=validator_image,
ports=VALIDATOR_NODE_USED_PORTS, ports=VALIDATOR_NODE_USED_PORTS,
cmd=cmd, cmd=cmd,
files={ files=files,
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
VALIDATOR_KEYS_MOUNT_DIRPATH_ON_SERVICE_CONTAINER: node_keystore_files.files_artifact_uuid,
PRYSM_PASSWORD_MOUNT_DIRPATH_ON_SERVICE_CONTAINER: prysm_password_artifact_uuid,
},
private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER, private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER,
min_cpu=v_min_cpu, min_cpu=v_min_cpu,
max_cpu=v_max_cpu, max_cpu=v_max_cpu,
......
...@@ -7,14 +7,10 @@ cl_node_ready_conditions = import_module("../../cl/cl_node_ready_conditions.star ...@@ -7,14 +7,10 @@ cl_node_ready_conditions = import_module("../../cl/cl_node_ready_conditions.star
constants = import_module("../../package_io/constants.star") constants = import_module("../../package_io/constants.star")
TEKU_BINARY_FILEPATH_IN_IMAGE = "/opt/teku/bin/teku" TEKU_BINARY_FILEPATH_IN_IMAGE = "/opt/teku/bin/teku"
# ---------------------------------- Beacon client -------------------------------------
# The Docker container runs as the "teku" user so we can't write to root # The Docker container runs as the "teku" user so we can't write to root
CONSENSUS_DATA_DIRPATH_ON_SERVICE_CONTAINER = "/opt/teku/consensus-data" BEACON_DATA_DIRPATH_ON_SERVICE_CONTAINER = "/opt/teku/teku-beacon-data"
# These will get mounted as root and Teku needs directory write permissions, so we'll copy this
# into the Teku user's home directory to get around it
VALIDATOR_KEYS_DIRPATH_ON_SERVICE_CONTAINER = "/validator-keys"
# ---------------------------------- Beacon client -------------------------------------
# Port IDs # Port IDs
BEACON_TCP_DISCOVERY_PORT_ID = "tcp-discovery" BEACON_TCP_DISCOVERY_PORT_ID = "tcp-discovery"
BEACON_UDP_DISCOVERY_PORT_ID = "udp-discovery" BEACON_UDP_DISCOVERY_PORT_ID = "udp-discovery"
...@@ -34,6 +30,12 @@ BEACON_MAX_MEMORY = 2048 ...@@ -34,6 +30,12 @@ BEACON_MAX_MEMORY = 2048
BEACON_METRICS_PATH = "/metrics" BEACON_METRICS_PATH = "/metrics"
# ---------------------------------- Validator client ------------------------------------- # ---------------------------------- Validator client -------------------------------------
# These will get mounted as root and Teku needs directory write permissions, so we'll copy this
# into the Teku user's home directory to get around it
VALIDATOR_DATA_DIRPATH_ON_SERVICE_CONTAINER = "/opt/teku/teku-validator-data"
VALIDATOR_KEYS_DIRPATH_ON_SERVICE_CONTAINER = "/validator-keys"
VALIDATOR_KEYS_MOUNTPOINT_ON_CLIENTS = "/validator-keys" VALIDATOR_KEYS_MOUNTPOINT_ON_CLIENTS = "/validator-keys"
VALIDATOR_HTTP_PORT_ID = "http" VALIDATOR_HTTP_PORT_ID = "http"
VALIDATOR_METRICS_PORT_ID = "metrics" VALIDATOR_METRICS_PORT_ID = "metrics"
...@@ -122,6 +124,7 @@ def launch( ...@@ -122,6 +124,7 @@ def launch(
extra_validator_params, extra_validator_params,
extra_beacon_labels, extra_beacon_labels,
extra_validator_labels, extra_validator_labels,
persistent,
split_mode_enabled, split_mode_enabled,
): ):
beacon_service_name = "{0}".format(service_name) beacon_service_name = "{0}".format(service_name)
...@@ -144,6 +147,7 @@ def launch( ...@@ -144,6 +147,7 @@ def launch(
config = get_beacon_config( config = get_beacon_config(
launcher.el_cl_genesis_data, launcher.el_cl_genesis_data,
image, image,
beacon_service_name,
bootnode_context, bootnode_context,
el_client_context, el_client_context,
log_level, log_level,
...@@ -154,10 +158,10 @@ def launch( ...@@ -154,10 +158,10 @@ def launch(
bn_max_mem, bn_max_mem,
snooper_enabled, snooper_enabled,
snooper_engine_context, snooper_engine_context,
beacon_service_name,
extra_beacon_params, extra_beacon_params,
extra_beacon_labels, extra_beacon_labels,
split_mode_enabled, split_mode_enabled,
persistent,
) )
beacon_service = plan.add_service(service_name, config) beacon_service = plan.add_service(service_name, config)
...@@ -204,6 +208,7 @@ def launch( ...@@ -204,6 +208,7 @@ def launch(
validator_config = get_validator_config( validator_config = get_validator_config(
launcher.el_cl_genesis_data, launcher.el_cl_genesis_data,
image, image,
validator_service_name,
log_level, log_level,
beacon_http_url, beacon_http_url,
el_client_context, el_client_context,
...@@ -215,6 +220,7 @@ def launch( ...@@ -215,6 +220,7 @@ def launch(
validator_service_name, validator_service_name,
extra_validator_params, extra_validator_params,
extra_validator_labels, extra_validator_labels,
persistent,
) )
validator_service = plan.add_service(validator_service_name, validator_config) validator_service = plan.add_service(validator_service_name, validator_config)
...@@ -250,6 +256,7 @@ def launch( ...@@ -250,6 +256,7 @@ def launch(
def get_beacon_config( def get_beacon_config(
el_cl_genesis_data, el_cl_genesis_data,
image, image,
service_name,
bootnode_contexts, bootnode_contexts,
el_client_context, el_client_context,
log_level, log_level,
...@@ -260,10 +267,10 @@ def get_beacon_config( ...@@ -260,10 +267,10 @@ def get_beacon_config(
bn_max_mem, bn_max_mem,
snooper_enabled, snooper_enabled,
snooper_engine_context, snooper_engine_context,
service_name,
extra_params, extra_params,
extra_labels, extra_labels,
split_mode_enabled, split_mode_enabled,
persistent,
): ):
validator_keys_dirpath = "" validator_keys_dirpath = ""
validator_secrets_dirpath = "" validator_secrets_dirpath = ""
...@@ -296,7 +303,7 @@ def get_beacon_config( ...@@ -296,7 +303,7 @@ def get_beacon_config(
"--initial-state=" "--initial-state="
+ constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER
+ "/genesis.ssz", + "/genesis.ssz",
"--data-path=" + CONSENSUS_DATA_DIRPATH_ON_SERVICE_CONTAINER, "--data-path=" + BEACON_DATA_DIRPATH_ON_SERVICE_CONTAINER,
"--data-storage-mode={0}".format( "--data-storage-mode={0}".format(
"ARCHIVE" if constants.ARCHIVE_MODE else "PRUNE" "ARCHIVE" if constants.ARCHIVE_MODE else "PRUNE"
), ),
...@@ -366,7 +373,11 @@ def get_beacon_config( ...@@ -366,7 +373,11 @@ def get_beacon_config(
files[ files[
VALIDATOR_KEYS_DIRPATH_ON_SERVICE_CONTAINER VALIDATOR_KEYS_DIRPATH_ON_SERVICE_CONTAINER
] = node_keystore_files.files_artifact_uuid ] = node_keystore_files.files_artifact_uuid
cmd_str = " ".join(cmd)
if persistent:
files[BEACON_DATA_DIRPATH_ON_SERVICE_CONTAINER] = Directory(
persistent_key="data-{0}".format(service_name)
)
return ServiceConfig( return ServiceConfig(
image=image, image=image,
ports=BEACON_USED_PORTS, ports=BEACON_USED_PORTS,
...@@ -394,6 +405,7 @@ def get_beacon_config( ...@@ -394,6 +405,7 @@ def get_beacon_config(
def get_validator_config( def get_validator_config(
el_cl_genesis_data, el_cl_genesis_data,
image, image,
service_name,
log_level, log_level,
beacon_http_url, beacon_http_url,
el_client_context, el_client_context,
...@@ -405,6 +417,7 @@ def get_validator_config( ...@@ -405,6 +417,7 @@ def get_validator_config(
validator_service_name, validator_service_name,
extra_params, extra_params,
extra_labels, extra_labels,
persistent,
): ):
validator_keys_dirpath = "" validator_keys_dirpath = ""
validator_secrets_dirpath = "" validator_secrets_dirpath = ""
...@@ -424,8 +437,8 @@ def get_validator_config( ...@@ -424,8 +437,8 @@ def get_validator_config(
"--network=" "--network="
+ constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER
+ "/config.yaml", + "/config.yaml",
"--data-path=" + CONSENSUS_DATA_DIRPATH_ON_SERVICE_CONTAINER, # "--data-path=" + VALIDATOR_DATA_DIRPATH_ON_SERVICE_CONTAINER,
"--data-validator-path=" + CONSENSUS_DATA_DIRPATH_ON_SERVICE_CONTAINER, # "--data-validator-path=" + VALIDATOR_DATA_DIRPATH_ON_SERVICE_CONTAINER,
"--beacon-node-api-endpoint=" + beacon_http_url, "--beacon-node-api-endpoint=" + beacon_http_url,
"--validator-keys={0}:{1}".format( "--validator-keys={0}:{1}".format(
validator_keys_dirpath, validator_keys_dirpath,
...@@ -447,14 +460,16 @@ def get_validator_config( ...@@ -447,14 +460,16 @@ def get_validator_config(
if len(extra_params) > 0: if len(extra_params) > 0:
cmd.extend([param for param in extra_params if param != "--split=true"]) cmd.extend([param for param in extra_params if param != "--split=true"])
files = {
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
VALIDATOR_KEYS_MOUNTPOINT_ON_CLIENTS: node_keystore_files.files_artifact_uuid,
}
return ServiceConfig( return ServiceConfig(
image=image, image=image,
ports=VALIDATOR_USED_PORTS, ports=VALIDATOR_USED_PORTS,
cmd=cmd, cmd=cmd,
files={ files=files,
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
VALIDATOR_KEYS_MOUNTPOINT_ON_CLIENTS: node_keystore_files.files_artifact_uuid,
},
private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER, private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER,
min_cpu=v_min_cpu, min_cpu=v_min_cpu,
max_cpu=v_max_cpu, max_cpu=v_max_cpu,
......
...@@ -75,6 +75,7 @@ def launch( ...@@ -75,6 +75,7 @@ def launch(
extra_params, extra_params,
extra_env_vars, extra_env_vars,
extra_labels, extra_labels,
persistent,
): ):
log_level = input_parser.get_client_log_level_or_default( log_level = input_parser.get_client_log_level_or_default(
participant_log_level, global_log_level, BESU_LOG_LEVELS participant_log_level, global_log_level, BESU_LOG_LEVELS
...@@ -91,6 +92,7 @@ def launch( ...@@ -91,6 +92,7 @@ def launch(
launcher.network_id, launcher.network_id,
launcher.el_cl_genesis_data, launcher.el_cl_genesis_data,
image, image,
service_name,
existing_el_clients, existing_el_clients,
cl_client_name, cl_client_name,
log_level, log_level,
...@@ -101,6 +103,7 @@ def launch( ...@@ -101,6 +103,7 @@ def launch(
extra_params, extra_params,
extra_env_vars, extra_env_vars,
extra_labels, extra_labels,
persistent,
) )
service = plan.add_service(service_name, config) service = plan.add_service(service_name, config)
...@@ -129,6 +132,7 @@ def get_config( ...@@ -129,6 +132,7 @@ def get_config(
network_id, network_id,
el_cl_genesis_data, el_cl_genesis_data,
image, image,
service_name,
existing_el_clients, existing_el_clients,
cl_client_name, cl_client_name,
log_level, log_level,
...@@ -139,6 +143,7 @@ def get_config( ...@@ -139,6 +143,7 @@ def get_config(
extra_params, extra_params,
extra_env_vars, extra_env_vars,
extra_labels, extra_labels,
persistent,
): ):
cmd = [ cmd = [
"besu", "besu",
...@@ -190,13 +195,20 @@ def get_config( ...@@ -190,13 +195,20 @@ def get_config(
cmd_str = " ".join(cmd) cmd_str = " ".join(cmd)
extra_env_vars = extra_env_vars | JAVA_OPTS extra_env_vars = extra_env_vars | JAVA_OPTS
files = {
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
}
if persistent:
files[EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER] = Directory(
persistent_key="data-{0}".format(service_name),
)
return ServiceConfig( return ServiceConfig(
image=image, image=image,
ports=USED_PORTS, ports=USED_PORTS,
cmd=[cmd_str], cmd=[cmd_str],
files={ files=files,
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
},
env_vars=extra_env_vars, env_vars=extra_env_vars,
entrypoint=ENTRYPOINT_ARGS, entrypoint=ENTRYPOINT_ARGS,
private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER, private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER,
......
...@@ -76,6 +76,7 @@ def launch( ...@@ -76,6 +76,7 @@ def launch(
extra_params, extra_params,
extra_env_vars, extra_env_vars,
extra_labels, extra_labels,
persistent,
): ):
log_level = input_parser.get_client_log_level_or_default( log_level = input_parser.get_client_log_level_or_default(
participant_log_level, global_log_level, ERIGON_LOG_LEVELS participant_log_level, global_log_level, ERIGON_LOG_LEVELS
...@@ -92,6 +93,7 @@ def launch( ...@@ -92,6 +93,7 @@ def launch(
launcher.network_id, launcher.network_id,
launcher.el_cl_genesis_data, launcher.el_cl_genesis_data,
image, image,
service_name,
existing_el_clients, existing_el_clients,
cl_client_name, cl_client_name,
log_level, log_level,
...@@ -102,6 +104,7 @@ def launch( ...@@ -102,6 +104,7 @@ def launch(
extra_params, extra_params,
extra_env_vars, extra_env_vars,
extra_labels, extra_labels,
persistent,
) )
service = plan.add_service(service_name, config) service = plan.add_service(service_name, config)
...@@ -132,6 +135,7 @@ def get_config( ...@@ -132,6 +135,7 @@ def get_config(
network_id, network_id,
el_cl_genesis_data, el_cl_genesis_data,
image, image,
service_name,
existing_el_clients, existing_el_clients,
cl_client_name, cl_client_name,
verbosity_level, verbosity_level,
...@@ -142,6 +146,7 @@ def get_config( ...@@ -142,6 +146,7 @@ def get_config(
extra_params, extra_params,
extra_env_vars, extra_env_vars,
extra_labels, extra_labels,
persistent,
): ):
network_id = network_id network_id = network_id
...@@ -201,14 +206,19 @@ def get_config( ...@@ -201,14 +206,19 @@ def get_config(
command_arg = [init_datadir_cmd_str, " ".join(cmd)] command_arg = [init_datadir_cmd_str, " ".join(cmd)]
command_arg_str = " && ".join(command_arg) command_arg_str = " && ".join(command_arg)
files = {
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
}
if persistent:
files[EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER] = Directory(
persistent_key="data-{0}".format(service_name),
)
return ServiceConfig( return ServiceConfig(
image=image, image=image,
ports=USED_PORTS, ports=USED_PORTS,
cmd=[command_arg_str], cmd=[command_arg_str],
files={ files=files,
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
},
entrypoint=ENTRYPOINT_ARGS, entrypoint=ENTRYPOINT_ARGS,
private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER, private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER,
min_cpu=el_min_cpu, min_cpu=el_min_cpu,
......
...@@ -31,7 +31,7 @@ METRICS_PORT_ID = "metrics" ...@@ -31,7 +31,7 @@ METRICS_PORT_ID = "metrics"
METRICS_PATH = "/metrics" METRICS_PATH = "/metrics"
# The dirpath of the execution data directory on the client container # The dirpath of the execution data directory on the client container
EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER = "/execution-data" EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER = "/data/ethereumjs/execution-data"
PRIVATE_IP_ADDRESS_PLACEHOLDER = "KURTOSIS_IP_ADDR_PLACEHOLDER" PRIVATE_IP_ADDRESS_PLACEHOLDER = "KURTOSIS_IP_ADDR_PLACEHOLDER"
...@@ -80,6 +80,7 @@ def launch( ...@@ -80,6 +80,7 @@ def launch(
extra_params, extra_params,
extra_env_vars, extra_env_vars,
extra_labels, extra_labels,
persistent,
): ):
log_level = input_parser.get_client_log_level_or_default( log_level = input_parser.get_client_log_level_or_default(
participant_log_level, global_log_level, VERBOSITY_LEVELS participant_log_level, global_log_level, VERBOSITY_LEVELS
...@@ -95,6 +96,7 @@ def launch( ...@@ -95,6 +96,7 @@ def launch(
config = get_config( config = get_config(
launcher.el_cl_genesis_data, launcher.el_cl_genesis_data,
image, image,
service_name,
existing_el_clients, existing_el_clients,
cl_client_name, cl_client_name,
log_level, log_level,
...@@ -105,6 +107,7 @@ def launch( ...@@ -105,6 +107,7 @@ def launch(
extra_params, extra_params,
extra_env_vars, extra_env_vars,
extra_labels, extra_labels,
persistent,
) )
service = plan.add_service(service_name, config) service = plan.add_service(service_name, config)
...@@ -131,6 +134,7 @@ def launch( ...@@ -131,6 +134,7 @@ def launch(
def get_config( def get_config(
el_cl_genesis_data, el_cl_genesis_data,
image, image,
service_name,
existing_el_clients, existing_el_clients,
cl_client_name, cl_client_name,
verbosity_level, verbosity_level,
...@@ -141,6 +145,7 @@ def get_config( ...@@ -141,6 +145,7 @@ def get_config(
extra_params, extra_params,
extra_env_vars, extra_env_vars,
extra_labels, extra_labels,
persistent,
): ):
cmd = [ cmd = [
"--gethGenesis=" "--gethGenesis="
...@@ -182,13 +187,19 @@ def get_config( ...@@ -182,13 +187,19 @@ def get_config(
# this is a repeated<proto type>, we convert it into Starlark # this is a repeated<proto type>, we convert it into Starlark
cmd.extend([param for param in extra_params]) cmd.extend([param for param in extra_params])
files = {
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
}
if persistent:
files[EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER] = Directory(
persistent_key="data-{0}".format(service_name),
)
return ServiceConfig( return ServiceConfig(
image=image, image=image,
ports=USED_PORTS, ports=USED_PORTS,
cmd=cmd, cmd=cmd,
files={ files=files,
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
},
entrypoint=ENTRYPOINT_ARGS, entrypoint=ENTRYPOINT_ARGS,
private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER, private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER,
min_cpu=el_min_cpu, min_cpu=el_min_cpu,
......
...@@ -36,7 +36,7 @@ NUM_MINING_THREADS = 1 ...@@ -36,7 +36,7 @@ NUM_MINING_THREADS = 1
METRICS_PATH = "/debug/metrics/prometheus" METRICS_PATH = "/debug/metrics/prometheus"
# The dirpath of the execution data directory on the client container # The dirpath of the execution data directory on the client container
EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER = "/execution-data" EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER = "/data/geth/execution-data"
PRIVATE_IP_ADDRESS_PLACEHOLDER = "KURTOSIS_IP_ADDR_PLACEHOLDER" PRIVATE_IP_ADDRESS_PLACEHOLDER = "KURTOSIS_IP_ADDR_PLACEHOLDER"
...@@ -86,6 +86,7 @@ def launch( ...@@ -86,6 +86,7 @@ def launch(
extra_params, extra_params,
extra_env_vars, extra_env_vars,
extra_labels, extra_labels,
persistent,
): ):
log_level = input_parser.get_client_log_level_or_default( log_level = input_parser.get_client_log_level_or_default(
participant_log_level, global_log_level, VERBOSITY_LEVELS participant_log_level, global_log_level, VERBOSITY_LEVELS
...@@ -101,6 +102,7 @@ def launch( ...@@ -101,6 +102,7 @@ def launch(
launcher.network_id, launcher.network_id,
launcher.el_cl_genesis_data, launcher.el_cl_genesis_data,
image, image,
service_name,
existing_el_clients, existing_el_clients,
cl_client_name, cl_client_name,
log_level, log_level,
...@@ -114,6 +116,7 @@ def launch( ...@@ -114,6 +116,7 @@ def launch(
launcher.capella_fork_epoch, launcher.capella_fork_epoch,
launcher.electra_fork_epoch, launcher.electra_fork_epoch,
launcher.final_genesis_timestamp, launcher.final_genesis_timestamp,
persistent,
) )
service = plan.add_service(service_name, config) service = plan.add_service(service_name, config)
...@@ -144,6 +147,7 @@ def get_config( ...@@ -144,6 +147,7 @@ def get_config(
network_id, network_id,
el_cl_genesis_data, el_cl_genesis_data,
image, image,
service_name,
existing_el_clients, existing_el_clients,
cl_client_name, cl_client_name,
verbosity_level, verbosity_level,
...@@ -157,6 +161,7 @@ def get_config( ...@@ -157,6 +161,7 @@ def get_config(
capella_fork_epoch, capella_fork_epoch,
electra_fork_epoch, electra_fork_epoch,
final_genesis_timestamp, final_genesis_timestamp,
persistent,
): ):
# TODO: Remove this once electra fork has path based storage scheme implemented # TODO: Remove this once electra fork has path based storage scheme implemented
if electra_fork_epoch != None: if electra_fork_epoch != None:
...@@ -263,13 +268,18 @@ def get_config( ...@@ -263,13 +268,18 @@ def get_config(
] ]
command_str = " && ".join(subcommand_strs) command_str = " && ".join(subcommand_strs)
files = {
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid
}
if persistent:
files[EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER] = Directory(
persistent_key="data-{0}".format(service_name),
)
return ServiceConfig( return ServiceConfig(
image=image, image=image,
ports=USED_PORTS, ports=USED_PORTS,
cmd=[command_str], cmd=[command_str],
files={ files=files,
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid
},
entrypoint=ENTRYPOINT_ARGS, entrypoint=ENTRYPOINT_ARGS,
private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER, private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER,
min_cpu=el_min_cpu, min_cpu=el_min_cpu,
......
...@@ -7,7 +7,7 @@ node_metrics = import_module("../../node_metrics_info.star") ...@@ -7,7 +7,7 @@ node_metrics = import_module("../../node_metrics_info.star")
constants = import_module("../../package_io/constants.star") constants = import_module("../../package_io/constants.star")
# The dirpath of the execution data directory on the client container # The dirpath of the execution data directory on the client container
EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER = "/execution-data" EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER = "/data/nethermind/execution-data"
METRICS_PATH = "/metrics" METRICS_PATH = "/metrics"
...@@ -74,6 +74,7 @@ def launch( ...@@ -74,6 +74,7 @@ def launch(
extra_params, extra_params,
extra_env_vars, extra_env_vars,
extra_labels, extra_labels,
persistent,
): ):
log_level = input_parser.get_client_log_level_or_default( log_level = input_parser.get_client_log_level_or_default(
participant_log_level, global_log_level, NETHERMIND_LOG_LEVELS participant_log_level, global_log_level, NETHERMIND_LOG_LEVELS
...@@ -89,6 +90,7 @@ def launch( ...@@ -89,6 +90,7 @@ def launch(
config = get_config( config = get_config(
launcher.el_cl_genesis_data, launcher.el_cl_genesis_data,
image, image,
service_name,
existing_el_clients, existing_el_clients,
cl_client_name, cl_client_name,
log_level, log_level,
...@@ -99,6 +101,7 @@ def launch( ...@@ -99,6 +101,7 @@ def launch(
extra_params, extra_params,
extra_env_vars, extra_env_vars,
extra_labels, extra_labels,
persistent,
) )
service = plan.add_service(service_name, config) service = plan.add_service(service_name, config)
...@@ -127,6 +130,7 @@ def launch( ...@@ -127,6 +130,7 @@ def launch(
def get_config( def get_config(
el_cl_genesis_data, el_cl_genesis_data,
image, image,
service_name,
existing_el_clients, existing_el_clients,
cl_client_name, cl_client_name,
log_level, log_level,
...@@ -137,6 +141,7 @@ def get_config( ...@@ -137,6 +141,7 @@ def get_config(
extra_params, extra_params,
extra_env_vars, extra_env_vars,
extra_labels, extra_labels,
persistent,
): ):
cmd = [ cmd = [
"--log=" + log_level, "--log=" + log_level,
...@@ -177,13 +182,20 @@ def get_config( ...@@ -177,13 +182,20 @@ def get_config(
# this is a repeated<proto type>, we convert it into Starlark # this is a repeated<proto type>, we convert it into Starlark
cmd.extend([param for param in extra_params]) cmd.extend([param for param in extra_params])
files = {
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
}
if persistent:
files[EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER] = Directory(
persistent_key="data-{0}".format(service_name),
)
return ServiceConfig( return ServiceConfig(
image=image, image=image,
ports=USED_PORTS, ports=USED_PORTS,
cmd=cmd, cmd=cmd,
files={ files=files,
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
},
private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER, private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER,
min_cpu=el_min_cpu, min_cpu=el_min_cpu,
max_cpu=el_max_cpu, max_cpu=el_max_cpu,
......
...@@ -30,7 +30,7 @@ METRICS_PORT_ID = "metrics" ...@@ -30,7 +30,7 @@ METRICS_PORT_ID = "metrics"
METRICS_PATH = "/metrics" METRICS_PATH = "/metrics"
# The dirpath of the execution data directory on the client container # The dirpath of the execution data directory on the client container
EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER = "/execution-data" EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER = "/data/reth/execution-data"
PRIVATE_IP_ADDRESS_PLACEHOLDER = "KURTOSIS_IP_ADDR_PLACEHOLDER" PRIVATE_IP_ADDRESS_PLACEHOLDER = "KURTOSIS_IP_ADDR_PLACEHOLDER"
...@@ -78,6 +78,7 @@ def launch( ...@@ -78,6 +78,7 @@ def launch(
extra_params, extra_params,
extra_env_vars, extra_env_vars,
extra_labels, extra_labels,
persistent,
): ):
log_level = input_parser.get_client_log_level_or_default( log_level = input_parser.get_client_log_level_or_default(
participant_log_level, global_log_level, VERBOSITY_LEVELS participant_log_level, global_log_level, VERBOSITY_LEVELS
...@@ -93,6 +94,7 @@ def launch( ...@@ -93,6 +94,7 @@ def launch(
config = get_config( config = get_config(
launcher.el_cl_genesis_data, launcher.el_cl_genesis_data,
image, image,
service_name,
existing_el_clients, existing_el_clients,
cl_client_name, cl_client_name,
log_level, log_level,
...@@ -103,6 +105,7 @@ def launch( ...@@ -103,6 +105,7 @@ def launch(
extra_params, extra_params,
extra_env_vars, extra_env_vars,
extra_labels, extra_labels,
persistent,
) )
service = plan.add_service(service_name, config) service = plan.add_service(service_name, config)
...@@ -130,6 +133,7 @@ def launch( ...@@ -130,6 +133,7 @@ def launch(
def get_config( def get_config(
el_cl_genesis_data, el_cl_genesis_data,
image, image,
service_name,
existing_el_clients, existing_el_clients,
cl_client_name, cl_client_name,
verbosity_level, verbosity_level,
...@@ -140,6 +144,7 @@ def get_config( ...@@ -140,6 +144,7 @@ def get_config(
extra_params, extra_params,
extra_env_vars, extra_env_vars,
extra_labels, extra_labels,
persistent,
): ):
init_datadir_cmd_str = "reth init --datadir={0} --chain={1}".format( init_datadir_cmd_str = "reth init --datadir={0} --chain={1}".format(
EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER,
...@@ -194,13 +199,19 @@ def get_config( ...@@ -194,13 +199,19 @@ def get_config(
] ]
command_str = " && ".join(subcommand_strs) command_str = " && ".join(subcommand_strs)
files = {
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
}
if persistent:
files[EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER] = Directory(
persistent_key="data-{0}".format(service_name),
)
return ServiceConfig( return ServiceConfig(
image=image, image=image,
ports=USED_PORTS, ports=USED_PORTS,
cmd=[command_str], cmd=[command_str],
files={ files=files,
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data.files_artifact_uuid,
},
entrypoint=ENTRYPOINT_ARGS, entrypoint=ENTRYPOINT_ARGS,
private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER, private_ip_address_placeholder=PRIVATE_IP_ADDRESS_PLACEHOLDER,
min_cpu=el_min_cpu, min_cpu=el_min_cpu,
......
...@@ -56,6 +56,7 @@ def launch_participant_network( ...@@ -56,6 +56,7 @@ def launch_participant_network(
participants, participants,
network_params, network_params,
global_log_level, global_log_level,
persistent,
parallel_keystore_generation=False, parallel_keystore_generation=False,
): ):
num_participants = len(participants) num_participants = len(participants)
...@@ -225,6 +226,7 @@ def launch_participant_network( ...@@ -225,6 +226,7 @@ def launch_participant_network(
participant.el_extra_params, participant.el_extra_params,
participant.el_extra_env_vars, participant.el_extra_env_vars,
participant.el_extra_labels, participant.el_extra_labels,
persistent,
) )
# Add participant el additional prometheus metrics # Add participant el additional prometheus metrics
...@@ -344,6 +346,7 @@ def launch_participant_network( ...@@ -344,6 +346,7 @@ def launch_participant_network(
participant.validator_extra_params, participant.validator_extra_params,
participant.beacon_extra_labels, participant.beacon_extra_labels,
participant.validator_extra_labels, participant.validator_extra_labels,
persistent,
participant.cl_split_mode_enabled, participant.cl_split_mode_enabled,
) )
else: else:
...@@ -374,6 +377,7 @@ def launch_participant_network( ...@@ -374,6 +377,7 @@ def launch_participant_network(
participant.validator_extra_params, participant.validator_extra_params,
participant.beacon_extra_labels, participant.beacon_extra_labels,
participant.validator_extra_labels, participant.validator_extra_labels,
persistent,
participant.cl_split_mode_enabled, participant.cl_split_mode_enabled,
) )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment