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  }