kubelatte-ce

Форк
2
Форк от sbertech/kubelatte-ce
/
sideeffect_op_create_test.go 
327 строк · 11.3 Кб
1
package sideeffect
2

3
import (
4
	"context"
5
	"errors"
6
	"github.com/stretchr/testify/mock"
7
	"gitverse.ru/synapse/kubelatte/pkg/api/v1alpha1"
8
	"gitverse.ru/synapse/kubelatte/pkg/kubeapi"
9
	mocks2 "gitverse.ru/synapse/kubelatte/pkg/operator/controllers/clientset/mocks"
10
	semodles "gitverse.ru/synapse/kubelatte/pkg/sideeffect"
11
	"gitverse.ru/synapse/kubelatte/pkg/storage"
12
	"gitverse.ru/synapse/kubelatte/pkg/util/env"
13
	errors2 "k8s.io/apimachinery/pkg/api/errors"
14
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
15
	"k8s.io/apimachinery/pkg/runtime/schema"
16
	"k8s.io/client-go/kubernetes"
17
	"net/http"
18
	"testing"
19
	"time"
20
)
21

22
func TestController_ApplySideEffectCreate(t *testing.T) {
23
	type args struct {
24
		info *semodles.SE
25
	}
26
	tests := []struct {
27
		name     string
28
		args     args
29
		trigger  v1alpha1.Trigger
30
		template v1alpha1.Template
31
		setVars  func()
32
	}{
33
		{
34
			name: "err parent publication",
35
			setVars: func() {
36
				kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
37
					return &kubeapi.ResourceMeta{
38
						Name:         "Pod",
39
						Plural:       "pods",
40
						Path:         "api",
41
						Namespaced:   true,
42
						GroupVersion: "v1",
43
					}
44
				}
45

46
				kubeapi.GetResource = func(ctx context.Context, resourceMeta *kubeapi.ResourceMeta, resourceName string, namespaceName string) ([]byte, error) {
47
					return nil, errors2.NewNotFound(schema.GroupResource{}, "Pod test")
48
				}
49
			},
50
			args: args{
51
				info: &semodles.SE{
52
					Configs: semodles.Configs{
53
						Kind:       "Pod",
54
						ApiVersion: "v1",
55
						ParentTag:  0,
56
						Metadata: semodles.Metadata{
57
							Namespace: "kblt-dev",
58
							Name:      "podik :D ! XD",
59
						},
60
						TriggerRef: semodles.TriggerRef{
61
							Name:             "triggName",
62
							SideEffectConfig: "sideEffThis",
63
						},
64
						TemplateRefs: []string{"templNs/templName"},
65
					},
66
				},
67
			},
68
			trigger: v1alpha1.Trigger{
69
				ObjectMeta: metav1.ObjectMeta{Name: "triggName"},
70
				Spec: v1alpha1.TriggerSpec{
71
					SideEffectConfigs: []v1alpha1.SideEffectConfig{{
72
						Name:         "sideEffThis",
73
						TemplateRefs: []string{"templNs/templName"},
74
					}}},
75
			},
76
			template: v1alpha1.Template{
77
				ObjectMeta: metav1.ObjectMeta{
78
					Namespace: "templNs",
79
					Name:      "templName",
80
				},
81
			},
82
		},
83
		{
84
			name: "Unknown parent publication",
85
			setVars: func() {
86
				kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
87
					return &kubeapi.ResourceMeta{
88
						Name:         "Pod",
89
						Plural:       "pods",
90
						Path:         "api",
91
						Namespaced:   true,
92
						GroupVersion: "v1",
93
					}
94
				}
95

96
				kubeapi.GetResource = func(ctx context.Context, resourceMeta *kubeapi.ResourceMeta, resourceName string, namespaceName string) ([]byte, error) {
97
					return []byte("kind: Pod"), nil
98
				}
99
				env.TimeoutSideEffectParentPublicationWaiting = 1 * time.Second
100
				emptyParentUpdateChecker = func(_ []byte, _ int64) semodles.ParentStatus {
101
					return semodles.Unknown
102
				}
103
			},
104
			args: args{
105
				info: &semodles.SE{
106
					Configs: semodles.Configs{
107
						Kind:       "Pod",
108
						ApiVersion: "v1",
109
						ParentTag:  0,
110
						Metadata: semodles.Metadata{
111
							Namespace: "kblt-dev",
112
							Name:      "podik :D ! XD",
113
						},
114
						TriggerRef: semodles.TriggerRef{
115
							Name:             "triggName",
116
							SideEffectConfig: "sideEffThis",
117
						},
118
						TemplateRefs: []string{"templNs/templName"},
119
					},
120
				},
121
			},
122
			trigger: v1alpha1.Trigger{
123
				ObjectMeta: metav1.ObjectMeta{Name: "triggName"},
124
				Spec: v1alpha1.TriggerSpec{
125
					SideEffectConfigs: []v1alpha1.SideEffectConfig{{
126
						Name:         "sideEffThis",
127
						TemplateRefs: []string{"templNs/templName"},
128
					}}},
129
			},
130
			template: v1alpha1.Template{
131
				ObjectMeta: metav1.ObjectMeta{
132
					Namespace: "templNs",
133
					Name:      "templName",
134
				},
135
			},
136
		},
