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  }