sigs.k8s.io/cluster-api-provider-azure@v1.14.3/api/v1beta1/azureimage_validation_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 v1beta1 18 19 import ( 20 "testing" 21 22 . "github.com/onsi/gomega" 23 "k8s.io/apimachinery/pkg/util/validation/field" 24 "k8s.io/utils/ptr" 25 ) 26 27 func TestImageOptional(t *testing.T) { 28 g := NewWithT(t) 29 30 type test struct { 31 Image *Image 32 } 33 34 extension := test{} 35 36 errs := ValidateImage(extension.Image, field.NewPath("image")) 37 g.Expect(errs).To(BeEmpty()) 38 } 39 40 func TestImageTooManyDetails(t *testing.T) { 41 g := NewWithT(t) 42 43 image := &Image{ 44 Marketplace: &AzureMarketplaceImage{ 45 ImagePlan: ImagePlan{ 46 Offer: "OFFER", 47 Publisher: "PUBLISHER", 48 SKU: "SKU", 49 }, 50 Version: "1.0.0.", 51 }, 52 SharedGallery: &AzureSharedGalleryImage{ 53 Gallery: "GALLERY", 54 Name: "GALLERY1", 55 ResourceGroup: "RG1", 56 SubscriptionID: "SUB12", 57 Version: "1.0.0.", 58 }, 59 } 60 61 g.Expect(ValidateImage(image, field.NewPath("image"))).To(HaveLen(1)) 62 } 63 64 func TestComputeImageGalleryValid(t *testing.T) { 65 testCases := map[string]struct { 66 image *Image 67 expectedErrors int 68 }{ 69 "AzureComputeGalleryImage - fully specified community image": { 70 expectedErrors: 0, 71 image: createTestComputeImage(nil, nil), 72 }, 73 "AzureComputeGalleryImage - fully specified private image": { 74 expectedErrors: 0, 75 image: createTestComputeImage(ptr.To("SUB1234"), ptr.To("RG1234")), 76 }, 77 "AzureComputeGalleryImage - private image with missing subscription": { 78 expectedErrors: 1, 79 image: createTestComputeImage(nil, ptr.To("RG1234")), 80 }, 81 "AzureComputeGalleryImage - private image with missing resource group": { 82 expectedErrors: 1, 83 image: createTestComputeImage(ptr.To("SUB1234"), nil), 84 }, 85 } 86 87 for _, tc := range testCases { 88 g := NewWithT(t) 89 g.Expect(ValidateImage(tc.image, field.NewPath("image"))).To(HaveLen(tc.expectedErrors)) 90 } 91 } 92 93 func TestSharedImageGalleryValid(t *testing.T) { 94 testCases := map[string]struct { 95 image *Image 96 expectedErrors int 97 }{ 98 "AzureSharedGalleryImage - fully specified": { 99 expectedErrors: 0, 100 image: createTestSharedImage("SUB1243", "RG1234", "IMAGENAME", "GALLERY9876", "1.0.0"), 101 }, 102 "AzureSharedGalleryImage - missing subscription": { 103 expectedErrors: 1, 104 image: createTestSharedImage("", "RG1234", "IMAGENAME", "GALLERY9876", "1.0.0"), 105 }, 106 "AzureSharedGalleryImage - missing resource group": { 107 expectedErrors: 1, 108 image: createTestSharedImage("SUB1234", "", "IMAGENAME", "GALLERY9876", "1.0.0"), 109 }, 110 "AzureSharedGalleryImage - missing image name": { 111 expectedErrors: 1, 112 image: createTestSharedImage("SUB1243", "RG1234", "", "GALLERY9876", "1.0.0"), 113 }, 114 "AzureSharedGalleryImage - missing gallery": { 115 expectedErrors: 1, 116 image: createTestSharedImage("SUB1243", "RG1234", "IMAGENAME", "", "1.0.0"), 117 }, 118 "AzureSharedGalleryImage - missing version": { 119 expectedErrors: 1, 120 image: createTestSharedImage("SUB1243", "RG1234", "IMAGENAME", "GALLERY9876", ""), 121 }, 122 } 123 124 for _, tc := range testCases { 125 g := NewWithT(t) 126 g.Expect(ValidateImage(tc.image, field.NewPath("image"))).To(HaveLen(tc.expectedErrors)) 127 } 128 } 129 130 func TestMarketPlaceImageValid(t *testing.T) { 131 testCases := map[string]struct { 132 image *Image 133 expectedErrors int 134 }{ 135 "AzureMarketplaceImage - fully specified": { 136 expectedErrors: 0, 137 image: createTestMarketPlaceImage("PUB1234", "OFFER1234", "SKU1234", "1.0.0"), 138 }, 139 "AzureMarketplaceImage - missing publisher": { 140 expectedErrors: 1, 141 image: createTestMarketPlaceImage("", "OFFER1234", "SKU1234", "1.0.0"), 142 }, 143 "AzureMarketplaceImage - missing offer": { 144 expectedErrors: 1, 145 image: createTestMarketPlaceImage("PUB1234", "", "SKU1234", "1.0.0"), 146 }, 147 "AzureMarketplaceImage - missing sku": { 148 expectedErrors: 1, 149 image: createTestMarketPlaceImage("PUB1234", "OFFER1234", "", "1.0.0"), 150 }, 151 "AzureMarketplaceImage - missing version": { 152 expectedErrors: 1, 153 image: createTestMarketPlaceImage("PUB1234", "OFFER1234", "SKU1234", ""), 154 }, 155 } 156 157 for _, tc := range testCases { 158 g := NewWithT(t) 159 g.Expect(ValidateImage(tc.image, field.NewPath("image"))).To(HaveLen(tc.expectedErrors)) 160 } 161 } 162 163 func TestImageByIDValid(t *testing.T) { 164 testCases := map[string]struct { 165 image *Image 166 expectedErrors int 167 }{ 168 "AzureImageByID - with id": { 169 expectedErrors: 0, 170 image: createTestImageByID("ID1234"), 171 }, 172 "AzureImageByID - missing ID": { 173 expectedErrors: 1, 174 image: createTestImageByID(""), 175 }, 176 } 177 178 for _, tc := range testCases { 179 g := NewWithT(t) 180 g.Expect(ValidateImage(tc.image, field.NewPath("image"))).To(HaveLen(tc.expectedErrors)) 181 } 182 } 183 184 func createTestComputeImage(subscriptionID, resourceGroup *string) *Image { 185 return &Image{ 186 ComputeGallery: &AzureComputeGalleryImage{ 187 Name: "IMAGENAME", 188 Gallery: "GALLERY9876", 189 Version: "1.0.0", 190 SubscriptionID: subscriptionID, 191 ResourceGroup: resourceGroup, 192 }, 193 } 194 } 195 196 func createTestSharedImage(subscriptionID, resourceGroup, name, gallery, version string) *Image { 197 return &Image{ 198 SharedGallery: &AzureSharedGalleryImage{ 199 SubscriptionID: subscriptionID, 200 ResourceGroup: resourceGroup, 201 Name: name, 202 Gallery: gallery, 203 Version: version, 204 }, 205 } 206 } 207 208 func createTestMarketPlaceImage(publisher, offer, sku, version string) *Image { 209 return &Image{ 210 Marketplace: &AzureMarketplaceImage{ 211 ImagePlan: ImagePlan{ 212 Publisher: publisher, 213 Offer: offer, 214 SKU: sku, 215 }, 216 Version: version, 217 }, 218 } 219 } 220 221 func createTestImageByID(imageID string) *Image { 222 return &Image{ 223 ID: &imageID, 224 } 225 } 226 227 func TestValidateSingleDetailsOnly(t *testing.T) { 228 testCases := map[string]struct { 229 image *Image 230 expectedErrors field.ErrorList 231 }{ 232 "image.Marketplace != nil, image details are found": { 233 image: &Image{ 234 ID: ptr.To("ID1234"), 235 Marketplace: &AzureMarketplaceImage{ 236 ImagePlan: ImagePlan{ 237 Offer: "OFFER", 238 Publisher: "PUBLISHER", 239 SKU: "SKU", 240 }, 241 Version: "1.0.0", 242 }, 243 }, 244 expectedErrors: field.ErrorList{ 245 { 246 Type: "FieldValueForbidden", 247 Field: "image.Marketplace", 248 BadValue: "", 249 Detail: "Marketplace cannot be used as an image ID has been specified", 250 }, 251 }, 252 }, 253 "image.Marketplace == nil, image.ComputeGallery != nil, image details are found": { 254 image: &Image{ 255 ID: ptr.To("ID1234"), 256 ComputeGallery: &AzureComputeGalleryImage{ 257 Name: "IMAGENAME", 258 Gallery: "GALLERY9876", 259 Version: "1.0.0", 260 SubscriptionID: ptr.To("SUB1234"), 261 ResourceGroup: ptr.To("RG1234"), 262 }, 263 }, 264 expectedErrors: field.ErrorList{ 265 { 266 Type: "FieldValueForbidden", 267 Field: "image.ComputeGallery", 268 BadValue: "", 269 Detail: "ComputeGallery cannot be used as an image ID. Marketplace or SharedGallery images has been specified", 270 }, 271 }, 272 }, 273 "image.Marketplace == nil, image.ComputeGallery == nil, image details not found": { 274 image: &Image{}, 275 expectedErrors: field.ErrorList{ 276 { 277 Type: "FieldValueRequired", 278 Field: "image", 279 BadValue: "", 280 Detail: "You must supply an ID, Marketplace or ComputeGallery image details", 281 }, 282 }, 283 }, 284 } 285 286 for _, tc := range testCases { 287 g := NewWithT(t) 288 g.Expect(ValidateImage(tc.image, field.NewPath("image"))).To(Equal(tc.expectedErrors)) 289 } 290 }