From 462fe15e5fac140a4cd6a7917059f7c1be477c77 Mon Sep 17 00:00:00 2001 From: Techassi Date: Fri, 16 Jun 2023 16:45:08 +0200 Subject: [PATCH 1/7] Add initial Display impl for ClusterCondition --- src/status/condition/mod.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/status/condition/mod.rs b/src/status/condition/mod.rs index 4a7db91ac..2d194f7ad 100644 --- a/src/status/condition/mod.rs +++ b/src/status/condition/mod.rs @@ -108,6 +108,40 @@ pub struct ClusterCondition { pub type_: ClusterConditionType, } +impl std::fmt::Display for ClusterCondition { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let out = match self.type_ { + ClusterConditionType::Available => match self.status { + ClusterConditionStatus::True => "Available", + ClusterConditionStatus::False => "Unavailable", + ClusterConditionStatus::Unknown => "Availability unknown", + }, + ClusterConditionType::Degraded => match self.status { + ClusterConditionStatus::True => "Degraded", + ClusterConditionStatus::False => "Not degraded", + ClusterConditionStatus::Unknown => "Degradation unknown", + }, + ClusterConditionType::Progressing => match self.status { + ClusterConditionStatus::True => "Progressing", + ClusterConditionStatus::False => "Not progressing", + ClusterConditionStatus::Unknown => "Progression unknown", + }, + ClusterConditionType::ReconciliationPaused => match self.status { + ClusterConditionStatus::True => "Reconciling", + ClusterConditionStatus::False => "Not reconciling", + ClusterConditionStatus::Unknown => "Reconciliation unknown", + }, + ClusterConditionType::Stopped => match self.status { + ClusterConditionStatus::True => "Stopped", + ClusterConditionStatus::False => "Running", + ClusterConditionStatus::Unknown => "Stopped status unknown", + }, + }; + + out.fmt(f) + } +} + #[derive( Clone, Copy, From d780a6e5651ee491c6002d8a205c0f65f6776808 Mon Sep 17 00:00:00 2001 From: Techassi Date: Tue, 20 Jun 2023 14:50:25 +0200 Subject: [PATCH 2/7] Add display_short and display_long methods to ClusterCondition --- src/status/condition/mod.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/status/condition/mod.rs b/src/status/condition/mod.rs index 2d194f7ad..837834cf6 100644 --- a/src/status/condition/mod.rs +++ b/src/status/condition/mod.rs @@ -142,6 +142,24 @@ impl std::fmt::Display for ClusterCondition { } } +impl ClusterCondition { + /// Returns a short display string. This method wraps the + /// [`std::fmt::Display`] implementation of the [`ClusterCondition`]. + pub fn display_short(&self) -> String { + self.to_string() + } + + /// Returns a long display string. This method uses the + /// [`std::fmt::Display`] implementation of the [`ClusterCondition`] and + /// combines it with the optional message to provide more context. + pub fn display_long(&self) -> String { + match &self.message { + Some(message) => format!("{}: {}", self.to_string(), message), + None => self.to_string(), + } + } +} + #[derive( Clone, Copy, From 93a0d84c806113bd203be0d92093787dceabea63 Mon Sep 17 00:00:00 2001 From: Techassi Date: Tue, 20 Jun 2023 14:52:47 +0200 Subject: [PATCH 3/7] Fix clippy error --- src/status/condition/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/status/condition/mod.rs b/src/status/condition/mod.rs index 837834cf6..ce14f11da 100644 --- a/src/status/condition/mod.rs +++ b/src/status/condition/mod.rs @@ -154,7 +154,7 @@ impl ClusterCondition { /// combines it with the optional message to provide more context. pub fn display_long(&self) -> String { match &self.message { - Some(message) => format!("{}: {}", self.to_string(), message), + Some(message) => format!("{}: {}", self, message), None => self.to_string(), } } From bbaa7afca211ea6ac8d2a45eb17d00c0d3746c3f Mon Sep 17 00:00:00 2001 From: Techassi Date: Tue, 20 Jun 2023 15:07:12 +0200 Subject: [PATCH 4/7] Add display_short_or_long method --- src/status/condition/mod.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/status/condition/mod.rs b/src/status/condition/mod.rs index ce14f11da..0aa5b6b2c 100644 --- a/src/status/condition/mod.rs +++ b/src/status/condition/mod.rs @@ -158,6 +158,20 @@ impl ClusterCondition { None => self.to_string(), } } + + /// Returns either a short ot long display string, This method additionally + /// checks if the status is either [`ClusterConditionStatus::False`] or + /// [`ClusterConditionStatus::Unknown`] and then returns the long display + /// string which contains the optional message to provide more context. In + /// case the status is [`ClusterConditionStatus::True`], it only returns + /// the short display string. Internally this method uses the + /// `display_short` and `display_long` methods. + pub fn display_short_or_long(&self) -> String { + match self.status { + ClusterConditionStatus::False | ClusterConditionStatus::Unknown => self.display_long(), + ClusterConditionStatus::True => self.display_short(), + } + } } #[derive( From 230c33a9fe183c8091fca30dd63b5e8d39803adc Mon Sep 17 00:00:00 2001 From: Techassi Date: Tue, 20 Jun 2023 15:39:17 +0200 Subject: [PATCH 5/7] Add is_error method --- src/status/condition/mod.rs | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/status/condition/mod.rs b/src/status/condition/mod.rs index 0aa5b6b2c..56e5dd24f 100644 --- a/src/status/condition/mod.rs +++ b/src/status/condition/mod.rs @@ -143,6 +143,32 @@ impl std::fmt::Display for ClusterCondition { } impl ClusterCondition { + /// Returns if the [`ClusterCondition`] is considered to be an error. + pub fn is_error(&self) -> bool { + match self.type_ { + ClusterConditionType::Available => match self.status { + ClusterConditionStatus::False | ClusterConditionStatus::Unknown => true, + ClusterConditionStatus::True => false, + }, + ClusterConditionType::Degraded => match self.status { + ClusterConditionStatus::False | ClusterConditionStatus::Unknown => false, + ClusterConditionStatus::True => true, + }, + ClusterConditionType::Progressing => match self.status { + ClusterConditionStatus::False | ClusterConditionStatus::Unknown => true, + ClusterConditionStatus::True => false, + }, + ClusterConditionType::ReconciliationPaused => match self.status { + ClusterConditionStatus::False | ClusterConditionStatus::True => false, + ClusterConditionStatus::Unknown => true, + }, + ClusterConditionType::Stopped => match self.status { + ClusterConditionStatus::True | ClusterConditionStatus::Unknown => true, + ClusterConditionStatus::False => false, + }, + } + } + /// Returns a short display string. This method wraps the /// [`std::fmt::Display`] implementation of the [`ClusterCondition`]. pub fn display_short(&self) -> String { @@ -167,9 +193,9 @@ impl ClusterCondition { /// the short display string. Internally this method uses the /// `display_short` and `display_long` methods. pub fn display_short_or_long(&self) -> String { - match self.status { - ClusterConditionStatus::False | ClusterConditionStatus::Unknown => self.display_long(), - ClusterConditionStatus::True => self.display_short(), + match self.is_error() { + true => self.display_long(), + false => self.display_short(), } } } From 9d3bfa90646055aa58e9c1122eab5ca596939209 Mon Sep 17 00:00:00 2001 From: Techassi Date: Wed, 21 Jun 2023 10:14:21 +0200 Subject: [PATCH 6/7] Rename is_error method to is_good and adjust return values --- src/status/condition/mod.rs | 42 ++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/status/condition/mod.rs b/src/status/condition/mod.rs index 56e5dd24f..8b6bf758d 100644 --- a/src/status/condition/mod.rs +++ b/src/status/condition/mod.rs @@ -143,28 +143,29 @@ impl std::fmt::Display for ClusterCondition { } impl ClusterCondition { - /// Returns if the [`ClusterCondition`] is considered to be an error. - pub fn is_error(&self) -> bool { + /// Returns if the [`ClusterCondition`] is considered to be in a good / + /// healthy state. + pub fn is_good(&self) -> bool { match self.type_ { ClusterConditionType::Available => match self.status { - ClusterConditionStatus::False | ClusterConditionStatus::Unknown => true, - ClusterConditionStatus::True => false, - }, - ClusterConditionType::Degraded => match self.status { ClusterConditionStatus::False | ClusterConditionStatus::Unknown => false, ClusterConditionStatus::True => true, }, - ClusterConditionType::Progressing => match self.status { + ClusterConditionType::Degraded => match self.status { ClusterConditionStatus::False | ClusterConditionStatus::Unknown => true, ClusterConditionStatus::True => false, }, + ClusterConditionType::Progressing => match self.status { + ClusterConditionStatus::False | ClusterConditionStatus::Unknown => false, + ClusterConditionStatus::True => true, + }, ClusterConditionType::ReconciliationPaused => match self.status { - ClusterConditionStatus::False | ClusterConditionStatus::True => false, - ClusterConditionStatus::Unknown => true, + ClusterConditionStatus::False | ClusterConditionStatus::True => true, + ClusterConditionStatus::Unknown => false, }, ClusterConditionType::Stopped => match self.status { - ClusterConditionStatus::True | ClusterConditionStatus::Unknown => true, - ClusterConditionStatus::False => false, + ClusterConditionStatus::True | ClusterConditionStatus::Unknown => false, + ClusterConditionStatus::False => true, }, } } @@ -185,17 +186,16 @@ impl ClusterCondition { } } - /// Returns either a short ot long display string, This method additionally - /// checks if the status is either [`ClusterConditionStatus::False`] or - /// [`ClusterConditionStatus::Unknown`] and then returns the long display - /// string which contains the optional message to provide more context. In - /// case the status is [`ClusterConditionStatus::True`], it only returns - /// the short display string. Internally this method uses the - /// `display_short` and `display_long` methods. + /// Returns either a short or long display string, This method additionally + /// checks if the condition is considered to be in a good state and then + /// returns the short display string. In case the condition is considered + /// to be in an unhealthy state, the method returns a long display string + /// which contains the optional message to provide more context. Internally + /// this method uses the `display_short` and `display_long` methods. pub fn display_short_or_long(&self) -> String { - match self.is_error() { - true => self.display_long(), - false => self.display_short(), + match self.is_good() { + true => self.display_short(), + false => self.display_long(), } } } From 72490d086ad0d67ce98d3a56b7b089723a0a56be Mon Sep 17 00:00:00 2001 From: Techassi Date: Wed, 21 Jun 2023 10:14:30 +0200 Subject: [PATCH 7/7] Add display tests --- src/status/condition/mod.rs | 78 +++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/src/status/condition/mod.rs b/src/status/condition/mod.rs index 8b6bf758d..3c5778128 100644 --- a/src/status/condition/mod.rs +++ b/src/status/condition/mod.rs @@ -591,4 +591,82 @@ mod test { assert_eq!(got.status, expected.status); assert_eq!(got.message, expected.message); } + + #[test] + fn test_display_short() { + let condition = ClusterCondition { + type_: ClusterConditionType::Available, + status: ClusterConditionStatus::False, + message: Some("This should not be displayed".into()), + ..Default::default() + }; + + assert!(!condition.is_good()); + assert_eq!(condition.display_short(), "Unavailable".to_string()); + + let condition = ClusterCondition { + type_: ClusterConditionType::Available, + status: ClusterConditionStatus::True, + message: Some("This should not be displayed".into()), + ..Default::default() + }; + + assert!(condition.is_good()); + assert_eq!(condition.display_short(), "Available".to_string()); + } + + #[test] + fn test_display_long() { + let condition = ClusterCondition { + type_: ClusterConditionType::Available, + status: ClusterConditionStatus::False, + message: Some("This should be displayed".into()), + ..Default::default() + }; + + assert!(!condition.is_good()); + assert_eq!( + condition.display_long(), + "Unavailable: This should be displayed".to_string() + ); + + let condition = ClusterCondition { + type_: ClusterConditionType::Available, + status: ClusterConditionStatus::True, + message: Some("This should be displayed".into()), + ..Default::default() + }; + + assert!(condition.is_good()); + assert_eq!( + condition.display_long(), + "Available: This should be displayed".to_string() + ); + } + + #[test] + fn test_display_short_or_long() { + let condition = ClusterCondition { + type_: ClusterConditionType::Available, + status: ClusterConditionStatus::False, + message: Some("This should be displayed if unhealthy".into()), + ..Default::default() + }; + + assert!(!condition.is_good()); + assert_eq!( + condition.display_short_or_long(), + "Unavailable: This should be displayed if unhealthy".to_string() + ); + + let condition = ClusterCondition { + type_: ClusterConditionType::Available, + status: ClusterConditionStatus::True, + message: Some("This should not be displayed".into()), + ..Default::default() + }; + + assert!(condition.is_good()); + assert_eq!(condition.display_short_or_long(), "Available".to_string()); + } }