Skip to content

Commit 8873c4b

Browse files
refactor(tools): nest cloudlab/local config under a providers section in config.yaml (#469)
1 parent bc07f6f commit 8873c4b

13 files changed

Lines changed: 111 additions & 153 deletions

asap-tools/experiments/CONFIG_PARAMETERS_REFERENCE.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,20 @@ These parameters must be provided for all experiment scripts:
3030
- **Validation**: Cannot be `???` or empty
3131
- **Used by**: All experiment scripts
3232

33-
#### `cloudlab.num_nodes` (int, required)
33+
#### `providers.cloudlab.num_nodes` (int, required)
3434
- **Description**: Number of CloudLab nodes to allocate for the experiment
3535
- **Range**: 1-50 (recommended)
3636
- **Example**: `4`
3737
- **Validation**: Must be positive integer
3838
- **Used by**: All experiment scripts
3939

40-
#### `cloudlab.username` (string, required)
40+
#### `providers.cloudlab.username` (string, required)
4141
- **Description**: Your CloudLab username for SSH access
4242
- **Example**: `"myuser"`
4343
- **Validation**: Must be valid CloudLab username
4444
- **Used by**: All experiment scripts
4545

46-
#### `cloudlab.hostname_suffix` (string, required)
46+
#### `providers.cloudlab.hostname_suffix` (string, required)
4747
- **Description**: CloudLab experiment hostname suffix
4848
- **Example**: `"myexp.cloudlab.us"`
4949
- **Validation**: Must be valid hostname format
@@ -612,7 +612,7 @@ These parameters come from the `experiment_type` config group and are prefixed w
612612
```python
613613
# Recommended validation rules
614614
VALIDATION_RULES = {
615-
"cloudlab.num_nodes": {"type": int, "min": 1, "max": 50},
615+
"providers.cloudlab.num_nodes": {"type": int, "min": 1, "max": 50},
616616
"prometheus.scrape_interval": {"type": str, "pattern": r"^\d+[smh]$"},
617617
"experiment_params.exporters.exporter_list.fake_exporter.start_port": {
618618
"type": int, "min": 1024, "max": 65535
@@ -685,9 +685,9 @@ VALIDATION_RULES = {
685685
python experiment_run_e2e.py \
686686
experiment.name=my_test \
687687
experiment_type=cloud_demo \
688-
cloudlab.num_nodes=4 \
689-
cloudlab.username=myuser \
690-
cloudlab.hostname_suffix=myexp.cloudlab.us \
688+
providers.cloudlab.num_nodes=4 \
689+
providers.cloudlab.username=myuser \
690+
providers.cloudlab.hostname_suffix=myexp.cloudlab.us \
691691
prometheus.local_config_dir=/path/to/prometheus/config
692692
```
693693

@@ -719,7 +719,7 @@ python experiment_run_e2e.py \
719719
```bash
720720
python experiment_run_e2e.py \
721721
experiment_type=cloud_demo \
722-
cloudlab.num_nodes=2 \
722+
providers.cloudlab.num_nodes=2 \
723723
logging.level=DEBUG \
724724
flow.steady_state_wait=60 \
725725
streaming.do_local_flink=true \
@@ -742,7 +742,7 @@ for nodes in 4 8 16; do
742742
python experiment_run_e2e.py \
743743
experiment.name=nodes_${nodes} \
744744
experiment_type=cloud_demo \
745-
cloudlab.num_nodes=${nodes} \
745+
providers.cloudlab.num_nodes=${nodes} \
746746
[required params...]
747747
done
748748
```

asap-tools/experiments/HYDRA_CONFIG_USAGE.md

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ This guide explains how to use the Hydra framework integration for experiment sc
99
python experiment_run_e2e.py \
1010
experiment.name=my_test \
1111
experiment_type=cloud_demo \
12-
cloudlab.num_nodes=4 \
13-
cloudlab.username=myuser \
14-
cloudlab.hostname_suffix=myexp.cloudlab.us \
12+
providers.cloudlab.num_nodes=4 \
13+
providers.cloudlab.username=myuser \
14+
providers.cloudlab.hostname_suffix=myexp.cloudlab.us \
1515
prometheus.local_config_dir=/path/to/prometheus/config
1616
```
1717

@@ -20,9 +20,9 @@ python experiment_run_e2e.py \
2020
### Required Infrastructure Parameters
2121
All experiment scripts require these core parameters:
2222
- `experiment.name`: Human-readable experiment name
23-
- `cloudlab.num_nodes`: Number of CloudLab nodes
24-
- `cloudlab.username`: Your CloudLab username
25-
- `cloudlab.hostname_suffix`: CloudLab experiment hostname suffix
23+
- `providers.cloudlab.num_nodes`: Number of CloudLab nodes
24+
- `providers.cloudlab.username`: Your CloudLab username
25+
- `providers.cloudlab.hostname_suffix`: CloudLab experiment hostname suffix
2626

2727
### Script-Specific Required Parameters
2828
- **experiment_run_clickhouse.py**: `experiment_type=clickhouse`, `experiment_params.dataset.name`, `experiment_params.dataset.local_data_file`, `experiment_params.query_groups[0].sql_file`
@@ -107,9 +107,9 @@ python experiment_run_e2e.py \
107107
python experiment_run_e2e.py \
108108
experiment.name=dev_test \
109109
experiment_type=cloud_demo \
110-
cloudlab.num_nodes=2 \
111-
cloudlab.username=myuser \
112-
cloudlab.hostname_suffix=dev.cloudlab.us \
110+
providers.cloudlab.num_nodes=2 \
111+
providers.cloudlab.username=myuser \
112+
providers.cloudlab.hostname_suffix=dev.cloudlab.us \
113113
prometheus.local_config_dir=/path/to/prometheus/config \
114114
logging.level=DEBUG \
115115
flow.steady_state_wait=60
@@ -121,7 +121,7 @@ python experiment_run_e2e.py \
121121
python experiment_run_e2e.py \
122122
experiment.name=arroyo_perf \
123123
experiment_type=my_exp_config \
124-
cloudlab.num_nodes=8 \
124+
providers.cloudlab.num_nodes=8 \
125125
streaming.engine=arroyo \
126126
streaming.enable_object_reuse=true \
127127
profiling.arroyo=true \
@@ -136,9 +136,9 @@ python experiment_run_e2e.py experiment.name=delay_60 experiment_type=cloud_demo
136136
python experiment_run_e2e.py experiment.name=delay_120 experiment_type=cloud_demo experiment_params.query_groups.0.repetition_delay=120 [required params...]
137137

138138
# Test different node counts
139-
python experiment_run_e2e.py experiment.name=nodes_4 experiment_type=cloud_demo cloudlab.num_nodes=4 [required params...]
140-
python experiment_run_e2e.py experiment.name=nodes_8 experiment_type=cloud_demo cloudlab.num_nodes=8 [required params...]
141-
python experiment_run_e2e.py experiment.name=nodes_16 experiment_type=cloud_demo cloudlab.num_nodes=16 [required params...]
139+
python experiment_run_e2e.py experiment.name=nodes_4 experiment_type=cloud_demo providers.cloudlab.num_nodes=4 [required params...]
140+
python experiment_run_e2e.py experiment.name=nodes_8 experiment_type=cloud_demo providers.cloudlab.num_nodes=8 [required params...]
141+
python experiment_run_e2e.py experiment.name=nodes_16 experiment_type=cloud_demo providers.cloudlab.num_nodes=16 [required params...]
142142

143143
# Test different streaming engines
144144
python experiment_run_e2e.py experiment.name=flink_test experiment_type=cloud_demo streaming.engine=flink [required params...]
@@ -165,9 +165,9 @@ cat > config/experiment_type/clickhouse.yaml << 'EOF'
165165
# python experiment_run_clickhouse.py \
166166
# experiment_type=clickhouse \
167167
# experiment.name=my_test \
168-
# cloudlab.num_nodes=1 \
169-
# cloudlab.username=myuser \
170-
# cloudlab.hostname_suffix=myexp.cloudlab.us \
168+
# providers.cloudlab.num_nodes=1 \
169+
# providers.cloudlab.username=myuser \
170+
# providers.cloudlab.hostname_suffix=myexp.cloudlab.us \
171171
# experiment_params.dataset.name=clickbench \
172172
# experiment_params.dataset.local_data_file=/path/to/hits.json \
173173
# 'experiment_params.query_groups[0].sql_file=/path/to/queries.sql'
@@ -203,9 +203,9 @@ EOF
203203
python experiment_run_clickhouse.py \
204204
experiment_type=clickhouse \
205205
experiment.name=my_clickbench_run \
206-
cloudlab.num_nodes=1 \
207-
cloudlab.username=myuser \
208-
cloudlab.hostname_suffix=myexp.cloudlab.us \
206+
providers.cloudlab.num_nodes=1 \
207+
providers.cloudlab.username=myuser \
208+
providers.cloudlab.hostname_suffix=myexp.cloudlab.us \
209209
experiment_params.dataset.name=clickbench \
210210
experiment_params.dataset.local_data_file=/path/to/hits.json \
211211
'experiment_params.query_groups[0].sql_file=/path/to/queries.sql'
@@ -231,9 +231,9 @@ experiment_params.dataset.max_rows=10000
231231
python experiment_run_e2e.py \
232232
experiment.name=full_test \
233233
experiment_type=cloud_demo \
234-
cloudlab.num_nodes=4 \
235-
cloudlab.username=myuser \
236-
cloudlab.hostname_suffix=myexp.cloudlab.us \
234+
providers.cloudlab.num_nodes=4 \
235+
providers.cloudlab.username=myuser \
236+
providers.cloudlab.hostname_suffix=myexp.cloudlab.us \
237237
prometheus.local_config_dir=/path/to/prometheus/config
238238
```
239239

@@ -242,9 +242,9 @@ python experiment_run_e2e.py \
242242
# Only exporters and Prometheus - no streaming
243243
python experiment_run_exporters_and_prometheus.py \
244244
experiment.name=monitoring_test \
245-
cloudlab.num_nodes=4 \
246-
cloudlab.username=myuser \
247-
cloudlab.hostname_suffix=myexp.cloudlab.us
245+
providers.cloudlab.num_nodes=4 \
246+
providers.cloudlab.username=myuser \
247+
providers.cloudlab.hostname_suffix=myexp.cloudlab.us
248248
```
249249

250250
### experiment_run_empty_flink.py (Simplified Streaming)
@@ -253,9 +253,9 @@ python experiment_run_exporters_and_prometheus.py \
253253
python experiment_run_empty_flink.py \
254254
experiment.name=empty_flink_test \
255255
experiment.config_file=/path/to/config.yml \
256-
cloudlab.num_nodes=4 \
257-
cloudlab.username=myuser \
258-
cloudlab.hostname_suffix=myexp.cloudlab.us
256+
providers.cloudlab.num_nodes=4 \
257+
providers.cloudlab.username=myuser \
258+
providers.cloudlab.hostname_suffix=myexp.cloudlab.us
259259
```
260260

261261
### experiment_run_e2e_no_queryengine.py (E2E without Query Engine)
@@ -264,9 +264,9 @@ python experiment_run_empty_flink.py \
264264
python experiment_run_e2e_no_queryengine.py \
265265
experiment.name=e2e_no_qe \
266266
experiment.config_file=/path/to/config.yml \
267-
cloudlab.num_nodes=4 \
268-
cloudlab.username=myuser \
269-
cloudlab.hostname_suffix=myexp.cloudlab.us \
267+
providers.cloudlab.num_nodes=4 \
268+
providers.cloudlab.username=myuser \
269+
providers.cloudlab.hostname_suffix=myexp.cloudlab.us \
270270
prometheus.local_config_dir=/path/to/prometheus/config
271271
```
272272

@@ -284,8 +284,8 @@ python experiment_run_sketchdboffline.py \
284284
# Flink performance testing with aggregation scaling
285285
python experiment_run_flink_with_different_num_aggregations.py \
286286
experiment.name=flink_perf \
287-
cloudlab.username=myuser \
288-
cloudlab.hostname_suffix=myexp.cloudlab.us \
287+
providers.cloudlab.username=myuser \
288+
providers.cloudlab.hostname_suffix=myexp.cloudlab.us \
289289
experiment_variants.flink_aggregations.config=/path/to/config.yaml \
290290
experiment_variants.flink_aggregations.aggregation_id=0 \
291291
experiment_variants.flink_aggregations.min_aggregations=1 \
@@ -334,9 +334,9 @@ python experiment_run_e2e.py \
334334
python experiment_run_e2e.py \
335335
experiment.name=test \
336336
experiment_type=cloud_demo \
337-
cloudlab.num_nodes=4 \
338-
cloudlab.username=user \
339-
cloudlab.hostname_suffix=exp.cloudlab.us \
337+
providers.cloudlab.num_nodes=4 \
338+
providers.cloudlab.username=user \
339+
providers.cloudlab.hostname_suffix=exp.cloudlab.us \
340340
prometheus.local_config_dir=/path/to/config
341341
```
342342

asap-tools/experiments/config/config.yaml

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,17 @@
55
experiment:
66
name: ??? # REQUIRED: Human-readable experiment name
77

8-
# CloudLab configuration
9-
cloudlab:
10-
num_nodes: ??? # REQUIRED: Number of CloudLab nodes to use
11-
node_offset: 0 # Starting node index (default 0, allows running multiple experiments in parallel)
12-
username: ??? # REQUIRED: Your CloudLab username
13-
hostname_suffix: ??? # REQUIRED: CloudLab experiment hostname suffix
8+
# Infrastructure provider configuration — activate exactly one provider:
9+
# CloudLab (default): fill in the cloudlab fields below via CLI overrides.
10+
# Local machine: uncomment the local section below (leave cloudlab as-is).
11+
providers:
12+
cloudlab:
13+
num_nodes: ??? # REQUIRED for CloudLab: Number of CloudLab nodes to use
14+
node_offset: 0 # Starting node index (default 0, allows running multiple experiments in parallel)
15+
username: ??? # REQUIRED for CloudLab: Your CloudLab username
16+
hostname_suffix: ??? # REQUIRED for CloudLab: CloudLab experiment hostname suffix
17+
# local: # Uncomment this section to run on the local machine instead
18+
# home_dir: ??? # REQUIRED: absolute path to home directory on this machine
1419

1520
# Logging and debugging
1621
logging:
@@ -57,7 +62,7 @@ streaming:
5762
use_kafka_ingest: false # Use Prometheus remote write by default, set to true for legacy Kafka ingest
5863
# Prometheus remote write configuration
5964
remote_write:
60-
ip: "${remote_write_ip:${cloudlab.node_offset}}"
65+
ip: null # set at runtime via provider.get_node_ip(node_offset)
6166
base_port: 8080
6267
path: "/api/v1/write"
6368
enable_optimized_source: true # Use optimized Prometheus remote_write source (10-20x faster)

asap-tools/experiments/experiment_only_ingest_path.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,6 @@
3030
"local_experiment_dir", lambda: constants.LOCAL_EXPERIMENT_DIR
3131
)
3232