137
		{
138
			name: "getResourceInfo err",
139
			setVars: func() {
140
				kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
141
					return &kubeapi.ResourceMeta{
142
						Name:         "Pod",
143
						Plural:       "pods",
144
						Path:         "api",
145
						Namespaced:   true,
146
						GroupVersion: "v1",
147
					}
148
				}
149

150
				kubeapi.GetResource = func(ctx context.Context, resourceMeta *kubeapi.ResourceMeta, resourceName string, namespaceName string) ([]byte, error) {
151
					return []byte("kind: Pod"), nil
152
				}
153
				env.TimeoutSideEffectParentPublicationWaiting = 1 * time.Second
154
				emptyParentUpdateChecker = func(_ []byte, _ int64) semodles.ParentStatus {
155
					return semodles.PublishedHashChanged
156
				}
157
			},
158
			args: args{
159
				info: &semodles.SE{
160
					Configs: semodles.Configs{
161
						Kind:       "Pod",
162
						ApiVersion: "v1",
163
						Metadata: semodles.Metadata{
164
							Namespace: "kblt-dev",
165
							Name:      "podik :D ! XD",
166
						},
167
						TemplateRefs: []string{"templNs/templName"},
168
						TriggerRef: semodles.TriggerRef{
169
							Name:             "triggName",
170
							SideEffectConfig: "sideEffThis",
171
						},
172
					},
173
				},
174
			},
175
			trigger: v1alpha1.Trigger{
176
				ObjectMeta: metav1.ObjectMeta{Name: "triggName"},
177
				Spec: v1alpha1.TriggerSpec{
178
					SideEffectConfigs: []v1alpha1.SideEffectConfig{{
179
						Name:         "sideEffThis",
180
						TemplateRefs: []string{"templNs/templName"},
181
					}}},
182
			},
183
			template: v1alpha1.Template{
184
				ObjectMeta: metav1.ObjectMeta{
185
					Namespace: "templNs",
186
					Name:      "templName",
187
				},
188
			},
189
		},
190
		{
191
			name: "ok",
192
			setVars: func() {
193
				kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
194
					return &kubeapi.ResourceMeta{
195
						Name:         "Pod",
196
						Plural:       "pods",
197
						Path:         "api",
198
						Namespaced:   true,
199
						GroupVersion: "v1",
200
					}
201
				}
202

203
				kubeapi.GetResource = func(ctx context.Context, resourceMeta *kubeapi.ResourceMeta, resourceName string, namespaceName string) ([]byte, error) {
204
					return []byte("{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"name\":\"pod-se-plus-mutation\",\"resourceVersion\": \"verse1\",\"uid\": \"31ce6848-bee4-40fb-be85-7f796dd11685\",\"namespace\":\"kate-kblt-dev\",\"labels\":{\"sidecar.istio.io/inject\":\"false\",\"side-effect-plus-mutation\":\"enabled\"},\"annotations\":{\"kblt.annot-ns/merge\":\"enabled\"}},\"spec\":{\"hostNetwork\":false,\"serviceAccount\":\"default\",\"serviceAccountName\":\"default\",\"restartPolicy\":\"Never\",\"automountServiceAccountToken\":false,\"securityContext\":{\"runAsNonRoot\":true,\"seccompProfile\":{\"type\":\"RuntimeDefault\"}},\"containers\":[{\"image\":\"dzo.sw.sbc.space/sbt_dev/ci90000221_fedmesh_dev/federation-demo@sha256:548cc416011c86bb1e2c6d06289aab0771a0f749c044656deaac5fc86d891fea\",\"name\":\"test\",\"imagePullPolicy\":\"Always\",\"securityContext\":{\"allowPrivilegeEscalation\":false,\"capabilities\":{\"drop\":[\"ALL\"]},\"runAsNonRoot\":true,\"privileged\":false}}]}}"), nil
205
				}
206
			},
207
			args: args{
208
				info: &semodles.SE{
209
					Configs: semodles.Configs{
210
						Kind:       "Pod",
211
						ApiVersion: "v1",
212
						Metadata: semodles.Metadata{
213
							Namespace: "kblt-dev",
214
							Name:      "podik :D ! XD",
215
						},
216
						TemplateRefs: []string{"templNs/templName", "fake/ref"},
217
						TriggerRef: semodles.TriggerRef{
218
							Name:             "triggName",
219
							Namespace:        "ns",
220
							SideEffectConfig: "sideEffThis",
221
						},
222
					},
223
				},
224
			},
