github.com/spotahome/redis-operator@v1.2.4/service/k8s/pod_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  	podsGroup = schema.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"}
    23  )
    24  
    25  func newPodUpdateAction(ns string, pod *corev1.Pod) kubetesting.UpdateActionImpl {
    26  	return kubetesting.NewUpdateAction(podsGroup, ns, pod)
    27  }
    28  
    29  func newPodGetAction(ns, name string) kubetesting.GetActionImpl {
    30  	return kubetesting.NewGetAction(podsGroup, ns, name)
    31  }
    32  
    33  func newPodCreateAction(ns string, pod *corev1.Pod) kubetesting.CreateActionImpl {
    34  	return kubetesting.NewCreateAction(podsGroup, ns, pod)
    35  }
    36  
    37  func TestPodServiceGetCreateOrUpdate(t *testing.T) {
    38  	testPod := &corev1.Pod{
    39  		ObjectMeta: metav1.ObjectMeta{
    40  			Name:            "testpod1",
    41  			ResourceVersion: "10",
    42  		},
    43  	}
    44  
    45  	testns := "testns"
    46  
    47  	tests := []struct {
    48  		name            string
    49  		pod             *corev1.Pod
    50  		getPodResult    *corev1.Pod
    51  		errorOnGet      error
    52  		errorOnCreation error
    53  		expActions      []kubetesting.Action
    54  		expErr          bool
    55  	}{
    56  		{
    57  			name:            "A new pod should create a new pod.",
    58  			pod:             testPod,
    59  			getPodResult:    nil,
    60  			errorOnGet:      kubeerrors.NewNotFound(schema.GroupResource{}, ""),
    61  			errorOnCreation: nil,
    62  			expActions: []kubetesting.Action{
    63  				newPodGetAction(testns, testPod.ObjectMeta.Name),
    64  				newPodCreateAction(testns, testPod),
    65  			},
    66  			expErr: false,
    67  		},
    68  		{
    69  			name:            "A new pod should error when create a new pod fails.",
    70  			pod:             testPod,
    71  			getPodResult:    nil,
    72  			errorOnGet:      kubeerrors.NewNotFound(schema.GroupResource{}, ""),
    73  			errorOnCreation: errors.New("wanted error"),
    74  			expActions: []kubetesting.Action{
    75  				newPodGetAction(testns, testPod.ObjectMeta.Name),
    76  				newPodCreateAction(testns, testPod),
    77  			},
    78  			expErr: true,
    79  		},
    80  		{
    81  			name:            "An existent pod should update the pod.",
    82  			pod:             testPod,
    83  			getPodResult:    testPod,
    84  			errorOnGet:      nil,
    85  			errorOnCreation: nil,
    86  			expActions: []kubetesting.Action{
    87  				newPodGetAction(testns, testPod.ObjectMeta.Name),
    88  				newPodUpdateAction(testns, testPod),
    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", "pods", func(action kubetesting.Action) (bool, runtime.Object, error) {
   101  				return true, test.getPodResult, test.errorOnGet
   102  			})
   103  			mcli.AddReactor("create", "pods", func(action kubetesting.Action) (bool, runtime.Object, error) {
   104  				return true, nil, test.errorOnCreation
   105  			})
   106  
   107  			service := k8s.NewPodService(mcli, log.Dummy, metrics.Dummy)
   108  			err := service.CreateOrUpdatePod(testns, test.pod)
   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  }