В 22:00 МСК будет объявлен перерыв - 10 минут. Вы отдыхаете - мы обновляем!

kubelatte-ce

Форк от sbertech/kubelatte-ce
Форк
2
/
watcher_test.go 
343 строки · 12.6 Кб
1
package creation
2

3
import (
4
	"context"
5
	"fmt"
6
	"github.com/stretchr/testify/mock"
7
	v1alpha12 "gitverse.ru/synapse/kubelatte/pkg/api/v1alpha1"
8
	"gitverse.ru/synapse/kubelatte/pkg/kubeapi"
9
	"gitverse.ru/synapse/kubelatte/pkg/observability/logger/lib"
10
	"gitverse.ru/synapse/kubelatte/pkg/operator/controllers/clientset"
11
	"gitverse.ru/synapse/kubelatte/pkg/operator/controllers/clientset/mocks"
12
	"gitverse.ru/synapse/kubelatte/pkg/operator/utils"
13
	"gitverse.ru/synapse/kubelatte/pkg/util/env"
14
	"go.uber.org/zap"
15
	"k8s.io/apimachinery/pkg/api/errors"
16
	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
17
	"k8s.io/apimachinery/pkg/runtime/schema"
18
	"k8s.io/client-go/kubernetes"
19
	"k8s.io/client-go/rest"
20
	"k8s.io/client-go/rest/fake"
21
	"os"
22
	"testing"
23
)
24

25
func TestWatcherController(t *testing.T) {
26
	lib.ZapLogger = zap.NewNop()
27

28
	env.InitEnvOperator()
29
	os.Setenv("KBLT_CREATOR", "true")
30
	os.Setenv("KBLT_CREATOR", "true")
31

32
	kubeapi.GetClient = func() *kubernetes.Clientset {
33
		return kubernetes.New(&fake.RESTClient{})
34
	}
35

36
	ti := v1alpha12.TriggerInstance{
37
		Status: v1alpha12.TriggerInstanceStatus{
38
			ResourceStatus: []v1alpha12.ResourceStatus{
39
				{
40
					Name:       "pod",
41
					Kind:       "Pod",
42
					ApiVersion: "v1",
43
					Message:    "REMOVED",
44
					Phase:      "",
45
					Status:     "REMOVED",
46
				},
47
			},
48
		},
49
	}
50
	ti2 := v1alpha12.TriggerInstance{
51
		ObjectMeta: v1.ObjectMeta{
52
			Name:      "test",
53
			Namespace: "test",
54
			Labels: map[string]string{
55
				"test": "test",
56
			},
57
			Annotations: map[string]string{
58
				"test": "test",
59
			},
60
		},
61
		Status: v1alpha12.TriggerInstanceStatus{
62
			ResourceStatus: []v1alpha12.ResourceStatus{
63
				{
64
					Name:       "pod",
65
					Kind:       "Pod",
66
					ApiVersion: "v1",
67
					Message:    "REMOVED",
68
					Phase:      "",
69
					Status:     "REMOVED",
70
				},
71
				{
72
					Name:       "pod",
73
					Kind:       "Pod",
74
					ApiVersion: "v1",
75
					Message:    "",
76
					Phase:      "",
77
					Status:     "",
78
				},
79
			},
80
		},
81
	}
82

83
	templateClient := mocks.NewTemplateInterface(t)
84
	triggerClient := mocks.NewTriggerInterface(t)
85
	scopeClient := mocks.NewScopeInterface(t)
86
	triggerInstanceClient := mocks.NewTriggerInstanceInterface(t)
87
	triggerInstanceClient.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&ti, nil).Maybe()
88
	triggerInstanceClient.On("updateStatus", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
89

90
	clt := clientset.V1Alpha1Client{
91
		TriggerClient:         triggerClient,
92
		TemplateClient:        templateClient,
93
		ScopeClient:           scopeClient,
94
		TriggerInstanceClient: triggerInstanceClient,
95
	}
96

97
	utils.Cl = &clt
98
	kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
99
		return &kubeapi.ResourceMeta{
100
			Name:         "Pod",
101
			Plural:       "pods",
102
			Path:         "api",
103
			Namespaced:   true,
104
			GroupVersion: "v1",
105
		}
106
	}
107

108
	w := Watcher{
109
		reSyncPeriod: 0,
110
		watchObjects: map[string]v1alpha12.TriggerInstance{},
111
	}
