sigs.k8s.io/cluster-api-provider-azure@v1.14.3/azure/services/virtualmachineimages/images_test.go (about) 1 /* 2 Copyright 2022 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 virtualmachineimages 18 19 import ( 20 "context" 21 "strings" 22 "testing" 23 24 "github.com/Azure/azure-sdk-for-go/sdk/azidentity" 25 "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5" 26 . "github.com/onsi/gomega" 27 "go.uber.org/mock/gomock" 28 "k8s.io/utils/ptr" 29 "sigs.k8s.io/cluster-api-provider-azure/azure" 30 "sigs.k8s.io/cluster-api-provider-azure/azure/mock_azure" 31 "sigs.k8s.io/cluster-api-provider-azure/azure/services/virtualmachineimages/mock_virtualmachineimages" 32 ) 33 34 func TestGetDefaultUbuntuImage(t *testing.T) { 35 tests := []struct { 36 k8sVersion string 37 expectedSKU string 38 expectedVersion string 39 versions armcompute.VirtualMachineImagesClientListResponse 40 }{ 41 { 42 k8sVersion: "v1.15.6", 43 expectedSKU: "k8s-1dot15dot6-ubuntu-1804", 44 expectedVersion: "latest", 45 }, 46 { 47 k8sVersion: "v1.17.11", 48 expectedSKU: "k8s-1dot17dot11-ubuntu-1804", 49 expectedVersion: "latest", 50 }, 51 { 52 k8sVersion: "v1.18.19", 53 expectedSKU: "k8s-1dot18dot19-ubuntu-1804", 54 expectedVersion: "latest", 55 }, 56 { 57 k8sVersion: "v1.18.20", 58 expectedSKU: "k8s-1dot18dot20-ubuntu-2004", 59 expectedVersion: "latest", 60 }, 61 { 62 k8sVersion: "v1.19.11", 63 expectedSKU: "k8s-1dot19dot11-ubuntu-1804", 64 expectedVersion: "latest", 65 }, 66 { 67 k8sVersion: "v1.19.12", 68 expectedSKU: "k8s-1dot19dot12-ubuntu-2004", 69 expectedVersion: "latest", 70 }, 71 { 72 k8sVersion: "v1.21.1", 73 expectedSKU: "k8s-1dot21dot1-ubuntu-1804", 74 expectedVersion: "latest", 75 }, 76 { 77 k8sVersion: "v1.21.2", 78 expectedSKU: "k8s-1dot21dot2-ubuntu-2004", 79 expectedVersion: "latest", 80 }, 81 { 82 k8sVersion: "v1.21.12", 83 expectedSKU: "k8s-1dot21dot12-ubuntu-2004", 84 expectedVersion: "latest", 85 }, 86 { 87 k8sVersion: "v1.21.13", 88 expectedSKU: "ubuntu-2004-gen1", 89 expectedVersion: "121.13.20220613", 90 versions: armcompute.VirtualMachineImagesClientListResponse{ 91 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{ 92 {Name: ptr.To("121.13.20220526")}, 93 {Name: ptr.To("121.13.20220613")}, 94 {Name: ptr.To("121.13.20220524")}, 95 }, 96 }, 97 }, 98 { 99 k8sVersion: "v1.22.0", 100 expectedSKU: "k8s-1dot22dot0-ubuntu-2004", 101 expectedVersion: "latest", 102 }, 103 { 104 k8sVersion: "v1.22.9", 105 expectedSKU: "k8s-1dot22dot9-ubuntu-2004", 106 expectedVersion: "latest", 107 }, 108 { 109 k8sVersion: "v1.22.10", 110 expectedSKU: "ubuntu-2004-gen1", 111 expectedVersion: "122.10.20220613", 112 versions: armcompute.VirtualMachineImagesClientListResponse{ 113 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{ 114 {Name: ptr.To("122.10.20220524")}, 115 {Name: ptr.To("122.10.20220613")}, 116 }, 117 }, 118 }, 119 { 120 k8sVersion: "v1.22.16", 121 expectedSKU: "ubuntu-2004-gen1", 122 expectedVersion: "122.16.20221117", 123 versions: armcompute.VirtualMachineImagesClientListResponse{ 124 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{ 125 {Name: ptr.To("122.16.20221117")}, 126 }, 127 }, 128 }, 129 { 130 k8sVersion: "v1.23.6", 131 expectedSKU: "k8s-1dot23dot6-ubuntu-2004", 132 expectedVersion: "latest", 133 }, 134 { 135 k8sVersion: "v1.23.7", 136 expectedSKU: "ubuntu-2004-gen1", 137 expectedVersion: "123.7.20231231", 138 versions: armcompute.VirtualMachineImagesClientListResponse{ 139 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{ 140 {Name: ptr.To("123.7.20221124")}, 141 {Name: ptr.To("123.7.20220524")}, 142 {Name: ptr.To("123.7.20231231")}, 143 {Name: ptr.To("123.7.20220818")}, 144 }, 145 }, 146 }, 147 { 148 k8sVersion: "v1.24.0", 149 expectedSKU: "ubuntu-2004-gen1", 150 expectedVersion: "124.0.20220512", 151 versions: armcompute.VirtualMachineImagesClientListResponse{ 152 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{ 153 {Name: ptr.To("124.0.20220512")}, 154 }, 155 }, 156 }, 157 { 158 k8sVersion: "v1.23.12", 159 expectedSKU: "ubuntu-2004-gen1", 160 expectedVersion: "123.12.20220921", 161 versions: armcompute.VirtualMachineImagesClientListResponse{ 162 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{ 163 {Name: ptr.To("123.12.20220921")}, 164 }, 165 }, 166 }, 167 { 168 k8sVersion: "v1.23.13", 169 expectedSKU: "ubuntu-2004-gen1", 170 expectedVersion: "123.13.20221014", 171 versions: armcompute.VirtualMachineImagesClientListResponse{ 172 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{ 173 {Name: ptr.To("123.13.20221014")}, 174 }, 175 }, 176 }, 177 { 178 k8sVersion: "v1.24.6", 179 expectedSKU: "ubuntu-2004-gen1", 180 expectedVersion: "124.6.20220921", 181 versions: armcompute.VirtualMachineImagesClientListResponse{ 182 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{ 183 {Name: ptr.To("124.6.20220921")}, 184 }, 185 }, 186 }, 187 { 188 k8sVersion: "v1.24.7", 189 expectedSKU: "ubuntu-2004-gen1", 190 expectedVersion: "124.7.20221014", 191 versions: armcompute.VirtualMachineImagesClientListResponse{ 192 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{ 193 {Name: ptr.To("124.7.20221014")}, 194 }, 195 }, 196 }, 197 { 198 k8sVersion: "v1.25.2", 199 expectedSKU: "ubuntu-2004-gen1", 200 expectedVersion: "125.2.20220921", 201 versions: armcompute.VirtualMachineImagesClientListResponse{ 202 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{ 203 {Name: ptr.To("125.2.20220921")}, 204 }, 205 }, 206 }, 207 { 208 k8sVersion: "v1.25.3", 209 expectedSKU: "ubuntu-2204-gen1", 210 expectedVersion: "125.3.20221014", 211 versions: armcompute.VirtualMachineImagesClientListResponse{ 212 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{ 213 {Name: ptr.To("125.3.20221014")}, 214 }, 215 }, 216 }, 217 } 218 219 location := "westus3" 220 for _, test := range tests { 221 test := test 222 t.Run(test.k8sVersion, func(t *testing.T) { 223 t.Parallel() 224 225 mockCtrl := gomock.NewController(t) 226 defer mockCtrl.Finish() 227 mockAuth := mock_azure.NewMockAuthorizer(mockCtrl) 228 mockAuth.EXPECT().HashKey().Return(t.Name()).AnyTimes() 229 mockAuth.EXPECT().SubscriptionID().AnyTimes() 230 mockAuth.EXPECT().CloudEnvironment().AnyTimes() 231 mockAuth.EXPECT().Token().Return(&azidentity.DefaultAzureCredential{}).AnyTimes() 232 mockClient := mock_virtualmachineimages.NewMockClient(mockCtrl) 233 svc := Service{Client: mockClient, Authorizer: mockAuth} 234 235 if test.versions.VirtualMachineImageResourceArray != nil { 236 mockClient.EXPECT(). 237 List(gomock.Any(), location, azure.DefaultImagePublisherID, azure.DefaultImageOfferID, gomock.Any()). 238 Return(test.versions, nil) 239 } 240 image, err := svc.GetDefaultUbuntuImage(context.TODO(), location, test.k8sVersion) 241 242 g := NewWithT(t) 243 g.Expect(err).NotTo(HaveOccurred()) 244 g.Expect(image.Marketplace.Version).To(Equal(test.expectedVersion)) 245 g.Expect(image.Marketplace.SKU).To(Equal(test.expectedSKU)) 246 }) 247 } 248 } 249 250 func TestGetDefaultWindowsImage(t *testing.T) { 251 mockCtrl := gomock.NewController(t) 252 defer mockCtrl.Finish() 253 254 mockClient := mock_virtualmachineimages.NewMockClient(mockCtrl) 255 svc := Service{Client: mockClient} 256 257 var tests = []struct { 258 name string 259 k8sVersion string 260 runtime string 261 osVersion string 262 expectedSKU string 263 expectedErr string 264 }{ 265 { 266 name: "no k8sVersion", 267 k8sVersion: "1.1.1.1.1.1", 268 runtime: "", 269 osVersion: "", 270 expectedSKU: "", 271 expectedErr: "unable to parse Kubernetes version \"1.1.1.1.1.1\": Invalid character(s) found in patch number \"1.1.1.1\"", 272 }, 273 { 274 name: "1.21.* - default runtime - default osVersion", 275 k8sVersion: "v1.21.4", 276 runtime: "", 277 osVersion: "", 278 expectedSKU: "k8s-1dot21dot4-windows-2019", 279 expectedErr: "", 280 }, 281 { 282 name: "1.21.* - dockershim runtime - default osVersion", 283 k8sVersion: "v1.21.4", 284 runtime: "dockershim", 285 osVersion: "", 286 expectedSKU: "k8s-1dot21dot4-windows-2019", 287 expectedErr: "", 288 }, 289 { 290 name: "1.21.* - containerd runtime - default osVersion", 291 k8sVersion: "v1.21.4", 292 runtime: "containerd", 293 osVersion: "", 294 expectedSKU: "", 295 expectedErr: "containerd image only supported in 1.22+", 296 }, 297 { 298 name: "1.23.* - containerd runtime - default osVersion", 299 k8sVersion: "v1.23.2", 300 runtime: "containerd", 301 osVersion: "", 302 expectedSKU: "k8s-1dot23dot2-windows-2019-containerd", 303 expectedErr: "", 304 }, 305 { 306 name: "1.23.* - default runtime - 2019 osVersion", 307 k8sVersion: "v1.23.2", 308 runtime: "", 309 osVersion: "windows-2019", 310 expectedSKU: "k8s-1dot23dot2-windows-2019-containerd", 311 expectedErr: "", 312 }, 313 { 314 name: "1.23.* - default runtime - 2022 osVersion", 315 k8sVersion: "v1.23.2", 316 runtime: "", 317 osVersion: "windows-2022", 318 expectedSKU: "k8s-1dot23dot2-windows-2022-containerd", 319 expectedErr: "", 320 }, 321 { 322 name: "1.23.* - containerd runtime - 2022 osVersion", 323 k8sVersion: "v1.23.2", 324 runtime: "containerd", 325 osVersion: "windows-2022", 326 expectedSKU: "k8s-1dot23dot2-windows-2022-containerd", 327 expectedErr: "", 328 }, 329 } 330 331 for _, test := range tests { 332 t.Run(test.name, func(t *testing.T) { 333 g := NewWithT(t) 334 image, err := svc.GetDefaultWindowsImage(context.TODO(), "", test.k8sVersion, test.runtime, test.osVersion) 335 if test.expectedErr != "" { 336 g.Expect(err).To(HaveOccurred()) 337 g.Expect(err.Error()).To(Equal(test.expectedErr)) 338 } else { 339 g.Expect(err).NotTo(HaveOccurred()) 340 g.Expect(image.Marketplace.SKU).To(Equal(test.expectedSKU)) 341 } 342 }) 343 } 344 } 345 346 func TestGetDefaultImageSKUID(t *testing.T) { 347 var tests = []struct { 348 k8sVersion string 349 osAndVersion string 350 expectedSKU string 351 expectedVersion string 352 expectedError bool 353 versions armcompute.VirtualMachineImagesClientListResponse 354 }{ 355 { 356 k8sVersion: "v1.14.9", 357 expectedSKU: "k8s-1dot14dot9-ubuntu-1804", 358 expectedVersion: "latest", 359 expectedError: false, 360 osAndVersion: "ubuntu-1804", 361 }, 362 { 363 k8sVersion: "v1.14.10", 364 expectedSKU: "k8s-1dot14dot10-ubuntu-1804", 365 expectedError: false, 366 expectedVersion: "latest", 367 osAndVersion: "ubuntu-1804", 368 }, 369 { 370 k8sVersion: "v1.15.6", 371 expectedSKU: "k8s-1dot15dot6-ubuntu-1804", 372 expectedError: false, 373 expectedVersion: "latest", 374 osAndVersion: "ubuntu-1804", 375 }, 376 { 377 k8sVersion: "v1.15.7", 378 expectedSKU: "k8s-1dot15dot7-ubuntu-1804", 379 expectedError: false, 380 expectedVersion: "latest", 381 osAndVersion: "ubuntu-1804", 382 }, 383 { 384 k8sVersion: "v1.16.3", 385 expectedSKU: "k8s-1dot16dot3-ubuntu-1804", 386 expectedError: false, 387 expectedVersion: "latest", 388 osAndVersion: "ubuntu-1804", 389 }, 390 { 391 k8sVersion: "v1.16.4", 392 expectedSKU: "k8s-1dot16dot4-ubuntu-1804", 393 expectedError: false, 394 expectedVersion: "latest", 395 osAndVersion: "ubuntu-1804", 396 }, 397 { 398 k8sVersion: "1.12.0", 399 expectedSKU: "k8s-1dot12dot0-ubuntu-1804", 400 expectedError: false, 401 expectedVersion: "latest", 402 osAndVersion: "ubuntu-1804", 403 }, 404 { 405 k8sVersion: "1.1.notvalid.semver", 406 expectedSKU: "", 407 expectedError: true, 408 }, 409 { 410 k8sVersion: "v1.19.3", 411 expectedSKU: "k8s-1dot19dot3-windows-2019", 412 expectedVersion: "latest", 413 expectedError: false, 414 osAndVersion: "windows-2019", 415 }, 416 { 417 k8sVersion: "v1.20.8", 418 expectedSKU: "k8s-1dot20dot8-windows-2019", 419 expectedVersion: "latest", 420 expectedError: false, 421 osAndVersion: "windows-2019", 422 }, 423 { 424 k8sVersion: "v1.21.2", 425 expectedSKU: "k8s-1dot21dot2-windows-2019", 426 expectedVersion: "latest", 427 expectedError: false, 428 osAndVersion: "windows-2019", 429 }, 430 { 431 k8sVersion: "v1.21.13", 432 expectedSKU: "windows-2022-gen1", 433 expectedVersion: "121.13.20300524", 434 expectedError: false, 435 osAndVersion: "windows-2022", 436 versions: armcompute.VirtualMachineImagesClientListResponse{ 437 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{ 438 {Name: ptr.To("121.13.20220524")}, 439 {Name: ptr.To("124.0.20220512")}, 440 {Name: ptr.To("121.13.20220524")}, 441 {Name: ptr.To("123.13.20220524")}, 442 {Name: ptr.To("121.13.20220619")}, 443 {Name: ptr.To("121.13.20300524")}, 444 {Name: ptr.To("121.14.20220524")}, 445 {Name: ptr.To("121.12.20220524")}, 446 {Name: ptr.To("121.13.20220101")}, 447 {Name: ptr.To("121.13.20231231")}, 448 {Name: ptr.To("121.13.19991231")}, 449 }, 450 }, 451 }, 452 { 453 k8sVersion: "v1.20.8", 454 expectedSKU: "k8s-1dot20dot8-ubuntu-2004", 455 expectedVersion: "latest", 456 expectedError: false, 457 osAndVersion: "ubuntu-2004", 458 }, 459 { 460 k8sVersion: "v1.21.2", 461 expectedSKU: "k8s-1dot21dot2-ubuntu-2004", 462 expectedVersion: "latest", 463 expectedError: false, 464 osAndVersion: "ubuntu-2004", 465 }, 466 { 467 k8sVersion: "v1.22.0", 468 expectedSKU: "k8s-1dot22dot0-ubuntu-2004", 469 expectedVersion: "latest", 470 expectedError: false, 471 osAndVersion: "ubuntu-2004", 472 }, 473 { 474 k8sVersion: "v1.22.9", 475 expectedSKU: "k8s-1dot22dot9-ubuntu-2004", 476 expectedVersion: "latest", 477 expectedError: false, 478 osAndVersion: "ubuntu-2004", 479 }, 480 { 481 k8sVersion: "v1.23.12", 482 expectedSKU: "ubuntu-2004-gen1", 483 expectedVersion: "123.12.20220921", 484 expectedError: false, 485 osAndVersion: "ubuntu-2004", 486 versions: armcompute.VirtualMachineImagesClientListResponse{ 487 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{ 488 {Name: ptr.To("123.12.20220921")}, 489 }, 490 }, 491 }, 492 { 493 k8sVersion: "v1.23.13", 494 expectedSKU: "ubuntu-2204-gen1", 495 expectedVersion: "123.13.20220524", 496 expectedError: false, 497 osAndVersion: "ubuntu-2204", 498 versions: armcompute.VirtualMachineImagesClientListResponse{ 499 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{ 500 {Name: ptr.To("123.13.20220524")}, 501 }, 502 }, 503 }, 504 { 505 k8sVersion: "v1.23.13", 506 expectedError: true, 507 osAndVersion: "ubuntu-2004", 508 versions: armcompute.VirtualMachineImagesClientListResponse{ 509 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{}, 510 }, 511 }, 512 { 513 k8sVersion: "v1.24.0", 514 expectedSKU: "ubuntu-2004-gen1", 515 expectedVersion: "124.0.20220512", 516 expectedError: false, 517 osAndVersion: "ubuntu-2004", 518 versions: armcompute.VirtualMachineImagesClientListResponse{ 519 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{ 520 {Name: ptr.To("124.0.20220512")}, 521 }, 522 }, 523 }, 524 { 525 k8sVersion: "v1.24.0", 526 expectedSKU: "windows-2022-containerd-gen1", 527 expectedVersion: "124.0.20220606", 528 expectedError: false, 529 osAndVersion: "windows-2022-containerd", 530 versions: armcompute.VirtualMachineImagesClientListResponse{ 531 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{ 532 {Name: ptr.To("124.0.20220606")}, 533 }, 534 }, 535 }, 536 { 537 k8sVersion: "v1.24.1", 538 expectedError: true, 539 osAndVersion: "windows-2022-containerd", 540 versions: armcompute.VirtualMachineImagesClientListResponse{ 541 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{ 542 {Name: ptr.To("124.0.20220606")}, 543 }, 544 }, 545 }, 546 { 547 k8sVersion: "v1.25.4", 548 expectedSKU: "ubuntu-2204-gen1", 549 expectedVersion: "125.4.20221011", 550 expectedError: false, 551 osAndVersion: "ubuntu-2204", 552 versions: armcompute.VirtualMachineImagesClientListResponse{ 553 VirtualMachineImageResourceArray: []*armcompute.VirtualMachineImageResource{ 554 {Name: ptr.To("125.4.20221011")}, 555 }, 556 }, 557 }, 558 } 559 560 location := "francesouth" 561 for _, test := range tests { 562 test := test 563 t.Run(test.k8sVersion, func(t *testing.T) { 564 t.Parallel() 565 566 mockCtrl := gomock.NewController(t) 567 defer mockCtrl.Finish() 568 mockAuth := mock_azure.NewMockAuthorizer(mockCtrl) 569 mockAuth.EXPECT().HashKey().Return(t.Name()).AnyTimes() 570 mockAuth.EXPECT().SubscriptionID().AnyTimes() 571 mockAuth.EXPECT().CloudEnvironment().AnyTimes() 572 mockAuth.EXPECT().Token().Return(&azidentity.DefaultAzureCredential{}).AnyTimes() 573 mockClient := mock_virtualmachineimages.NewMockClient(mockCtrl) 574 svc := Service{Client: mockClient, Authorizer: mockAuth} 575 576 offer := azure.DefaultImageOfferID 577 if strings.HasPrefix(test.osAndVersion, "windows") { 578 offer = azure.DefaultWindowsImageOfferID 579 } 580 if test.versions.VirtualMachineImageResourceArray != nil { 581 mockClient.EXPECT(). 582 List(gomock.Any(), location, azure.DefaultImagePublisherID, offer, gomock.Any()). 583 Return(test.versions, nil) 584 } 585 id, version, err := svc.getSKUAndVersion(context.TODO(), location, azure.DefaultImagePublisherID, 586 offer, test.k8sVersion, test.osAndVersion) 587 588 g := NewWithT(t) 589 if test.expectedError { 590 g.Expect(err).To(HaveOccurred()) 591 } else { 592 g.Expect(err).NotTo(HaveOccurred()) 593 } 594 g.Expect(id).To(Equal(test.expectedSKU)) 595 g.Expect(version).To(Equal(test.expectedVersion)) 596 }) 597 } 598 }