From fb8e43d4234c467f31a8e7576d0a2f4368f3cc48 Mon Sep 17 00:00:00 2001 From: onalante-msft <89409054+onalante-msft@users.noreply.github.com> Date: Thu, 14 Apr 2022 20:43:45 -0700 Subject: [PATCH] Quick dependency unification Only remaining task is to upgrade from clap 2 to 3. --- edgelet/Cargo.lock | 355 +-- edgelet/docker-rs/Cargo.toml | 9 +- edgelet/docker-rs/src/apis/client.rs | 1 - edgelet/docker-rs/src/lib.rs | 1 - edgelet/docker-rs/src/utils.rs | 50 - edgelet/edgelet-docker/Cargo.toml | 12 +- edgelet/edgelet-docker/src/runtime.rs | 31 +- edgelet/edgelet-docker/tests/runtime.rs | 2018 ----------------- edgelet/iotedge/Cargo.toml | 20 +- edgelet/iotedge/src/check/additional_info.rs | 28 +- .../src/check/checks/aziot_edged_version.rs | 2 +- .../src/check/checks/check_agent_image.rs | 2 +- .../check/checks/connect_management_uri.rs | 2 +- .../checks/container_connect_upstream.rs | 2 +- .../src/check/checks/container_engine_dns.rs | 4 +- .../checks/container_engine_installed.rs | 2 +- .../src/check/checks/container_engine_ipv6.rs | 4 +- .../checks/container_engine_logrotate.rs | 6 +- .../src/check/checks/container_local_time.rs | 2 +- .../container_resolve_parent_hostname.rs | 2 +- .../src/check/checks/parent_hostname.rs | 2 +- .../src/check/checks/proxy_settings.rs | 2 +- .../check/checks/storage_mounted_from_host.rs | 4 +- .../src/check/checks/up_to_date_config.rs | 2 +- .../src/check/checks/well_formed_config.rs | 2 +- .../src/check/upstream_protocol_port.rs | 2 +- .../src/config/import/old_config/agent.rs | 6 +- .../config/import/old_config/moby_runtime.rs | 12 +- .../src/config/import/old_config/mod.rs | 14 +- .../config/import/old_config/provisioning.rs | 24 +- edgelet/iotedge/src/config/super_config.rs | 6 +- edgelet/iotedge/src/lib.rs | 2 +- 32 files changed, 201 insertions(+), 2430 deletions(-) delete mode 100644 edgelet/docker-rs/src/utils.rs delete mode 100644 edgelet/edgelet-docker/tests/runtime.rs diff --git a/edgelet/Cargo.lock b/edgelet/Cargo.lock index 9a4272fa37e..a23193195ee 100644 --- a/edgelet/Cargo.lock +++ b/edgelet/Cargo.lock @@ -73,10 +73,10 @@ source = "git+https://github.com/Azure/iot-identity-service?branch=main#df08bfaa dependencies = [ "aziot-cert-common-http", "aziot-key-common", - "http 0.2.5", + "http", "http-common", "hyper", - "percent-encoding 2.1.0", + "percent-encoding", ] [[package]] @@ -94,13 +94,13 @@ version = "0.1.0" source = "git+https://github.com/Azure/iot-identity-service?branch=main#df08bfaad7d2c2657ddc41cedc32fe0cc04561b1" dependencies = [ "cert-renewal", - "hex 0.4.3", + "hex", "http-common", "libc", "openssl", "serde", "serde_with", - "url 2.2.2", + "url", ] [[package]] @@ -110,7 +110,7 @@ dependencies = [ "aziot-identity-client-async", "aziot-identity-common", "aziot-identity-common-http", - "base64 0.13.0", + "base64", "clap", "edgelet-core", "edgelet-docker", @@ -126,7 +126,7 @@ dependencies = [ "serde_json", "sha2", "tokio", - "url 2.2.2", + "url", ] [[package]] @@ -137,10 +137,10 @@ dependencies = [ "aziot-cert-common-http", "aziot-identity-common", "aziot-identity-common-http", - "http 0.2.5", + "http", "http-common", "hyper", - "percent-encoding 2.1.0", + "percent-encoding", ] [[package]] @@ -177,7 +177,7 @@ dependencies = [ "http-common", "libc", "serde", - "url 2.2.2", + "url", ] [[package]] @@ -187,10 +187,10 @@ source = "git+https://github.com/Azure/iot-identity-service?branch=main#df08bfaa dependencies = [ "aziot-key-common", "aziot-key-common-http", - "http 0.2.5", + "http", "http-common", "httparse", - "percent-encoding 2.1.0", + "percent-encoding", "serde", "serde_json", ] @@ -202,10 +202,10 @@ source = "git+https://github.com/Azure/iot-identity-service?branch=main#df08bfaa dependencies = [ "aziot-key-common", "aziot-key-common-http", - "http 0.2.5", + "http", "http-common", "hyper", - "percent-encoding 2.1.0", + "percent-encoding", ] [[package]] @@ -233,7 +233,7 @@ source = "git+https://github.com/Azure/iot-identity-service?branch=main#df08bfaa dependencies = [ "aziot-key-client", "aziot-key-common", - "base64 0.13.0", + "base64", "foreign-types-shared", "log", "openssl", @@ -261,7 +261,7 @@ source = "git+https://github.com/Azure/iot-identity-service?branch=main#df08bfaa dependencies = [ "pkcs11", "serde", - "url 2.2.2", + "url", ] [[package]] @@ -284,7 +284,7 @@ dependencies = [ "aziot-keyd-config", "aziot-keys-common", "aziot-tpmd-config", - "base64 0.13.0", + "base64", "cert-renewal", "http-common", "log", @@ -292,26 +292,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "url 2.2.2", -] - -[[package]] -name = "base64" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" -dependencies = [ - "byteorder", - "safemem", -] - -[[package]] -name = "base64" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" -dependencies = [ - "byteorder", + "url", ] [[package]] @@ -347,16 +328,6 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" -[[package]] -name = "bytes" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" -dependencies = [ - "byteorder", - "iovec", -] - [[package]] name = "bytes" version = "1.1.0" @@ -406,12 +377,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - [[package]] name = "cfg-if" version = "1.0.0" @@ -482,6 +447,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a079bddaa385eab2a88dc5816a378921852ab3af6646748da14681b2facf502" +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + [[package]] name = "cpufeatures" version = "0.2.1" @@ -497,7 +468,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -506,7 +477,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "crossbeam-utils", ] @@ -516,7 +487,7 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] @@ -527,7 +498,7 @@ version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c00d6d2ea26e8b151d99093005cb442fb9a37aeaca582a03ec70946f49ab5ed9" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "crossbeam-utils", "lazy_static", "memoffset", @@ -540,7 +511,7 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "lazy_static", ] @@ -588,26 +559,19 @@ dependencies = [ "generic-array", ] -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - [[package]] name = "docker" version = "0.1.0" dependencies = [ "async-trait", - "base64 0.9.3", - "futures 0.1.31", + "base64", + "futures", "http-common", "hyper", "serde", "serde_derive", "serde_json", - "typed-headers", - "url 1.7.2", + "url", ] [[package]] @@ -617,12 +581,12 @@ dependencies = [ "anyhow", "async-trait", "aziotctl-common", - "base64 0.13.0", - "bytes 1.1.0", + "base64", + "bytes", "chrono", "consistenttime", "edgelet-settings", - "futures 0.3.17", + "futures", "humantime", "hyper", "lazy_static", @@ -637,7 +601,7 @@ dependencies = [ "thiserror", "tokio", "tokio-util", - "url 2.2.2", + "url", ] [[package]] @@ -648,31 +612,27 @@ dependencies = [ "async-trait", "aziot-cert-client-async", "aziot-cert-common-http", - "base64 0.9.3", - "bytes 1.1.0", + "base64", + "bytes", "chrono", "config-common", "docker", "edgelet-core", "edgelet-settings", "edgelet-utils", - "futures 0.3.17", - "hex 0.3.2", + "futures", + "hex", "http-common", "hyper", "libc", "log", - "maplit", "serde", "serde_derive", "serde_json", "sysinfo", - "tempfile", "thiserror", - "time", "tokio", - "typed-headers", - "url 2.2.2", + "url", ] [[package]] @@ -685,11 +645,11 @@ dependencies = [ "edgelet-settings", "edgelet-test-utils", "futures-util", - "http 0.2.5", + "http", "http-common", "libc", "log", - "percent-encoding 2.1.0", + "percent-encoding", "serde", "serde_json", "tokio", @@ -708,20 +668,20 @@ dependencies = [ "edgelet-settings", "edgelet-test-utils", "futures-util", - "http 0.2.5", + "http", "http-common", "hyper", "libc", "log", "nix", - "percent-encoding 2.1.0", + "percent-encoding", "regex", "serde", "serde_json", "support-bundle", "test-common", "tokio", - "url 2.2.2", + "url", ] [[package]] @@ -739,27 +699,27 @@ dependencies = [ "aziot-key-common", "aziot-key-common-http", "aziot-key-openssl-engine", - "base64 0.13.0", + "base64", "chrono", "edgelet-core", "edgelet-http", "edgelet-settings", "edgelet-test-utils", "futures-util", - "http 0.2.5", + "http", "http-common", "hyper", "libc", "log", "nix", "openssl", - "percent-encoding 2.1.0", + "percent-encoding", "regex", "serde", "serde_json", "test-common", "tokio", - "url 2.2.2", + "url", ] [[package]] @@ -772,7 +732,7 @@ dependencies = [ "serde", "serde_json", "test-case", - "url 2.2.2", + "url", ] [[package]] @@ -784,12 +744,12 @@ dependencies = [ "aziot-identity-common", "aziot-key-client", "aziot-key-common", - "bytes 1.1.0", + "bytes", "edgelet-core", "edgelet-settings", - "futures 0.3.17", + "futures", "futures-util", - "http 0.2.5", + "http", "hyper", "nix", "openssl", @@ -826,7 +786,7 @@ dependencies = [ "humantime", "log", "regex", - "termcolor 1.1.2", + "termcolor", ] [[package]] @@ -844,7 +804,7 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "crc32fast", "libc", "miniz_oxide", @@ -878,15 +838,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" dependencies = [ "matches", - "percent-encoding 2.1.0", + "percent-encoding", ] -[[package]] -name = "futures" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" - [[package]] name = "futures" version = "0.3.17" @@ -997,7 +951,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "wasi", ] @@ -1008,12 +962,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fd819562fcebdac5afc5c113c3ec36f902840b70fd4fc458799c8ce4607ae55" dependencies = [ - "bytes 1.1.0", + "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http 0.2.5", + "http", "indexmap", "slab", "tokio", @@ -1033,11 +987,11 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4c4eb0471fcb85846d8b0690695ef354f9afb11cb03cac2e1d7c9253351afb0" dependencies = [ - "base64 0.13.0", + "base64", "bitflags", - "bytes 1.1.0", + "bytes", "headers-core", - "http 0.2.5", + "http", "httpdate", "mime", "sha-1", @@ -1049,7 +1003,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" dependencies = [ - "http 0.2.5", + "http", ] [[package]] @@ -1061,36 +1015,19 @@ dependencies = [ "libc", ] -[[package]] -name = "hex" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" - [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -[[package]] -name = "http" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" -dependencies = [ - "bytes 0.4.12", - "fnv", - "itoa", -] - [[package]] name = "http" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1323096b05d41827dadeaee54c9981958c0f94e670bc94ed80037d1a7b8b186b" dependencies = [ - "bytes 1.1.0", + "bytes", "fnv", "itoa", ] @@ -1101,8 +1038,8 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" dependencies = [ - "bytes 1.1.0", - "http 0.2.5", + "bytes", + "http", "pin-project-lite", ] @@ -1112,10 +1049,10 @@ version = "0.1.0" source = "git+https://github.com/Azure/iot-identity-service?branch=main#df08bfaad7d2c2657ddc41cedc32fe0cc04561b1" dependencies = [ "async-trait", - "base64 0.13.0", + "base64", "futures-util", "headers", - "http 0.2.5", + "http", "hyper", "hyper-openssl", "hyper-proxy", @@ -1124,12 +1061,12 @@ dependencies = [ "nix", "openssl", "openssl-sys", - "percent-encoding 2.1.0", + "percent-encoding", "serde", "serde_json", "tokio", "tracing", - "url 2.2.2", + "url", ] [[package]] @@ -1156,12 +1093,12 @@ version = "0.14.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b91bb1f221b6ea1f1e4371216b70f40748774c2fb5971b450c07773fb92d26b" dependencies = [ - "bytes 1.1.0", + "bytes", "futures-channel", "futures-core", "futures-util", "h2", - "http 0.2.5", + "http", "http-body", "httparse", "httpdate", @@ -1180,7 +1117,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d52322a69f0a93f177d76ca82073fcec8d5b4eb6e28525d5b3142fa718195c" dependencies = [ - "http 0.2.5", + "http", "hyper", "linked_hash_set", "once_cell", @@ -1198,10 +1135,10 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca815a891b24fdfb243fa3239c86154392b0953ee584aa1a2a1f66d20cbe75cc" dependencies = [ - "bytes 1.1.0", - "futures 0.3.17", + "bytes", + "futures", "headers", - "http 0.2.5", + "http", "hyper", "openssl", "tokio", @@ -1215,17 +1152,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "idna" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - [[package]] name = "idna" version = "0.2.3" @@ -1253,7 +1179,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -1272,9 +1198,9 @@ dependencies = [ "aziot-keys-common", "aziot-tpmd-config", "aziotctl-common", - "base64 0.9.3", + "base64", "byte-unit", - "bytes 0.4.12", + "bytes", "chrono", "chrono-humanize", "clap", @@ -1287,8 +1213,8 @@ dependencies = [ "edgelet-test-utils", "edgelet-utils", "erased-serde", - "futures 0.1.31", - "hex 0.3.2", + "futures", + "hex", "http-common", "hyper", "lazy_static", @@ -1298,30 +1224,19 @@ dependencies = [ "openssl", "regex", "serde", - "serde_derive", "serde_json", "support-bundle", "sysinfo", "tabwriter", "tempfile", - "termcolor 0.3.6", + "termcolor", "thiserror", "tokio", "toml", - "typed-headers", - "url 2.2.2", + "url", "zip", ] -[[package]] -name = "iovec" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -dependencies = [ - "libc", -] - [[package]] name = "itoa" version = "0.4.8" @@ -1342,16 +1257,16 @@ checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" dependencies = [ "arrayvec", "bitflags", - "cfg-if 1.0.0", + "cfg-if", "ryu", "static_assertions", ] [[package]] name = "libc" -version = "0.2.105" +version = "0.2.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "869d572136620d55835903746bcb5cdc54cb2851fd0aeec53220b4bb65ef3013" +checksum = "cb691a747a7ab48abc15c5b42066eaafde10dc427e3b6ee2a1cf43db04c763bd" [[package]] name = "linked-hash-map" @@ -1383,7 +1298,7 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -1395,12 +1310,6 @@ dependencies = [ "log", ] -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - [[package]] name = "matches" version = "0.1.9" @@ -1468,7 +1377,7 @@ checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" dependencies = [ "bitflags", "cc", - "cfg-if 1.0.0", + "cfg-if", "libc", "memoffset", ] @@ -1541,7 +1450,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d9facdb76fec0b73c406f125d44d86fdad818d66fef0531eec9233ca425ff4a" dependencies = [ "bitflags", - "cfg-if 1.0.0", + "cfg-if", "foreign-types", "libc", "once_cell", @@ -1618,7 +1527,7 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "instant", "libc", "redox_syscall", @@ -1626,12 +1535,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "percent-encoding" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" - [[package]] name = "percent-encoding" version = "2.1.0" @@ -1663,7 +1566,7 @@ dependencies = [ "openssl-sys", "openssl-sys2", "openssl2", - "percent-encoding 2.1.0", + "percent-encoding", "pkcs11-sys", ] @@ -1826,12 +1729,6 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" -[[package]] -name = "safemem" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" - [[package]] name = "scopeguard" version = "1.1.0" @@ -1899,7 +1796,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" dependencies = [ "block-buffer", - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest", "opaque-debug", @@ -1912,7 +1809,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa" dependencies = [ "block-buffer", - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest", "opaque-debug", @@ -1975,7 +1872,7 @@ dependencies = [ "chrono", "edgelet-core", "edgelet-settings", - "futures 0.3.17", + "futures", "hyper", "regex", "tempfile", @@ -1997,12 +1894,12 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.14.15" +version = "0.23.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2983daff11a197c7c406b130579bc362177aa54cf2cc1f34d6ac88fccaa6a5e1" +checksum = "4eea2ed6847da2e0c7289f72cb4f285f0bd704694ca067d32be811b2a45ea858" dependencies = [ - "cfg-if 0.1.10", - "doc-comment", + "cfg-if", + "core-foundation-sys", "libc", "ntapi", "once_cell", @@ -2025,7 +1922,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "rand", "redox_syscall", @@ -2033,15 +1930,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "termcolor" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4587ead41bf016f11af03e55a624c06568b5a19db4e90fde573d805074f83" -dependencies = [ - "wincolor", -] - [[package]] name = "termcolor" version = "1.1.2" @@ -2057,7 +1945,7 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b114ece25254e97bf48dd4bfc2a12bad0647adacfe4cae1247a9ca6ad302cec" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "proc-macro2", "quote", "syn", @@ -2142,7 +2030,7 @@ version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c27a64b625de6d309e8c57716ba93021dccf1b3b5c97edd6d3dd2d2135afc0a" dependencies = [ - "bytes 1.1.0", + "bytes", "libc", "memchr", "mio", @@ -2183,7 +2071,7 @@ version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" dependencies = [ - "bytes 1.1.0", + "bytes", "futures-core", "futures-sink", "log", @@ -2218,7 +2106,7 @@ version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "log", "pin-project-lite", "tracing-attributes", @@ -2251,19 +2139,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" -[[package]] -name = "typed-headers" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6f5af532d859106afe9077c8f95bcaa09af272d5d9b338ec1ff05830b5803c" -dependencies = [ - "base64 0.10.1", - "bytes 0.4.12", - "chrono", - "http 0.1.21", - "mime", -] - [[package]] name = "typenum" version = "1.14.0" @@ -2297,17 +2172,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" -[[package]] -name = "url" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -dependencies = [ - "idna 0.1.5", - "matches", - "percent-encoding 1.0.1", -] - [[package]] name = "url" version = "2.2.2" @@ -2315,9 +2179,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" dependencies = [ "form_urlencoded", - "idna 0.2.3", + "idna", "matches", - "percent-encoding 2.1.0", + "percent-encoding", "serde", ] @@ -2386,15 +2250,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "wincolor" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb06499a3a4d44302791052df005d5232b927ed1a9658146d842165c4de7767" -dependencies = [ - "winapi", -] - [[package]] name = "yaml-rust" version = "0.4.5" diff --git a/edgelet/docker-rs/Cargo.toml b/edgelet/docker-rs/Cargo.toml index 3159840be0c..35e3fe37626 100644 --- a/edgelet/docker-rs/Cargo.toml +++ b/edgelet/docker-rs/Cargo.toml @@ -7,14 +7,13 @@ version = "0.1.0" [dependencies] async-trait = "0.1" -base64 = "0.9" -futures = "0.1" +base64 = "0.13" +futures = "0.3" hyper = "0.14" serde = "1.0" serde_derive = "1.0" serde_json = "1.0" -typed-headers = "0.1" -url = "1.5" +url = "2" -http-common = {git = "https://github.com/Azure/iot-identity-service", branch = "main"} +http-common = { git = "https://github.com/Azure/iot-identity-service", branch = "main" } diff --git a/edgelet/docker-rs/src/apis/client.rs b/edgelet/docker-rs/src/apis/client.rs index bec1e6fc646..791424cd915 100644 --- a/edgelet/docker-rs/src/apis/client.rs +++ b/edgelet/docker-rs/src/apis/client.rs @@ -4,7 +4,6 @@ use std::sync::Arc; use futures::{Future, Stream}; use serde_json; -use typed_headers::{self, mime, HeaderMapExt}; use http_common::{Connector, ErrorBody, HttpRequest}; use hyper::{Body, Client, Uri}; diff --git a/edgelet/docker-rs/src/lib.rs b/edgelet/docker-rs/src/lib.rs index 40865688011..abbb42d94da 100644 --- a/edgelet/docker-rs/src/lib.rs +++ b/edgelet/docker-rs/src/lib.rs @@ -12,6 +12,5 @@ #![cfg(not(tarpaulin_include))] pub mod apis; pub mod models; -pub mod utils; pub use apis::{DockerApi, DockerApiClient}; diff --git a/edgelet/docker-rs/src/utils.rs b/edgelet/docker-rs/src/utils.rs deleted file mode 100644 index e99e0c13288..00000000000 --- a/edgelet/docker-rs/src/utils.rs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -use serde_json; -use std::borrow::Cow; -use std::str::FromStr; -use typed_headers::{self, http}; - -use crate::models::ContainerCreateBody; - -impl FromStr for ContainerCreateBody { - type Err = serde_json::Error; - - fn from_str(s: &str) -> Result { - serde_json::from_str(s) - } -} - -#[derive(Clone, Debug, PartialEq)] -pub(crate) struct UserAgent<'a>(pub Cow<'a, str>); - -impl<'a> typed_headers::Header for UserAgent<'a> { - fn name() -> &'static http::header::HeaderName { - &http::header::USER_AGENT - } - - fn from_values<'b>( - values: &mut http::header::ValueIter<'b, http::header::HeaderValue>, - ) -> Result, typed_headers::Error> - where - Self: Sized, - { - match values.next() { - Some(value) => { - let value = value - .to_str() - .map_err(|_| typed_headers::Error::invalid_value())? - .trim() - .to_string() - .into(); - Ok(Some(UserAgent(value))) - } - - None => Ok(None), - } - } - - fn to_values(&self, values: &mut typed_headers::ToValues<'_>) { - typed_headers::util::encode_single_value(&self.0, values); - } -} diff --git a/edgelet/edgelet-docker/Cargo.toml b/edgelet/edgelet-docker/Cargo.toml index d74d97ac9ec..3c97ab2e4e3 100644 --- a/edgelet/edgelet-docker/Cargo.toml +++ b/edgelet/edgelet-docker/Cargo.toml @@ -8,17 +8,17 @@ version = "0.1.0" [dependencies] anyhow = "1" async-trait = "0.1" -base64 = "0.9" +base64 = "0.13" bytes = "1" chrono = { version = "0.4", features = ["serde"] } futures = "0.3" -hex="0.3" +hex = "0.4" hyper = "0.14" log = "0.4" serde = "1.0" serde_derive = "1.0" serde_json = "1.0" -sysinfo = "0.14.10" +sysinfo = "0.23" thiserror = "1" tokio = { version = "1", features = ["macros", "process"] } url = { version = "2", features = ["serde"] } @@ -32,9 +32,3 @@ edgelet-settings = { path = "../edgelet-settings", features = ["settings-docker" edgelet-utils = { path = "../edgelet-utils" } http-common = { git = "https://github.com/Azure/iot-identity-service", branch = "main" } libc = "0.2.66" - -[dev_dependencies] -maplit = "1.0" -tempfile = "3" -time = "0.1" -typed-headers = "0.1" diff --git a/edgelet/edgelet-docker/src/runtime.rs b/edgelet/edgelet-docker/src/runtime.rs index e3a06155399..7bda8e14704 100644 --- a/edgelet/edgelet-docker/src/runtime.rs +++ b/edgelet/edgelet-docker/src/runtime.rs @@ -10,7 +10,7 @@ use std::{mem, process, str}; use anyhow::Context; use hyper::Uri; use log::{debug, error, info, warn, Level}; -use sysinfo::{DiskExt, ProcessExt, ProcessorExt, System, SystemExt}; +use sysinfo::{DiskExt, PidExt, ProcessExt, ProcessorExt, System, SystemExt}; use tokio::sync::mpsc::UnboundedSender; use tokio::sync::Mutex; use url::Url; @@ -666,14 +666,9 @@ impl ModuleRuntime for DockerModuleRuntime { let mut system_resources = self.system_resources.as_ref().lock().await; system_resources.refresh_all(); - let start_time = process::id() - .try_into() - .map(|id| { - system_resources - .get_process(id) - .map(ProcessExt::start_time) - .unwrap_or_default() - }) + let start_time = system_resources + .process(sysinfo::Pid::from_u32(process::id())) + .map(ProcessExt::start_time) .unwrap_or_default(); let current_time = SystemTime::now() @@ -681,20 +676,20 @@ impl ModuleRuntime for DockerModuleRuntime { .unwrap_or_default() .as_secs(); - let used_cpu = system_resources.get_global_processor_info().get_cpu_usage(); - let total_memory = system_resources.get_total_memory() * 1000; - let used_memory = system_resources.get_used_memory() * 1000; + let used_cpu = system_resources.global_processor_info().cpu_usage(); + let total_memory = system_resources.total_memory() * 1000; + let used_memory = system_resources.used_memory() * 1000; let disks = system_resources - .get_disks() + .disks() .iter() .map(|disk| { DiskInfo::new( - disk.get_name().to_string_lossy().into_owned(), - disk.get_available_space(), - disk.get_total_space(), - String::from_utf8_lossy(disk.get_file_system()).into_owned(), - format!("{:?}", disk.get_type()), + disk.name().to_string_lossy().into_owned(), + disk.available_space(), + disk.total_space(), + String::from_utf8_lossy(disk.file_system()).into_owned(), + format!("{:?}", disk.type_()), ) }) .collect(); diff --git a/edgelet/edgelet-docker/tests/runtime.rs b/edgelet/edgelet-docker/tests/runtime.rs deleted file mode 100644 index 5cfc6ea3dd1..00000000000 --- a/edgelet/edgelet-docker/tests/runtime.rs +++ /dev/null @@ -1,2018 +0,0 @@ -// // Copyright (c) Microsoft. All rights reserved. - -// #![deny(rust_2018_idioms, warnings)] -// #![deny(clippy::all, clippy::pedantic)] -// #![allow(clippy::default_trait_access, clippy::too_many_lines)] - -// use std::collections::{BTreeMap, HashMap}; -// use std::str; -// use std::sync::{Arc, RwLock}; -// use std::time::Duration; - -// use failure::Fail; -// use futures::future; -// use futures::prelude::*; -// use hyper::{Body, Method, Request, Response, StatusCode}; -// use maplit::btreemap; -// use serde_json::{self, json}; -// use tempfile::NamedTempFile; -// use typed_headers::{mime, ContentLength, ContentType, HeaderMapExt}; -// use url::form_urlencoded::parse as parse_query; - -// use docker::models::{ -// AuthConfig, ContainerCreateBody, ContainerHostConfig, ContainerNetworkSettings, -// ContainerSummary, HostConfig, HostConfigPortBindings, ImageDeleteResponseItem, NetworkConfig, -// }; - -// use edgelet_core::{ -// ImagePullPolicy, LogOptions, LogTail, MakeModuleRuntime, Module, ModuleRegistry, ModuleRuntime, -// ModuleSpec, RegistryOperation, RuntimeOperation, -// }; -// use edgelet_docker::{DockerConfig, DockerModuleRuntime, Settings}; -// use edgelet_docker::{Error, ErrorKind}; -// use edgelet_test_utils::web::{ -// make_req_dispatcher, HttpMethod, RequestHandler, RequestPath, ResponseFuture, -// }; -// use edgelet_test_utils::{routes, run_tcp_server}; -// use hyper::Error as HyperError; - -// const IMAGE_NAME: &str = "nginx:latest"; - -// const INVALID_IMAGE_NAME: &str = "invalidname:latest"; -// const INVALID_IMAGE_HOST: &str = "invalidhost.com/nginx:latest"; - -// fn make_settings(moby_runtime: &str) -> Settings { -// use std::io::Write; - -// lazy_static::lazy_static! { -// static ref ENV_LOCK: std::sync::Mutex<()> = Default::default(); -// } - -// let _env_lock = ENV_LOCK.lock().expect("env lock poisoned"); - -// let mut config_file = NamedTempFile::new().expect("could not create tempfile for config"); - -// config_file -// .write_all( -// r#" -// hostname = "zoo" -// homedir = "/var/lib/aziot/edged" - -// [agent] -// name = "edgeAgent" -// type = "docker" - -// [agent.config] -// image = "microsoft/azureiotedge-agent:1.0" - -// [connect] -// workload_uri = "unix:///var/lib/iotedge/workload.sock" -// management_uri = "unix:///var/lib/iotedge/mgmt.sock" - -// [listen] -// workload_uri = "unix:///var/lib/iotedge/workload.sock" -// management_uri = "unix:///var/lib/iotedge/mgmt.sock" - -// "# -// .as_bytes(), -// ) -// .expect("could not write to config file"); - -// config_file -// .write_all(moby_runtime.as_bytes()) -// .expect("could not write to config file"); - -// std::env::set_var("AZIOT_EDGED_CONFIG", config_file.path()); - -// Settings::new().unwrap() -// } - -// fn make_get_networks_handler( -// on_get: impl Fn() -> String + Clone + Send + 'static, -// ) -> impl Fn(Request) -> ResponseFuture + Clone { -// move |_| { -// let response = on_get(); -// let response_len = response.len(); - -// let mut response = Response::new(response.into()); -// response -// .headers_mut() -// .typed_insert(&ContentLength(response_len as u64)); -// response -// .headers_mut() -// .typed_insert(&ContentType(mime::APPLICATION_JSON)); -// Box::new(future::ok(response)) as ResponseFuture -// } -// } - -// fn make_create_network_handler( -// on_post: impl Fn(Request) + Clone + Send + 'static, -// ) -> impl Fn(Request) -> ResponseFuture + Clone { -// move |req| { -// on_post(req); - -// let response = json!({ -// "Id": "12345", -// "Warnings": "" -// }) -// .to_string(); -// let response_len = response.len(); - -// let mut response = Response::new(response.into()); -// response -// .headers_mut() -// .typed_insert(&ContentLength(response_len as u64)); -// response -// .headers_mut() -// .typed_insert(&ContentType(mime::APPLICATION_JSON)); -// Box::new(future::ok(response)) as ResponseFuture -// } -// } - -// fn not_found_handler(_: Request) -> ResponseFuture { -// let response = Response::builder() -// .status(StatusCode::NOT_FOUND) -// .body(Body::default()) -// .unwrap(); - -// Box::new(future::ok(response)) -// } - -// fn make_network_handler( -// on_get: impl Fn() -> String + Clone + Send + 'static, -// on_post: impl Fn(Request) + Clone + Send + 'static, -// ) -> impl Fn(Request) -> Box, Error = HyperError> + Send> + Clone -// { -// let dispatch_table = routes!( -// GET "/networks" => make_get_networks_handler(on_get), -// POST "/networks/create" => make_create_network_handler(on_post), -// ); - -// make_req_dispatcher(dispatch_table, Box::new(not_found_handler)) -// } - -// fn default_get_networks_handler() -> impl Fn(Request) -> ResponseFuture + Clone { -// make_get_networks_handler(|| json!([]).to_string()) -// } - -// fn default_create_network_handler() -> impl Fn(Request) -> ResponseFuture + Clone { -// make_create_network_handler(|_| ()) -// } - -// fn default_network_handler( -// ) -> impl Fn(Request) -> Box, Error = HyperError> + Send> + Clone -// { -// let dispatch_table = routes!( -// GET "/networks" => default_get_networks_handler(), -// POST "/networks/create" => default_create_network_handler(), -// ); - -// make_req_dispatcher(dispatch_table, Box::new(not_found_handler)) -// } - -// #[allow(clippy::needless_pass_by_value)] -// fn invalid_image_name_pull_handler(req: Request) -> ResponseFuture { -// // verify that path is /images/create and that the "fromImage" query -// // parameter has the image name we expect -// assert_eq!(req.uri().path(), "/images/create"); - -// let query_map: HashMap = parse_query(req.uri().query().unwrap().as_bytes()) -// .into_owned() -// .collect(); -// assert!(query_map.contains_key("fromImage")); -// assert_eq!( -// query_map.get("fromImage").map(AsRef::as_ref), -// Some(INVALID_IMAGE_NAME) -// ); - -// let response = format!( -// r#"{{ -// "message": "manifest for {} not found" -// }} -// "#, -// INVALID_IMAGE_NAME -// ); - -// let response_len = response.len(); - -// let mut response = Response::new(response.into()); -// response -// .headers_mut() -// .typed_insert(&ContentLength(response_len as u64)); -// response -// .headers_mut() -// .typed_insert(&ContentType(mime::APPLICATION_JSON)); -// *response.status_mut() = hyper::StatusCode::NOT_FOUND; - -// Box::new(future::ok(response)) -// } - -// #[test] -// fn image_pull_with_invalid_image_name_fails() { -// let dispatch_table = routes!( -// GET "/networks" => default_get_networks_handler(), -// POST "/networks/create" => default_create_network_handler(), -// POST "/images/create" => invalid_image_name_pull_handler, -// ); - -// let (server, port) = run_tcp_server( -// "127.0.0.1", -// make_req_dispatcher(dispatch_table, Box::new(not_found_handler)), -// ); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let task = DockerModuleRuntime::make_runtime(settings).and_then(|runtime| { -// let auth = AuthConfig::new() -// .with_username("u1".to_string()) -// .with_password("bleh".to_string()) -// .with_email("u1@bleh.com".to_string()) -// .with_serveraddress("svr1".to_string()); -// let config = DockerConfig::new( -// INVALID_IMAGE_NAME.to_string(), -// ContainerCreateBody::new(), -// None, -// Some(auth), -// ) -// .unwrap(); - -// runtime.pull(&config) -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); - -// // Assert -// let err = runtime -// .block_on(task) -// .expect_err("Expected runtime pull method to fail due to invalid image name."); - -// match (err.kind(), err.cause().and_then(Fail::downcast_ref)) { -// ( -// edgelet_docker::ErrorKind::RegistryOperation( -// edgelet_core::RegistryOperation::PullImage(name), -// ), -// Some(edgelet_docker::ErrorKind::NotFound(message)), -// ) if name == INVALID_IMAGE_NAME => { -// assert_eq!( -// &format!("manifest for {} not found", INVALID_IMAGE_NAME), -// message -// ); -// } - -// _ => panic!( -// "Specific docker runtime message is expected for invalid image name. Got {:?}", -// err.kind() -// ), -// } -// } - -// #[allow(clippy::needless_pass_by_value)] -// fn invalid_image_host_pull_handler(req: Request) -> ResponseFuture { -// // verify that path is /images/create and that the "fromImage" query -// // parameter has the image name we expect -// assert_eq!(req.uri().path(), "/images/create"); - -// let query_map: HashMap = parse_query(req.uri().query().unwrap().as_bytes()) -// .into_owned() -// .collect(); -// assert!(query_map.contains_key("fromImage")); -// assert_eq!( -// query_map.get("fromImage").map(AsRef::as_ref), -// Some(INVALID_IMAGE_HOST) -// ); - -// let response = format!( -// r#" -// {{ -// "message":"Get https://invalidhost.com: dial tcp: lookup {} on X.X.X.X: no such host" -// }} -// "#, -// INVALID_IMAGE_HOST -// ); -// let response_len = response.len(); - -// let mut response = Response::new(response.into()); -// response -// .headers_mut() -// .typed_insert(&ContentLength(response_len as u64)); -// response -// .headers_mut() -// .typed_insert(&ContentType(mime::APPLICATION_JSON)); -// *response.status_mut() = hyper::StatusCode::INTERNAL_SERVER_ERROR; -// Box::new(future::ok(response)) -// } - -// #[test] -// fn image_pull_with_invalid_image_host_fails() { -// let dispatch_table = routes!( -// GET "/networks" => default_get_networks_handler(), -// POST "/networks/create" => default_create_network_handler(), -// POST "/images/create" => invalid_image_host_pull_handler, -// ); - -// let (server, port) = run_tcp_server( -// "127.0.0.1", -// make_req_dispatcher(dispatch_table, Box::new(not_found_handler)), -// ); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let task = DockerModuleRuntime::make_runtime(settings).and_then(|runtime| { -// let auth = AuthConfig::new() -// .with_username("u1".to_string()) -// .with_password("bleh".to_string()) -// .with_email("u1@bleh.com".to_string()) -// .with_serveraddress("svr1".to_string()); -// let config = DockerConfig::new( -// INVALID_IMAGE_HOST.to_string(), -// ContainerCreateBody::new(), -// None, -// Some(auth), -// ) -// .unwrap(); - -// runtime.pull(&config) -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); - -// // Assert -// let err = runtime -// .block_on(task) -// .expect_err("Expected runtime pull method to fail due to invalid image host."); - -// match (err.kind(), err.cause().and_then(Fail::downcast_ref)) { -// ( -// edgelet_docker::ErrorKind::RegistryOperation( -// edgelet_core::RegistryOperation::PullImage(name), -// ), -// Some(edgelet_docker::ErrorKind::FormattedDockerRuntime(message)), -// ) if name == INVALID_IMAGE_HOST => { -// assert_eq!( -// &format!( -// "Get https://invalidhost.com: dial tcp: lookup {} on X.X.X.X: no such host", -// INVALID_IMAGE_HOST -// ), -// message -// ); -// } - -// _ => panic!( -// "Specific docker runtime message is expected for invalid image host. Got {:?}", -// err.kind() -// ), -// } -// } - -// #[allow(clippy::needless_pass_by_value)] -// fn image_pull_with_invalid_creds_handler(req: Request) -> ResponseFuture { -// // verify that path is /images/create and that the "fromImage" query -// // parameter has the image name we expect -// assert_eq!(req.uri().path(), "/images/create"); - -// let query_map: HashMap = parse_query(req.uri().query().unwrap().as_bytes()) -// .into_owned() -// .collect(); -// assert!(query_map.contains_key("fromImage")); -// assert_eq!(query_map.get("fromImage"), Some(&IMAGE_NAME.to_string())); - -// // verify registry creds -// let auth_str = req -// .headers() -// .get_all("X-Registry-Auth") -// .into_iter() -// .map(|bytes| base64::decode_config(bytes, base64::URL_SAFE).unwrap()) -// .map(|raw| str::from_utf8(&raw).unwrap().to_owned()) -// .collect::(); -// let auth_config: AuthConfig = serde_json::from_str(&auth_str).unwrap(); -// assert_eq!(auth_config.username(), Some("us1")); -// assert_eq!(auth_config.password(), Some("ac?ac~aaac???")); -// assert_eq!(auth_config.email(), Some("u1@bleh.com")); -// assert_eq!(auth_config.serveraddress(), Some("svr1")); - -// let response = format!( -// r#" -// {{ -// "message":"Get {}: unauthorized: authentication required" -// }} -// "#, -// IMAGE_NAME -// ); -// let response_len = response.len(); - -// let mut response = Response::new(response.into()); -// response -// .headers_mut() -// .typed_insert(&ContentLength(response_len as u64)); -// response -// .headers_mut() -// .typed_insert(&ContentType(mime::APPLICATION_JSON)); -// *response.status_mut() = hyper::StatusCode::INTERNAL_SERVER_ERROR; -// Box::new(future::ok(response)) -// } - -// #[test] -// fn image_pull_with_invalid_creds_fails() { -// let dispatch_table = routes!( -// GET "/networks" => default_get_networks_handler(), -// POST "/networks/create" => default_create_network_handler(), -// POST "/images/create" => image_pull_with_invalid_creds_handler, -// ); - -// let (server, port) = run_tcp_server( -// "127.0.0.1", -// make_req_dispatcher(dispatch_table, Box::new(not_found_handler)), -// ); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let task = DockerModuleRuntime::make_runtime(settings).and_then(|runtime| { -// // password is written to guarantee base64 encoding has '-' and/or '_' -// let auth = AuthConfig::new() -// .with_username("us1".to_string()) -// .with_password("ac?ac~aaac???".to_string()) -// .with_email("u1@bleh.com".to_string()) -// .with_serveraddress("svr1".to_string()); -// let config = DockerConfig::new( -// IMAGE_NAME.to_string(), -// ContainerCreateBody::new(), -// None, -// Some(auth), -// ) -// .unwrap(); - -// runtime.pull(&config) -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); - -// // Assert -// let err = runtime -// .block_on(task) -// .expect_err("Expected runtime pull method to fail due to unauthentication."); - -// match (err.kind(), err.cause().and_then(Fail::downcast_ref)) { -// ( -// edgelet_docker::ErrorKind::RegistryOperation( -// edgelet_core::RegistryOperation::PullImage(name), -// ), -// Some(edgelet_docker::ErrorKind::FormattedDockerRuntime(message)), -// ) if name == IMAGE_NAME => { -// assert_eq!( -// &format!( -// "Get {}: unauthorized: authentication required", -// &IMAGE_NAME.to_string() -// ), -// message -// ); -// } - -// _ => panic!( -// "Specific docker runtime message is expected for unauthentication. Got {:?}", -// err.kind() -// ), -// } -// } - -// #[allow(clippy::needless_pass_by_value)] -// fn image_pull_handler(req: Request) -> ResponseFuture { -// // verify that path is /images/create and that the "fromImage" query -// // parameter has the image name we expect -// assert_eq!(req.uri().path(), "/images/create"); - -// let query_map: HashMap = parse_query(req.uri().query().unwrap().as_bytes()) -// .into_owned() -// .collect(); -// assert!(query_map.contains_key("fromImage")); -// assert_eq!(query_map.get("fromImage"), Some(&IMAGE_NAME.to_string())); - -// let response = r#" -// { -// "Id": "img1", -// "Warnings": [] -// } -// "#; -// let response_len = response.len(); - -// let mut response = Response::new(response.into()); -// response -// .headers_mut() -// .typed_insert(&ContentLength(response_len as u64)); -// response -// .headers_mut() -// .typed_insert(&ContentType(mime::APPLICATION_JSON)); -// Box::new(future::ok(response)) -// } - -// #[test] -// fn image_pull_succeeds() { -// let dispatch_table = routes!( -// GET "/networks" => default_get_networks_handler(), -// POST "/networks/create" => default_create_network_handler(), -// POST "/images/create" => image_pull_handler, -// ); - -// let (server, port) = run_tcp_server( -// "127.0.0.1", -// make_req_dispatcher(dispatch_table, Box::new(not_found_handler)), -// ); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let task = DockerModuleRuntime::make_runtime(settings).and_then(|runtime| { -// let auth = AuthConfig::new() -// .with_username("u1".to_string()) -// .with_password("bleh".to_string()) -// .with_email("u1@bleh.com".to_string()) -// .with_serveraddress("svr1".to_string()); -// let config = DockerConfig::new( -// IMAGE_NAME.to_string(), -// ContainerCreateBody::new(), -// None, -// Some(auth), -// ) -// .unwrap(); - -// runtime.pull(&config) -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[allow(clippy::needless_pass_by_value)] -// fn image_pull_with_creds_handler(req: Request) -> ResponseFuture { -// // verify that path is /images/create and that the "fromImage" query -// // parameter has the image name we expect -// assert_eq!(req.uri().path(), "/images/create"); - -// let query_map: HashMap = parse_query(req.uri().query().unwrap().as_bytes()) -// .into_owned() -// .collect(); -// assert!(query_map.contains_key("fromImage")); -// assert_eq!(query_map.get("fromImage"), Some(&IMAGE_NAME.to_string())); - -// // verify registry creds -// let auth_str = req -// .headers() -// .get_all("X-Registry-Auth") -// .into_iter() -// .map(|bytes| base64::decode_config(bytes, base64::URL_SAFE).unwrap()) -// .map(|raw| str::from_utf8(&raw).unwrap().to_owned()) -// .collect::(); -// let auth_config: AuthConfig = serde_json::from_str(&auth_str).unwrap(); -// assert_eq!(auth_config.username(), Some("u1")); -// assert_eq!(auth_config.password(), Some("bleh")); -// assert_eq!(auth_config.email(), Some("u1@bleh.com")); -// assert_eq!(auth_config.serveraddress(), Some("svr1")); - -// let response = r#" -// { -// "Id": "img1", -// "Warnings": [] -// } -// "#; -// let response_len = response.len(); - -// let mut response = Response::new(response.into()); -// response -// .headers_mut() -// .typed_insert(&ContentLength(response_len as u64)); -// response -// .headers_mut() -// .typed_insert(&ContentType(mime::APPLICATION_JSON)); -// Box::new(future::ok(response)) -// } - -// #[test] -// fn image_pull_with_creds_succeeds() { -// let dispatch_table = routes!( -// GET "/networks" => default_get_networks_handler(), -// POST "/networks/create" => default_create_network_handler(), -// POST "/images/create" => image_pull_with_creds_handler, -// ); - -// let (server, port) = run_tcp_server( -// "127.0.0.1", -// make_req_dispatcher(dispatch_table, Box::new(not_found_handler)), -// ); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let task = DockerModuleRuntime::make_runtime(settings).and_then(|runtime| { -// let auth = AuthConfig::new() -// .with_username("u1".to_string()) -// .with_password("bleh".to_string()) -// .with_email("u1@bleh.com".to_string()) -// .with_serveraddress("svr1".to_string()); -// let config = DockerConfig::new( -// IMAGE_NAME.to_string(), -// ContainerCreateBody::new(), -// None, -// Some(auth), -// ) -// .unwrap(); - -// runtime.pull(&config) -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[allow(clippy::needless_pass_by_value)] -// fn image_remove_handler(req: Request) -> ResponseFuture { -// assert_eq!(req.method(), &Method::DELETE); -// assert_eq!(req.uri().path(), &format!("/images/{}", IMAGE_NAME)); - -// let response = serde_json::to_string(&vec![ -// ImageDeleteResponseItem::new().with_deleted(IMAGE_NAME.to_string()) -// ]) -// .unwrap(); -// let response_len = response.len(); - -// let mut response = Response::new(response.into()); -// response -// .headers_mut() -// .typed_insert(&ContentLength(response_len as u64)); -// response -// .headers_mut() -// .typed_insert(&ContentType(mime::APPLICATION_JSON)); -// Box::new(future::ok(response)) -// } - -// #[test] -// fn image_remove_succeeds() { -// let dispatch_table = routes!( -// GET "/networks" => default_get_networks_handler(), -// POST "/networks/create" => default_create_network_handler(), -// DELETE format!("/images/{}", IMAGE_NAME) => image_remove_handler, -// ); - -// let (server, port) = run_tcp_server( -// "127.0.0.1", -// make_req_dispatcher(dispatch_table, Box::new(not_found_handler)), -// ); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let task = DockerModuleRuntime::make_runtime(settings) -// .and_then(|runtime| ModuleRegistry::remove(&runtime, IMAGE_NAME)); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// fn container_create_handler(req: Request) -> ResponseFuture { -// assert_eq!(req.method(), &Method::POST); -// assert_eq!(req.uri().path(), "/containers/create"); - -// let response = json!({ -// "Id": "12345", -// "Warnings": [] -// }) -// .to_string(); -// let response_len = response.len(); - -// Box::new( -// req.into_body() -// .concat2() -// .and_then(|body| { -// let create_options: ContainerCreateBody = -// serde_json::from_slice(body.as_ref()).unwrap(); - -// assert_eq!("nginx:latest", create_options.image().unwrap()); - -// for &v in &["/do/the/custom/command", "with these args"] { -// assert!(create_options.cmd().unwrap().contains(&v.to_string())); -// } - -// for &v in &["/also/do/the/entrypoint", "and this"] { -// assert!(create_options -// .entrypoint() -// .unwrap() -// .contains(&v.to_string())); -// } - -// for &v in &["k1=v1", "k2=v2", "k3=v3", "k4=v4", "k5=v5"] { -// assert!(create_options.env().unwrap().contains(&v.to_string())); -// } - -// let port_bindings = create_options -// .host_config() -// .unwrap() -// .port_bindings() -// .unwrap(); -// assert_eq!( -// "8080", -// port_bindings -// .get("80/tcp") -// .unwrap() -// .iter() -// .next() -// .unwrap() -// .host_port() -// .unwrap() -// ); -// assert_eq!( -// "11022", -// port_bindings -// .get("22/tcp") -// .unwrap() -// .iter() -// .next() -// .unwrap() -// .host_port() -// .unwrap() -// ); - -// let volumes = create_options.volumes().unwrap(); -// let mut expected = ::std::collections::BTreeMap::new(); -// expected.insert("test1".to_string(), json!({})); -// assert_eq!(*volumes, expected); - -// Ok(()) -// }) -// .map(move |_| { -// let mut response = Response::new(response.into()); -// response -// .headers_mut() -// .typed_insert(&ContentLength(response_len as u64)); -// response -// .headers_mut() -// .typed_insert(&ContentType(mime::APPLICATION_JSON)); -// response -// }), -// ) -// } - -// #[test] -// fn container_create_succeeds() { -// let dispatch_table = routes!( -// GET "/networks" => default_get_networks_handler(), -// POST "/networks/create" => default_create_network_handler(), -// POST "/containers/create" => container_create_handler, -// ); - -// let (server, port) = run_tcp_server( -// "127.0.0.1", -// make_req_dispatcher(dispatch_table, Box::new(not_found_handler)), -// ); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let task = DockerModuleRuntime::make_runtime(settings).and_then(|runtime| { -// let mut env = BTreeMap::new(); -// env.insert("k1".to_string(), "v1".to_string()); -// env.insert("k2".to_string(), "v2".to_string()); -// env.insert("k3".to_string(), "v3".to_string()); - -// // add some create options -// let mut port_bindings = BTreeMap::new(); -// port_bindings.insert( -// "22/tcp".to_string(), -// vec![HostConfigPortBindings::new().with_host_port("11022".to_string())], -// ); -// port_bindings.insert( -// "80/tcp".to_string(), -// vec![HostConfigPortBindings::new().with_host_port("8080".to_string())], -// ); -// let memory: i64 = 3_221_225_472; -// let mut volumes = ::std::collections::BTreeMap::new(); -// volumes.insert("test1".to_string(), json!({})); -// let create_options = ContainerCreateBody::new() -// .with_host_config( -// HostConfig::new() -// .with_port_bindings(port_bindings) -// .with_memory(memory), -// ) -// .with_cmd(vec![ -// "/do/the/custom/command".to_string(), -// "with these args".to_string(), -// ]) -// .with_entrypoint(vec![ -// "/also/do/the/entrypoint".to_string(), -// "and this".to_string(), -// ]) -// .with_env(vec!["k4=v4".to_string(), "k5=v5".to_string()]) -// .with_volumes(volumes); - -// let module_config = ModuleSpec::new( -// "m1".to_string(), -// "docker".to_string(), -// DockerConfig::new("nginx:latest".to_string(), create_options, None, None).unwrap(), -// env, -// ImagePullPolicy::default(), -// ) -// .unwrap(); - -// runtime.create(module_config) -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[allow(clippy::needless_pass_by_value)] -// fn container_start_handler(req: Request) -> ResponseFuture { -// assert_eq!(req.method(), &Method::POST); -// assert_eq!(req.uri().path(), "/containers/m1/start"); - -// Box::new(future::ok(Response::new(Body::empty()))) -// } - -// #[test] -// fn container_start_succeeds() { -// let dispatch_table = routes!( -// GET "/networks" => default_get_networks_handler(), -// POST "/networks/create" => default_create_network_handler(), -// POST "/containers/m1/start" => container_start_handler, -// ); - -// let (server, port) = run_tcp_server( -// "127.0.0.1", -// make_req_dispatcher(dispatch_table, Box::new(not_found_handler)), -// ); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let task = DockerModuleRuntime::make_runtime(settings).and_then(|runtime| runtime.start("m1")); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[allow(clippy::needless_pass_by_value)] -// fn container_stop_handler(req: Request) -> ResponseFuture { -// assert_eq!(req.method(), &Method::POST); -// assert_eq!(req.uri().path(), "/containers/m1/stop"); - -// Box::new(future::ok(Response::new(Body::empty()))) -// } - -// #[test] -// fn container_stop_succeeds() { -// let dispatch_table = routes!( -// GET "/networks" => default_get_networks_handler(), -// POST "/networks/create" => default_create_network_handler(), -// POST "/containers/m1/stop" => container_stop_handler, -// ); - -// let (server, port) = run_tcp_server( -// "127.0.0.1", -// make_req_dispatcher(dispatch_table, Box::new(not_found_handler)), -// ); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let task = -// DockerModuleRuntime::make_runtime(settings).and_then(|runtime| runtime.stop("m1", None)); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[allow(clippy::needless_pass_by_value)] -// fn container_stop_with_timeout_handler(req: Request) -> ResponseFuture { -// assert_eq!(req.method(), &Method::POST); -// assert_eq!(req.uri().path(), "/containers/m1/stop"); -// assert_eq!(req.uri().query().unwrap(), "t=600"); - -// Box::new(future::ok(Response::new(Body::empty()))) -// } - -// #[test] -// fn container_stop_with_timeout_succeeds() { -// let dispatch_table = routes!( -// GET "/networks" => default_get_networks_handler(), -// POST "/networks/create" => default_create_network_handler(), -// POST "/containers/m1/stop" => container_stop_with_timeout_handler, -// ); - -// let (server, port) = run_tcp_server( -// "127.0.0.1", -// make_req_dispatcher(dispatch_table, Box::new(not_found_handler)), -// ); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let task = DockerModuleRuntime::make_runtime(settings) -// .and_then(|runtime| runtime.stop("m1", Some(Duration::from_secs(600)))); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[allow(clippy::needless_pass_by_value)] -// fn container_remove_handler(req: Request) -> ResponseFuture { -// assert_eq!(req.method(), &Method::DELETE); -// assert_eq!(req.uri().path(), "/containers/m1"); - -// Box::new(future::ok(Response::new(Body::empty()))) -// } - -// #[test] -// fn container_remove_succeeds() { -// let dispatch_table = routes!( -// GET "/networks" => default_get_networks_handler(), -// POST "/networks/create" => default_create_network_handler(), -// DELETE "/containers/m1" => container_remove_handler, -// ); - -// let (server, port) = run_tcp_server( -// "127.0.0.1", -// make_req_dispatcher(dispatch_table, Box::new(not_found_handler)), -// ); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let task = DockerModuleRuntime::make_runtime(settings) -// .and_then(|runtime| ModuleRuntime::remove(&runtime, "m1")); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[allow(clippy::needless_pass_by_value)] -// fn container_list_handler(req: Request) -> ResponseFuture { -// assert_eq!(req.method(), &Method::GET); -// assert_eq!(req.uri().path(), "/containers/json"); - -// let query_map: HashMap = parse_query(req.uri().query().unwrap().as_bytes()) -// .into_owned() -// .collect(); -// assert!(query_map.contains_key("filters")); -// assert_eq!( -// query_map.get("filters"), -// Some( -// &json!({ -// "label": vec!["net.azure-devices.edge.owner=Microsoft.Azure.Devices.Edge.Agent"] -// }) -// .to_string() -// ) -// ); - -// let mut labels = HashMap::new(); -// labels.insert("l1".to_string(), "v1".to_string()); -// labels.insert("l2".to_string(), "v2".to_string()); -// labels.insert("l3".to_string(), "v3".to_string()); - -// let modules = vec![ -// ContainerSummary::new( -// "m1".to_string(), -// vec!["/m1".to_string()], -// "nginx:latest".to_string(), -// "img1".to_string(), -// "".to_string(), -// 10, -// vec![], -// 10, -// 10, -// labels.clone(), -// "".to_string(), -// "".to_string(), -// ContainerHostConfig::new(""), -// ContainerNetworkSettings::new(HashMap::new()), -// vec![], -// ), -// ContainerSummary::new( -// "m2".to_string(), -// vec!["/m2".to_string()], -// "ubuntu:latest".to_string(), -// "img2".to_string(), -// "".to_string(), -// 10, -// vec![], -// 10, -// 10, -// labels.clone(), -// "".to_string(), -// "".to_string(), -// ContainerHostConfig::new(""), -// ContainerNetworkSettings::new(HashMap::new()), -// vec![], -// ), -// ContainerSummary::new( -// "m3".to_string(), -// vec!["/m3".to_string()], -// "mongo:latest".to_string(), -// "img3".to_string(), -// "".to_string(), -// 10, -// vec![], -// 10, -// 10, -// labels, -// "".to_string(), -// "".to_string(), -// ContainerHostConfig::new(""), -// ContainerNetworkSettings::new(HashMap::new()), -// vec![], -// ), -// ]; - -// let response = serde_json::to_string(&modules).unwrap(); -// let response_len = response.len(); - -// let mut response = Response::new(response.into()); -// response -// .headers_mut() -// .typed_insert(&ContentLength(response_len as u64)); -// response -// .headers_mut() -// .typed_insert(&ContentType(mime::APPLICATION_JSON)); -// Box::new(future::ok(response)) -// } - -// #[test] -// fn container_list_succeeds() { -// let dispatch_table = routes!( -// GET "/networks" => default_get_networks_handler(), -// POST "/networks/create" => default_create_network_handler(), -// GET "/containers/json" => container_list_handler, -// ); - -// let (server, port) = run_tcp_server( -// "127.0.0.1", -// make_req_dispatcher(dispatch_table, Box::new(not_found_handler)), -// ); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let task = DockerModuleRuntime::make_runtime(settings).and_then(|runtime| runtime.list()); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// let modules = runtime.block_on(task).unwrap(); - -// assert_eq!(3, modules.len()); - -// assert_eq!("m1", modules[0].name()); -// assert_eq!("m2", modules[1].name()); -// assert_eq!("m3", modules[2].name()); - -// assert_eq!("img1", modules[0].config().image_id().unwrap()); -// assert_eq!("img2", modules[1].config().image_id().unwrap()); -// assert_eq!("img3", modules[2].config().image_id().unwrap()); - -// assert_eq!("nginx:latest", modules[0].config().image()); -// assert_eq!("ubuntu:latest", modules[1].config().image()); -// assert_eq!("mongo:latest", modules[2].config().image()); - -// for module in modules { -// for i in 0..3 { -// assert_eq!( -// module -// .config() -// .create_options() -// .labels() -// .unwrap() -// .get(&format!("l{}", i + 1)), -// Some(&format!("v{}", i + 1)) -// ); -// } -// } -// } - -// #[allow(clippy::needless_pass_by_value)] -// fn container_logs_handler(req: Request) -> ResponseFuture { -// assert_eq!(req.method(), &Method::GET); -// assert_eq!(req.uri().path(), "/containers/mod1/logs"); - -// let query_map: HashMap = parse_query(req.uri().query().unwrap().as_bytes()) -// .into_owned() -// .collect(); -// assert!(query_map.contains_key("stdout")); -// assert!(query_map.contains_key("stderr")); -// assert!(query_map.contains_key("follow")); -// assert!(query_map.contains_key("tail")); -// assert_eq!("true", query_map["follow"]); -// assert_eq!("all", query_map["tail"]); -// assert_eq!("100000", query_map["since"]); - -// let body = vec![ -// 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x52, 0x6f, 0x73, 0x65, 0x73, 0x20, 0x61, -// 0x72, 0x65, 0x20, 0x72, 0x65, 0x64, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x76, -// 0x69, 0x6f, 0x6c, 0x65, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x62, 0x6c, 0x75, 0x65, -// ]; - -// Box::new(future::ok(Response::new(body.into()))) -// } - -// #[test] -// fn container_logs_succeeds() { -// let dispatch_table = routes!( -// GET "/networks" => default_get_networks_handler(), -// POST "/networks/create" => default_create_network_handler(), -// GET "/containers/mod1/logs" => container_logs_handler, -// ); - -// let (server, port) = run_tcp_server( -// "127.0.0.1", -// make_req_dispatcher(dispatch_table, Box::new(not_found_handler)), -// ); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let task = DockerModuleRuntime::make_runtime(settings).and_then(|runtime| { -// let options = LogOptions::new() -// .with_follow(true) -// .with_tail(LogTail::All) -// .with_since(100_000) -// .with_until(200_000); - -// runtime.logs("mod1", &options) -// }); - -// let expected_body = [ -// 0x01_u8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x52, 0x6f, 0x73, 0x65, 0x73, 0x20, -// 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x64, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, -// 0x76, 0x69, 0x6f, 0x6c, 0x65, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x62, 0x6c, 0x75, -// 0x65, -// ]; - -// let assert = task.and_then(Stream::concat2).and_then(|b| { -// assert_eq!(&expected_body[..], b.as_ref()); -// Ok(()) -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(assert).unwrap(); -// } - -// #[test] -// fn image_remove_with_white_space_name_fails() { -// let (server, port) = run_tcp_server("127.0.0.1", default_network_handler()); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let image_name = " "; - -// let task = DockerModuleRuntime::make_runtime(settings) -// .and_then(|runtime| ModuleRegistry::remove(&runtime, image_name)) -// .then(|res| match res { -// Ok(_) => Err("Expected error but got a result.".to_string()), -// Err(err) => match err.kind() { -// ErrorKind::RegistryOperation(RegistryOperation::RemoveImage(s)) -// if s == image_name => -// { -// Ok(()) -// } -// kind => panic!( -// "Expected `RegistryOperation(RemoveImage)` error but got {:?}.", -// kind -// ), -// }, -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[test] -// fn create_fails_for_non_docker_type() { -// let (server, port) = run_tcp_server("127.0.0.1", default_network_handler()); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let name = "not_docker"; - -// let task = DockerModuleRuntime::make_runtime(settings) -// .and_then(|runtime| { -// let module_config = ModuleSpec::new( -// "m1".to_string(), -// name.to_string(), -// DockerConfig::new( -// "nginx:latest".to_string(), -// ContainerCreateBody::new(), -// None, -// None, -// ) -// .unwrap(), -// BTreeMap::new(), -// ImagePullPolicy::default(), -// ) -// .unwrap(); - -// runtime.create(module_config) -// }) -// .then(|result| match result { -// Ok(_) => panic!("Expected test to fail but it didn't!"), -// Err(err) => match err.kind() { -// ErrorKind::InvalidModuleType(s) if s == name => Ok::<_, Error>(()), -// kind => panic!("Expected `InvalidModuleType` error but got {:?}.", kind), -// }, -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[test] -// fn start_fails_for_empty_id() { -// let (server, port) = run_tcp_server("127.0.0.1", default_network_handler()); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let name = ""; - -// let task = DockerModuleRuntime::make_runtime(settings) -// .and_then(|runtime| runtime.start(name)) -// .then(|result| match result { -// Ok(_) => panic!("Expected test to fail but it didn't!"), -// Err(err) => match err.kind() { -// ErrorKind::RuntimeOperation(RuntimeOperation::StartModule(s)) if s == name => { -// Ok::<_, Error>(()) -// } -// kind => panic!( -// "Expected `RuntimeOperation(StartModule)` error but got {:?}.", -// kind -// ), -// }, -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[test] -// fn start_fails_for_white_space_id() { -// let (server, port) = run_tcp_server("127.0.0.1", default_network_handler()); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let name = " "; - -// let task = DockerModuleRuntime::make_runtime(settings) -// .and_then(|runtime| runtime.start(name)) -// .then(|result| match result { -// Ok(_) => panic!("Expected test to fail but it didn't!"), -// Err(err) => match err.kind() { -// ErrorKind::RuntimeOperation(RuntimeOperation::StartModule(s)) if s == name => { -// Ok::<_, Error>(()) -// } -// kind => panic!( -// "Expected `RuntimeOperation(StartModule)` error but got {:?}.", -// kind -// ), -// }, -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[test] -// fn stop_fails_for_empty_id() { -// let (server, port) = run_tcp_server("127.0.0.1", default_network_handler()); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let name = ""; - -// let task = DockerModuleRuntime::make_runtime(settings) -// .and_then(|runtime| runtime.stop(name, None)) -// .then(|result| match result { -// Ok(_) => panic!("Expected test to fail but it didn't!"), -// Err(err) => match err.kind() { -// ErrorKind::RuntimeOperation(RuntimeOperation::StopModule(s)) if s == name => { -// Ok::<_, Error>(()) -// } -// kind => panic!( -// "Expected `RuntimeOperation(StopModule)` error but got {:?}.", -// kind -// ), -// }, -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[test] -// fn stop_fails_for_white_space_id() { -// let (server, port) = run_tcp_server("127.0.0.1", default_network_handler()); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let name = " "; - -// let task = DockerModuleRuntime::make_runtime(settings) -// .and_then(|runtime| runtime.stop(name, None)) -// .then(|result| match result { -// Ok(_) => panic!("Expected test to fail but it didn't!"), -// Err(err) => match err.kind() { -// ErrorKind::RuntimeOperation(RuntimeOperation::StopModule(s)) if s == name => { -// Ok::<_, Error>(()) -// } -// kind => panic!( -// "Expected `RuntimeOperation(StopModule)` error but got {:?}.", -// kind -// ), -// }, -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[test] -// fn restart_fails_for_empty_id() { -// let (server, port) = run_tcp_server("127.0.0.1", default_network_handler()); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let name = ""; - -// let task = DockerModuleRuntime::make_runtime(settings) -// .and_then(|runtime| runtime.restart(name)) -// .then(|result| match result { -// Ok(_) => panic!("Expected test to fail but it didn't!"), -// Err(err) => match err.kind() { -// ErrorKind::RuntimeOperation(RuntimeOperation::RestartModule(s)) if s == name => { -// Ok::<_, Error>(()) -// } -// kind => panic!( -// "Expected `RuntimeOperation(RestartModule)` error but got {:?}.", -// kind -// ), -// }, -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[test] -// fn restart_fails_for_white_space_id() { -// let (server, port) = run_tcp_server("127.0.0.1", default_network_handler()); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let name = " "; - -// let task = DockerModuleRuntime::make_runtime(settings) -// .and_then(|runtime| runtime.restart(name)) -// .then(|result| match result { -// Ok(_) => panic!("Expected test to fail but it didn't!"), -// Err(err) => match err.kind() { -// ErrorKind::RuntimeOperation(RuntimeOperation::RestartModule(s)) if s == name => { -// Ok::<_, Error>(()) -// } -// kind => panic!( -// "Expected `RuntimeOperation(RestartModule)` error but got {:?}.", -// kind -// ), -// }, -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[test] -// fn remove_fails_for_empty_id() { -// let (server, port) = run_tcp_server("127.0.0.1", default_network_handler()); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let name = ""; - -// let task = DockerModuleRuntime::make_runtime(settings) -// .and_then(|runtime| ModuleRuntime::remove(&runtime, name)) -// .then(|result| match result { -// Ok(_) => panic!("Expected test to fail but it didn't!"), -// Err(err) => match err.kind() { -// ErrorKind::RuntimeOperation(RuntimeOperation::RemoveModule(s)) if s == name => { -// Ok::<_, Error>(()) -// } -// kind => panic!( -// "Expected `RuntimeOperation(RemoveModule)` error but got {:?}.", -// kind -// ), -// }, -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[test] -// fn remove_fails_for_white_space_id() { -// let (server, port) = run_tcp_server("127.0.0.1", default_network_handler()); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let name = " "; - -// let task = DockerModuleRuntime::make_runtime(settings) -// .and_then(|runtime| ModuleRuntime::remove(&runtime, name)) -// .then(|result| match result { -// Ok(_) => panic!("Expected test to fail but it didn't!"), -// Err(err) => match err.kind() { -// ErrorKind::RuntimeOperation(RuntimeOperation::RemoveModule(s)) if s == name => { -// Ok::<_, Error>(()) -// } -// kind => panic!( -// "Expected `RuntimeOperation(RemoveModule)` error but got {:?}.", -// kind -// ), -// }, -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[test] -// fn get_fails_for_empty_id() { -// let (server, port) = run_tcp_server("127.0.0.1", default_network_handler()); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let name = ""; - -// let task = DockerModuleRuntime::make_runtime(settings) -// .and_then(|runtime| runtime.get(name)) -// .then(|result| match result { -// Ok(_) => panic!("Expected test to fail but it didn't!"), -// Err(err) => match err.kind() { -// ErrorKind::RuntimeOperation(RuntimeOperation::GetModule(s)) if s == name => { -// Ok::<_, Error>(()) -// } -// kind => panic!( -// "Expected `RuntimeOperation(GetModule)` error but got {:?}.", -// kind -// ), -// }, -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[test] -// fn get_fails_for_white_space_id() { -// let (server, port) = run_tcp_server("127.0.0.1", default_network_handler()); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let name = " "; - -// let task = DockerModuleRuntime::make_runtime(settings) -// .and_then(|runtime| runtime.get(name)) -// .then(|result| match result { -// Ok(_) => panic!("Expected test to fail but it didn't!"), -// Err(err) => match err.kind() { -// ErrorKind::RuntimeOperation(RuntimeOperation::GetModule(s)) if s == name => { -// Ok::<_, Error>(()) -// } -// kind => panic!( -// "Expected `RuntimeOperation(GetModule)` error but got {:?}.", -// kind -// ), -// }, -// }); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); -// } - -// #[test] -// fn runtime_init_network_does_not_exist_create() { -// let list_got_called_lock = Arc::new(RwLock::new(false)); -// let list_got_called_lock_cloned = list_got_called_lock.clone(); - -// let create_got_called_lock = Arc::new(RwLock::new(false)); -// let create_got_called_lock_cloned = create_got_called_lock.clone(); - -// let network_handler = make_network_handler( -// move || { -// let mut list_got_called_w = list_got_called_lock.write().unwrap(); -// *list_got_called_w = true; - -// json!([]).to_string() -// }, -// move |_| { -// let mut create_got_called_w = create_got_called_lock.write().unwrap(); -// *create_got_called_w = true; -// }, -// ); - -// let (server, port) = run_tcp_server("127.0.0.1", network_handler); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// //act -// let task = DockerModuleRuntime::make_runtime(settings); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); - -// //assert -// assert_eq!(true, *list_got_called_lock_cloned.read().unwrap()); -// assert_eq!(true, *create_got_called_lock_cloned.read().unwrap()); -// } - -// #[test] -// fn network_ipv6_create() { -// let list_got_called_lock = Arc::new(RwLock::new(false)); -// let list_got_called_lock_cloned = list_got_called_lock.clone(); - -// let create_got_called_lock = Arc::new(RwLock::new(false)); -// let create_got_called_lock_cloned = create_got_called_lock.clone(); - -// let network_handler = make_network_handler( -// move || { -// let mut list_got_called_w = list_got_called_lock.write().unwrap(); -// *list_got_called_w = true; - -// json!([]).to_string() -// }, -// move |req| { -// let mut create_got_called_w = create_got_called_lock.write().unwrap(); -// *create_got_called_w = true; - -// let task = req -// .into_body() -// .concat2() -// .map(|body| { -// let network: NetworkConfig = serde_json::from_slice(&body).unwrap(); -// assert_eq!("my-network", network.name().as_str()); -// let ipam_config = network.IPAM().unwrap().config().unwrap(); - -// let ipam_config_0 = ipam_config.get(0).unwrap(); -// assert_eq!(ipam_config_0["Gateway"], "172.18.0.1"); -// assert_eq!(ipam_config_0["Subnet"], "172.18.0.0/16"); -// assert_eq!(ipam_config_0["IPRange"], "172.18.0.0/16"); - -// let ipam_config_1 = ipam_config.get(1).unwrap(); -// assert_eq!(ipam_config_1["Gateway"], "172.20.0.1"); -// assert_eq!(ipam_config_1["Subnet"], "172.20.0.0/16"); -// assert_eq!(ipam_config_1["IPRange"], "172.20.0.0/24"); -// }) -// .map_err(|err| panic!("{:?}", err)); - -// tokio::spawn(task).into_future().wait().unwrap(); -// }, -// ); - -// let (server, port) = run_tcp_server("127.0.0.1", network_handler); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" - -// [moby_runtime.network] -// name = "my-network" -// ipv6 = true - -// [[moby_runtime.network.ipam.config]] -// gateway = "172.18.0.1" -// subnet = "172.18.0.0/16" -// ip_range = "172.18.0.0/16" - -// [[moby_runtime.network.ipam.config]] -// gateway = "172.20.0.1" -// subnet = "172.20.0.0/16" -// ip_range = "172.20.0.0/24" -// "#, -// port -// )); - -// //act -// let task = DockerModuleRuntime::make_runtime(settings); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); - -// //assert -// assert_eq!(true, *list_got_called_lock_cloned.read().unwrap()); -// assert_eq!(true, *create_got_called_lock_cloned.read().unwrap()); -// } - -// #[test] -// fn runtime_init_network_exist_do_not_create() { -// let list_got_called_lock = Arc::new(RwLock::new(false)); -// let list_got_called_lock_cloned = list_got_called_lock.clone(); - -// let create_got_called_lock = Arc::new(RwLock::new(false)); -// let create_got_called_lock_cloned = create_got_called_lock.clone(); - -// let network_handler = make_network_handler( -// move || { -// let mut list_got_called_w = list_got_called_lock.write().unwrap(); -// *list_got_called_w = true; - -// json!([ -// { -// "Name": "azure-iot-edge", -// "Id": "8e3209d08ed5e73d1c9c8e7580ddad232b6dceb5bf0c6d74cadbed75422eef0e", -// "Created": "0001-01-01T00:00:00Z", -// "Scope": "local", -// "Driver": "bridge", -// "EnableIPv6": false, -// "Internal": false, -// "Attachable": false, -// "Ingress": false, -// "IPAM": { -// "Driver": "bridge", -// "Config": [] -// }, -// "Containers": {}, -// "Options": {} -// } -// ]) -// .to_string() -// }, -// move |_| { -// let mut create_got_called_w = create_got_called_lock.write().unwrap(); -// *create_got_called_w = true; -// }, -// ); - -// let (server, port) = run_tcp_server("127.0.0.1", network_handler); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// //act -// let task = DockerModuleRuntime::make_runtime(settings); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// runtime.block_on(task).unwrap(); - -// //assert -// assert_eq!(true, *list_got_called_lock_cloned.read().unwrap()); -// assert_eq!(false, *create_got_called_lock_cloned.read().unwrap()); -// } - -// #[test] -// fn runtime_system_info_succeeds() { -// let system_info_got_called_lock = Arc::new(RwLock::new(false)); -// let system_info_got_called_lock_cloned = system_info_got_called_lock.clone(); - -// let on_system_info = move |req: Request| { -// let mut system_info_got_called_w = system_info_got_called_lock.write().unwrap(); -// *system_info_got_called_w = true; - -// assert_eq!(req.uri().path(), "/info"); - -// let response = json!( -// { -// "OSType": "linux", -// "Architecture": "x86_64", -// } -// ) -// .to_string(); -// let response_len = response.len(); - -// let mut response = Response::new(response.into()); -// response -// .headers_mut() -// .typed_insert(&ContentLength(response_len as u64)); -// response -// .headers_mut() -// .typed_insert(&ContentType(mime::APPLICATION_JSON)); - -// Box::new(future::ok(response)) as ResponseFuture -// }; - -// let dispatch_table = routes!( -// GET "/networks" => default_get_networks_handler(), -// POST "/networks/create" => default_create_network_handler(), -// GET "/info" => on_system_info, -// ); - -// //act -// let (server, port) = run_tcp_server( -// "127.0.0.1", -// make_req_dispatcher(dispatch_table, Box::new(not_found_handler)), -// ); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let task = -// DockerModuleRuntime::make_runtime(settings).and_then(|runtime| runtime.system_info()); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// let system_info = runtime.block_on(task).unwrap(); - -// //assert -// assert_eq!(true, *system_info_got_called_lock_cloned.read().unwrap()); -// assert_eq!("linux", system_info.os_type); -// assert_eq!("x86_64", system_info.architecture); -// } - -// #[test] -// fn runtime_system_info_none_returns_unkown() { -// let system_info_got_called_lock = Arc::new(RwLock::new(false)); -// let system_info_got_called_lock_cloned = system_info_got_called_lock.clone(); - -// let on_system_info = move |req: Request| { -// let mut system_info_got_called_w = system_info_got_called_lock.write().unwrap(); -// *system_info_got_called_w = true; - -// assert_eq!(req.uri().path(), "/info"); - -// let response = json!({}).to_string(); -// let response_len = response.len(); - -// let mut response = Response::new(response.into()); -// response -// .headers_mut() -// .typed_insert(&ContentLength(response_len as u64)); -// response -// .headers_mut() -// .typed_insert(&ContentType(mime::APPLICATION_JSON)); - -// Box::new(future::ok(response)) as ResponseFuture -// }; - -// let dispatch_table = routes!( -// GET "/networks" => default_get_networks_handler(), -// POST "/networks/create" => default_create_network_handler(), -// GET "/info" => on_system_info, -// ); - -// //act -// let (server, port) = run_tcp_server( -// "127.0.0.1", -// make_req_dispatcher(dispatch_table, Box::new(not_found_handler)), -// ); -// let server = server.map_err(|err| panic!(err)); - -// let settings = make_settings(&format!( -// r#" -// [moby_runtime] -// uri = "http://localhost:{}" -// network = "azure-iot-edge" -// "#, -// port -// )); - -// let task = -// DockerModuleRuntime::make_runtime(settings).and_then(|runtime| runtime.system_info()); - -// let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); -// runtime.spawn(server); -// let system_info = runtime.block_on(task).unwrap(); - -// //assert -// assert_eq!(true, *system_info_got_called_lock_cloned.read().unwrap()); -// assert_eq!("Unknown", system_info.os_type); -// assert_eq!("Unknown", system_info.architecture); -// } diff --git a/edgelet/iotedge/Cargo.toml b/edgelet/iotedge/Cargo.toml index 0922ce0edd3..dcedd4c7ed4 100644 --- a/edgelet/iotedge/Cargo.toml +++ b/edgelet/iotedge/Cargo.toml @@ -11,16 +11,16 @@ version = "0.1.0" anyhow = "1" async-trait = "0.1" atty = "0.2" -base64 = "0.9" +base64 = "0.13" byte-unit = "3.0.3" -bytes = "0.4" +bytes = "1" chrono = { version = "0.4.7", features = ["serde"] } chrono-humanize = "0.0.11" clap = "2.31" config = { version = "0.11", default-features = false } erased-serde = "0.3.12" -futures = "0.1" -hex = "0.3" +futures = "0.3" +hex = "0.4" hyper = "0.14" lazy_static = "1" libc = "0.2" @@ -28,16 +28,14 @@ log = "0.4" nix = "0.23" openssl = "0.10" regex = "1" -serde = "1.0" -serde_derive = "1.0" -serde_json = "1.0" -sysinfo = "0.14.10" -tabwriter = "1.0" -termcolor = "0.3" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1" +sysinfo = "0.23" +tabwriter = "1" +termcolor = "1" thiserror = "1" tokio = { version = "1", features = ["macros", "process"] } toml = "0.5" -typed-headers = "0.1.1" url = "2" zip = "0.5.3" diff --git a/edgelet/iotedge/src/check/additional_info.rs b/edgelet/iotedge/src/check/additional_info.rs index e19bd6012a3..3cc8dca4ffe 100644 --- a/edgelet/iotedge/src/check/additional_info.rs +++ b/edgelet/iotedge/src/check/additional_info.rs @@ -7,7 +7,7 @@ use byte_unit::{Byte, ByteUnit}; use sysinfo::{DiskExt, SystemExt}; /// Additional info for the JSON output of `iotedge check` -#[derive(Clone, Debug, serde_derive::Serialize)] +#[derive(Clone, Debug, serde::Serialize)] pub(super) struct AdditionalInfo { pub(super) docker_version: Option, pub(super) aziot_edged_version: Option, @@ -42,7 +42,7 @@ impl AdditionalInfo { /// ``` /// /// Ref: -#[derive(Clone, Debug, serde_derive::Serialize)] +#[derive(Clone, Debug, serde::Serialize)] pub(super) struct OsInfo { id: Option, version_id: Option, @@ -115,7 +115,7 @@ fn parse_os_release_line(line: &str) -> Option<(&str, &str)> { Some((key, value)) } -#[derive(Clone, Debug, Default, serde_derive::Serialize)] +#[derive(Clone, Debug, Default, serde::Serialize)] struct SystemInfo { used_ram: String, total_ram: String, @@ -132,12 +132,12 @@ impl SystemInfo { let mut system = sysinfo::System::new(); system.refresh_all(); SystemInfo { - total_ram: pretty_kbyte(system.get_total_memory()), - used_ram: pretty_kbyte(system.get_used_memory()), - total_swap: pretty_kbyte(system.get_total_swap()), - used_swap: pretty_kbyte(system.get_used_swap()), + total_ram: pretty_kbyte(system.total_memory()), + used_ram: pretty_kbyte(system.used_memory()), + total_swap: pretty_kbyte(system.total_swap()), + used_swap: pretty_kbyte(system.used_swap()), - disks: system.get_disks().iter().map(DiskInfo::new).collect(), + disks: system.disks().iter().map(DiskInfo::new).collect(), } } @@ -146,7 +146,7 @@ impl SystemInfo { } } -#[derive(Clone, Debug, Default, serde_derive::Serialize)] +#[derive(Clone, Debug, Default, serde::Serialize)] struct DiskInfo { name: String, percent_free: String, @@ -162,8 +162,8 @@ impl DiskInfo { where T: DiskExt, { - let available_space = disk.get_available_space(); - let total_space = disk.get_total_space(); + let available_space = disk.available_space(); + let total_space = disk.total_space(); #[allow(clippy::cast_precision_loss)] let percent_free = format!( "{:.1}%", @@ -171,7 +171,7 @@ impl DiskInfo { ); DiskInfo { - name: disk.get_name().to_string_lossy().into_owned(), + name: disk.name().to_string_lossy().into_owned(), percent_free, available_space: Byte::from_bytes(u128::from(available_space)) .get_appropriate_unit(true) @@ -179,8 +179,8 @@ impl DiskInfo { total_space: Byte::from_bytes(u128::from(total_space)) .get_appropriate_unit(true) .format(2), - file_system: String::from_utf8_lossy(disk.get_file_system()).into_owned(), - file_type: format!("{:?}", disk.get_type()), + file_system: String::from_utf8_lossy(disk.file_system()).into_owned(), + file_type: format!("{:?}", disk.type_()), } } } diff --git a/edgelet/iotedge/src/check/checks/aziot_edged_version.rs b/edgelet/iotedge/src/check/checks/aziot_edged_version.rs index 1289ecf50b8..962e73d4a39 100644 --- a/edgelet/iotedge/src/check/checks/aziot_edged_version.rs +++ b/edgelet/iotedge/src/check/checks/aziot_edged_version.rs @@ -4,7 +4,7 @@ use regex::Regex; use crate::check::{Check, CheckResult, Checker, CheckerMeta}; use crate::error::{Error, FetchLatestVersionsReason}; -#[derive(Default, serde_derive::Serialize)] +#[derive(Default, serde::Serialize)] pub(crate) struct AziotEdgedVersion { actual_version: Option, expected_version: Option, diff --git a/edgelet/iotedge/src/check/checks/check_agent_image.rs b/edgelet/iotedge/src/check/checks/check_agent_image.rs index 5523abd9b1c..7f6ea1901af 100644 --- a/edgelet/iotedge/src/check/checks/check_agent_image.rs +++ b/edgelet/iotedge/src/check/checks/check_agent_image.rs @@ -5,7 +5,7 @@ use edgelet_settings::RuntimeSettings; use crate::check::{Check, CheckResult, Checker, CheckerMeta}; -#[derive(Default, serde_derive::Serialize)] +#[derive(Default, serde::Serialize)] pub(crate) struct CheckAgentImage {} #[async_trait::async_trait] diff --git a/edgelet/iotedge/src/check/checks/connect_management_uri.rs b/edgelet/iotedge/src/check/checks/connect_management_uri.rs index 198c204a289..2c21a035b18 100644 --- a/edgelet/iotedge/src/check/checks/connect_management_uri.rs +++ b/edgelet/iotedge/src/check/checks/connect_management_uri.rs @@ -8,7 +8,7 @@ use edgelet_settings::RuntimeSettings; use crate::check::{Check, CheckResult, Checker, CheckerMeta}; -#[derive(Default, serde_derive::Serialize)] +#[derive(Default, serde::Serialize)] pub(crate) struct ConnectManagementUri { connect_management_uri: Option, listen_management_uri: Option, diff --git a/edgelet/iotedge/src/check/checks/container_connect_upstream.rs b/edgelet/iotedge/src/check/checks/container_connect_upstream.rs index 03fe4a11852..92f4fcc52b1 100644 --- a/edgelet/iotedge/src/check/checks/container_connect_upstream.rs +++ b/edgelet/iotedge/src/check/checks/container_connect_upstream.rs @@ -50,7 +50,7 @@ pub(crate) fn get_host_container_upstream_tests() -> Vec> { ] } -#[derive(serde_derive::Serialize)] +#[derive(serde::Serialize)] pub(crate) struct ContainerConnectUpstream { upstream_port: UpstreamProtocolPort, upstream_hostname: Option, diff --git a/edgelet/iotedge/src/check/checks/container_engine_dns.rs b/edgelet/iotedge/src/check/checks/container_engine_dns.rs index e53ff871b3f..83afaabef36 100644 --- a/edgelet/iotedge/src/check/checks/container_engine_dns.rs +++ b/edgelet/iotedge/src/check/checks/container_engine_dns.rs @@ -4,7 +4,7 @@ use anyhow::Context; use crate::check::{Check, CheckResult, Checker, CheckerMeta}; -#[derive(Default, serde_derive::Serialize)] +#[derive(Default, serde::Serialize)] pub(crate) struct ContainerEngineDns { container_engine_config_path: Option, dns: Option>, @@ -71,7 +71,7 @@ impl ContainerEngineDns { } } -#[derive(serde_derive::Deserialize)] +#[derive(serde::Deserialize)] struct DaemonConfig { dns: Option>, } diff --git a/edgelet/iotedge/src/check/checks/container_engine_installed.rs b/edgelet/iotedge/src/check/checks/container_engine_installed.rs index 239a9106723..4fa78dad0fe 100644 --- a/edgelet/iotedge/src/check/checks/container_engine_installed.rs +++ b/edgelet/iotedge/src/check/checks/container_engine_installed.rs @@ -2,7 +2,7 @@ use crate::check::{Check, CheckResult, Checker, CheckerMeta}; use anyhow::anyhow; -#[derive(Default, serde_derive::Serialize)] +#[derive(Default, serde::Serialize)] pub(crate) struct ContainerEngineInstalled { docker_host_arg: Option, docker_server_version: Option, diff --git a/edgelet/iotedge/src/check/checks/container_engine_ipv6.rs b/edgelet/iotedge/src/check/checks/container_engine_ipv6.rs index 8bb8daf7672..fd10c9fa052 100644 --- a/edgelet/iotedge/src/check/checks/container_engine_ipv6.rs +++ b/edgelet/iotedge/src/check/checks/container_engine_ipv6.rs @@ -6,7 +6,7 @@ use edgelet_settings::MobyNetwork; use crate::check::{Check, CheckResult, Checker, CheckerMeta}; -#[derive(Default, serde_derive::Serialize)] +#[derive(Default, serde::Serialize)] pub(crate) struct ContainerEngineIPv6 { expected_use_ipv6: Option, actual_use_ipv6: Option, @@ -81,7 +81,7 @@ impl ContainerEngineIPv6 { } } -#[derive(serde_derive::Deserialize)] +#[derive(serde::Deserialize)] struct DaemonConfig { ipv6: Option, } diff --git a/edgelet/iotedge/src/check/checks/container_engine_logrotate.rs b/edgelet/iotedge/src/check/checks/container_engine_logrotate.rs index 71557f01bcc..c63f19f26bf 100644 --- a/edgelet/iotedge/src/check/checks/container_engine_logrotate.rs +++ b/edgelet/iotedge/src/check/checks/container_engine_logrotate.rs @@ -4,7 +4,7 @@ use anyhow::{anyhow, Context}; use crate::check::{Check, CheckResult, Checker, CheckerMeta}; -#[derive(Default, serde_derive::Serialize)] +#[derive(Default, serde::Serialize)] pub(crate) struct ContainerEngineLogrotate { daemon_config: Option, } @@ -75,7 +75,7 @@ impl ContainerEngineLogrotate { } } -#[derive(serde_derive::Deserialize, serde_derive::Serialize, Clone)] +#[derive(serde::Deserialize, serde::Serialize, Clone)] struct DaemonConfig { #[serde(rename = "log-driver")] log_driver: Option, @@ -84,7 +84,7 @@ struct DaemonConfig { log_opts: Option, } -#[derive(serde_derive::Deserialize, serde_derive::Serialize, Clone)] +#[derive(serde::Deserialize, serde::Serialize, Clone)] struct DaemonConfigLogOpts { #[serde(rename = "max-file")] max_file: Option, diff --git a/edgelet/iotedge/src/check/checks/container_local_time.rs b/edgelet/iotedge/src/check/checks/container_local_time.rs index 1454b021757..9a91e965b35 100644 --- a/edgelet/iotedge/src/check/checks/container_local_time.rs +++ b/edgelet/iotedge/src/check/checks/container_local_time.rs @@ -4,7 +4,7 @@ use anyhow::Context; use crate::check::{Check, CheckResult, Checker, CheckerMeta}; -#[derive(Default, serde_derive::Serialize)] +#[derive(Default, serde::Serialize)] pub(crate) struct ContainerLocalTime { expected_duration: Option, actual_duration: Option, diff --git a/edgelet/iotedge/src/check/checks/container_resolve_parent_hostname.rs b/edgelet/iotedge/src/check/checks/container_resolve_parent_hostname.rs index 15b368b1f59..6c4f8a27173 100644 --- a/edgelet/iotedge/src/check/checks/container_resolve_parent_hostname.rs +++ b/edgelet/iotedge/src/check/checks/container_resolve_parent_hostname.rs @@ -6,7 +6,7 @@ use edgelet_settings::RuntimeSettings; use crate::check::{Check, CheckResult, Checker, CheckerMeta}; -#[derive(Default, serde_derive::Serialize)] +#[derive(Default, serde::Serialize)] pub(crate) struct ContainerResolveParentHostname {} #[async_trait::async_trait] diff --git a/edgelet/iotedge/src/check/checks/parent_hostname.rs b/edgelet/iotedge/src/check/checks/parent_hostname.rs index cdf40b26ca5..7f97712dc2b 100644 --- a/edgelet/iotedge/src/check/checks/parent_hostname.rs +++ b/edgelet/iotedge/src/check/checks/parent_hostname.rs @@ -4,7 +4,7 @@ use anyhow::anyhow; use crate::check::{Check, CheckResult, Checker, CheckerMeta}; -#[derive(Default, serde_derive::Serialize)] +#[derive(Default, serde::Serialize)] pub(crate) struct ParentHostname { config_parent_hostname: Option, } diff --git a/edgelet/iotedge/src/check/checks/proxy_settings.rs b/edgelet/iotedge/src/check/checks/proxy_settings.rs index ee3148ae1fd..4df65b2de88 100644 --- a/edgelet/iotedge/src/check/checks/proxy_settings.rs +++ b/edgelet/iotedge/src/check/checks/proxy_settings.rs @@ -1,6 +1,6 @@ use crate::check::{Check, CheckResult, Checker, CheckerMeta}; -#[derive(Default, serde_derive::Serialize)] +#[derive(Default, serde::Serialize)] pub(crate) struct ProxySettings {} #[async_trait::async_trait] diff --git a/edgelet/iotedge/src/check/checks/storage_mounted_from_host.rs b/edgelet/iotedge/src/check/checks/storage_mounted_from_host.rs index 23aebc2e947..ecab300e852 100644 --- a/edgelet/iotedge/src/check/checks/storage_mounted_from_host.rs +++ b/edgelet/iotedge/src/check/checks/storage_mounted_from_host.rs @@ -7,7 +7,7 @@ use regex::Regex; use crate::check::{Check, CheckResult, Checker, CheckerMeta}; -#[derive(Default, serde_derive::Serialize)] +#[derive(Default, serde::Serialize)] pub(crate) struct EdgeAgentStorageMounted { storage_directory: Option, container_directories: Option>, @@ -35,7 +35,7 @@ impl Checker for EdgeAgentStorageMounted { } } -#[derive(Default, serde_derive::Serialize)] +#[derive(Default, serde::Serialize)] pub struct EdgeHubStorageMounted { storage_directory: Option, container_directories: Option>, diff --git a/edgelet/iotedge/src/check/checks/up_to_date_config.rs b/edgelet/iotedge/src/check/checks/up_to_date_config.rs index b66fd19e660..3e69b627f3f 100644 --- a/edgelet/iotedge/src/check/checks/up_to_date_config.rs +++ b/edgelet/iotedge/src/check/checks/up_to_date_config.rs @@ -2,7 +2,7 @@ use aziotctl_common::check_last_modified::{check_last_modified, LastModifiedErro use crate::check::{Check, CheckResult, Checker, CheckerMeta}; -#[derive(Default, serde_derive::Serialize)] +#[derive(Default, serde::Serialize)] pub(crate) struct UpToDateConfig {} #[async_trait::async_trait] diff --git a/edgelet/iotedge/src/check/checks/well_formed_config.rs b/edgelet/iotedge/src/check/checks/well_formed_config.rs index cab90e78e54..0cd3d47d4fc 100644 --- a/edgelet/iotedge/src/check/checks/well_formed_config.rs +++ b/edgelet/iotedge/src/check/checks/well_formed_config.rs @@ -5,7 +5,7 @@ use edgelet_settings::{Settings, CONFIG_FILE_DEFAULT, UPSTREAM_PARENT_KEYWORD}; use crate::check::{Check, CheckResult, Checker, CheckerMeta}; use crate::error::Error; -#[derive(Default, serde_derive::Serialize)] +#[derive(Default, serde::Serialize)] pub(crate) struct WellFormedConfig {} #[async_trait::async_trait] diff --git a/edgelet/iotedge/src/check/upstream_protocol_port.rs b/edgelet/iotedge/src/check/upstream_protocol_port.rs index 2958f58ac40..6db405eec93 100644 --- a/edgelet/iotedge/src/check/upstream_protocol_port.rs +++ b/edgelet/iotedge/src/check/upstream_protocol_port.rs @@ -1,6 +1,6 @@ // Copyright (c) Microsoft. All rights reserved. -#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd, serde_derive::Serialize)] +#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd, serde::Serialize)] pub(super) enum UpstreamProtocolPort { Amqp, Https, diff --git a/edgelet/iotedge/src/config/import/old_config/agent.rs b/edgelet/iotedge/src/config/import/old_config/agent.rs index cbd5fe8f0dc..4b67e6d6585 100644 --- a/edgelet/iotedge/src/config/import/old_config/agent.rs +++ b/edgelet/iotedge/src/config/import/old_config/agent.rs @@ -4,7 +4,7 @@ use std::collections::BTreeMap; use docker::models::{AuthConfig, ContainerCreateBody}; -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] pub(crate) struct ModuleSpec { pub(crate) name: String, @@ -21,7 +21,7 @@ pub(crate) struct ModuleSpec { pub(crate) image_pull_policy: ImagePullPolicy, } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct DockerConfig { pub(crate) image: String, @@ -40,7 +40,7 @@ pub(crate) struct DockerConfig { pub(crate) auth: Option, } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] #[serde(rename_all = "lowercase")] pub(crate) enum ImagePullPolicy { #[serde(rename = "on-create")] diff --git a/edgelet/iotedge/src/config/import/old_config/moby_runtime.rs b/edgelet/iotedge/src/config/import/old_config/moby_runtime.rs index 9f8afbb50ca..76507eec992 100644 --- a/edgelet/iotedge/src/config/import/old_config/moby_runtime.rs +++ b/edgelet/iotedge/src/config/import/old_config/moby_runtime.rs @@ -5,21 +5,21 @@ use std::path::PathBuf; use url::Url; -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] pub(crate) struct MobyRuntime { pub(crate) uri: Url, pub(crate) network: MobyNetwork, pub(crate) content_trust: Option, } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] #[serde(untagged)] pub(crate) enum MobyNetwork { Network(Network), Name(String), } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] pub(crate) struct Network { pub(crate) name: String, @@ -30,13 +30,13 @@ pub(crate) struct Network { pub(crate) ipam: Option, } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] pub(crate) struct Ipam { #[serde(rename = "config", skip_serializing_if = "Option::is_none")] pub(crate) config: Option>, } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] pub(crate) struct IpamConfig { #[serde(rename = "gateway", skip_serializing_if = "Option::is_none")] pub(crate) gateway: Option, @@ -48,7 +48,7 @@ pub(crate) struct IpamConfig { pub(crate) ip_range: Option, } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] pub(crate) struct ContentTrust { pub(crate) ca_certs: Option>, } diff --git a/edgelet/iotedge/src/config/import/old_config/mod.rs b/edgelet/iotedge/src/config/import/old_config/mod.rs index 994612e4865..fed5dbecc99 100644 --- a/edgelet/iotedge/src/config/import/old_config/mod.rs +++ b/edgelet/iotedge/src/config/import/old_config/mod.rs @@ -13,7 +13,7 @@ use std::path::PathBuf; use url::Url; -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] #[allow(dead_code)] pub(crate) struct Config { pub(crate) provisioning: Provisioning, @@ -36,13 +36,13 @@ pub(crate) struct Config { pub(crate) moby_runtime: MobyRuntime, } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] pub(crate) struct Connect { pub(crate) management_uri: Url, pub(crate) workload_uri: Url, } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] pub(crate) struct Listen { pub(crate) management_uri: Url, pub(crate) workload_uri: Url, @@ -99,7 +99,7 @@ impl<'de> serde::Deserialize<'de> for Protocol { } } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] pub(crate) struct Certificates { #[serde(flatten)] pub(crate) device_cert: Option, @@ -108,7 +108,7 @@ pub(crate) struct Certificates { pub(crate) auto_generated_ca_lifetime_days: u16, } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] pub(crate) struct DeviceCertificate { #[serde(deserialize_with = "deserialize_file_uri_or_path")] pub(crate) device_ca_cert: Url, @@ -161,13 +161,13 @@ where deserializer.deserialize_str(Visitor) } -#[derive(Debug, Default, serde_derive::Deserialize)] +#[derive(Debug, Default, serde::Deserialize)] pub(crate) struct WatchdogSettings { #[serde(default)] pub(crate) max_retries: RetryLimit, } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] #[serde(untagged)] pub(crate) enum RetryLimit { Infinite, diff --git a/edgelet/iotedge/src/config/import/old_config/provisioning.rs b/edgelet/iotedge/src/config/import/old_config/provisioning.rs index 146f7cddcf9..6c53a1f51ec 100644 --- a/edgelet/iotedge/src/config/import/old_config/provisioning.rs +++ b/edgelet/iotedge/src/config/import/old_config/provisioning.rs @@ -3,7 +3,7 @@ use regex::Regex; use url::Url; -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] #[serde(rename_all = "lowercase")] pub(crate) struct Provisioning { #[serde(flatten)] @@ -13,7 +13,7 @@ pub(crate) struct Provisioning { pub(crate) dynamic_reprovisioning: bool, } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] #[serde(rename_all = "lowercase", tag = "source")] pub(crate) enum ProvisioningType { Manual(Manual), @@ -31,7 +31,7 @@ impl<'de> serde::Deserialize<'de> for Manual { where D: serde::Deserializer<'de>, { - #[derive(Debug, serde_derive::Deserialize)] + #[derive(Debug, serde::Deserialize)] struct Inner { #[serde(skip_serializing_if = "Option::is_none")] device_connection_string: Option, @@ -63,7 +63,7 @@ impl<'de> serde::Deserialize<'de> for Manual { Ok(Manual { authentication }) } } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] #[serde(rename_all = "lowercase", tag = "method")] pub(crate) enum ManualAuthMethod { #[serde(rename = "device_connection_string")] @@ -154,7 +154,7 @@ impl<'de> serde::Deserialize<'de> for ManualDeviceConnectionString { where D: serde::Deserializer<'de>, { - #[derive(Debug, serde_derive::Deserialize)] + #[derive(Debug, serde::Deserialize)] #[serde(rename_all = "lowercase")] struct Inner { device_connection_string: String, @@ -170,7 +170,7 @@ impl<'de> serde::Deserialize<'de> for ManualDeviceConnectionString { } } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] #[serde(rename_all = "lowercase")] pub(crate) struct ManualX509Auth { pub(crate) iothub_hostname: String, @@ -192,7 +192,7 @@ impl<'de> serde::Deserialize<'de> for Dps { where D: serde::Deserializer<'de>, { - #[derive(Debug, serde_derive::Deserialize)] + #[derive(Debug, serde::Deserialize)] struct Inner { global_endpoint: Url, scope_id: String, @@ -230,7 +230,7 @@ impl<'de> serde::Deserialize<'de> for Dps { } } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] #[serde(rename_all = "lowercase", tag = "method")] pub(crate) enum AttestationMethod { Tpm(TpmAttestationInfo), @@ -241,13 +241,13 @@ pub(crate) enum AttestationMethod { X509(X509AttestationInfo), } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] #[serde(rename_all = "lowercase")] pub(crate) struct TpmAttestationInfo { pub(crate) registration_id: String, } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] #[serde(rename_all = "lowercase")] pub(crate) struct SymmetricKeyAttestationInfo { pub(crate) registration_id: String, @@ -255,7 +255,7 @@ pub(crate) struct SymmetricKeyAttestationInfo { pub(crate) symmetric_key: Vec, } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] #[serde(rename_all = "lowercase")] pub(crate) struct X509AttestationInfo { #[serde(skip_serializing_if = "Option::is_none")] @@ -266,7 +266,7 @@ pub(crate) struct X509AttestationInfo { pub(crate) identity_pk: Url, } -#[derive(Debug, serde_derive::Deserialize)] +#[derive(Debug, serde::Deserialize)] #[serde(rename_all = "lowercase")] #[allow(dead_code)] pub(crate) struct External { diff --git a/edgelet/iotedge/src/config/super_config.rs b/edgelet/iotedge/src/config/super_config.rs index b64edec55d0..f2fdd4f3657 100644 --- a/edgelet/iotedge/src/config/super_config.rs +++ b/edgelet/iotedge/src/config/super_config.rs @@ -75,7 +75,7 @@ pub fn default_agent() -> edgelet_settings::ModuleSpec>, } diff --git a/edgelet/iotedge/src/lib.rs b/edgelet/iotedge/src/lib.rs index 0866bdda970..665c31573a8 100644 --- a/edgelet/iotedge/src/lib.rs +++ b/edgelet/iotedge/src/lib.rs @@ -17,7 +17,7 @@ clippy::use_self )] -use serde_derive::Deserialize; +use serde::Deserialize; mod check; mod client;