From 30191c8f64a39694ea1314bde3191374528badf3 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Tue, 14 Mar 2023 15:02:06 +0100 Subject: [PATCH 01/36] added status mod --- src/cluster_resources.rs | 74 +++++++++++++++++++++++++++++++--------- src/lib.rs | 1 + src/status/mod.rs | 63 ++++++++++++++++++++++++++++++++++ 3 files changed, 122 insertions(+), 16 deletions(-) create mode 100644 src/status/mod.rs diff --git a/src/cluster_resources.rs b/src/cluster_resources.rs index e129299c7..e8b6874a7 100644 --- a/src/cluster_resources.rs +++ b/src/cluster_resources.rs @@ -5,6 +5,19 @@ use std::{ fmt::Debug, }; +use k8s_openapi::{ + api::{ + apps::v1::{DaemonSetStatus, Deployment, DeploymentStatus, StatefulSetStatus}, + core::v1::Secret, + core::v1::{Pod, PodStatus, ServiceAccount}, + rbac::v1::RoleBinding, + }, + NamespaceResourceScope, +}; +use kube::core::ErrorResponse; +use serde::{de::DeserializeOwned, Serialize}; +use tracing::{debug, info}; + use crate::{ client::{Client, GetApi}, error::{Error, OperatorResult}, @@ -19,13 +32,6 @@ use crate::{ labels::{APP_INSTANCE_LABEL, APP_MANAGED_BY_LABEL, APP_NAME_LABEL}, utils::format_full_controller_name, }; -use k8s_openapi::{ - api::{core::v1::Secret, core::v1::ServiceAccount, rbac::v1::RoleBinding}, - NamespaceResourceScope, -}; -use kube::core::ErrorResponse; -use serde::{de::DeserializeOwned, Serialize}; -use tracing::{debug, info}; /// A cluster resource handled by [`ClusterResources`]. /// @@ -44,11 +50,17 @@ pub trait ClusterResource: } impl ClusterResource for ConfigMap {} + impl ClusterResource for DaemonSet {} + impl ClusterResource for Service {} + impl ClusterResource for StatefulSet {} + impl ClusterResource for ServiceAccount {} + impl ClusterResource for RoleBinding {} + impl ClusterResource for Secret {} /// A structure containing the cluster resources. @@ -96,7 +108,7 @@ impl ClusterResource for Secret {} /// DeleteOrphanedClusterResources { /// source: stackable_operator::error::Error, /// }, -/// }; +/// } /// /// async fn reconcile(app: Arc, client: Arc) -> Result { /// let validated_config = ValidatedRoleConfigByPropertyKind::default(); @@ -397,7 +409,35 @@ impl ClusterResources { &self, client: &Client, ) -> OperatorResult> { - let label_selector = LabelSelector { + let label_selector = self.label_selector(); + + let resources = client + .list_with_label_selector::(&self.namespace, &label_selector) + .await?; + + Ok(resources) + } + + pub async fn resources_status(self, client: &Client) -> OperatorResult { + let label_selector = self.label_selector(); + + let (dset, sts, deps, pods) = tokio::try_join!( + client.list_with_label_selector::(&self.namespace, &label_selector), + client.list_with_label_selector::(&self.namespace, &label_selector), + client.list_with_label_selector::(&self.namespace, &label_selector), + client.list_with_label_selector::(&self.namespace, &label_selector) + )?; + + Ok(ClusterResourcesStatus { + stateful_set_status: sts.iter().filter_map(|sts| sts.status.clone()).collect(), + daemon_set_status: dset.iter().filter_map(|sts| sts.status.clone()).collect(), + deployment_status: deps.iter().filter_map(|sts| sts.status.clone()).collect(), + pod_status: pods.iter().filter_map(|sts| sts.status.clone()).collect(), + }) + } + + fn label_selector(&self) -> LabelSelector { + LabelSelector { match_expressions: Some(vec![ LabelSelectorRequirement { key: APP_INSTANCE_LABEL.into(), @@ -416,12 +456,14 @@ impl ClusterResources { }, ]), ..Default::default() - }; - - let resources = client - .list_with_label_selector::(&self.namespace, &label_selector) - .await?; - - Ok(resources) + } } } + +#[derive(Default, PartialEq)] +pub struct ClusterResourcesStatus { + stateful_set_status: Vec, + daemon_set_status: Vec, + deployment_status: Vec, + pod_status: Vec, +} diff --git a/src/lib.rs b/src/lib.rs index d7ad9e6af..73b26be83 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -17,6 +17,7 @@ pub mod pod_utils; pub mod product_config_utils; pub mod product_logging; pub mod role_utils; +pub mod status; pub mod utils; pub mod validation; pub mod yaml; diff --git a/src/status/mod.rs b/src/status/mod.rs new file mode 100644 index 000000000..2b86ebaf5 --- /dev/null +++ b/src/status/mod.rs @@ -0,0 +1,63 @@ +use k8s_openapi::apimachinery::pkg::apis::meta::v1::Time; + +use crate::cluster_resources::ClusterResourcesStatus; + +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +#[derive( + strum::Display, Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize, +)] +#[serde(rename_all = "camelCase")] +pub enum ClusterConditionType { + #[default] + Available, + Degraded, + Progressing, + Paused, + Stopped, +} + +#[derive( + strum::Display, Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize, +)] +#[serde(rename_all = "camelCase")] +pub enum ClusterConditionStatus { + #[default] + True, + False, + Unknown, +} + +#[derive(Clone, Debug, Default, PartialEq, Eq)] +pub struct ClusterCondition { + /// Last time the condition transitioned from one status to another. + pub last_transition_time: Option