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 }