diff --git a/Cargo.lock b/Cargo.lock index b11ae6b..d489fe5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -32,9 +32,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.15" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" dependencies = [ "memchr", ] @@ -130,9 +130,9 @@ checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" [[package]] name = "darling" -version = "0.12.2" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06d4a9551359071d1890820e3571252b91229e0712e7c36b08940e603c5a8fc" +checksum = "5f2c43f534ea4b0b049015d00269734195e6d3f0f6635cb692251aca6f9f8b3c" dependencies = [ "darling_core", "darling_macro", @@ -140,9 +140,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.12.2" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b443e5fb0ddd56e0c9bfa47dc060c5306ee500cb731f2b91432dd65589a77684" +checksum = "8e91455b86830a1c21799d94524df0845183fa55bafd9aa137b01c7d1065fa36" dependencies = [ "fnv", "ident_case", @@ -154,9 +154,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.12.2" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0220073ce504f12a70efc4e7cdaea9e9b1b324872e7ad96a208056d7a638b81" +checksum = "29b5acf0dea37a7f66f7b25d2c5e93fd46f8f6968b1a5d7a3e02e97768afc95a" dependencies = [ "darling_core", "quote", @@ -401,9 +401,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7245cd7449cc792608c3c8a9eaf69bd4eabbabf802713748fd739c98b82f0747" +checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" dependencies = [ "bytes", "fnv", @@ -412,9 +412,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfb77c123b4e2f72a2069aeae0b4b4949cc7e966df277813fc16347e7549737" +checksum = "60daa14be0e0786db0f03a9e57cb404c9d756eed2b6c62b9ea98ec5743ec75a9" dependencies = [ "bytes", "http", @@ -423,15 +423,15 @@ dependencies = [ [[package]] name = "httparse" -version = "1.3.5" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "615caabe2c3160b313d52ccc905335f4ed5f10881dd63dc5699d47e90be85691" +checksum = "f3a87b616e37e93c22fb19bcd386f02f3af5ea98a25670ad0fce773de23c5e68" [[package]] name = "httpdate" -version = "0.3.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" +checksum = "05842d0d43232b23ccb7060ecb0f0626922c21f30012e97b767b30afd4a5d4b9" [[package]] name = "humantime" @@ -444,9 +444,9 @@ dependencies = [ [[package]] name = "hyper" -version = "0.14.5" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf09f61b52cfcf4c00de50df88ae423d6c02354e385a86341133b5338630ad1" +checksum = "1e5f105c494081baa3bf9e200b279e27ec1623895cd504c7dbef8d0b080fcf54" dependencies = [ "bytes", "futures-channel", @@ -457,7 +457,7 @@ dependencies = [ "httparse", "httpdate", "itoa", - "pin-project 1.0.6", + "pin-project 1.0.7", "socket2", "tokio", "tower-service", @@ -498,9 +498,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89829a5d69c23d348314a7ac337fe39173b61149a9864deabd260983aed48c21" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" dependencies = [ "matches", "unicode-bidi", @@ -581,7 +581,7 @@ dependencies = [ "log", "openssl", "pem", - "pin-project 1.0.6", + "pin-project 1.0.7", "serde", "serde_json", "serde_yaml", @@ -619,7 +619,7 @@ dependencies = [ "futures", "k8s-openapi", "kube", - "pin-project 1.0.6", + "pin-project 1.0.7", "serde", "smallvec", "snafu", @@ -635,9 +635,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.91" +version = "0.2.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8916b1f6ca17130ec6568feccee27c156ad12037880833a3b842a823236502e7" +checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e" [[package]] name = "linked-hash-map" @@ -662,9 +662,9 @@ checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" [[package]] name = "memchr" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" [[package]] name = "mio" @@ -811,9 +811,9 @@ checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" [[package]] name = "openssl" -version = "0.10.33" +version = "0.10.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a61075b62a23fef5a29815de7536d940aa35ce96d18ce0cc5076272db678a577" +checksum = "6d7830286ad6a3973c0f1d9b73738f69c76b739301d0229c4b96501695cbe4c8" dependencies = [ "bitflags", "cfg-if", @@ -825,15 +825,15 @@ dependencies = [ [[package]] name = "openssl-probe" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" +checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" [[package]] name = "openssl-sys" -version = "0.9.61" +version = "0.9.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "313752393519e876837e09e1fa183ddef0be7735868dced3196f4472d536277f" +checksum = "b6b0d6fb7d80f877617dfcb014e605e2b5ab2fb0afdf27935219bb6bd984cb98" dependencies = [ "autocfg", "cc", @@ -844,9 +844,9 @@ dependencies = [ [[package]] name = "ordered-float" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "766f840da25490628d8e63e529cd21c014f6600c6b8517add12a6fa6167a6218" +checksum = "b50b8919aecb97e5ee9aceef27e24f39c46b11831130f4a6b7b091ec5de0de12" dependencies = [ "num-traits", ] @@ -879,11 +879,11 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc174859768806e91ae575187ada95c91a29e96a98dc5d2cd9a1fed039501ba6" +checksum = "c7509cc106041c40a4518d2af7a61530e1eed0e6285296a3d8c5472806ccc4a4" dependencies = [ - "pin-project-internal 1.0.6", + "pin-project-internal 1.0.7", ] [[package]] @@ -899,9 +899,9 @@ dependencies = [ [[package]] name = "pin-project-internal" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a490329918e856ed1b083f244e3bfe2d8c4f336407e4ea9e1a9f479ff09049e5" +checksum = "48c950132583b500556b1efd71d45b319029f2b71518d979fcc208e16b42426f" dependencies = [ "proc-macro2", "quote", @@ -946,9 +946,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec" dependencies = [ "unicode-xid", ] @@ -1047,9 +1047,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.5" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9" +checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc" dependencies = [ "bitflags", ] @@ -1066,9 +1066,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.4.5" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957056ecddbeba1b26965114e191d2e8589ce74db242b6ea25fc4062427a5c19" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" dependencies = [ "aho-corasick", "memchr", @@ -1077,9 +1077,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.23" +version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5f089152e60f62d28b835fbff2cd2e8dc0baf1ac13343bef92ab7eed84548" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "remove_dir_all" @@ -1161,9 +1161,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.125" +version = "1.0.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171" +checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" dependencies = [ "serde_derive", ] @@ -1180,9 +1180,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.125" +version = "1.0.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d" +checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" dependencies = [ "proc-macro2", "quote", @@ -1235,9 +1235,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" +checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" [[package]] name = "smallvec" @@ -1301,9 +1301,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.67" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" +checksum = "a1e8cdbefb79a9a5a65e0db8b47b723ee907b7c7f8496c76a1770b5c310bab82" dependencies = [ "proc-macro2", "quote", @@ -1366,9 +1366,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023" +checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" dependencies = [ "tinyvec_macros", ] @@ -1417,9 +1417,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.5" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5143d049e85af7fbc36f5454d990e62c2df705b3589f123b71f441b6b59f443f" +checksum = "1caa0b0c8d94a049db56b5acf8cba99dc0623aab1b26d5b5f5e2d945846b3592" dependencies = [ "bytes", "futures-core", @@ -1432,13 +1432,13 @@ dependencies = [ [[package]] name = "tower" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f715efe02c0862926eb463e49368d38ddb119383475686178e32e26d15d06a66" +checksum = "bf0aa6dfc29148c3826708dabbfa83c121eeb84df4d1468220825e3a33651687" dependencies = [ "futures-core", "futures-util", - "pin-project 1.0.6", + "pin-project 1.0.7", "tokio", "tokio-util", "tower-layer", @@ -1460,9 +1460,9 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f" +checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if", "log", @@ -1484,9 +1484,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" dependencies = [ "lazy_static", ] @@ -1499,9 +1499,9 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "unicode-bidi" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" dependencies = [ "matches", ] @@ -1517,9 +1517,9 @@ dependencies = [ [[package]] name = "unicode-xid" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "unindent" @@ -1529,9 +1529,9 @@ checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7" [[package]] name = "url" -version = "2.2.1" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ccd964113622c8e9322cfac19eb1004a07e636c545f325da085d5cdde6f1f8b" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" dependencies = [ "form_urlencoded", "idna", @@ -1550,9 +1550,9 @@ dependencies = [ [[package]] name = "vcpkg" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb" +checksum = "cbdbff6266a24120518560b5dc983096efb98462e51d0d68169895b237be3e5d" [[package]] name = "want" diff --git a/tests/logs.rs b/tests/logs.rs index 209a74a..27c14e7 100644 --- a/tests/logs.rs +++ b/tests/logs.rs @@ -21,11 +21,11 @@ impl<'a> EchoService<'a> { let pod = TemporaryResource::new( &client, - &formatdoc! {r#" + &with_unique_name(&formatdoc! {r#" apiVersion: v1 kind: Pod metadata: - name: agent-logs-integration-test-{id} + name: agent-logs-integration-test-logs spec: containers: - name: echo-service @@ -40,9 +40,8 @@ impl<'a> EchoService<'a> { operator: Equal value: stackable-linux "#, - id = Uuid::new_v4(), log_output = log_output.join(NEWLINE) - }, + }), ); client.verify_pod_condition(&pod, "Ready"); diff --git a/tests/service.rs b/tests/service.rs index 1d030fb..7594ebf 100644 --- a/tests/service.rs +++ b/tests/service.rs @@ -1,4 +1,5 @@ mod test; +use std::time::Duration; use test::prelude::*; #[test] @@ -9,11 +10,11 @@ fn service_should_be_started_successfully() { let pod = TemporaryResource::new( &client, - indoc! {" + &with_unique_name(indoc! {" apiVersion: v1 kind: Pod metadata: - name: agent-service-integration-test + name: agent-service-integration-test-start spec: containers: - name: noop-service @@ -24,8 +25,44 @@ fn service_should_be_started_successfully() { - key: kubernetes.io/arch operator: Equal value: stackable-linux - "}, + "}), ); client.verify_pod_condition(&pod, "Ready"); } + +#[test] +fn restart_after_ungraceful_shutdown_should_succeed() { + // must be greater than the period between the deletion of the pod + // and the creation of the new systemd service + let termination_grace_period = Duration::from_secs(5); + + let mut client = TestKubeClient::new(); + // delete must await the end of the termination grace period + client.timeouts().delete += termination_grace_period; + + setup_repository(&client); + + let pod_spec = with_unique_name(&formatdoc! {" + apiVersion: v1 + kind: Pod + metadata: + name: agent-service-integration-test-restart + spec: + containers: + - name: nostop-service + image: nostop-service:1.0.1 + command: + - nostop-service-1.0.1/start.sh + tolerations: + - key: kubernetes.io/arch + operator: Equal + value: stackable-linux + terminationGracePeriodSeconds: {termination_grace_period_seconds} + ", termination_grace_period_seconds = termination_grace_period.as_secs()}); + + for _ in 1..=2 { + let pod = TemporaryResource::new(&client, &pod_spec); + client.verify_pod_condition(&pod, "Ready"); + } +} diff --git a/tests/test/kube.rs b/tests/test/kube.rs index c153d7c..9f9e6ca 100644 --- a/tests/test/kube.rs +++ b/tests/test/kube.rs @@ -15,7 +15,9 @@ use kube::Client; use serde::de::DeserializeOwned; use serde::Serialize; use serde_json::Value; +use std::time::Duration; use tokio::runtime::Runtime; +use uuid::Uuid; pub use kube::api::LogParams; @@ -44,6 +46,10 @@ impl TestKubeClient { } } + pub fn timeouts(&mut self) -> &mut Timeouts { + &mut self.kube_client.timeouts + } + /// Gets a list of resources restricted by the label selector. /// /// The label selector supports `=`, `==`, `!=`, and can be comma @@ -147,6 +153,26 @@ impl TestKubeClient { pub struct KubeClient { client: Client, namespace: String, + pub timeouts: Timeouts, +} + +/// Timeouts for operations +pub struct Timeouts { + pub apply_crd: Duration, + pub create: Duration, + pub delete: Duration, + pub verify_pod_condition: Duration, +} + +impl Default for Timeouts { + fn default() -> Self { + Timeouts { + apply_crd: Duration::from_secs(30), + create: Duration::from_secs(10), + delete: Duration::from_secs(10), + verify_pod_condition: Duration::from_secs(30), + } + } } impl KubeClient { @@ -156,6 +182,7 @@ impl KubeClient { Ok(KubeClient { client, namespace: String::from("default"), + timeouts: Default::default(), }) } @@ -180,7 +207,7 @@ impl KubeClient { .any(|condition| condition.type_ == "NamesAccepted" && condition.status == "True") }; - let timeout_secs = 30; + let timeout_secs = self.timeouts.apply_crd.as_secs() as u32; let crds: Api = Api::all(self.client.clone()); let apply_params = PatchParams::apply("agent_integration_test").force(); @@ -240,7 +267,7 @@ impl KubeClient { where K: Clone + DeserializeOwned + Meta + Serialize, { - let timeout_secs = 10; + let timeout_secs = self.timeouts.create.as_secs() as u32; let api: Api = Api::namespaced(self.client.clone(), &self.namespace); let resource = from_yaml(spec); @@ -269,7 +296,7 @@ impl KubeClient { where K: Clone + DeserializeOwned + Meta, { - let timeout_secs = 10; + let timeout_secs = self.timeouts.delete.as_secs() as u32; let api: Api = Api::namespaced(self.client.clone(), &self.namespace); let result = api @@ -310,7 +337,7 @@ impl KubeClient { return Ok(()); } - let timeout_secs = 30; + let timeout_secs = self.timeouts.verify_pod_condition.as_secs() as u32; let pods: Api = Api::namespaced(self.client.clone(), &self.namespace); let lp = ListParams::default() @@ -362,11 +389,24 @@ where } /// Deserializes the given YAML text into the desired type. -pub fn from_yaml(str: &str) -> T +pub fn from_yaml(yaml: &str) -> T where T: DeserializeOwned, { - serde_yaml::from_str(str).expect("String is not a well-formed YAML") + serde_yaml::from_str(yaml).expect("String is not a well-formed YAML") +} + +/// Appends a UUID to `metadata/name`. +pub fn with_unique_name(yaml: &str) -> String { + let mut spec: serde_yaml::Value = from_yaml(yaml); + let name = &mut spec["metadata"]["name"]; + *name = format!( + "{}-{}", + name.as_str().expect("metadata/name is invalid"), + Uuid::new_v4() + ) + .into(); + serde_yaml::to_string(&spec).unwrap() } /// Returns the conditions of the given node. diff --git a/tests/test/prelude.rs b/tests/test/prelude.rs index 8f4040c..2fc0ae8 100644 --- a/tests/test/prelude.rs +++ b/tests/test/prelude.rs @@ -7,4 +7,3 @@ pub use indoc::{formatdoc, indoc}; pub use k8s_openapi::api::core::v1::{Node, Pod}; pub use serde_json::json; pub use spectral::prelude::*; -pub use uuid::Uuid;