kubelatte-ce

Форк
2
Форк от sbertech/kubelatte-ce
/
factory_test.go 
344 строки · 11.5 Кб
1
package creation
2

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

33
func TestMain(m *testing.M) {
34
	lib.ZapLogger = zap.NewNop()
35
	exitVal := m.Run()
36
	os.Exit(exitVal)
37
}
38

39
func TestFactoryController_CheckIfProcessed(t *testing.T) {
40
	ti := v1alpha12.TriggerInstance{
41
		Status: v1alpha12.TriggerInstanceStatus{
42
			ResourceStatus: []v1alpha12.ResourceStatus{
43
				{
44
					Name:       "pod",
45
					Kind:       "Pod",
46
					ApiVersion: "v1",
47
					Message:    "REMOVED",
48
					Phase:      "",
49
					Status:     "REMOVED",
50
				},
51
			},
52
		},
53
	}
54
	ti2 := v1alpha12.TriggerInstance{
55
		Status: v1alpha12.TriggerInstanceStatus{
56
			ResourceStatus: []v1alpha12.ResourceStatus{
57
				{
58
					Name:       "pod",
59
					Kind:       "Pod",
60
					ApiVersion: "v1",
61
					Message:    "REMOVED",
62
					Phase:      "",
63
					Status:     "FAILED",
64
				},
65
			},
66
		},
67
	}
68
	f := FactoryController{}
69
	b1 := f.checkIfProcessed("pod", &ti2, true)
70
	assert.True(t, !b1)
71
	b2 := f.checkIfProcessed("pod", &ti, true)
72
	assert.True(t, b2)
73
	b3 := f.checkIfProcessed("pod", &ti, false)
74
	assert.True(t, b3)
75
}
76

77
func TestFactoryController_Make(t *testing.T) {
78
	os.Setenv("KBLT_CREATOR", "true")
79
	env.InitEnvOperator()
80
	lib.ZapLogger = zap.NewNop()
81

82
	tmpTi := v1alpha12.TriggerInstance{
83
		Status: v1alpha12.TriggerInstanceStatus{
84
			ResourceStatus: []v1alpha12.ResourceStatus{
85
				{
86
					Name:       "pod",
87
					Kind:       "Pod",
88
					ApiVersion: "v1",
89
					Message:    "REMOVED",
90
					Phase:      "",
91
					Status:     "REMOVED",
92
				},
93
			},
94
		},
95
	}
96
	ti := tmpTi
97

98
	ti2 := v1alpha12.TriggerInstance{
99
		ObjectMeta: v1.ObjectMeta{
100
			Name:      "test",
101
			Namespace: "test",
102
			Labels: map[string]string{
103
				"test": "test",
104
			},
105
			Annotations: map[string]string{
106
				"test": "test",
107
			},
108
		},
109
		Status: v1alpha12.TriggerInstanceStatus{},
110
	}
111

112
	templateClient := mocks.NewTemplateInterface(t)
113
	templateClient.On("List", mock.Anything, mock.Anything).Return(&v1alpha12.TemplateList{
114
		Items: []v1alpha12.Template{
115
			{
116
				ObjectMeta: v1.ObjectMeta{
117
					Name:      "template",
118
					Namespace: "test",
119
				},
120
				Spec: v1alpha12.TemplateSpec{
121
					Kind:       "Pod",
122
					ApiVersion: "v1",
123
					Data:       "metadata:\n name: pod\nspec:\n abc: test",
124
				},
125
			},
126
		},
127
	}, nil).Maybe()
128
	triggerClient := mocks.NewTriggerInterface(t)
129
	triggerClient.On("List", mock.Anything, mock.Anything).Return(&v1alpha12.TriggerList{
130
		Items: []v1alpha12.Trigger{
131
			{
132
				ObjectMeta: v1.ObjectMeta{
133
					Name:      "trigger",
134
					Namespace: "test",
135
				},
136
				Spec: v1alpha12.TriggerSpec{
137
					CreationConfigs: []v1alpha12.CreationConfig{
138
						{
139
							Name: "creation",
140
							LabelSelector: v1.LabelSelector{
141
								MatchExpressions: []v1.LabelSelectorRequirement{
142
									{
143
										Key:      "test",
144
										Operator: "In",
145
										Values:   []string{"test"},
146
									},
147
								},
148
							},
149
							AnnotationNamespace: "",
150
							AnnotationTrigger:   "",
151
							TemplateRefs:        []string{"test/template"},
152
						},
153
					},
154
				},
155
			},
156
		},
157
	}, nil).Maybe()
158
	scopeClient := mocks.NewScopeInterface(t)
159

160
	clt := clientset.V1Alpha1Client{
161
		TriggerClient:  triggerClient,
162
		TemplateClient: templateClient,
163
		ScopeClient:    scopeClient,
164
	}
165

166
	utils.Cl = &clt
167
	kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
168
		return &kubeapi.ResourceMeta{
169
			Name:         "Pod",
170
			Plural:       "pods",
171
			Path:         "api",
172
			Namespaced:   true,
173
			GroupVersion: "v1",
174
		}
175
	}
176

177
	var storageController = &storage.StorageController{}
178
	storageController.Start(false, false)
179
	storageController.UpdateScope(v1alpha12.Scope{
180
		ObjectMeta: v1.ObjectMeta{
181
			Name: "TestScope",
182
		},
183
		Spec: v1alpha12.ScopeSpec{
184
			Type: "mutation",
185
			Items: []v1alpha12.Item{
186
				{
187
					Name: "TestScopeItem",
188
				},
189
			},
190
		},
191
	})
