sigs.k8s.io/cluster-api@v1.7.1/cmd/clusterctl/client/config/imagemeta_client_test.go (about)

     1  /*
     2  Copyright 2020 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package config
    18  
    19  import (
    20  	"fmt"
    21  	"testing"
    22  
    23  	. "github.com/onsi/gomega"
    24  
    25  	"sigs.k8s.io/cluster-api/cmd/clusterctl/internal/test"
    26  )
    27  
    28  func Test_imageMetaClient_AlterImage(t *testing.T) {
    29  	type fields struct {
    30  		reader Reader
    31  	}
    32  	type args struct {
    33  		component string
    34  		image     string
    35  	}
    36  	tests := []struct {
    37  		name    string
    38  		fields  fields
    39  		args    args
    40  		want    string
    41  		wantErr bool
    42  	}{
    43  		{
    44  			name: "no image config: images should not be changes",
    45  			fields: fields{
    46  				reader: test.NewFakeReader(),
    47  			},
    48  			args: args{
    49  				component: "any",
    50  				image:     "quay.io/jetstack/cert-manager-cainjector:v1.1.0",
    51  			},
    52  			want:    "quay.io/jetstack/cert-manager-cainjector:v1.1.0",
    53  			wantErr: false,
    54  		},
    55  		{
    56  			name: "image config for cert-manager/cert-manager-cainjector: image for the cert-manager/cert-manager-cainjector should be changed",
    57  			fields: fields{
    58  				reader: test.NewFakeReader().WithImageMeta(fmt.Sprintf("%s/cert-manager-cainjector", CertManagerImageComponent), "foo-repository.io", "foo-tag"),
    59  			},
    60  			args: args{
    61  				component: CertManagerImageComponent,
    62  				image:     "quay.io/jetstack/cert-manager-cainjector:v1.1.0",
    63  			},
    64  			want:    "foo-repository.io/cert-manager-cainjector:foo-tag",
    65  			wantErr: false,
    66  		},
    67  		{
    68  			name: "image config for cert-manager/cert-manager-cainjector: image for the cert-manager/cert-manager-webhook should not be changed",
    69  			fields: fields{
    70  				reader: test.NewFakeReader().WithImageMeta(fmt.Sprintf("%s/cert-manager-cainjector", CertManagerImageComponent), "foo-repository.io", "foo-tag"),
    71  			},
    72  			args: args{
    73  				component: CertManagerImageComponent,
    74  				image:     "quay.io/jetstack/cert-manager-webhook:v1.1.0",
    75  			},
    76  			want:    "quay.io/jetstack/cert-manager-webhook:v1.1.0",
    77  			wantErr: false,
    78  		},
    79  		{
    80  			name: "image config for cert-manager: images for the cert-manager should be changed",
    81  			fields: fields{
    82  				reader: test.NewFakeReader().WithImageMeta(CertManagerImageComponent, "foo-repository.io", "foo-tag"),
    83  			},
    84  			args: args{
    85  				component: CertManagerImageComponent,
    86  				image:     "quay.io/jetstack/cert-manager-cainjector:v1.1.0",
    87  			},
    88  			want:    "foo-repository.io/cert-manager-cainjector:foo-tag",
    89  			wantErr: false,
    90  		},
    91  		{
    92  			name: "image config for cert-manager/cert-manager-cainjector and for cert-manager: images for the cert-manager/cert-manager-cainjector should be changed according to the most specific",
    93  			fields: fields{
    94  				reader: test.NewFakeReader().
    95  					WithImageMeta(fmt.Sprintf("%s/cert-manager-cainjector", CertManagerImageComponent), "foo-repository.io", "foo-tag").
    96  					WithImageMeta(CertManagerImageComponent, "bar-repository.io", "bar-tag"),
    97  			},
    98  			args: args{
    99  				component: CertManagerImageComponent,
   100  				image:     "quay.io/jetstack/cert-manager-cainjector:v1.1.0",
   101  			},
   102  			want:    "foo-repository.io/cert-manager-cainjector:foo-tag",
   103  			wantErr: false,
   104  		},
   105  		{
   106  			name: "image config for cert-manager/cert-manager-cainjector and for cert-manager: images for the cert-manager/cert-manager-cainjector should be changed according to the most specific (mixed case)",
   107  			fields: fields{
   108  				reader: test.NewFakeReader().
   109  					WithImageMeta(fmt.Sprintf("%s/cert-manager-cainjector", CertManagerImageComponent), "foo-repository.io", "").
   110  					WithImageMeta(CertManagerImageComponent, "", "bar-tag"),
   111  			},
   112  			args: args{
   113  				component: CertManagerImageComponent,
   114  				image:     "quay.io/jetstack/cert-manager-cainjector:v1.1.0",
   115  			},
   116  			want:    "foo-repository.io/cert-manager-cainjector:bar-tag",
   117  			wantErr: false,
   118  		},
   119  		{
   120  			name: "image config for cert-manager/cert-manager-cainjector and for cert-manager: images for the cert-manager/cert-manager-webhook should be changed according to the most generic",
   121  			fields: fields{
   122  				reader: test.NewFakeReader().
   123  					WithImageMeta(fmt.Sprintf("%s/cert-manager-cainjector", CertManagerImageComponent), "foo-repository.io", "foo-tag").
   124  					WithImageMeta(CertManagerImageComponent, "bar-repository.io", "bar-tag"),
   125  			},
   126  			args: args{
   127  				component: CertManagerImageComponent,
   128  				image:     "quay.io/jetstack/cert-manager-webhook:v1.1.0",
   129  			},
   130  			want:    "bar-repository.io/cert-manager-webhook:bar-tag",
   131  			wantErr: false,
   132  		},
   133  		{
   134  			name: "image config for all: images for the cert-manager should be changed",
   135  			fields: fields{
   136  				reader: test.NewFakeReader().WithImageMeta(allImageConfig, "foo-repository.io", "foo-tag"),
   137  			},
   138  			args: args{
   139  				component: CertManagerImageComponent,
   140  				image:     "quay.io/jetstack/cert-manager-cainjector:v1.1.0",
   141  			},
   142  			want:    "foo-repository.io/cert-manager-cainjector:foo-tag",
   143  			wantErr: false,
   144  		},
   145  		{
   146  			name: "image config for all and for cert-manager: images for the cert-manager should be changed according to the most specific",
   147  			fields: fields{
   148  				reader: test.NewFakeReader().
   149  					WithImageMeta(allImageConfig, "foo-repository.io", "foo-tag").
   150  					WithImageMeta(CertManagerImageComponent, "bar-repository.io", "bar-tag"),
   151  			},
   152  			args: args{
   153  				component: CertManagerImageComponent,
   154  				image:     "quay.io/jetstack/cert-manager-cainjector:v1.1.0",
   155  			},
   156  			want:    "bar-repository.io/cert-manager-cainjector:bar-tag",
   157  			wantErr: false,
   158  		},
   159  		{
   160  			name: "image config for all and for cert-manager: images for the cert-manager should be changed according to the most specific (mixed case)",
   161  			fields: fields{
   162  				reader: test.NewFakeReader().
   163  					WithImageMeta(allImageConfig, "foo-repository.io", "").
   164  					WithImageMeta(CertManagerImageComponent, "", "bar-tag"),
   165  			},
   166  			args: args{
   167  				component: CertManagerImageComponent,
   168  				image:     "quay.io/jetstack/cert-manager-cainjector:v1.1.0",
   169  			},
   170  			want:    "foo-repository.io/cert-manager-cainjector:bar-tag",
   171  			wantErr: false,
   172  		},
   173  		{
   174  			name: "image config for cert-manager/cert-manager-cainjector, for cert-manager and for all: images for the cert-manager/cert-manager-cainjector should be changed according to the most specific",
   175  			fields: fields{
   176  				reader: test.NewFakeReader().
   177  					WithImageMeta(fmt.Sprintf("%s/cert-manager-cainjector", CertManagerImageComponent), "foo-repository.io", "foo-tag").
   178  					WithImageMeta(CertManagerImageComponent, "bar-repository.io", "bar-tag").
   179  					WithImageMeta(allImageConfig, "baz-repository.io", "baz-tag"),
   180  			},
   181  			args: args{
   182  				component: CertManagerImageComponent,
   183  				image:     "quay.io/jetstack/cert-manager-cainjector:v1.1.0",
   184  			},
   185  			want:    "foo-repository.io/cert-manager-cainjector:foo-tag",
   186  			wantErr: false,
   187  		},
   188  		{
   189  			name: "image config for cert-manager/cert-manager-cainjector, for cert-manager and for all: images for the cert-manager/cert-manager-cainjector should be changed according to the most specific (mixed case)",
   190  			fields: fields{
   191  				reader: test.NewFakeReader().
   192  					WithImageMeta(fmt.Sprintf("%s/cert-manager-cainjector", CertManagerImageComponent), "foo-repository.io", "").
   193  					WithImageMeta(CertManagerImageComponent, "", "bar-tag").
   194  					WithImageMeta(allImageConfig, "baz-repository.io", "baz-tag"),
   195  			},
   196  			args: args{
   197  				component: CertManagerImageComponent,
   198  				image:     "quay.io/jetstack/cert-manager-cainjector:v1.1.0",
   199  			},
   200  			want:    "foo-repository.io/cert-manager-cainjector:bar-tag",
   201  			wantErr: false,
   202  		},
   203  		{
   204  			name: "image config for cert-manager/cert-manager-cainjector, for cert-manager and for all: images for the cert-manager/cert-manager-webhook should be changed according to the most generic",
   205  			fields: fields{
   206  				reader: test.NewFakeReader().
   207  					WithImageMeta(fmt.Sprintf("%s/cert-manager-cainjector", CertManagerImageComponent), "foo-repository.io", "foo-tag").
   208  					WithImageMeta(CertManagerImageComponent, "bar-repository.io", "").
   209  					WithImageMeta(allImageConfig, "baz-repository.io", "baz-tag"),
   210  			},
   211  			args: args{
   212  				component: CertManagerImageComponent,
   213  				image:     "quay.io/jetstack/cert-manager-webhook:v1.1.0",
   214  			},
   215  			want:    "bar-repository.io/cert-manager-webhook:baz-tag",
   216  			wantErr: false,
   217  		},
   218  		{
   219  			name: "fails if wrong image config",
   220  			fields: fields{
   221  				reader: test.NewFakeReader().WithVar(imagesConfigKey, "invalid"),
   222  			},
   223  			args: args{
   224  				component: "any",
   225  				image:     "any",
   226  			},
   227  			want:    "",
   228  			wantErr: true,
   229  		},
   230  		{
   231  			name: "fails if wrong image name",
   232  			fields: fields{
   233  				reader: test.NewFakeReader().WithImageMeta(allImageConfig, "foo-Repository.io", ""),
   234  			},
   235  			args: args{
   236  				component: "any",
   237  				image:     "invalid:invalid:invalid",
   238  			},
   239  			want:    "",
   240  			wantErr: true,
   241  		},
   242  	}
   243  	for _, tt := range tests {
   244  		t.Run(tt.name, func(t *testing.T) {
   245  			g := NewWithT(t)
   246  
   247  			p := newImageMetaClient(tt.fields.reader)
   248  
   249  			got, err := p.AlterImage(tt.args.component, tt.args.image)
   250  			if tt.wantErr {
   251  				g.Expect(err).To(HaveOccurred())
   252  				return
   253  			}
   254  
   255  			g.Expect(err).ToNot(HaveOccurred())
   256  			g.Expect(got).To(Equal(tt.want))
   257  		})
   258  	}
   259  }