kubelatte-ce
Форк от sbertech/kubelatte-ce
343 строки · 12.7 Кб
1package creation2
3import (4"context"5"fmt"6"github.com/stretchr/testify/mock"7v1alpha12 "gitverse.ru/ktrntrsv/kubelatte-ce/pkg/api/v1alpha1"8"gitverse.ru/ktrntrsv/kubelatte-ce/pkg/kubeapi"9"gitverse.ru/ktrntrsv/kubelatte-ce/pkg/observability/logger/lib"10"gitverse.ru/ktrntrsv/kubelatte-ce/pkg/operator/controllers/clientset"11"gitverse.ru/ktrntrsv/kubelatte-ce/pkg/operator/controllers/clientset/mocks"12"gitverse.ru/ktrntrsv/kubelatte-ce/pkg/operator/utils"13"gitverse.ru/ktrntrsv/kubelatte-ce/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 = &clt98kubeapi.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 = &clt143
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), nil150}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 = &clt195kubeapi.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 = &clt256kubeapi.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 = &clt319kubeapi.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