diff --git a/pkg/app/piped/cloudprovider/kubernetes/resourcekey.go b/pkg/app/piped/cloudprovider/kubernetes/resourcekey.go index bd2fc0d896..8a9852ea11 100644 --- a/pkg/app/piped/cloudprovider/kubernetes/resourcekey.go +++ b/pkg/app/piped/cloudprovider/kubernetes/resourcekey.go @@ -76,6 +76,7 @@ const ( KindRoleBinding = "RoleBinding" KindClusterRole = "ClusterRole" KindClusterRoleBinding = "ClusterRoleBinding" + KindNameSpace = "NameSpace" DefaultNamespace = "default" ) diff --git a/pkg/app/piped/cloudprovider/kubernetes/state.go b/pkg/app/piped/cloudprovider/kubernetes/state.go index c2a60c1bf0..ca0b37fa25 100644 --- a/pkg/app/piped/cloudprovider/kubernetes/state.go +++ b/pkg/app/piped/cloudprovider/kubernetes/state.go @@ -108,6 +108,8 @@ func determineResourceHealth(key ResourceKey, obj *unstructured.Unstructured) (s return determineClusterRoleHealth(obj) case KindClusterRoleBinding: return determineClusterRoleBindingHealth(obj) + case KindNameSpace: + return determineNameSpace(obj) default: desc = "Unimplemented or unknown resource" return @@ -534,3 +536,46 @@ func determineServiceAccountHealth(obj *unstructured.Unstructured) (status model status = model.KubernetesResourceState_HEALTHY return } + +func determineNameSpace(obj *unstructured.Unstructured) (status model.KubernetesResourceState_HealthStatus, desc string) { + ns := &corev1.Namespace{} + err := scheme.Scheme.Convert(obj, ns, nil) + if err != nil { + status = model.KubernetesResourceState_OTHER + desc = fmt.Sprintf("Unexpected error while calculating: unable to convert %T to %T: %v", obj, ns, err) + return + } + + switch ns.Status.Phase { + case corev1.NamespaceActive: + // Go to determine based on the status' conditions. + case corev1.NamespaceTerminating: + status = model.KubernetesResourceState_OTHER + desc = "NameSpace is gracefully terminated" + return + default: + status = model.KubernetesResourceState_OTHER + desc = fmt.Sprintf("The NameSpace is at an unexpected phase: %s", ns.Status.Phase) + return + } + + status = model.KubernetesResourceState_HEALTHY + + var cond *corev1.NamespaceCondition + for i := range ns.Status.Conditions { + c := ns.Status.Conditions[i] + switch c.Type { + case corev1.NamespaceDeletionDiscoveryFailure, corev1.NamespaceDeletionContentFailure, corev1.NamespaceDeletionGVParsingFailure: + cond = &c + } + if cond != nil { + break + } + } + + if cond != nil && cond.Status == corev1.ConditionTrue { + status = model.KubernetesResourceState_OTHER + desc = cond.Message + } + return +}