112

113
	t.Run("Start", func(t *testing.T) {
114
		w.StartWatcher()
115
	})
116

117
	t.Run("updateSyncPeriod", func(t *testing.T) {
118
		w.updateSyncPeriod(uint64(5))
119
	})
120

121
	t.Run("addNewObject", func(t *testing.T) {
122
		w.addNewObject(ti)
123
	})
124

125
	podJson := "{\"kind\":\"Pod\",\"apiVersion\":\"v1\",\"metadata\":{\"generateName\":\"keymaker-keymaker-769579fd65-\",\"creationTimestamp\":null,\"labels\":{\"app.kubernetes.io/instance\":\"keymaker\",\"app.kubernetes.io/managed-by\":\"spinnaker\",\"app.kubernetes.io/name\":\"keymaker\",\"pod-template-hash\":\"769579fd65\"},\"annotations\":{\"artifact.spinnaker.io/location\":\"keymaker\",\"artifact.spinnaker.io/name\":\"keymaker-keymaker\",\"artifact.spinnaker.io/type\":\"kubernetes/deployment\",\"moniker.spinnaker.io/application\":\"securitykaaskeymaker\",\"moniker.spinnaker.io/cluster\":\"deployment keymaker-keymaker\",\"keymaker.k8s-integration.sfdc.com/inject\":\"true\",\"madkub.k8s-integration.sfdc.com/inject\":\"true\",\"port/value\":\"1111\"},\"ownerReferences\":[{\"apiVersion\":\"apps/v1\",\"kind\":\"ReplicaSet\",\"name\":\"keymaker-keymaker-769579fd65\",\"uid\":\"dcdda283-a4fc-11e9-a276-42010a3e0104\",\"controller\":true,\"blockOwnerDeletion\":true}]},\"spec\":{\"volumes\":[{\"name\":\"kaas-keymaker-orlgsgcsl34imsg6-token-kn2t8\",\"secret\":{\"secretName\":\"kaas-keymaker-orlgsgcsl34imsg6-token-kn2t8\"}}],\"initContainers\":[{\"name\":\"ca-populator-original\",\"image\":\"791719295754.dkr.ecr.us-east-2.amazonaws.com/dva/pki_aws_bootstrap:6\",\"args\":[\"/bin/cp\",\"/etc/ssl/certs/cacerts.pem\",\"/etc/pki_service/ca/cacerts.pem\"],\"resources\":{},\"terminationMessagePath\":\"/dev/termination-log\",\"terminationMessagePolicy\":\"File\",\"imagePullPolicy\":\"IfNotPresent\"},{\"name\":\"madkub-init-original\",\"image\":\"791719295754.dkr.ecr.us-east-2.amazonaws.com/dva/pki_aws_bootstrap:6\",\"args\":[\"/bin/cp\",\"/etc/ssl/certs/cacerts.pem\",\"/etc/pki_service/ca/cacerts.pem\"],\"resources\":{},\"terminationMessagePath\":\"/dev/termination-log\",\"terminationMessagePolicy\":\"File\",\"imagePullPolicy\":\"IfNotPresent\"}],\"containers\":[{\"name\":\"keymaker-original\",\"image\":\"gcr.io/gsf-mgmt-devmvp-spinnaker/dva/keymaker-client:latest\",\"command\":[\"sleep\"],\"args\":[\"infinity\"],\"ports\":[{\"name\":\"http\",\"containerPort\":7020,\"protocol\":\"TCP\"}],\"resources\":{},\"volumeMounts\":[{\"name\":\"kaas-keymaker-orlgsgcsl34imsg6-token-kn2t8\",\"readOnly\":true,\"mountPath\":\"/var/run/secrets/kubernetes.io/serviceaccount\"}],\"terminationMessagePath\":\"/dev/termination-log\",\"terminationMessagePolicy\":\"File\",\"imagePullPolicy\":\"Always\"}],\"restartPolicy\":\"Always\",\"terminationGracePeriodSeconds\":30,\"dnsPolicy\":\"ClusterFirst\",\"serviceAccountName\":\"kaas-keymaker-orlgsgcsl34imsg6\",\"serviceAccount\":\"kaas-keymaker-orlgsgcsl34imsg6\",\"automountServiceAccountToken\":true,\"securityContext\":{},\"schedulerName\":\"default-scheduler\",\"tolerations\":[{\"key\":\"node.kubernetes.io/not-ready\",\"operator\":\"Exists\",\"effect\":\"NoExecute\",\"tolerationSeconds\":300},{\"key\":\"node.kubernetes.io/unreachable\",\"operator\":\"Exists\",\"effect\":\"NoExecute\",\"tolerationSeconds\":300}],\"priority\":0},\"status\":{}}"
