From 9e4335b506034050112ea258665a91acc148592d Mon Sep 17 00:00:00 2001 From: Ciprian Hacman Date: Tue, 8 Nov 2022 16:57:07 +0200 Subject: [PATCH] azure: Switch to using UserData instead of deprecated CustomData --- pkg/model/azuremodel/vmscaleset.go | 2 +- upup/pkg/fi/cloudup/azure/status_test.go | 9 ++++++ upup/pkg/fi/cloudup/azure/vmscaleset.go | 9 ++++++ upup/pkg/fi/cloudup/azuretasks/testing.go | 9 ++++++ upup/pkg/fi/cloudup/azuretasks/vmscaleset.go | 32 ++++++++----------- .../fi/cloudup/azuretasks/vmscaleset_test.go | 20 ++++++------ 6 files changed, 52 insertions(+), 29 deletions(-) diff --git a/pkg/model/azuremodel/vmscaleset.go b/pkg/model/azuremodel/vmscaleset.go index 37246e1d90..3a31048950 100644 --- a/pkg/model/azuremodel/vmscaleset.go +++ b/pkg/model/azuremodel/vmscaleset.go @@ -110,7 +110,7 @@ func (b *VMScaleSetModelBuilder) buildVMScaleSetTask( t.SSHPublicKey = fi.String(string(b.SSHPublicKeys[0])) } - if t.CustomData, err = b.BootstrapScriptBuilder.ResourceNodeUp(c, ig); err != nil { + if t.UserData, err = b.BootstrapScriptBuilder.ResourceNodeUp(c, ig); err != nil { return nil, err } diff --git a/upup/pkg/fi/cloudup/azure/status_test.go b/upup/pkg/fi/cloudup/azure/status_test.go index d43890053d..1eb9c49711 100644 --- a/upup/pkg/fi/cloudup/azure/status_test.go +++ b/upup/pkg/fi/cloudup/azure/status_test.go @@ -44,6 +44,15 @@ func (c *mockVMScaleSetsClient) List(ctx context.Context, resourceGroupName stri return c.vmsses, nil } +func (c *mockVMScaleSetsClient) Get(ctx context.Context, resourceGroupName string, vmssName string) (*compute.VirtualMachineScaleSet, error) { + for _, vmss := range c.vmsses { + if *vmss.Name == vmssName { + return &vmss, nil + } + } + return nil, nil +} + func (c *mockVMScaleSetsClient) Delete(ctx context.Context, resourceGroupName, vmssName string) error { return fmt.Errorf("unimplemented") } diff --git a/upup/pkg/fi/cloudup/azure/vmscaleset.go b/upup/pkg/fi/cloudup/azure/vmscaleset.go index 7e55477c69..ed4d6a9531 100644 --- a/upup/pkg/fi/cloudup/azure/vmscaleset.go +++ b/upup/pkg/fi/cloudup/azure/vmscaleset.go @@ -28,6 +28,7 @@ import ( type VMScaleSetsClient interface { CreateOrUpdate(ctx context.Context, resourceGroupName, vmScaleSetName string, parameters compute.VirtualMachineScaleSet) (*compute.VirtualMachineScaleSet, error) List(ctx context.Context, resourceGroupName string) ([]compute.VirtualMachineScaleSet, error) + Get(ctx context.Context, resourceGroupName string, vmssName string) (*compute.VirtualMachineScaleSet, error) Delete(ctx context.Context, resourceGroupName, vmssName string) error } @@ -63,6 +64,14 @@ func (c *vmScaleSetsClientImpl) List(ctx context.Context, resourceGroupName stri return l, nil } +func (c *vmScaleSetsClientImpl) Get(ctx context.Context, resourceGroupName string, vmssName string) (*compute.VirtualMachineScaleSet, error) { + vmss, err := c.c.Get(ctx, resourceGroupName, vmssName, compute.UserData) + if err != nil { + return nil, err + } + return &vmss, nil +} + func (c *vmScaleSetsClientImpl) Delete(ctx context.Context, resourceGroupName, vmssName string) error { future, err := c.c.Delete(ctx, resourceGroupName, vmssName, nil) if err != nil { diff --git a/upup/pkg/fi/cloudup/azuretasks/testing.go b/upup/pkg/fi/cloudup/azuretasks/testing.go index 292778f413..61eb667959 100644 --- a/upup/pkg/fi/cloudup/azuretasks/testing.go +++ b/upup/pkg/fi/cloudup/azuretasks/testing.go @@ -403,6 +403,15 @@ func (c *MockVMScaleSetsClient) List(ctx context.Context, resourceGroupName stri return l, nil } +// Get Returns a specified VM Scale Set. +func (c *MockVMScaleSetsClient) Get(ctx context.Context, resourceGroupName string, vmssName string) (*compute.VirtualMachineScaleSet, error) { + vmss, ok := c.VMSSes[vmssName] + if !ok { + return nil, nil + } + return &vmss, nil +} + // Delete deletes a specified VM Scale Set. func (c *MockVMScaleSetsClient) Delete(ctx context.Context, resourceGroupName, vmssName string) error { // Ignore resourceGroupName for simplicity. diff --git a/upup/pkg/fi/cloudup/azuretasks/vmscaleset.go b/upup/pkg/fi/cloudup/azuretasks/vmscaleset.go index 2c12b70edc..d45810bbf4 100644 --- a/upup/pkg/fi/cloudup/azuretasks/vmscaleset.go +++ b/upup/pkg/fi/cloudup/azuretasks/vmscaleset.go @@ -113,8 +113,8 @@ type VMScaleSet struct { // AdmnUser specifies the name of the administrative account. AdminUser *string SSHPublicKey *string - // CustomData is the user data configuration - CustomData fi.Resource + // UserData is the user data configuration + UserData fi.Resource Tags map[string]*string Zones []string PrincipalID *string @@ -153,17 +153,10 @@ func (s *VMScaleSet) CompareWithID() *string { // Find discovers the VMScaleSet in the cloud provider. func (s *VMScaleSet) Find(c *fi.Context) (*VMScaleSet, error) { cloud := c.Cloud.(azure.AzureCloud) - l, err := cloud.VMScaleSet().List(context.TODO(), *s.ResourceGroup.Name) - if err != nil { + found, err := cloud.VMScaleSet().Get(context.TODO(), *s.ResourceGroup.Name, *s.Name) + if err != nil && !strings.Contains(err.Error(), "ResourceNotFound") { return nil, err } - var found *compute.VirtualMachineScaleSet - for _, v := range l { - if *v.Name == *s.Name { - found = &v - break - } - } if found == nil { return nil, nil } @@ -204,9 +197,11 @@ func (s *VMScaleSet) Find(c *fi.Context) (*VMScaleSet, error) { return nil, fmt.Errorf("unexpected number of SSH keys found for VM ScaleSet %s: %d", *s.Name, len(sshKeys)) } - // TODO(kenji): Do not check custom data as Azure doesn't - // populate (https://github.com/Azure/azure-cli/issues/5866). - // Find a way to work around this. + userData, err := base64.StdEncoding.DecodeString(*profile.UserData) + if err != nil { + return nil, fmt.Errorf("failed to decode user data: %w", err) + } + vmss := &VMScaleSet{ Name: s.Name, Lifecycle: s.Lifecycle, @@ -228,6 +223,7 @@ func (s *VMScaleSet) Find(c *fi.Context) (*VMScaleSet, error) { ComputerNamePrefix: osProfile.ComputerNamePrefix, AdminUser: osProfile.AdminUsername, SSHPublicKey: sshKeys[0].KeyData, + UserData: fi.NewBytesResource(userData), Tags: found.Tags, PrincipalID: found.Identity.PrincipalID, } @@ -281,10 +277,10 @@ func (s *VMScaleSet) RenderAzure(t *azure.AzureAPITarget, a, e, changes *VMScale name := *e.Name var customData *string - if e.CustomData != nil { - d, err := fi.ResourceAsBytes(e.CustomData) + if e.UserData != nil { + d, err := fi.ResourceAsBytes(e.UserData) if err != nil { - return fmt.Errorf("error rendering CustomData: %s", err) + return fmt.Errorf("error rendering UserData: %s", err) } customData = to.StringPtr(base64.StdEncoding.EncodeToString(d)) } @@ -292,7 +288,6 @@ func (s *VMScaleSet) RenderAzure(t *azure.AzureAPITarget, a, e, changes *VMScale osProfile := &compute.VirtualMachineScaleSetOSProfile{ ComputerNamePrefix: e.ComputerNamePrefix, AdminUsername: e.AdminUser, - CustomData: customData, LinuxConfiguration: &compute.LinuxConfiguration{ SSH: &compute.SSHConfiguration{ PublicKeys: &[]compute.SSHPublicKey{ @@ -367,6 +362,7 @@ func (s *VMScaleSet) RenderAzure(t *azure.AzureAPITarget, a, e, changes *VMScale VirtualMachineProfile: &compute.VirtualMachineScaleSetVMProfile{ OsProfile: osProfile, StorageProfile: e.StorageProfile.VirtualMachineScaleSetStorageProfile, + UserData: customData, NetworkProfile: &compute.VirtualMachineScaleSetNetworkProfile{ NetworkInterfaceConfigurations: &[]compute.VirtualMachineScaleSetNetworkConfiguration{ networkConfig, diff --git a/upup/pkg/fi/cloudup/azuretasks/vmscaleset_test.go b/upup/pkg/fi/cloudup/azuretasks/vmscaleset_test.go index 6bb3fbcd3c..6fa93ec498 100644 --- a/upup/pkg/fi/cloudup/azuretasks/vmscaleset_test.go +++ b/upup/pkg/fi/cloudup/azuretasks/vmscaleset_test.go @@ -84,7 +84,7 @@ func newTestVMScaleSet() *VMScaleSet { ComputerNamePrefix: to.StringPtr("cprefix"), AdminUser: to.StringPtr("admin"), SSHPublicKey: to.StringPtr("ssh"), - CustomData: fi.NewStringResource("custom"), + UserData: fi.NewStringResource("custom"), Tags: map[string]*string{}, Zones: []string{"zone1"}, } @@ -113,17 +113,17 @@ func TestVMScaleSetRenderAzure(t *testing.T) { if a, e := *actual.Sku.Capacity, *expected.Capacity; a != e { t.Errorf("unexpected SKU Capacity: expected %d, but got %d", e, a) } - actualCData, err := base64.StdEncoding.DecodeString( - *actual.VirtualMachineProfile.OsProfile.CustomData) + actualUserData, err := base64.StdEncoding.DecodeString( + *actual.VirtualMachineProfile.UserData) if err != nil { - t.Fatalf("failed to decode custom data: %s", err) + t.Fatalf("failed to decode user data: %s", err) } - expectedCData, err := fi.ResourceAsBytes(expected.CustomData) + expectedUserData, err := fi.ResourceAsBytes(expected.UserData) if err != nil { - t.Fatalf("failed to get custom data: %s", err) + t.Fatalf("failed to get user data: %s", err) } - if !bytes.Equal(actualCData, expectedCData) { - t.Errorf("unexpected custom data: expected %v, but got %v", expectedCData, actualCData) + if !bytes.Equal(actualUserData, expectedUserData) { + t.Errorf("unexpected user data: expected %v, but got %v", expectedUserData, actualUserData) } if expected.PrincipalID == nil { @@ -158,11 +158,10 @@ func TestVMScaleSetFind(t *testing.T) { } // Create a VM ScaleSet. - customData := []byte("custom") + userData := []byte("custom") osProfile := &compute.VirtualMachineScaleSetOSProfile{ ComputerNamePrefix: to.StringPtr("prefix"), AdminUsername: to.StringPtr("admin"), - CustomData: to.StringPtr(base64.RawStdEncoding.EncodeToString(customData)), LinuxConfiguration: &compute.LinuxConfiguration{ SSH: &compute.SSHConfiguration{ PublicKeys: &[]compute.SSHPublicKey{ @@ -248,6 +247,7 @@ func TestVMScaleSetFind(t *testing.T) { VirtualMachineProfile: &compute.VirtualMachineScaleSetVMProfile{ OsProfile: osProfile, StorageProfile: storageProfile, + UserData: to.StringPtr(base64.RawStdEncoding.EncodeToString(userData)), NetworkProfile: &compute.VirtualMachineScaleSetNetworkProfile{ NetworkInterfaceConfigurations: &[]compute.VirtualMachineScaleSetNetworkConfiguration{ networkConfig,