kubelatte-ce
Форк от sbertech/kubelatte-ce
344 строки · 11.5 Кб
1package creation
2
3import (
4"context"
5errors2 "errors"
6"fmt"
7"github.com/nuttech/bell"
8"github.com/stretchr/testify/assert"
9"github.com/stretchr/testify/mock"
10v1alpha12 "gitverse.ru/ktrntrsv/kubelatte-ce/pkg/api/v1alpha1"
11"gitverse.ru/ktrntrsv/kubelatte-ce/pkg/kubeapi"
12"gitverse.ru/ktrntrsv/kubelatte-ce/pkg/observability/logger/lib"
13"gitverse.ru/ktrntrsv/kubelatte-ce/pkg/operator/controllers/clientset"
14"gitverse.ru/ktrntrsv/kubelatte-ce/pkg/operator/controllers/clientset/mocks"
15"gitverse.ru/ktrntrsv/kubelatte-ce/pkg/operator/utils"
16"gitverse.ru/ktrntrsv/kubelatte-ce/pkg/storage"
17"gitverse.ru/ktrntrsv/kubelatte-ce/pkg/util"
18"gitverse.ru/ktrntrsv/kubelatte-ce/pkg/util/env"
19"go.uber.org/zap"
20corev1 "k8s.io/api/core/v1"
21"k8s.io/apimachinery/pkg/api/errors"
22v1 "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"
29ctrl "sigs.k8s.io/controller-runtime"
30"testing"
31)
32
33func TestMain(m *testing.M) {
34lib.ZapLogger = zap.NewNop()
35exitVal := m.Run()
36os.Exit(exitVal)
37}
38
39func TestFactoryController_CheckIfProcessed(t *testing.T) {
40ti := v1alpha12.TriggerInstance{
41Status: v1alpha12.TriggerInstanceStatus{
42ResourceStatus: []v1alpha12.ResourceStatus{
43{
44Name: "pod",
45Kind: "Pod",
46ApiVersion: "v1",
47Message: "REMOVED",
48Phase: "",
49Status: "REMOVED",
50},
51},
52},
53}
54ti2 := v1alpha12.TriggerInstance{
55Status: v1alpha12.TriggerInstanceStatus{
56ResourceStatus: []v1alpha12.ResourceStatus{
57{
58Name: "pod",
59Kind: "Pod",
60ApiVersion: "v1",
61Message: "REMOVED",
62Phase: "",
63Status: "FAILED",
64},
65},
66},
67}
68f := FactoryController{}
69b1 := f.checkIfProcessed("pod", &ti2, true)
70assert.True(t, !b1)
71b2 := f.checkIfProcessed("pod", &ti, true)
72assert.True(t, b2)
73b3 := f.checkIfProcessed("pod", &ti, false)
74assert.True(t, b3)
75}
76
77func TestFactoryController_Make(t *testing.T) {
78os.Setenv("KBLT_CREATOR", "true")
79env.InitEnvOperator()
80lib.ZapLogger = zap.NewNop()
81
82tmpTi := v1alpha12.TriggerInstance{
83Status: v1alpha12.TriggerInstanceStatus{
84ResourceStatus: []v1alpha12.ResourceStatus{
85{
86Name: "pod",
87Kind: "Pod",
88ApiVersion: "v1",
89Message: "REMOVED",
90Phase: "",
91Status: "REMOVED",
92},
93},
94},
95}
96ti := tmpTi
97
98ti2 := v1alpha12.TriggerInstance{
99ObjectMeta: v1.ObjectMeta{
100Name: "test",
101Namespace: "test",
102Labels: map[string]string{
103"test": "test",
104},
105Annotations: map[string]string{
106"test": "test",
107},
108},
109Status: v1alpha12.TriggerInstanceStatus{},
110}
111
112templateClient := mocks.NewTemplateInterface(t)
113templateClient.On("List", mock.Anything, mock.Anything).Return(&v1alpha12.TemplateList{
114Items: []v1alpha12.Template{
115{
116ObjectMeta: v1.ObjectMeta{
117Name: "template",
118Namespace: "test",
119},
120Spec: v1alpha12.TemplateSpec{
121Kind: "Pod",
122ApiVersion: "v1",
123Data: "metadata:\n name: pod\nspec:\n abc: test",
124},
125},
126},
127}, nil).Maybe()
128triggerClient := mocks.NewTriggerInterface(t)
129triggerClient.On("List", mock.Anything, mock.Anything).Return(&v1alpha12.TriggerList{
130Items: []v1alpha12.Trigger{
131{
132ObjectMeta: v1.ObjectMeta{
133Name: "trigger",
134Namespace: "test",
135},
136Spec: v1alpha12.TriggerSpec{
137CreationConfigs: []v1alpha12.CreationConfig{
138{
139Name: "creation",
140LabelSelector: v1.LabelSelector{
141MatchExpressions: []v1.LabelSelectorRequirement{
142{
143Key: "test",
144Operator: "In",
145Values: []string{"test"},
146},
147},
148},
149AnnotationNamespace: "",
150AnnotationTrigger: "",
151TemplateRefs: []string{"test/template"},
152},
153},
154},
155},
156},
157}, nil).Maybe()
158scopeClient := mocks.NewScopeInterface(t)
159
160clt := clientset.V1Alpha1Client{
161TriggerClient: triggerClient,
162TemplateClient: templateClient,
163ScopeClient: scopeClient,
164}
165
166utils.Cl = &clt
167kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
168return &kubeapi.ResourceMeta{
169Name: "Pod",
170Plural: "pods",
171Path: "api",
172Namespaced: true,
173GroupVersion: "v1",
174}
175}
176
177var storageController = &storage.StorageController{}
178storageController.Start(false, false)
179storageController.UpdateScope(v1alpha12.Scope{
180ObjectMeta: v1.ObjectMeta{
181Name: "TestScope",
182},
183Spec: v1alpha12.ScopeSpec{
184Type: "mutation",
185Items: []v1alpha12.Item{
186{
187Name: "TestScopeItem",
188},
189},
190},
191})
192storageController.UpdateTrigger(&v1alpha12.Trigger{
193ObjectMeta: v1.ObjectMeta{
194Name: "trigger",
195Namespace: "test",
196},
197Spec: v1alpha12.TriggerSpec{
198CreationConfigs: []v1alpha12.CreationConfig{
199{
200Name: "creation",
201LabelSelector: v1.LabelSelector{
202MatchExpressions: []v1.LabelSelectorRequirement{
203{
204Key: "test",
205Operator: "In",
206Values: []string{"test"},
207},
208},
209},
210AnnotationNamespace: "",
211AnnotationTrigger: "",
212TemplateRefs: []string{"test/template"},
213},
214},
215},
216})
217storageController.UpdateTemplate(&v1alpha12.Template{
218ObjectMeta: v1.ObjectMeta{
219Name: "template",
220Namespace: "test",
221},
222Spec: v1alpha12.TemplateSpec{
223Kind: "Pod",
224ApiVersion: "v1",
225Data: "metadata:\n name: pod\nspec:\n abc: test",
226},
227})
228storage.Storage = storageController
229
230sch := runtime.NewScheme()
231_ = corev1.SchemeBuilder.AddToScheme(sch)
232podJson := "{\"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
234kubeapi.GetResource = func(ctx context.Context, resourceMeta *kubeapi.ResourceMeta, resourceName string, namespaceName string) ([]byte, error) {
235return nil, errors.NewNotFound(schema.GroupResource{}, "Pod test")
236}
237
238kubeapi.CreateResourceInKubeApi = func(ctx context.Context, client rest.Interface, resourceMeta *kubeapi.ResourceMeta, jsBody []byte, namespaceName string) ([]byte, error, error) {
239return []byte(podJson), nil, nil
240}
241
242f := &FactoryController{
243Client: kubernetes.New(&fake.RESTClient{}),
244renderer: NewRender(),
245}
246
247configConfs := ctrl.GetConfigOrDie()
248utils.Cl, _ = clientset.NewForConfig(configConfs)
249
250go func() {
251for {
252<-utils.WatcherAddNewObjectTo
253}
254}()
255
256t.Run("Create resource with removed status", func(t *testing.T) {
257err := f.Make(context.Background(), ti)
258if err == nil || !errors2.Is(err, ErrAllResourcesRemoved) {
259t.Fatal(err)
260}
261})
262t.Run("Create normal resource", func(t *testing.T) {
263err := f.Make(context.Background(), ti2)
264if err != nil {
265t.Fatal(err)
266}
267})
268
269kubeapi.GetResource = func(ctx context.Context, resourceMeta *kubeapi.ResourceMeta, resourceName string, namespaceName string) ([]byte, error) {
270return nil, fmt.Errorf("test error")
271}
272
273t.Run("Create resource with error on find", func(t *testing.T) {
274err := f.Make(context.Background(), ti2)
275if err == nil {
276t.Fatal(err)
277}
278})
279
280kubeapi.GetResourceMeta = func(client *kubernetes.Clientset, kind string, version string) *kubeapi.ResourceMeta {
281return nil
282}
283
284t.Run("Create normal resource with no meta", func(t *testing.T) {
285err := f.Make(context.Background(), ti2)
286if err == nil {
287t.Fatal(err)
288}
289})
290}
291
292func TestFactoryController_Start(t *testing.T) {
293kubeapi.GetClient = func() *kubernetes.Clientset {
294return nil
295}
296f := &FactoryController{}
297f.StartFactory()
298f.StopFactory()
299}
300
301func TestFactoryController_GetResourceName(t *testing.T) {
302type fields struct {
303Client *kubernetes.Clientset
304chObject chan bell.Message
305chStop chan bool
306}
307type args struct {
308tiName string
309templateName string
310kind string
311render util.RenderItem
312}
313tests := []struct {
314name string
315fields fields
316args args
317want string
318wantErr assert.ErrorAssertionFunc
319}{
320{
321name: "not_unique_name",
322args: args{
323tiName: "ti",
324kind: "pod",
325render: util.RenderItem{Render: "{\"metadata\":{\"name\":\"tmpl\"}}"},
326},
327want: "",
328wantErr: func(t assert.TestingT, err error, i ...interface{}) bool {
329assert.False(t, err != nil)
330return err != nil
331},
332},
333}
334for _, tt := range tests {
335t.Run(tt.name, func(t *testing.T) {
336f := &FactoryController{}
337got, err := f.getResourceName(tt.args.tiName, tt.args.kind, tt.args.render)
338if !tt.wantErr(t, err, fmt.Sprintf("getResourceName(%v, %v, %v, %v)", tt.args.tiName, tt.args.templateName, tt.args.kind, tt.args.render)) {
339return
340}
341assert.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