33-
# Register custom resolver for remote write IP based on node_offset
34-
OmegaConf.register_new_resolver(
35-
"remote_write_ip", lambda node_offset: f"10.10.1.{node_offset + 1}"
36-
)
37-
3833
KAFKA_NUM_TRIES = 5
3934
CONTROLLER_LOCAL_OUTPUT_DIR = None
4035
CONTROLLER_REMOTE_OUTPUT_DIR = None
@@ -83,6 +78,7 @@ def main(cfg: DictConfig):
8378

8479
# Create infrastructure provider
8580
provider = create_provider(cfg)
81+
args.remote_write_ip = provider.get_node_ip(args.node_offset)
8682

8783
local_experiment_root_dir = os.path.join(
8884
constants.LOCAL_EXPERIMENT_DIR, args.experiment_name

asap-tools/experiments/experiment_run_clickhouse.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -69,19 +69,19 @@
6969
python experiment_run_clickhouse.py \\
7070
experiment_type=clickhouse \\
7171
experiment.name=my_bench \\
72-
cloudlab.num_nodes=1 \\
73-
cloudlab.username=myuser \\
74-
cloudlab.hostname_suffix=myexp.cloudlab.us \\
72+
providers.cloudlab.num_nodes=1 \\
73+
providers.cloudlab.username=myuser \\
74+
providers.cloudlab.hostname_suffix=myexp.cloudlab.us \\
7575
experiment_params.dataset.local_data_file=/path/to/hits.json \\
7676
'experiment_params.query_groups[0].sql_file=/path/to/clickbench.sql'
7777
7878
Baseline + sketchdb:
7979
python experiment_run_clickhouse.py \\
8080
experiment_type=clickhouse \\
8181
experiment.name=my_bench \\
82-
cloudlab.num_nodes=1 \\
83-
cloudlab.username=myuser \\
84-
cloudlab.hostname_suffix=myexp.cloudlab.us \\
82+
providers.cloudlab.num_nodes=1 \\
83+
providers.cloudlab.username=myuser \\
84+
providers.cloudlab.hostname_suffix=myexp.cloudlab.us \\
8585
experiment_params.dataset.local_data_file=/path/to/hits.json \\
8686
'experiment_params.query_groups[0].sql_file=/path/to/clickbench.sql'
8787
@@ -148,9 +148,6 @@ def _expand_groups(groups):
148148
OmegaConf.register_new_resolver(
149149
"local_experiment_dir", lambda: constants.LOCAL_EXPERIMENT_DIR
150150
)
151-
OmegaConf.register_new_resolver(
152-
"remote_write_ip", lambda node_offset: f"10.10.1.{node_offset + 1}"
153-
)
154151

155152

156153
def _run_query_client(

asap-tools/experiments/experiment_run_e2e.py

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,6 @@
4747
"local_experiment_dir", lambda: constants.LOCAL_EXPERIMENT_DIR
4848
)
4949

50-
# Register custom resolver for remote write IP based on node_offset
51-
OmegaConf.register_new_resolver(
52-
"remote_write_ip", lambda node_offset: f"10.10.1.{node_offset + 1}"
53-
)
54-
5550

5651
@hydra.main(version_base=None, config_path="config", config_name="config")
5752
def main(cfg: DictConfig):
@@ -63,15 +58,9 @@ def main(cfg: DictConfig):
6358
# Create infrastructure provider
6459
provider = create_provider(cfg)
6560

66-
# Route the remote-write IP through the provider (127.0.0.1 for local mode,
67-
# CloudLab's 10.10.1.x scheme otherwise) before anything resolves
68-
# cfg.streaming.remote_write.ip (Args does, below).
69-
OmegaConf.register_new_resolver(
70-
"remote_write_ip", provider.get_node_ip, replace=True
71-
)
72-
7361
# Convert config to args-like object for backward compatibility
7462
args = config.Args(cfg)
63+
args.remote_write_ip = provider.get_node_ip(args.node_offset)
7564

7665
if provider.is_remote():
7766
local_experiment_root_dir = os.path.join(

asap-tools/experiments/experiment_run_exporters_and_prometheus.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,6 @@
2222
"local_experiment_dir", lambda: constants.LOCAL_EXPERIMENT_DIR
2323
)
2424

25-
# Register custom resolver for remote write IP based on node_offset
26-
OmegaConf.register_new_resolver(
27-
"remote_write_ip", lambda node_offset: f"10.10.1.{node_offset + 1}"
28-
)
29-
3025

3126
@hydra.main(version_base=None, config_path="config", config_name="config")
3227
def main(cfg: DictConfig):

asap-tools/experiments/experiment_run_grafana_demo.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,6 @@
4343
"local_experiment_dir", lambda: constants.LOCAL_EXPERIMENT_DIR
4444
)
4545

