Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pkg/app/piped/cloudprovider/kubernetes/resourcekey.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ const (
KindRoleBinding = "RoleBinding"
KindClusterRole = "ClusterRole"
KindClusterRoleBinding = "ClusterRoleBinding"
KindNameSpace = "NameSpace"

DefaultNamespace = "default"
)
Expand Down
45 changes: 45 additions & 0 deletions pkg/app/piped/cloudprovider/kubernetes/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 = "The current phase of NameSpace is unexpected"
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
}