126

127
	t.Run("updateStatus all removed", func(t *testing.T) {
128
		w.updateStatus()
129
	})
130

131
	triggerInstanceClient = mocks.NewTriggerInstanceInterface(t)
132
	triggerInstanceClient.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&ti2, nil).Maybe()
133
	triggerInstanceClient.On("updateStatus", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
134

135
	clt = clientset.V1Alpha1Client{
136
		TriggerClient:         triggerClient,
137
		TemplateClient:        templateClient,
138
		ScopeClient:           scopeClient,
139
		TriggerInstanceClient: triggerInstanceClient,
140
	}
141

142
	utils.Cl = &clt
143

144
	t.Run("removeObject", func(t *testing.T) {
145
		w.removeObject(ti)
146
	})
147

148
	kubeapi.GetRawResourceFromKubeApi = func(ctx context.Context, client rest.Interface, resourceMeta *kubeapi.ResourceMeta, resourceName string, namespaceName string) ([]byte, error) {
149
		return []byte(podJson), nil
150
	}
151
	triggerInstanceClient.On("UpdateStatus", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
152
	t.Run("updateStatus", func(t *testing.T) {
153
		w.addNewObject(ti2)
154
		w.updateStatus()
155
	})
156
}
157

158
func TestCheckTiNotFound(t *testing.T) {
159
	lib.ZapLogger = zap.NewNop()
160

161
	kubeapi.GetClient = func() *kubernetes.Clientset {
162
		return kubernetes.New(&fake.RESTClient{})
163
	}
164

165
	ti := v1alpha12.TriggerInstance{
166
		Status: v1alpha12.TriggerInstanceStatus{
167
			ResourceStatus: []v1alpha12.ResourceStatus{
168
				{
169
					Name:       "pod",
170
					Kind:       "Pod",
171
					ApiVersion: "v1",
172
					Message:    "REMOVED",
173
					Phase:      "",
174
					Status:     "REMOVED",
175
				},
176
			},
177
		},
178
	}
179

180
	templateClient := mocks.NewTemplateInterface(t)
181
	triggerClient := mocks.NewTriggerInterface(t)
182
	scopeClient := mocks.NewScopeInterface(t)
183
	triggerInstanceClient := mocks.NewTriggerInstanceInterface(t)
184
	triggerInstanceClient.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.NewNotFound(schema.GroupResource{}, "not found")).Maybe()
185
	triggerInstanceClient.On("updateStatus", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
186

187
	clt := clientset.V1Alpha1Client{
188
		TriggerClient:         triggerClient,
189
		TemplateClient:        templateClient,
190
		ScopeClient:           scopeClient,
191
		TriggerInstanceClient: triggerInstanceClient,
192
	}
193

194
	utils.Cl = &clt
195
	kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
196
		return &kubeapi.ResourceMeta{
197
			Name:         "Pod",
198
			Plural:       "pods",
199
			Path:         "api",
200
			Namespaced:   true,
201
			GroupVersion: "v1",
202
		}
203
	}
204

205
	w := Watcher{
206
		reSyncPeriod: 0,
207
		watchObjects: map[string]v1alpha12.TriggerInstance{
208
			ti.GetNamespacedName(): ti,
209
		},
210
	}
211

212
	env.InitEnvOperator()
213
	os.Setenv("KBLT_CREATOR", "true")
214
	t.Run("updateStatus ti not found", func(t *testing.T) {
215
		w.updateStatus()
216
	})
217
}
218

