github.com/spotahome/redis-operator@v1.2.4/service/k8s/poddisruptionbudget_test.go (about) 1 package k8s_test 2 3 import ( 4 "errors" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 policyv1 "k8s.io/api/policy/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 podDisruptionBudgetsGroup = schema.GroupVersionResource{Group: "policy", Version: "v1", Resource: "poddisruptionbudgets"} 22 23 func newPodDisruptionBudgetUpdateAction(ns string, podDisruptionBudget *policyv1.PodDisruptionBudget) kubetesting.UpdateActionImpl { 24 return kubetesting.NewUpdateAction(podDisruptionBudgetsGroup, ns, podDisruptionBudget) 25 } 26 27 func newPodDisruptionBudgetGetAction(ns, name string) kubetesting.GetActionImpl { 28 return kubetesting.NewGetAction(podDisruptionBudgetsGroup, ns, name) 29 } 30 31 func newPodDisruptionBudgetCreateAction(ns string, podDisruptionBudget *policyv1.PodDisruptionBudget) kubetesting.CreateActionImpl { 32 return kubetesting.NewCreateAction(podDisruptionBudgetsGroup, ns, podDisruptionBudget) 33 } 34 35 func TestPodDisruptionBudgetServiceGetCreateOrUpdate(t *testing.T) { 36 testPodDisruptionBudget := &policyv1.PodDisruptionBudget{ 37 ObjectMeta: metav1.ObjectMeta{ 38 Name: "testpodDisruptionBudget1", 39 ResourceVersion: "10", 40 }, 41 } 42 43 testns := "testns" 44 45 tests := []struct { 46 name string 47 podDisruptionBudget *policyv1.PodDisruptionBudget 48 getPodDisruptionBudgetResult *policyv1.PodDisruptionBudget 49 errorOnGet error 50 errorOnCreation error 51 expActions []kubetesting.Action 52 expErr bool 53 }{ 54 { 55 name: "A new podDisruptionBudget should create a new podDisruptionBudget.", 56 podDisruptionBudget: testPodDisruptionBudget, 57 getPodDisruptionBudgetResult: nil, 58 errorOnGet: kubeerrors.NewNotFound(schema.GroupResource{}, ""), 59 errorOnCreation: nil, 60 expActions: []kubetesting.Action{ 61 newPodDisruptionBudgetGetAction(testns, testPodDisruptionBudget.ObjectMeta.Name), 62 newPodDisruptionBudgetCreateAction(testns, testPodDisruptionBudget), 63 }, 64 expErr: false, 65 }, 66 { 67 name: "A new podDisruptionBudget should error when create a new podDisruptionBudget fails.", 68 podDisruptionBudget: testPodDisruptionBudget, 69 getPodDisruptionBudgetResult: nil, 70 errorOnGet: kubeerrors.NewNotFound(schema.GroupResource{}, ""), 71 errorOnCreation: errors.New("wanted error"), 72 expActions: []kubetesting.Action{ 73 newPodDisruptionBudgetGetAction(testns, testPodDisruptionBudget.ObjectMeta.Name), 74 newPodDisruptionBudgetCreateAction(testns, testPodDisruptionBudget), 75 }, 76 expErr: true, 77 }, 78 { 79 name: "An existent podDisruptionBudget should update the podDisruptionBudget.", 80 podDisruptionBudget: testPodDisruptionBudget, 81 getPodDisruptionBudgetResult: testPodDisruptionBudget, 82 errorOnGet: nil, 83 errorOnCreation: nil, 84 expActions: []kubetesting.Action{ 85 newPodDisruptionBudgetGetAction(testns, testPodDisruptionBudget.ObjectMeta.Name), 86 newPodDisruptionBudgetUpdateAction(testns, testPodDisruptionBudget), 87 }, 88 expErr: false, 89 }, 90 } 91 92 for _, test := range tests { 93 t.Run(test.name, func(t *testing.T) { 94 assert := assert.New(t) 95 96 // Mock. 97 mcli := &kubernetes.Clientset{} 98 mcli.AddReactor("get", "poddisruptionbudgets", func(action kubetesting.Action) (bool, runtime.Object, error) { 99 return true, test.getPodDisruptionBudgetResult, test.errorOnGet 100 }) 101 mcli.AddReactor("create", "poddisruptionbudgets", func(action kubetesting.Action) (bool, runtime.Object, error) { 102 return true, nil, test.errorOnCreation 103 }) 104 105 service := k8s.NewPodDisruptionBudgetService(mcli, log.Dummy, metrics.Dummy) 106 err := service.CreateOrUpdatePodDisruptionBudget(testns, test.podDisruptionBudget) 107 108 if test.expErr { 109 assert.Error(err) 110 } else { 111 assert.NoError(err) 112 // Check calls to kubernetes. 113 assert.Equal(test.expActions, mcli.Actions()) 114 } 115 }) 116 } 117 }