225
			trigger: v1alpha1.Trigger{
226
				ObjectMeta: metav1.ObjectMeta{Name: "triggName"},
227
				Spec: v1alpha1.TriggerSpec{
228
					SideEffectConfigs: []v1alpha1.SideEffectConfig{{
229
						Name:         "sideEffThis",
230
						TemplateRefs: []string{"templNs/templName"},
231
					}}},
232
			},
233
			template: v1alpha1.Template{
234
				ObjectMeta: metav1.ObjectMeta{
235
					Namespace: "templNs",
236
					Name:      "templName",
237
				},
238
				Spec: v1alpha1.TemplateSpec{
239
					Data: "---\nkind: TriggerInstance\napiVersion: kubelatte.synapse.sber/v1alpha1\nmetadata:\n  name: trigger-instance-se-plus-mutation\n  annotations:\n    kblt/side-effect-plus-mutation: enabled\nspec:\n  data: data\n",
240
				},
241
			},
242
		},
243
	}
244

245
	t.Run("disabled kbltSideEffect", func(t *testing.T) {
246
		env.KbltSideEffect = false
247
		(&Executor{}).ApplySideEffect(context.Background(), nil)
248
	})
249

250
	env.KbltSideEffect = true
251
	for _, tt := range tests {
252
		t.Run(tt.name, func(t *testing.T) {
253
			tt.setVars()
254

255
			triggerInstanceClient := mocks2.NewTriggerInstanceInterface(t)
256
			triggerInstanceClient.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, errors2.NewNotFound(schema.GroupResource{}, "ti")).Maybe()
257
			triggerInstanceClient.On("Create", mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
258

259
			kbtlKubeClientMock := mocks2.NewV1Alpha1Interface(t)
260
			kbtlKubeClientMock.On("TriggerInstance").Return(triggerInstanceClient).Maybe()
261

262
			storage.Storage = &storage.StorageController{}
263
			storage.Storage.Start(false, false)
264
			storage.Storage.UpdateTemplate(&tt.template)
265
			storage.Storage.UpdateTrigger(&tt.trigger)
266

267
			c := Executor{kbtlKubeClient: kbtlKubeClientMock}
268
			c.act = &c
269
			c.ApplySideEffect(context.Background(), tt.args.info)
270
		})
271
	}
272
}
273

274
func TestExecutor_publishTI(t *testing.T) {
275
	t.Run("ok", func(t *testing.T) {
276
		mockCli := mocks2.NewV1Alpha1Interface(t)
277
		timock := mocks2.NewTriggerInstanceInterface(t)
278
		timock.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
279
		timock.On("Create", mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
280
		mockCli.On("TriggerInstance").Return(timock).Maybe()
281

282
		e := &Executor{
283
			kbtlKubeClient: mockCli,
284
		}
285
		e.PublishTI(context.Background(), &v1alpha1.TriggerInstance{}, &semodles.SE{})
286
	})
287
	t.Run("creation err", func(t *testing.T) {
288
		mockCli := mocks2.NewV1Alpha1Interface(t)
289
		timock := mocks2.NewTriggerInstanceInterface(t)
290
		timock.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
291
		timock.On("Create", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("rerr")).Maybe()
292
		mockCli.On("TriggerInstance").Return(timock).Maybe()
293

294
		e := &Executor{
295
			kbtlKubeClient: mockCli,
296
		}
297
		e.PublishTI(context.Background(), &v1alpha1.TriggerInstance{}, &semodles.SE{})
298
	})
299
	t.Run("getting err", func(t *testing.T) {
300
		mockCli := mocks2.NewV1Alpha1Interface(t)
301
		timock := mocks2.NewTriggerInstanceInterface(t)
302
		timock.On("Create", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("rerr")).Maybe()
303
		timock.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("")).Maybe()
304
		mockCli.On("TriggerInstance").Return(timock).Maybe()
305

306
		e := &Executor{
307
			kbtlKubeClient: mockCli,
308
		}
309
		e.PublishTI(context.Background(), &v1alpha1.TriggerInstance{}, &semodles.SE{})
310
	})
311
	t.Run("getting err", func(t *testing.T) {
312
		mockCli := mocks2.NewV1Alpha1Interface(t)
313
		timock := mocks2.NewTriggerInstanceInterface(t)
314
		timock.On("Create", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("rerr")).Maybe()
315
		timock.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, &errors2.StatusError{ErrStatus: metav1.Status{
316
			Status: metav1.StatusFailure,
317
			Code:   http.StatusNotFound,
318
			Reason: metav1.StatusReasonNotFound,
319
		}}).Maybe()
320
		mockCli.On("TriggerInstance").Return(timock).Maybe()
321

322
		e := &Executor{
323
			kbtlKubeClient: mockCli,
324
		}
325
		e.PublishTI(context.Background(), &v1alpha1.TriggerInstance{}, &semodles.SE{})
326
	})
327
}
328

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

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

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

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