From df8c66218eac18faa7c20904dac56b7b70c422ae Mon Sep 17 00:00:00 2001 From: Aditya Thebe Date: Thu, 4 Apr 2024 21:25:32 +0545 Subject: [PATCH] feat: add health check for namespace --- pkg/health/health.go | 2 ++ pkg/health/health_namespace.go | 26 +++++++++++++++++++ pkg/health/health_test.go | 5 ++++ .../testdata/namespace-terminating.yaml | 18 +++++++++++++ pkg/health/testdata/namespace.yaml | 18 +++++++++++++ 5 files changed, 69 insertions(+) create mode 100644 pkg/health/health_namespace.go create mode 100644 pkg/health/testdata/namespace-terminating.yaml create mode 100644 pkg/health/testdata/namespace.yaml diff --git a/pkg/health/health.go b/pkg/health/health.go index 513fb56..3c39cb6 100644 --- a/pkg/health/health.go +++ b/pkg/health/health.go @@ -175,6 +175,8 @@ func GetHealthCheckFunc(gvk schema.GroupVersionKind) func(obj *unstructured.Unst return getPVCHealth case PodKind: return getPodHealth + case NamespaceKind: + return getNamespaceHealth } case "batch": switch gvk.Kind { diff --git a/pkg/health/health_namespace.go b/pkg/health/health_namespace.go new file mode 100644 index 0000000..e7ab9b4 --- /dev/null +++ b/pkg/health/health_namespace.go @@ -0,0 +1,26 @@ +package health + +import ( + "fmt" + + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" +) + +func getNamespaceHealth(obj *unstructured.Unstructured) (*HealthStatus, error) { + var node v1.Namespace + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, &node); err != nil { + return nil, fmt.Errorf("failed to convert unstructured Node to typed: %v", err) + } + + if node.Status.Phase == v1.NamespaceActive { + return &HealthStatus{ + Status: HealthStatusHealthy, + }, nil + } + + return &HealthStatus{ + Status: HealthStatusDeleting, + }, nil +} diff --git a/pkg/health/health_test.go b/pkg/health/health_test.go index 15cef78..cf3a9ba 100644 --- a/pkg/health/health_test.go +++ b/pkg/health/health_test.go @@ -33,6 +33,11 @@ func getHealthStatus(yamlPath string, t *testing.T) *health.HealthStatus { return health } +func TestNamespace(t *testing.T) { + assertAppHealth(t, "./testdata/namespace.yaml", health.HealthStatusHealthy) + assertAppHealth(t, "./testdata/namespace-terminating.yaml", health.HealthStatusDeleting) +} + func TestCertificate(t *testing.T) { assertAppHealth(t, "./testdata/certificate-healthy.yaml", health.HealthStatusHealthy) } diff --git a/pkg/health/testdata/namespace-terminating.yaml b/pkg/health/testdata/namespace-terminating.yaml new file mode 100644 index 0000000..32e507f --- /dev/null +++ b/pkg/health/testdata/namespace-terminating.yaml @@ -0,0 +1,18 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + creationTimestamp: '2024-02-10T10:27:15Z' + labels: + kubernetes.io/metadata.name: media + kustomize.toolkit.fluxcd.io/name: flux-system + kustomize.toolkit.fluxcd.io/namespace: flux-system + kustomize.toolkit.fluxcd.io/prune: disabled + name: media + resourceVersion: '4518738' + uid: c1b2dc7f-7070-4ee5-9ae0-e43df5523cd8 +spec: + finalizers: + - kubernetes +status: + phase: Terminating diff --git a/pkg/health/testdata/namespace.yaml b/pkg/health/testdata/namespace.yaml new file mode 100644 index 0000000..f4a46b5 --- /dev/null +++ b/pkg/health/testdata/namespace.yaml @@ -0,0 +1,18 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + creationTimestamp: '2024-02-10T10:27:15Z' + labels: + kubernetes.io/metadata.name: media + kustomize.toolkit.fluxcd.io/name: flux-system + kustomize.toolkit.fluxcd.io/namespace: flux-system + kustomize.toolkit.fluxcd.io/prune: disabled + name: media + resourceVersion: '4518738' + uid: c1b2dc7f-7070-4ee5-9ae0-e43df5523cd8 +spec: + finalizers: + - kubernetes +status: + phase: Active