From 6c22e7c3c67df8ec59d1546235c9c91ab1926744 Mon Sep 17 00:00:00 2001 From: Hugo C <911307+hugocaillard@users.noreply.github.com> Date: Thu, 5 Jun 2025 19:08:50 +0200 Subject: [PATCH 1/6] refactor: set up clippy and fix warnings (#107) --- .github/workflows/ci.yaml | 21 ++- .vscode/settings.json | 3 + Cargo.lock | 260 ++++++++-------------------------- src/api_config.rs | 2 +- src/config.rs | 28 ++-- src/lib.rs | 234 +++++++++++++----------------- src/main.rs | 34 ++--- src/resources/service.rs | 2 +- src/resources/stateful_set.rs | 10 +- src/resources/tests.rs | 46 +++--- src/responder.rs | 18 +-- src/routes.rs | 24 ++-- src/tests/mod.rs | 89 +++++------- 13 files changed, 277 insertions(+), 494 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0d67ae7..8250248 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -14,20 +14,27 @@ concurrency: group: ${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }} cancel-in-progress: true +# Make sure CI fails on all warnings, including Clippy lints +env: + RUSTFLAGS: "-Dwarnings" + jobs: format: - name: Format check runs-on: ubuntu-latest steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Install Rust toolchain - run: rustup toolchain install stable --profile minimal --component rustfmt - + - uses: actions/checkout@v4 - name: Run rustfmt run: cargo fmt --all -- --check + clippy_check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: test + run: cargo --version + - name: Run Clippy + run: cargo clippy --all-targets --all-features + build: runs-on: ubuntu-latest outputs: diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..1c565eb --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "rust-analyzer.check.command": "clippy" +} diff --git a/Cargo.lock b/Cargo.lock index 21e7545..073e922 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -33,7 +33,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.2.15", + "getrandom", "once_cell", "version_check", "zerocopy", @@ -208,9 +208,9 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" dependencies = [ - "getrandom 0.2.15", + "getrandom", "instant", - "rand 0.8.5", + "rand", ] [[package]] @@ -240,12 +240,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" -[[package]] -name = "base64" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" - [[package]] name = "base64" version = "0.13.1" @@ -302,7 +296,7 @@ dependencies = [ "k256", "once_cell", "pbkdf2", - "rand_core 0.6.4", + "rand_core", "ripemd", "secp256k1 0.27.0", "sha2 0.10.8", @@ -387,7 +381,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -396,7 +390,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -507,7 +501,7 @@ checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "clar2wasm" version = "0.1.0" -source = "git+https://github.com/stacks-network/clarity-wasm.git?branch=main#a8445afdc3a88dac42bbfc4469f602eb7bcab885" +source = "git+https://github.com/stacks-network/clarity-wasm.git?branch=main#0e9f0890d4a3bb3060ff893c684d3458fc79025b" dependencies = [ "chrono", "clap", @@ -537,8 +531,8 @@ dependencies = [ "clarity", "clarity-repl", "colored", - "libsecp256k1 0.7.1", - "rand 0.8.5", + "libsecp256k1", + "rand", "reqwest", "serde", "serde_derive", @@ -559,7 +553,7 @@ dependencies = [ "clarity-repl", "dirs", "js-sys", - "libsecp256k1 0.7.1", + "libsecp256k1", "serde", "serde-wasm-bindgen", "serde_derive", @@ -577,20 +571,20 @@ version = "1.0.0" source = "git+https://github.com/hirosystems/clarinet.git?rev=a2570690549df7bf710645ab538af3deee309a01#a2570690549df7bf710645ab538af3deee309a01" dependencies = [ "bip32", - "libsecp256k1 0.7.1", + "libsecp256k1", ] [[package]] name = "clarity" version = "2.3.0" -source = "git+https://github.com/stacks-network/stacks-core.git?branch=feat%2Fclarity-wasm-develop#f04ad0b6588eb53b4e18ecae19c1aafc58626f84" +source = "git+https://github.com/stacks-network/stacks-core.git?branch=feat%2Fclarity-wasm-develop#c10dde4f0dda1a35104a022af00a316dff7f3296" dependencies = [ - "getrandom 0.2.15", + "getrandom", "hashbrown 0.15.2", "integer-sqrt", "lazy_static", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "regex", "rstest", "rstest_reuse", @@ -614,7 +608,7 @@ dependencies = [ "clarity", "colored", "comfy-table", - "getrandom 0.2.15", + "getrandom", "hiro-system-kit 0.3.5", "js-sys", "pico-args", @@ -882,8 +876,8 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", + "generic-array", + "rand_core", "subtle", "zeroize", ] @@ -894,7 +888,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array 0.14.7", + "generic-array", "typenum", ] @@ -904,22 +898,8 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ - "generic-array 0.14.7", - "subtle", -] - -[[package]] -name = "curve25519-dalek" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26778518a7f6cffa1d25a44b602b62b979bd88adb9e99ffec546998cf3404839" -dependencies = [ - "byteorder", - "digest 0.8.1", - "rand_core 0.5.1", - "serde", + "generic-array", "subtle", - "zeroize", ] [[package]] @@ -934,6 +914,7 @@ dependencies = [ "digest 0.10.7", "fiat-crypto", "rustc_version", + "serde", "subtle", "zeroize", ] @@ -1007,22 +988,13 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.4", -] - [[package]] name = "digest" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -1119,9 +1091,9 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ - "curve25519-dalek 4.1.3", + "curve25519-dalek", "ed25519", - "rand_core 0.6.4", + "rand_core", "serde", "sha2 0.10.8", "subtle", @@ -1144,9 +1116,9 @@ dependencies = [ "crypto-bigint", "digest 0.10.7", "ff", - "generic-array 0.14.7", + "generic-array", "group", - "rand_core 0.6.4", + "rand_core", "sec1", "subtle", "zeroize", @@ -1215,7 +1187,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -1378,15 +1350,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -1398,17 +1361,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "getrandom" version = "0.2.15" @@ -1418,7 +1370,7 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] @@ -1457,7 +1409,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -1634,7 +1586,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" dependencies = [ "digest 0.9.0", - "generic-array 0.14.7", + "generic-array", "hmac 0.8.1", ] @@ -2174,25 +2126,6 @@ dependencies = [ "libc", ] -[[package]] -name = "libsecp256k1" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd1137239ab33b41aa9637a88a28249e5e70c40a42ccc92db7f12cc356c1fcd7" -dependencies = [ - "arrayref", - "base64 0.12.3", - "digest 0.9.0", - "hmac-drbg", - "libsecp256k1-core 0.2.2", - "libsecp256k1-gen-ecmult 0.2.1", - "libsecp256k1-gen-genmult 0.2.1", - "rand 0.7.3", - "serde", - "sha2 0.9.9", - "typenum", -] - [[package]] name = "libsecp256k1" version = "0.7.1" @@ -2203,26 +2136,15 @@ dependencies = [ "base64 0.13.1", "digest 0.9.0", "hmac-drbg", - "libsecp256k1-core 0.3.0", - "libsecp256k1-gen-ecmult 0.3.0", - "libsecp256k1-gen-genmult 0.3.0", - "rand 0.8.5", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand", "serde", "sha2 0.9.9", "typenum", ] -[[package]] -name = "libsecp256k1-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" -dependencies = [ - "crunchy", - "digest 0.9.0", - "subtle", -] - [[package]] name = "libsecp256k1-core" version = "0.3.0" @@ -2234,31 +2156,13 @@ dependencies = [ "subtle", ] -[[package]] -name = "libsecp256k1-gen-ecmult" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" -dependencies = [ - "libsecp256k1-core 0.2.2", -] - [[package]] name = "libsecp256k1-gen-ecmult" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" dependencies = [ - "libsecp256k1-core 0.3.0", -] - -[[package]] -name = "libsecp256k1-gen-genmult" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" -dependencies = [ - "libsecp256k1-core 0.2.2", + "libsecp256k1-core", ] [[package]] @@ -2267,7 +2171,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" dependencies = [ - "libsecp256k1-core 0.3.0", + "libsecp256k1-core", ] [[package]] @@ -2389,7 +2293,7 @@ checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ "hermit-abi 0.3.9", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "windows-sys 0.52.0", ] @@ -2645,7 +2549,7 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "pox-locking" version = "2.4.0" -source = "git+https://github.com/stacks-network/stacks-core.git?branch=feat%2Fclarity-wasm-develop#f04ad0b6588eb53b4e18ecae19c1aafc58626f84" +source = "git+https://github.com/stacks-network/stacks-core.git?branch=feat%2Fclarity-wasm-develop#c10dde4f0dda1a35104a022af00a316dff7f3296" dependencies = [ "clarity", "slog", @@ -2714,7 +2618,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" dependencies = [ "bytes", - "rand 0.8.5", + "rand", "ring", "rustc-hash 2.0.0", "rustls", @@ -2757,19 +2661,6 @@ dependencies = [ "nibble_vec", ] -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - [[package]] name = "rand" version = "0.8.5" @@ -2777,18 +2668,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", ] [[package]] @@ -2798,16 +2679,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", + "rand_core", ] [[package]] @@ -2816,16 +2688,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", + "getrandom", ] [[package]] @@ -2863,7 +2726,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.15", + "getrandom", "libredox", "thiserror 1.0.65", ] @@ -2874,7 +2737,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" dependencies = [ - "getrandom 0.2.15", + "getrandom", "libredox", "thiserror 2.0.11", ] @@ -2982,7 +2845,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom", "libc", "spin", "untrusted", @@ -3031,7 +2894,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45f80dcc84beab3a327bbe161f77db25f336a1452428176787c8c79ac79d7073" dependencies = [ "quote", - "rand 0.8.5", + "rand", "rustc_version", "syn 1.0.109", ] @@ -3192,7 +3055,7 @@ checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", - "generic-array 0.14.7", + "generic-array", "subtle", "zeroize", ] @@ -3223,7 +3086,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d24b59d129cdadea20aea4fb2352fa053712e5d713eee47d700cd4b2bc002f10" dependencies = [ "bitcoin_hashes", - "rand 0.8.5", + "rand", "secp256k1-sys 0.9.2", "serde", ] @@ -3463,7 +3326,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -3615,19 +3478,18 @@ dependencies = [ [[package]] name = "stacks-common" version = "0.0.2" -source = "git+https://github.com/stacks-network/stacks-core.git?branch=feat%2Fclarity-wasm-develop#f04ad0b6588eb53b4e18ecae19c1aafc58626f84" +source = "git+https://github.com/stacks-network/stacks-core.git?branch=feat%2Fclarity-wasm-develop#c10dde4f0dda1a35104a022af00a316dff7f3296" dependencies = [ "chrono", - "curve25519-dalek 2.0.0", + "curve25519-dalek", "ed25519-dalek", - "getrandom 0.2.15", + "getrandom", "hashbrown 0.15.2", "lazy_static", - "libc", - "libsecp256k1 0.5.0", + "libsecp256k1", "nix 0.23.2", "percent-encoding", - "rand 0.8.5", + "rand", "ripemd", "rusqlite", "secp256k1 0.24.3", @@ -3656,7 +3518,7 @@ dependencies = [ "k8s-openapi", "kube", "pretty_assertions", - "rand 0.8.5", + "rand", "serde", "serde_json", "serde_yaml 0.8.26", @@ -3677,7 +3539,7 @@ source = "git+https://github.com/hirosystems/clarinet.git?rev=a2570690549df7bf71 dependencies = [ "clarinet-utils", "clarity", - "libsecp256k1 0.7.1", + "libsecp256k1", "reqwest", "serde", "serde_derive", @@ -4246,12 +4108,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -4612,7 +4468,7 @@ dependencies = [ "memfd", "memoffset 0.9.1", "paste", - "rand 0.8.5", + "rand", "rustix 0.38.38", "sptr", "wasm-encoder 0.36.2", diff --git a/src/api_config.rs b/src/api_config.rs index f7f4bbf..865ed0d 100644 --- a/src/api_config.rs +++ b/src/api_config.rs @@ -42,7 +42,7 @@ impl ApiConfig { let config_file: ApiConfig = match toml::from_slice(&file_buffer) { Ok(s) => s, Err(e) => { - panic!("Config file malformatted {}", e.to_string()); + panic!("Config file malformatted {}", e); } }; config_file diff --git a/src/config.rs b/src/config.rs index 90d743b..bf01ced 100644 --- a/src/config.rs +++ b/src/config.rs @@ -45,26 +45,23 @@ impl StacksDevnetConfig { ); if user_id != self.namespace { - let msg = + let message = format!("{context}, ERROR: devnet namespace must match authenticated user id"); - ctx.try_log(|logger| slog::warn!(logger, "{}", msg)); - return Err(DevNetError { - message: msg.into(), - code: 400, - }); + ctx.try_log(|logger| slog::warn!(logger, "{}", message)); + return Err(DevNetError { message, code: 400 }); } let project_manifest_yaml_string = self .get_project_manifest_yaml_string() - .map_err(|e| log_and_return_err(e, &context, &ctx))?; + .map_err(|e| log_and_return_err(e, &context, ctx))?; let (network_manifest_yaml_string, devnet_config) = self .get_network_manifest_string_and_devnet_config() - .map_err(|e| log_and_return_err(e, &context, &ctx))?; + .map_err(|e| log_and_return_err(e, &context, ctx))?; let deployment_plan_yaml_string = self .get_deployment_plan_yaml_string() - .map_err(|e| log_and_return_err(e, &context, &ctx))?; + .map_err(|e| log_and_return_err(e, &context, ctx))?; let mut contracts: Vec<(String, String)> = vec![]; for (contract_identifier, (src, _)) in self.deployment_plan.contracts { @@ -170,7 +167,7 @@ impl StacksDevnetConfig { spec.location = contracts_loc.clone(); }, TransactionSpecification::EmulatedContractCall(_) | TransactionSpecification::EmulatedContractPublish(_) => { - return Err(format!("devnet deployment plans do not support emulated-contract-calls or emulated-contract-publish types")) + return Err("devnet deployment plans do not support emulated-contract-calls or emulated-contract-publish types".to_string()) } TransactionSpecification::ContractCall(_) => {}, TransactionSpecification::BtcTransfer(_) => {}, @@ -184,12 +181,9 @@ impl StacksDevnetConfig { } fn log_and_return_err(e: String, context: &str, ctx: &Context) -> DevNetError { - let msg = format!("{context}, ERROR: {e}"); - ctx.try_log(|logger: &hiro_system_kit::Logger| slog::warn!(logger, "{}", msg)); - DevNetError { - message: msg.into(), - code: 400, - } + let message = format!("{context}, ERROR: {e}"); + ctx.try_log(|logger: &hiro_system_kit::Logger| slog::warn!(logger, "{}", message)); + DevNetError { message, code: 400 } } #[cfg(test)] mod tests { @@ -221,7 +215,7 @@ mod tests { let config_file: StacksDevnetConfig = match serde_json::from_slice(&file_buffer) { Ok(s) => s, Err(e) => { - panic!("Config file malformatted {}", e.to_string()); + panic!("Config file malformatted {}", e); } }; config_file diff --git a/src/lib.rs b/src/lib.rs index 5af94cc..0d50b2b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -116,7 +116,7 @@ impl StacksDevnetApiK8sManager { Err(_) => { if cfg!(test) { let is_ci = match env::var("GITHUB_ACTIONS") { - Ok(is_ci) => is_ci == format!("true"), + Ok(is_ci) => is_ci == *"true", Err(_) => false, }; if is_ci { @@ -124,7 +124,7 @@ impl StacksDevnetApiK8sManager { } else { // ensures that if no context is supplied and we're running // tests locally, we deploy to the local kind cluster - Some(format!("kind-kind")) + Some("kind-kind".to_string()) } } else { None @@ -138,14 +138,11 @@ impl StacksDevnetApiK8sManager { cluster: Some(context), user: None, }; - let client_config = - Config::from_kubeconfig(&kube_config) - .await - .unwrap_or_else(|e| { - panic!("could not create kube client config: {}", e.to_string()) - }); + let client_config = Config::from_kubeconfig(&kube_config) + .await + .unwrap_or_else(|e| panic!("could not create kube client config: {}", e)); Client::try_from(client_config) - .unwrap_or_else(|e| panic!("could not create kube client: {}", e.to_string())) + .unwrap_or_else(|e| panic!("could not create kube client: {}", e)) } None => Client::try_default() .await @@ -186,36 +183,32 @@ impl StacksDevnetApiK8sManager { let user_id = &config.user_id; let context = format!("NAMESPACE: {}", &namespace); - let namespace_exists = self.check_namespace_exists(&namespace).await?; + let namespace_exists = self.check_namespace_exists(namespace).await?; if !namespace_exists { if cfg!(debug_assertions) { - self.deploy_namespace(&namespace).await?; + self.deploy_namespace(namespace).await?; } else { - let msg = format!( + let message = format!( "cannot create devnet because namespace {} does not exist", namespace ); - self.ctx.try_log(|logger| slog::warn!(logger, "{}", msg)); - return Err(DevNetError { - message: msg.into(), - code: 400, - }); + self.ctx + .try_log(|logger| slog::warn!(logger, "{}", message)); + return Err(DevNetError { message, code: 400 }); } } let any_assets_exist = self - .check_any_devnet_assets_exist(&namespace, &user_id) + .check_any_devnet_assets_exist(namespace, user_id) .await?; if any_assets_exist { - let msg = format!( + let message = format!( "cannot create devnet because assets already exist {}", context ); - self.ctx.try_log(|logger| slog::warn!(logger, "{}", msg)); - return Err(DevNetError { - message: msg.into(), - code: 409, - }); + self.ctx + .try_log(|logger| slog::warn!(logger, "{}", message)); + return Err(DevNetError { message, code: 409 }); }; self.deploy_bitcoin_node(&config).await?; @@ -309,12 +302,12 @@ impl StacksDevnetApiK8sManager { if errors.is_empty() { Ok(()) } else if errors.len() == 1 { - match errors.get(0) { + match errors.first() { Some(e) => Err(e.clone()), None => unreachable!(), } } else { - let mut msg = format!("multiple errors occurred while deleting devnet: "); + let mut msg = "multiple errors occurred while deleting devnet: ".to_string(); for e in errors { msg = format!("{} \n- {}", msg, e.message); } @@ -325,15 +318,13 @@ impl StacksDevnetApiK8sManager { } } false => { - let msg = format!( + let message = format!( "cannot delete devnet because assets do not exist NAMESPACE: {}", &namespace ); - self.ctx.try_log(|logger| slog::warn!(logger, "{}", msg)); - return Err(DevNetError { - message: msg.into(), - code: 409, - }); + self.ctx + .try_log(|logger| slog::warn!(logger, "{}", message)); + Err(DevNetError { message, code: 409 }) } } } @@ -365,16 +356,10 @@ impl StacksDevnetApiK8sManager { } } Err(e) => { - let msg = format!( - "error getting namespace {}: {}", - namespace_str, - e.to_string() - ); - self.ctx.try_log(|logger| slog::error!(logger, "{}", msg)); - Err(DevNetError { - message: msg, - code: 500, - }) + let message = format!("error getting namespace {}: {}", namespace_str, e); + self.ctx + .try_log(|logger| slog::error!(logger, "{}", message)); + Err(DevNetError { message, code: 500 }) } } } @@ -512,7 +497,7 @@ impl StacksDevnetApiK8sManager { self.ctx.try_log(|logger: &hiro_system_kit::Logger| { slog::info!(logger, "getting pod status {}", context) }); - let pod_api: Api = Api::namespaced(self.client.to_owned(), &namespace); + let pod_api: Api = Api::namespaced(self.client.to_owned(), namespace); let pod_label_selector = format!("{COMPONENT_SELECTOR}={pod}"); let user_label_selector = format!("{USER_SELECTOR}={user_id}"); @@ -533,10 +518,7 @@ impl StacksDevnetApiK8sManager { self.ctx.try_log(|logger: &hiro_system_kit::Logger| { slog::info!(logger, "successfully retrieved pod status {}", context) }); - let start_time = match &status.start_time { - Some(st) => Some(st.0.to_string()), - None => None, - }; + let start_time = status.start_time.as_ref().map(|st| st.0.to_string()); Ok(PodStatusResponse { status: status.phase.to_owned(), start_time, @@ -600,7 +582,7 @@ impl StacksDevnetApiK8sManager { Ok(config) } Err(e) => { - let msg = format!("failed to parse JSON response: {}, ERROR: {}, Raw body: {}", context, e.to_string(), body_str); + let msg = format!("failed to parse JSON response: {}, ERROR: {}, Raw body: {}", context, e, body_str); self.ctx.try_log(|logger| slog::error!(logger, "{}", msg)); Err(DevNetError { message: msg, @@ -612,8 +594,7 @@ impl StacksDevnetApiK8sManager { Err(e) => { let msg = format!( "failed to parse response bytes: {}, ERROR: {}", - context, - e.to_string() + context, e ); self.ctx.try_log(|logger| slog::error!(logger, "{}", msg)); Err(DevNetError { @@ -623,18 +604,14 @@ impl StacksDevnetApiK8sManager { } }, Err(e) => { - let msg = format!( - "failed to query stacks node: {}, ERROR: {}", - context, - e.to_string() - ); + let msg = format!("failed to query stacks node: {}, ERROR: {}", context, e); self.ctx.try_log(|logger| slog::warn!(logger, "{}", msg)); Ok(StacksV2InfoResponse::default()) // Return default response on error } } } Err(e) => { - let msg = format!("failed to parse url: {} ERROR: {}", url, e.to_string()); + let msg = format!("failed to parse url: {} ERROR: {}", url, e); self.ctx.try_log(|logger| slog::error!(logger, "{}", msg)); Err(DevNetError { message: msg, @@ -651,7 +628,7 @@ impl StacksDevnetApiK8sManager { ) -> Result { let context = format!("NAMESPACE: {}", namespace); - match self.check_all_devnet_assets_exist(&namespace).await? { + match self.check_all_devnet_assets_exist(namespace).await? { false => { let msg = format!("not all devnet assets exist {}", context); self.ctx @@ -681,14 +658,10 @@ impl StacksDevnetApiK8sManager { start_time: stacks_api_started_at, }, ) = try_join3( - self.get_pod_status_info(&namespace, user_id, StacksDevnetPod::BitcoindNode), + self.get_pod_status_info(namespace, user_id, StacksDevnetPod::BitcoindNode), + self.get_pod_status_info(namespace, user_id, StacksDevnetPod::StacksBlockchain), self.get_pod_status_info( - &namespace, - user_id, - StacksDevnetPod::StacksBlockchain, - ), - self.get_pod_status_info( - &namespace, + namespace, user_id, StacksDevnetPod::StacksBlockchainApi, ), @@ -696,7 +669,7 @@ impl StacksDevnetApiK8sManager { .await?; // Try to fetch chain info, but handle errors by using default values for the chain tips - let chain_info = match self.get_stacks_v2_info(&namespace).await { + let chain_info = match self.get_stacks_v2_info(namespace).await { Ok(info) => info, Err(e) => { self.ctx.try_log(|logger: &hiro_system_kit::Logger| { @@ -759,7 +732,7 @@ impl StacksDevnetApiK8sManager { } } - async fn get_resource_by_label>( + async fn get_resource_by_label( &self, namespace: &str, name: &str, @@ -771,8 +744,9 @@ impl StacksDevnetApiK8sManager { K: DeserializeOwned, K: std::fmt::Debug, K: Serialize, + K: kube::Resource, { - let resource_api: Api = Api::namespaced(self.client.to_owned(), &namespace); + let resource_api: Api = Api::namespaced(self.client.to_owned(), namespace); let pod_label_selector = format!("{COMPONENT_SELECTOR}={name}"); let user_label_selector = format!("{USER_SELECTOR}={user_id}"); @@ -795,7 +769,7 @@ impl StacksDevnetApiK8sManager { match resource_api.list(&lp).await { Ok(pods) => { - if pods.items.len() > 0 { + if !pods.items.is_empty() { let pod = &pods.items[0]; Ok(Some(pod.clone())) } else { @@ -812,29 +786,24 @@ impl StacksDevnetApiK8sManager { } e => (e.to_string(), 500), }; - let msg = format!("failed to fetch {}, ERROR: {}", resource_details, msg); - self.ctx.try_log(|logger| slog::error!(logger, "{}", msg)); - Err(DevNetError { - message: msg, - code: code, - }) + let message = format!("failed to fetch {}, ERROR: {}", resource_details, msg); + self.ctx + .try_log(|logger| slog::error!(logger, "{}", message)); + Err(DevNetError { message, code }) } } } - async fn get_resource>( - &self, - namespace: &str, - name: &str, - ) -> Result, DevNetError> + async fn get_resource(&self, namespace: &str, name: &str) -> Result, DevNetError> where ::DynamicType: Default, K: Clone, K: DeserializeOwned, K: std::fmt::Debug, K: Serialize, + K: kube::Resource, { - let resource_api: Api = Api::namespaced(self.client.to_owned(), &namespace); + let resource_api: Api = Api::namespaced(self.client.to_owned(), namespace); let resource_details = format!( "RESOURCE: {}, NAME: {}, NAMESPACE: {}", @@ -845,7 +814,7 @@ impl StacksDevnetApiK8sManager { self.ctx .try_log(|logger| slog::info!(logger, "fetching {}", resource_details)); - match resource_api.get_opt(&name).await { + match resource_api.get_opt(name).await { Ok(r) => match r { Some(r) => { self.ctx.try_log(|logger| { @@ -865,17 +834,15 @@ impl StacksDevnetApiK8sManager { kube::Error::Api(api_error) => (api_error.message, api_error.code), e => (e.to_string(), 500), }; - let msg = format!("failed to fetch {}, ERROR: {}", resource_details, msg); - self.ctx.try_log(|logger| slog::error!(logger, "{}", msg)); - Err(DevNetError { - message: msg, - code: code, - }) + let message = format!("failed to fetch {}, ERROR: {}", resource_details, msg); + self.ctx + .try_log(|logger| slog::error!(logger, "{}", message)); + Err(DevNetError { message, code }) } } } - async fn check_resource_exists_by_label>( + async fn check_resource_exists_by_label( &self, namespace: &str, name: &str, @@ -887,6 +854,7 @@ impl StacksDevnetApiK8sManager { K: DeserializeOwned, K: std::fmt::Debug, K: Serialize, + K: kube::Resource, { match self .get_resource_by_label::(namespace, name, user_id) @@ -897,7 +865,7 @@ impl StacksDevnetApiK8sManager { } } - async fn check_resource_exists>( + async fn check_resource_exists( &self, namespace: &str, name: &str, @@ -908,6 +876,7 @@ impl StacksDevnetApiK8sManager { K: DeserializeOwned, K: std::fmt::Debug, K: Serialize, + K: kube::Resource, { match self.get_resource::(namespace, name).await? { Some(_) => Ok(true), @@ -915,7 +884,7 @@ impl StacksDevnetApiK8sManager { } } - async fn deploy_resource>( + async fn deploy_resource( &self, namespace: &str, resource: K, @@ -927,8 +896,9 @@ impl StacksDevnetApiK8sManager { K: DeserializeOwned, K: std::fmt::Debug, K: Serialize, + K: kube::Resource, { - let resource_api: Api = Api::namespaced(self.client.to_owned(), &namespace); + let resource_api: Api = Api::namespaced(self.client.to_owned(), namespace); let pp = PostParams::default(); let name = match resource.meta().name.as_ref() { @@ -1132,7 +1102,7 @@ impl StacksDevnetApiK8sManager { if let Some(configmap_data) = configmap_data { let mut map = BTreeMap::new(); for (key, value) in configmap_data { - map.insert(key.into(), value.into()); + map.insert(key, value); } configmap.data = Some(map); } @@ -1187,14 +1157,14 @@ impl StacksDevnetApiK8sManager { self.deploy_configmap( StacksDevnetConfigmap::BitcoindNode, - &namespace, + namespace, Some(vec![("bitcoin.conf".into(), bitcoind_conf)]), ) .await?; self.deploy_configmap( StacksDevnetConfigmap::ProjectManifest, - &namespace, + namespace, Some(vec![( "Clarinet.toml".into(), config.project_manifest_yaml_string.to_owned(), @@ -1204,7 +1174,7 @@ impl StacksDevnetApiK8sManager { self.deploy_configmap( StacksDevnetConfigmap::Devnet, - &namespace, + namespace, Some(vec![( "Devnet.toml".into(), config.network_manifest_yaml_string.to_owned(), @@ -1214,7 +1184,7 @@ impl StacksDevnetApiK8sManager { self.deploy_configmap( StacksDevnetConfigmap::DeploymentPlan, - &namespace, + namespace, Some(vec![( "default.devnet-plan.yaml".into(), config.deployment_plan_yaml_string.to_owned(), @@ -1224,15 +1194,15 @@ impl StacksDevnetApiK8sManager { self.deploy_configmap( StacksDevnetConfigmap::ProjectDir, - &namespace, + namespace, Some(config.contract_configmap_data.to_owned()), ) .await?; - self.deploy_deployment(StacksDevnetDeployment::BitcoindNode, &namespace, &user_id) + self.deploy_deployment(StacksDevnetDeployment::BitcoindNode, namespace, user_id) .await?; - self.deploy_service(StacksDevnetService::BitcoindNode, namespace, &user_id) + self.deploy_service(StacksDevnetService::BitcoindNode, namespace, user_id) .await?; Ok(()) @@ -1323,7 +1293,7 @@ impl StacksDevnetApiK8sManager { )); let bitcoind_chain_coordinator_host = - get_service_url(&namespace, StacksDevnetService::BitcoindNode); + get_service_url(namespace, StacksDevnetService::BitcoindNode); stacks_conf.push_str(&format!( r#" @@ -1342,7 +1312,7 @@ impl StacksDevnetApiK8sManager { endpoint = "{}:{}" events_keys = ["*"] "#, - get_service_url(&namespace, StacksDevnetService::StacksBlockchainApi), + get_service_url(namespace, StacksDevnetService::StacksBlockchainApi), get_service_port(StacksDevnetService::StacksBlockchainApi, ServicePort::Event) .unwrap(), )); @@ -1350,12 +1320,12 @@ impl StacksDevnetApiK8sManager { for signer_idx in SignerIdx::iter() { let (url, port) = match signer_idx { SignerIdx::Signer0 => ( - get_service_url(&namespace, StacksDevnetService::StacksSigner0), + get_service_url(namespace, StacksDevnetService::StacksSigner0), get_service_port(StacksDevnetService::StacksSigner0, ServicePort::Event) .unwrap(), ), SignerIdx::Signer1 => ( - get_service_url(&namespace, StacksDevnetService::StacksSigner1), + get_service_url(namespace, StacksDevnetService::StacksSigner1), get_service_port(StacksDevnetService::StacksSigner1, ServicePort::Event) .unwrap(), ), @@ -1368,9 +1338,7 @@ impl StacksDevnetApiK8sManager { endpoint = "{}:{}" events_keys = ["stackerdb", "block_proposal", "burn_blocks"] "#, - signer_idx.to_string(), - url, - port, + signer_idx, url, port, )); } @@ -1454,19 +1422,15 @@ impl StacksDevnetApiK8sManager { self.deploy_configmap( StacksDevnetConfigmap::StacksBlockchain, - &namespace, + namespace, Some(vec![("Stacks.toml".into(), stacks_conf)]), ) .await?; - self.deploy_deployment( - StacksDevnetDeployment::StacksBlockchain, - &namespace, - &user_id, - ) - .await?; + self.deploy_deployment(StacksDevnetDeployment::StacksBlockchain, namespace, user_id) + .await?; - self.deploy_service(StacksDevnetService::StacksBlockchain, namespace, &user_id) + self.deploy_service(StacksDevnetService::StacksBlockchain, namespace, user_id) .await?; Ok(()) @@ -1485,13 +1449,13 @@ impl StacksDevnetApiK8sManager { ]); self.deploy_configmap( StacksDevnetConfigmap::StacksBlockchainApiPg, - &namespace, + namespace, Some(stacks_api_pg_env), ) .await?; // configmap env vars for api conatainer - let stacks_node_host = get_service_url(&namespace, StacksDevnetService::StacksBlockchain); + let stacks_node_host = get_service_url(namespace, StacksDevnetService::StacksBlockchain); let rpc_port = get_service_port(StacksDevnetService::StacksBlockchain, ServicePort::RPC).unwrap(); let api_port = @@ -1525,24 +1489,20 @@ impl StacksDevnetApiK8sManager { ]); self.deploy_configmap( StacksDevnetConfigmap::StacksBlockchainApi, - &namespace, + namespace, Some(stacks_api_env), ) .await?; self.deploy_stateful_set( StacksDevnetStatefulSet::StacksBlockchainApi, - &namespace, + namespace, user_id, ) .await?; - self.deploy_service( - StacksDevnetService::StacksBlockchainApi, - &namespace, - &user_id, - ) - .await?; + self.deploy_service(StacksDevnetService::StacksBlockchainApi, namespace, user_id) + .await?; Ok(()) } @@ -1592,27 +1552,27 @@ impl StacksDevnetApiK8sManager { db_path = "/chainstate/stacks-signer-{}.sqlite" "#, signer_key, - get_service_url(&namespace, StacksDevnetService::StacksBlockchain), + get_service_url(namespace, StacksDevnetService::StacksBlockchain), get_service_port(StacksDevnetService::StacksBlockchain, ServicePort::RPC).unwrap(), signer_port, - signer_idx.to_string() + signer_idx ); self.deploy_configmap( configmap, - &namespace, + namespace, Some(vec![("Signer.toml".into(), signer_conf)]), ) .await?; - self.deploy_stateful_set(sts, &namespace, user_id).await?; + self.deploy_stateful_set(sts, namespace, user_id).await?; - self.deploy_service(service, &namespace, &user_id).await?; + self.deploy_service(service, namespace, user_id).await?; Ok(()) } - async fn delete_resource>( + async fn delete_resource( &self, namespace: &str, resource_name: &str, @@ -1622,8 +1582,9 @@ impl StacksDevnetApiK8sManager { K: Clone, K: DeserializeOwned, K: std::fmt::Debug, + K: kube::Resource, { - let api: Api = Api::namespaced(self.client.to_owned(), &namespace); + let api: Api = Api::namespaced(self.client.to_owned(), namespace); let dp = DeleteParams::default(); let resource_details = format!( @@ -1656,7 +1617,7 @@ impl StacksDevnetApiK8sManager { } } - async fn delete_resource_by_label>( + async fn delete_resource_by_label( &self, namespace: &str, resource_name: &str, @@ -1667,8 +1628,9 @@ impl StacksDevnetApiK8sManager { K: Clone, K: DeserializeOwned, K: std::fmt::Debug, + K: kube::Resource, { - let api: Api = Api::namespaced(self.client.to_owned(), &namespace); + let api: Api = Api::namespaced(self.client.to_owned(), namespace); let dp = DeleteParams::default(); let pod_label_selector = format!("{COMPONENT_SELECTOR}={resource_name}"); @@ -1732,13 +1694,13 @@ impl StacksDevnetApiK8sManager { code: api_error.code, }), Err(e) => Err(DevNetError { - message: format!("unable to delete namespace: {}", e.to_string()), + message: format!("unable to delete namespace: {}", e), code: 500, }), } } else { Err(DevNetError { - message: format!("namespace deletion can only occur in debug mode"), + message: "namespace deletion can only occur in debug mode".to_string(), code: 403, }) } @@ -1753,7 +1715,7 @@ impl StacksDevnetApiK8sManager { match serde_yaml::from_str(template_str) { Ok(resource) => Ok(resource), Err(e) => { - let msg = format!("unable to parse template file: {}", e.to_string()); + let msg = format!("unable to parse template file: {}", e); self.ctx.try_log(|logger| slog::error!(logger, "{}", msg)); Err(DevNetError { message: msg, diff --git a/src/main.rs b/src/main.rs index 584575b..633190d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -91,10 +91,10 @@ async fn handle_request( }); let headers = request.headers().clone(); let responder = Responder::new(http_response_config, headers.clone(), ctx.clone()).unwrap(); - if method == &Method::OPTIONS { + if method == Method::OPTIONS { return responder.ok(); } - if method == &Method::GET && (path == "/" || path == &format!("{API_PATH}status")) { + if method == Method::GET && (path == "/" || path == format!("{API_PATH}status")) { return handle_get_status(responder, ctx).await; } let auth_header = auth_config @@ -124,10 +124,10 @@ async fn handle_request( let request_time = SystemTime::now() .duration_since(UNIX_EPOCH) .expect("Could not get current time in secs") - .as_secs() as u64; + .as_secs(); if path == "/api/v1/networks" { - return match method { - &Method::POST => { + return match *method { + Method::POST => { handle_new_devnet( request, &user_id, @@ -172,17 +172,14 @@ async fn handle_request( // the path only contained the network path and network id, // so it must be a request to DELETE a network or GET network info if path_parts.subroute.is_none() { - return match method { - &Method::DELETE => { - match request_store.lock() { - Ok(mut store) => { - store.remove(&user_id); - } - Err(_) => {} + return match *method { + Method::DELETE => { + if let Ok(mut store) = request_store.lock() { + store.remove(&user_id); } handle_delete_devnet(k8s_manager, &network, &user_id, responder).await } - &Method::GET => { + Method::GET => { handle_get_devnet( k8s_manager, &network, @@ -194,7 +191,7 @@ async fn handle_request( ) .await } - &Method::HEAD => { + Method::HEAD => { handle_check_devnet(k8s_manager, &network, &user_id, responder).await } _ => responder @@ -204,18 +201,15 @@ async fn handle_request( // the above methods with no subroute are initiated from our infra, // but any remaning requests would come from the actual user, so we'll // track this request as the last time a user made a request - match request_store.lock() { - Ok(mut store) => { - store.insert(user_id.to_string(), request_time); - } - Err(_) => {} + if let Ok(mut store) = request_store.lock() { + store.insert(user_id.to_string(), request_time); } let subroute = path_parts.subroute.unwrap(); if subroute == "commands" { return responder.err_not_implemented("commands route in progress".into()); } else { - let remaining_path = path_parts.remainder.unwrap_or(String::new()); + let remaining_path = path_parts.remainder.unwrap_or_default(); return handle_try_proxy_service( &remaining_path, &subroute, diff --git a/src/resources/service.rs b/src/resources/service.rs index 1a1d6a2..9d78d26 100644 --- a/src/resources/service.rs +++ b/src/resources/service.rs @@ -62,7 +62,7 @@ pub fn get_user_facing_port(service: StacksDevnetService) -> Option { } pub fn get_service_url(namespace: &str, service: StacksDevnetService) -> String { - format!("{}.{}.svc.cluster.local", service.to_string(), namespace) + format!("{}.{}.svc.cluster.local", service, namespace) } pub fn get_service_from_path_part(path_part: &str) -> Option { diff --git a/src/resources/stateful_set.rs b/src/resources/stateful_set.rs index 13bdf0a..897de4b 100644 --- a/src/resources/stateful_set.rs +++ b/src/resources/stateful_set.rs @@ -24,11 +24,11 @@ pub enum SignerIdx { Signer1, } -impl SignerIdx { - pub fn to_string(&self) -> String { - match &self { - SignerIdx::Signer0 => String::from("0"), - SignerIdx::Signer1 => String::from("1"), +impl fmt::Display for SignerIdx { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + SignerIdx::Signer0 => write!(f, "0"), + SignerIdx::Signer1 => write!(f, "1"), } } } diff --git a/src/resources/tests.rs b/src/resources/tests.rs index 2ffe755..9d8ef7d 100644 --- a/src/resources/tests.rs +++ b/src/resources/tests.rs @@ -6,45 +6,45 @@ use super::{ }; use test_case::test_case; -#[test_case(StacksDevnetConfigmap::BitcoindNode => is equal_to "bitcoind".to_string(); "for BitcoinNode")] -#[test_case(StacksDevnetConfigmap::StacksBlockchain => is equal_to "stacks-blockchain".to_string(); "for StacksBlockchain")] -#[test_case(StacksDevnetConfigmap::StacksBlockchainApi => is equal_to "stacks-blockchain-api".to_string(); "for StacksBlockchainApi")] -#[test_case(StacksDevnetConfigmap::StacksBlockchainApiPg => is equal_to "stacks-blockchain-api-pg".to_string(); "for StacksBlockchainApiPg")] -#[test_case(StacksDevnetConfigmap::StacksSigner0 => is equal_to "stacks-signer-0".to_string(); "for StacksSigner0")] -#[test_case(StacksDevnetConfigmap::StacksSigner1 => is equal_to "stacks-signer-1".to_string(); "for StacksSigner1")] -#[test_case(StacksDevnetConfigmap::DeploymentPlan => is equal_to "deployment-plan".to_string(); "for DeploymentPlan")] -#[test_case(StacksDevnetConfigmap::Devnet => is equal_to "devnet".to_string(); "for Devnet")] -#[test_case(StacksDevnetConfigmap::ProjectDir => is equal_to "project-dir".to_string(); "for ProjectDir")] -#[test_case(StacksDevnetConfigmap::ProjectManifest => is equal_to "project-manifest".to_string(); "for ProjectManifest")] +#[test_case(StacksDevnetConfigmap::BitcoindNode => is equal_to "bitcoind"; "for BitcoinNode")] +#[test_case(StacksDevnetConfigmap::StacksBlockchain => is equal_to "stacks-blockchain"; "for StacksBlockchain")] +#[test_case(StacksDevnetConfigmap::StacksBlockchainApi => is equal_to "stacks-blockchain-api"; "for StacksBlockchainApi")] +#[test_case(StacksDevnetConfigmap::StacksBlockchainApiPg => is equal_to "stacks-blockchain-api-pg"; "for StacksBlockchainApiPg")] +#[test_case(StacksDevnetConfigmap::StacksSigner0 => is equal_to "stacks-signer-0"; "for StacksSigner0")] +#[test_case(StacksDevnetConfigmap::StacksSigner1 => is equal_to "stacks-signer-1"; "for StacksSigner1")] +#[test_case(StacksDevnetConfigmap::DeploymentPlan => is equal_to "deployment-plan"; "for DeploymentPlan")] +#[test_case(StacksDevnetConfigmap::Devnet => is equal_to "devnet"; "for Devnet")] +#[test_case(StacksDevnetConfigmap::ProjectDir => is equal_to "project-dir"; "for ProjectDir")] +#[test_case(StacksDevnetConfigmap::ProjectManifest => is equal_to "project-manifest"; "for ProjectManifest")] fn it_prints_correct_name_for_configmap(configmap: StacksDevnetConfigmap) -> String { configmap.to_string() } -#[test_case(StacksDevnetPod::BitcoindNode => is equal_to "bitcoind-chain-coordinator".to_string(); "for BitcoindNode")] -#[test_case(StacksDevnetPod::StacksBlockchain => is equal_to "stacks-blockchain".to_string(); "for StacksBlockchain")] -#[test_case(StacksDevnetPod::StacksBlockchainApi => is equal_to "stacks-blockchain-api".to_string(); "for StacksBlockchainApi")] +#[test_case(StacksDevnetPod::BitcoindNode => is equal_to "bitcoind-chain-coordinator"; "for BitcoindNode")] +#[test_case(StacksDevnetPod::StacksBlockchain => is equal_to "stacks-blockchain"; "for StacksBlockchain")] +#[test_case(StacksDevnetPod::StacksBlockchainApi => is equal_to "stacks-blockchain-api"; "for StacksBlockchainApi")] fn it_prints_correct_name_for_pod(pod: StacksDevnetPod) -> String { pod.to_string() } -#[test_case(StacksDevnetDeployment::BitcoindNode => is equal_to "bitcoind-chain-coordinator".to_string(); "for BitcoindNode")] -#[test_case(StacksDevnetDeployment::StacksBlockchain => is equal_to "stacks-blockchain".to_string(); "for StacksBlockchain")] +#[test_case(StacksDevnetDeployment::BitcoindNode => is equal_to "bitcoind-chain-coordinator"; "for BitcoindNode")] +#[test_case(StacksDevnetDeployment::StacksBlockchain => is equal_to "stacks-blockchain"; "for StacksBlockchain")] fn it_prints_correct_name_for_deployment(deployment: StacksDevnetDeployment) -> String { deployment.to_string() } -#[test_case(StacksDevnetStatefulSet::StacksBlockchainApi => is equal_to "stacks-blockchain-api".to_string(); "for StacksBlockchainApi")] -#[test_case(StacksDevnetStatefulSet::StacksSigner0 => is equal_to "stacks-signer-0".to_string(); "for StacksSigner0")] -#[test_case(StacksDevnetStatefulSet::StacksSigner1 => is equal_to "stacks-signer-1".to_string(); "for StacksSigner1")] +#[test_case(StacksDevnetStatefulSet::StacksBlockchainApi => is equal_to "stacks-blockchain-api"; "for StacksBlockchainApi")] +#[test_case(StacksDevnetStatefulSet::StacksSigner0 => is equal_to "stacks-signer-0"; "for StacksSigner0")] +#[test_case(StacksDevnetStatefulSet::StacksSigner1 => is equal_to "stacks-signer-1"; "for StacksSigner1")] fn it_prints_correct_name_for_stateful_set(pod: StacksDevnetStatefulSet) -> String { pod.to_string() } -#[test_case(StacksDevnetService::BitcoindNode => is equal_to "bitcoind-chain-coordinator".to_string(); "for BitcoindNode")] -#[test_case(StacksDevnetService::StacksBlockchain => is equal_to "stacks-blockchain".to_string(); "for StacksBlockchain")] -#[test_case(StacksDevnetService::StacksBlockchainApi => is equal_to "stacks-blockchain-api".to_string(); "for StacksBlockchainApi")] -#[test_case(StacksDevnetService::StacksSigner0 => is equal_to "stacks-signer-0".to_string(); "for StacksSigner0")] -#[test_case(StacksDevnetService::StacksSigner1 => is equal_to "stacks-signer-1".to_string(); "for StacksSigner1")] +#[test_case(StacksDevnetService::BitcoindNode => is equal_to "bitcoind-chain-coordinator"; "for BitcoindNode")] +#[test_case(StacksDevnetService::StacksBlockchain => is equal_to "stacks-blockchain"; "for StacksBlockchain")] +#[test_case(StacksDevnetService::StacksBlockchainApi => is equal_to "stacks-blockchain-api"; "for StacksBlockchainApi")] +#[test_case(StacksDevnetService::StacksSigner0 => is equal_to "stacks-signer-0"; "for StacksSigner0")] +#[test_case(StacksDevnetService::StacksSigner1 => is equal_to "stacks-signer-1"; "for StacksSigner1")] fn it_prints_correct_name_for_service(service: StacksDevnetService) -> String { service.to_string() } diff --git a/src/responder.rs b/src/responder.rs index 5eb1957..4bf50c1 100644 --- a/src/responder.rs +++ b/src/responder.rs @@ -66,7 +66,7 @@ impl Responder { break; } } - return builder; + builder } None => builder, } @@ -74,19 +74,7 @@ impl Responder { fn _respond(&self, code: StatusCode, body: String) -> Result, Infallible> { let builder = self.response_builder(); - let body = match Body::try_from(body) { - Ok(b) => b, - Err(e) => { - self.ctx.try_log(|logger| { - slog::error!( - logger, - "responder failed to create response body: {}", - e.to_string() - ) - }); - Body::empty() - } - }; + let body = Body::from(body); match builder.status(code).body(body) { Ok(r) => Ok(r), Err(e) => { @@ -125,7 +113,7 @@ impl Responder { .body(body) { Ok(r) => Ok(r), - Err(e) => self.err_internal(format!("failed to send response: {}", e.to_string())), + Err(e) => self.err_internal(format!("failed to send response: {}", e)), } } diff --git a/src/routes.rs b/src/routes.rs index 1ad6913..c70480a 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -28,7 +28,7 @@ pub async fn handle_get_status( let version_info = match serde_json::to_vec(&version_info) { Ok(v) => v, Err(e) => { - let msg = format!("failed to parse version info: {}", e.to_string()); + let msg = format!("failed to parse version info: {}", e); ctx.try_log(|logger| slog::error!(logger, "{}", msg)); return responder.err_internal(msg); } @@ -58,11 +58,8 @@ pub async fn handle_new_devnet( Ok(config) => match config.to_validated_config(user_id, ctx) { Ok(config) => match k8s_manager.deploy_devnet(config).await { Ok(_) => { - match request_store.lock() { - Ok(mut store) => { - store.insert(user_id.to_string(), request_time); - } - Err(_) => {} + if let Ok(mut store) = request_store.lock() { + store.insert(user_id.to_string(), request_time); } responder.ok() } @@ -112,7 +109,7 @@ pub async fn handle_get_devnet( request_time: u64, ctx: Context, ) -> Result, Infallible> { - match k8s_manager.get_devnet_info(&network, user_id).await { + match k8s_manager.get_devnet_info(network, user_id).await { Ok(devnet_info) => { let last_request_time = match request_store.lock() { Ok(mut store) => match store.get(user_id) { @@ -135,8 +132,7 @@ pub async fn handle_get_devnet( Err(e) => { let msg = format!( "failed to form response body: NAMESPACE: {}, ERROR: {}", - &network, - e.to_string() + &network, e ); ctx.try_log(|logger: &hiro_system_kit::Logger| slog::error!(logger, "{}", msg)); responder.err_internal(msg) @@ -174,18 +170,18 @@ pub async fn handle_try_proxy_service( responder: Responder, ctx: &Context, ) -> Result, Infallible> { - match k8s_manager.check_all_devnet_assets_exist(&network).await { + match k8s_manager.check_all_devnet_assets_exist(network).await { Ok(exists) => match exists { true => { let service = get_service_from_path_part(subroute); match service { Some(service) => { - let base_url = get_service_url(&network, service.clone()); + let base_url = get_service_url(network, service.clone()); let port = get_user_facing_port(service).unwrap(); let forward_url = format!("{}:{}", base_url, port); let proxy_request = - mutate_request_for_proxy(request, &forward_url, &remaining_path); - proxy(proxy_request, responder, &ctx).await + mutate_request_for_proxy(request, &forward_url, remaining_path); + proxy(proxy_request, responder, ctx).await } None => responder.err_bad_request("invalid request path".into()), } @@ -229,7 +225,7 @@ async fn proxy( match client.request(request).await { Ok(response) => Ok(response), Err(e) => { - let msg = format!("error proxying request: {}", e.to_string()); + let msg = format!("error proxying request: {}", e); ctx.try_log(|logger| slog::error!(logger, "{}", msg)); responder.err_internal(msg) } diff --git a/src/tests/mod.rs b/src/tests/mod.rs index c5a644c..7d6c2ea 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -48,7 +48,7 @@ fn get_template_config() -> StacksDevnetConfig { match serde_json::from_slice::(&file_buffer) { Ok(s) => s, Err(e) => { - panic!("Config file malformatted {}", e.to_string()); + panic!("Config file malformatted {}", e); } }; config_file @@ -138,21 +138,21 @@ async fn it_responds_to_valid_requests_with_deploy( let new_path: String; if request_path.contains("{namespace}") { - new_path = request_path.replace("{namespace}", &namespace); + new_path = request_path.replace("{namespace}", namespace); request_path = &new_path; } let (k8s_manager, ctx) = get_k8s_manager().await; - let request_builder = get_request_builder(request_path, method, &namespace); + let request_builder = get_request_builder(request_path, method, namespace); - let _ = k8s_manager.deploy_namespace(&namespace).await.unwrap(); + k8s_manager.deploy_namespace(namespace).await.unwrap(); let mut config = get_template_config(); config.namespace = namespace.to_owned(); - let validated_config = config.to_validated_config(&namespace, &ctx).unwrap(); + let validated_config = config.to_validated_config(namespace, &ctx).unwrap(); let user_id = &namespace; - let _ = k8s_manager.deploy_devnet(validated_config).await.unwrap(); + k8s_manager.deploy_devnet(validated_config).await.unwrap(); // short delay to allow assets to start sleep(Duration::new(5, 0)); @@ -191,7 +191,7 @@ async fn it_responds_to_valid_requests_with_deploy( } } } - let _ = k8s_manager.delete_namespace(&namespace).await.unwrap(); + k8s_manager.delete_namespace(namespace).await.unwrap(); (status, body_str) } @@ -213,16 +213,16 @@ async fn it_responds_to_valid_requests( let new_path: String; if request_path.contains("{namespace}") { - new_path = request_path.replace("{namespace}", &namespace); + new_path = request_path.replace("{namespace}", namespace); request_path = &new_path; } let (k8s_manager, ctx) = get_k8s_manager().await; - let request_builder = get_request_builder(request_path, method, &namespace); + let request_builder = get_request_builder(request_path, method, namespace); if set_up { - let _ = k8s_manager.deploy_namespace(&namespace).await.unwrap(); + k8s_manager.deploy_namespace(namespace).await.unwrap(); } let request: Request = request_builder.body(Body::empty()).unwrap(); @@ -242,7 +242,7 @@ async fn it_responds_to_valid_requests( let body_str = String::from_utf8(bytes).unwrap(); if set_up { - let _ = k8s_manager.delete_namespace(&namespace).await.unwrap(); + k8s_manager.delete_namespace(namespace).await.unwrap(); } (response.status(), body_str) @@ -258,7 +258,7 @@ async fn deploy_devnet( config.namespace = namespace.to_owned(); let body = Body::from(serde_json::to_string(&config).unwrap()); - let request: Request = get_request_builder("/api/v1/networks", Method::POST, &namespace) + let request: Request = get_request_builder("/api/v1/networks", Method::POST, namespace) .body(body) .unwrap(); let _ = handle_request( @@ -281,7 +281,7 @@ async fn get_devnet_info( let request: Request = get_request_builder( &format!("/api/v1/network/{namespace}"), Method::GET, - &namespace, + namespace, ) .body(Body::empty()) .unwrap(); @@ -309,7 +309,7 @@ async fn delete_devnet( let request: Request = get_request_builder( &format!("/api/v1/network/{namespace}"), Method::DELETE, - &namespace, + namespace, ) .body(Body::empty()) .unwrap(); @@ -331,25 +331,19 @@ async fn it_tracks_requests_time_for_user() { let namespace2 = &get_random_namespace(); let (k8s_manager, ctx) = get_k8s_manager().await; - let _ = k8s_manager.deploy_namespace(&namespace).await.unwrap(); - let _ = k8s_manager.deploy_namespace(&namespace2).await.unwrap(); + k8s_manager.deploy_namespace(namespace).await.unwrap(); + k8s_manager.deploy_namespace(namespace2).await.unwrap(); let request_store = Arc::new(Mutex::new(HashMap::new())); // create one devnet and assert request time is stored let created_time = { - deploy_devnet(&namespace, k8s_manager.clone(), request_store.clone(), &ctx).await; + deploy_devnet(namespace, k8s_manager.clone(), request_store.clone(), &ctx).await; let store = request_store.lock().unwrap(); - store.get(namespace).unwrap().clone() + *store.get(namespace).unwrap() }; // create another devnet and assert request time is stored { - deploy_devnet( - &namespace2, - k8s_manager.clone(), - request_store.clone(), - &ctx, - ) - .await; + deploy_devnet(namespace2, k8s_manager.clone(), request_store.clone(), &ctx).await; // after creating a devnet, there should be an entry assert!(request_store.lock().unwrap().get(namespace).is_some()); } @@ -358,7 +352,7 @@ async fn it_tracks_requests_time_for_user() { let secs_after_first_get1 = { let info = - get_devnet_info(&namespace, k8s_manager.clone(), request_store.clone(), &ctx).await; + get_devnet_info(namespace, k8s_manager.clone(), request_store.clone(), &ctx).await; // time should have elapsed since our last request let secs_after_first_get = info.metadata.secs_since_last_request; assert!(secs_after_first_get > 0); @@ -372,13 +366,8 @@ async fn it_tracks_requests_time_for_user() { // confirm time has elapsed since our last request let secs_after_first_get2 = { - let info = get_devnet_info( - &namespace2, - k8s_manager.clone(), - request_store.clone(), - &ctx, - ) - .await; + let info = + get_devnet_info(namespace2, k8s_manager.clone(), request_store.clone(), &ctx).await; let secs_after_first_get = info.metadata.secs_since_last_request; assert!(secs_after_first_get > 0); secs_after_first_get @@ -389,7 +378,7 @@ async fn it_tracks_requests_time_for_user() { let request: Request = get_request_builder( &format!("/api/v1/network/{namespace}/some-path"), Method::GET, - &namespace, + namespace, ) .body(Body::empty()) .unwrap(); @@ -407,19 +396,14 @@ async fn it_tracks_requests_time_for_user() { // immediately make another get request to confirm that the time since last request was updated { let info = - get_devnet_info(&namespace, k8s_manager.clone(), request_store.clone(), &ctx).await; + get_devnet_info(namespace, k8s_manager.clone(), request_store.clone(), &ctx).await; assert!(secs_after_first_get1 > info.metadata.secs_since_last_request); } // and verify that the time since the last request wasn't updated for our other namespace { - let info = get_devnet_info( - &namespace2, - k8s_manager.clone(), - request_store.clone(), - &ctx, - ) - .await; + let info = + get_devnet_info(namespace2, k8s_manager.clone(), request_store.clone(), &ctx).await; assert!(info.metadata.secs_since_last_request >= secs_after_first_get2); } @@ -428,7 +412,7 @@ async fn it_tracks_requests_time_for_user() { assert_eq!(request_store.lock().unwrap().keys().len(), 0); // confirm that our infrastructure pinging will insert request times if none exist { - let _ = get_devnet_info(&namespace, k8s_manager.clone(), request_store.clone(), &ctx).await; + let _ = get_devnet_info(namespace, k8s_manager.clone(), request_store.clone(), &ctx).await; assert_eq!(request_store.lock().unwrap().keys().len(), 1); } @@ -440,8 +424,8 @@ async fn it_tracks_requests_time_for_user() { // clean up delete_devnet(namespace2, k8s_manager.clone(), request_store.clone(), &ctx).await; - let _ = k8s_manager.delete_namespace(&namespace).await.unwrap(); - let _ = k8s_manager.delete_namespace(&namespace2).await.unwrap(); + k8s_manager.delete_namespace(namespace).await.unwrap(); + k8s_manager.delete_namespace(namespace2).await.unwrap(); } async fn mock_k8s_handler(handle: &mut Handle, Response>) { @@ -521,7 +505,7 @@ async fn it_responds_to_invalid_requests( ) -> (StatusCode, String) { let (k8s_manager, ctx) = get_mock_k8s_manager().await; - let request_builder = get_request_builder(request_path, method, &user_id); + let request_builder = get_request_builder(request_path, method, user_id); let request: Request = request_builder.body(Body::empty()).unwrap(); let request_store = Arc::new(Mutex::new(HashMap::new())); let mut response = handle_request( @@ -564,7 +548,7 @@ async fn it_responds_to_invalid_request_header() { assert_eq!(body_str, "missing required auth header".to_string()); } -#[test_case("/api/v1/network/test", Method::OPTIONS => is equal_to "Ok".to_string())] +#[test_case("/api/v1/network/test", Method::OPTIONS => is equal_to *"Ok")] #[test_case("/api/v1/status", Method::GET => is equal_to get_version_info() )] #[test_case("/", Method::GET => is equal_to get_version_info())] #[tokio::test] @@ -586,8 +570,7 @@ async fn it_ignores_request_header_for_some_requests(request_path: &str, method: assert_eq!(response.status(), 200); let body = response.body_mut(); let bytes = body::to_bytes(body).await.unwrap().to_vec(); - let body_str = String::from_utf8(bytes).unwrap(); - body_str + String::from_utf8(bytes).unwrap() } #[test_case("" => is equal_to PathParts { route: String::new(), ..Default::default() }; "for empty path")] @@ -598,9 +581,9 @@ async fn it_ignores_request_header_for_some_requests(request_path: &str, method: #[test_case("/api/v1/some-route/some-network/" => is equal_to PathParts { route: String::from("some-route"), network: Some(String::from("some-network")), ..Default::default() }; "for /api/v1/some-route/some-network/ path trailing slash")] #[test_case("/api/v1/some-route/some-network/some-subroute" => is equal_to PathParts { route: String::from("some-route"), network: Some(String::from("some-network")), subroute: Some(String::from("some-subroute")), ..Default::default() }; "for /api/v1/some-route/some-network/some-subroute path")] #[test_case("/api/v1/some-route/some-network/some-subroute/" => is equal_to PathParts { route: String::from("some-route"), network: Some(String::from("some-network")), subroute: Some(String::from("some-subroute")), ..Default::default() }; "for /api/v1/some-route/some-network/some-subroute/ path trailing slash")] -#[test_case("/api/v1/some-route/some-network/some-subroute/the/remaining/path" => is equal_to PathParts { route: String::from("some-route"), network: Some(String::from("some-network")), subroute: Some(String::from("some-subroute")), remainder: Some(String::from("the/remaining/path")), ..Default::default() }; "for /api/v1/some-route/some-network/some-subroute/the/remaining/path path ")] -#[test_case("/api/v1/some-route/some-network/some-subroute/the/remaining/path/" => is equal_to PathParts { route: String::from("some-route"), network: Some(String::from("some-network")), subroute: Some(String::from("some-subroute")), remainder: Some(String::from("the/remaining/path")), ..Default::default() }; "for /api/v1/some-route/some-network/some-subroute/the/remaining/path/ path trailing slash")] -#[test_case("/api/v1/some-route/some-network/some-subroute/the//remaining//path/" => is equal_to PathParts { route: String::from("some-route"), network: Some(String::from("some-network")), subroute: Some(String::from("some-subroute")), remainder: Some(String::from("the//remaining//path")), ..Default::default() }; "for /api/v1/some-route/some-network/some-subroute/the//remaining//path/ path extra internal slash")] +#[test_case("/api/v1/some-route/some-network/some-subroute/the/remaining/path" => is equal_to PathParts { route: String::from("some-route"), network: Some(String::from("some-network")), subroute: Some(String::from("some-subroute")), remainder: Some(String::from("the/remaining/path")) }; "for /api/v1/some-route/some-network/some-subroute/the/remaining/path path ")] +#[test_case("/api/v1/some-route/some-network/some-subroute/the/remaining/path/" => is equal_to PathParts { route: String::from("some-route"), network: Some(String::from("some-network")), subroute: Some(String::from("some-subroute")), remainder: Some(String::from("the/remaining/path")) }; "for /api/v1/some-route/some-network/some-subroute/the/remaining/path/ path trailing slash")] +#[test_case("/api/v1/some-route/some-network/some-subroute/the//remaining//path/" => is equal_to PathParts { route: String::from("some-route"), network: Some(String::from("some-network")), subroute: Some(String::from("some-subroute")), remainder: Some(String::from("the//remaining//path")) }; "for /api/v1/some-route/some-network/some-subroute/the//remaining//path/ path extra internal slash")] fn request_paths_are_parsed_correctly(path: &str) -> PathParts { get_standardized_path_parts(path) } @@ -661,7 +644,7 @@ async fn namespace_prefix_config_prepends_header() { // using the ApiConfig's `namespace_prefix` field will add the prefix // before the `user_id` as the authenticated user, which should match the request path let namespace = &get_random_namespace(); - let _ = k8s_manager.deploy_namespace(&namespace).await.unwrap(); + k8s_manager.deploy_namespace(namespace).await.unwrap(); let (namespace_prefix, user_id) = namespace.split_at(4); let api_config = ApiConfig { From faeca301ddd3d4d7768b68b1727e07a39f23e468 Mon Sep 17 00:00:00 2001 From: Hugo C <911307+hugocaillard@users.noreply.github.com> Date: Tue, 1 Jul 2025 23:46:59 +0200 Subject: [PATCH 2/6] chore: upgrade dependencies and apply clippy fixes (#129) --- Cargo.lock | 46 +++++++++++++++---------- Cargo.toml | 10 +++--- src/api_config.rs | 6 ++-- src/config.rs | 14 ++++---- src/lib.rs | 72 +++++++++++++++++----------------------- src/resources/service.rs | 2 +- src/responder.rs | 2 +- src/routes.rs | 12 +++---- src/tests/mod.rs | 10 +++--- 9 files changed, 86 insertions(+), 88 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 073e922..31998c4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -518,8 +518,8 @@ dependencies = [ [[package]] name = "clarinet-deployments" -version = "3.0.1" -source = "git+https://github.com/hirosystems/clarinet.git?rev=a2570690549df7bf710645ab538af3deee309a01#a2570690549df7bf710645ab538af3deee309a01" +version = "3.2.0" +source = "git+https://github.com/hirosystems/clarinet.git?rev=116137316023ae912848a1ee1845fed30b306fdc#116137316023ae912848a1ee1845fed30b306fdc" dependencies = [ "base58", "base64 0.21.7", @@ -544,8 +544,8 @@ dependencies = [ [[package]] name = "clarinet-files" -version = "3.0.1" -source = "git+https://github.com/hirosystems/clarinet.git?rev=a2570690549df7bf710645ab538af3deee309a01#a2570690549df7bf710645ab538af3deee309a01" +version = "3.2.0" +source = "git+https://github.com/hirosystems/clarinet.git?rev=116137316023ae912848a1ee1845fed30b306fdc#116137316023ae912848a1ee1845fed30b306fdc" dependencies = [ "bitcoin", "clarinet-utils", @@ -568,7 +568,7 @@ dependencies = [ [[package]] name = "clarinet-utils" version = "1.0.0" -source = "git+https://github.com/hirosystems/clarinet.git?rev=a2570690549df7bf710645ab538af3deee309a01#a2570690549df7bf710645ab538af3deee309a01" +source = "git+https://github.com/hirosystems/clarinet.git?rev=116137316023ae912848a1ee1845fed30b306fdc#116137316023ae912848a1ee1845fed30b306fdc" dependencies = [ "bip32", "libsecp256k1", @@ -600,8 +600,8 @@ dependencies = [ [[package]] name = "clarity-repl" -version = "3.0.1" -source = "git+https://github.com/hirosystems/clarinet.git?rev=a2570690549df7bf710645ab538af3deee309a01#a2570690549df7bf710645ab538af3deee309a01" +version = "3.2.0" +source = "git+https://github.com/hirosystems/clarinet.git?rev=116137316023ae912848a1ee1845fed30b306fdc#116137316023ae912848a1ee1845fed30b306fdc" dependencies = [ "chrono", "clar2wasm", @@ -1553,7 +1553,7 @@ dependencies = [ [[package]] name = "hiro-system-kit" version = "0.3.5" -source = "git+https://github.com/hirosystems/clarinet.git?rev=a2570690549df7bf710645ab538af3deee309a01#a2570690549df7bf710645ab538af3deee309a01" +source = "git+https://github.com/hirosystems/clarinet.git?rev=116137316023ae912848a1ee1845fed30b306fdc#116137316023ae912848a1ee1845fed30b306fdc" dependencies = [ "colored", "time", @@ -2051,7 +2051,7 @@ dependencies = [ "thiserror 1.0.65", "tokio", "tokio-util", - "tower", + "tower 0.4.13", "tower-http", "tracing", ] @@ -3467,8 +3467,8 @@ dependencies = [ [[package]] name = "stacks-codec" -version = "3.0.1" -source = "git+https://github.com/hirosystems/clarinet.git?rev=a2570690549df7bf710645ab538af3deee309a01#a2570690549df7bf710645ab538af3deee309a01" +version = "3.2.0" +source = "git+https://github.com/hirosystems/clarinet.git?rev=116137316023ae912848a1ee1845fed30b306fdc#116137316023ae912848a1ee1845fed30b306fdc" dependencies = [ "clarity", "serde", @@ -3528,14 +3528,14 @@ dependencies = [ "test-case", "tokio", "toml", - "tower", + "tower 0.5.2", "tower-test", ] [[package]] name = "stacks-rpc-client" -version = "3.0.1" -source = "git+https://github.com/hirosystems/clarinet.git?rev=a2570690549df7bf710645ab538af3deee309a01#a2570690549df7bf710645ab538af3deee309a01" +version = "3.2.0" +source = "git+https://github.com/hirosystems/clarinet.git?rev=116137316023ae912848a1ee1845fed30b306fdc#116137316023ae912848a1ee1845fed30b306fdc" dependencies = [ "clarinet-utils", "clarity", @@ -3763,9 +3763,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.0" +version = "1.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" dependencies = [ "backtrace", "bytes", @@ -3791,9 +3791,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", @@ -3887,6 +3887,16 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "tower-layer", + "tower-service", +] + [[package]] name = "tower-http" version = "0.4.4" diff --git a/Cargo.toml b/Cargo.toml index 56b10a7..535f063 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,12 +15,12 @@ repository = "https://github.com/hirosystems/stacks-devnet-api" kube = { version="0.82.2", features = ["client", "runtime"] } k8s-openapi = { version = "0.18.0", features = ["v1_25"] } futures = "0.3.31" -tokio = { version = "1.35.1", features = ["full"] } +tokio = { version = "1.45.1", features = ["full"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0.132" serde_yaml = "0.8.23" hyper = { version = "0.14", features = ["full"] } -tower = "0.4.13" +tower = "0.5.2" strum_macros = "0.24.3" strum = "0.24.1" toml = "0.5.9" @@ -40,6 +40,6 @@ serial_test = "2.0.0" k8s_tests = [] [patch.crates-io] -clarinet-files = { git = "https://github.com/hirosystems/clarinet.git", rev = "a2570690549df7bf710645ab538af3deee309a01" } -clarinet-deployments = { git = "https://github.com/hirosystems/clarinet.git", rev = "a2570690549df7bf710645ab538af3deee309a01" } -hiro-system-kit = { git = "https://github.com/hirosystems/clarinet.git", rev = "a2570690549df7bf710645ab538af3deee309a01" } +clarinet-files = { git = "https://github.com/hirosystems/clarinet.git", rev = "116137316023ae912848a1ee1845fed30b306fdc" } +clarinet-deployments = { git = "https://github.com/hirosystems/clarinet.git", rev = "116137316023ae912848a1ee1845fed30b306fdc" } +hiro-system-kit = { git = "https://github.com/hirosystems/clarinet.git", rev = "116137316023ae912848a1ee1845fed30b306fdc" } diff --git a/src/api_config.rs b/src/api_config.rs index 865ed0d..971f412 100644 --- a/src/api_config.rs +++ b/src/api_config.rs @@ -32,17 +32,17 @@ pub struct AuthConfig { impl ApiConfig { pub fn from_path(config_path: &str) -> ApiConfig { let file = File::open(config_path) - .unwrap_or_else(|e| panic!("unable to read file {}\n{:?}", config_path, e)); + .unwrap_or_else(|e| panic!("unable to read file {config_path}\n{e:?}")); let mut file_reader = BufReader::new(file); let mut file_buffer = vec![]; file_reader .read_to_end(&mut file_buffer) - .unwrap_or_else(|e| panic!("unable to read file {}\n{:?}", config_path, e)); + .unwrap_or_else(|e| panic!("unable to read file {config_path}\n{e:?}")); let config_file: ApiConfig = match toml::from_slice(&file_buffer) { Ok(s) => s, Err(e) => { - panic!("Config file malformatted {}", e); + panic!("Config file malformatted {e}"); } }; config_file diff --git a/src/config.rs b/src/config.rs index bf01ced..3db2de3 100644 --- a/src/config.rs +++ b/src/config.rs @@ -139,7 +139,7 @@ impl StacksDevnetConfig { let yaml_str = match serde_yaml::to_string(&network_config) { Ok(s) => Ok(s), - Err(e) => Err(format!("failed to parse devnet config: {}", e)), + Err(e) => Err(format!("failed to parse devnet config: {e}")), }?; Ok((yaml_str, devnet_config)) @@ -151,7 +151,7 @@ impl StacksDevnetConfig { project_manifest.project.cache_location = FileLocation::from_path(PathBuf::from(CONTRACT_DIR)); serde_yaml::to_string(&project_manifest) - .map_err(|e| format!("failed to parse project manifest: {}", e)) + .map_err(|e| format!("failed to parse project manifest: {e}")) } pub fn get_deployment_plan_yaml_string(&self) -> Result { @@ -176,7 +176,7 @@ impl StacksDevnetConfig { } } serde_yaml::to_string(&self.deployment_plan) - .map_err(|e| format!("failed to parse deployment plan config: {}", e)) + .map_err(|e| format!("failed to parse deployment plan config: {e}")) } } @@ -199,12 +199,12 @@ mod tests { fn read_file(file_path: &str) -> Vec { let file = File::open(file_path) - .unwrap_or_else(|e| panic!("unable to read file {}\n{:?}", file_path, e)); + .unwrap_or_else(|e| panic!("unable to read file {file_path}\n{e:?}")); let mut file_reader = BufReader::new(file); let mut file_buffer = vec![]; file_reader .read_to_end(&mut file_buffer) - .unwrap_or_else(|e| panic!("unable to read file {}\n{:?}", file_path, e)); + .unwrap_or_else(|e| panic!("unable to read file {file_path}\n{e:?}")); file_buffer } @@ -215,7 +215,7 @@ mod tests { let config_file: StacksDevnetConfig = match serde_json::from_slice(&file_buffer) { Ok(s) => s, Err(e) => { - panic!("Config file malformatted {}", e); + panic!("Config file malformatted {e}"); } }; config_file @@ -291,7 +291,7 @@ mod tests { } Err(e) => { assert_eq!(e.code, 400); - assert_eq!(e.message, format!("failed to validate config for NAMESPACE: {}, ERROR: devnet namespace must match authenticated user id", namespace)); + assert_eq!(e.message, format!("failed to validate config for NAMESPACE: {namespace}, ERROR: devnet namespace must match authenticated user id")); } } } diff --git a/src/lib.rs b/src/lib.rs index 0d50b2b..f89a7bd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -140,9 +140,9 @@ impl StacksDevnetApiK8sManager { }; let client_config = Config::from_kubeconfig(&kube_config) .await - .unwrap_or_else(|e| panic!("could not create kube client config: {}", e)); + .unwrap_or_else(|e| panic!("could not create kube client config: {e}")); Client::try_from(client_config) - .unwrap_or_else(|e| panic!("could not create kube client: {}", e)) + .unwrap_or_else(|e| panic!("could not create kube client: {e}")) } None => Client::try_default() .await @@ -188,10 +188,8 @@ impl StacksDevnetApiK8sManager { if cfg!(debug_assertions) { self.deploy_namespace(namespace).await?; } else { - let message = format!( - "cannot create devnet because namespace {} does not exist", - namespace - ); + let message = + format!("cannot create devnet because namespace {namespace} does not exist"); self.ctx .try_log(|logger| slog::warn!(logger, "{}", message)); return Err(DevNetError { message, code: 400 }); @@ -202,10 +200,7 @@ impl StacksDevnetApiK8sManager { .check_any_devnet_assets_exist(namespace, user_id) .await?; if any_assets_exist { - let message = format!( - "cannot create devnet because assets already exist {}", - context - ); + let message = format!("cannot create devnet because assets already exist {context}"); self.ctx .try_log(|logger| slog::warn!(logger, "{}", message)); return Err(DevNetError { message, code: 409 }); @@ -356,7 +351,7 @@ impl StacksDevnetApiK8sManager { } } Err(e) => { - let message = format!("error getting namespace {}: {}", namespace_str, e); + let message = format!("error getting namespace {namespace_str}: {e}"); self.ctx .try_log(|logger| slog::error!(logger, "{}", message)); Err(DevNetError { message, code: 500 }) @@ -492,7 +487,7 @@ impl StacksDevnetApiK8sManager { user_id: &str, pod: StacksDevnetPod, ) -> Result { - let context = format!("NAMESPACE: {}, POD: {}", namespace, pod); + let context = format!("NAMESPACE: {namespace}, POD: {pod}"); self.ctx.try_log(|logger: &hiro_system_kit::Logger| { slog::info!(logger, "getting pod status {}", context) @@ -532,7 +527,7 @@ impl StacksDevnetApiK8sManager { kube::Error::Api(api_error) => (api_error.message, api_error.code), e => (e.to_string(), 500), }; - let msg = format!("failed to get pod status {}, ERROR: {}", context, msg); + let msg = format!("failed to get pod status {context}, ERROR: {msg}"); self.ctx.try_log(|logger| slog::error!(logger, "{}", msg)); Err(DevNetError { message: msg, code }) } @@ -548,9 +543,9 @@ impl StacksDevnetApiK8sManager { let url = get_service_url(namespace, StacksDevnetService::StacksBlockchain); let port = get_service_port(StacksDevnetService::StacksBlockchain, ServicePort::RPC).unwrap(); - let url = format!("http://{}:{}/v2/info", url, port); + let url = format!("http://{url}:{port}/v2/info"); - let context = format!("NAMESPACE: {}", namespace); + let context = format!("NAMESPACE: {namespace}"); self.ctx.try_log(|logger: &hiro_system_kit::Logger| { slog::info!(logger, "Requesting URL: {}", url); // Log the full URL @@ -582,7 +577,7 @@ impl StacksDevnetApiK8sManager { Ok(config) } Err(e) => { - let msg = format!("failed to parse JSON response: {}, ERROR: {}, Raw body: {}", context, e, body_str); + let msg = format!("failed to parse JSON response: {context}, ERROR: {e}, Raw body: {body_str}"); self.ctx.try_log(|logger| slog::error!(logger, "{}", msg)); Err(DevNetError { message: msg, @@ -592,10 +587,8 @@ impl StacksDevnetApiK8sManager { } } Err(e) => { - let msg = format!( - "failed to parse response bytes: {}, ERROR: {}", - context, e - ); + let msg = + format!("failed to parse response bytes: {context}, ERROR: {e}"); self.ctx.try_log(|logger| slog::error!(logger, "{}", msg)); Err(DevNetError { message: msg, @@ -604,14 +597,14 @@ impl StacksDevnetApiK8sManager { } }, Err(e) => { - let msg = format!("failed to query stacks node: {}, ERROR: {}", context, e); + let msg = format!("failed to query stacks node: {context}, ERROR: {e}"); self.ctx.try_log(|logger| slog::warn!(logger, "{}", msg)); Ok(StacksV2InfoResponse::default()) // Return default response on error } } } Err(e) => { - let msg = format!("failed to parse url: {} ERROR: {}", url, e); + let msg = format!("failed to parse url: {url} ERROR: {e}"); self.ctx.try_log(|logger| slog::error!(logger, "{}", msg)); Err(DevNetError { message: msg, @@ -626,11 +619,11 @@ impl StacksDevnetApiK8sManager { namespace: &str, user_id: &str, ) -> Result { - let context = format!("NAMESPACE: {}", namespace); + let context = format!("NAMESPACE: {namespace}"); match self.check_all_devnet_assets_exist(namespace).await? { false => { - let msg = format!("not all devnet assets exist {}", context); + let msg = format!("not all devnet assets exist {context}"); self.ctx .try_log(|logger: &hiro_system_kit::Logger| slog::info!(logger, "{}", msg)); Err(DevNetError { @@ -786,7 +779,7 @@ impl StacksDevnetApiK8sManager { } e => (e.to_string(), 500), }; - let message = format!("failed to fetch {}, ERROR: {}", resource_details, msg); + let message = format!("failed to fetch {resource_details}, ERROR: {msg}"); self.ctx .try_log(|logger| slog::error!(logger, "{}", message)); Err(DevNetError { message, code }) @@ -834,7 +827,7 @@ impl StacksDevnetApiK8sManager { kube::Error::Api(api_error) => (api_error.message, api_error.code), e => (e.to_string(), 500), }; - let message = format!("failed to fetch {}, ERROR: {}", resource_details, msg); + let message = format!("failed to fetch {resource_details}, ERROR: {msg}"); self.ctx .try_log(|logger| slog::error!(logger, "{}", message)); Err(DevNetError { message, code }) @@ -913,10 +906,8 @@ impl StacksDevnetApiK8sManager { "no-name" } }; - let resource_details = format!( - "RESOURCE: {}, NAME: {}, NAMESPACE: {}", - resource_type, name, namespace - ); + let resource_details = + format!("RESOURCE: {resource_type}, NAME: {name}, NAMESPACE: {namespace}"); self.ctx .try_log(|logger| slog::info!(logger, "creating {}", resource_details)); @@ -1286,10 +1277,9 @@ impl StacksDevnetApiK8sManager { stacks_conf.push_str(&format!( r#" [[ustx_balance]] - address = "{}" - amount = {} - "#, - miner_coinbase_recipient, balance + address = "{miner_coinbase_recipient}" + amount = {balance} + "# )); let bitcoind_chain_coordinator_host = @@ -1299,10 +1289,9 @@ impl StacksDevnetApiK8sManager { r#" # Add orchestrator (docker-host) as an event observer [[events_observer]] - endpoint = "{}:{}" + endpoint = "{bitcoind_chain_coordinator_host}:{chain_coordinator_ingestion_port}" events_keys = ["*"] - "#, - bitcoind_chain_coordinator_host, chain_coordinator_ingestion_port + "# )); stacks_conf.push_str(&format!( @@ -1333,12 +1322,11 @@ impl StacksDevnetApiK8sManager { stacks_conf.push_str(&format!( r#" - # Add stacks-signer-{} as an event observer + # Add stacks-signer-{signer_idx} as an event observer [[events_observer]] - endpoint = "{}:{}" + endpoint = "{url}:{port}" events_keys = ["stackerdb", "block_proposal", "burn_blocks"] "#, - signer_idx, url, port, )); } @@ -1694,7 +1682,7 @@ impl StacksDevnetApiK8sManager { code: api_error.code, }), Err(e) => Err(DevNetError { - message: format!("unable to delete namespace: {}", e), + message: format!("unable to delete namespace: {e}"), code: 500, }), } @@ -1715,7 +1703,7 @@ impl StacksDevnetApiK8sManager { match serde_yaml::from_str(template_str) { Ok(resource) => Ok(resource), Err(e) => { - let msg = format!("unable to parse template file: {}", e); + let msg = format!("unable to parse template file: {e}"); self.ctx.try_log(|logger| slog::error!(logger, "{}", msg)); Err(DevNetError { message: msg, diff --git a/src/resources/service.rs b/src/resources/service.rs index 9d78d26..459b865 100644 --- a/src/resources/service.rs +++ b/src/resources/service.rs @@ -62,7 +62,7 @@ pub fn get_user_facing_port(service: StacksDevnetService) -> Option { } pub fn get_service_url(namespace: &str, service: StacksDevnetService) -> String { - format!("{}.{}.svc.cluster.local", service, namespace) + format!("{service}.{namespace}.svc.cluster.local") } pub fn get_service_from_path_part(path_part: &str) -> Option { diff --git a/src/responder.rs b/src/responder.rs index 4bf50c1..aa5cde6 100644 --- a/src/responder.rs +++ b/src/responder.rs @@ -113,7 +113,7 @@ impl Responder { .body(body) { Ok(r) => Ok(r), - Err(e) => self.err_internal(format!("failed to send response: {}", e)), + Err(e) => self.err_internal(format!("failed to send response: {e}")), } } diff --git a/src/routes.rs b/src/routes.rs index c70480a..86e759e 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -28,7 +28,7 @@ pub async fn handle_get_status( let version_info = match serde_json::to_vec(&version_info) { Ok(v) => v, Err(e) => { - let msg = format!("failed to parse version info: {}", e); + let msg = format!("failed to parse version info: {e}"); ctx.try_log(|logger| slog::error!(logger, "{}", msg)); return responder.err_internal(msg); } @@ -68,7 +68,7 @@ pub async fn handle_new_devnet( Err(e) => responder.respond(e.code, e.message), }, Err(e) => { - responder.err_bad_request(format!("invalid configuration to create network: {}", e)) + responder.err_bad_request(format!("invalid configuration to create network: {e}")) } } } @@ -178,7 +178,7 @@ pub async fn handle_try_proxy_service( Some(service) => { let base_url = get_service_url(network, service.clone()); let port = get_user_facing_port(service).unwrap(); - let forward_url = format!("{}:{}", base_url, port); + let forward_url = format!("{base_url}:{port}"); let proxy_request = mutate_request_for_proxy(request, &forward_url, remaining_path); proxy(proxy_request, responder, ctx).await @@ -202,12 +202,12 @@ pub fn mutate_request_for_proxy( path_to_forward: &str, ) -> Request { let query = match request.uri().query() { - Some(query) => format!("?{}", query), + Some(query) => format!("?{query}"), None => String::new(), }; *request.uri_mut() = { - let forward_uri = format!("http://{}/{}{}", forward_url, path_to_forward, query); + let forward_uri = format!("http://{forward_url}/{path_to_forward}{query}"); Uri::from_str(forward_uri.as_str()) } .unwrap(); @@ -225,7 +225,7 @@ async fn proxy( match client.request(request).await { Ok(response) => Ok(response), Err(e) => { - let msg = format!("error proxying request: {}", e); + let msg = format!("error proxying request: {e}"); ctx.try_log(|logger| slog::error!(logger, "{}", msg)); responder.err_internal(msg) } diff --git a/src/tests/mod.rs b/src/tests/mod.rs index 7d6c2ea..6a6dde1 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -36,19 +36,19 @@ fn get_version_info() -> String { } fn get_template_config() -> StacksDevnetConfig { let file_path = "src/tests/fixtures/stacks-devnet-config.json"; - let file = File::open(file_path) - .unwrap_or_else(|e| panic!("unable to read file {}\n{:?}", file_path, e)); + let file = + File::open(file_path).unwrap_or_else(|e| panic!("unable to read file {file_path}\n{e:?}")); let mut file_reader = BufReader::new(file); let mut file_buffer = vec![]; file_reader .read_to_end(&mut file_buffer) - .unwrap_or_else(|e| panic!("unable to read file {}\n{:?}", file_path, e)); + .unwrap_or_else(|e| panic!("unable to read file {file_path}\n{e:?}")); let config_file: StacksDevnetConfig = match serde_json::from_slice::(&file_buffer) { Ok(s) => s, Err(e) => { - panic!("Config file malformatted {}", e); + panic!("Config file malformatted {e}"); } }; config_file @@ -451,7 +451,7 @@ async fn mock_k8s_handler(handle: &mut Handle, Response>) { } ("GET", "/api/v1/namespaces/undeployed") => (vec![], 404), ("GET", "/api/v1/namespaces/500_err") => (vec![], 500), - _ => panic!("Unexpected API request {:?}", request), + _ => panic!("Unexpected API request {request:?}"), }; send.send_response( From a996096eadb582651894a34d450c7a926cd5c3d3 Mon Sep 17 00:00:00 2001 From: Leah McBeth Date: Tue, 1 Jul 2025 16:03:17 -0600 Subject: [PATCH 3/6] feat: update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 41a16cf..d3d387c 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ When the service has been deployed to your Kubernetes cluster, it should be reac - `GET/POST localhost:8477/api/v1/network//bitcoin-node/*` - Forwards `*` to the underlying bitcoin node pod of the devnet. If not all devnet assets exist for the given namespace, a 404 error will be returned. - `GET/POST localhost:8477/api/v1/network//stacks-blockchain-api/*` - Forwards `*` to the underlying stacks api pod of the devnet. If not all devnet assets exist for the given namespace, a 404 error will be returned. -## Bugs and feature requests +## Bugs and Feature Requests If you encounter a bug or have a feature request, we encourage you to follow the steps below: From 3fd8a77523e5f3844698364d79657fe76c07666a Mon Sep 17 00:00:00 2001 From: Leah McBeth Date: Tue, 1 Jul 2025 16:13:52 -0600 Subject: [PATCH 4/6] chore: bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 31998c4..e50a27f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3508,7 +3508,7 @@ dependencies = [ [[package]] name = "stacks-devnet-api" -version = "1.5.2" +version = "1.5.3" dependencies = [ "clarinet-deployments", "clarinet-files", diff --git a/Cargo.toml b/Cargo.toml index 535f063..d7923b2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "stacks-devnet-api" -version = "1.5.2" +version = "1.5.3" edition = "2021" authors = ["Micaiah Reid "] description = "The Stacks Devnet API runs a server that can be used to deploy, delete, manage, and make requests to Stacks Devnets run on Kubernetes." From ac859921aad1952e868c65cd373fc7ce1c9358c9 Mon Sep 17 00:00:00 2001 From: semantic-release-bot <205643090+hirosystems-release-bot[bot]@users.noreply.github.com> Date: Fri, 11 Apr 2025 22:00:48 +0000 Subject: [PATCH 5/6] chore(release): 1.7.0 [skip ci] ## [1.7.0](https://github.com/hirosystems/stacks-devnet-api/compare/v1.6.0...v1.7.0) (2025-04-11) ### Features * bump version ([93dcc30](https://github.com/hirosystems/stacks-devnet-api/commit/93dcc3082a27f49990f76bf366795fe2ed5b3405)) * upgrade clarinet 2.15.2 ([#122](https://github.com/hirosystems/stacks-devnet-api/issues/122)) ([2c93427](https://github.com/hirosystems/stacks-devnet-api/commit/2c9342775baeb5bf2d4bd8fe87b45f9ea4675886)) ### Bug Fixes * try use env var ([f198b0a](https://github.com/hirosystems/stacks-devnet-api/commit/f198b0ae0f74fb06673319d7c927e09c7a13c084)) * try using gh app again ([b6ef31f](https://github.com/hirosystems/stacks-devnet-api/commit/b6ef31f8d28fe2d8941de603250ffad8367b91de)) * update actions checkout token to GH Apps token ([#125](https://github.com/hirosystems/stacks-devnet-api/issues/125)) ([6d3eb2f](https://github.com/hirosystems/stacks-devnet-api/commit/6d3eb2f55c6952229c55b5ea9440c8a0b0d59645)) * working auto-deploy with GH App token ([f3a8f58](https://github.com/hirosystems/stacks-devnet-api/commit/f3a8f58d41d71cdcdf6f2a7d783b084b9f850898)) --- CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 631f8c8..07b4f57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +## [1.7.0](https://github.com/hirosystems/stacks-devnet-api/compare/v1.6.0...v1.7.0) (2025-04-11) + + +### Features + +* bump version ([93dcc30](https://github.com/hirosystems/stacks-devnet-api/commit/93dcc3082a27f49990f76bf366795fe2ed5b3405)) +* upgrade clarinet 2.15.2 ([#122](https://github.com/hirosystems/stacks-devnet-api/issues/122)) ([2c93427](https://github.com/hirosystems/stacks-devnet-api/commit/2c9342775baeb5bf2d4bd8fe87b45f9ea4675886)) + + +### Bug Fixes + +* try use env var ([f198b0a](https://github.com/hirosystems/stacks-devnet-api/commit/f198b0ae0f74fb06673319d7c927e09c7a13c084)) +* try using gh app again ([b6ef31f](https://github.com/hirosystems/stacks-devnet-api/commit/b6ef31f8d28fe2d8941de603250ffad8367b91de)) +* update actions checkout token to GH Apps token ([#125](https://github.com/hirosystems/stacks-devnet-api/issues/125)) ([6d3eb2f](https://github.com/hirosystems/stacks-devnet-api/commit/6d3eb2f55c6952229c55b5ea9440c8a0b0d59645)) +* working auto-deploy with GH App token ([f3a8f58](https://github.com/hirosystems/stacks-devnet-api/commit/f3a8f58d41d71cdcdf6f2a7d783b084b9f850898)) + ## [1.6.0](https://github.com/hirosystems/stacks-devnet-api/compare/v1.5.0...v1.6.0) (2025-03-04) From 6b10982fe53c84dba34a708bd34362d00f0d0b77 Mon Sep 17 00:00:00 2001 From: semantic-release-bot <205643090+hirosystems-release-bot[bot]@users.noreply.github.com> Date: Fri, 9 May 2025 16:10:03 +0000 Subject: [PATCH 6/6] chore(release): 1.8.0 [skip ci] ## [1.8.0](https://github.com/hirosystems/stacks-devnet-api/compare/v1.7.0...v1.8.0) (2025-05-09) ### Features * sign bot commits ([#126](https://github.com/hirosystems/stacks-devnet-api/issues/126)) ([ef9abe4](https://github.com/hirosystems/stacks-devnet-api/commit/ef9abe4acb4a42f3bc9cefb41d9c28aa85ed6f16)) * upgrade clarinet version to 3.0.1 ([#127](https://github.com/hirosystems/stacks-devnet-api/issues/127)) ([777b66d](https://github.com/hirosystems/stacks-devnet-api/commit/777b66dffc0a226504813bc7429c680fd4e96aa7)) --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07b4f57..946942c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [1.8.0](https://github.com/hirosystems/stacks-devnet-api/compare/v1.7.0...v1.8.0) (2025-05-09) + + +### Features + +* sign bot commits ([#126](https://github.com/hirosystems/stacks-devnet-api/issues/126)) ([ef9abe4](https://github.com/hirosystems/stacks-devnet-api/commit/ef9abe4acb4a42f3bc9cefb41d9c28aa85ed6f16)) +* upgrade clarinet version to 3.0.1 ([#127](https://github.com/hirosystems/stacks-devnet-api/issues/127)) ([777b66d](https://github.com/hirosystems/stacks-devnet-api/commit/777b66dffc0a226504813bc7429c680fd4e96aa7)) + ## [1.7.0](https://github.com/hirosystems/stacks-devnet-api/compare/v1.6.0...v1.7.0) (2025-04-11)