Commit 5fd7e7bd authored by Gyanendra Mishra's avatar Gyanendra Mishra Committed by GitHub

ci: add a linter (#216)

parent 1752ed0a
......@@ -42,6 +42,14 @@ jobs:
- run: kurtosis run ${PWD}
lint:
executor: ubuntu_vm
steps:
- <<: *setup_kurtosis
- checkout
- run: kurtosis lint ${PWD}
run_starlark_arm64:
executor: ubuntu_vm
resource_class: arm.medium
......@@ -234,3 +242,11 @@ workflows:
branches:
ignore:
- main
- lint:
context:
# This pulls in KurtosisBot's Github token, so that we can read from our private repos
- github-user
filters:
branches:
ignore:
- main
This diff is collapsed.
shared_utils = import_module("github.com/kurtosis-tech/eth2-package/src/shared_utils/shared_utils.star")
shared_utils = import_module(
"github.com/kurtosis-tech/eth2-package/src/shared_utils/shared_utils.star"
)
SERVICE_NAME = "beacon-metrics-gazer"
IMAGE_NAME = "ethpandaops/beacon-metrics-gazer:master"
HTTP_PORT_ID = "http"
HTTP_PORT_ID = "http"
HTTP_PORT_NUMBER = 8080
BEACON_METRICS_GAZER_CONFIG_FILENAME = "validator-ranges.yaml"
......@@ -12,58 +14,68 @@ BEACON_METRICS_GAZER_CONFIG_FILENAME = "validator-ranges.yaml"
BEACON_METRICS_GAZER_CONFIG_MOUNT_DIRPATH_ON_SERVICE = "/config"
USED_PORTS = {
HTTP_PORT_ID:shared_utils.new_port_spec(HTTP_PORT_NUMBER, shared_utils.TCP_PROTOCOL, shared_utils.HTTP_APPLICATION_PROTOCOL)
HTTP_PORT_ID: shared_utils.new_port_spec(
HTTP_PORT_NUMBER,
shared_utils.TCP_PROTOCOL,
shared_utils.HTTP_APPLICATION_PROTOCOL,
)
}
def launch_beacon_metrics_gazer(
plan,
config_template,
cl_client_contexts,
network_params
):
data = []
for index, client in enumerate(cl_client_contexts):
start_index = index*network_params.num_validator_keys_per_node
end_index = ((index+1)*network_params.num_validator_keys_per_node)-1
service_name = client.beacon_service_name
data.append({"ClientName": service_name, "Range": "{0}-{1}".format(start_index, end_index)})
template_data = {"Data": data}
template_and_data_by_rel_dest_filepath = {}
template_and_data_by_rel_dest_filepath[BEACON_METRICS_GAZER_CONFIG_FILENAME] = shared_utils.new_template_and_data(config_template, template_data)
config_files_artifact_name = plan.render_templates(template_and_data_by_rel_dest_filepath, "validator-ranges")
config = get_config(
config_files_artifact_name,
cl_client_contexts[0].ip_addr,
cl_client_contexts[0].http_port_num)
plan.add_service(SERVICE_NAME, config)
def get_config(
config_files_artifact_name,
ip_addr,
http_port_num):
config_file_path = shared_utils.path_join(BEACON_METRICS_GAZER_CONFIG_MOUNT_DIRPATH_ON_SERVICE, BEACON_METRICS_GAZER_CONFIG_FILENAME)
return ServiceConfig(
image = IMAGE_NAME,
ports = USED_PORTS,
files = {
BEACON_METRICS_GAZER_CONFIG_MOUNT_DIRPATH_ON_SERVICE: config_files_artifact_name,
},
cmd = [
"http://{0}:{1}".format(ip_addr, http_port_num),
"--ranges-file",
config_file_path,
"--port",
"{0}".format(HTTP_PORT_NUMBER),
"--address",
"0.0.0.0",
"-v"
]
)
plan, config_template, cl_client_contexts, network_params
):
data = []
for index, client in enumerate(cl_client_contexts):
start_index = index * network_params.num_validator_keys_per_node
end_index = ((index + 1) * network_params.num_validator_keys_per_node) - 1
service_name = client.beacon_service_name
data.append(
{
"ClientName": service_name,
"Range": "{0}-{1}".format(start_index, end_index),
}
)
template_data = {"Data": data}
template_and_data_by_rel_dest_filepath = {}
template_and_data_by_rel_dest_filepath[
BEACON_METRICS_GAZER_CONFIG_FILENAME
] = shared_utils.new_template_and_data(config_template, template_data)
config_files_artifact_name = plan.render_templates(
template_and_data_by_rel_dest_filepath, "validator-ranges"
)
config = get_config(
config_files_artifact_name,
cl_client_contexts[0].ip_addr,
cl_client_contexts[0].http_port_num,
)
plan.add_service(SERVICE_NAME, config)
def get_config(config_files_artifact_name, ip_addr, http_port_num):
config_file_path = shared_utils.path_join(
BEACON_METRICS_GAZER_CONFIG_MOUNT_DIRPATH_ON_SERVICE,
BEACON_METRICS_GAZER_CONFIG_FILENAME,
)
return ServiceConfig(
image=IMAGE_NAME,
ports=USED_PORTS,
files={
BEACON_METRICS_GAZER_CONFIG_MOUNT_DIRPATH_ON_SERVICE: config_files_artifact_name,
},
cmd=[
"http://{0}:{1}".format(ip_addr, http_port_num),
"--ranges-file",
config_file_path,
"--port",
"{0}".format(HTTP_PORT_NUMBER),
"--address",
"0.0.0.0",
"-v",
],
)
......@@ -3,44 +3,63 @@ SERVICE_NAME = "blob-spammer"
ENTRYPOINT_ARGS = ["/bin/sh", "-c"]
def launch_blob_spammer(
plan,
prefunded_addresses,
el_client_context,
cl_client_context,
deneb_fork_epoch,
seconds_per_slot,
slots_per_epoch,
genesis_delay):
config = get_config(
prefunded_addresses,
el_client_context,
cl_client_context,
deneb_fork_epoch,
seconds_per_slot,
slots_per_epoch,
genesis_delay)
plan.add_service(SERVICE_NAME, config)
plan,
prefunded_addresses,
el_client_context,
cl_client_context,
deneb_fork_epoch,
seconds_per_slot,
slots_per_epoch,
genesis_delay,
):
config = get_config(
prefunded_addresses,
el_client_context,
cl_client_context,
deneb_fork_epoch,
seconds_per_slot,
slots_per_epoch,
genesis_delay,
)
plan.add_service(SERVICE_NAME, config)
def get_config(
prefunded_addresses,
el_client_context,
cl_client_context,
deneb_fork_epoch,
seconds_per_slot,
slots_per_epoch,
genesis_delay):
dencunTime = (deneb_fork_epoch * slots_per_epoch * seconds_per_slot) + genesis_delay
return ServiceConfig(
image = IMAGE_NAME,
entrypoint = ENTRYPOINT_ARGS,
cmd = [" && ".join([
'apk update',
'apk add curl jq',
'current_epoch=$(curl -s http://{0}:{1}/eth/v2/beacon/blocks/head | jq -r ".version")'.format(cl_client_context.ip_addr, cl_client_context.http_port_num),
'echo $current_epoch',
'while [ $current_epoch != "deneb" ]; do echo "waiting for deneb, current epoch is $current_epoch"; current_epoch=$(curl -s http://{0}:{1}/eth/v2/beacon/blocks/head | jq -r ".version"); sleep {2}; done'.format(cl_client_context.ip_addr, cl_client_context.http_port_num, seconds_per_slot),
'echo "sleep is over, starting to send blob transactions"',
'/tx-fuzz.bin blobs --rpc=http://{0}:{1} --sk={2}'.format(el_client_context.ip_addr, el_client_context.rpc_port_num, prefunded_addresses[1].private_key),
])]
)
prefunded_addresses,
el_client_context,
cl_client_context,
deneb_fork_epoch,
seconds_per_slot,
slots_per_epoch,
genesis_delay,
):
dencunTime = (deneb_fork_epoch * slots_per_epoch * seconds_per_slot) + genesis_delay
return ServiceConfig(
image=IMAGE_NAME,
entrypoint=ENTRYPOINT_ARGS,
cmd=[
" && ".join(
[
"apk update",
"apk add curl jq",
'current_epoch=$(curl -s http://{0}:{1}/eth/v2/beacon/blocks/head | jq -r ".version")'.format(
cl_client_context.ip_addr, cl_client_context.http_port_num
),
"echo $current_epoch",
'while [ $current_epoch != "deneb" ]; do echo "waiting for deneb, current epoch is $current_epoch"; current_epoch=$(curl -s http://{0}:{1}/eth/v2/beacon/blocks/head | jq -r ".version"); sleep {2}; done'.format(
cl_client_context.ip_addr,
cl_client_context.http_port_num,
seconds_per_slot,
),
'echo "sleep is over, starting to send blob transactions"',
"/tx-fuzz.bin blobs --rpc=http://{0}:{1} --sk={2}".format(
el_client_context.ip_addr,
el_client_context.rpc_port_num,
prefunded_addresses[1].private_key,
),
]
)
],
)
shared_utils = import_module("github.com/kurtosis-tech/eth2-package/src/shared_utils/shared_utils.star")
shared_utils = import_module(
"github.com/kurtosis-tech/eth2-package/src/shared_utils/shared_utils.star"
)
SERVICE_NAME = "cl-forkmon"
IMAGE_NAME = "ethpandaops/consensus-monitor:main"
HTTP_PORT_ID = "http"
HTTP_PORT_NUMBER = 80
HTTP_PORT_ID = "http"
HTTP_PORT_NUMBER = 80
CL_FORKMON_CONFIG_FILENAME = "cl-forkmon-config.toml"
CL_FORKMON_CONFIG_MOUNT_DIRPATH_ON_SERVICE = "/config"
USED_PORTS = {
HTTP_PORT_ID:shared_utils.new_port_spec(HTTP_PORT_NUMBER, shared_utils.TCP_PROTOCOL, shared_utils.HTTP_APPLICATION_PROTOCOL)
HTTP_PORT_ID: shared_utils.new_port_spec(
HTTP_PORT_NUMBER,
shared_utils.TCP_PROTOCOL,
shared_utils.HTTP_APPLICATION_PROTOCOL,
)
}
def launch_cl_forkmon(
plan,
config_template,
cl_client_contexts,
genesis_unix_timestamp,
seconds_per_slot,
slots_per_epoch
):
all_cl_client_info = []
for client in cl_client_contexts:
client_info = new_cl_client_info(client.ip_addr, client.http_port_num)
all_cl_client_info.append(client_info)
template_data = new_config_template_data(HTTP_PORT_NUMBER, all_cl_client_info, seconds_per_slot, slots_per_epoch, genesis_unix_timestamp)
template_and_data = shared_utils.new_template_and_data(config_template, template_data)
template_and_data_by_rel_dest_filepath = {}
template_and_data_by_rel_dest_filepath[CL_FORKMON_CONFIG_FILENAME] = template_and_data
config_files_artifact_name = plan.render_templates(template_and_data_by_rel_dest_filepath, "cl-forkmon-config")
config = get_config(config_files_artifact_name)
plan.add_service(SERVICE_NAME, config)
plan,
config_template,
cl_client_contexts,
genesis_unix_timestamp,
seconds_per_slot,
slots_per_epoch,
):
all_cl_client_info = []
for client in cl_client_contexts:
client_info = new_cl_client_info(client.ip_addr, client.http_port_num)
all_cl_client_info.append(client_info)
template_data = new_config_template_data(
HTTP_PORT_NUMBER,
all_cl_client_info,
seconds_per_slot,
slots_per_epoch,
genesis_unix_timestamp,
)
template_and_data = shared_utils.new_template_and_data(
config_template, template_data
)
template_and_data_by_rel_dest_filepath = {}
template_and_data_by_rel_dest_filepath[
CL_FORKMON_CONFIG_FILENAME
] = template_and_data
config_files_artifact_name = plan.render_templates(
template_and_data_by_rel_dest_filepath, "cl-forkmon-config"
)
config = get_config(config_files_artifact_name)
plan.add_service(SERVICE_NAME, config)
def get_config(config_files_artifact_name):
config_file_path = shared_utils.path_join(CL_FORKMON_CONFIG_MOUNT_DIRPATH_ON_SERVICE, CL_FORKMON_CONFIG_FILENAME)
return ServiceConfig(
image = IMAGE_NAME,
ports = USED_PORTS,
files = {
CL_FORKMON_CONFIG_MOUNT_DIRPATH_ON_SERVICE: config_files_artifact_name,
},
cmd = ["--config-path", config_file_path]
)
def new_config_template_data(listen_port_num, cl_client_info, seconds_per_slot, slots_per_epoch, genesis_unix_timestamp):
return {
"ListenPortNum": listen_port_num,
"CLClientInfo": cl_client_info,
"SecondsPerSlot": seconds_per_slot,
"SlotsPerEpoch": slots_per_epoch,
"GenesisUnixTimestamp": genesis_unix_timestamp,
}
config_file_path = shared_utils.path_join(
CL_FORKMON_CONFIG_MOUNT_DIRPATH_ON_SERVICE, CL_FORKMON_CONFIG_FILENAME
)
return ServiceConfig(
image=IMAGE_NAME,
ports=USED_PORTS,
files={
CL_FORKMON_CONFIG_MOUNT_DIRPATH_ON_SERVICE: config_files_artifact_name,
},
cmd=["--config-path", config_file_path],
)
def new_config_template_data(
listen_port_num,
cl_client_info,
seconds_per_slot,
slots_per_epoch,
genesis_unix_timestamp,
):
return {
"ListenPortNum": listen_port_num,
"CLClientInfo": cl_client_info,
"SecondsPerSlot": seconds_per_slot,
"SlotsPerEpoch": slots_per_epoch,
"GenesisUnixTimestamp": genesis_unix_timestamp,
}
def new_cl_client_info(ip_addr, port_num):
return {
"IPAddr": ip_addr,
"PortNum": port_num
}
return {"IPAddr": ip_addr, "PortNum": port_num}
shared_utils = import_module("github.com/kurtosis-tech/eth2-package/src/shared_utils/shared_utils.star")
shared_utils = import_module(
"github.com/kurtosis-tech/eth2-package/src/shared_utils/shared_utils.star"
)
SERVICE_NAME = "el-forkmon"
IMAGE_NAME = "ethpandaops/execution-monitor:master"
HTTP_PORT_ID = "http"
HTTP_PORT_ID = "http"
HTTP_PORT_NUMBER = 8080
EL_FORKMON_CONFIG_FILENAME = "el-forkmon-config.toml"
......@@ -12,56 +14,65 @@ EL_FORKMON_CONFIG_FILENAME = "el-forkmon-config.toml"
EL_FORKMON_CONFIG_MOUNT_DIRPATH_ON_SERVICE = "/config"
USED_PORTS = {
HTTP_PORT_ID:shared_utils.new_port_spec(HTTP_PORT_NUMBER, shared_utils.TCP_PROTOCOL, shared_utils.HTTP_APPLICATION_PROTOCOL)
HTTP_PORT_ID: shared_utils.new_port_spec(
HTTP_PORT_NUMBER,
shared_utils.TCP_PROTOCOL,
shared_utils.HTTP_APPLICATION_PROTOCOL,
)
}
def launch_el_forkmon(
plan,
config_template,
el_client_contexts,
):
plan,
config_template,
el_client_contexts,
):
all_el_client_info = []
for client in el_client_contexts:
client_info = new_el_client_info(
client.ip_addr, client.rpc_port_num, client.service_name
)
all_el_client_info.append(client_info)
all_el_client_info = []
for client in el_client_contexts:
client_info = new_el_client_info(client.ip_addr, client.rpc_port_num, client.service_name)
all_el_client_info.append(client_info)
template_data = new_config_template_data(HTTP_PORT_NUMBER, all_el_client_info)
template_data = new_config_template_data(HTTP_PORT_NUMBER, all_el_client_info)
template_and_data = shared_utils.new_template_and_data(
config_template, template_data
)
template_and_data_by_rel_dest_filepath = {}
template_and_data_by_rel_dest_filepath[
EL_FORKMON_CONFIG_FILENAME
] = template_and_data
template_and_data = shared_utils.new_template_and_data(config_template, template_data)
template_and_data_by_rel_dest_filepath = {}
template_and_data_by_rel_dest_filepath[EL_FORKMON_CONFIG_FILENAME] = template_and_data
config_files_artifact_name = plan.render_templates(
template_and_data_by_rel_dest_filepath, "el-forkmon-config"
)
config_files_artifact_name = plan.render_templates(template_and_data_by_rel_dest_filepath, "el-forkmon-config")
config = get_config(config_files_artifact_name)
config = get_config(config_files_artifact_name)
plan.add_service(SERVICE_NAME, config)
plan.add_service(SERVICE_NAME, config)
def get_config(config_files_artifact_name):
config_file_path = shared_utils.path_join(EL_FORKMON_CONFIG_MOUNT_DIRPATH_ON_SERVICE, EL_FORKMON_CONFIG_FILENAME)
return ServiceConfig(
image = IMAGE_NAME,
ports = USED_PORTS,
files = {
EL_FORKMON_CONFIG_MOUNT_DIRPATH_ON_SERVICE: config_files_artifact_name,
},
cmd = [config_file_path]
)
config_file_path = shared_utils.path_join(
EL_FORKMON_CONFIG_MOUNT_DIRPATH_ON_SERVICE, EL_FORKMON_CONFIG_FILENAME
)
return ServiceConfig(
image=IMAGE_NAME,
ports=USED_PORTS,
files={
EL_FORKMON_CONFIG_MOUNT_DIRPATH_ON_SERVICE: config_files_artifact_name,
},
cmd=[config_file_path],
)
def new_config_template_data(listen_port_num, el_client_info):
return {
"ListenPortNum": listen_port_num,
"ELClientInfo": el_client_info,
}
return {
"ListenPortNum": listen_port_num,
"ELClientInfo": el_client_info,
}
def new_el_client_info(ip_addr, port_num, service_name):
return {
"IPAddr": ip_addr,
"PortNum": port_num,
"Name": service_name
}
return {"IPAddr": ip_addr, "PortNum": port_num, "Name": service_name}
shared_utils = import_module("github.com/kurtosis-tech/eth2-package/src/shared_utils/shared_utils.star")
static_files = import_module("github.com/kurtosis-tech/eth2-package/src/static_files/static_files.star")
shared_utils = import_module(
"github.com/kurtosis-tech/eth2-package/src/shared_utils/shared_utils.star"
)
static_files = import_module(
"github.com/kurtosis-tech/eth2-package/src/static_files/static_files.star"
)
SERVICE_NAME = "grafana"
......@@ -21,61 +25,95 @@ GRAFANA_DASHBOARDS_FILEPATH_ON_SERVICE = GRAFANA_DASHBOARDS_DIRPATH_ON_SERVICE
USED_PORTS = {
HTTP_PORT_ID: shared_utils.new_port_spec(HTTP_PORT_NUMBER_UINT16, shared_utils.TCP_PROTOCOL, shared_utils.HTTP_APPLICATION_PROTOCOL)
HTTP_PORT_ID: shared_utils.new_port_spec(
HTTP_PORT_NUMBER_UINT16,
shared_utils.TCP_PROTOCOL,
shared_utils.HTTP_APPLICATION_PROTOCOL,
)
}
def launch_grafana(plan, datasource_config_template, dashboard_providers_config_template, prometheus_private_url):
grafana_config_artifacts_uuid, grafana_dashboards_artifacts_uuid = get_grafana_config_dir_artifact_uuid(plan, datasource_config_template, dashboard_providers_config_template, prometheus_private_url)
config = get_config(grafana_config_artifacts_uuid, grafana_dashboards_artifacts_uuid)
plan.add_service(SERVICE_NAME, config)
def get_grafana_config_dir_artifact_uuid(plan, datasource_config_template, dashboard_providers_config_template, prometheus_private_url):
datasource_data = new_datasource_config_template_data(prometheus_private_url)
datasource_template_and_data = shared_utils.new_template_and_data(datasource_config_template, datasource_data)
dashboard_providers_data = new_dashboard_providers_config_template_data(GRAFANA_DASHBOARDS_FILEPATH_ON_SERVICE)
dashboard_providers_template_and_data = shared_utils.new_template_and_data(dashboard_providers_config_template, dashboard_providers_data)
template_and_data_by_rel_dest_filepath = {}
template_and_data_by_rel_dest_filepath[DATASOURCE_CONFIG_REL_FILEPATH] = datasource_template_and_data
template_and_data_by_rel_dest_filepath[DASHBOARD_PROVIDERS_CONFIG_REL_FILEPATH] = dashboard_providers_template_and_data
grafana_config_artifacts_name = plan.render_templates(template_and_data_by_rel_dest_filepath, name="grafana-config")
grafana_dashboards_artifacts_name = plan.upload_files(static_files.GRAFANA_DASHBOARDS_CONFIG_DIRPATH, name="grafana-dashboards")
return grafana_config_artifacts_name, grafana_dashboards_artifacts_name
def launch_grafana(
plan,
datasource_config_template,
dashboard_providers_config_template,
prometheus_private_url,
):
(
grafana_config_artifacts_uuid,
grafana_dashboards_artifacts_uuid,
) = get_grafana_config_dir_artifact_uuid(
plan,
datasource_config_template,
dashboard_providers_config_template,
prometheus_private_url,
)
config = get_config(
grafana_config_artifacts_uuid, grafana_dashboards_artifacts_uuid
)
plan.add_service(SERVICE_NAME, config)
def get_grafana_config_dir_artifact_uuid(
plan,
datasource_config_template,
dashboard_providers_config_template,
prometheus_private_url,
):
datasource_data = new_datasource_config_template_data(prometheus_private_url)
datasource_template_and_data = shared_utils.new_template_and_data(
datasource_config_template, datasource_data
)
dashboard_providers_data = new_dashboard_providers_config_template_data(
GRAFANA_DASHBOARDS_FILEPATH_ON_SERVICE
)
dashboard_providers_template_and_data = shared_utils.new_template_and_data(
dashboard_providers_config_template, dashboard_providers_data
)
template_and_data_by_rel_dest_filepath = {}
template_and_data_by_rel_dest_filepath[
DATASOURCE_CONFIG_REL_FILEPATH
] = datasource_template_and_data
template_and_data_by_rel_dest_filepath[
DASHBOARD_PROVIDERS_CONFIG_REL_FILEPATH
] = dashboard_providers_template_and_data
grafana_config_artifacts_name = plan.render_templates(
template_and_data_by_rel_dest_filepath, name="grafana-config"
)
grafana_dashboards_artifacts_name = plan.upload_files(
static_files.GRAFANA_DASHBOARDS_CONFIG_DIRPATH, name="grafana-dashboards"
)
return grafana_config_artifacts_name, grafana_dashboards_artifacts_name
def get_config(grafana_config_artifacts_name, grafana_dashboards_artifacts_name):
return ServiceConfig(
image = IMAGE_NAME,
ports = USED_PORTS,
env_vars = {
CONFIG_DIRPATH_ENV_VAR: GRAFANA_CONFIG_DIRPATH_ON_SERVICE,
"GF_AUTH_ANONYMOUS_ENABLED": "true",
"GF_AUTH_ANONYMOUS_ORG_ROLE": "Admin",
"GF_AUTH_ANONYMOUS_ORG_NAME": "Main Org.",
"GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH": "/dashboards/default.json",
},
files = {
GRAFANA_CONFIG_DIRPATH_ON_SERVICE: grafana_config_artifacts_name,
GRAFANA_DASHBOARDS_DIRPATH_ON_SERVICE: grafana_dashboards_artifacts_name
}
)
return ServiceConfig(
image=IMAGE_NAME,
ports=USED_PORTS,
env_vars={
CONFIG_DIRPATH_ENV_VAR: GRAFANA_CONFIG_DIRPATH_ON_SERVICE,
"GF_AUTH_ANONYMOUS_ENABLED": "true",
"GF_AUTH_ANONYMOUS_ORG_ROLE": "Admin",
"GF_AUTH_ANONYMOUS_ORG_NAME": "Main Org.",
"GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH": "/dashboards/default.json",
},
files={
GRAFANA_CONFIG_DIRPATH_ON_SERVICE: grafana_config_artifacts_name,
GRAFANA_DASHBOARDS_DIRPATH_ON_SERVICE: grafana_dashboards_artifacts_name,
},
)
def new_datasource_config_template_data(prometheus_url):
return {
"PrometheusURL": prometheus_url
}
return {"PrometheusURL": prometheus_url}
def new_dashboard_providers_config_template_data(dashboards_dirpath):
return {
"DashboardsDirpath": dashboards_dirpath
}
return {"DashboardsDirpath": dashboards_dirpath}
shared_utils = import_module("github.com/kurtosis-tech/eth2-package/src/shared_utils/shared_utils.star")
shared_utils = import_module(
"github.com/kurtosis-tech/eth2-package/src/shared_utils/shared_utils.star"
)
SERVICE_NAME = "light-beaconchain"
IMAGE_NAME = "ethpandaops/dora-the-explorer:master"
HTTP_PORT_ID = "http"
HTTP_PORT_ID = "http"
HTTP_PORT_NUMBER = 8080
LIGHT_BEACONCHAIN_CONFIG_FILENAME = "light-beaconchain-config.yaml"
......@@ -19,60 +21,69 @@ CL_CONFIG_ARTIFACT_NAME = "cl-genesis-data"
USED_PORTS = {
HTTP_PORT_ID:shared_utils.new_port_spec(HTTP_PORT_NUMBER, shared_utils.TCP_PROTOCOL, shared_utils.HTTP_APPLICATION_PROTOCOL)
HTTP_PORT_ID: shared_utils.new_port_spec(
HTTP_PORT_NUMBER,
shared_utils.TCP_PROTOCOL,
shared_utils.HTTP_APPLICATION_PROTOCOL,
)
}
def launch_light_beacon(
plan,
config_template,
cl_client_contexts,
):
plan,
config_template,
cl_client_contexts,
):
all_cl_client_info = []
for index, client in enumerate(cl_client_contexts):
all_cl_client_info.append(
new_cl_client_info(
client.ip_addr, client.http_port_num, client.beacon_service_name
)
)
all_cl_client_info = []
for index, client in enumerate(cl_client_contexts):
all_cl_client_info.append(new_cl_client_info(client.ip_addr, client.http_port_num, client.beacon_service_name))
template_data = new_config_template_data(HTTP_PORT_NUMBER, all_cl_client_info)
template_data = new_config_template_data(HTTP_PORT_NUMBER, all_cl_client_info)
template_and_data = shared_utils.new_template_and_data(
config_template, template_data
)
template_and_data_by_rel_dest_filepath = {}
template_and_data_by_rel_dest_filepath[
LIGHT_BEACONCHAIN_CONFIG_FILENAME
] = template_and_data
template_and_data = shared_utils.new_template_and_data(config_template, template_data)
template_and_data_by_rel_dest_filepath = {}
template_and_data_by_rel_dest_filepath[LIGHT_BEACONCHAIN_CONFIG_FILENAME] = template_and_data
config_files_artifact_name = plan.render_templates(
template_and_data_by_rel_dest_filepath, "light-beaconchain-config"
)
config_files_artifact_name = plan.render_templates(template_and_data_by_rel_dest_filepath, "light-beaconchain-config")
config = get_config(config_files_artifact_name)
config = get_config(config_files_artifact_name)
plan.add_service(SERVICE_NAME, config)
plan.add_service(SERVICE_NAME, config)
def get_config(config_files_artifact_name):
config_file_path = shared_utils.path_join(LIGHT_BEACONCHAIN_CONFIG_MOUNT_DIRPATH_ON_SERVICE, LIGHT_BEACONCHAIN_CONFIG_FILENAME)
return ServiceConfig(
image = IMAGE_NAME,
ports = USED_PORTS,
files = {
LIGHT_BEACONCHAIN_CONFIG_MOUNT_DIRPATH_ON_SERVICE: config_files_artifact_name,
VALIDATOR_RANGES_MOUNT_DIRPATH_ON_SERVICE: VALIDATOR_RANGES_ARTIFACT_NAME,
CL_CONFIG_MOUNT_DIRPATH_ON_SERVICE: CL_CONFIG_ARTIFACT_NAME
},
cmd = [
"-config",
config_file_path
]
)
config_file_path = shared_utils.path_join(
LIGHT_BEACONCHAIN_CONFIG_MOUNT_DIRPATH_ON_SERVICE,
LIGHT_BEACONCHAIN_CONFIG_FILENAME,
)
return ServiceConfig(
image=IMAGE_NAME,
ports=USED_PORTS,
files={
LIGHT_BEACONCHAIN_CONFIG_MOUNT_DIRPATH_ON_SERVICE: config_files_artifact_name,
VALIDATOR_RANGES_MOUNT_DIRPATH_ON_SERVICE: VALIDATOR_RANGES_ARTIFACT_NAME,
CL_CONFIG_MOUNT_DIRPATH_ON_SERVICE: CL_CONFIG_ARTIFACT_NAME,
},
cmd=["-config", config_file_path],
)
def new_config_template_data(listen_port_num, cl_client_info):
return {
"ListenPortNum": listen_port_num,
"CLClientInfo": cl_client_info,
}
return {
"ListenPortNum": listen_port_num,
"CLClientInfo": cl_client_info,
}
def new_cl_client_info(ip_addr, port_num, service_name):
return {
"IPAddr": ip_addr,
"PortNum": port_num,
"Name": service_name
}
return {"IPAddr": ip_addr, "PortNum": port_num, "Name": service_name}
def new_mev_boost_context(private_ip_address, port):
return struct(
private_ip_address = private_ip_address,
port = port,
)
return struct(
private_ip_address=private_ip_address,
port=port,
)
def mev_boost_endpoint(mev_boost_context):
return "http://{0}:{1}".format(mev_boost_context.private_ip_address, mev_boost_context.port)
return "http://{0}:{1}".format(
mev_boost_context.private_ip_address, mev_boost_context.port
)
shared_utils = import_module("github.com/kurtosis-tech/eth2-package/src/shared_utils/shared_utils.star")
mev_boost_context_module = import_module("github.com/kurtosis-tech/eth2-package/src/mev_boost/mev_boost_context.star")
parse_input = import_module("github.com/kurtosis-tech/eth2-package/src/package_io/parse_input.star")
shared_utils = import_module(
"github.com/kurtosis-tech/eth2-package/src/shared_utils/shared_utils.star"
)
mev_boost_context_module = import_module(
"github.com/kurtosis-tech/eth2-package/src/mev_boost/mev_boost_context.star"
)
parse_input = import_module(
"github.com/kurtosis-tech/eth2-package/src/package_io/parse_input.star"
)
FLASHBOTS_MEV_BOOST_PROTOCOL = "TCP"
USED_PORTS = {
"api": shared_utils.new_port_spec(parse_input.FLASHBOTS_MEV_BOOST_PORT, FLASHBOTS_MEV_BOOST_PROTOCOL, wait="5s")
"api": shared_utils.new_port_spec(
parse_input.FLASHBOTS_MEV_BOOST_PORT, FLASHBOTS_MEV_BOOST_PROTOCOL, wait="5s"
)
}
NETWORK_ID_TO_NAME = {
"5": "goerli",
"11155111": "sepolia",
"3": "ropsten",
"5": "goerli",
"11155111": "sepolia",
"3": "ropsten",
}
def launch(plan, mev_boost_launcher, service_name, network_id, mev_boost_image):
config = get_config(mev_boost_launcher, network_id, mev_boost_image)
config = get_config(mev_boost_launcher, network_id, mev_boost_image)
mev_boost_service = plan.add_service(service_name, config)
mev_boost_service = plan.add_service(service_name, config)
return mev_boost_context_module.new_mev_boost_context(mev_boost_service.ip_address, parse_input.FLASHBOTS_MEV_BOOST_PORT)
return mev_boost_context_module.new_mev_boost_context(
mev_boost_service.ip_address, parse_input.FLASHBOTS_MEV_BOOST_PORT
)
def get_config(mev_boost_launcher, network_id, mev_boost_image):
command = ["mev-boost"]
if mev_boost_launcher.should_check_relay:
command.append("-relay-check")
return ServiceConfig(
image = mev_boost_image,
ports = USED_PORTS,
cmd = command,
env_vars = {
# TODO(maybe) remove the hardcoding
# This is set to match this file https://github.com/kurtosis-tech/eth-network-package/blob/main/static_files/genesis-generation-config/cl/config.yaml.tmpl#L11
# latest-notes
# does this need genesis time to be set as well
"GENESIS_FORK_VERSION": "0x10000038",
"BOOST_LISTEN_ADDR": "0.0.0.0:{0}".format(parse_input.FLASHBOTS_MEV_BOOST_PORT),
# maybe this is breaking; this isn't verifyign the bid and not sending it to the validator
"SKIP_RELAY_SIGNATURE_CHECK": "1",
"RELAYS": mev_boost_launcher.relay_end_points[0]
}
)
command = ["mev-boost"]
if mev_boost_launcher.should_check_relay:
command.append("-relay-check")
def new_mev_boost_launcher(should_check_relay, relay_end_points):
return struct(should_check_relay=should_check_relay, relay_end_points=relay_end_points)
return ServiceConfig(
image=mev_boost_image,
ports=USED_PORTS,
cmd=command,
env_vars={
# TODO(maybe) remove the hardcoding
# This is set to match this file https://github.com/kurtosis-tech/eth-network-package/blob/main/static_files/genesis-generation-config/cl/config.yaml.tmpl#L11
# latest-notes
# does this need genesis time to be set as well
"GENESIS_FORK_VERSION": "0x10000038",
"BOOST_LISTEN_ADDR": "0.0.0.0:{0}".format(
parse_input.FLASHBOTS_MEV_BOOST_PORT
),
# maybe this is breaking; this isn't verifyign the bid and not sending it to the validator
"SKIP_RELAY_SIGNATURE_CHECK": "1",
"RELAYS": mev_boost_launcher.relay_end_points[0],
},
)
def new_mev_boost_launcher(should_check_relay, relay_end_points):
return struct(
should_check_relay=should_check_relay, relay_end_points=relay_end_points
)
PYTHON_IMAGE = "python:3.11-alpine"
CUSTOM_FLOOD_SREVICE_NAME = "mev-custom-flood"
def spam_in_background(plan, sender_key, receiver_key, el_uri):
sender_script = plan.upload_files("github.com/kurtosis-tech/eth2-package/src/mev_custom_flood/sender.py")
sender_script = plan.upload_files(
"github.com/kurtosis-tech/eth2-package/src/mev_custom_flood/sender.py"
)
plan.add_service(
name = CUSTOM_FLOOD_SREVICE_NAME,
config = ServiceConfig(
image = PYTHON_IMAGE,
files = {
"/tmp": sender_script
},
cmd = ["/bin/sh", "-c", "touch /tmp/sender.log && tail -f /tmp/sender.log"],
env_vars = {
name=CUSTOM_FLOOD_SREVICE_NAME,
config=ServiceConfig(
image=PYTHON_IMAGE,
files={"/tmp": sender_script},
cmd=["/bin/sh", "-c", "touch /tmp/sender.log && tail -f /tmp/sender.log"],
env_vars={
"SENDER_PRIVATE_KEY": sender_key,
"RECEIVER_PUBLIC_KEY": receiver_key,
"EL_RPC_URI": el_uri,
}
)
},
),
)
plan.exec(
service_name = CUSTOM_FLOOD_SREVICE_NAME,
recipe = ExecRecipe(["pip", "install", "web3"])
service_name=CUSTOM_FLOOD_SREVICE_NAME,
recipe=ExecRecipe(["pip", "install", "web3"]),
)
plan.exec(
service_name = CUSTOM_FLOOD_SREVICE_NAME,
recipe = ExecRecipe(["/bin/sh", "-c", "nohup python /tmp/sender.py > /dev/null 2>&1 &"])
service_name=CUSTOM_FLOOD_SREVICE_NAME,
recipe=ExecRecipe(
["/bin/sh", "-c", "nohup python /tmp/sender.py > /dev/null 2>&1 &"]
),
)
ADMIN_KEY_INDEX = 0
USER_KEY_INDEX = 2
def prefixed_address(address):
return "0x" + address
def launch_mev_flood(plan, image, el_uri, genesis_accounts):
plan.add_service(
name = "mev-flood",
config = ServiceConfig(
image = image,
entrypoint = ["/bin/sh", "-c", "touch main.log && tail -F main.log"]
)
name="mev-flood",
config=ServiceConfig(
image=image,
entrypoint=["/bin/sh", "-c", "touch main.log && tail -F main.log"],
),
)
plan.exec(
service_name = "mev-flood",
recipe = ExecRecipe(
command = ["/bin/sh", "-c", "./run init -r {0} -k {1} -u {2} -s deployment.json".format(el_uri, prefixed_address(genesis_accounts[0].private_key), prefixed_address(genesis_accounts[2].private_key))]
)
service_name="mev-flood",
recipe=ExecRecipe(
command=[
"/bin/sh",
"-c",
"./run init -r {0} -k {1} -u {2} -s deployment.json".format(
el_uri,
prefixed_address(genesis_accounts[0].private_key),
prefixed_address(genesis_accounts[2].private_key),
),
]
),
)
def spam_in_background(plan, el_uri, mev_flood_extra_args, seconds_per_bundle, genesis_accounts):
admin_key, user_key = prefixed_address(genesis_accounts[0].private_key), prefixed_address(genesis_accounts[2].private_key)
command = ["/bin/sh", "-c", "nohup ./run spam -r {0} -k {1} -u {2} -l deployment.json --secondsPerBundle {3} >main.log 2>&1 &".format(el_uri, admin_key, user_key, seconds_per_bundle)]
def spam_in_background(
plan, el_uri, mev_flood_extra_args, seconds_per_bundle, genesis_accounts
):
admin_key, user_key = prefixed_address(
genesis_accounts[0].private_key
), prefixed_address(genesis_accounts[2].private_key)
command = [
"/bin/sh",
"-c",
"nohup ./run spam -r {0} -k {1} -u {2} -l deployment.json --secondsPerBundle {3} >main.log 2>&1 &".format(
el_uri, admin_key, user_key, seconds_per_bundle
),
]
if mev_flood_extra_args:
joined_extra_args = " ".join(mev_flood_extra_args)
command = ["/bin/sh", "-c", "nohup ./run spam -r {0} -k {1} -u {2} -l deployment.json --secondsPerBundle {3} {4} >main.log 2>&1 &".format(el_uri, admin_key, user_key, seconds_per_bundle, joined_extra_args)]
plan.exec(
service_name = "mev-flood",
recipe = ExecRecipe(
command = command
)
)
command = [
"/bin/sh",
"-c",
"nohup ./run spam -r {0} -k {1} -u {2} -l deployment.json --secondsPerBundle {3} {4} >main.log 2>&1 &".format(
el_uri, admin_key, user_key, seconds_per_bundle, joined_extra_args
),
]
plan.exec(service_name="mev-flood", recipe=ExecRecipe(command=command))
......@@ -12,64 +12,128 @@ MEV_RELAY_ENDPOINT_PORT = 9062
MEV_RELAY_WEBSITE_PORT = 9060
NETWORK_ID_TO_NAME = {
"5": "goerli",
"11155111": "sepolia",
"3": "ropsten",
"5": "goerli",
"11155111": "sepolia",
"3": "ropsten",
}
def launch_mev_relay(plan, mev_params, network_id, beacon_uris, validator_root, builder_uri, seconds_per_slot, slots_per_epoch = 32):
def launch_mev_relay(
plan,
mev_params,
network_id,
beacon_uris,
validator_root,
builder_uri,
seconds_per_slot,
slots_per_epoch=32,
):
redis = redis_module.run(plan)
# making the password postgres as the relay expects it to be postgres
postgres = postgres_module.run(plan, password = "postgres", user = "postgres", database = "postgres", service_name = "postgres")
postgres = postgres_module.run(
plan,
password="postgres",
user="postgres",
database="postgres",
service_name="postgres",
)
network_name = NETWORK_ID_TO_NAME.get(network_id, network_id)
image = mev_params.mev_relay_image
# TODO(maybe) remove hardocded values for the forks
env_vars= {
env_vars = {
"GENESIS_FORK_VERSION": "0x10000038",
"BELLATRIX_FORK_VERSION": "0x30000038",
"CAPELLA_FORK_VERSION": "0x40000038",
"DENEB_FORK_VERSION": "0x50000038",
"GENESIS_VALIDATORS_ROOT": validator_root,
"SEC_PER_SLOT": str(seconds_per_slot),
"SLOTS_PER_EPOCH": str(slots_per_epoch)
"SLOTS_PER_EPOCH": str(slots_per_epoch),
}
redis_url = "{}:{}".format(redis.hostname, redis.port_number)
postgres_url = postgres.url + "?sslmode=disable"
plan.add_service(
name = MEV_RELAY_HOUSEKEEPER,
config = ServiceConfig(
image = image,
cmd = ["housekeeper", "--network", "custom", "--db", postgres_url, "--redis-uri", redis_url, "--beacon-uris", beacon_uris] + mev_params.mev_relay_housekeeper_extra_args,
env_vars= env_vars
)
name=MEV_RELAY_HOUSEKEEPER,
config=ServiceConfig(
image=image,
cmd=[
"housekeeper",
"--network",
"custom",
"--db",
postgres_url,
"--redis-uri",
redis_url,
"--beacon-uris",
beacon_uris,
]
+ mev_params.mev_relay_housekeeper_extra_args,
env_vars=env_vars,
),
)
api = plan.add_service(
name = MEV_RELAY_ENDPOINT,
config = ServiceConfig(
image = image,
cmd = ["api", "--network", "custom", "--db", postgres_url, "--secret-key", DUMMY_SECRET_KEY, "--listen-addr", "0.0.0.0:{0}".format(MEV_RELAY_ENDPOINT_PORT), "--redis-uri", redis_url, "--beacon-uris", beacon_uris, "--blocksim", builder_uri] + mev_params.mev_relay_api_extra_args,
ports = {
"api": PortSpec(number = MEV_RELAY_ENDPOINT_PORT, transport_protocol= "TCP")
name=MEV_RELAY_ENDPOINT,
config=ServiceConfig(
image=image,
cmd=[
"api",
"--network",
"custom",
"--db",
postgres_url,
"--secret-key",
DUMMY_SECRET_KEY,
"--listen-addr",
"0.0.0.0:{0}".format(MEV_RELAY_ENDPOINT_PORT),
"--redis-uri",
redis_url,
"--beacon-uris",
beacon_uris,
"--blocksim",
builder_uri,
]
+ mev_params.mev_relay_api_extra_args,
ports={
"api": PortSpec(
number=MEV_RELAY_ENDPOINT_PORT, transport_protocol="TCP"
)
},
env_vars= env_vars
)
env_vars=env_vars,
),
)
plan.add_service(
name = MEV_RELAY_WEBSITE,
config = ServiceConfig(
image = image,
cmd = ["website", "--network", "custom", "--db", postgres_url, "--listen-addr", "0.0.0.0:{0}".format(MEV_RELAY_WEBSITE_PORT), "--redis-uri", redis_url, "https://{0}@{1}".format(DUMMY_PUB_KEY, MEV_RELAY_ENDPOINT)] + mev_params.mev_relay_website_extra_args,
ports = {
"api": PortSpec(number = MEV_RELAY_WEBSITE_PORT, transport_protocol= "TCP", application_protocol="http")
name=MEV_RELAY_WEBSITE,
config=ServiceConfig(
image=image,
cmd=[
"website",
"--network",
"custom",
"--db",
postgres_url,
"--listen-addr",
"0.0.0.0:{0}".format(MEV_RELAY_WEBSITE_PORT),
"--redis-uri",
redis_url,
"https://{0}@{1}".format(DUMMY_PUB_KEY, MEV_RELAY_ENDPOINT),
]
+ mev_params.mev_relay_website_extra_args,
ports={
"api": PortSpec(
number=MEV_RELAY_WEBSITE_PORT,
transport_protocol="TCP",
application_protocol="http",
)
},
env_vars= env_vars
)
env_vars=env_vars,
),
)
return "http://{0}@{1}:{2}".format(DUMMY_PUB_KEY, api.ip_address, MEV_RELAY_ENDPOINT_PORT)
return "http://{0}@{1}:{2}".format(
DUMMY_PUB_KEY, api.ip_address, MEV_RELAY_ENDPOINT_PORT
)
......@@ -3,21 +3,26 @@ MOCK_MEV_SERVICE_NAME = "mock-mev"
MOCK_MEV_BUILDER_PORT = 18550
DEFAULT_MOCK_MEV_PUB_KEY = "0x95fde78acd5f6886ddaf5d0056610167c513d09c1c0efabbc7cdcc69beea113779c4a81e2d24daafc5387dbf6ac5fe48"
def launch_mock_mev(plan, el_uri, beacon_uri, jwt_secret, global_client_log_level):
mock_builder = plan.add_service(
name = MOCK_MEV_SERVICE_NAME,
config = ServiceConfig(
image = MOCK_MEV_IMAGE,
ports = {
"rest": PortSpec(number = MOCK_MEV_BUILDER_PORT, transport_protocol="TCP"),
},
cmd = [
"--jwt-secret={0}".format(jwt_secret),
"--el={0}".format(el_uri),
"--cl={0}".format(beacon_uri),
"--bid-multiplier=5", # TODO: This could be customizable
"--log-level={0}".format(global_client_log_level)
]
)
)
return "http://{0}@{1}:{2}".format(DEFAULT_MOCK_MEV_PUB_KEY, mock_builder.ip_address, MOCK_MEV_BUILDER_PORT)
mock_builder = plan.add_service(
name=MOCK_MEV_SERVICE_NAME,
config=ServiceConfig(
image=MOCK_MEV_IMAGE,
ports={
"rest": PortSpec(
number=MOCK_MEV_BUILDER_PORT, transport_protocol="TCP"
),
},
cmd=[
"--jwt-secret={0}".format(jwt_secret),
"--el={0}".format(el_uri),
"--cl={0}".format(beacon_uri),
"--bid-multiplier=5", # TODO: This could be customizable
"--log-level={0}".format(global_client_log_level),
],
),
)
return "http://{0}@{1}:{2}".format(
DEFAULT_MOCK_MEV_PUB_KEY, mock_builder.ip_address, MOCK_MEV_BUILDER_PORT
)
EL_CLIENT_TYPE = struct(
geth="geth",
erigon="erigon",
nethermind="nethermind",
besu="besu"
geth="geth", erigon="erigon", nethermind="nethermind", besu="besu"
)
CL_CLIENT_TYPE = struct(
lighthouse="lighthouse",
teku="teku",
nimbus="nimbus",
prysm="prysm",
lodestar="lodestar"
lighthouse="lighthouse",
teku="teku",
nimbus="nimbus",
prysm="prysm",
lodestar="lodestar",
)
GLOBAL_CLIENT_LOG_LEVEL = struct(
info="info",
error="error",
warn="warn",
debug="debug",
trace="trace",
info="info",
error="error",
warn="warn",
debug="debug",
trace="trace",
)
This diff is collapsed.
shared_utils = import_module("github.com/kurtosis-tech/eth2-package/src/shared_utils/shared_utils.star")
shared_utils = import_module(
"github.com/kurtosis-tech/eth2-package/src/shared_utils/shared_utils.star"
)
SERVICE_NAME = "prometheus"
......@@ -12,59 +14,66 @@ CONFIG_FILENAME = "prometheus-config.yml"
CONFIG_DIR_MOUNTPOINT_ON_PROMETHEUS = "/config"
USED_PORTS = {
HTTP_PORT_ID: shared_utils.new_port_spec(HTTP_PORT_NUMBER, shared_utils.TCP_PROTOCOL, shared_utils.HTTP_APPLICATION_PROTOCOL)
HTTP_PORT_ID: shared_utils.new_port_spec(
HTTP_PORT_NUMBER,
shared_utils.TCP_PROTOCOL,
shared_utils.HTTP_APPLICATION_PROTOCOL,
)
}
def launch_prometheus(plan, config_template, cl_client_contexts, el_client_contexts):
all_nodes_metrics_info = []
for client in cl_client_contexts:
all_nodes_metrics_info.extend(client.cl_nodes_metrics_info)
all_nodes_metrics_info = []
for client in cl_client_contexts:
all_nodes_metrics_info.extend(client.cl_nodes_metrics_info)
for client in el_client_contexts:
# etheruemjs doesn't populate metrics just yet
if client.el_metrics_info != [None]:
all_nodes_metrics_info.extend(client.el_metrics_info)
for client in el_client_contexts:
# etheruemjs doesn't populate metrics just yet
if client.el_metrics_info != [None]:
all_nodes_metrics_info.extend(client.el_metrics_info)
template_data = new_config_template_data(all_nodes_metrics_info)
template_and_data = shared_utils.new_template_and_data(config_template, template_data)
template_and_data_by_rel_dest_filepath = {}
template_and_data_by_rel_dest_filepath[CONFIG_FILENAME] = template_and_data
template_data = new_config_template_data(all_nodes_metrics_info)
template_and_data = shared_utils.new_template_and_data(
config_template, template_data
)
template_and_data_by_rel_dest_filepath = {}
template_and_data_by_rel_dest_filepath[CONFIG_FILENAME] = template_and_data
config_files_artifact_name = plan.render_templates(template_and_data_by_rel_dest_filepath, "prometheus-config")
config_files_artifact_name = plan.render_templates(
template_and_data_by_rel_dest_filepath, "prometheus-config"
)
config = get_config(config_files_artifact_name)
prometheus_service = plan.add_service(SERVICE_NAME, config)
config = get_config(config_files_artifact_name)
prometheus_service = plan.add_service(SERVICE_NAME, config)
private_ip_address = prometheus_service.ip_address
prometheus_service_http_port = prometheus_service.ports[HTTP_PORT_ID].number
private_ip_address = prometheus_service.ip_address
prometheus_service_http_port = prometheus_service.ports[HTTP_PORT_ID].number
return "http://{0}:{1}".format(private_ip_address, prometheus_service_http_port)
return "http://{0}:{1}".format(private_ip_address, prometheus_service_http_port)
def get_config(config_files_artifact_name):
config_file_path = shared_utils.path_join(CONFIG_DIR_MOUNTPOINT_ON_PROMETHEUS, shared_utils.path_base(CONFIG_FILENAME))
return ServiceConfig(
image = IMAGE_NAME,
ports = USED_PORTS,
files = {
CONFIG_DIR_MOUNTPOINT_ON_PROMETHEUS: config_files_artifact_name
},
cmd = [
# You can check all the cli flags starting the container and going to the flags section
# in Prometheus admin page "{{prometheusPublicURL}}/flags" section
"--config.file=" + config_file_path,
"--storage.tsdb.path=/prometheus",
"--storage.tsdb.retention.time=1d",
"--storage.tsdb.retention.size=512MB",
"--storage.tsdb.wal-compression",
"--web.console.libraries=/etc/prometheus/console_libraries",
"--web.console.templates=/etc/prometheus/consoles",
"--web.enable-lifecycle",
]
)
config_file_path = shared_utils.path_join(
CONFIG_DIR_MOUNTPOINT_ON_PROMETHEUS, shared_utils.path_base(CONFIG_FILENAME)
)
return ServiceConfig(
image=IMAGE_NAME,
ports=USED_PORTS,
files={CONFIG_DIR_MOUNTPOINT_ON_PROMETHEUS: config_files_artifact_name},
cmd=[
# You can check all the cli flags starting the container and going to the flags section
# in Prometheus admin page "{{prometheusPublicURL}}/flags" section
"--config.file=" + config_file_path,
"--storage.tsdb.path=/prometheus",
"--storage.tsdb.retention.time=1d",
"--storage.tsdb.retention.size=512MB",
"--storage.tsdb.wal-compression",
"--web.console.libraries=/etc/prometheus/console_libraries",
"--web.console.templates=/etc/prometheus/consoles",
"--web.enable-lifecycle",
],
)
def new_config_template_data(cl_nodes_metrics_info):
return {
"CLNodesMetricsInfo": cl_nodes_metrics_info
}
return {"CLNodesMetricsInfo": cl_nodes_metrics_info}
......@@ -3,30 +3,46 @@ UDP_PROTOCOL = "UDP"
HTTP_APPLICATION_PROTOCOL = "http"
NOT_PROVIDED_APPLICATION_PROTOCOL = ""
NOT_PROVIDED_WAIT = "not-provided-wait"
def new_template_and_data(template, template_data_json):
return struct(template = template, data = template_data_json)
return struct(template=template, data=template_data_json)
def path_join(*args):
joined_path = "/".join(args)
return joined_path.replace("//", "/")
joined_path = "/".join(args)
return joined_path.replace("//", "/")
def path_base(path):
split_path = path.split("/")
return split_path[-1]
split_path = path.split("/")
return split_path[-1]
def path_dir(path):
split_path = path.split("/")
if len(split_path) <= 1:
return "."
split_path = split_path[:-1]
return "/".join(split_path) or "/"
def new_port_spec(number, transport_protocol, application_protocol = NOT_PROVIDED_APPLICATION_PROTOCOL, wait = NOT_PROVIDED_WAIT):
if (wait == NOT_PROVIDED_WAIT):
return PortSpec(number = number, transport_protocol = transport_protocol, application_protocol = application_protocol)
return PortSpec(number = number, transport_protocol = transport_protocol, application_protocol = application_protocol, wait = wait)
split_path = path.split("/")
if len(split_path) <= 1:
return "."
split_path = split_path[:-1]
return "/".join(split_path) or "/"
def new_port_spec(
number,
transport_protocol,
application_protocol=NOT_PROVIDED_APPLICATION_PROTOCOL,
wait=NOT_PROVIDED_WAIT,
):
if wait == NOT_PROVIDED_WAIT:
return PortSpec(
number=number,
transport_protocol=transport_protocol,
application_protocol=application_protocol,
)
return PortSpec(
number=number,
transport_protocol=transport_protocol,
application_protocol=application_protocol,
wait=wait,
)
......@@ -2,29 +2,39 @@
STATIC_FILES_DIRPATH = "github.com/kurtosis-tech/eth2-package/static_files"
# CL Forkmon config
CL_FORKMON_CONFIG_TEMPLATE_FILEPATH = STATIC_FILES_DIRPATH + \
"/cl-forkmon-config/config.toml.tmpl"
CL_FORKMON_CONFIG_TEMPLATE_FILEPATH = (
STATIC_FILES_DIRPATH + "/cl-forkmon-config/config.toml.tmpl"
)
# EL Forkmon config
EL_FORKMON_CONFIG_TEMPLATE_FILEPATH = STATIC_FILES_DIRPATH + \
"/el-forkmon-config/config.toml.tmpl"
EL_FORKMON_CONFIG_TEMPLATE_FILEPATH = (
STATIC_FILES_DIRPATH + "/el-forkmon-config/config.toml.tmpl"
)
# Prometheus config
PROMETHEUS_CONFIG_TEMPLATE_FILEPATH = STATIC_FILES_DIRPATH + \
"/prometheus-config/prometheus.yml.tmpl"
PROMETHEUS_CONFIG_TEMPLATE_FILEPATH = (
STATIC_FILES_DIRPATH + "/prometheus-config/prometheus.yml.tmpl"
)
# Beacon Metrics Gazer config
BEACON_METRICS_GAZER_CONFIG_TEMPLATE_FILEPATH = STATIC_FILES_DIRPATH + \
"/beacon-metrics-gazer-config/config.yaml.tmpl"
BEACON_METRICS_GAZER_CONFIG_TEMPLATE_FILEPATH = (
STATIC_FILES_DIRPATH + "/beacon-metrics-gazer-config/config.yaml.tmpl"
)
LIGHT_BEACONCHAIN_CONFIG_TEMPLATE_FILEPATH = STATIC_FILES_DIRPATH + \
"/light-beaconchain-config/config.yaml.tmpl"
LIGHT_BEACONCHAIN_CONFIG_TEMPLATE_FILEPATH = (
STATIC_FILES_DIRPATH + "/light-beaconchain-config/config.yaml.tmpl"
)
# Grafana config
GRAFANA_CONFIG_DIRPATH = "/grafana-config"
GRAFANA_DATASOURCE_CONFIG_TEMPLATE_FILEPATH = STATIC_FILES_DIRPATH + \
GRAFANA_CONFIG_DIRPATH + "/templates/datasource.yml.tmpl"
GRAFANA_DASHBOARD_PROVIDERS_CONFIG_TEMPLATE_FILEPATH = STATIC_FILES_DIRPATH + \
GRAFANA_CONFIG_DIRPATH + "/templates/dashboard-providers.yml.tmpl"
GRAFANA_DASHBOARDS_CONFIG_DIRPATH = STATIC_FILES_DIRPATH + \
GRAFANA_CONFIG_DIRPATH + "/dashboards"
GRAFANA_DATASOURCE_CONFIG_TEMPLATE_FILEPATH = (
STATIC_FILES_DIRPATH + GRAFANA_CONFIG_DIRPATH + "/templates/datasource.yml.tmpl"
)
GRAFANA_DASHBOARD_PROVIDERS_CONFIG_TEMPLATE_FILEPATH = (
STATIC_FILES_DIRPATH
+ GRAFANA_CONFIG_DIRPATH
+ "/templates/dashboard-providers.yml.tmpl"
)
GRAFANA_DASHBOARDS_CONFIG_DIRPATH = (
STATIC_FILES_DIRPATH + GRAFANA_CONFIG_DIRPATH + "/dashboards"
)
IMAGE_NAME = "ethpandaops/tx-fuzz:master"
SERVICE_NAME = "transaction-spammer"
def launch_transaction_spammer(plan, prefunded_addresses, el_client_context, tx_spammer_params):
config = get_config(prefunded_addresses, el_client_context, tx_spammer_params.tx_spammer_extra_args)
plan.add_service(SERVICE_NAME, config)
def launch_transaction_spammer(
plan, prefunded_addresses, el_client_context, tx_spammer_params
):
config = get_config(
prefunded_addresses, el_client_context, tx_spammer_params.tx_spammer_extra_args
)
plan.add_service(SERVICE_NAME, config)
def get_config(prefunded_addresses, el_client_context, tx_spammer_extra_args):
return ServiceConfig(
image = IMAGE_NAME,
cmd = [
"spam",
"--rpc=http://{0}:{1}".format(el_client_context.ip_addr, el_client_context.rpc_port_num),
"--sk={0}".format(prefunded_addresses[3].private_key),
"{0}".format(" ".join(tx_spammer_extra_args))
]
)
def get_config(prefunded_addresses, el_client_context, tx_spammer_extra_args):
return ServiceConfig(
image=IMAGE_NAME,
cmd=[
"spam",
"--rpc=http://{0}:{1}".format(
el_client_context.ip_addr, el_client_context.rpc_port_num
),
"--sk={0}".format(prefunded_addresses[3].private_key),
"{0}".format(" ".join(tx_spammer_extra_args)),
],
)
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