From 4c684adc74cab04b3dd14db1192281cdae4cdf9c Mon Sep 17 00:00:00 2001 From: MOZGIII Date: Wed, 10 Jun 2020 06:33:35 +0300 Subject: [PATCH] Add lock to the test framework Signed-off-by: MOZGIII --- Cargo.lock | 1 + lib/kubernetes-test-framework/Cargo.toml | 1 + lib/kubernetes-test-framework/src/lib.rs | 2 ++ lib/kubernetes-test-framework/src/lock.rs | 15 +++++++++++++++ 4 files changed, 19 insertions(+) create mode 100644 lib/kubernetes-test-framework/src/lock.rs diff --git a/Cargo.lock b/Cargo.lock index 2332e04f9caa39..71d2e4806de34c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2079,6 +2079,7 @@ name = "kubernetes-test-framework" version = "0.1.0" dependencies = [ "k8s-openapi", + "once_cell", "serde_json", "tempfile", ] diff --git a/lib/kubernetes-test-framework/Cargo.toml b/lib/kubernetes-test-framework/Cargo.toml index bf5dd7b3fd08bf..6e423cb281af56 100644 --- a/lib/kubernetes-test-framework/Cargo.toml +++ b/lib/kubernetes-test-framework/Cargo.toml @@ -9,3 +9,4 @@ description = "Kubernetes Test Framework used to test Vector in Kubernetes" k8s-openapi = { version = "0.7", default-features = false, features = ["v1_15"] } serde_json = "1" tempfile = "3" +once_cell = "1" diff --git a/lib/kubernetes-test-framework/src/lib.rs b/lib/kubernetes-test-framework/src/lib.rs index e5709c32d67bc4..2e9b2eb1830c65 100644 --- a/lib/kubernetes-test-framework/src/lib.rs +++ b/lib/kubernetes-test-framework/src/lib.rs @@ -18,6 +18,7 @@ pub mod framework; pub mod interface; +mod lock; pub mod log_lookup; pub mod namespace; mod resource_file; @@ -30,5 +31,6 @@ pub mod wait_for_rollout; pub use framework::Framework; pub use interface::Interface; +pub use lock::lock; type Result = std::result::Result>; diff --git a/lib/kubernetes-test-framework/src/lock.rs b/lib/kubernetes-test-framework/src/lock.rs new file mode 100644 index 00000000000000..ecec583c33039b --- /dev/null +++ b/lib/kubernetes-test-framework/src/lock.rs @@ -0,0 +1,15 @@ +use once_cell::sync::OnceCell; +use std::sync::{Mutex, MutexGuard}; + +/// A shared lock to use commonly among the tests. +/// The goal is to guranatee that only one test is executing concurrently, since +/// tests use a shared resource - a k8s cluster - and will conflict with each +/// other unless they're executing sequentially. +pub fn lock() -> MutexGuard<'static, ()> { + static INSTANCE: OnceCell> = OnceCell::new(); + match INSTANCE.get_or_init(|| Mutex::new(())).lock() { + Ok(guard) => guard, + // Ignore poison error. + Err(err) => err.into_inner(), + } +}