diff options
author | Toby Vincent <tobyv13@gmail.com> | 2022-03-17 18:19:50 -0500 |
---|---|---|
committer | Toby Vincent <tobyv13@gmail.com> | 2022-03-17 18:19:50 -0500 |
commit | e18482558a43330cab726ae92518904be346a248 (patch) | |
tree | 0ec733e16c2511734a155b5d59c6bd5ddba00aa1 | |
parent | 8858295736b507825f279f51303ab6e9f939f423 (diff) |
refactor: migrated from rocket to axum
-rw-r--r-- | Cargo.lock | 873 | ||||
-rw-r--r-- | zone_core/Cargo.toml | 5 | ||||
-rw-r--r-- | zone_core/src/container.rs | 109 | ||||
-rw-r--r-- | zone_core/src/container/status.rs | 18 | ||||
-rw-r--r-- | zone_core/src/lib.rs | 146 | ||||
-rw-r--r-- | zone_nspawn/Cargo.toml | 2 | ||||
-rw-r--r-- | zone_nspawn/src/config.rs | 2 | ||||
-rw-r--r-- | zoned/Cargo.toml | 9 | ||||
-rw-r--r-- | zoned/src/api.rs | 109 | ||||
-rw-r--r-- | zoned/src/config.rs | 113 | ||||
-rw-r--r-- | zoned/src/error.rs | 56 | ||||
-rw-r--r-- | zoned/src/lib.rs | 8 | ||||
-rw-r--r-- | zoned/src/main.rs | 39 | ||||
-rw-r--r-- | zoned/src/state.rs | 20 |
14 files changed, 606 insertions, 903 deletions
@@ -18,27 +18,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94a45b455c14666b85fc40a019e8ab9eb75e3a124e05494f5397122bc9eb06e0" [[package]] -name = "async-stream" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171374e7e3b2504e0e5236e3b59260560f9fe94bfe9ac39ba5e4e929c5590625" -dependencies = [ - "async-stream-impl", - "futures-core", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "648ed8c8d2ce5409ccd57453d9d1b214b342a0d69376a6feda1fd6cae3299308" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] name = "async-trait" version = "0.1.52" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -76,10 +55,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] -name = "base-x" -version = "0.2.8" +name = "axum" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "157d3c6bef9a248ecf0492f05bb91019ced3c5b0f4cd9ec09b16d06596e1e743" +dependencies = [ + "async-trait", + "axum-core", + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-http", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" +checksum = "6dbcda393bef9c87572779cb8ef916f12d77750b27535dd6819fa86591627a51" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", +] [[package]] name = "base64" @@ -88,12 +105,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] -name = "binascii" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" - -[[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -142,7 +153,7 @@ dependencies = [ "libc", "num-integer", "num-traits", - "time 0.1.43", + "time", "winapi", ] @@ -186,23 +197,6 @@ dependencies = [ ] [[package]] -name = "const_fn" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f92cfa0fd5690b3cf8c1ef2cabbd9b7ef22fa53cf5e1f92b05103f6d5d1cf6e7" - -[[package]] -name = "cookie" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f1c7727e460397e56abc4bddc1d49e07a1ad78fc98eb2e1c8f032a58a2f80d" -dependencies = [ - "percent-encoding", - "time 0.2.27", - "version_check", -] - -[[package]] name = "core-foundation" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -224,18 +218,8 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f2c43f534ea4b0b049015d00269734195e6d3f0f6635cb692251aca6f9f8b3c" dependencies = [ - "darling_core 0.12.4", - "darling_macro 0.12.4", -] - -[[package]] -name = "darling" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0d720b8683f8dd83c65155f0530560cba68cd2bf395f6513a483caee57ff7f4" -dependencies = [ - "darling_core 0.13.1", - "darling_macro 0.13.1", + "darling_core", + "darling_macro", ] [[package]] @@ -253,37 +237,12 @@ dependencies = [ ] [[package]] -name = "darling_core" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a340f241d2ceed1deb47ae36c4144b2707ec7dd0b649f894cb39bb595986324" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn", -] - -[[package]] name = "darling_macro" version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29b5acf0dea37a7f66f7b25d2c5e93fd46f8f6968b1a5d7a3e02e97768afc95a" dependencies = [ - "darling_core 0.12.4", - "quote", - "syn", -] - -[[package]] -name = "darling_macro" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c41b3b7352feb3211a0d743dc5700a4e3b60f51bd2b368892d1e0f9a95f44b" -dependencies = [ - "darling_core 0.13.1", + "darling_core", "quote", "syn", ] @@ -303,7 +262,7 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66e616858f6187ed828df7c64a6d71720d83767a7f19740b2d1b6fe6327b36e5" dependencies = [ - "darling 0.12.4", + "darling", "proc-macro2", "quote", "syn", @@ -320,51 +279,6 @@ dependencies = [ ] [[package]] -name = "devise" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c7580b072f1c8476148f16e0a0d5dedddab787da98d86c5082c5e9ed8ab595" -dependencies = [ - "devise_codegen", - "devise_core", -] - -[[package]] -name = "devise_codegen" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "123c73e7a6e51b05c75fe1a1b2f4e241399ea5740ed810b0e3e6cacd9db5e7b2" -dependencies = [ - "devise_core", - "quote", -] - -[[package]] -name = "devise_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841ef46f4787d9097405cac4e70fb8644fc037b526e8c14054247c0263c400d0" -dependencies = [ - "bitflags", - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn", -] - -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" - -[[package]] -name = "dyn-clone" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" - -[[package]] name = "either" version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -386,7 +300,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "790b4292c72618abbab50f787a477014fe15634f96291de45672ce46afe122df" dependencies = [ "atomic", - "parking_lot", + "parking_lot 0.11.2", "pear", "serde", "tempfile", @@ -427,28 +341,12 @@ dependencies = [ ] [[package]] -name = "futures" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28560757fe2bb34e79f907794bb6b22ae8b0e5c669b638a1132f2592b19035b4" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] name = "futures-channel" version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3dda0b6588335f360afc675d0564c17a77a2bda81ca178a4b6081bd86c7f0b" dependencies = [ "futures-core", - "futures-sink", ] [[package]] @@ -458,34 +356,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0c8ff0461b82559810cdccfde3215c3f373807f5e5232b71479bff7bb2583d7" [[package]] -name = "futures-executor" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29d6d2ff5bb10fb95c85b8ce46538a2e5f5e7fdc755623a7d4529ab8a4ed9d2a" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] name = "futures-io" version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1f9d34af5a1aac6fb380f735fe510746c38067c5bf16c7fd250280503c971b2" [[package]] -name = "futures-macro" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbd947adfffb0efc70599b3ddcf7b5597bb5fa9e245eb99f62b3a5f7bb8bd3c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] name = "futures-sink" version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -503,11 +379,8 @@ version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b5cf40b47a271f77a8b1bec03ca09044d99d2372c0de244e66430761127164" dependencies = [ - "futures-channel", "futures-core", "futures-io", - "futures-macro", - "futures-sink", "futures-task", "memchr", "pin-project-lite", @@ -516,19 +389,6 @@ dependencies = [ ] [[package]] -name = "generator" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1d9279ca822891c1a4dae06d185612cf8fc6acfe5dff37781b41297811b12ee" -dependencies = [ - "cc", - "libc", - "log", - "rustversion", - "winapi", -] - -[[package]] name = "getrandom" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -540,12 +400,6 @@ dependencies = [ ] [[package]] -name = "glob" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" - -[[package]] name = "h2" version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -560,7 +414,7 @@ dependencies = [ "indexmap", "slab", "tokio", - "tokio-util", + "tokio-util 0.6.9", "tracing", ] @@ -617,6 +471,12 @@ dependencies = [ ] [[package]] +name = "http-range-header" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" + +[[package]] name = "httparse" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -690,14 +550,13 @@ checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" dependencies = [ "autocfg", "hashbrown", - "serde", ] [[package]] name = "inlinable_string" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3094308123a0e9fd59659ce45e22de9f53fc1d2ac6e1feb9fef988e4f76cad77" +checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" [[package]] name = "instant" @@ -743,15 +602,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.109" +version = "0.2.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98a04dce437184842841303488f70d0188c5f51437d2a834dc097eafa909a01" +checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4" [[package]] name = "lock_api" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" dependencies = [ "scopeguard", ] @@ -766,36 +625,18 @@ dependencies = [ ] [[package]] -name = "loom" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc5c7d328e32cc4954e8e01193d7f0ef5ab257b5090b70a964e099a36034309" -dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "serde", - "serde_json", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata", -] - -[[package]] name = "matches" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] +name = "matchit" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9376a4f0340565ad675d11fc1419227faf5f60cd7ac9cb2e7185a471f30af833" + +[[package]] name = "memchr" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -809,9 +650,9 @@ checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" [[package]] name = "mio" -version = "0.7.14" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" +checksum = "ba272f85fa0b41fc91872be579b3bbe0f56b792aa361a380eb669469f68dafb2" dependencies = [ "libc", "log", @@ -830,26 +671,6 @@ dependencies = [ ] [[package]] -name = "multer" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f8f35e687561d5c1667590911e6698a8cb714a134a7505718a182e7bc9d3836" -dependencies = [ - "bytes", - "encoding_rs", - "futures-util", - "http", - "httparse", - "log", - "memchr", - "mime", - "spin", - "tokio", - "tokio-util", - "version_check", -] - -[[package]] name = "native-tls" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -906,18 +727,6 @@ dependencies = [ ] [[package]] -name = "okapi" -version = "0.7.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce66b6366e049880a35c378123fddb630b1a1a3c37fa1ca70caaf4a09f6e2893" -dependencies = [ - "log", - "schemars", - "serde", - "serde_json", -] - -[[package]] name = "once_cell" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -982,7 +791,17 @@ checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", - "parking_lot_core", + "parking_lot_core 0.8.5", +] + +[[package]] +name = "parking_lot" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.1", ] [[package]] @@ -1000,6 +819,19 @@ dependencies = [ ] [[package]] +name = "parking_lot_core" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + +[[package]] name = "pear" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1029,6 +861,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] +name = "pin-project" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] name = "pin-project-lite" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1077,12 +929,6 @@ dependencies = [ ] [[package]] -name = "proc-macro-hack" -version = "0.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" - -[[package]] name = "proc-macro2" version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1163,50 +1009,6 @@ dependencies = [ ] [[package]] -name = "ref-cast" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300f2a835d808734ee295d45007adacb9ebb29dd3ae2424acfa17930cae541da" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c38e3aecd2b21cb3959637b883bb3714bc7e43f0268b9a29d3743ee3e55cdd2" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "regex" -version = "1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" -dependencies = [ - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.6.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" - -[[package]] name = "remove_dir_all" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1258,127 +1060,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "194d8e591e405d1eecf28819740abed6d719d1a2db87fc0bcdedee9a26d55560" [[package]] -name = "rocket" -version = "0.5.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a71c18c42a0eb15bf3816831caf0dad11e7966f2a41aaf486a701979c4dd1f2" -dependencies = [ - "async-stream", - "async-trait", - "atomic", - "atty", - "binascii", - "bytes", - "either", - "figment", - "futures", - "indexmap", - "log", - "memchr", - "multer", - "num_cpus", - "parking_lot", - "pin-project-lite", - "rand", - "ref-cast", - "rocket_codegen", - "rocket_http", - "serde", - "serde_json", - "state", - "tempfile", - "time 0.2.27", - "tokio", - "tokio-stream", - "tokio-util", - "ubyte", - "version_check", - "yansi", -] - -[[package]] -name = "rocket_codegen" -version = "0.5.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66f5fa462f7eb958bba8710c17c5d774bbbd59809fa76fb1957af7e545aea8bb" -dependencies = [ - "devise", - "glob", - "indexmap", - "proc-macro2", - "quote", - "rocket_http", - "syn", - "unicode-xid", -] - -[[package]] -name = "rocket_http" -version = "0.5.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c8b7d512d2fcac2316ebe590cde67573844b99e6cc9ee0f53375fa16e25ebd" -dependencies = [ - "cookie", - "either", - "http", - "hyper", - "indexmap", - "log", - "memchr", - "mime", - "parking_lot", - "pear", - "percent-encoding", - "pin-project-lite", - "ref-cast", - "serde", - "smallvec", - "stable-pattern", - "state", - "time 0.2.27", - "tokio", - "uncased", -] - -[[package]] -name = "rocket_okapi" -version = "0.8.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0025aa04994af8cd8e1fcdd5a73579a395c941ae090ecb0a39b41cca7e237a20" -dependencies = [ - "either", - "log", - "okapi", - "rocket", - "rocket_okapi_codegen", - "schemars", - "serde", - "serde_json", -] - -[[package]] -name = "rocket_okapi_codegen" -version = "0.8.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc114779fc27afb78179233e966f469e47fd7a98dc15181cff2574cdddb65612" -dependencies = [ - "darling 0.13.1", - "proc-macro2", - "quote", - "rocket_http", - "syn", -] - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] - -[[package]] name = "rustversion" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1401,37 +1082,6 @@ dependencies = [ ] [[package]] -name = "schemars" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6b5a3c80cea1ab61f4260238409510e814e38b4b563c06044edf91e7dc070e3" -dependencies = [ - "dyn-clone", - "indexmap", - "schemars_derive", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ae4dce13e8614c46ac3c38ef1c0d668b101df6ac39817aebdaa26642ddae9b" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn", -] - -[[package]] -name = "scoped-tls" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" - -[[package]] name = "scopeguard" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1461,21 +1111,6 @@ dependencies = [ ] [[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - -[[package]] name = "serde" version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1496,17 +1131,6 @@ dependencies = [ ] [[package]] -name = "serde_derive_internals" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] name = "serde_ini" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1519,9 +1143,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d23c1ba4cf0efd44be32017709280b32d1cea5c3f1275c3b6d9e8bc54f758085" +checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" dependencies = [ "itoa 1.0.1", "ryu", @@ -1541,12 +1165,6 @@ dependencies = [ ] [[package]] -name = "sha1" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" - -[[package]] name = "sharded-slab" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1589,97 +1207,15 @@ checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" [[package]] name = "socket2" -version = "0.4.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" dependencies = [ "libc", "winapi", ] [[package]] -name = "spin" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "511254be0c5bcf062b019a6c89c01a664aa359ded62f78aa72c6fc137c0590e5" - -[[package]] -name = "stable-pattern" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045" -dependencies = [ - "memchr", -] - -[[package]] -name = "standback" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" -dependencies = [ - "version_check", -] - -[[package]] -name = "state" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cf4f5369e6d3044b5e365c9690f451516ac8f0954084622b49ea3fde2f6de5" -dependencies = [ - "loom", -] - -[[package]] -name = "stdweb" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" -dependencies = [ - "discard", - "rustc_version", - "stdweb-derive", - "stdweb-internal-macros", - "stdweb-internal-runtime", - "wasm-bindgen", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "serde_derive", - "syn", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" -dependencies = [ - "base-x", - "proc-macro2", - "quote", - "serde", - "serde_derive", - "serde_json", - "sha1", - "syn", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" - -[[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1716,6 +1252,12 @@ dependencies = [ ] [[package]] +name = "sync_wrapper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8" + +[[package]] name = "tabled" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1805,44 +1347,6 @@ dependencies = [ ] [[package]] -name = "time" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242" -dependencies = [ - "const_fn", - "libc", - "standback", - "stdweb", - "time-macros", - "version_check", - "winapi", -] - -[[package]] -name = "time-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" -dependencies = [ - "proc-macro-hack", - "time-macros-impl", -] - -[[package]] -name = "time-macros-impl" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" -dependencies = [ - "proc-macro-hack", - "proc-macro2", - "quote", - "standback", - "syn", -] - -[[package]] name = "tinyvec" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1859,9 +1363,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.15.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbbf1c778ec206785635ce8ad57fe52b3009ae9e0c9f574a728f3049d3e55838" +checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" dependencies = [ "bytes", "libc", @@ -1869,8 +1373,10 @@ dependencies = [ "mio", "num_cpus", "once_cell", + "parking_lot 0.12.0", "pin-project-lite", "signal-hook-registry", + "socket2", "tokio-macros", "winapi", ] @@ -1897,21 +1403,24 @@ dependencies = [ ] [[package]] -name = "tokio-stream" -version = "0.1.8" +name = "tokio-util" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" +checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" dependencies = [ + "bytes", "futures-core", + "futures-sink", + "log", "pin-project-lite", "tokio", ] [[package]] name = "tokio-util" -version = "0.6.9" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +checksum = "64910e1b9c1901aaf5375561e35b9c057d95ff41a44ede043a03e09279eabaf1" dependencies = [ "bytes", "futures-core", @@ -1931,6 +1440,48 @@ dependencies = [ ] [[package]] +name = "tower" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a89fd63ad6adf737582df5db40d286574513c69a11dac5214dc3b5603d6713e" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tokio-util 0.7.0", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bb284cac1883d54083a0edbdc9cabf931dfed87455f8c7266c01ece6394a43a" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-range-header", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "343bc9466d3fe6b0f960ef45960509f84480bf4fd96f92901afe7ff3df9d3a62" + +[[package]] name = "tower-service" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1943,6 +1494,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6c650a8ef0cd2dd93736f033d21cbd1224c5a967aa0c258d00fcf7dafef9b9f" dependencies = [ "cfg-if", + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1982,18 +1534,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5312f325fe3588e277415f5a6cca1f4ccad0f248c4cd5a4bd33032d7286abc22" +checksum = "9e0ab7bdc962035a87fba73f3acca9b8a8d0034c2e6f60b84aeaaddddc155dce" dependencies = [ "ansi_term", - "lazy_static", - "matchers", - "regex", "sharded-slab", "smallvec", "thread_local", - "tracing", "tracing-core", "tracing-log", ] @@ -2005,21 +1553,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] -name = "ubyte" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42756bb9e708855de2f8a98195643dff31a97f0485d90d8467b39dc24be9e8fe" -dependencies = [ - "serde", -] - -[[package]] name = "uncased" version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baeed7327e25054889b9bd4f975f32e5f4c5d434042d59ab6cd4142c0a76ed0" dependencies = [ - "serde", "version_check", ] @@ -2233,6 +1771,49 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] +name = "windows-sys" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" + +[[package]] +name = "windows_i686_gnu" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" + +[[package]] +name = "windows_i686_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" + +[[package]] name = "winreg" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2266,8 +1847,7 @@ name = "zone_core" version = "0.1.0" dependencies = [ "clap", - "rocket", - "rocket_okapi", + "derive_builder", "serde", "strum", "strum_macros", @@ -2308,13 +1888,14 @@ name = "zoned" version = "0.1.0" dependencies = [ "anyhow", + "axum", "figment", - "lazy_static", - "rocket", - "rocket_okapi", "serde", + "serde_json", "thiserror", + "tokio", "tracing", + "tracing-subscriber", "zone_core", "zone_nspawn", "zone_zfs", diff --git a/zone_core/Cargo.toml b/zone_core/Cargo.toml index bd2a8f4..6dffa1a 100644 --- a/zone_core/Cargo.toml +++ b/zone_core/Cargo.toml @@ -13,8 +13,6 @@ description = "Manages containers using systemd-nspawn and ZFS" [dependencies] clap = { version = "3.0.13", default-features = false, features = ["std", "derive"] } -rocket = { version = "0.5.0-rc.1", default-features = false, features = ["json"] } -rocket_okapi = { version = "0.8.0-rc.1" } serde = "1.0.136" strum = "0.23.0" strum_macros = "0.23.1" @@ -22,3 +20,6 @@ tabled = "0.4.2" zone_zfs = { version = "0.1.0", path = "../zone_zfs" } zone_nspawn = { version = "0.1.0", path = "../zone_nspawn" } thiserror = "1.0.30" +derive_builder = "0.10.2" + +[features] diff --git a/zone_core/src/container.rs b/zone_core/src/container.rs new file mode 100644 index 0000000..844adab --- /dev/null +++ b/zone_core/src/container.rs @@ -0,0 +1,109 @@ +use clap::Args; +use derive_builder::Builder; +use serde::{Deserialize, Serialize}; +use std::path::PathBuf; +use tabled::Tabled; +use zone_zfs::FileSystem; + +use crate::FilterContainer; + +pub use status::ContainerStatus; + +mod status; + +#[derive(Debug, Default, Serialize, Deserialize, Builder, Tabled, Clone, Args)] +#[builder( + name = "ContainerOptions", + build_fn(skip), + derive(Debug, Serialize, Deserialize), + field(public) +)] +#[serde(rename_all = "camelCase")] +pub struct Container { + #[header("ID")] + pub id: u64, + + #[header("Template")] + pub template: String, + + #[header("User")] + pub user: String, + + #[header("Status")] + pub status: ContainerStatus, +} + +impl<T> FilterContainer for T +where + T: Iterator, + T::Item: TryInto<Container>, +{ + fn filter_container(&mut self, pred: ContainerOptions) -> Vec<Container> { + self.filter_map(|c| -> Option<Container> { c.try_into().ok() }) + .filter(|c| { + pred.id.map_or(false, |p| p == c.id) + && pred.template.as_ref().map_or(false, |p| p == &c.template) + && pred.user.as_ref().map_or(false, |p| p == &c.user) + }) + .collect() + } +} + +impl TryFrom<FileSystem> for Container { + type Error = zone_zfs::Error; + + fn try_from(file_system: FileSystem) -> zone_zfs::Result<Self> { + let path_buf = PathBuf::from(file_system.dataset()) + .file_name() + .ok_or_else(|| { + zone_zfs::Error::FileSystem(format!("Invalid FileSystem path: {:?}", file_system)) + })? + .to_string_lossy() + .into_owned(); + + let (user, id) = path_buf.rsplit_once('-').ok_or_else(|| { + zone_zfs::Error::FileSystem(format!("Invalid FileSystem name: {:?}", file_system)) + })?; + + let id = id.parse::<u64>().map_err(|err| { + zone_zfs::Error::FileSystem(format!("Failed to parse container ID: {:?}", err)) + })?; + + let template = PathBuf::from(file_system.dataset()) + .parent() + .ok_or_else(|| { + zone_zfs::Error::FileSystem(format!( + "Invalid path for filesystem: {:?}", + &file_system + )) + })? + .to_string_lossy() + .into_owned(); + + Ok(Container { + id, + template, + user: user.to_string(), + status: ContainerStatus::default(), + }) + } +} + +impl TryFrom<zone_nspawn::Container> for Container { + type Error = zone_nspawn::Error; + + fn try_from(value: zone_nspawn::Container) -> zone_nspawn::Result<Self> { + // id, template, user + let machine = value.machine.to_string_lossy(); + let v: Vec<&str> = machine.split('-').collect(); + + Ok(Container { + id: v[0].parse().map_err(|err| { + zone_nspawn::Error::Parsing(format!("Failed to parse container id: {:?}", err)) + })?, + template: v[1].to_owned(), + user: v[2].to_owned(), + status: ContainerStatus::Running, + }) + } +} diff --git a/zone_core/src/container/status.rs b/zone_core/src/container/status.rs new file mode 100644 index 0000000..f71ced9 --- /dev/null +++ b/zone_core/src/container/status.rs @@ -0,0 +1,18 @@ +use serde::{Deserialize, Serialize}; +use strum_macros::{Display, EnumString}; +use tabled::Tabled; + +#[derive(Debug, Serialize, Deserialize, Tabled, PartialEq, Clone, EnumString, Display)] +#[serde(rename_all = "camelCase")] +#[strum(ascii_case_insensitive)] +pub enum ContainerStatus { + Running, + Stopped, + Unknown, +} + +impl Default for ContainerStatus { + fn default() -> Self { + ContainerStatus::Unknown + } +} diff --git a/zone_core/src/lib.rs b/zone_core/src/lib.rs index 163b8eb..ec786e2 100644 --- a/zone_core/src/lib.rs +++ b/zone_core/src/lib.rs @@ -1,143 +1,15 @@ -use clap::Args; -use rocket::{ - response::{self, Responder}, - serde::json::Json, - FromForm, FromFormField, Request, -}; -use rocket_okapi::okapi::schemars::{self, JsonSchema}; -use serde::{Deserialize, Serialize}; -use std::path::PathBuf; -use strum_macros::{Display, EnumString}; -use tabled::Tabled; -use zone_zfs::FileSystem; +use std::net::{IpAddr, Ipv4Addr}; -pub trait PartialEqOrDefault { - fn eq_or_default(&self, other: &Self) -> bool; -} - -#[derive( - Debug, - Serialize, - Deserialize, - JsonSchema, - Tabled, - FromFormField, - PartialEq, - Clone, - EnumString, - Display, -)] -#[serde(rename_all = "camelCase")] -#[strum(ascii_case_insensitive)] -pub enum ContainerStatus { - Running, - Stopped, - Unknown, -} - -impl Default for ContainerStatus { - fn default() -> Self { - ContainerStatus::Unknown - } -} - -#[derive(Debug, Default, Serialize, Deserialize, JsonSchema, Tabled, FromForm, Clone, Args)] -#[serde(rename_all = "camelCase")] -pub struct Container { - #[header("ID")] - pub id: u64, - - #[header("Template")] - pub template: String, - - #[header("User")] - pub user: String, - - #[header("Status")] - pub status: ContainerStatus, -} - -impl Container { - pub fn filter_from<T>(&self, items: Vec<T>) -> Vec<Container> - where - T: TryInto<Container>, - { - items - .into_iter() - .map(|c| c.try_into().unwrap_or_default()) - .filter(|c| self.eq_or_default(c)) - .collect::<Vec<Container>>() - } -} +pub use crate::container::{Container, ContainerOptions}; -impl PartialEqOrDefault for Container { - fn eq_or_default(&self, other: &Self) -> bool { - (self.id == other.id || self.id == Self::default().id) - && (self.template == other.template || self.template == Self::default().template) - && (self.user == other.user || self.user == Self::default().user) - && (self.status == other.status || self.status == Self::default().status) - } -} - -#[rocket::async_trait] -impl<'r> Responder<'r, 'static> for Container { - fn respond_to(self, request: &'r Request<'_>) -> response::Result<'static> { - Json(self).respond_to(request) - } -} - -impl TryFrom<FileSystem> for Container { - type Error = zone_zfs::Error; - - fn try_from(file_system: FileSystem) -> Result<Self, Self::Error> { - let path_buf = PathBuf::from(file_system.dataset()) - .file_name() - .ok_or_else(|| { - Self::Error::FileSystem(format!("Invalid FileSystem path: {:?}", file_system)) - })? - .to_string_lossy() - .into_owned(); +pub static DEFAULT_IP_ADDRESS: IpAddr = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)); +pub static DEFAULT_PORT: u16 = 8000; - let (user, id) = path_buf.rsplit_once('-').ok_or_else(|| { - Self::Error::FileSystem(format!("Invalid FileSystem name: {:?}", file_system)) - })?; - - let id = id.parse::<u64>().map_err(|err| { - Self::Error::FileSystem(format!("Failed to parse container ID: {:?}", err)) - })?; - - let template = PathBuf::from(file_system.dataset()) - .parent() - .ok_or_else(|| { - Self::Error::FileSystem(format!("Invalid path for filesystem: {:?}", &file_system)) - })? - .to_string_lossy() - .into_owned(); - - Ok(Container { - id, - template, - user: user.to_string(), - status: ContainerStatus::default(), - }) +pub trait FilterContainer { + fn filter_container(&mut self, predicate: ContainerOptions) -> Vec<Container>; + fn find_container(&mut self, predicate: ContainerOptions) -> Option<Container> { + self.filter_container(predicate).into_iter().next() } } -impl TryFrom<zone_nspawn::Container> for Container { - type Error = zone_nspawn::Error; - - fn try_from(value: zone_nspawn::Container) -> Result<Self, Self::Error> { - // id, template, user - let machine = value.machine.to_string_lossy(); - let v: Vec<&str> = machine.split('-').collect(); - - Ok(Container { - id: v[0].parse().map_err(|err| { - Self::Error::Parsing(format!("Failed to parse container id: {:?}", err)) - })?, - template: v[1].to_owned(), - user: v[2].to_owned(), - status: ContainerStatus::Running, - }) - } -} +mod container; diff --git a/zone_nspawn/Cargo.toml b/zone_nspawn/Cargo.toml index 18c8cad..9eaec2a 100644 --- a/zone_nspawn/Cargo.toml +++ b/zone_nspawn/Cargo.toml @@ -10,4 +10,4 @@ serde = "1.0.136" serde_json = "1.0.78" derive_builder = "0.10.2" serde_ini = "0.2.0" -figment = "0.10.6" +figment = { version = "0.10.6", features = ["toml", "env", "test"] } diff --git a/zone_nspawn/src/config.rs b/zone_nspawn/src/config.rs index 4a496cb..2c948ba 100644 --- a/zone_nspawn/src/config.rs +++ b/zone_nspawn/src/config.rs @@ -6,7 +6,7 @@ use figment::{ }; use serde::{Deserialize, Serialize}; use std::path::PathBuf; -#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)] pub struct Config { pub network_configs_path: Option<PathBuf>, } diff --git a/zoned/Cargo.toml b/zoned/Cargo.toml index deb76fa..408a4d4 100644 --- a/zoned/Cargo.toml +++ b/zoned/Cargo.toml @@ -13,13 +13,14 @@ description = "daemon for managing containers using systemd-nspawn and ZFS" [dependencies] anyhow = "1.0.53" -figment = "0.10.6" -lazy_static = "1.4.0" -rocket = { version = "0.5.0-rc.1", default-features = false, features = ["json"] } -rocket_okapi = { version = "0.8.0-rc.1", features = ["rapidoc", "swagger"] } +axum = { version = "0.4.6", features = ["json"] } +figment = { version = "0.10.6", features = ["toml", "env", "test"] } serde = "1.0.136" +serde_json = "1.0.79" thiserror = "1.0.30" +tokio = { version = "1.17.0", features = ["full"] } tracing = "0.1.31" +tracing-subscriber = "0.3.9" zone_core = { version = "0.1.0", path = "../zone_core" } zone_nspawn = { version = "0.1.0", path = "../zone_nspawn" } zone_zfs = { version = "0.1.0", path = "../zone_zfs", features = ["chrono"] } diff --git a/zoned/src/api.rs b/zoned/src/api.rs index 37f2bef..8dc2c39 100644 --- a/zoned/src/api.rs +++ b/zoned/src/api.rs @@ -1,84 +1,61 @@ -use crate::{Config, Error, Result}; -use rocket::{get, post, serde::json::Json, Build, Rocket, State}; -use rocket_okapi::{ - openapi, openapi_get_routes, - rapidoc::{make_rapidoc, GeneralConfig, HideShowConfig, RapiDocConfig}, - settings::UrlObject, - swagger_ui::{make_swagger_ui, SwaggerUIConfig}, +use axum::{ + extract::{Extension, Query}, + routing::{get, post}, + Json, Router, }; -use zone_core::Container; +use std::sync::Arc; +use tracing::warn; +use zone_core::{Container, ContainerOptions, FilterContainer}; use zone_nspawn::NSpawn; +use crate::{Error, Result, State}; + +pub fn build_routes() -> Router { + Router::new() + .route("/test", get(test_endpoint)) + .route("/container", post(clone_container)) + .route("/container/list?<container..>", get(container_list)) +} + /// # Test endpoint /// /// Returns a list of containers based on the query. -#[openapi(tag = "Testing")] -#[get("/test")] -pub fn test_endpoint(zfs: &State<zone_zfs::ZFS>) -> Json<String> { - Json(zfs.config.pool_name.to_owned()) +async fn test_endpoint(Extension(state): Extension<Arc<State>>) -> Json<String> { + Json(state.zfs.config.pool_name.to_owned()) } /// List containers /// /// Returns a list of containers based on the query. -#[openapi(tag = "Container")] -#[get("/container/list?<container..>")] -pub fn container_list(container: Container) -> Result<Json<Vec<Container>>> { - NSpawn::get_containers() - .map(|v| container.filter_from(v)) - .map(Json::from) - .map_err(Error::from) +async fn container_list( + container: Option<Query<ContainerOptions>>, +) -> Result<Json<Vec<Container>>> { + let mut containers = NSpawn::get_containers()?.into_iter().filter_map(|c| { + Container::try_from(c) + .map_err(|err| warn!("Ignoring invalid nspawn container {:?}", err)) + .ok() + }); + + match container { + Some(Query(params)) => Ok(containers.filter_container(params).into()), + _ => Ok(containers.collect::<Vec<_>>().into()), + } } /// Create container /// /// Creates a new container volume from the provided container json data -#[openapi(tag = "Container")] -#[post("/container", data = "<container>")] -fn clone_container( - container: Json<Container>, - zfs: &State<zone_zfs::ZFS>, +async fn clone_container( + Json(container): Json<Container>, + Extension(state): Extension<Arc<State>>, ) -> Result<Json<Container>> { - zfs.clone_from_latest( - format!("{}-{}", container.user, container.id).into(), - container.template.to_owned().into(), - )? - .try_into() - .map_err(Error::from) - .map(Container::into) -} - -pub fn build_rocket(config: &Config) -> Result<Rocket<Build>> { - let nspawn = zone_nspawn::NSpawn::custom(&config.nspawn_config).map_err(Error::from)?; - let zfs = zone_zfs::ZFS::custom(&config.zfs_config).map_err(Error::from)?; - - Ok(rocket::custom(&config.rocket_config) - .mount( - "/", - openapi_get_routes![test_endpoint, container_list, clone_container,], - ) - .mount( - "/swagger-ui/", - make_swagger_ui(&SwaggerUIConfig { - url: "../openapi.json".to_owned(), - ..Default::default() - }), - ) - .mount( - "/rapidoc/", - make_rapidoc(&RapiDocConfig { - general: GeneralConfig { - spec_urls: vec![UrlObject::new("General", "../openapi.json")], - ..Default::default() - }, - hide_show: HideShowConfig { - allow_spec_url_load: false, - allow_spec_file_load: false, - ..Default::default() - }, - ..Default::default() - }), - ) - .manage(nspawn) - .manage(zfs)) + state + .zfs + .clone_from_latest( + format!("{}-{}", container.user, container.id).into(), + container.template.into(), + )? + .try_into() + .map_err(Error::from) + .map(Container::into) } diff --git a/zoned/src/config.rs b/zoned/src/config.rs index c9cd5f3..f6622f1 100644 --- a/zoned/src/config.rs +++ b/zoned/src/config.rs @@ -1,10 +1,115 @@ +use figment::Figment; use serde::{Deserialize, Serialize}; +use std::net::{IpAddr, SocketAddr}; -#[derive(Default, Serialize, Deserialize)] +use crate::{Error, Result}; + +#[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Config { - pub(crate) rocket_config: rocket::Config, + pub ip_address: IpAddr, + pub port: u16, + pub zfs: zone_zfs::Config, + pub nspawn: zone_nspawn::Config, +} + +impl Default for Config { + fn default() -> Self { + Self { + ip_address: zone_core::DEFAULT_IP_ADDRESS, + port: zone_core::DEFAULT_PORT, + zfs: Default::default(), + nspawn: Default::default(), + } + } +} + +impl TryFrom<Figment> for Config { + type Error = Error; + + fn try_from(value: Figment) -> Result<Self> { + value.extract().map_err(Into::into) + } +} + +impl From<Config> for SocketAddr { + fn from(val: Config) -> Self { + SocketAddr::from((val.ip_address, val.port)) + } +} +#[cfg(test)] +mod tests { + use std::path::PathBuf; + + use figment::providers::{Format, Serialized, Toml}; + + use super::*; + + #[test] + fn defaults() { + figment::Jail::expect_with(|jail| { + jail.create_file( + "Config.toml", + r#" + ip_address = "127.0.0.1" + port = 8000 + + [zfs] + quota = "16G" + pool_name = "pool" + mountpoint = "/srv" + "#, + )?; + + let config: Config = Figment::from(Serialized::defaults(Config::default())) + .merge(Toml::file("Config.toml")) + .extract()?; + + assert_eq!(config, Config::default()); + + Ok(()) + }); + } + + #[test] + fn custom() { + figment::Jail::expect_with(|jail| { + jail.create_file( + "Config.toml", + r#" + ip_address = "192.168.1.1" + port = 6555 + + [zfs] + quota = 42000000 + pool_name = "fool" + mountpoint = "/mnt" + + [nspawn] + network_configs_path = "/etc/zoned/network.d" + "#, + )?; + + let config: Config = Figment::from(Serialized::defaults(Config::default())) + .merge(Toml::file("Config.toml")) + .extract()?; - pub(crate) zfs_config: zone_zfs::Config, + assert_eq!( + config, + Config { + ip_address: [192, 168, 1, 1].into(), + port: 6555, + zfs: zone_zfs::Config { + quota: 42_000_000u64.into(), + pool_name: String::from("fool"), + mountpoint: PathBuf::from("/mnt"), + }, + nspawn: zone_nspawn::Config { + network_configs_path: Some(PathBuf::from("/etc/zoned/network.d")), + }, + } + ); - pub(crate) nspawn_config: zone_nspawn::Config, + Ok(()) + }); + } } diff --git a/zoned/src/error.rs b/zoned/src/error.rs index 14b30db..98fbf2f 100644 --- a/zoned/src/error.rs +++ b/zoned/src/error.rs @@ -1,52 +1,54 @@ -use rocket::{ - http::Status, - response::{self, Responder}, - Request, -}; -use rocket_okapi::{ - gen::OpenApiGenerator, okapi::openapi3::Responses, response::OpenApiResponderInner, - util::ensure_status_code_exists, +use axum::{ + http::StatusCode, + response::{IntoResponse, Response}, + Json, }; +use serde_json::json; use thiserror::Error; -use zone_core::Container; pub type Result<T> = std::result::Result<T, Error>; #[derive(Error, Debug)] pub enum Error { - #[error("Container Error {0:?}")] - Container(Container), + #[error("Container Error: {0:?}")] + Container(String), - #[error("ZFS Error {source:?}")] + #[error("ZFS Error: {source:?}")] ZFS { #[from] source: zone_zfs::Error, }, - #[error("NSpawn Error {source:?}")] + #[error("NSpawn Error: {source:?}")] Nspawn { #[from] source: zone_nspawn::Error, }, + #[error("Config Error: {source:?}")] + Config { + #[from] + source: figment::Error, + }, + + #[error("Container not found")] + NotFound, + #[error(transparent)] Other(#[from] anyhow::Error), } -impl<'r, 'o: 'r> Responder<'r, 'o> for Error { - fn respond_to(self, req: &'r Request<'_>) -> response::Result<'o> { - // https://stuarth.github.io/rocket-error-handling/ - // match self { - // _ => Status::InternalServerError.respond_to(req), - // } - Status::InternalServerError.respond_to(req) - } -} +impl IntoResponse for Error { + fn into_response(self) -> Response { + let (status, error_message) = match self { + Error::Container(source) => (StatusCode::NOT_FOUND, source), + err => (StatusCode::UNPROCESSABLE_ENTITY, format!("{}", err)), + }; + + let body = Json(json!({ + "error": error_message, + })); -impl OpenApiResponderInner for Error { - fn responses(_gen: &mut OpenApiGenerator) -> rocket_okapi::Result<Responses> { - let mut responses = Responses::default(); - ensure_status_code_exists(&mut responses, 500); - Ok(responses) + (status, body).into_response() } } diff --git a/zoned/src/lib.rs b/zoned/src/lib.rs index f6c3926..944a264 100644 --- a/zoned/src/lib.rs +++ b/zoned/src/lib.rs @@ -1,7 +1,9 @@ -pub use api::build_rocket; -pub use config::Config; -pub use error::{Error, Result}; +pub use crate::api::build_routes; +pub use crate::config::Config; +pub use crate::error::{Error, Result}; +pub use crate::state::State; mod api; mod config; mod error; +mod state; diff --git a/zoned/src/main.rs b/zoned/src/main.rs index 7a39ea5..caff470 100644 --- a/zoned/src/main.rs +++ b/zoned/src/main.rs @@ -1,27 +1,42 @@ +use axum::AddExtensionLayer; use figment::{ providers::{Env, Format, Serialized, Toml}, Figment, }; -use zoned::Config; +use std::{net::SocketAddr, sync::Arc}; +use tracing::{debug, error}; +use zoned::{build_routes, Config, State}; -#[rocket::main] +#[tokio::main] async fn main() { - let config: Config = Figment::from(Serialized::defaults(Config::default())) + tracing_subscriber::fmt::init(); + + let figment = Figment::from(Serialized::defaults(Config::default())) .merge(Toml::file(Env::var_or("ZONED_CONFIG", "/etc/zoned/Config.toml")).nested()) - .merge(Env::prefixed("ZONED_")) - .extract() - .expect("Failed to parse config"); + .merge(Env::prefixed("ZONED_")); - let rocket = match zoned::build_rocket(&config) { - Ok(rocket) => rocket, + let config = match Config::try_from(figment) { + Ok(config) => config, Err(err) => { - eprintln!("{}", err); + error!("{}", err); std::process::exit(1) } }; - match rocket.launch().await { - Ok(()) => println!("Rocket shut down gracefully."), - Err(err) => eprintln!("Rocket had an error: {}", err), + let shared_state = match State::try_from(config) { + Ok(state) => Arc::new(state), + Err(err) => { + error!("{}", err); + std::process::exit(1) + } }; + + let routes = build_routes().layer(AddExtensionLayer::new(shared_state)); + let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); + + debug!("listening on {}", addr); + axum::Server::bind(&addr) + .serve(routes.into_make_service()) + .await + .unwrap(); } diff --git a/zoned/src/state.rs b/zoned/src/state.rs new file mode 100644 index 0000000..68ab0a6 --- /dev/null +++ b/zoned/src/state.rs @@ -0,0 +1,20 @@ +use zone_nspawn::NSpawn; +use zone_zfs::ZFS; + +use crate::{Config, Error, Result}; + +pub struct State { + pub zfs: ZFS, + pub nspawn: NSpawn, +} + +impl TryFrom<Config> for State { + type Error = Error; + + fn try_from(config: Config) -> Result<Self> { + Ok(State { + zfs: zone_zfs::ZFS::custom(&config.zfs)?, + nspawn: zone_nspawn::NSpawn::custom(&config.nspawn)?, + }) + } +} |