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  }