github.com/spotahome/redis-operator@v1.2.4/service/k8s/deployment_test.go (about) 1 package k8s_test 2 3 import ( 4 "errors" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 appsv1 "k8s.io/api/apps/v1" 9 kubeerrors "k8s.io/apimachinery/pkg/api/errors" 10 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 11 "k8s.io/apimachinery/pkg/runtime" 12 "k8s.io/apimachinery/pkg/runtime/schema" 13 kubernetes "k8s.io/client-go/kubernetes/fake" 14 kubetesting "k8s.io/client-go/testing" 15 16 "github.com/spotahome/redis-operator/log" 17 "github.com/spotahome/redis-operator/metrics" 18 "github.com/spotahome/redis-operator/service/k8s" 19 ) 20 21 var ( 22 deploymentsGroup = schema.GroupVersionResource{Group: "apps", Version: "v1", Resource: "deployments"} 23 ) 24 25 func newDeploymentUpdateAction(ns string, deployment *appsv1.Deployment) kubetesting.UpdateActionImpl { 26 return kubetesting.NewUpdateAction(deploymentsGroup, ns, deployment) 27 } 28 29 func newDeploymentGetAction(ns, name string) kubetesting.GetActionImpl { 30 return kubetesting.NewGetAction(deploymentsGroup, ns, name) 31 } 32 33 func newDeploymentCreateAction(ns string, deployment *appsv1.Deployment) kubetesting.CreateActionImpl { 34 return kubetesting.NewCreateAction(deploymentsGroup, ns, deployment) 35 } 36 37 func TestDeploymentServiceGetCreateOrUpdate(t *testing.T) { 38 testDeployment := &appsv1.Deployment{ 39 ObjectMeta: metav1.ObjectMeta{ 40 Name: "testdeployment1", 41 ResourceVersion: "10", 42 }, 43 } 44 45 testns := "testns" 46 47 tests := []struct { 48 name string 49 deployment *appsv1.Deployment 50 getDeploymentResult *appsv1.Deployment 51 errorOnGet error 52 errorOnCreation error 53 expActions []kubetesting.Action 54 expErr bool 55 }{ 56 { 57 name: "A new deployment should create a new deployment.", 58 deployment: testDeployment, 59 getDeploymentResult: nil, 60 errorOnGet: kubeerrors.NewNotFound(schema.GroupResource{}, ""), 61 errorOnCreation: nil, 62 expActions: []kubetesting.Action{ 63 newDeploymentGetAction(testns, testDeployment.ObjectMeta.Name), 64 newDeploymentCreateAction(testns, testDeployment), 65 }, 66 expErr: false, 67 }, 68 { 69 name: "A new deployment should error when create a new deployment fails.", 70 deployment: testDeployment, 71 getDeploymentResult: nil, 72 errorOnGet: kubeerrors.NewNotFound(schema.GroupResource{}, ""), 73 errorOnCreation: errors.New("wanted error"), 74 expActions: []kubetesting.Action{ 75 newDeploymentGetAction(testns, testDeployment.ObjectMeta.Name), 76 newDeploymentCreateAction(testns, testDeployment), 77 }, 78 expErr: true, 79 }, 80 { 81 name: "An existent deployment should update the deployment.", 82 deployment: testDeployment, 83 getDeploymentResult: testDeployment, 84 errorOnGet: nil, 85 errorOnCreation: nil, 86 expActions: []kubetesting.Action{ 87 newDeploymentGetAction(testns, testDeployment.ObjectMeta.Name), 88 newDeploymentUpdateAction(testns, testDeployment), 89 }, 90 expErr: false, 91 }, 92 } 93 94 for _, test := range tests { 95 t.Run(test.name, func(t *testing.T) { 96 assert := assert.New(t) 97 98 // Mock. 99 mcli := &kubernetes.Clientset{} 100 mcli.AddReactor("get", "deployments", func(action kubetesting.Action) (bool, runtime.Object, error) { 101 return true, test.getDeploymentResult, test.errorOnGet 102 }) 103 mcli.AddReactor("create", "deployments", func(action kubetesting.Action) (bool, runtime.Object, error) { 104 return true, nil, test.errorOnCreation 105 }) 106 107 service := k8s.NewDeploymentService(mcli, log.Dummy, metrics.Dummy) 108 err := service.CreateOrUpdateDeployment(testns, test.deployment) 109 110 if test.expErr { 111 assert.Error(err) 112 } else { 113 assert.NoError(err) 114 // Check calls to kubernetes. 115 assert.Equal(test.expActions, mcli.Actions()) 116 } 117 }) 118 } 119 }