192
	storageController.UpdateTrigger(&v1alpha12.Trigger{
193
		ObjectMeta: v1.ObjectMeta{
194
			Name:      "trigger",
195
			Namespace: "test",
196
		},
197
		Spec: v1alpha12.TriggerSpec{
198
			CreationConfigs: []v1alpha12.CreationConfig{
199
				{
200
					Name: "creation",
201
					LabelSelector: v1.LabelSelector{
202
						MatchExpressions: []v1.LabelSelectorRequirement{
203
							{
204
								Key:      "test",
205
								Operator: "In",
206
								Values:   []string{"test"},
207
							},
208
						},
209
					},
210
					AnnotationNamespace: "",
211
					AnnotationTrigger:   "",
212
					TemplateRefs:        []string{"test/template"},
213
				},
214
			},
215
		},
216
	})
217
	storageController.UpdateTemplate(&v1alpha12.Template{
218
		ObjectMeta: v1.ObjectMeta{
219
			Name:      "template",
220
			Namespace: "test",
221
		},
222
		Spec: v1alpha12.TemplateSpec{
223
			Kind:       "Pod",
224
			ApiVersion: "v1",
225
			Data:       "metadata:\n name: pod\nspec:\n abc: test",
226
		},
227
	})
228
	storage.Storage = storageController
229

230
	sch := runtime.NewScheme()
231
	_ = corev1.SchemeBuilder.AddToScheme(sch)
232
	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\":{}}"
233

234
	kubeapi.GetResource = func(ctx context.Context, resourceMeta *kubeapi.ResourceMeta, resourceName string, namespaceName string) ([]byte, error) {
235
		return nil, errors.NewNotFound(schema.GroupResource{}, "Pod test")
236
	}
237

238
	kubeapi.CreateResourceInKubeApi = func(ctx context.Context, client rest.Interface, resourceMeta *kubeapi.ResourceMeta, jsBody []byte, namespaceName string) ([]byte, error, error) {
239
		return []byte(podJson), nil, nil
240
	}
241

242
	f := &FactoryController{
243
		Client:   kubernetes.New(&fake.RESTClient{}),
244
		renderer: NewRender(),
245
	}
246

247
	configConfs := ctrl.GetConfigOrDie()
248
	utils.Cl, _ = clientset.NewForConfig(configConfs)
249

250
	go func() {
251
		for {
252
			<-utils.WatcherAddNewObjectTo
253
		}
254
	}()
255

256
	t.Run("Create resource with removed status", func(t *testing.T) {
257
		err := f.Make(context.Background(), ti)
258
		if err == nil || !errors2.Is(err, ErrAllResourcesRemoved) {
259
			t.Fatal(err)
260
		}
261
	})
262
	t.Run("Create normal resource", func(t *testing.T) {
263
		err := f.Make(context.Background(), ti2)
264
		if err != nil {
265
			t.Fatal(err)
266
		}
267
	})
268

269
	kubeapi.GetResource = func(ctx context.Context, resourceMeta *kubeapi.ResourceMeta, resourceName string, namespaceName string) ([]byte, error) {
270
		return nil, fmt.Errorf("test error")
271
	}
272

273
	t.Run("Create resource with error on find", func(t *testing.T) {
274
		err := f.Make(context.Background(), ti2)
275
		if err == nil {
276
			t.Fatal(err)
277
		}
278
	})
279

280
	kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
281
		return nil
282
	}
283

284
	t.Run("Create normal resource with no meta", func(t *testing.T) {
285
		err := f.Make(context.Background(), ti2)
286
		if err == nil {
287
			t.Fatal(err)
288
		}
289
	})
290
}
291

292
func TestFactoryController_Start(t *testing.T) {
293
	kubeapi.GetClient = func() *kubernetes.Clientset {
294
		return nil
295
	}
296
	f := &FactoryController{}
297
	f.StartFactory()
298
	f.StopFactory()
299
}
300

301
func TestFactoryController_GetResourceName(t *testing.T) {
302
	type fields struct {
303
		Client   *kubernetes.Clientset
304
		chObject chan bell.Message
305
		chStop   chan bool
306
	}
307
	type args struct {
308
		tiName       string
309
		templateName string
310
		kind         string
311
		render       util.RenderItem
312
	}
313
	tests := []struct {
314
		name    string
315
		fields  fields
316
		args    args
317
		want    string
318
		wantErr assert.ErrorAssertionFunc
319
	}{
320
		{
321
			name: "not_unique_name",
322
			args: args{
323
				tiName: "ti",
324
				kind:   "pod",
325
				render: util.RenderItem{Render: "{\"metadata\":{\"name\":\"tmpl\"}}"},
326
			},
327
			want: "",
328
			wantErr: func(t assert.TestingT, err error, i ...interface{}) bool {
329
				assert.False(t, err != nil)
330
				return err != nil
331
			},
332
		},
333
	}
334
	for _, tt := range tests {
335
		t.Run(tt.name, func(t *testing.T) {
336
			f := &FactoryController{}
337
			got, err := f.getResourceName(tt.args.tiName, tt.args.kind, tt.args.render)
338
			if !tt.wantErr(t, err, fmt.Sprintf("getResourceName(%v, %v, %v, %v)", tt.args.tiName, tt.args.templateName, tt.args.kind, tt.args.render)) {
339
				return
340
			}
341
			assert.Equalf(t, tt.want, got, "getResourceName(%v, %v, %v, %v)", tt.args.tiName, tt.args.templateName, tt.args.kind, tt.args.render)
342
		})
343
	}
344
}
345

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

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

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

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