219
func TestCheckResourceNotFound(t *testing.T) {
220
	lib.ZapLogger = zap.NewNop()
221

222
	kubeapi.GetClient = func() *kubernetes.Clientset {
223
		return kubernetes.New(&fake.RESTClient{})
224
	}
225

226
	ti := v1alpha12.TriggerInstance{
227
		Status: v1alpha12.TriggerInstanceStatus{
228
			ResourceStatus: []v1alpha12.ResourceStatus{
229
				{
230
					Name:       "pod",
231
					Kind:       "Pod",
232
					ApiVersion: "v1",
233
					Message:    "Normal",
234
					Phase:      "",
235
					Status:     "Normal",
236
				},
237
			},
238
		},
239
	}
240

241
	templateClient := mocks.NewTemplateInterface(t)
242
	triggerClient := mocks.NewTriggerInterface(t)
243
	scopeClient := mocks.NewScopeInterface(t)
244
	triggerInstanceClient := mocks.NewTriggerInstanceInterface(t)
245
	triggerInstanceClient.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&ti, nil).Maybe()
246
	triggerInstanceClient.On("updateStatus", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
247
	triggerInstanceClient.On("UpdateStatus", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
248
	clt := clientset.V1Alpha1Client{
249
		TriggerClient:         triggerClient,
250
		TemplateClient:        templateClient,
251
		ScopeClient:           scopeClient,
252
		TriggerInstanceClient: triggerInstanceClient,
253
	}
254

255
	utils.Cl = &clt
256
	kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
257
		return &kubeapi.ResourceMeta{
258
			Name:         "Pod",
259
			Plural:       "pods",
260
			Path:         "api",
261
			Namespaced:   true,
262
			GroupVersion: "v1",
263
		}
264
	}
265

266
	w := Watcher{
267
		reSyncPeriod: 0,
268
		watchObjects: map[string]v1alpha12.TriggerInstance{
269
			ti.GetNamespacedName(): ti,
270
		},
271
	}
272

273
	kubeapi.GetRawResourceFromKubeApi = func(ctx context.Context, client rest.Interface, resourceMeta *kubeapi.ResourceMeta, resourceName string, namespaceName string) ([]byte, error) {
274
		return nil, errors.NewNotFound(schema.GroupResource{}, "not found")
275
	}
276

277
	t.Run("updateStatus resource not found", func(t *testing.T) {
278
		w.updateStatus()
279
	})
280
}
281

282
func TestCheckResourceError(t *testing.T) {
283
	lib.ZapLogger = zap.NewNop()
284

285
	kubeapi.GetClient = func() *kubernetes.Clientset {
286
		return kubernetes.New(&fake.RESTClient{})
287
	}
288

289
	ti := v1alpha12.TriggerInstance{
290
		Status: v1alpha12.TriggerInstanceStatus{
291
			ResourceStatus: []v1alpha12.ResourceStatus{
292
				{
293
					Name:       "pod",
294
					Kind:       "Pod",
295
					ApiVersion: "v1",
296
					Message:    "Normal",
297
					Phase:      "",
298
					Status:     "Normal",
299
				},
300
			},
301
		},
302
	}
303

304
	templateClient := mocks.NewTemplateInterface(t)
305
	triggerClient := mocks.NewTriggerInterface(t)
306
	scopeClient := mocks.NewScopeInterface(t)
307
	triggerInstanceClient := mocks.NewTriggerInstanceInterface(t)
308
	triggerInstanceClient.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&ti, nil).Maybe()
309
	triggerInstanceClient.On("updateStatus", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
310

311
	clt := clientset.V1Alpha1Client{
312
		TriggerClient:         triggerClient,
313
		TemplateClient:        templateClient,
314
		ScopeClient:           scopeClient,
315
		TriggerInstanceClient: triggerInstanceClient,
316
	}
317

318
	utils.Cl = &clt
319
	kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
320
		return &kubeapi.ResourceMeta{
321
			Name:         "Pod",
322
			Plural:       "pods",
323
			Path:         "api",
324
			Namespaced:   true,
325
			GroupVersion: "v1",
326
		}
327
	}
328

329
	w := Watcher{
330
		reSyncPeriod: 0,
331
		watchObjects: map[string]v1alpha12.TriggerInstance{
332
			ti.GetNamespacedName(): ti,
333
		},
334
	}
335

336
	kubeapi.GetRawResourceFromKubeApi = func(ctx context.Context, client rest.Interface, resourceMeta *kubeapi.ResourceMeta, resourceName string, namespaceName string) ([]byte, error) {
337
		return nil, fmt.Errorf("resource error")
338
	}
339

340
	t.Run("updateStatus resource not found", func(t *testing.T) {
341
		w.updateStatus()
342
	})
343
}
344

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

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

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

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