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  }