kubelatte-ce
Форк от sbertech/kubelatte-ce
343 строки · 12.6 Кб
1package creation
2
3import (
4"context"
5"fmt"
6"github.com/stretchr/testify/mock"
7v1alpha12 "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"
16v1 "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
25func TestWatcherController(t *testing.T) {
26lib.ZapLogger = zap.NewNop()
27
28env.InitEnvOperator()
29os.Setenv("KBLT_CREATOR", "true")
30os.Setenv("KBLT_CREATOR", "true")
31
32kubeapi.GetClient = func() *kubernetes.Clientset {
33return kubernetes.New(&fake.RESTClient{})
34}
35
36ti := v1alpha12.TriggerInstance{
37Status: v1alpha12.TriggerInstanceStatus{
38ResourceStatus: []v1alpha12.ResourceStatus{
39{
40Name: "pod",
41Kind: "Pod",
42ApiVersion: "v1",
43Message: "REMOVED",
44Phase: "",
45Status: "REMOVED",
46},
47},
48},
49}
50ti2 := v1alpha12.TriggerInstance{
51ObjectMeta: v1.ObjectMeta{
52Name: "test",
53Namespace: "test",
54Labels: map[string]string{
55"test": "test",
56},
57Annotations: map[string]string{
58"test": "test",
59},
60},
61Status: v1alpha12.TriggerInstanceStatus{
62ResourceStatus: []v1alpha12.ResourceStatus{
63{
64Name: "pod",
65Kind: "Pod",
66ApiVersion: "v1",
67Message: "REMOVED",
68Phase: "",
69Status: "REMOVED",
70},
71{
72Name: "pod",
73Kind: "Pod",
74ApiVersion: "v1",
75Message: "",
76Phase: "",
77Status: "",
78},
79},
80},
81}
82
83templateClient := mocks.NewTemplateInterface(t)
84triggerClient := mocks.NewTriggerInterface(t)
85scopeClient := mocks.NewScopeInterface(t)
86triggerInstanceClient := mocks.NewTriggerInstanceInterface(t)
87triggerInstanceClient.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&ti, nil).Maybe()
88triggerInstanceClient.On("updateStatus", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
89
90clt := clientset.V1Alpha1Client{
91TriggerClient: triggerClient,
92TemplateClient: templateClient,
93ScopeClient: scopeClient,
94TriggerInstanceClient: triggerInstanceClient,
95}
96
97utils.Cl = &clt
98kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
99return &kubeapi.ResourceMeta{
100Name: "Pod",
101Plural: "pods",
102Path: "api",
103Namespaced: true,
104GroupVersion: "v1",
105}
106}
107
108w := Watcher{
109reSyncPeriod: 0,
110watchObjects: map[string]v1alpha12.TriggerInstance{},
111}
112
113t.Run("Start", func(t *testing.T) {
114w.StartWatcher()
115})
116
117t.Run("updateSyncPeriod", func(t *testing.T) {
118w.updateSyncPeriod(uint64(5))
119})
120
121t.Run("addNewObject", func(t *testing.T) {
122w.addNewObject(ti)
123})
124
125podJson := "{\"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
127t.Run("updateStatus all removed", func(t *testing.T) {
128w.updateStatus()
129})
130
131triggerInstanceClient = mocks.NewTriggerInstanceInterface(t)
132triggerInstanceClient.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&ti2, nil).Maybe()
133triggerInstanceClient.On("updateStatus", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
134
135clt = clientset.V1Alpha1Client{
136TriggerClient: triggerClient,
137TemplateClient: templateClient,
138ScopeClient: scopeClient,
139TriggerInstanceClient: triggerInstanceClient,
140}
141
142utils.Cl = &clt
143
144t.Run("removeObject", func(t *testing.T) {
145w.removeObject(ti)
146})
147
148kubeapi.GetRawResourceFromKubeApi = func(ctx context.Context, client rest.Interface, resourceMeta *kubeapi.ResourceMeta, resourceName string, namespaceName string) ([]byte, error) {
149return []byte(podJson), nil
150}
151triggerInstanceClient.On("UpdateStatus", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
152t.Run("updateStatus", func(t *testing.T) {
153w.addNewObject(ti2)
154w.updateStatus()
155})
156}
157
158func TestCheckTiNotFound(t *testing.T) {
159lib.ZapLogger = zap.NewNop()
160
161kubeapi.GetClient = func() *kubernetes.Clientset {
162return kubernetes.New(&fake.RESTClient{})
163}
164
165ti := v1alpha12.TriggerInstance{
166Status: v1alpha12.TriggerInstanceStatus{
167ResourceStatus: []v1alpha12.ResourceStatus{
168{
169Name: "pod",
170Kind: "Pod",
171ApiVersion: "v1",
172Message: "REMOVED",
173Phase: "",
174Status: "REMOVED",
175},
176},
177},
178}
179
180templateClient := mocks.NewTemplateInterface(t)
181triggerClient := mocks.NewTriggerInterface(t)
182scopeClient := mocks.NewScopeInterface(t)
183triggerInstanceClient := mocks.NewTriggerInstanceInterface(t)
184triggerInstanceClient.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.NewNotFound(schema.GroupResource{}, "not found")).Maybe()
185triggerInstanceClient.On("updateStatus", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
186
187clt := clientset.V1Alpha1Client{
188TriggerClient: triggerClient,
189TemplateClient: templateClient,
190ScopeClient: scopeClient,
191TriggerInstanceClient: triggerInstanceClient,
192}
193
194utils.Cl = &clt
195kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
196return &kubeapi.ResourceMeta{
197Name: "Pod",
198Plural: "pods",
199Path: "api",
200Namespaced: true,
201GroupVersion: "v1",
202}
203}
204
205w := Watcher{
206reSyncPeriod: 0,
207watchObjects: map[string]v1alpha12.TriggerInstance{
208ti.GetNamespacedName(): ti,
209},
210}
211
212env.InitEnvOperator()
213os.Setenv("KBLT_CREATOR", "true")
214t.Run("updateStatus ti not found", func(t *testing.T) {
215w.updateStatus()
216})
217}
218
219func TestCheckResourceNotFound(t *testing.T) {
220lib.ZapLogger = zap.NewNop()
221
222kubeapi.GetClient = func() *kubernetes.Clientset {
223return kubernetes.New(&fake.RESTClient{})
224}
225
226ti := v1alpha12.TriggerInstance{
227Status: v1alpha12.TriggerInstanceStatus{
228ResourceStatus: []v1alpha12.ResourceStatus{
229{
230Name: "pod",
231Kind: "Pod",
232ApiVersion: "v1",
233Message: "Normal",
234Phase: "",
235Status: "Normal",
236},
237},
238},
239}
240
241templateClient := mocks.NewTemplateInterface(t)
242triggerClient := mocks.NewTriggerInterface(t)
243scopeClient := mocks.NewScopeInterface(t)
244triggerInstanceClient := mocks.NewTriggerInstanceInterface(t)
245triggerInstanceClient.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&ti, nil).Maybe()
246triggerInstanceClient.On("updateStatus", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
247triggerInstanceClient.On("UpdateStatus", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
248clt := clientset.V1Alpha1Client{
249TriggerClient: triggerClient,
250TemplateClient: templateClient,
251ScopeClient: scopeClient,
252TriggerInstanceClient: triggerInstanceClient,
253}
254
255utils.Cl = &clt
256kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
257return &kubeapi.ResourceMeta{
258Name: "Pod",
259Plural: "pods",
260Path: "api",
261Namespaced: true,
262GroupVersion: "v1",
263}
264}
265
266w := Watcher{
267reSyncPeriod: 0,
268watchObjects: map[string]v1alpha12.TriggerInstance{
269ti.GetNamespacedName(): ti,
270},
271}
272
273kubeapi.GetRawResourceFromKubeApi = func(ctx context.Context, client rest.Interface, resourceMeta *kubeapi.ResourceMeta, resourceName string, namespaceName string) ([]byte, error) {
274return nil, errors.NewNotFound(schema.GroupResource{}, "not found")
275}
276
277t.Run("updateStatus resource not found", func(t *testing.T) {
278w.updateStatus()
279})
280}
281
282func TestCheckResourceError(t *testing.T) {
283lib.ZapLogger = zap.NewNop()
284
285kubeapi.GetClient = func() *kubernetes.Clientset {
286return kubernetes.New(&fake.RESTClient{})
287}
288
289ti := v1alpha12.TriggerInstance{
290Status: v1alpha12.TriggerInstanceStatus{
291ResourceStatus: []v1alpha12.ResourceStatus{
292{
293Name: "pod",
294Kind: "Pod",
295ApiVersion: "v1",
296Message: "Normal",
297Phase: "",
298Status: "Normal",
299},
300},
301},
302}
303
304templateClient := mocks.NewTemplateInterface(t)
305triggerClient := mocks.NewTriggerInterface(t)
306scopeClient := mocks.NewScopeInterface(t)
307triggerInstanceClient := mocks.NewTriggerInstanceInterface(t)
308triggerInstanceClient.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&ti, nil).Maybe()
309triggerInstanceClient.On("updateStatus", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
310
311clt := clientset.V1Alpha1Client{
312TriggerClient: triggerClient,
313TemplateClient: templateClient,
314ScopeClient: scopeClient,
315TriggerInstanceClient: triggerInstanceClient,
316}
317
318utils.Cl = &clt
319kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
320return &kubeapi.ResourceMeta{
321Name: "Pod",
322Plural: "pods",
323Path: "api",
324Namespaced: true,
325GroupVersion: "v1",
326}
327}
328
329w := Watcher{
330reSyncPeriod: 0,
331watchObjects: map[string]v1alpha12.TriggerInstance{
332ti.GetNamespacedName(): ti,
333},
334}
335
336kubeapi.GetRawResourceFromKubeApi = func(ctx context.Context, client rest.Interface, resourceMeta *kubeapi.ResourceMeta, resourceName string, namespaceName string) ([]byte, error) {
337return nil, fmt.Errorf("resource error")
338}
339
340t.Run("updateStatus resource not found", func(t *testing.T) {
341w.updateStatus()
342})
343}
344