argo-cd

Форк
0
/
health_test.go 
179 строк · 6.1 Кб
1
package controller
2

3
import (
4
	"os"
5
	"testing"
6

7
	"github.com/argoproj/gitops-engine/pkg/health"
8
	synccommon "github.com/argoproj/gitops-engine/pkg/sync/common"
9
	"github.com/argoproj/gitops-engine/pkg/utils/kube"
10
	"github.com/stretchr/testify/assert"
11
	metav1 "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"
17
	appv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
18
	"github.com/argoproj/argo-cd/v2/util/lua"
19
)
20

21
var app = &appv1.Application{}
22

23
func initStatuses(resources []managedResource) []appv1.ResourceStatus {
24
	statuses := make([]appv1.ResourceStatus, len(resources))
25
	for i := range resources {
26
		statuses[i] = appv1.ResourceStatus{Group: resources[i].Group, Kind: resources[i].Kind, Version: resources[i].Version}
27
	}
28
	return statuses
29
}
30

31
func resourceFromFile(filePath string) unstructured.Unstructured {
32
	yamlBytes, err := os.ReadFile(filePath)
33
	if err != nil {
34
		panic(err)
35
	}
36
	var res unstructured.Unstructured
37
	err = yaml.Unmarshal(yamlBytes, &res)
38
	if err != nil {
39
		panic(err)
40
	}
41
	return res
42
}
43

44
func TestSetApplicationHealth(t *testing.T) {
45
	failedJob := resourceFromFile("./testdata/job-failed.yaml")
46
	runningPod := resourceFromFile("./testdata/pod-running-restart-always.yaml")
47

48
	resources := []managedResource{{
49
		Group: "", Version: "v1", Kind: "Pod", Live: &runningPod}, {
50
		Group: "batch", Version: "v1", Kind: "Job", Live: &failedJob,
51
	}}
52
	resourceStatuses := initStatuses(resources)
53

54
	healthStatus, err := setApplicationHealth(resources, resourceStatuses, lua.ResourceHealthOverrides{}, app, true)
55
	assert.NoError(t, err)
56
	assert.Equal(t, health.HealthStatusDegraded, healthStatus.Status)
57

58
	assert.Equal(t, resourceStatuses[0].Health.Status, health.HealthStatusHealthy)
59
	assert.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
62
	failedJob.SetAnnotations(map[string]string{synccommon.AnnotationKeyHook: "PreSync"})
63
	healthStatus, err = setApplicationHealth(resources, resourceStatuses, nil, app, true)
64
	assert.NoError(t, err)
65
	assert.Equal(t, health.HealthStatusHealthy, healthStatus.Status)
66
}
67

68
func TestSetApplicationHealth_ResourceHealthNotPersisted(t *testing.T) {
69
	failedJob := resourceFromFile("./testdata/job-failed.yaml")
70

71
	resources := []managedResource{{
72
		Group: "batch", Version: "v1", Kind: "Job", Live: &failedJob,
73
	}}
74
	resourceStatuses := initStatuses(resources)
75

76
	healthStatus, err := setApplicationHealth(resources, resourceStatuses, lua.ResourceHealthOverrides{}, app, false)
77
	assert.NoError(t, err)
78
	assert.Equal(t, health.HealthStatusDegraded, healthStatus.Status)
79

80
	assert.Nil(t, resourceStatuses[0].Health)
81
}
82

83
func TestSetApplicationHealth_MissingResource(t *testing.T) {
84
	pod := resourceFromFile("./testdata/pod-running-restart-always.yaml")
85

86
	resources := []managedResource{{
87
		Group: "", Version: "v1", Kind: "Pod", Target: &pod}, {}}
88
	resourceStatuses := initStatuses(resources)
89

90
	healthStatus, err := setApplicationHealth(resources, resourceStatuses, lua.ResourceHealthOverrides{}, app, true)
91
	assert.NoError(t, err)
92
	assert.Equal(t, health.HealthStatusMissing, healthStatus.Status)
93
}
94

