kubelatte-ce
Форк от sbertech/kubelatte-ce
327 строк · 11.3 Кб
1package sideeffect
2
3import (
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"
9mocks2 "gitverse.ru/synapse/kubelatte/pkg/operator/controllers/clientset/mocks"
10semodles "gitverse.ru/synapse/kubelatte/pkg/sideeffect"
11"gitverse.ru/synapse/kubelatte/pkg/storage"
12"gitverse.ru/synapse/kubelatte/pkg/util/env"
13errors2 "k8s.io/apimachinery/pkg/api/errors"
14metav1 "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
22func TestController_ApplySideEffectCreate(t *testing.T) {
23type args struct {
24info *semodles.SE
25}
26tests := []struct {
27name string
28args args
29trigger v1alpha1.Trigger
30template v1alpha1.Template
31setVars func()
32}{
33{
34name: "err parent publication",
35setVars: func() {
36kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
37return &kubeapi.ResourceMeta{
38Name: "Pod",
39Plural: "pods",
40Path: "api",
41Namespaced: true,
42GroupVersion: "v1",
43}
44}
45
46kubeapi.GetResource = func(ctx context.Context, resourceMeta *kubeapi.ResourceMeta, resourceName string, namespaceName string) ([]byte, error) {
47return nil, errors2.NewNotFound(schema.GroupResource{}, "Pod test")
48}
49},
50args: args{
51info: &semodles.SE{
52Configs: semodles.Configs{
53Kind: "Pod",
54ApiVersion: "v1",
55ParentTag: 0,
56Metadata: semodles.Metadata{
57Namespace: "kblt-dev",
58Name: "podik :D ! XD",
59},
60TriggerRef: semodles.TriggerRef{
61Name: "triggName",
62SideEffectConfig: "sideEffThis",
63},
64TemplateRefs: []string{"templNs/templName"},
65},
66},
67},
68trigger: v1alpha1.Trigger{
69ObjectMeta: metav1.ObjectMeta{Name: "triggName"},
70Spec: v1alpha1.TriggerSpec{
71SideEffectConfigs: []v1alpha1.SideEffectConfig{{
72Name: "sideEffThis",
73TemplateRefs: []string{"templNs/templName"},
74}}},
75},
76template: v1alpha1.Template{
77ObjectMeta: metav1.ObjectMeta{
78Namespace: "templNs",
79Name: "templName",
80},
81},
82},
83{
84name: "Unknown parent publication",
85setVars: func() {
86kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
87return &kubeapi.ResourceMeta{
88Name: "Pod",
89Plural: "pods",
90Path: "api",
91Namespaced: true,
92GroupVersion: "v1",
93}
94}
95
96kubeapi.GetResource = func(ctx context.Context, resourceMeta *kubeapi.ResourceMeta, resourceName string, namespaceName string) ([]byte, error) {
97return []byte("kind: Pod"), nil
98}
99env.TimeoutSideEffectParentPublicationWaiting = 1 * time.Second
100emptyParentUpdateChecker = func(_ []byte, _ int64) semodles.ParentStatus {
101return semodles.Unknown
102}
103},
104args: args{
105info: &semodles.SE{
106Configs: semodles.Configs{
107Kind: "Pod",
108ApiVersion: "v1",
109ParentTag: 0,
110Metadata: semodles.Metadata{
111Namespace: "kblt-dev",
112Name: "podik :D ! XD",
113},
114TriggerRef: semodles.TriggerRef{
115Name: "triggName",
116SideEffectConfig: "sideEffThis",
117},
118TemplateRefs: []string{"templNs/templName"},
119},
120},
121},
122trigger: v1alpha1.Trigger{
123ObjectMeta: metav1.ObjectMeta{Name: "triggName"},
124Spec: v1alpha1.TriggerSpec{
125SideEffectConfigs: []v1alpha1.SideEffectConfig{{
126Name: "sideEffThis",
127TemplateRefs: []string{"templNs/templName"},
128}}},
129},
130template: v1alpha1.Template{
131ObjectMeta: metav1.ObjectMeta{
132Namespace: "templNs",
133Name: "templName",
134},
135},
136},
137{
138name: "getResourceInfo err",
139setVars: func() {
140kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
141return &kubeapi.ResourceMeta{
142Name: "Pod",
143Plural: "pods",
144Path: "api",
145Namespaced: true,
146GroupVersion: "v1",
147}
148}
149
150kubeapi.GetResource = func(ctx context.Context, resourceMeta *kubeapi.ResourceMeta, resourceName string, namespaceName string) ([]byte, error) {
151return []byte("kind: Pod"), nil
152}
153env.TimeoutSideEffectParentPublicationWaiting = 1 * time.Second
154emptyParentUpdateChecker = func(_ []byte, _ int64) semodles.ParentStatus {
155return semodles.PublishedHashChanged
156}
157},
158args: args{
159info: &semodles.SE{
160Configs: semodles.Configs{
161Kind: "Pod",
162ApiVersion: "v1",
163Metadata: semodles.Metadata{
164Namespace: "kblt-dev",
165Name: "podik :D ! XD",
166},
167TemplateRefs: []string{"templNs/templName"},
168TriggerRef: semodles.TriggerRef{
169Name: "triggName",
170SideEffectConfig: "sideEffThis",
171},
172},
173},
174},
175trigger: v1alpha1.Trigger{
176ObjectMeta: metav1.ObjectMeta{Name: "triggName"},
177Spec: v1alpha1.TriggerSpec{
178SideEffectConfigs: []v1alpha1.SideEffectConfig{{
179Name: "sideEffThis",
180TemplateRefs: []string{"templNs/templName"},
181}}},
182},
183template: v1alpha1.Template{
184ObjectMeta: metav1.ObjectMeta{
185Namespace: "templNs",
186Name: "templName",
187},
188},
189},
190{
191name: "ok",
192setVars: func() {
193kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
194return &kubeapi.ResourceMeta{
195Name: "Pod",
196Plural: "pods",
197Path: "api",
198Namespaced: true,
199GroupVersion: "v1",
200}
201}
202
203kubeapi.GetResource = func(ctx context.Context, resourceMeta *kubeapi.ResourceMeta, resourceName string, namespaceName string) ([]byte, error) {
204return []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},
207args: args{
208info: &semodles.SE{
209Configs: semodles.Configs{
210Kind: "Pod",
211ApiVersion: "v1",
212Metadata: semodles.Metadata{
213Namespace: "kblt-dev",
214Name: "podik :D ! XD",
215},
216TemplateRefs: []string{"templNs/templName", "fake/ref"},
217TriggerRef: semodles.TriggerRef{
218Name: "triggName",
219Namespace: "ns",
220SideEffectConfig: "sideEffThis",
221},
222},
223},
224},
225trigger: v1alpha1.Trigger{
226ObjectMeta: metav1.ObjectMeta{Name: "triggName"},
227Spec: v1alpha1.TriggerSpec{
228SideEffectConfigs: []v1alpha1.SideEffectConfig{{
229Name: "sideEffThis",
230TemplateRefs: []string{"templNs/templName"},
231}}},
232},
233template: v1alpha1.Template{
234ObjectMeta: metav1.ObjectMeta{
235Namespace: "templNs",
236Name: "templName",
237},
238Spec: v1alpha1.TemplateSpec{
239Data: "---\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
245t.Run("disabled kbltSideEffect", func(t *testing.T) {
246env.KbltSideEffect = false
247(&Executor{}).ApplySideEffect(context.Background(), nil)
248})
249
250env.KbltSideEffect = true
251for _, tt := range tests {
252t.Run(tt.name, func(t *testing.T) {
253tt.setVars()
254
255triggerInstanceClient := mocks2.NewTriggerInstanceInterface(t)
256triggerInstanceClient.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, errors2.NewNotFound(schema.GroupResource{}, "ti")).Maybe()
257triggerInstanceClient.On("Create", mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
258
259kbtlKubeClientMock := mocks2.NewV1Alpha1Interface(t)
260kbtlKubeClientMock.On("TriggerInstance").Return(triggerInstanceClient).Maybe()
261
262storage.Storage = &storage.StorageController{}
263storage.Storage.Start(false, false)
264storage.Storage.UpdateTemplate(&tt.template)
265storage.Storage.UpdateTrigger(&tt.trigger)
266
267c := Executor{kbtlKubeClient: kbtlKubeClientMock}
268c.act = &c
269c.ApplySideEffect(context.Background(), tt.args.info)
270})
271}
272}
273
274func TestExecutor_publishTI(t *testing.T) {
275t.Run("ok", func(t *testing.T) {
276mockCli := mocks2.NewV1Alpha1Interface(t)
277timock := mocks2.NewTriggerInstanceInterface(t)
278timock.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
279timock.On("Create", mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
280mockCli.On("TriggerInstance").Return(timock).Maybe()
281
282e := &Executor{
283kbtlKubeClient: mockCli,
284}
285e.PublishTI(context.Background(), &v1alpha1.TriggerInstance{}, &semodles.SE{})
286})
287t.Run("creation err", func(t *testing.T) {
288mockCli := mocks2.NewV1Alpha1Interface(t)
289timock := mocks2.NewTriggerInstanceInterface(t)
290timock.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Maybe()
291timock.On("Create", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("rerr")).Maybe()
292mockCli.On("TriggerInstance").Return(timock).Maybe()
293
294e := &Executor{
295kbtlKubeClient: mockCli,
296}
297e.PublishTI(context.Background(), &v1alpha1.TriggerInstance{}, &semodles.SE{})
298})
299t.Run("getting err", func(t *testing.T) {
300mockCli := mocks2.NewV1Alpha1Interface(t)
301timock := mocks2.NewTriggerInstanceInterface(t)
302timock.On("Create", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("rerr")).Maybe()
303timock.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("")).Maybe()
304mockCli.On("TriggerInstance").Return(timock).Maybe()
305
306e := &Executor{
307kbtlKubeClient: mockCli,
308}
309e.PublishTI(context.Background(), &v1alpha1.TriggerInstance{}, &semodles.SE{})
310})
311t.Run("getting err", func(t *testing.T) {
312mockCli := mocks2.NewV1Alpha1Interface(t)
313timock := mocks2.NewTriggerInstanceInterface(t)
314timock.On("Create", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("rerr")).Maybe()
315timock.On("Get", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, &errors2.StatusError{ErrStatus: metav1.Status{
316Status: metav1.StatusFailure,
317Code: http.StatusNotFound,
318Reason: metav1.StatusReasonNotFound,
319}}).Maybe()
320mockCli.On("TriggerInstance").Return(timock).Maybe()
321
322e := &Executor{
323kbtlKubeClient: mockCli,
324}
325e.PublishTI(context.Background(), &v1alpha1.TriggerInstance{}, &semodles.SE{})
326})
327}
328