github.com/jenkins-x/jx/v2@v2.1.155/pkg/kube/jx_install_config_test.go (about)

     1  // +build unit
     2  
     3  package kube_test
     4  
     5  import (
     6  	"errors"
     7  	"testing"
     8  
     9  	"github.com/jenkins-x/jx/v2/pkg/kube"
    10  	"github.com/jenkins-x/jx/v2/pkg/util"
    11  	"github.com/stretchr/testify/assert"
    12  
    13  	v1 "k8s.io/api/core/v1"
    14  	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    15  	"k8s.io/apimachinery/pkg/runtime"
    16  	mock "k8s.io/client-go/kubernetes/fake"
    17  	k8sTesting "k8s.io/client-go/testing"
    18  )
    19  
    20  func buildConfigMap(jxInstallConfig *kube.JXInstallConfig, ns string) *v1.ConfigMap {
    21  	config := util.ToStringMapStringFromStruct(jxInstallConfig)
    22  	cm := &v1.ConfigMap{
    23  		Data: config,
    24  		ObjectMeta: meta_v1.ObjectMeta{
    25  			Name:      kube.ConfigMapNameJXInstallConfig,
    26  			Namespace: ns,
    27  		},
    28  	}
    29  	return cm
    30  }
    31  
    32  func TestToStringMapStringFromStructJXInstallConfig(t *testing.T) {
    33  	t.Parallel()
    34  	jxInstallConfig := &kube.JXInstallConfig{
    35  		Server: "derek.zoolander.reallygoodlooking.com",
    36  		CA:     []byte{0x49, 0x43, 0x41, 0x54},
    37  	}
    38  
    39  	m := util.ToStringMapStringFromStruct(jxInstallConfig)
    40  
    41  	assert.Equal(t, 3, len(m))
    42  	assert.Equal(t, "derek.zoolander.reallygoodlooking.com", m["server"])
    43  	assert.Equal(t, "ICAT", m["ca.crt"])
    44  }
    45  
    46  func TestSaveAsConfigMapExistingCM(t *testing.T) {
    47  	t.Parallel()
    48  	ns := "my-namespace"
    49  	jxInstallConfig := &kube.JXInstallConfig{
    50  		Server: "derek.zoolander.reallygoodlooking.com",
    51  		CA:     []byte{0x49, 0x43, 0x41, 0x54},
    52  	}
    53  
    54  	// Build a config map from our JXInstallConfig struct and a ns string
    55  	cm := buildConfigMap(jxInstallConfig, ns)
    56  
    57  	// Setup mock Kubernetes client api (pass objects to set as existing resources)
    58  	kubernetesInterface := mock.NewSimpleClientset(cm)
    59  
    60  	// Run our method
    61  	_, err := kube.SaveAsConfigMap(kubernetesInterface, kube.ConfigMapNameJXInstallConfig, ns, jxInstallConfig)
    62  
    63  	// Get Kubernetes client api actions
    64  	actions := kubernetesInterface.Actions()
    65  
    66  	assert.NoError(t, err)
    67  	assert.Equal(t, 2, len(actions))
    68  	assert.Equal(t, "get", actions[0].GetVerb())
    69  	assert.Equal(t, ns, actions[0].GetNamespace())
    70  	assert.Equal(t, "update", actions[1].GetVerb())
    71  	assert.Equal(t, ns, actions[1].GetNamespace())
    72  }
    73  
    74  func TestSaveAsConfigMapNoCM(t *testing.T) {
    75  	t.Parallel()
    76  	ns := "my-namespace"
    77  	jxInstallConfig := &kube.JXInstallConfig{
    78  		Server: "derek.zoolander.reallygoodlooking.com",
    79  		CA:     []byte{0x49, 0x43, 0x41, 0x54},
    80  	}
    81  
    82  	kubernetesInterface := mock.NewSimpleClientset()
    83  
    84  	_, err := kube.SaveAsConfigMap(kubernetesInterface, kube.ConfigMapNameJXInstallConfig, ns, jxInstallConfig)
    85  
    86  	actions := kubernetesInterface.Actions()
    87  
    88  	assert.NoError(t, err)
    89  	assert.Equal(t, 2, len(actions))
    90  	assert.Equal(t, "get", actions[0].GetVerb())
    91  	assert.Equal(t, ns, actions[0].GetNamespace())
    92  	assert.Equal(t, "create", actions[1].GetVerb())
    93  	assert.Equal(t, ns, actions[1].GetNamespace())
    94  }
    95  
    96  func TestSaveAsConfigMapCreateError(t *testing.T) {
    97  	t.Parallel()
    98  	ns := "my-namespace"
    99  
   100  	jxInstallConfig := &kube.JXInstallConfig{
   101  		Server: "derek.zoolander.reallygoodlooking.com",
   102  		CA:     []byte{0x49, 0x43, 0x41, 0x54},
   103  	}
   104  
   105  	kubernetesInterface := mock.NewSimpleClientset()
   106  
   107  	// Note Using AddReactor will not work here as reactors are already registered through NewSimpleClientset()
   108  	// Prepend reactor to catch action and perform custom logic. In this case return an error on configmap create.
   109  	kubernetesInterface.PrependReactor("create", "configmaps", func(action k8sTesting.Action) (handled bool, ret runtime.Object, err error) {
   110  		return true, nil, errors.New("KABOOM")
   111  	})
   112  
   113  	_, err := kube.SaveAsConfigMap(kubernetesInterface, kube.ConfigMapNameJXInstallConfig, ns, jxInstallConfig)
   114  
   115  	actions := kubernetesInterface.Actions()
   116  
   117  	assert.Error(t, err)
   118  	assert.Equal(t, 2, len(actions))
   119  	assert.Equal(t, "get", actions[0].GetVerb())
   120  	assert.Equal(t, ns, actions[0].GetNamespace())
   121  	assert.Equal(t, "create", actions[1].GetVerb())
   122  	assert.Equal(t, ns, actions[1].GetNamespace())
   123  }
   124  
   125  func TestSaveAsConfigMapUpdateError(t *testing.T) {
   126  	t.Parallel()
   127  	ns := "my-namespace"
   128  
   129  	jxInstallConfig := &kube.JXInstallConfig{
   130  		Server: "derek.zoolander.reallygoodlooking.com",
   131  		CA:     []byte{0x49, 0x43, 0x41, 0x54},
   132  	}
   133  
   134  	cm := buildConfigMap(jxInstallConfig, ns)
   135  
   136  	kubernetesInterface := mock.NewSimpleClientset(cm)
   137  
   138  	kubernetesInterface.PrependReactor("update", "configmaps", func(action k8sTesting.Action) (handled bool, ret runtime.Object, err error) {
   139  		return true, nil, errors.New("KABOOM")
   140  	})
   141  
   142  	_, err := kube.SaveAsConfigMap(kubernetesInterface, kube.ConfigMapNameJXInstallConfig, ns, jxInstallConfig)
   143  
   144  	actions := kubernetesInterface.Actions()
   145  
   146  	assert.Error(t, err)
   147  	assert.Equal(t, 2, len(actions))
   148  	assert.Equal(t, "get", actions[0].GetVerb())
   149  	assert.Equal(t, ns, actions[0].GetNamespace())
   150  	assert.Equal(t, "update", actions[1].GetVerb())
   151  	assert.Equal(t, ns, actions[1].GetNamespace())
   152  }