46-
# Register custom resolver for remote write IP based on node_offset
47-
OmegaConf.register_new_resolver(
48-
"remote_write_ip", lambda node_offset: f"10.10.1.{node_offset + 1}"
49-
)
50-
5146

5247
@hydra.main(version_base=None, config_path="config", config_name="config")
5348
def main(cfg: DictConfig):
@@ -60,6 +55,7 @@ def main(cfg: DictConfig):
6055

6156
# Create infrastructure provider
6257
provider = create_provider(cfg)
58+
args.remote_write_ip = provider.get_node_ip(args.node_offset)
6359

6460
args.forward_unsupported_queries = True
6561
print("Forcing forward_unsupported_queries to True for Grafana demo")

asap-tools/experiments/experiment_run_sketchdboffline.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,6 @@
1717
"local_experiment_dir", lambda: constants.LOCAL_EXPERIMENT_DIR
1818
)
1919

20-
# Register custom resolver for remote write IP based on node_offset
21-
OmegaConf.register_new_resolver(
22-
"remote_write_ip", lambda node_offset: f"10.10.1.{node_offset + 1}"
23-
)
24-
2520

2621
def run_sketchdboffline(args, output_dir) -> subprocess.Popen:
2722
cmd = (

0 commit comments

Comments
 (0)