sigs.k8s.io/cluster-api-provider-azure@v1.14.3/azure/converters/image_test.go (about) 1 /* 2 Copyright 2021 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 converters 18 19 import ( 20 "testing" 21 22 "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5" 23 . "github.com/onsi/gomega" 24 "k8s.io/utils/ptr" 25 infrav1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1" 26 ) 27 28 func Test_ImageToPlan(t *testing.T) { 29 cases := []struct { 30 name string 31 image *infrav1.Image 32 expect func(*GomegaWithT, *armcompute.Plan) 33 }{ 34 { 35 name: "Should return a plan for a Community Gallery image with plan details", 36 image: &infrav1.Image{ 37 ComputeGallery: &infrav1.AzureComputeGalleryImage{ 38 Plan: &infrav1.ImagePlan{ 39 Publisher: "my-publisher", 40 Offer: "my-offer", 41 SKU: "my-sku", 42 }, 43 }, 44 }, 45 expect: func(g *GomegaWithT, result *armcompute.Plan) { 46 g.Expect(result).To(Equal(&armcompute.Plan{ 47 Name: ptr.To("my-sku"), 48 Publisher: ptr.To("my-publisher"), 49 Product: ptr.To("my-offer"), 50 })) 51 }, 52 }, 53 { 54 name: "Should return a plan for a SIG image with plan details", 55 image: &infrav1.Image{ 56 SharedGallery: &infrav1.AzureSharedGalleryImage{ 57 SubscriptionID: "fake-sub-id", 58 ResourceGroup: "fake-rg", 59 Gallery: "fake-gallery-name", 60 Name: "fake-image-name", 61 Version: "v1.0.0", 62 Publisher: ptr.To("my-publisher"), 63 Offer: ptr.To("my-offer"), 64 SKU: ptr.To("my-sku"), 65 }, 66 }, 67 expect: func(g *GomegaWithT, result *armcompute.Plan) { 68 g.Expect(result).To(Equal(&armcompute.Plan{ 69 Name: ptr.To("my-sku"), 70 Publisher: ptr.To("my-publisher"), 71 Product: ptr.To("my-offer"), 72 })) 73 }, 74 }, 75 { 76 name: "Should return nil for a SIG image without plan info", 77 image: &infrav1.Image{ 78 SharedGallery: &infrav1.AzureSharedGalleryImage{ 79 SubscriptionID: "fake-sub-id", 80 ResourceGroup: "fake-rg", 81 Gallery: "fake-gallery-name", 82 Name: "fake-image-name", 83 Version: "v1.0.0", 84 }, 85 }, 86 expect: func(g *GomegaWithT, result *armcompute.Plan) { 87 g.Expect(result).To(BeNil()) 88 }, 89 }, 90 { 91 name: "Should return nil for a Marketplace first party image", 92 image: &infrav1.Image{ 93 Marketplace: &infrav1.AzureMarketplaceImage{ 94 ImagePlan: infrav1.ImagePlan{ 95 Publisher: "my-publisher", 96 Offer: "my-offer", 97 SKU: "my-sku", 98 }, 99 Version: "v0.5.0", 100 ThirdPartyImage: false, 101 }, 102 }, 103 expect: func(g *GomegaWithT, result *armcompute.Plan) { 104 g.Expect(result).To(BeNil()) 105 }, 106 }, 107 { 108 name: "Should return a plan for a Marketplace third party image", 109 image: &infrav1.Image{ 110 Marketplace: &infrav1.AzureMarketplaceImage{ 111 ImagePlan: infrav1.ImagePlan{ 112 Publisher: "my-publisher", 113 Offer: "my-offer", 114 SKU: "my-sku", 115 }, 116 Version: "v0.5.0", 117 ThirdPartyImage: true, 118 }, 119 }, 120 expect: func(g *GomegaWithT, result *armcompute.Plan) { 121 g.Expect(result).To(Equal(&armcompute.Plan{ 122 Name: ptr.To("my-sku"), 123 Publisher: ptr.To("my-publisher"), 124 Product: ptr.To("my-offer"), 125 })) 126 }, 127 }, 128 { 129 name: "Should return nil for an image ID", 130 image: &infrav1.Image{ 131 ID: ptr.To("fake/image/id"), 132 }, 133 expect: func(g *GomegaWithT, result *armcompute.Plan) { 134 g.Expect(result).To(BeNil()) 135 }, 136 }, 137 } 138 139 for _, c := range cases { 140 c := c 141 t.Run(c.name, func(t *testing.T) { 142 t.Parallel() 143 g := NewGomegaWithT(t) 144 result := ImageToPlan(c.image) 145 c.expect(g, result) 146 }) 147 } 148 } 149 150 func Test_ComputeImageToSDK(t *testing.T) { 151 cases := []struct { 152 name string 153 image *infrav1.Image 154 expect func(*GomegaWithT, *armcompute.ImageReference, error) 155 }{ 156 { 157 name: "Should return parsed compute gallery image id", 158 image: &infrav1.Image{ 159 ComputeGallery: &infrav1.AzureComputeGalleryImage{ 160 ResourceGroup: ptr.To("my-resourcegroup"), 161 SubscriptionID: ptr.To("my-subscription-id"), 162 Gallery: "my-gallery", 163 Name: "my-image", 164 Version: "my-version", 165 }, 166 }, 167 expect: func(g *GomegaWithT, result *armcompute.ImageReference, err error) { 168 g.Expect(err).NotTo(HaveOccurred()) 169 g.Expect(result).To(Equal(&armcompute.ImageReference{ 170 ID: ptr.To("/subscriptions/my-subscription-id/resourceGroups/my-resourcegroup/providers/Microsoft.Compute/galleries/my-gallery/images/my-image/versions/my-version"), 171 })) 172 }, 173 }, 174 { 175 name: "Should return parsed shared gallery image id", 176 image: &infrav1.Image{ 177 SharedGallery: &infrav1.AzureSharedGalleryImage{ 178 ResourceGroup: "my-resourcegroup", 179 SubscriptionID: "my-subscription-id", 180 Gallery: "my-gallery", 181 Name: "my-image", 182 Version: "my-version", 183 }, 184 }, 185 expect: func(g *GomegaWithT, result *armcompute.ImageReference, err error) { 186 g.Expect(err).NotTo(HaveOccurred()) 187 g.Expect(result).To(Equal(&armcompute.ImageReference{ 188 ID: ptr.To("/subscriptions/my-subscription-id/resourceGroups/my-resourcegroup/providers/Microsoft.Compute/galleries/my-gallery/images/my-image/versions/my-version"), 189 })) 190 }, 191 }, 192 { 193 name: "Should return parsed community gallery image id", 194 image: &infrav1.Image{ 195 ComputeGallery: &infrav1.AzureComputeGalleryImage{ 196 Gallery: "my-gallery", 197 Name: "my-image", 198 Version: "my-version", 199 }, 200 }, 201 expect: func(g *GomegaWithT, result *armcompute.ImageReference, err error) { 202 g.Expect(err).NotTo(HaveOccurred()) 203 g.Expect(result).To(Equal(&armcompute.ImageReference{ 204 CommunityGalleryImageID: ptr.To("/CommunityGalleries/my-gallery/Images/my-image/Versions/my-version"), 205 })) 206 }, 207 }, 208 { 209 name: "Should return error if SharedGallery and ComputeGallery are nil", 210 image: &infrav1.Image{ 211 ComputeGallery: nil, 212 SharedGallery: nil, 213 }, 214 expect: func(g *GomegaWithT, result *armcompute.ImageReference, err error) { 215 g.Expect(err).Should(HaveOccurred()) 216 }, 217 }, 218 } 219 220 for _, c := range cases { 221 c := c 222 t.Run(c.name, func(t *testing.T) { 223 t.Parallel() 224 g := NewGomegaWithT(t) 225 result, err := computeImageToSDK(c.image) 226 c.expect(g, result, err) 227 }) 228 } 229 } 230 231 func Test_ImageToSDK(t *testing.T) { 232 cases := []struct { 233 name string 234 image *infrav1.Image 235 expect func(*GomegaWithT, *armcompute.ImageReference, error) 236 }{ 237 { 238 name: "Should return parsed compute gallery image id", 239 image: &infrav1.Image{ 240 ComputeGallery: &infrav1.AzureComputeGalleryImage{ 241 ResourceGroup: ptr.To("my-resourcegroup"), 242 SubscriptionID: ptr.To("my-subscription-id"), 243 Gallery: "my-gallery", 244 Name: "my-image", 245 Version: "my-version", 246 }, 247 }, 248 expect: func(g *GomegaWithT, result *armcompute.ImageReference, err error) { 249 g.Expect(err).NotTo(HaveOccurred()) 250 g.Expect(result).To(Equal(&armcompute.ImageReference{ 251 ID: ptr.To("/subscriptions/my-subscription-id/resourceGroups/my-resourcegroup/providers/Microsoft.Compute/galleries/my-gallery/images/my-image/versions/my-version"), 252 })) 253 }, 254 }, 255 { 256 name: "Should return parsed shared gallery image id", 257 image: &infrav1.Image{ 258 SharedGallery: &infrav1.AzureSharedGalleryImage{ 259 ResourceGroup: "my-resourcegroup", 260 SubscriptionID: "my-subscription-id", 261 Gallery: "my-gallery", 262 Name: "my-image", 263 Version: "my-version", 264 }, 265 }, 266 expect: func(g *GomegaWithT, result *armcompute.ImageReference, err error) { 267 g.Expect(err).NotTo(HaveOccurred()) 268 g.Expect(result).To(Equal(&armcompute.ImageReference{ 269 ID: ptr.To("/subscriptions/my-subscription-id/resourceGroups/my-resourcegroup/providers/Microsoft.Compute/galleries/my-gallery/images/my-image/versions/my-version"), 270 })) 271 }, 272 }, 273 { 274 name: "Should return parsed community gallery image id", 275 image: &infrav1.Image{ 276 ComputeGallery: &infrav1.AzureComputeGalleryImage{ 277 Gallery: "my-gallery", 278 Name: "my-image", 279 Version: "my-version", 280 }, 281 }, 282 expect: func(g *GomegaWithT, result *armcompute.ImageReference, err error) { 283 g.Expect(err).NotTo(HaveOccurred()) 284 g.Expect(result).To(Equal(&armcompute.ImageReference{ 285 CommunityGalleryImageID: ptr.To("/CommunityGalleries/my-gallery/Images/my-image/Versions/my-version"), 286 })) 287 }, 288 }, 289 { 290 name: "Should return error if SharedGallery and ComputeGallery are nil", 291 image: &infrav1.Image{ 292 ComputeGallery: nil, 293 SharedGallery: nil, 294 }, 295 expect: func(g *GomegaWithT, result *armcompute.ImageReference, err error) { 296 g.Expect(err).Should(HaveOccurred()) 297 }, 298 }, 299 { 300 name: "Should return specific image if ID is set", 301 image: &infrav1.Image{ 302 ID: ptr.To("my-image-id"), 303 }, 304 expect: func(g *GomegaWithT, result *armcompute.ImageReference, err error) { 305 g.Expect(err).NotTo(HaveOccurred()) 306 g.Expect(result).To(Equal(&armcompute.ImageReference{ 307 ID: ptr.To("my-image-id"), 308 })) 309 }, 310 }, 311 { 312 name: "Should return Marketplace image if Marketplace is set", 313 image: &infrav1.Image{ 314 Marketplace: &infrav1.AzureMarketplaceImage{ 315 ImagePlan: infrav1.ImagePlan{ 316 Publisher: "my-publisher", 317 Offer: "my-offer", 318 SKU: "my-sku", 319 }, 320 Version: "v0.5.0", 321 }, 322 }, 323 expect: func(g *GomegaWithT, result *armcompute.ImageReference, err error) { 324 g.Expect(err).NotTo(HaveOccurred()) 325 g.Expect(result).To(Equal(&armcompute.ImageReference{ 326 Offer: ptr.To("my-offer"), 327 Publisher: ptr.To("my-publisher"), 328 SKU: ptr.To("my-sku"), 329 Version: ptr.To("v0.5.0"), 330 })) 331 }, 332 }, 333 } 334 335 for _, c := range cases { 336 c := c 337 t.Run(c.name, func(t *testing.T) { 338 t.Parallel() 339 g := NewGomegaWithT(t) 340 result, err := ImageToSDK(c.image) 341 c.expect(g, result, err) 342 }) 343 } 344 }