From 0864750f5739ae3a496344c91a9bd937ad9730d7 Mon Sep 17 00:00:00 2001 From: Milind Srivastava Date: Tue, 5 May 2026 10:08:31 -0400 Subject: [PATCH] chore: remove asap-cli tool and associated j2 compose templates --- asap-planner-rs/controller-cli-compose.yml.j2 | 19 - .../query-engine-rust-cli-compose.yml.j2 | 50 -- .../arroyosketch-cli-compose.yml.j2 | 30 - asap-tools/.gitignore | 2 - asap-tools/asap-cli/Cargo.lock | 796 ------------------ asap-tools/asap-cli/Cargo.toml | 12 - asap-tools/asap-cli/src/docker_util.rs | 723 ---------------- asap-tools/asap-cli/src/main.rs | 572 ------------- asap-tools/asap-cli/src/util.rs | 361 -------- .../generate_compose/pyproject.toml | 8 - .../uv_configs/generate_compose/uv.lock | 89 -- .../generate_prometheus_config/pyproject.toml | 9 - .../generate_prometheus_config/uv.lock | 83 -- .../uv_configs/grafana_config/pyproject.toml | 13 - .../fake-exporter-python-cli-compose.yml.j2 | 25 - .../fake-exporter-rust-cli-compose.yml.j2 | 21 - 16 files changed, 2813 deletions(-) delete mode 100644 asap-planner-rs/controller-cli-compose.yml.j2 delete mode 100644 asap-query-engine/query-engine-rust-cli-compose.yml.j2 delete mode 100644 asap-summary-ingest/arroyosketch-cli-compose.yml.j2 delete mode 100644 asap-tools/asap-cli/Cargo.lock delete mode 100644 asap-tools/asap-cli/Cargo.toml delete mode 100644 asap-tools/asap-cli/src/docker_util.rs delete mode 100644 asap-tools/asap-cli/src/main.rs delete mode 100644 asap-tools/asap-cli/src/util.rs delete mode 100644 asap-tools/asap-cli/uv_configs/generate_compose/pyproject.toml delete mode 100644 asap-tools/asap-cli/uv_configs/generate_compose/uv.lock delete mode 100644 asap-tools/asap-cli/uv_configs/generate_prometheus_config/pyproject.toml delete mode 100644 asap-tools/asap-cli/uv_configs/generate_prometheus_config/uv.lock delete mode 100644 asap-tools/asap-cli/uv_configs/grafana_config/pyproject.toml delete mode 100644 asap-tools/data-sources/prometheus-exporters/fake_exporter/fake_exporter_python/fake-exporter-python-cli-compose.yml.j2 delete mode 100644 asap-tools/data-sources/prometheus-exporters/fake_exporter/fake_exporter_rust/fake_exporter/fake-exporter-rust-cli-compose.yml.j2 diff --git a/asap-planner-rs/controller-cli-compose.yml.j2 b/asap-planner-rs/controller-cli-compose.yml.j2 deleted file mode 100644 index 87d0a181..00000000 --- a/asap-planner-rs/controller-cli-compose.yml.j2 +++ /dev/null @@ -1,19 +0,0 @@ -# Docker compose Jinja2 template to be rendered and used by asap-cli - -services: - controller: - image: sketchdb-controller:latest # Change to 'asap' prefix - container_name: asap-controller - networks: - - asap-network - volumes: - - {{ input_config_path }}:/app/input/config.yaml:ro - - {{ output_dir }}:/app/outputs - command: [ - "--input_config", "/app/input/config.yaml", - "--output_dir", "/app/outputs", - "--prometheus_scrape_interval", "{{ prometheus_scrape_interval }}", - "--streaming_engine", "{{ streaming_engine }}"{% if punting %}, - "--enable-punting"{% endif %} - ] - restart: no diff --git a/asap-query-engine/query-engine-rust-cli-compose.yml.j2 b/asap-query-engine/query-engine-rust-cli-compose.yml.j2 deleted file mode 100644 index 64be341c..00000000 --- a/asap-query-engine/query-engine-rust-cli-compose.yml.j2 +++ /dev/null @@ -1,50 +0,0 @@ -# QueryEngine Rust Docker Compose Template -# This template is rendered with Jinja2 to generate the final docker-compose.yml - -services: - queryengine-rust: - image: sketchdb-queryengine-rust:latest # Need to change image name to 'asap' prefix - container_name: asap-queryengine-rust - hostname: queryengine-rust - networks: - - asap-network - ports: - - "{{ http_port | default('8088') }}:8088" - environment: - - RUST_LOG={{ log_level | default('info') }} - - RUST_BACKTRACE=1 - volumes: - - "{{ experiment_output_dir }}:/app/outputs" - - "{{ controller_remote_output_dir }}:/app/controller_output:ro" - command: [ - "--kafka-topic", "{{ kafka_topic }}", - "--kafka-broker", "kafka:9092", # Uses kafka container service name instead of IP - "--input-format", "{{ input_format }}", - "--config", "/app/controller_output/inference_config.yaml", - "--streaming-config", "/app/controller_output/streaming_config.yaml", - "--prometheus-server", "http://prometheus:9090", - "--prometheus-scrape-interval", "{{ prometheus_scrape_interval }}", - "--delete-existing-db", - "--log-level", "{{ log_level }}", - "--output-dir", "/app/outputs", - "--streaming-engine", "{{ streaming_engine }}", - "--query-language", "{{ query_language }}", - "--lock-strategy", "{{ lock_strategy }}"{% if compress_json %}, - "--decompress-json"{% endif %}{% if profile_query_engine %}, - "--do-profiling"{% endif %}{% if forward_unsupported_queries %}, - "--forward-unsupported-queries"{% endif %}{% if dump_precomputes %}, - "--dump-precomputes"{% endif %} - ] - depends_on: - kafka: - condition: service_healthy - kafka-init: - condition: service_completed_successfully # Wait for Kafka topics to be created - prometheus: - condition: service_healthy - controller: - condition: service_completed_successfully # Wait for controller to generate configs - arroyosketch: - condition: service_completed_successfully # Wait for pipeline configuration - restart: no - # Add healthcheck diff --git a/asap-summary-ingest/arroyosketch-cli-compose.yml.j2 b/asap-summary-ingest/arroyosketch-cli-compose.yml.j2 deleted file mode 100644 index 54214339..00000000 --- a/asap-summary-ingest/arroyosketch-cli-compose.yml.j2 +++ /dev/null @@ -1,30 +0,0 @@ -services: - arroyosketch: - build: - context: {{ arroyosketch_dir }} - container_name: {{ container_name }} - hostname: arroyosketch - networks: - - asap-network - command: - - "--config_file_path=/controller-output/streaming_config.yaml" - - "--source_type=prometheus_remote_write" - - "--prometheus_base_port={{ prometheus_base_port }}" - - "--prometheus_path={{ prometheus_path }}" - - "--prometheus_bind_ip={{ prometheus_bind_ip }}" - - "--parallelism={{ parallelism }}" - - "--output_kafka_topic={{ output_kafka_topic }}" - - "--output_format={{ output_format }}" - - "--pipeline_name={{ pipeline_name }}" - - "--output_dir=/arroyosketch-output" - - "--arroyo_url={{ arroyo_url }}" - - "--bootstrap_servers={{ bootstrap_servers }}" - volumes: - - {{ controller_output_dir }}:/controller-output:ro - - {{ arroyosketch_output_dir }}:/arroyosketch-output - depends_on: - controller: - condition: service_completed_successfully - arroyo: - condition: service_healthy - restart: "no" # Init container - runs once and exits diff --git a/asap-tools/.gitignore b/asap-tools/.gitignore index 01133af2..9f45ad7a 100644 --- a/asap-tools/.gitignore +++ b/asap-tools/.gitignore @@ -16,5 +16,3 @@ experiments/config/* !experiments/config/config.yaml experiments/post_experiment/**/*.png - -asap-cli/target diff --git a/asap-tools/asap-cli/Cargo.lock b/asap-tools/asap-cli/Cargo.lock deleted file mode 100644 index 65562c3f..00000000 --- a/asap-tools/asap-cli/Cargo.lock +++ /dev/null @@ -1,796 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "addr2line" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "anstream" -version = "0.6.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" - -[[package]] -name = "anstyle-parse" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" -dependencies = [ - "windows-sys 0.60.2", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" -dependencies = [ - "anstyle", - "once_cell_polyfill", - "windows-sys 0.60.2", -] - -[[package]] -name = "asap-cli" -version = "0.1.0" -dependencies = [ - "clap", - "lazy_static", - "openssh", - "serde", - "serde_yaml", - "tokio", -] - -[[package]] -name = "backtrace" -version = "0.3.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-link", -] - -[[package]] -name = "bitflags" -version = "2.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" - -[[package]] -name = "cfg-if" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" - -[[package]] -name = "clap" -version = "4.5.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "clap_lex" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" - -[[package]] -name = "colorchoice" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "getrandom" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi 0.14.7+wasi-0.2.4", -] - -[[package]] -name = "gimli" -version = "0.32.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" - -[[package]] -name = "hashbrown" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "indexmap" -version = "2.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" -dependencies = [ - "equivalent", - "hashbrown", -] - -[[package]] -name = "io-uring" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" -dependencies = [ - "bitflags", - "cfg-if", - "libc", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "libc" -version = "0.2.177" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" - -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "memchr" -version = "2.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", -] - -[[package]] -name = "mio" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" -dependencies = [ - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", -] - -[[package]] -name = "object" -version = "0.37.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "once_cell_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" - -[[package]] -name = "openssh" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea0bb128ba90e86bc55dae66031935f361cda4cbc1f011547c55a7d80079bc3e" -dependencies = [ - "libc", - "once_cell", - "shell-escape", - "tempfile", - "thiserror", - "tokio", -] - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-link", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "proc-macro2" -version = "1.0.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" - -[[package]] -name = "rustix" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - -[[package]] -name = "shell-escape" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" - -[[package]] -name = "signal-hook-registry" -version = "1.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" -dependencies = [ - "libc", -] - -[[package]] -name = "slab" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "socket2" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" -dependencies = [ - "libc", - "windows-sys 0.60.2", -] - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "syn" -version = "2.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tempfile" -version = "3.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" -dependencies = [ - "fastrand", - "getrandom", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - -[[package]] -name = "thiserror" -version = "2.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tokio" -version = "1.47.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" -dependencies = [ - "backtrace", - "bytes", - "io-uring", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "slab", - "socket2", - "tokio-macros", - "windows-sys 0.59.0", -] - -[[package]] -name = "tokio-macros" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "unicode-ident" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" - -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasi" -version = "0.14.7+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" -dependencies = [ - "wasip2", -] - -[[package]] -name = "wasip2" -version = "1.0.1+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "wit-bindgen" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" diff --git a/asap-tools/asap-cli/Cargo.toml b/asap-tools/asap-cli/Cargo.toml deleted file mode 100644 index 245cf852..00000000 --- a/asap-tools/asap-cli/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "asap-cli" -version = "0.1.0" -edition = "2024" - -[dependencies] -clap = { version = "4.4", features = ["derive"] } -tokio = { version = "1.0", features = ["full"] } -openssh = "0.11" -serde = { version = "1.0", features = ["derive"] } -serde_yaml = "0.9" -lazy_static = "1.5.0" diff --git a/asap-tools/asap-cli/src/docker_util.rs b/asap-tools/asap-cli/src/docker_util.rs deleted file mode 100644 index d071efd7..00000000 --- a/asap-tools/asap-cli/src/docker_util.rs +++ /dev/null @@ -1,723 +0,0 @@ -use crate::util::HydraConfig; -use tokio::process::Command; - -/// Parse scrape interval string (e.g., "5s", "10m") to seconds as integer -fn parse_scrape_interval_to_seconds(interval: &str) -> Result> { - let interval = interval.trim(); - if interval.ends_with('s') { - Ok(interval.trim_end_matches('s').parse()?) - } else if interval.ends_with('m') { - let minutes: u32 = interval.trim_end_matches('m').parse()?; - Ok(minutes * 60) - } else { - // If no suffix, assume it's already in seconds - let value: u32 = interval.parse()?; - Ok(value) - } -} - -/** CONSTANTS - matching the Python infrastructure */ -// These match constants.py values -// Note: ASAP_DOCKER_COMPOSE_PATH is constructed dynamically in asap_up/asap_down functions -const _CLOUDLAB_HOME_DIR: &str = "/scratch/sketch_db_for_prometheus"; -const FLINK_OUTPUT_TOPIC: &str = "flink_output"; -const QUERY_ENGINE_RS_CONTAINER_NAME: &str = "sketchdb-queryengine-rust"; -const CONTROLLER_CONTAINER_NAME: &str = "sketchdb-controller"; -const ARROYOSKETCH_CONTAINER_NAME: &str = "asap-arroyosketch"; - -/// Get the ProjectASAP root directory based on the binary's location -/// Binary is at: ProjectASAP/asap-tools/asap-cli/target/debug/asap-cli -/// So we go up 4 levels: debug -> target -> asap-cli -> asap-tools -> ProjectASAP -fn get_project_root() -> Result> { - let binary_path = std::env::current_exe()?; - - let project_root = binary_path - .parent() // Remove 'asap-cli' binary - .and_then(|p| p.parent()) // Remove 'debug' - .and_then(|p| p.parent()) // Remove 'target' - .and_then(|p| p.parent()) // Remove 'asap-cli' - .and_then(|p| p.parent()) // Remove 'asap-tools' - .ok_or("Failed to determine project root from binary location")?; - - Ok(project_root.to_path_buf()) -} - -pub struct ControllerComposeArgs { - template_path: String, - compose_output_path: String, - controller_dir: String, - container_name: String, - controller_config_path: String, - controller_output_dir: String, - prometheus_scrape_interval: String, - streaming_engine: String, -} - -pub struct QueryEngineComposeArgs { - template_path: String, - compose_output_path: String, - query_engine_dir: String, - container_name: String, - experiment_output_dir: String, - controller_remote_output_dir: String, - kafka_topic: String, - input_format: String, - prometheus_scrape_interval: String, - log_level: String, - streaming_engine: String, - query_language: String, - kafka_host: String, - prometheus_host: String, - prometheus_port: String, - compress_json: bool, - profile_query_engine: bool, - forward_unsupported_queries: bool, - manual: bool, - kafka_proxy_container_name: String, - http_port: String, - lock_strategy: String, - dump_precomputes: bool, -} - -pub struct FakeExporterComposeArgs { - template_path: String, - compose_output_path: String, - fake_exporter_dir: String, - container_name: String, - port: u16, - valuescale: u32, - dataset: String, - num_labels: u8, - num_values_per_label: u16, - metric_type: String, - experiment_output_dir: String, - exporter_output_dir: String, -} - -pub struct ArroyoSketchComposeArgs { - template_path: String, - compose_output_path: String, - arroyosketch_dir: String, - container_name: String, - controller_output_dir: String, - arroyosketch_output_dir: String, - prometheus_base_port: u16, - prometheus_path: String, - prometheus_bind_ip: String, - parallelism: u32, - output_kafka_topic: String, - output_format: String, - pipeline_name: String, - arroyo_url: String, - bootstrap_servers: String, -} - -/// Generate query engine docker-compose file using the Python script -/// This matches the Python infrastructure's QueryEngineRustService._start_containerized method -pub async fn generate_query_engine_compose( - hydra_config: &HydraConfig, - experiment_outputs_abs_path: &str, -) -> Result<(), Box> { - // Get project root based on binary location - let project_root = get_project_root()?; - let code_dir = project_root.to_string_lossy(); - - // Paths for template and script - let queryengine_dir = format!("{}/asap-query-engine", code_dir); - let template_path = format!("{}/query-engine-rust-cli-compose.yml.j2", queryengine_dir); - let helper_script = format!("{}/asap-tools/experiments/generate_queryengine_compose.py", code_dir); - - // Compose file output path (inside ProjectASAP) - let compose_output_path = format!("{}/asap-tools/docker/generated_compose_files/query-engine-compose.yml", code_dir); - - // Ensure compose output directory exists - tokio::fs::create_dir_all(format!("{}/asap-tools/docker/generated_compose_files", code_dir)).await?; - - // Experiment output paths (outside ProjectASAP, absolute paths for Docker volume mounts) - let controller_remote_output_dir = format!("{}/controller_output", experiment_outputs_abs_path); - let experiment_output_dir = format!("{}/sketchdb", experiment_outputs_abs_path); - let output_dir = format!("{}/query_engine_output", experiment_output_dir); - - // Extract values from HydraConfig with defaults matching Python code - // let streaming_engine = hydra_config.streaming.engine - // .as_ref() - // .unwrap_or(&"flink".to_string()) - // .clone(); - // CLI only uses arroyo for now - println!("Overriding streaming engine with 'arroyo' (asap-cli only supports arroyo for now)"); - let streaming_engine = String::from("arroyo"); - - // Use flink_output_format for input_format (this is what Python does) - let flink_output_format = hydra_config.streaming.flink_output_format - .as_ref() - .unwrap_or(&"json".to_string()) - .clone(); - - let log_level = hydra_config.logging.level - .as_ref() - .unwrap_or(&"INFO".to_string()) - .clone(); - - let prometheus_scrape_interval_str = hydra_config.prometheus.scrape_interval - .as_ref() - .unwrap_or(&"5s".to_string()) - .clone(); - - // Parse scrape interval to seconds for the Python script - let prometheus_scrape_interval = parse_scrape_interval_to_seconds(&prometheus_scrape_interval_str)?; - - // Based on Python's COMPRESS_JSON = True constant - let compress_json = true; - let profile_query_engine = hydra_config.profiling.query_engine.unwrap_or(false); - // let forward_unsupported_queries = hydra_config.streaming.forward_unsupported_queries.unwrap_or(true); - let forward_unsupported_queries = true; // always true for now - let manual = hydra_config.manual.query_engine.unwrap_or(false); - - // Read query engine config with defaults matching config.yaml - let lock_strategy = hydra_config.query_engine.lock_strategy - .clone() - .unwrap_or_else(|| "per-key".to_string()); - let dump_precomputes = hydra_config.query_engine.dump_precomputes.unwrap_or(false); - - // Should be 10.10.1.1 for cloudlab, but probably should not be localhost ever - let kafka_host = "10.10.1.1".to_string(); - let prometheus_host = "10.10.1.1".to_string(); - let prometheus_port = "9090".to_string(); // Hardcoded for CloudLab, will be configurable via CLI later - - let args = QueryEngineComposeArgs { - template_path, - compose_output_path: compose_output_path.to_string(), - query_engine_dir: queryengine_dir, - container_name: QUERY_ENGINE_RS_CONTAINER_NAME.to_string(), - experiment_output_dir: output_dir.clone(), - controller_remote_output_dir, - kafka_topic: FLINK_OUTPUT_TOPIC.to_string(), - input_format: flink_output_format, - prometheus_scrape_interval: prometheus_scrape_interval.to_string(), - log_level, - streaming_engine, - query_language: "PROMQL".to_string(), // Hardcoded to PROMQL for asap-cli - kafka_host, - prometheus_host, - prometheus_port, - compress_json, - profile_query_engine, - forward_unsupported_queries, - manual, - kafka_proxy_container_name: "sketchdb-kafka-proxy".to_string(), - http_port: "8088".to_string(), - lock_strategy, - dump_precomputes, - }; - - // Call the Python script to generate the compose file - call_generate_queryengine_compose_script(args, helper_script).await -} - -/// Generate controller docker-compose file using the Python script -/// This matches the Python infrastructure's ControllerService._start_containerized method -pub async fn generate_controller_compose( - hydra_config: &HydraConfig, - _experiment_name: &str, - controller_client_config: &str, - experiment_outputs_abs_path: &str, -) -> Result<(), Box> { - // Get project root based on binary location - let project_root = get_project_root()?; - let code_dir = project_root.to_string_lossy(); - - // Paths for template and script - let controller_dir = format!("{}/asap-planner-rs", code_dir); - let template_path = format!("{}/controller-cli-compose.yml.j2", controller_dir); - let helper_script = format!("{}/asap-tools/experiments/generate_controller_compose.py", code_dir); - - // Compose file output path (inside ProjectASAP) - let compose_output_path = format!("{}/asap-tools/docker/generated_compose_files/controller-compose.yml", code_dir); - - // Ensure compose output directory exists - tokio::fs::create_dir_all(format!("{}/asap-tools/docker/generated_compose_files", code_dir)).await?; - - // Controller output directory (outside ProjectASAP, absolute path for Docker volume mounts) - let controller_remote_output_dir = format!("{}/controller_output", experiment_outputs_abs_path); - - // Extract values from HydraConfig with defaults - // CLI only uses arroyo for now - println!("Overriding streaming engine with 'arroyo' (asap-cli only supports arroyo for now)"); - let streaming_engine = String::from("arroyo"); - - let prometheus_scrape_interval_str = hydra_config.prometheus.scrape_interval - .as_ref() - .unwrap_or(&"5s".to_string()) - .clone(); - - // Parse scrape interval to seconds for the Python script - let prometheus_scrape_interval = parse_scrape_interval_to_seconds(&prometheus_scrape_interval_str)?; - - let args = ControllerComposeArgs { - template_path, - compose_output_path: compose_output_path.to_string(), - controller_dir, - container_name: CONTROLLER_CONTAINER_NAME.to_string(), - controller_config_path: controller_client_config.to_string(), - controller_output_dir: controller_remote_output_dir, - prometheus_scrape_interval: prometheus_scrape_interval.to_string(), - streaming_engine, - }; - - // Call the Python script to generate the compose file - call_generate_controller_compose_script(args, helper_script).await -} - -/// Call generate_queryengine_compose.py using uv run -/// This matches Python's implementation but uses uv for environment management -async fn call_generate_queryengine_compose_script( - args: QueryEngineComposeArgs, - helper_script: String, -) -> Result<(), Box> { - // Use uv run with the generate_compose project directory (absolute path) - let project_root = get_project_root()?; - let uv_project = format!("{}/asap-tools/asap-cli/uv_configs/generate_compose", project_root.to_string_lossy()); - - let mut cmd = Command::new("uv"); - cmd.arg("run") - .arg("--project") - .arg(uv_project) - .arg(&helper_script) - .arg("--template-path").arg(&args.template_path) - .arg("--output-path").arg(&args.compose_output_path) - .arg("--queryengine-dir").arg(&args.query_engine_dir) - .arg("--container-name").arg(&args.container_name) - .arg("--experiment-output-dir").arg(&args.experiment_output_dir) - .arg("--controller-remote-output-dir").arg(&args.controller_remote_output_dir) - .arg("--kafka-topic").arg(&args.kafka_topic) - .arg("--input-format").arg(&args.input_format) - .arg("--prometheus-scrape-interval").arg(&args.prometheus_scrape_interval) - .arg("--log-level").arg(&args.log_level) - .arg("--streaming-engine").arg(&args.streaming_engine) - .arg("--query-language").arg(&args.query_language) - .arg("--lock-strategy").arg(&args.lock_strategy) - .arg("--kafka-host").arg(&args.kafka_host) - .arg("--prometheus-host").arg(&args.prometheus_host) - .arg("--prometheus-port").arg(&args.prometheus_port) - .arg("--kafka-proxy-container-name").arg(&args.kafka_proxy_container_name) - .arg("--http-port").arg(&args.http_port); - - if args.compress_json { - cmd.arg("--compress-json"); - } - if args.profile_query_engine { - cmd.arg("--profile-query-engine"); - } - if args.forward_unsupported_queries { - cmd.arg("--forward-unsupported-queries"); - } - if args.manual { - cmd.arg("--manual"); - } - if args.dump_precomputes { - cmd.arg("--dump-precomputes"); - } - - // Python also includes --kafka-proxy-container-name and --http-port - cmd.arg("--kafka-proxy-container-name").arg(&args.kafka_proxy_container_name); - cmd.arg("--http-port").arg(&args.http_port); - - println!("Calling generate_queryengine_compose.py with uv..."); - let output = cmd.output().await?; - - if !output.status.success() { - eprintln!("stderr: {}", String::from_utf8_lossy(&output.stderr)); - return Err("Failed to generate query engine compose file".into()); - } - - println!("stdout: {}", String::from_utf8_lossy(&output.stdout)); - Ok(()) -} - -/// Call generate_controller_compose.py using uv run -/// This matches Python's ControllerService._start_containerized implementation -async fn call_generate_controller_compose_script( - args: ControllerComposeArgs, - helper_script: String, -) -> Result<(), Box> { - // Use uv run with the generate_compose project directory (absolute path) - let project_root = get_project_root()?; - let uv_project = format!("{}/asap-tools/asap-cli/uv_configs/generate_compose", project_root.to_string_lossy()); - - let mut cmd = Command::new("uv"); - cmd.arg("run") - .arg("--project") - .arg(uv_project) - .arg(&helper_script) - .arg("--template-path").arg(&args.template_path) - .arg("--compose-output-path").arg(&args.compose_output_path) - .arg("--controller-dir").arg(&args.controller_dir) - .arg("--container-name").arg(&args.container_name) - .arg("--input-config-path").arg(&args.controller_config_path) - .arg("--controller-output-dir").arg(&args.controller_output_dir) - .arg("--prometheus-scrape-interval").arg(&args.prometheus_scrape_interval) - .arg("--streaming-engine").arg(&args.streaming_engine); - - println!("Calling generate_controller_compose.py with uv..."); - let output = cmd.output().await?; - - if !output.status.success() { - eprintln!("stderr: {}", String::from_utf8_lossy(&output.stderr)); - return Err("Failed to generate controller compose file".into()); - } - - println!("stdout: {}", String::from_utf8_lossy(&output.stdout)); - Ok(()) -} - -/// Call generate_fake_exporter_compose.py using uv run -/// This generates docker-compose files for fake exporters -async fn call_generate_fake_exporter_compose_script( - args: FakeExporterComposeArgs, - helper_script: String, -) -> Result<(), Box> { - // Use uv run with the generate_compose project directory (absolute path) - let project_root = get_project_root()?; - let uv_project = format!("{}/asap-tools/asap-cli/uv_configs/generate_compose", project_root.to_string_lossy()); - - let mut cmd = Command::new("uv"); - cmd.arg("run") - .arg("--project") - .arg(uv_project) - .arg(helper_script) - .arg("--fake-exporter-dir").arg(args.fake_exporter_dir) - .arg("--port").arg(args.port.to_string()) - .arg("--valuescale").arg(args.valuescale.to_string()) - .arg("--dataset").arg(args.dataset) - .arg("--num-labels").arg(args.num_labels.to_string()) - .arg("--num-values-per-label").arg(args.num_values_per_label.to_string()) - .arg("--metric-type").arg(args.metric_type) - .arg("--template-path").arg(args.template_path) - .arg("--container-name").arg(args.container_name) - .arg("--exporter-output-dir").arg(args.exporter_output_dir) - .arg("--experiment-output-dir").arg(args.experiment_output_dir) - .arg("--compose-output-path").arg(args.compose_output_path); - - println!("Calling generate_fake_exporter_compose.py with uv..."); - let output = cmd.output().await?; - - if !output.status.success() { - eprintln!("stderr: {}", String::from_utf8_lossy(&output.stderr)); - return Err("Failed to generate fake exporter compose file".into()); - } - - println!("stdout: {}", String::from_utf8_lossy(&output.stdout)); - Ok(()) -} - -/// Generate fake exporter docker-compose files using the Python script -/// This generates individual compose files for each fake exporter and a master compose file -pub async fn generate_fake_exporters_compose( - hydra_config: &HydraConfig, - experiment_outputs_abs_path: &str, -) -> Result<(), Box> { - // Check if experiment params exist and have fake exporter config - let experiment_params = match &hydra_config.experiment_params { - Some(params) => params, - None => { - println!("No experiment params found, skipping fake exporter generation"); - return Ok(()); - } - }; - - // Check if fake exporter is configured - let fake_exporter_config = match experiment_params.exporters.exporter_list.get("fake_exporter") { - Some(crate::util::ExporterConfig::FakeExporter { - num_ports_per_server, - start_port, - dataset, - synthetic_data_value_scale, - num_labels, - num_values_per_label, - metric_type, - }) => { - (num_ports_per_server, start_port, dataset, synthetic_data_value_scale, - num_labels, num_values_per_label, metric_type) - }, - _ => { - println!("No fake exporter config found, skipping fake exporter generation"); - return Ok(()); - } - }; - - let (num_ports_per_server, start_port, dataset, valuescale, num_labels, num_values_per_label, metric_type) = fake_exporter_config; - - // Get fake exporter language (default to python) - // let language = hydra_config.fake_exporter_language - // .as_ref() - // .map(|s| s.as_str()) - // .unwrap_or("python"); - let language = hydra_config.fake_exporter_language - .as_deref() - .unwrap_or("python"); - - // Get project root based on binary location - let project_root = get_project_root()?; - let code_dir = project_root.to_string_lossy(); - - // Paths for template and script - let fake_exporter_dir = match language { - "python" => format!("{}/asap-tools/prometheus-exporters/fake_exporter/fake_exporter_python", code_dir), - "rust" => format!("{}/asap-tools/prometheus-exporters/fake_exporter/fake_exporter_rust/fake_exporter", code_dir), - _ => return Err(format!("Unsupported fake exporter language: {}", language).into()), - }; - - // Use CLI-specific template - let template_filename = match language { - "python" => "fake-exporter-python-cli-compose.yml.j2", - "rust" => "fake-exporter-rust-cli-compose.yml.j2", - _ => return Err(format!("Unsupported fake exporter language for CLI template: {}", language).into()), - }; - let template_path = format!("{}/{}", fake_exporter_dir, template_filename); - let helper_script = format!("{}/asap-tools/experiments/generate_fake_exporter_compose.py", code_dir); - - // Ensure compose output directories exist - tokio::fs::create_dir_all(format!("{}/asap-tools/docker/generated_compose_files", code_dir)).await?; - tokio::fs::create_dir_all(format!("{}/asap-tools/docker/generated_compose_files/fake_exporter_composes", code_dir)).await?; - - // Experiment output paths - let experiment_output_dir = format!("{}/fake_exporter_output", experiment_outputs_abs_path); - tokio::fs::create_dir_all(&experiment_output_dir).await?; - - // Generate compose file for each fake exporter port - let mut compose_files = Vec::new(); - for i in 0..*num_ports_per_server { - let port = start_port + i; - let container_name = format!("sketchdb-fake-exporter-{}-{}", port, language); - let compose_name = format!("fake-exporter-compose-{}-{}.yml", port, language); - let compose_output_path = format!("{}/asap-tools/docker/generated_compose_files/fake_exporter_composes/{}", code_dir, compose_name); - - let args = FakeExporterComposeArgs { - template_path: template_path.clone(), - compose_output_path: compose_output_path.clone(), - fake_exporter_dir: fake_exporter_dir.clone(), - container_name, - port, - valuescale: *valuescale, - dataset: dataset.clone(), - num_labels: *num_labels, - num_values_per_label: *num_values_per_label, - metric_type: metric_type.clone(), - experiment_output_dir: experiment_outputs_abs_path.to_string(), - exporter_output_dir: experiment_output_dir.clone(), - }; - - call_generate_fake_exporter_compose_script(args, helper_script.clone()).await?; - compose_files.push(compose_name); - } - - // Generate master compose file that includes all individual compose files - generate_master_fake_exporters_compose(&compose_files).await?; - - Ok(()) -} - -/// Generate the master fake-exporters-compose.yml by reading and merging all individual compose files -async fn generate_master_fake_exporters_compose( - compose_files: &[String], -) -> Result<(), Box> { - let project_root = get_project_root()?; - let master_compose_path = format!("{}/asap-tools/docker/generated_compose_files/fake-exporter-compose.yml", project_root.to_string_lossy()); - - // Create YAML content with merged services - let mut content = String::from("# Master compose file for all fake exporters\n"); - content.push_str("# This file is auto-generated by asap-cli\n\n"); - content.push_str("services:\n"); - - // Read each individual compose file and extract the service definition - for (idx, compose_file) in compose_files.iter().enumerate() { - let compose_path = format!("{}/asap-tools/docker/generated_compose_files/fake_exporter_composes/{}", project_root.to_string_lossy(), compose_file); - let compose_content = tokio::fs::read_to_string(&compose_path).await?; - - // Parse the YAML to extract the fake-exporter service - // For now, use simple string manipulation to extract the service and rename it - if let Some(services_start) = compose_content.find("services:") { - if let Some(fake_exporter_start) = compose_content[services_start..].find("fake-exporter:") { - let service_content_start = services_start + fake_exporter_start + "fake-exporter:".len(); - - // Find the next top-level key (or end of file) to know where service definition ends - let remaining = &compose_content[service_content_start..]; - let service_lines: Vec<&str> = remaining.lines() - .take_while(|line| line.is_empty() || line.starts_with(' ') || line.starts_with('\t')) - .collect(); - - // Generate unique service name - let service_name = format!("fake-exporter-{}", idx); - content.push_str(&format!(" {}:\n", service_name)); - - // Add the service content (already indented from the original file) - for line in service_lines { - if !line.trim().is_empty() { - content.push_str(&format!(" {}\n", line)); - } - } - } - } - } - - //// Add networks section so fake exporters can join asap-network - //content.push_str("\nnetworks:\n"); - //content.push_str(" asap-network:\n"); - //content.push_str(" external: true\n"); - - // Write the master compose file - tokio::fs::write(&master_compose_path, content).await?; - - println!("Generated master fake exporters compose file: {}", master_compose_path); - Ok(()) -} - -/// Generate ArroyoSketch docker-compose file using the Python script -pub async fn generate_arroyosketch_compose( - hydra_config: &HydraConfig, - experiment_name: &str, - experiment_outputs_abs_path: &str, -) -> Result<(), Box> { - // Get project root - let project_root = get_project_root()?; - let code_dir = project_root.to_string_lossy(); - - // Paths - let arroyosketch_dir = format!("{}/asap-summary-ingest", code_dir); - let template_path = format!("{}/arroyosketch-cli-compose.yml.j2", arroyosketch_dir); - let helper_script = format!("{}/asap-tools/experiments/generate_arroyosketch_compose.py", code_dir); - let compose_output_path = format!("{}/asap-tools/docker/generated_compose_files/arroyosketch-compose.yml", code_dir); - - // Ensure compose output directory exists - tokio::fs::create_dir_all(format!("{}/asap-tools/docker/generated_compose_files", code_dir)).await?; - - // Experiment output paths (absolute) - let controller_output_dir = format!("{}/controller_output", experiment_outputs_abs_path); - let arroyosketch_output_dir = format!("{}/arroyosketch_output", experiment_outputs_abs_path); - - // Extract config values with defaults - let parallelism = hydra_config.streaming.parallelism.unwrap_or(1); - let output_format = hydra_config.streaming.flink_output_format - .as_ref() - .unwrap_or(&"json".to_string()) - .clone(); - - let args = ArroyoSketchComposeArgs { - template_path, - compose_output_path: compose_output_path.to_string(), - arroyosketch_dir, - container_name: ARROYOSKETCH_CONTAINER_NAME.to_string(), - controller_output_dir, - arroyosketch_output_dir, - prometheus_base_port: 9091, - prometheus_path: "/receive".to_string(), - prometheus_bind_ip: "0.0.0.0".to_string(), - parallelism, - output_kafka_topic: FLINK_OUTPUT_TOPIC.to_string(), - output_format, - pipeline_name: experiment_name.to_string(), - arroyo_url: "http://arroyo:5115/api/v1".to_string(), - bootstrap_servers: "kafka:9092".to_string(), - }; - - call_generate_arroyosketch_compose_script(args, helper_script).await -} - -/// Call generate_arroyosketch_compose.py using uv run -async fn call_generate_arroyosketch_compose_script( - args: ArroyoSketchComposeArgs, - helper_script: String, -) -> Result<(), Box> { - let project_root = get_project_root()?; - let uv_project = format!("{}/asap-tools/asap-cli/uv_configs/generate_compose", project_root.to_string_lossy()); - - let mut cmd = Command::new("uv"); - cmd.arg("run") - .arg("--project") - .arg(uv_project) - .arg(&helper_script) - .arg("--template-path").arg(&args.template_path) - .arg("--compose-output-path").arg(&args.compose_output_path) - .arg("--arroyosketch-dir").arg(&args.arroyosketch_dir) - .arg("--container-name").arg(&args.container_name) - .arg("--controller-output-dir").arg(&args.controller_output_dir) - .arg("--arroyosketch-output-dir").arg(&args.arroyosketch_output_dir) - .arg("--prometheus-base-port").arg(args.prometheus_base_port.to_string()) - .arg("--prometheus-path").arg(&args.prometheus_path) - .arg("--prometheus-bind-ip").arg(&args.prometheus_bind_ip) - .arg("--parallelism").arg(args.parallelism.to_string()) - .arg("--output-kafka-topic").arg(&args.output_kafka_topic) - .arg("--output-format").arg(&args.output_format) - .arg("--pipeline-name").arg(&args.pipeline_name) - .arg("--arroyo-url").arg(&args.arroyo_url) - .arg("--bootstrap-servers").arg(&args.bootstrap_servers); - - println!("Calling generate_arroyosketch_compose.py with uv..."); - let output = cmd.output().await?; - - if !output.status.success() { - eprintln!("stderr: {}", String::from_utf8_lossy(&output.stderr)); - return Err("Failed to generate ArroyoSketch compose file".into()); - } - - println!("stdout: {}", String::from_utf8_lossy(&output.stdout)); - Ok(()) -} - -/// Starts ProjectASAP by bringing up containers using asap-docker-compose.yml -pub async fn asap_up() -> Result<(), Box> { - let project_root = get_project_root()?; - let compose_path = format!("{}/asap-tools/docker/asap-docker-compose.yml", project_root.to_string_lossy()); - - let mut cmd = Command::new("docker"); - println!("Starting ProjectASAP..."); - cmd.arg("compose") - .arg("-f").arg(&compose_path) - .arg("up") - .arg("-d"); - - let output = cmd.output().await?; - - if !output.status.success() { - eprintln!("stderr: {}", String::from_utf8_lossy(&output.stderr)); - Err("Failed to start ProjectASAP".into()) - } else { - println!("ProjectASAP started successfully"); - Ok(()) - } -} - -pub async fn asap_down() -> Result<(), Box> { - let project_root = get_project_root()?; - let compose_path = format!("{}/asap-tools/docker/asap-docker-compose.yml", project_root.to_string_lossy()); - - let mut cmd = Command::new("docker"); - cmd.arg("compose") - .arg("-f").arg(&compose_path) - .arg("down") - .arg("-v"); // Remove named volumes declared in the compose file - - let output = cmd.output().await?; - - if !output.status.success() { - eprintln!("stderr: {}", String::from_utf8_lossy(&output.stderr)); - Err("Failed to stop ProjectASAP".into()) - } else { - println!("ProjectASAP stopped successfully (containers and volumes removed)"); - Ok(()) - } -} - -pub async fn docker_ps() -> Result<(), Box> { - let mut cmd = Command::new("docker"); - cmd.arg("ps"); - println!("Running 'docker ps'..."); - let output = cmd.output().await?; - if !output.status.success() { - eprintln!("stderr: {}", String::from_utf8_lossy(&output.stderr)); - Err("Failed to run 'docker ps'".into()) - } else { - println!("{}", String::from_utf8_lossy(&output.stdout)); - Ok(()) - } -} diff --git a/asap-tools/asap-cli/src/main.rs b/asap-tools/asap-cli/src/main.rs deleted file mode 100644 index cae21792..00000000 --- a/asap-tools/asap-cli/src/main.rs +++ /dev/null @@ -1,572 +0,0 @@ -use clap::{Args, Parser, Subcommand}; -use std::path::{Path, PathBuf}; -use std::{thread, time::Duration}; -use tokio::process::Command; -use lazy_static::lazy_static; -mod util; -mod docker_util; - -const DEFAULT_RUN_NAME: &str = "demo"; -const EXPERIMENT_CONFIG_SUFFIX: &str = ".yaml"; - -lazy_static! { - pub static ref PROJECT_ROOT_DIR: PathBuf = get_project_root().unwrap(); - pub static ref HYDRA_CONFIGS_RELATIVE_PATH: PathBuf = PathBuf::from("asap-tools/experiments/config"); -} - -#[derive(Parser)] -#[command(name = "asap")] -#[command(about = "ASAP CLI - A command line interface for deploying ProjectASAP")] -#[command(version)] -struct Cli { - #[command(subcommand)] - command: Commands, -} - -#[derive(Subcommand)] -enum Commands { - #[command(about = "Start a demo deployment")] - Start(StartArgs), - #[command(about = "Stop a demo deployment")] - Stop, -} - -#[derive(Args)] -struct StartArgs { - #[arg( - long = "experiment_config", - required = false, - value_name = "PATH", - help = "Path to YAML experiment configuration file" - )] - experiment_config: Option, - - #[arg( - long = "experiment_type", - required = false, - value_name = "TYPE", - help = "The name of the experiment type, e.g. 'cloud_demo'" - )] - experiment_type: Option, - - #[arg( - long = "experiment_name", - short = 'n', - required = false, - value_name = "NAME", - help = "Name for the experiment output directory (overrides config file). Defaults to 'demo' if not specified" - )] - experiment_name: Option, -} - -/// Get the ProjectASAP root directory based on the binary's location -/// Binary is at: ProjectASAP/asap-tools/asap-cli/target/debug/asap-cli -/// So we go up 4 levels: debug -> target -> asap-cli -> asap-tools -> ProjectASAP -fn get_project_root() -> Result> { - let binary_path = std::env::current_exe()?; - - // Go up 4 levels: asap-cli -> debug -> target -> asap-cli -> asap-tools -> ProjectASAP - let project_root = binary_path - .parent() // Remove 'asap-cli' binary - .and_then(|p| p.parent()) // Remove 'debug' - .and_then(|p| p.parent()) // Remove 'target' - .and_then(|p| p.parent()) // Remove 'asap-cli' - .and_then(|p| p.parent()) // Remove 'asap-tools' - .ok_or("Failed to determine project root from binary location")?; - - Ok(project_root.to_path_buf()) -} - -/// Gets the path to the experiment config yaml file using the given experiment -/// type and the expected location in asap-tools/experiments/config/experiment_type/ -pub fn get_experiment_config_path(experiment_type: &str) -> Result> { - - let experiment_types_directory = PathBuf::from("experiment_type"); - let experiment_config_filename = PathBuf::from( - format!("{}{}", experiment_type, EXPERIMENT_CONFIG_SUFFIX) - ); - - // ROOT/ + /asap-tools/experiments/config/ + /experiment_type/ + /.yaml - let experiment_config_path = PROJECT_ROOT_DIR.join(HYDRA_CONFIGS_RELATIVE_PATH.as_path()) - .join(experiment_types_directory.as_path()) - .join(experiment_config_filename.as_path()); - - Ok(experiment_config_path) -} - -/// Generate all configuration and compose files needed for the experiment -async fn generate_configs_and_compose_files( - config: &util::HydraConfig, - experiment_config_path: &Path, - experiment_name_override: Option<&str>, -) -> Result<(), Box> { - // Get project root based on binary location - let project_root = get_project_root()?; - - let experiments_dir = project_root.join("asap-tools/experiments"); - - println!("Generating configuration and compose files..."); - - // Get experiment name from CLI flag, config file, or default to "demo" - // Priority: CLI flag > config file > "demo" - let experiment_name = experiment_name_override - .or_else( - || config.experiment.as_ref() - .and_then(|e| e.name.as_ref()) - .map(|s| s.as_str()) - ).unwrap_or(DEFAULT_RUN_NAME); - - // Setup experiment output directories (relative to project root) - let experiment_outputs_base = project_root.join("experiment_outputs"); - let experiment_output_dir = experiment_outputs_base.join(experiment_name); - - // If experiment name is "demo" and directory exists, delete it for fresh start - // (demo/ is only used when no explicit experiment name is provided) - if experiment_name == "demo" && experiment_output_dir.exists() { - println!(" - No experiment name given, removing existing 'demo' experiment directory..."); - if let Err(e) = tokio::fs::remove_dir_all(&experiment_output_dir).await { - println!(" - Warning: Could not delete existing demo/ directory: {}. Continuing anyway...", e); - println!(" - Note: You may want to manually delete experiment_outputs/demo/ or provide an explicit experiment name."); - } - } - - // Create experiment output directory structure - println!(" - Creating experiment output directories..."); - tokio::fs::create_dir_all(&experiment_outputs_base).await?; - tokio::fs::create_dir_all(&experiment_output_dir).await?; - tokio::fs::create_dir_all(experiment_output_dir.join("controller_output")).await?; - tokio::fs::create_dir_all(experiment_output_dir.join("arroyosketch_output")).await?; - tokio::fs::create_dir_all(experiment_output_dir.join("sketchdb")).await?; - tokio::fs::create_dir_all(experiment_output_dir.join("sketchdb/query_engine_output")).await?; - - // Generate controller client configs - if config.experiment_params.is_none() { - return Err( - "No experiment parameters found in experiment config: Unable to generate controller client config".into() - ); - } - - let experiment_parameters = config.experiment_params.clone().unwrap(); - println!(" - Generating controller client configs..."); - let controller_client_config = util::generate_controller_client_config( - experiment_parameters, - &experiment_output_dir - ).await?; - - let controller_client_config = controller_client_config.to_str() - .unwrap(); - - // Get absolute path for Docker volume mounts - let experiment_outputs_abs = experiment_output_dir - .canonicalize()? - .to_string_lossy() - .to_string(); - - // 1. Generate query engine compose file - println!(" - Generating query engine compose..."); - docker_util::generate_query_engine_compose( - config, - &experiment_outputs_abs, - ).await?; - - // 2. Generate controller compose file - println!(" - Generating controller compose..."); - println!(" controller_client_config: {}", controller_client_config); - docker_util::generate_controller_compose( - config, - experiment_name, - controller_client_config, - &experiment_outputs_abs, - ).await?; - - // 2.5. Generate ArroyoSketch compose file - println!(" - Generating ArroyoSketch compose..."); - docker_util::generate_arroyosketch_compose( - config, - experiment_name, - &experiment_outputs_abs, - ).await?; - - // 2.6. Generate fake exporter compose files - println!(" - Generating fake exporter compose files..."); - docker_util::generate_fake_exporters_compose( - config, - &experiment_outputs_abs, - ).await?; - - // 3. Generate prometheus config - println!(" - Generating prometheus config..."); - let prometheus_output_dir = project_root.join("asap-tools/docker/prometheus"); - tokio::fs::create_dir_all(&prometheus_output_dir).await?; - let num_nodes = config.cloudlab.num_nodes.unwrap_or(1); - - // For local deployment, use localhost for all IPs - let node_ip_prefix = "localhost"; - let prometheus_client_ip = "localhost"; - - // Get scrape and evaluation intervals from config - let scrape_interval = config.prometheus.scrape_interval - .as_ref() - .unwrap_or(&"5s".to_string()) - .clone(); - - let evaluation_interval = config.prometheus.evaluation_interval - .as_ref() - .unwrap_or(&"1s".to_string()) - .clone(); - - // TODO: TEMPORARY SOLUTION - Currently using "localhost" for node_ip_prefix - // which will generate prometheus targets like "localhost.1:50000", "localhost.2:50001" - // This doesn't work for Docker networking without host mode. - // - // Future improvements: - // 1. Use host machine IP address (e.g., host.docker.internal or actual IP) - // 2. Use a pre-defined Docker network with service discovery - // 3. Post-process the prometheus config to replace IPs with Docker service names - // - // For now, the Python script generates the config, and Docker service names - // are already being used in the fake-exporters-compose.yml file. - // The prometheus config will need manual adjustment or post-processing. - - let uv_project = project_root.join("asap-tools/asap-cli/uv_configs/generate_prometheus_config"); - - // For local deployment, node_offset is 0 - // For CloudLab, this would be read from config - let node_offset = 0; - - // Set up remote write configuration for SketchDB - // For Docker deployment, use arroyo hostname and port 9091 - let remote_write_ip = config.streaming.remote_write - .as_ref() - .and_then(|rw| rw.ip.as_deref()) - .unwrap_or("arroyo"); - - let remote_write_base_port = config.streaming.remote_write - .as_ref() - .and_then(|rw| rw.base_port) - .unwrap_or(9091); - - let remote_write_path = config.streaming.remote_write - .as_ref() - .and_then(|rw| rw.path.as_deref()) - .unwrap_or("/receive"); - - let parallelism = config.streaming.parallelism.unwrap_or(1); - - // Construct remote_write_url - let remote_write_url = format!("http://{}:{}{}", remote_write_ip, remote_write_base_port, remote_write_path); - - // Get metrics to remote write from experiment params - let metrics_to_remote_write = if let Some(ref experiment_params) = config.experiment_params { - util::get_metrics_to_remote_write(experiment_params) - } else { - Vec::new() - }; - let metrics_to_remote_write_str = metrics_to_remote_write.join(","); - - let mut cmd = Command::new("uv"); - cmd.args([ - "run", - "--project", - uv_project.to_str().unwrap(), - experiments_dir - .join("generate_prometheus_config.py") - .to_str() - .unwrap(), - "--num_nodes", - &num_nodes.to_string(), - "--node-offset", - &node_offset.to_string(), - "--output_dir", - prometheus_output_dir.to_str().unwrap(), - "--experiment_config_file", - experiment_config_path.to_str().unwrap(), - "--node-ip-prefix", - node_ip_prefix, - "--prometheus-client-ip", - prometheus_client_ip, - "--scrape_interval", - &scrape_interval, - "--evaluation_interval", - &evaluation_interval, - "--remote_write_url", - &remote_write_url, - "--remote_write_base_port", - &remote_write_base_port.to_string(), - "--parallelism", - ¶llelism.to_string(), - ]); - - // Add remote_write_metric_names if not empty - if !metrics_to_remote_write_str.is_empty() { - cmd.arg("--remote_write_metric_names"); - cmd.arg(&metrics_to_remote_write_str); - } - - let status = cmd.status().await?; - - if !status.success() { - return Err("Failed to generate prometheus config".into()); - } - - // Post-process Prometheus config to fix targets for Docker networking - // The Python script generates targets like "localhost.2:50000" but for Docker - // we need service names like "sketchdb-fake-exporter-50000-python:50000" - // The Python script generates prometheus.yml in the output_dir - let generated_config = prometheus_output_dir.join("prometheus.yml"); - fix_prometheus_targets_for_docker(config, &generated_config, &project_root).await?; - - println!("All configuration and compose files generated successfully!"); - Ok(()) -} - -/// Fix Prometheus targets to use Docker service names instead of localhost.X -async fn fix_prometheus_targets_for_docker( - config: &util::HydraConfig, - prometheus_config_file: &std::path::Path, - _project_root: &std::path::Path, -) -> Result<(), Box> { - // Read the prometheus config - let content = tokio::fs::read_to_string(prometheus_config_file).await?; - - // Get fake exporter info from config - let experiment_params = match &config.experiment_params { - Some(params) => params, - None => return Ok(()), // No experiment params, nothing to fix - }; - - let (num_ports, start_port, language) = match experiment_params.exporters.exporter_list.get("fake_exporter") { - Some(util::ExporterConfig::FakeExporter { - num_ports_per_server, - start_port, - .. - }) => { - let lang = config.fake_exporter_language.as_deref().unwrap_or("python"); - (*num_ports_per_server, *start_port, lang) - }, - _ => return Ok(()), // No fake exporter, nothing to fix - }; - - // Build replacement map: localhost.X:port -> service-name:port - // Note: Python generates all targets on same node (localhost.2:PORT for num_nodes=1) - // not incrementing node number per port - let mut replacements = Vec::new(); - for i in 0..num_ports { - let port = start_port + i; - // For num_nodes=1, Python generates localhost.2:port for all ports - let old_target = format!("localhost.2:{}", port); - let new_target = format!("sketchdb-fake-exporter-{}-{}:{}", port, language, port); - replacements.push((old_target, new_target)); - } - - // Replace all occurrences - let mut new_content = content; - for (old, new) in replacements { - new_content = new_content.replace(&old, &new); - } - - // Write back the fixed config - tokio::fs::write(prometheus_config_file, new_content).await?; - - println!(" - Fixed Prometheus targets to use Docker service names"); - Ok(()) -} - -/// Configure Grafana after containers are running -async fn configure_grafana(experiment_type: &str, experiment_name: Option<&str>) -> Result<(), Box> { - let project_root = get_project_root()?; - let experiments_dir = project_root.join("asap-tools/experiments"); - let uv_project = project_root.join("asap-tools/asap-cli/uv_configs/grafana_config"); - - let experiment_type_arg: String = format!("experiment_type={}", experiment_type); - let experiment_name_arg: String; - - if let Some(name) = experiment_name { - experiment_name_arg = format!("experiment.name={}", name); - } else { - experiment_name_arg = format!("experiment.name={}", DEFAULT_RUN_NAME); - } - - // Wait for Grafana health endpoint to be ready - println!("Waiting for Grafana to be ready..."); - let max_retries = 30; - let mut ready = false; - - for i in 1..=max_retries { - let result = Command::new("curl") - .args(["-s", "http://localhost:3000/api/health"]) - .output() - .await; - - if let Ok(output) = result { - if output.status.success() { - println!("Grafana ready after {} attempts", i); - ready = true; - break; - } - } - - if i < max_retries { - println!("Waiting for Grafana to be ready... ({}/{})", i, max_retries); - thread::sleep(Duration::from_secs(5)); - } - } - - if !ready { - return Err("Grafana failed to become ready after 30 attempts".into()); - } - - println!("Configuring Grafana..."); - let status = Command::new("uv") - .args([ - "run", - "--project", - uv_project.to_str().unwrap(), - experiments_dir.join("grafana_config.py").to_str().unwrap(), - &experiment_type_arg, - &experiment_name_arg, - // Override server URLs to use Docker service discovery - "experiment_params.servers.0.url=http://prometheus:9090", - "experiment_params.servers.1.url=http://queryengine-rust:8088", - "--configure", - ]) - .status() - .await?; - - if !status.success() { - return Err("Failed to configure Grafana".into()); - } - - println!("Grafana configured successfully!"); - Ok(()) -} - -/// Checks if a container is in the 'running' state -async fn check_container(container_name: &str) -> Result> { - let mut cmd = Command::new("docker"); - cmd.arg("container") - .arg("inspect") - .arg("-f").arg("'{{.State.Status}}'") - .arg(container_name); - - let output = cmd.output().await?; - - if !output.status.success() { - eprintln!("stderr: {}", String::from_utf8_lossy(&output.stderr)); - Err("Failed to inspect docker container".into()) - } else { - let is_running = String::from_utf8_lossy(&output.stdout).trim() == "'running'"; - Ok(is_running) - } - -} - -/// Start routine -async fn start(args: StartArgs) -> Result<(), Box> { - // Initialize project root - let _project_root = &PROJECT_ROOT_DIR; - println!("Starting ProjectASAP..."); - - // Get Path to experiment configuration yaml file - let experiment_config_path: PathBuf; - let experiment_type: String; - - if let Some(exp_type) = args.experiment_type { - experiment_config_path = get_experiment_config_path(&exp_type)?; - experiment_type = exp_type.clone(); - } else { - experiment_config_path = args.experiment_config.expect( - "Error: Require one of either experiment type or experiment config path" - ); - experiment_type = experiment_config_path.file_name() - .expect("Error getting experiment type") - .to_str() - .expect("Error parsing experiment type to string") - .strip_suffix(EXPERIMENT_CONFIG_SUFFIX) - .expect("Given path to experiment config does not end in '.yaml'") - .to_owned(); - } - - // Parse the experiment config - println!("Experiment type: {}", experiment_type); - println!("Experiment config path: {}", experiment_config_path.to_str().unwrap()); - println!("Parsing experiment config..."); - let config = util::parse_config_auto(&experiment_config_path).await?; - println!("Successfully parsed experiment config:"); - - println!("- Experiment Type: '{}'", experiment_type); - // Display experiment params if available - if let Some(exp_params) = &config.experiment_params { - println!("- Experiment modes: {:?}", exp_params.experiment); - println!("- Number of servers: {}", exp_params.servers.len()); - println!("- Number of query groups: {}", exp_params.query_groups.len()); - println!("- Number of metrics: {}", exp_params.metrics.len()); - } - - // Display streaming config if available - if let Some(engine) = &config.streaming.engine { - println!("- Streaming engine: {}", engine); - } - if let Some(format) = &config.streaming.flink_output_format { - println!("- Flink output format: {}", format); - } - - // Display other configs - if let Some(lang) = &config.fake_exporter_language { - println!("- Fake exporter language: {}", lang); - } - if let Some(num_nodes) = config.cloudlab.num_nodes { - println!("- CloudLab nodes: {}", num_nodes); - } - - // Convert experiment_config path to absolute path - let experiment_config_abs = if experiment_config_path.is_absolute() { - experiment_config_path.clone() - } else { - std::env::current_dir()?.join(&experiment_config_path) - }; - - // Generate all configuration and compose files - generate_configs_and_compose_files(&config, &experiment_config_abs, args.experiment_name.as_deref()).await?; - - // Start the containers - docker_util::asap_up().await?; - - println!("Waiting for containers to start..."); - while !check_container("asap-grafana").await? { - thread::sleep(Duration::from_secs(5)); - } - // Configure Grafana after containers are running - configure_grafana(&experiment_type, args.experiment_name.as_deref()).await?; - - // Check container status - docker_util::docker_ps().await?; - Ok(()) -} - -async fn stop() -> Result<(), Box> { - println!("Stopping deployment..."); - docker_util::asap_down().await?; - docker_util::docker_ps().await?; - Ok(()) -} - -#[tokio::main] -async fn main() { - let cli = Cli::parse(); - - match cli.command { - Commands::Start(args) => { - if let Err(e) = start(args).await { - eprintln!("Error: {}", e); - std::process::exit(1); - } - } - Commands::Stop => { - if let Err(e) = stop().await { - eprintln!("Error: {}", e); - std::process::exit(1); - } - } - } -} diff --git a/asap-tools/asap-cli/src/util.rs b/asap-tools/asap-cli/src/util.rs deleted file mode 100644 index e493b862..00000000 --- a/asap-tools/asap-cli/src/util.rs +++ /dev/null @@ -1,361 +0,0 @@ -use serde::{Deserialize, Serialize}; -use std::collections::HashMap; -use std::path::Path; - -type BoxedErr = Box; - -/// Complete Hydra configuration combining all config sources -/// This represents the fully resolved Hydra config with all overrides applied -#[derive(Serialize, Deserialize, Debug, Default)] -pub struct HydraConfig { - #[serde(default)] - pub experiment: Option, - #[serde(default)] - pub cloudlab: CloudLabConfig, - #[serde(default)] - pub prometheus: PrometheusConfig, - #[serde(default)] - pub streaming: StreamingConfig, - #[serde(default)] - pub logging: LoggingConfig, - #[serde(default)] - pub profiling: ProfilingConfig, - #[serde(default)] - pub manual: ManualConfig, - #[serde(default)] - pub flow: FlowConfig, - #[serde(default)] - pub experiment_variants: ExperimentVariants, - #[serde(default)] - pub fake_exporter_language: Option, - #[serde(default)] - pub query_engine: QueryEngineConfig, - #[serde(default)] - pub aggregate_cleanup: AggregateCleanupConfig, - - /// The experiment parameters from the experiment_type config group - #[serde(default)] - pub experiment_params: Option, -} - -/// Experiment configuration from experiment_type configs -/// This represents the YAML files in config/experiment_type/ -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct ExperimentConfig { - pub experiment: Vec, - pub servers: Vec, - pub workloads: Option>, - pub exporters: Exporters, - pub query_groups: Vec, - pub metrics: Vec, -} - -/// CloudLab infrastructure configuration -#[derive(Serialize, Deserialize, Debug, Default)] -pub struct CloudLabConfig { - pub num_nodes: Option, - pub username: Option, - pub hostname_suffix: Option, -} - -/// Prometheus configuration overrides -#[derive(Serialize, Deserialize, Debug, Default)] -pub struct PrometheusConfig { - pub local_config_dir: Option, - pub scrape_interval: Option, - pub evaluation_interval: Option, - pub query_log_file: Option, - pub recording_rules: Option, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct RecordingRulesConfig { - pub interval: String, -} - -/// Remote write configuration for Prometheus -#[derive(Serialize, Deserialize, Debug, Default)] -pub struct RemoteWriteConfig { - pub ip: Option, - pub base_port: Option, - pub path: Option, -} - -/// Streaming engine configuration -#[derive(Serialize, Deserialize, Debug, Default)] -pub struct StreamingConfig { - pub engine: Option, // "flink" | "arroyo" - pub flink_input_format: Option, // "json" | "avro-json" | "avro-binary" - pub flink_output_format: Option, // "json" | "byte" - pub enable_object_reuse: Option, - pub do_local_flink: Option, - pub forward_unsupported_queries: Option, - pub parallelism: Option, // Pipeline parallelism - pub remote_write: Option, // Prometheus remote write config -} - -/// Logging configuration -#[derive(Serialize, Deserialize, Debug, Default)] -pub struct LoggingConfig { - pub level: Option, // "DEBUG" | "INFO" | "WARNING" | "ERROR" -} - -/// Profiling configuration -#[derive(Serialize, Deserialize, Debug, Default)] -pub struct ProfilingConfig { - pub query_engine: Option, - pub prometheus_time: Option, - pub flink: Option, - pub arroyo: Option, -} - -/// Manual mode configuration -#[derive(Serialize, Deserialize, Debug, Default)] -pub struct ManualConfig { - pub query_engine: Option, - pub remote_monitor: Option, -} - -/// Flow control configuration -#[derive(Serialize, Deserialize, Debug, Default)] -pub struct FlowConfig { - pub no_teardown: Option, - pub steady_state_wait: Option, -} - -/// Query engine configuration -#[derive(Serialize, Deserialize, Debug, Default)] -pub struct QueryEngineConfig { - pub dump_precomputes: Option, - pub lock_strategy: Option, // "global" or "per-key" -} - -/// Aggregate cleanup configuration -/// Policy options: "circular_buffer", "read_based", "no_cleanup" -#[derive(Serialize, Deserialize, Debug, Default)] -pub struct AggregateCleanupConfig { - pub policy: Option, -} - -/// Experiment metadata -#[derive(Serialize, Deserialize, Debug, Default)] -pub struct ExperimentMetadata { - pub name: Option, - pub config_file: Option, -} - -/// Experiment variants for specific scripts -#[derive(Serialize, Deserialize, Debug, Default)] -pub struct ExperimentVariants { - pub sketchdboffline: Option, - pub flink_aggregations: Option, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct SketchDbOfflineConfig { - pub experiment_dir: String, - pub labels: Option>, - pub groupby: Vec, - pub aggregation: String, // "sum" | "avg" | "count" | "min" | "max" -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct FlinkAggregationsConfig { - pub config: String, - pub aggregation_id: u32, - pub min_aggregations: u32, - pub max_aggregations: u32, - pub profile_duration: Option, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct ExperimentMode { - pub mode: String, - pub query_prometheus_too: Option, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct Server { - pub name: String, - pub url: String, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct Workload { - #[serde(rename = "use")] - pub use_workload: bool, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct Exporters { - pub only_start_if_queries_exist: bool, - pub exporter_list: HashMap, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -#[serde(untagged)] -pub enum ExporterConfig { - NodeExporter { - port: u16, - extra_flags: Option, - }, - FakeExporter { - num_ports_per_server: u16, - start_port: u16, - dataset: String, - synthetic_data_value_scale: u32, - num_labels: u8, - num_values_per_label: u16, - metric_type: String, - }, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct QueryGroup { - pub id: u32, - pub queries: Vec, - pub repetition_delay: u32, - pub client_options: ClientOptions, - pub controller_options: ControllerOptions, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct ClientOptions { - pub repetitions: u32, - pub query_time_offset: Option, - pub starting_delay: Option, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct ControllerOptions { - pub accuracy_sla: f64, - pub latency_sla: f64, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct Metric { - pub metric: String, - pub labels: Vec, - pub exporter: String, -} - -/** - * @brief Auto-detects and parses the config file. - * If it's an experiment_type config, wraps it in HydraConfig. - * If it's a full Hydra config, parses directly. - * - * @returns A HydraConfig struct with all fields populated. - */ -pub async fn parse_config_auto(config: &Path) -> Result { - let content = tokio::fs::read_to_string(config).await?; - - // Try parsing as HydraConfig first - if let Ok(hydra_config) = serde_yaml::from_str::(&content) { - // Check if it has experiment_params or looks like a full Hydra config - if hydra_config.experiment_params.is_some() || - hydra_config.cloudlab.num_nodes.is_some() || - hydra_config.streaming.engine.is_some() { - return Ok(hydra_config); - } - } - - // Otherwise, try parsing as ExperimentConfig and wrap it - let exp_config: ExperimentConfig = serde_yaml::from_str(&content)?; - Ok(HydraConfig { - experiment_params: Some(exp_config), - ..Default::default() - }) -} - -/// Controller client configuration - same as ExperimentConfig but without experiment and workloads -#[derive(Serialize, Deserialize, Debug)] -struct ControllerClientConfig { - pub servers: Vec, - pub exporters: Exporters, - pub query_groups: Vec, - pub metrics: Vec, -} - -pub async fn generate_controller_client_config( - experiment_params: ExperimentConfig, - experiment_output_dir: &Path -) -> Result> { - let output_dir = experiment_output_dir.join("controller_client_configs"); - tokio::fs::create_dir_all(&output_dir).await?; - - // Build a map from server name to server config - let mut server_map: HashMap = HashMap::new(); - for server in &experiment_params.servers { - server_map.insert(server.name.clone(), server.clone()); - } - - // Generate a config file for each experiment mode - for mode in &experiment_params.experiment { - // Determine which servers to include - let servers = if mode.mode == "sketchdb" - && mode.query_prometheus_too.unwrap_or(false) { - // Special case: include all servers - experiment_params.servers.clone() - } else { - // Normal case: only include the server matching the mode - vec![server_map.get(&mode.mode) - .ok_or_else(|| format!("Server '{}' not found in servers config", mode.mode))? - .clone()] - }; - - // Create the controller client config - let controller_config = ControllerClientConfig { - servers, - exporters: experiment_params.exporters.clone(), - query_groups: experiment_params.query_groups.clone(), - metrics: experiment_params.metrics.clone(), - }; - - // Write to file - let output_file = output_dir.join(format!("{}.yaml", mode.mode)); - let file = std::fs::File::create(&output_file)?; - serde_yaml::to_writer(file, &controller_config)?; - } - - // NOTE: An experiment configuration may have multiple modes resulting - // in multiple runs, but the CLI should only run a single mode for now. - // The CLI is hardcoded to use "sketchdb" mode only (matching experiment_run_grafana_demo.py). - // In the future we should probably have yaml configurations strictly for - // configuring a single run of ProjectASAP. - Ok(output_dir.join("sketchdb.yaml")) -} - -/// Get list of metrics that should be written to remote write based on experiment configuration. -/// This matches the Python implementation in experiment_utils/core.py -pub fn get_metrics_to_remote_write(experiment_params: &ExperimentConfig) -> Vec { - // Check if only_start_if_queries_exist flag is set - let only_if_queries_exist = experiment_params.exporters.only_start_if_queries_exist; - - if !only_if_queries_exist { - // Return all metrics - return experiment_params - .metrics - .iter() - .map(|m| m.metric.clone()) - .collect(); - } - - // Get all queries from all query groups - let mut all_queries = Vec::new(); - for group in &experiment_params.query_groups { - all_queries.extend(group.queries.clone()); - } - - // Filter metrics that appear in queries - let mut metrics_to_remote_write = Vec::new(); - for metric_config in &experiment_params.metrics { - for query in &all_queries { - if query.contains(&metric_config.metric) { - metrics_to_remote_write.push(metric_config.metric.clone()); - break; - } - } - } - - metrics_to_remote_write -} diff --git a/asap-tools/asap-cli/uv_configs/generate_compose/pyproject.toml b/asap-tools/asap-cli/uv_configs/generate_compose/pyproject.toml deleted file mode 100644 index 05d7cb12..00000000 --- a/asap-tools/asap-cli/uv_configs/generate_compose/pyproject.toml +++ /dev/null @@ -1,8 +0,0 @@ -[project] -name = "generate-compose" -version = "0.1.0" -description = "Generate docker-compose files from templates" -requires-python = ">=3.12" -dependencies = [ - "jinja2", -] diff --git a/asap-tools/asap-cli/uv_configs/generate_compose/uv.lock b/asap-tools/asap-cli/uv_configs/generate_compose/uv.lock deleted file mode 100644 index 198d57d9..00000000 --- a/asap-tools/asap-cli/uv_configs/generate_compose/uv.lock +++ /dev/null @@ -1,89 +0,0 @@ -version = 1 -revision = 3 -requires-python = ">=3.12" - -[[package]] -name = "generate-compose" -version = "0.1.0" -source = { virtual = "." } -dependencies = [ - { name = "jinja2" }, -] - -[package.metadata] -requires-dist = [{ name = "jinja2" }] - -[[package]] -name = "jinja2" -version = "3.1.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, -] - -[[package]] -name = "markupsafe" -version = "3.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, - { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, - { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, - { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, - { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, - { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, - { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, - { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, - { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, - { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, - { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, - { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, - { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, - { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, - { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, - { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, - { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, - { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, - { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, - { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, - { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, - { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, - { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, - { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, - { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, - { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, - { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, - { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, - { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, - { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, - { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, - { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, - { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, - { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, - { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, - { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, - { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, - { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, - { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, - { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, - { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, - { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, - { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, - { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, - { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, - { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, - { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, - { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, - { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, - { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, - { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, - { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, - { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, - { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, -] diff --git a/asap-tools/asap-cli/uv_configs/generate_prometheus_config/pyproject.toml b/asap-tools/asap-cli/uv_configs/generate_prometheus_config/pyproject.toml deleted file mode 100644 index 901ca399..00000000 --- a/asap-tools/asap-cli/uv_configs/generate_prometheus_config/pyproject.toml +++ /dev/null @@ -1,9 +0,0 @@ -[project] -name = "generate-prometheus-config" -version = "0.1.0" -description = "Generate Prometheus configuration from experiment config" -requires-python = ">=3.12" -dependencies = [ - "pyyaml", - "omegaconf", -] diff --git a/asap-tools/asap-cli/uv_configs/generate_prometheus_config/uv.lock b/asap-tools/asap-cli/uv_configs/generate_prometheus_config/uv.lock deleted file mode 100644 index b3b90fa6..00000000 --- a/asap-tools/asap-cli/uv_configs/generate_prometheus_config/uv.lock +++ /dev/null @@ -1,83 +0,0 @@ -version = 1 -revision = 3 -requires-python = ">=3.12" - -[[package]] -name = "antlr4-python3-runtime" -version = "4.9.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3e/38/7859ff46355f76f8d19459005ca000b6e7012f2f1ca597746cbcd1fbfe5e/antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b", size = 117034, upload-time = "2021-11-06T17:52:23.524Z" } - -[[package]] -name = "generate-prometheus-config" -version = "0.1.0" -source = { virtual = "." } -dependencies = [ - { name = "omegaconf" }, - { name = "pyyaml" }, -] - -[package.metadata] -requires-dist = [ - { name = "omegaconf" }, - { name = "pyyaml" }, -] - -[[package]] -name = "omegaconf" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "antlr4-python3-runtime" }, - { name = "pyyaml" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/09/48/6388f1bb9da707110532cb70ec4d2822858ddfb44f1cdf1233c20a80ea4b/omegaconf-2.3.0.tar.gz", hash = "sha256:d5d4b6d29955cc50ad50c46dc269bcd92c6e00f5f90d23ab5fee7bfca4ba4cc7", size = 3298120, upload-time = "2022-12-08T20:59:22.753Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/94/1843518e420fa3ed6919835845df698c7e27e183cb997394e4a670973a65/omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b", size = 79500, upload-time = "2022-12-08T20:59:19.686Z" }, -] - -[[package]] -name = "pyyaml" -version = "6.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, - { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, - { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, - { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, - { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, - { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, - { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, - { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, - { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, - { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, - { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, - { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, - { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, - { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, - { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, - { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, - { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, - { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, - { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, - { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, - { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, - { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, - { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, - { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, - { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, - { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, - { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, - { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, - { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, - { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, - { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, - { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, - { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, - { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, - { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, -] diff --git a/asap-tools/asap-cli/uv_configs/grafana_config/pyproject.toml b/asap-tools/asap-cli/uv_configs/grafana_config/pyproject.toml deleted file mode 100644 index ec8563d3..00000000 --- a/asap-tools/asap-cli/uv_configs/grafana_config/pyproject.toml +++ /dev/null @@ -1,13 +0,0 @@ -[project] -name = "grafana-config" -version = "0.1.0" -description = "Grafana dashboard configuration for experiments" -requires-python = ">=3.11,<3.12" -dependencies = [ - "requests", - "pyyaml", - "omegaconf", - "grafana-foundation-sdk", - "promql-parser", - "hydra-core", -] diff --git a/asap-tools/data-sources/prometheus-exporters/fake_exporter/fake_exporter_python/fake-exporter-python-cli-compose.yml.j2 b/asap-tools/data-sources/prometheus-exporters/fake_exporter/fake_exporter_python/fake-exporter-python-cli-compose.yml.j2 deleted file mode 100644 index 8e95ed0f..00000000 --- a/asap-tools/data-sources/prometheus-exporters/fake_exporter/fake_exporter_python/fake-exporter-python-cli-compose.yml.j2 +++ /dev/null @@ -1,25 +0,0 @@ -# fake_exporter Docker Compose Template -# This template is rendered with Jinja2 to generate the final docker-compose.yml - -services: - fake-exporter: - image: sketchdb-fake-exporter-python:latest - container_name: {{ container_name | default('asap-fake-exporter') }} - hostname: {{ container_name }} # What prometheus uses to scrape - networks: - - asap-network - expose: - - "{{ port }}" - volumes: - - {{ experiment_output_dir }}:/app/outputs - - {{ output_dir }}:/app/exporter_output_dir - command: [ - "--output_dir", "/app/exporter_output_dir", - "--port", "{{ port }}", - "--valuescale", "{{ valuescale }}", - "--dataset", " {{ dataset }}", - "--num_labels", "{{ num_labels }}", - "--num_values_per_label", "{{ num_values_per_label }}", - "--metric_type", "{{ metric_type }}" - ] - restart: no diff --git a/asap-tools/data-sources/prometheus-exporters/fake_exporter/fake_exporter_rust/fake_exporter/fake-exporter-rust-cli-compose.yml.j2 b/asap-tools/data-sources/prometheus-exporters/fake_exporter/fake_exporter_rust/fake_exporter/fake-exporter-rust-cli-compose.yml.j2 deleted file mode 100644 index a59d56d5..00000000 --- a/asap-tools/data-sources/prometheus-exporters/fake_exporter/fake_exporter_rust/fake_exporter/fake-exporter-rust-cli-compose.yml.j2 +++ /dev/null @@ -1,21 +0,0 @@ -# fake_exporter Docker Compose Template -# This template is rendered with Jinja2 to generate the final docker-compose.yml - -services: - fake-exporter: - image: sketchdb-fake-exporter-rust:latest - container_name: {{ container_name | default('asap-fake-exporter') }} - hostname: {{ container_name }} - networks: - - asap-network - expose: - - "{{ port }}" - command: [ - "--port", "{{ port }}", - "--valuescale", "{{ valuescale }}", - "--dataset", "{{ dataset }}", - "--num-labels", "{{ num_labels }}", - "--num-values-per-label", "{{ num_values_per_label | string }}", - "--metric-type", "{{ metric_type }}" - ] - restart: no