github.com/olli-ai/jx/v2@v2.0.400-0.20210921045218-14731b4dd448/pkg/cmd/upgrade/upgrade_ingress_test.go (about)

     1  // +build unit
     2  
     3  package upgrade_test
     4  
     5  import (
     6  	"io/ioutil"
     7  	"path/filepath"
     8  	"testing"
     9  
    10  	"github.com/olli-ai/jx/v2/pkg/cmd/opts/upgrade"
    11  
    12  	"github.com/olli-ai/jx/v2/pkg/kube/services"
    13  
    14  	"github.com/ghodss/yaml"
    15  	"github.com/olli-ai/jx/v2/pkg/cmd/opts"
    16  	"github.com/olli-ai/jx/v2/pkg/kube"
    17  	"github.com/stretchr/testify/assert"
    18  	v1 "k8s.io/api/core/v1"
    19  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    20  	testclient "k8s.io/client-go/kubernetes/fake"
    21  )
    22  
    23  type TestOptions struct {
    24  	upgrade.UpgradeIngressOptions
    25  	Service *v1.Service
    26  }
    27  
    28  func (o *TestOptions) Setup() {
    29  	o.UpgradeIngressOptions = upgrade.UpgradeIngressOptions{
    30  		CommonOptions: &opts.CommonOptions{},
    31  		IngressConfig: kube.IngressConfig{
    32  			Issuer: "letsencrypt-prod",
    33  		},
    34  		TargetNamespaces: []string{"test"},
    35  	}
    36  	o.SetKubeClient(testclient.NewSimpleClientset())
    37  
    38  	o.Service = &v1.Service{
    39  		ObjectMeta: metav1.ObjectMeta{
    40  			Name: "foo",
    41  		},
    42  		Spec: v1.ServiceSpec{},
    43  	}
    44  
    45  	o.Service.Annotations = map[string]string{}
    46  	o.Service.Annotations[services.ExposeAnnotation] = "true"
    47  }
    48  
    49  func TestAnnotateNoExisting(t *testing.T) {
    50  	t.Parallel()
    51  	o := TestOptions{}
    52  	o.Setup()
    53  
    54  	client, err := o.KubeClient()
    55  	assert.NoError(t, err)
    56  	_, err = client.CoreV1().Services("test").Create(o.Service)
    57  	assert.NoError(t, err)
    58  
    59  	err = o.CleanServiceAnnotations()
    60  	assert.NoError(t, err)
    61  
    62  	_, err = o.AnnotateExposedServicesWithCertManager()
    63  	assert.NoError(t, err)
    64  
    65  	rs, err := client.CoreV1().Services("test").Get("foo", metav1.GetOptions{})
    66  	ingressAnnotations := rs.Annotations[services.ExposeIngressAnnotation]
    67  
    68  	assert.Equal(t, "certmanager.k8s.io/issuer: letsencrypt-prod", ingressAnnotations)
    69  	assert.NoError(t, err)
    70  }
    71  
    72  func TestAnnotateWithExistingAnnotations(t *testing.T) {
    73  
    74  	o := TestOptions{}
    75  	o.Setup()
    76  
    77  	o.Service.Annotations[services.ExposeIngressAnnotation] = "foo: bar\nkubernetes.io/ingress.class: nginx\nnginx.ingress.kubernetes.io/proxy-body-size: 500m"
    78  
    79  	client, err := o.KubeClient()
    80  	assert.NoError(t, err)
    81  
    82  	_, err = client.CoreV1().Services("test").Create(o.Service)
    83  	assert.NoError(t, err)
    84  
    85  	err = o.CleanServiceAnnotations()
    86  	assert.NoError(t, err)
    87  
    88  	_, err = o.AnnotateExposedServicesWithCertManager()
    89  	assert.NoError(t, err)
    90  
    91  	rs, err := client.CoreV1().Services("test").Get("foo", metav1.GetOptions{})
    92  	ingressAnnotations := rs.Annotations[services.ExposeIngressAnnotation]
    93  
    94  	assert.Equal(t, "foo: bar\nkubernetes.io/ingress.class: nginx\nnginx.ingress.kubernetes.io/proxy-body-size: 500m\ncertmanager.k8s.io/issuer: letsencrypt-prod", ingressAnnotations)
    95  	assert.NoError(t, err)
    96  }
    97  
    98  func TestAnnotateWithExistingCertManagerAnnotation(t *testing.T) {
    99  	t.Parallel()
   100  	o := TestOptions{}
   101  	o.Setup()
   102  
   103  	o.Service.Annotations[services.ExposeIngressAnnotation] = services.CertManagerAnnotation + ": letsencrypt-staging"
   104  
   105  	client, err := o.KubeClient()
   106  	assert.NoError(t, err)
   107  
   108  	_, err = client.CoreV1().Services("test").Create(o.Service)
   109  	assert.NoError(t, err)
   110  
   111  	err = o.CleanServiceAnnotations()
   112  	assert.NoError(t, err)
   113  
   114  	_, err = o.AnnotateExposedServicesWithCertManager()
   115  	assert.NoError(t, err)
   116  
   117  	rs, err := client.CoreV1().Services("test").Get("foo", metav1.GetOptions{})
   118  	ingressAnnotations := rs.Annotations[services.ExposeIngressAnnotation]
   119  
   120  	assert.Equal(t, "certmanager.k8s.io/issuer: letsencrypt-prod", ingressAnnotations)
   121  	assert.NoError(t, err)
   122  }
   123  
   124  func TestCleanExistingExposecontrollerReources(t *testing.T) {
   125  	t.Parallel()
   126  	o := TestOptions{}
   127  	o.Setup()
   128  
   129  	cm := v1.ConfigMap{
   130  		ObjectMeta: metav1.ObjectMeta{
   131  			Name: "exposecontroller",
   132  		},
   133  	}
   134  	client, err := o.KubeClient()
   135  	assert.NoError(t, err)
   136  
   137  	_, err = client.CoreV1().ConfigMaps("test").Create(&cm)
   138  	assert.NoError(t, err)
   139  	o.CleanExposecontrollerReources("test")
   140  
   141  	_, err = client.CoreV1().ConfigMaps("test").Get("exposecontroller", metav1.GetOptions{})
   142  	assert.Error(t, err)
   143  }
   144  
   145  func TestCleanServiceAnnotations(t *testing.T) {
   146  	t.Parallel()
   147  	o := TestOptions{}
   148  	o.Setup()
   149  
   150  	o.Service.Annotations[services.ExposeURLAnnotation] = "http://foo.bar"
   151  
   152  	client, err := o.KubeClient()
   153  	assert.NoError(t, err)
   154  
   155  	_, err = client.CoreV1().Services("test").Create(o.Service)
   156  	assert.NoError(t, err)
   157  
   158  	err = o.CleanServiceAnnotations()
   159  	assert.NoError(t, err)
   160  
   161  	rs, err := client.CoreV1().Services("test").Get("foo", metav1.GetOptions{})
   162  
   163  	assert.Empty(t, rs.Annotations[services.ExposeURLAnnotation])
   164  	assert.NoError(t, err)
   165  }
   166  
   167  func TestRealJenkinsService(t *testing.T) {
   168  	t.Parallel()
   169  	filename := filepath.Join(".", "test_data", "upgrade_ingress", "service.yaml")
   170  	serviceYaml, err := ioutil.ReadFile(filename)
   171  	assert.NoError(t, err)
   172  
   173  	var svc *v1.Service
   174  	err = yaml.Unmarshal(serviceYaml, &svc)
   175  	assert.NoError(t, err)
   176  
   177  	o := TestOptions{}
   178  	o.Setup()
   179  
   180  	o.Service = svc
   181  
   182  	client, err := o.KubeClient()
   183  	assert.NoError(t, err)
   184  
   185  	_, err = client.CoreV1().Services("test").Create(o.Service)
   186  	assert.NoError(t, err)
   187  
   188  	err = o.CleanServiceAnnotations()
   189  	assert.NoError(t, err)
   190  
   191  	_, err = o.AnnotateExposedServicesWithCertManager()
   192  	assert.NoError(t, err)
   193  
   194  	rs, err := client.CoreV1().Services("test").Get("jenkins", metav1.GetOptions{})
   195  	ingressAnnotations := rs.Annotations[services.ExposeIngressAnnotation]
   196  
   197  	assert.Equal(t, "kubernetes.io/ingress.class: nginx\nnginx.ingress.kubernetes.io/proxy-body-size: 500m\ncertmanager.k8s.io/issuer: letsencrypt-prod", ingressAnnotations)
   198  	assert.NoError(t, err)
   199  }
   200  
   201  func TestReturnUserNameIfPicked_notPicked(t *testing.T) {
   202  	t.Parallel()
   203  	organisation := "MyOrg"
   204  	username := "MyUser"
   205  
   206  	actual := upgrade.ReturnUserNameIfPicked(organisation, username)
   207  	expected := ""
   208  	assert.Equal(t, expected, actual, "Username should be empty an organization was picked")
   209  }
   210  
   211  func TestReturnUserNameIfPicked_wasPicked(t *testing.T) {
   212  	t.Parallel()
   213  	organisation := ""
   214  	username := "MyUser"
   215  
   216  	actual := upgrade.ReturnUserNameIfPicked(organisation, username)
   217  	expected := username
   218  	assert.Equal(t, expected, actual, "Username should be returned as no organization was picked")
   219  }