aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorToby Vincent <tobyv13@gmail.com>2022-03-17 18:19:50 -0500
committerToby Vincent <tobyv13@gmail.com>2022-03-17 18:19:50 -0500
commite18482558a43330cab726ae92518904be346a248 (patch)
tree0ec733e16c2511734a155b5d59c6bd5ddba00aa1
parent8858295736b507825f279f51303ab6e9f939f423 (diff)
refactor: migrated from rocket to axum
-rw-r--r--Cargo.lock873
-rw-r--r--zone_core/Cargo.toml5
-rw-r--r--zone_core/src/container.rs109
-rw-r--r--zone_core/src/container/status.rs18
-rw-r--r--zone_core/src/lib.rs146
-rw-r--r--zone_nspawn/Cargo.toml2
-rw-r--r--zone_nspawn/src/config.rs2
-rw-r--r--zoned/Cargo.toml9
-rw-r--r--zoned/src/api.rs109
-rw-r--r--zoned/src/config.rs113
-rw-r--r--zoned/src/error.rs56
-rw-r--r--zoned/src/lib.rs8
-rw-r--r--zoned/src/main.rs39
-rw-r--r--zoned/src/state.rs20
14 files changed, 606 insertions, 903 deletions
diff --git a/Cargo.lock b/Cargo.lock
index af501c3..4ce6cdb 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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)?,
+ })
+ }
+}