diff --git a/.github/tests/mix-public.yaml b/.github/tests/mix-public.yaml index 5a97ad357..0a00ddd52 100644 --- a/.github/tests/mix-public.yaml +++ b/.github/tests/mix-public.yaml @@ -15,6 +15,7 @@ participants: - el_type: ethereumjs cl_type: grandine port_publisher: + nat_exit_ip: KURTOSIS_IP_ADDR_PLACEHOLDER el: enabled: true public_port_start: 40000 diff --git a/README.md b/README.md index dcdcbe56e..521476c68 100644 --- a/README.md +++ b/README.md @@ -1063,13 +1063,14 @@ ethereum_genesis_generator_params: # The image to use for ethereum genesis generator image: ethpandaops/ethereum-genesis-generator:4.1.17 -# Global parameter to set the exit ip address of services and public ports +# Configuration for public ports and NAT exit IP addresses port_publisher: - # if you have a service that you want to expose on a specific interface; set that IP here - # if you set it to auto it gets the public ip from ident.me and sets it - # Defaults to constants.PRIVATE_IP_ADDRESS_PLACEHOLDER - # The default value just means its the IP address of the container in which the service is running + # Global NAT exit IP address for all services (optional) + # If set, this will be used for all service groups (overrides individual nat_exit_ip settings) + # Set to "auto" to automatically detect public IP from ident.me + # Defaults to KURTOSIS_IP_ADDR_PLACEHOLDER (uses per-service settings) nat_exit_ip: KURTOSIS_IP_ADDR_PLACEHOLDER + # Execution Layer public port exposed to your local machine # Disabled by default # Public port start defaults to 32000 @@ -1077,6 +1078,12 @@ port_publisher: el: enabled: false public_port_start: 32000 + # nat_exit_ip: IP address to expose for EL P2P networking (optional) + # Only used if global nat_exit_ip is not set + # Set to "auto" to automatically detect public IP from ident.me + # Defaults to KURTOSIS_IP_ADDR_PLACEHOLDER (container IP) + nat_exit_ip: KURTOSIS_IP_ADDR_PLACEHOLDER + # Consensus Layer public port exposed to your local machine # Disabled by default # Public port start defaults to 33000 @@ -1084,6 +1091,12 @@ port_publisher: cl: enabled: false public_port_start: 33000 + # nat_exit_ip: IP address to expose for CL P2P networking (optional) + # Only used if global nat_exit_ip is not set + # Set to "auto" to automatically detect public IP from ident.me + # Defaults to KURTOSIS_IP_ADDR_PLACEHOLDER (container IP) + nat_exit_ip: KURTOSIS_IP_ADDR_PLACEHOLDER + # Validator client public port exposed to your local machine # Disabled by default # Public port start defaults to 34000 @@ -1091,6 +1104,12 @@ port_publisher: vc: enabled: false public_port_start: 34000 + # nat_exit_ip: IP address to expose for VC networking (optional) + # Only used if global nat_exit_ip is not set + # Set to "auto" to automatically detect public IP from ident.me + # Defaults to KURTOSIS_IP_ADDR_PLACEHOLDER (container IP) + nat_exit_ip: KURTOSIS_IP_ADDR_PLACEHOLDER + # remote signer public port exposed to your local machine # Disabled by default # Public port start defaults to 35000 @@ -1098,6 +1117,12 @@ port_publisher: remote_signer: enabled: false public_port_start: 35000 + # nat_exit_ip: IP address to expose for remote signer networking (optional) + # Only used if global nat_exit_ip is not set + # Set to "auto" to automatically detect public IP from ident.me + # Defaults to KURTOSIS_IP_ADDR_PLACEHOLDER (container IP) + nat_exit_ip: KURTOSIS_IP_ADDR_PLACEHOLDER + # Additional services public port exposed to your local machine # Disabled by default # Public port start defaults to 36000 @@ -1105,6 +1130,11 @@ port_publisher: additional_services: enabled: false public_port_start: 36000 + # nat_exit_ip: IP address to expose for additional services (optional) + # Only used if global nat_exit_ip is not set + # Set to "auto" to automatically detect public IP from ident.me + # Defaults to KURTOSIS_IP_ADDR_PLACEHOLDER (container IP) + nat_exit_ip: KURTOSIS_IP_ADDR_PLACEHOLDER # MEV public port exposed to your local machine # Disabled by default @@ -1113,6 +1143,11 @@ port_publisher: mev: enabled: false public_port_start: 37000 + # nat_exit_ip: IP address to expose for MEV services (optional) + # Only used if global nat_exit_ip is not set + # Set to "auto" to automatically detect public IP from ident.me + # Defaults to KURTOSIS_IP_ADDR_PLACEHOLDER (container IP) + nat_exit_ip: KURTOSIS_IP_ADDR_PLACEHOLDER # Other public port exposed to your local machine (like ethereum metrics exporter, snooper) # Disabled by default @@ -1121,10 +1156,70 @@ port_publisher: other: enabled: false public_port_start: 38000 + # nat_exit_ip: IP address to expose for other services (optional) + # Only used if global nat_exit_ip is not set + # Set to "auto" to automatically detect public IP from ident.me + # Defaults to KURTOSIS_IP_ADDR_PLACEHOLDER (container IP) + nat_exit_ip: KURTOSIS_IP_ADDR_PLACEHOLDER ``` #### Example configurations +
+ Port Publisher Configuration Examples + +**Global NAT Exit IP (Backward Compatible)** +```yaml +port_publisher: + nat_exit_ip: "auto" # All services use auto-detected public IP + el: + enabled: true + public_port_start: 32000 + cl: + enabled: true + public_port_start: 33000 + additional_services: + enabled: true + public_port_start: 36000 +``` + +**Per-Service NAT Exit IP (Granular Control)** +```yaml +port_publisher: + nat_exit_ip: KURTOSIS_IP_ADDR_PLACEHOLDER # Not set globally + el: + enabled: true + public_port_start: 32000 + nat_exit_ip: "auto" # Only EL uses public IP + cl: + enabled: true + public_port_start: 33000 + nat_exit_ip: KURTOSIS_IP_ADDR_PLACEHOLDER # CL uses container IP + additional_services: + enabled: true + public_port_start: 36000 + nat_exit_ip: "192.168.1.100" # Custom IP for additional services +``` + +**Mixed Configuration** +```yaml +port_publisher: + nat_exit_ip: KURTOSIS_IP_ADDR_PLACEHOLDER # Not set globally + el: + enabled: true + public_port_start: 32000 + nat_exit_ip: "auto" # Auto-detect for EL + cl: + enabled: true + public_port_start: 33000 + nat_exit_ip: "auto" # Auto-detect for CL + additional_services: + enabled: true + public_port_start: 36000 + # Uses default KURTOSIS_IP_ADDR_PLACEHOLDER for additional services +``` +
+
Verkle configuration example diff --git a/network_params.yaml b/network_params.yaml index 3c371f69a..21284d90c 100644 --- a/network_params.yaml +++ b/network_params.yaml @@ -227,3 +227,6 @@ port_publisher: mev: enabled: false public_port_start: 37000 + other: + enabled: false + public_port_start: 38000 diff --git a/src/blobscan/blobscan_launcher.star b/src/blobscan/blobscan_launcher.star index a325adf5d..076116e6f 100644 --- a/src/blobscan/blobscan_launcher.star +++ b/src/blobscan/blobscan_launcher.star @@ -10,6 +10,22 @@ SECRET_KEY = "supersecure" WEB_HTTP_PORT_NUMBER = 3000 API_HTTP_PORT_NUMBER = 3001 + +def get_blobscan_api_host(blobscan_config, port_publisher): + if port_publisher.additional_services_enabled: + return port_publisher.additional_services_nat_exit_ip + return blobscan_config.ip_address + + +def get_blobscan_api_port(blobscan_config, port_publisher): + if port_publisher.additional_services_enabled: + public_ports = shared_utils.get_public_ports_for_component( + "additional_services", port_publisher, 0 + ) + return public_ports[1] # Second port for the API (first is web) + return blobscan_config.ports[constants.HTTP_PORT_ID].number + + WEB_PORTS = { constants.HTTP_PORT_ID: shared_utils.new_port_spec( WEB_HTTP_PORT_NUMBER, @@ -116,7 +132,8 @@ def launch_blobscan( blobscan_config = plan.add_service(API_SERVICE_NAME, api_config) blobscan_api_url = "http://{0}:{1}".format( - blobscan_config.ip_address, blobscan_config.ports[constants.HTTP_PORT_ID].number + get_blobscan_api_host(blobscan_config, port_publisher), + get_blobscan_api_port(blobscan_config, port_publisher), ) web_config = get_web_config( diff --git a/src/blockscout/blockscout_launcher.star b/src/blockscout/blockscout_launcher.star index f54fd9910..1aa3eb64d 100644 --- a/src/blockscout/blockscout_launcher.star +++ b/src/blockscout/blockscout_launcher.star @@ -9,6 +9,23 @@ SERVICE_NAME_FRONTEND = "blockscout-frontend" HTTP_PORT_NUMBER = 4000 HTTP_PORT_NUMBER_VERIF = 8050 HTTP_PORT_NUMBER_FRONTEND = 3000 + + +def get_api_host(blockscout_service, port_publisher): + if port_publisher.additional_services_enabled: + return port_publisher.additional_services_nat_exit_ip + return blockscout_service.ip_address + + +def get_api_port(blockscout_service, port_publisher): + if port_publisher.additional_services_enabled: + public_ports = shared_utils.get_public_ports_for_component( + "additional_services", port_publisher, 0 + ) + return public_ports[0] # First port for the API + return blockscout_service.ports["http"].number + + BLOCKSCOUT_MIN_CPU = 100 BLOCKSCOUT_MAX_CPU = 1000 BLOCKSCOUT_MIN_MEMORY = 1024 @@ -110,6 +127,7 @@ def launch_blockscout( network_params, global_node_selectors, blockscout_service, + port_publisher, ) plan.add_service(SERVICE_NAME_FRONTEND, config_frontend) return blockscout_url @@ -223,6 +241,7 @@ def get_config_frontend( network_params, node_selectors, blockscout_service, + port_publisher, ): return ServiceConfig( image=shared_utils.docker_cache_image_calc( @@ -238,9 +257,9 @@ def get_config_frontend( "NEXT_PUBLIC_NETWORK_NAME": "Kurtosis", "NEXT_PUBLIC_NETWORK_ID": network_params.network_id, "NEXT_PUBLIC_NETWORK_RPC_URL": el_client_rpc_url, - "NEXT_PUBLIC_API_HOST": blockscout_service.ip_address + "NEXT_PUBLIC_API_HOST": get_api_host(blockscout_service, port_publisher) + ":" - + str(blockscout_service.ports["http"].number), + + str(get_api_port(blockscout_service, port_publisher)), "NEXT_PUBLIC_AD_BANNER_PROVIDER": "none", "NEXT_PUBLIC_AD_TEXT_PROVIDER": "none", "NEXT_PUBLIC_IS_TESTNET": "true", diff --git a/src/cl/grandine/grandine_launcher.star b/src/cl/grandine/grandine_launcher.star index b27ded869..d03025647 100644 --- a/src/cl/grandine/grandine_launcher.star +++ b/src/cl/grandine/grandine_launcher.star @@ -195,7 +195,7 @@ def get_beacon_config( "--eth1-rpc-urls=" + EXECUTION_ENGINE_ENDPOINT, # ENR "--disable-enr-auto-update", - "--enr-address=" + port_publisher.nat_exit_ip, + "--enr-address=" + port_publisher.cl_nat_exit_ip, "--enr-udp-port={0}".format(discovery_port_udp), "--enr-tcp-port={0}".format(discovery_port_tcp), # QUIC diff --git a/src/cl/lighthouse/lighthouse_launcher.star b/src/cl/lighthouse/lighthouse_launcher.star index a30d7fc36..502355460 100644 --- a/src/cl/lighthouse/lighthouse_launcher.star +++ b/src/cl/lighthouse/lighthouse_launcher.star @@ -194,7 +194,7 @@ def get_beacon_config( "--suggested-fee-recipient=" + constants.VALIDATING_REWARDS_ACCOUNT, # ENR "--disable-enr-auto-update", - "--enr-address=" + port_publisher.nat_exit_ip, + "--enr-address=" + port_publisher.cl_nat_exit_ip, "--enr-tcp-port={0}".format(discovery_port_tcp), "--enr-udp-port={0}".format(discovery_port_udp), # QUIC diff --git a/src/cl/lodestar/lodestar_launcher.star b/src/cl/lodestar/lodestar_launcher.star index acb7387ab..a97c2d407 100644 --- a/src/cl/lodestar/lodestar_launcher.star +++ b/src/cl/lodestar/lodestar_launcher.star @@ -172,7 +172,7 @@ def get_beacon_config( "--nat=true", "--jwt-secret=" + constants.JWT_MOUNT_PATH_ON_CONTAINER, # ENR - "--enr.ip=" + port_publisher.nat_exit_ip, + "--enr.ip=" + port_publisher.cl_nat_exit_ip, "--enr.tcp={0}".format(discovery_port_tcp), "--enr.udp={0}".format(discovery_port_udp), # QUIC diff --git a/src/cl/nimbus/nimbus_launcher.star b/src/cl/nimbus/nimbus_launcher.star index f83c652a3..dc90dba01 100644 --- a/src/cl/nimbus/nimbus_launcher.star +++ b/src/cl/nimbus/nimbus_launcher.star @@ -204,7 +204,7 @@ def get_beacon_config( ), "--data-dir=" + BEACON_DATA_DIRPATH_ON_SERVICE_CONTAINER, "--web3-url=" + EXECUTION_ENGINE_ENDPOINT, - "--nat=extip:" + port_publisher.nat_exit_ip, + "--nat=extip:" + port_publisher.cl_nat_exit_ip, "--enr-auto-update=false", "--history={0}".format("archive" if constants.ARCHIVE_MODE else "prune"), "--rest", diff --git a/src/cl/prysm/prysm_launcher.star b/src/cl/prysm/prysm_launcher.star index 885a97407..a52cf055a 100644 --- a/src/cl/prysm/prysm_launcher.star +++ b/src/cl/prysm/prysm_launcher.star @@ -188,7 +188,7 @@ def get_beacon_config( "--http-host=0.0.0.0", "--http-cors-domain=*", "--http-port={0}".format(BEACON_HTTP_PORT_NUM), - "--p2p-host-ip=" + port_publisher.nat_exit_ip, + "--p2p-host-ip=" + port_publisher.cl_nat_exit_ip, "--p2p-tcp-port={0}".format(discovery_port_tcp), "--p2p-udp-port={0}".format(discovery_port_udp), "--p2p-quic-port={0}".format(discovery_port_quic), diff --git a/src/cl/teku/teku_launcher.star b/src/cl/teku/teku_launcher.star index e62a796a5..1a922a526 100644 --- a/src/cl/teku/teku_launcher.star +++ b/src/cl/teku/teku_launcher.star @@ -182,7 +182,7 @@ def get_beacon_config( ), "--p2p-enabled=true", "--p2p-peer-lower-bound={0}".format(MIN_PEERS), - "--p2p-advertised-ip=" + port_publisher.nat_exit_ip, + "--p2p-advertised-ip=" + port_publisher.cl_nat_exit_ip, "--p2p-discovery-site-local-addresses-enabled=true", "--p2p-port={0}".format(discovery_port_tcp), "--rest-api-enabled=true", diff --git a/src/el/besu/besu_launcher.star b/src/el/besu/besu_launcher.star index ecdd107a1..6f3242382 100644 --- a/src/el/besu/besu_launcher.star +++ b/src/el/besu/besu_launcher.star @@ -145,7 +145,7 @@ def get_config( "--rpc-ws-port={0}".format(WS_PORT_NUM), "--rpc-ws-api=ADMIN,CLIQUE,ETH,NET,DEBUG,TXPOOL,ENGINE,TRACE,WEB3", "--p2p-enabled=true", - "--p2p-host=" + port_publisher.nat_exit_ip, + "--p2p-host=" + port_publisher.el_nat_exit_ip, "--p2p-port={0}".format(discovery_port_tcp), "--engine-rpc-enabled=true", "--engine-jwt-secret=" + constants.JWT_MOUNT_PATH_ON_CONTAINER, diff --git a/src/el/erigon/erigon_launcher.star b/src/el/erigon/erigon_launcher.star index 06982ba24..a5687a22a 100644 --- a/src/el/erigon/erigon_launcher.star +++ b/src/el/erigon/erigon_launcher.star @@ -147,7 +147,7 @@ def get_config( "--http.vhosts=*", "--ws", "--allow-insecure-unlock", - "--nat=extip:" + port_publisher.nat_exit_ip, + "--nat=extip:" + port_publisher.el_nat_exit_ip, "--http", "--http.addr=0.0.0.0", "--http.corsdomain=*", diff --git a/src/el/ethereumjs/ethereumjs_launcher.star b/src/el/ethereumjs/ethereumjs_launcher.star index 7c1a63930..ffee9fcd5 100644 --- a/src/el/ethereumjs/ethereumjs_launcher.star +++ b/src/el/ethereumjs/ethereumjs_launcher.star @@ -157,7 +157,7 @@ def get_config( "--wsEnginePort={0}".format(WS_PORT_ENGINE_NUM), "--wsEngineAddr=0.0.0.0", "--jwt-secret=" + constants.JWT_MOUNT_PATH_ON_CONTAINER, - "--extIP={0}".format(port_publisher.nat_exit_ip), + "--extIP={0}".format(port_publisher.el_nat_exit_ip), "--sync=full", "--isSingleNode=true", "--logLevel={0}".format(log_level), diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 3efa9a679..324754130 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -189,7 +189,7 @@ def get_config( "--ws.api=admin,engine,net,eth,web3,debug,txpool", "--ws.origins=*", "--allow-insecure-unlock", - "--nat=extip:" + port_publisher.nat_exit_ip, + "--nat=extip:" + port_publisher.el_nat_exit_ip, "--authrpc.port={0}".format(ENGINE_RPC_PORT_NUM), "--authrpc.addr=0.0.0.0", "--authrpc.vhosts=*", diff --git a/src/el/nethermind/nethermind_launcher.star b/src/el/nethermind/nethermind_launcher.star index 7f519946c..70bd7c32b 100644 --- a/src/el/nethermind/nethermind_launcher.star +++ b/src/el/nethermind/nethermind_launcher.star @@ -136,7 +136,7 @@ def get_config( "--JsonRpc.WebSocketsPort={0}".format(WS_PORT_NUM), "--JsonRpc.EngineHost=0.0.0.0", "--JsonRpc.EnginePort={0}".format(ENGINE_RPC_PORT_NUM), - "--Network.ExternalIp={0}".format(port_publisher.nat_exit_ip), + "--Network.ExternalIp={0}".format(port_publisher.el_nat_exit_ip), "--Network.DiscoveryPort={0}".format(discovery_port_tcp), "--Network.P2PPort={0}".format(discovery_port_tcp), "--JsonRpc.JwtSecretFile=" + constants.JWT_MOUNT_PATH_ON_CONTAINER, diff --git a/src/el/nimbus-eth1/nimbus_launcher.star b/src/el/nimbus-eth1/nimbus_launcher.star index e6fa07619..1cbf9e7f1 100644 --- a/src/el/nimbus-eth1/nimbus_launcher.star +++ b/src/el/nimbus-eth1/nimbus_launcher.star @@ -140,7 +140,7 @@ def get_config( "--metrics", "--metrics-address=0.0.0.0", "--metrics-port={0}".format(METRICS_PORT_NUM), - "--nat=extip:{0}".format(port_publisher.nat_exit_ip), + "--nat=extip:{0}".format(port_publisher.el_nat_exit_ip), "--tcp-port={0}".format(discovery_port_tcp), "--udp-port={0}".format(discovery_port_udp), ] diff --git a/src/el/reth/reth_launcher.star b/src/el/reth/reth_launcher.star index 7670cb5d6..f85656393 100644 --- a/src/el/reth/reth_launcher.star +++ b/src/el/reth/reth_launcher.star @@ -184,7 +184,7 @@ def get_config( "--ws.port={0}".format(WS_PORT_NUM), "--ws.api=net,eth", "--ws.origins=*", - "--nat=extip:" + port_publisher.nat_exit_ip, + "--nat=extip:" + port_publisher.el_nat_exit_ip, "--authrpc.port={0}".format(ENGINE_RPC_PORT_NUM), "--authrpc.jwtsecret=" + constants.JWT_MOUNT_PATH_ON_CONTAINER, "--authrpc.addr=0.0.0.0", diff --git a/src/full_beaconchain/full_beaconchain_launcher.star b/src/full_beaconchain/full_beaconchain_launcher.star index 92d90ebba..1fb77d890 100644 --- a/src/full_beaconchain/full_beaconchain_launcher.star +++ b/src/full_beaconchain/full_beaconchain_launcher.star @@ -18,6 +18,22 @@ LITTLE_BIGTABLE_PORT_NUMBER = 9000 FULL_BEACONCHAIN_CONFIG_FILENAME = "beaconchain-config.yml" + +def get_little_bigtable_host(little_bigtable, port_publisher): + if port_publisher.additional_services_enabled: + return port_publisher.additional_services_nat_exit_ip + return little_bigtable.ip_address + + +def get_little_bigtable_port(little_bigtable, port_publisher): + if port_publisher.additional_services_enabled: + public_ports = shared_utils.get_public_ports_for_component( + "additional_services", port_publisher, 0 + ) + return public_ports[0] # Use first port for little bigtable + return LITTLE_BIGTABLE_PORT_NUMBER + + # The min/max CPU/memory that postgres can use POSTGRES_MIN_CPU = 10 POSTGRES_MAX_CPU = 1000 @@ -133,8 +149,8 @@ def launch_full_beacon( cl_contexts[0].http_port, cl_contexts[0].client_name, el_uri, - little_bigtable.ip_address, - LITTLE_BIGTABLE_PORT_NUMBER, + get_little_bigtable_host(little_bigtable, port_publisher), + get_little_bigtable_port(little_bigtable, port_publisher), postgres_output.service.name, POSTGRES_PORT_NUMBER, redis_url, diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index bf1d9affd..73bf18a30 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -229,8 +229,40 @@ def input_parser(plan, input_args): else: plan.print("Docker cache is disabled") - if result["port_publisher"]["nat_exit_ip"] == "auto": - result["port_publisher"]["nat_exit_ip"] = get_public_ip(plan) + # Handle global nat_exit_ip setting - if set, apply to all service groups + if result["port_publisher"]["nat_exit_ip"] != "KURTOSIS_IP_ADDR_PLACEHOLDER": + global_nat_exit_ip = result["port_publisher"]["nat_exit_ip"] + if global_nat_exit_ip == "auto": + global_nat_exit_ip = get_public_ip(plan) + result["port_publisher"]["nat_exit_ip"] = global_nat_exit_ip + + # Set all service groups to use the global value + for service_group in [ + "el", + "cl", + "vc", + "remote_signer", + "additional_services", + "mev", + "other", + ]: + result["port_publisher"][service_group]["nat_exit_ip"] = global_nat_exit_ip + else: + # Auto-detect public IP for each service group that has nat_exit_ip set to "auto" + public_ip = None + for service_group in [ + "el", + "cl", + "vc", + "remote_signer", + "additional_services", + "mev", + "other", + ]: + if result["port_publisher"][service_group]["nat_exit_ip"] == "auto": + if public_ip == None: + public_ip = get_public_ip(plan) + result["port_publisher"][service_group]["nat_exit_ip"] = public_ip if "prometheus_grafana" in result["additional_services"]: plan.print( @@ -569,26 +601,37 @@ def input_parser(plan, input_args): nat_exit_ip=result["port_publisher"]["nat_exit_ip"], cl_enabled=result["port_publisher"]["cl"]["enabled"], cl_public_port_start=result["port_publisher"]["cl"]["public_port_start"], + cl_nat_exit_ip=result["port_publisher"]["cl"]["nat_exit_ip"], el_enabled=result["port_publisher"]["el"]["enabled"], el_public_port_start=result["port_publisher"]["el"]["public_port_start"], + el_nat_exit_ip=result["port_publisher"]["el"]["nat_exit_ip"], vc_enabled=result["port_publisher"]["vc"]["enabled"], vc_public_port_start=result["port_publisher"]["vc"]["public_port_start"], + vc_nat_exit_ip=result["port_publisher"]["vc"]["nat_exit_ip"], remote_signer_enabled=result["port_publisher"]["remote_signer"]["enabled"], remote_signer_public_port_start=result["port_publisher"]["remote_signer"][ "public_port_start" ], + remote_signer_nat_exit_ip=result["port_publisher"]["remote_signer"][ + "nat_exit_ip" + ], additional_services_enabled=result["port_publisher"]["additional_services"][ "enabled" ], additional_services_public_port_start=result["port_publisher"][ "additional_services" ]["public_port_start"], + additional_services_nat_exit_ip=result["port_publisher"][ + "additional_services" + ]["nat_exit_ip"], mev_enabled=result["port_publisher"]["mev"]["enabled"], mev_public_port_start=result["port_publisher"]["mev"]["public_port_start"], + mev_nat_exit_ip=result["port_publisher"]["mev"]["nat_exit_ip"], other_enabled=result["port_publisher"]["other"]["enabled"], other_public_port_start=result["port_publisher"]["other"][ "public_port_start" ], + other_nat_exit_ip=result["port_publisher"]["other"]["nat_exit_ip"], ), ) @@ -1428,22 +1471,52 @@ def get_default_custom_flood_params(): def get_port_publisher_params(parameter_type, input_args=None): port_publisher_parameters = { "nat_exit_ip": "KURTOSIS_IP_ADDR_PLACEHOLDER", - "el": {"enabled": False, "public_port_start": 32000}, - "cl": {"enabled": False, "public_port_start": 33000}, - "vc": {"enabled": False, "public_port_start": 34000}, - "remote_signer": {"enabled": False, "public_port_start": 35000}, - "additional_services": {"enabled": False, "public_port_start": 36000}, - "mev": {"enabled": False, "public_port_start": 37000}, - "other": {"enabled": False, "public_port_start": 38000}, + "el": { + "enabled": False, + "public_port_start": 32000, + "nat_exit_ip": "KURTOSIS_IP_ADDR_PLACEHOLDER", + }, + "cl": { + "enabled": False, + "public_port_start": 33000, + "nat_exit_ip": "KURTOSIS_IP_ADDR_PLACEHOLDER", + }, + "vc": { + "enabled": False, + "public_port_start": 34000, + "nat_exit_ip": "KURTOSIS_IP_ADDR_PLACEHOLDER", + }, + "remote_signer": { + "enabled": False, + "public_port_start": 35000, + "nat_exit_ip": "KURTOSIS_IP_ADDR_PLACEHOLDER", + }, + "additional_services": { + "enabled": False, + "public_port_start": 36000, + "nat_exit_ip": "KURTOSIS_IP_ADDR_PLACEHOLDER", + }, + "mev": { + "enabled": False, + "public_port_start": 37000, + "nat_exit_ip": "KURTOSIS_IP_ADDR_PLACEHOLDER", + }, + "other": { + "enabled": False, + "public_port_start": 38000, + "nat_exit_ip": "KURTOSIS_IP_ADDR_PLACEHOLDER", + }, } if parameter_type == "default": return port_publisher_parameters else: for setting in input_args["port_publisher"]: if setting == "nat_exit_ip": + # Handle global nat_exit_ip setting nat_exit_ip_value = input_args["port_publisher"][setting] port_publisher_parameters[setting] = nat_exit_ip_value else: + # Handle service group settings for sub_setting in input_args["port_publisher"][setting]: sub_setting_value = input_args["port_publisher"][setting][ sub_setting