argo-cd
179 строк · 6.1 Кб
1package controller
2
3import (
4"os"
5"testing"
6
7"github.com/argoproj/gitops-engine/pkg/health"
8synccommon "github.com/argoproj/gitops-engine/pkg/sync/common"
9"github.com/argoproj/gitops-engine/pkg/utils/kube"
10"github.com/stretchr/testify/assert"
11metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
13"k8s.io/apimachinery/pkg/runtime/schema"
14"sigs.k8s.io/yaml"
15
16"github.com/argoproj/argo-cd/v2/pkg/apis/application"
17appv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
18"github.com/argoproj/argo-cd/v2/util/lua"
19)
20
21var app = &appv1.Application{}
22
23func initStatuses(resources []managedResource) []appv1.ResourceStatus {
24statuses := make([]appv1.ResourceStatus, len(resources))
25for i := range resources {
26statuses[i] = appv1.ResourceStatus{Group: resources[i].Group, Kind: resources[i].Kind, Version: resources[i].Version}
27}
28return statuses
29}
30
31func resourceFromFile(filePath string) unstructured.Unstructured {
32yamlBytes, err := os.ReadFile(filePath)
33if err != nil {
34panic(err)
35}
36var res unstructured.Unstructured
37err = yaml.Unmarshal(yamlBytes, &res)
38if err != nil {
39panic(err)
40}
41return res
42}
43
44func TestSetApplicationHealth(t *testing.T) {
45failedJob := resourceFromFile("./testdata/job-failed.yaml")
46runningPod := resourceFromFile("./testdata/pod-running-restart-always.yaml")
47
48resources := []managedResource{{
49Group: "", Version: "v1", Kind: "Pod", Live: &runningPod}, {
50Group: "batch", Version: "v1", Kind: "Job", Live: &failedJob,
51}}
52resourceStatuses := initStatuses(resources)
53
54healthStatus, err := setApplicationHealth(resources, resourceStatuses, lua.ResourceHealthOverrides{}, app, true)
55assert.NoError(t, err)
56assert.Equal(t, health.HealthStatusDegraded, healthStatus.Status)
57
58assert.Equal(t, resourceStatuses[0].Health.Status, health.HealthStatusHealthy)
59assert.Equal(t, resourceStatuses[1].Health.Status, health.HealthStatusDegraded)
60
61// now mark the job as a hook and retry. it should ignore the hook and consider the app healthy
62failedJob.SetAnnotations(map[string]string{synccommon.AnnotationKeyHook: "PreSync"})
63healthStatus, err = setApplicationHealth(resources, resourceStatuses, nil, app, true)
64assert.NoError(t, err)
65assert.Equal(t, health.HealthStatusHealthy, healthStatus.Status)
66}
67
68func TestSetApplicationHealth_ResourceHealthNotPersisted(t *testing.T) {
69failedJob := resourceFromFile("./testdata/job-failed.yaml")
70
71resources := []managedResource{{
72Group: "batch", Version: "v1", Kind: "Job", Live: &failedJob,
73}}
74resourceStatuses := initStatuses(resources)
75
76healthStatus, err := setApplicationHealth(resources, resourceStatuses, lua.ResourceHealthOverrides{}, app, false)
77assert.NoError(t, err)
78assert.Equal(t, health.HealthStatusDegraded, healthStatus.Status)
79
80assert.Nil(t, resourceStatuses[0].Health)
81}
82
83func TestSetApplicationHealth_MissingResource(t *testing.T) {
84pod := resourceFromFile("./testdata/pod-running-restart-always.yaml")
85
86resources := []managedResource{{
87Group: "", Version: "v1", Kind: "Pod", Target: &pod}, {}}
88resourceStatuses := initStatuses(resources)
89
90healthStatus, err := setApplicationHealth(resources, resourceStatuses, lua.ResourceHealthOverrides{}, app, true)
91assert.NoError(t, err)
92assert.Equal(t, health.HealthStatusMissing, healthStatus.Status)
93}
94
95func TestSetApplicationHealth_MissingResourceNoBuiltHealthCheck(t *testing.T) {
96cm := resourceFromFile("./testdata/configmap.yaml")
97
98resources := []managedResource{{
99Group: "", Version: "v1", Kind: "ConfigMap", Target: &cm}}
100resourceStatuses := initStatuses(resources)
101
102t.Run("NoOverride", func(t *testing.T) {
103healthStatus, err := setApplicationHealth(resources, resourceStatuses, lua.ResourceHealthOverrides{}, app, true)
104assert.NoError(t, err)
105assert.Equal(t, health.HealthStatusHealthy, healthStatus.Status)
106assert.Equal(t, resourceStatuses[0].Health.Status, health.HealthStatusMissing)
107})
108
109t.Run("HasOverride", func(t *testing.T) {
110healthStatus, err := setApplicationHealth(resources, resourceStatuses, lua.ResourceHealthOverrides{
111lua.GetConfigMapKey(schema.GroupVersionKind{Version: "v1", Kind: "ConfigMap"}): appv1.ResourceOverride{
112HealthLua: "some health check",
113},
114}, app, true)
115assert.NoError(t, err)
116assert.Equal(t, health.HealthStatusMissing, healthStatus.Status)
117})
118}
119
120func newAppLiveObj(status health.HealthStatusCode) *unstructured.Unstructured {
121app := appv1.Application{
122ObjectMeta: metav1.ObjectMeta{
123Name: "foo",
124},
125TypeMeta: metav1.TypeMeta{
126APIVersion: "argoproj.io/v1alpha1",
127Kind: application.ApplicationKind,
128},
129Status: appv1.ApplicationStatus{
130Health: appv1.HealthStatus{
131Status: status,
132},
133},
134}
135
136return kube.MustToUnstructured(&app)
137}
138
139func TestChildAppHealth(t *testing.T) {
140overrides := lua.ResourceHealthOverrides{
141lua.GetConfigMapKey(appv1.ApplicationSchemaGroupVersionKind): appv1.ResourceOverride{
142HealthLua: `
143hs = {}
144hs.status = "Progressing"
145hs.message = ""
146if obj.status ~= nil then
147if obj.status.health ~= nil then
148hs.status = obj.status.health.status
149if obj.status.health.message ~= nil then
150hs.message = obj.status.health.message
151end
152end
153end
154return hs`,
155},
156}
157
158t.Run("ChildAppDegraded", func(t *testing.T) {
159degradedApp := newAppLiveObj(health.HealthStatusDegraded)
160resources := []managedResource{{
161Group: application.Group, Version: "v1alpha1", Kind: application.ApplicationKind, Live: degradedApp}, {}}
162resourceStatuses := initStatuses(resources)
163
164healthStatus, err := setApplicationHealth(resources, resourceStatuses, overrides, app, true)
165assert.NoError(t, err)
166assert.Equal(t, health.HealthStatusDegraded, healthStatus.Status)
167})
168
169t.Run("ChildAppMissing", func(t *testing.T) {
170degradedApp := newAppLiveObj(health.HealthStatusMissing)
171resources := []managedResource{{
172Group: application.Group, Version: "v1alpha1", Kind: application.ApplicationKind, Live: degradedApp}, {}}
173resourceStatuses := initStatuses(resources)
174
175healthStatus, err := setApplicationHealth(resources, resourceStatuses, overrides, app, true)
176assert.NoError(t, err)
177assert.Equal(t, health.HealthStatusHealthy, healthStatus.Status)
178})
179}
180