95
func TestSetApplicationHealth_MissingResourceNoBuiltHealthCheck(t *testing.T) {
96
	cm := resourceFromFile("./testdata/configmap.yaml")
97

98
	resources := []managedResource{{
99
		Group: "", Version: "v1", Kind: "ConfigMap", Target: &cm}}
100
	resourceStatuses := initStatuses(resources)
101

102
	t.Run("NoOverride", func(t *testing.T) {
103
		healthStatus, err := setApplicationHealth(resources, resourceStatuses, lua.ResourceHealthOverrides{}, app, true)
104
		assert.NoError(t, err)
105
		assert.Equal(t, health.HealthStatusHealthy, healthStatus.Status)
106
		assert.Equal(t, resourceStatuses[0].Health.Status, health.HealthStatusMissing)
107
	})
108

109
	t.Run("HasOverride", func(t *testing.T) {
110
		healthStatus, err := setApplicationHealth(resources, resourceStatuses, lua.ResourceHealthOverrides{
111
			lua.GetConfigMapKey(schema.GroupVersionKind{Version: "v1", Kind: "ConfigMap"}): appv1.ResourceOverride{
112
				HealthLua: "some health check",
113
			},
114
		}, app, true)
115
		assert.NoError(t, err)
116
		assert.Equal(t, health.HealthStatusMissing, healthStatus.Status)
117
	})
118
}
119

120
func newAppLiveObj(status health.HealthStatusCode) *unstructured.Unstructured {
121
	app := appv1.Application{
122
		ObjectMeta: metav1.ObjectMeta{
123
			Name: "foo",
124
		},
125
		TypeMeta: metav1.TypeMeta{
126
			APIVersion: "argoproj.io/v1alpha1",
127
			Kind:       application.ApplicationKind,
128
		},
129
		Status: appv1.ApplicationStatus{
130
			Health: appv1.HealthStatus{
131
				Status: status,
132
			},
133
		},
134
	}
135

136
	return kube.MustToUnstructured(&app)
137
}
138

139
func TestChildAppHealth(t *testing.T) {
140
	overrides := lua.ResourceHealthOverrides{
141
		lua.GetConfigMapKey(appv1.ApplicationSchemaGroupVersionKind): appv1.ResourceOverride{
142
			HealthLua: `
143
hs = {}
144
hs.status = "Progressing"
145
hs.message = ""
146
if obj.status ~= nil then
147
  if obj.status.health ~= nil then
148
	hs.status = obj.status.health.status
149
	if obj.status.health.message ~= nil then
150
	  hs.message = obj.status.health.message
151
	end
152
  end
153
end
154
return hs`,
155
		},
156
	}
157

158
	t.Run("ChildAppDegraded", func(t *testing.T) {
159
		degradedApp := newAppLiveObj(health.HealthStatusDegraded)
160
		resources := []managedResource{{
161
			Group: application.Group, Version: "v1alpha1", Kind: application.ApplicationKind, Live: degradedApp}, {}}
162
		resourceStatuses := initStatuses(resources)
163

164
		healthStatus, err := setApplicationHealth(resources, resourceStatuses, overrides, app, true)
165
		assert.NoError(t, err)
166
		assert.Equal(t, health.HealthStatusDegraded, healthStatus.Status)
167
	})
168

169
	t.Run("ChildAppMissing", func(t *testing.T) {
170
		degradedApp := newAppLiveObj(health.HealthStatusMissing)
171
		resources := []managedResource{{
172
			Group: application.Group, Version: "v1alpha1", Kind: application.ApplicationKind, Live: degradedApp}, {}}
173
		resourceStatuses := initStatuses(resources)
174

175
		healthStatus, err := setApplicationHealth(resources, resourceStatuses, overrides, app, true)
176
		assert.NoError(t, err)
177
		assert.Equal(t, health.HealthStatusHealthy, healthStatus.Status)
178
	})
179
}
180

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.