github.com/spotahome/redis-operator@v1.2.4/service/k8s/service_test.go (about)

     1  package k8s_test
     2  
     3  import (
     4  	"errors"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  	corev1 "k8s.io/api/core/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  	servicesGroup = schema.GroupVersionResource{Group: "", Version: "v1", Resource: "services"}
    23  )
    24  
    25  func newServiceUpdateAction(ns string, service *corev1.Service) kubetesting.UpdateActionImpl {
    26  	return kubetesting.NewUpdateAction(servicesGroup, ns, service)
    27  }
    28  
    29  func newServiceGetAction(ns, name string) kubetesting.GetActionImpl {
    30  	return kubetesting.NewGetAction(servicesGroup, ns, name)
    31  }
    32  
    33  func newServiceCreateAction(ns string, service *corev1.Service) kubetesting.CreateActionImpl {
    34  	return kubetesting.NewCreateAction(servicesGroup, ns, service)
    35  }
    36  
    37  func TestServiceServiceGetCreateOrUpdate(t *testing.T) {
    38  	testService := &corev1.Service{
    39  		ObjectMeta: metav1.ObjectMeta{
    40  			Name:            "testservice1",
    41  			ResourceVersion: "10",
    42  		},
    43  	}
    44  
    45  	testns := "testns"
    46  
    47  	tests := []struct {
    48  		name             string
    49  		service          *corev1.Service
    50  		getServiceResult *corev1.Service
    51  		errorOnGet       error
    52  		errorOnCreation  error
    53  		expActions       []kubetesting.Action
    54  		expErr           bool
    55  	}{
    56  		{
    57  			name:             "A new service should create a new service.",
    58  			service:          testService,
    59  			getServiceResult: nil,
    60  			errorOnGet:       kubeerrors.NewNotFound(schema.GroupResource{}, ""),
    61  			errorOnCreation:  nil,
    62  			expActions: []kubetesting.Action{
    63  				newServiceGetAction(testns, testService.ObjectMeta.Name),
    64  				newServiceCreateAction(testns, testService),
    65  			},
    66  			expErr: false,
    67  		},
    68  		{
    69  			name:             "A new service should error when create a new service fails.",
    70  			service:          testService,
    71  			getServiceResult: nil,
    72  			errorOnGet:       kubeerrors.NewNotFound(schema.GroupResource{}, ""),
    73  			errorOnCreation:  errors.New("wanted error"),
    74  			expActions: []kubetesting.Action{
    75  				newServiceGetAction(testns, testService.ObjectMeta.Name),
    76  				newServiceCreateAction(testns, testService),
    77  			},
    78  			expErr: true,
    79  		},
    80  		{
    81  			name:             "An existent service should update the service.",
    82  			service:          testService,
    83  			getServiceResult: testService,
    84  			errorOnGet:       nil,
    85  			errorOnCreation:  nil,
    86  			expActions: []kubetesting.Action{
    87  				newServiceGetAction(testns, testService.ObjectMeta.Name),
    88  				newServiceUpdateAction(testns, testService),
    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", "services", func(action kubetesting.Action) (bool, runtime.Object, error) {
   101  				return true, test.getServiceResult, test.errorOnGet
   102  			})
   103  			mcli.AddReactor("create", "services", func(action kubetesting.Action) (bool, runtime.Object, error) {
   104  				return true, nil, test.errorOnCreation
   105  			})
   106  
   107  			service := k8s.NewServiceService(mcli, log.Dummy, metrics.Dummy)
   108  			err := service.CreateOrUpdateService(testns, test.service)
   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  }