From 575af34105786f79bb999162be32440f29252efa Mon Sep 17 00:00:00 2001 From: ish Date: Thu, 29 Aug 2024 21:50:41 +0900 Subject: [PATCH 1/4] Azure: Store zone information in VPC tags using the subnet name ID and zone --- .../azure/connect/Azure_CloudConnection.go | 3 + .../drivers/azure/resources/ClusterHandler.go | 56 +++++- .../drivers/azure/resources/TagHandler.go | 190 +++++++++++++++++- .../drivers/azure/resources/VMHandler.go | 53 ++++- .../drivers/azure/resources/VPCHandler.go | 130 +++++++++++- 5 files changed, 414 insertions(+), 18 deletions(-) diff --git a/cloud-control-manager/cloud-driver/drivers/azure/connect/Azure_CloudConnection.go b/cloud-control-manager/cloud-driver/drivers/azure/connect/Azure_CloudConnection.go index 8ae229adf..9f8703122 100644 --- a/cloud-control-manager/cloud-driver/drivers/azure/connect/Azure_CloudConnection.go +++ b/cloud-control-manager/cloud-driver/drivers/azure/connect/Azure_CloudConnection.go @@ -115,6 +115,7 @@ func (cloudConn *AzureCloudConnection) CreateVMHandler() (irs.VMHandler, error) Region: cloudConn.Region, Ctx: cloudConn.Ctx, Client: cloudConn.VMClient, + VPCClient: cloudConn.VNetClient, SubnetClient: cloudConn.SubnetClient, NicClient: cloudConn.VNicClient, PublicIPClient: cloudConn.PublicIPClient, @@ -239,6 +240,8 @@ func (cloudConn *AzureCloudConnection) CreateTagHandler() (irs.TagHandler, error Region: cloudConn.Region, Ctx: cloudConn.Ctx, Client: cloudConn.TagsClient, + VPCClient: cloudConn.VNetClient, + SubnetClient: cloudConn.SubnetClient, } return &tagHandler, nil // return nil, errors.New("Azure Driver: not implemented") diff --git a/cloud-control-manager/cloud-driver/drivers/azure/resources/ClusterHandler.go b/cloud-control-manager/cloud-driver/drivers/azure/resources/ClusterHandler.go index 60ed3b2e6..236177a06 100644 --- a/cloud-control-manager/cloud-driver/drivers/azure/resources/ClusterHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/azure/resources/ClusterHandler.go @@ -1417,7 +1417,33 @@ func generateAgentPoolProfileProperties(nodeGroupInfo irs.NodeGroupInfo, subnet VnetSubnetID: subnet.ID, } - if !strings.EqualFold(ac.Region.Zone, "") { + var foundZone string + var networkList []*armnetwork.VirtualNetwork + + pager := ac.VirtualNetworksClient.NewListPager(ac.Region.Region, nil) + for pager.More() { + page, err := pager.NextPage(ac.Ctx) + if err != nil { + return armcontainerservice.ManagedClusterAgentPoolProfileProperties{}, errors.New(fmt.Sprintf("Failed to List VPC err = %s", err.Error())) + } + + for _, vpc := range page.Value { + networkList = append(networkList, vpc) + } + } + + for _, vpc := range networkList { + for key, value := range vpc.Tags { + if key == "subnet-"+*subnet.Name && *value != "" { + foundZone = *value + break + } + } + } + + if foundZone != "" { + agentPoolProfileProperties.AvailabilityZones = []*string{&foundZone} + } else if !strings.EqualFold(ac.Region.Zone, "") { agentPoolProfileProperties.AvailabilityZones = []*string{&ac.Region.Zone} } @@ -1459,7 +1485,33 @@ func generateAgentPoolProfile(nodeGroupInfo irs.NodeGroupInfo, subnet armnetwork agentPoolProfile.MaxCount = nil } - if !strings.EqualFold(ac.Region.Zone, "") { + var foundZone string + var networkList []*armnetwork.VirtualNetwork + + pager := ac.VirtualNetworksClient.NewListPager(ac.Region.Region, nil) + for pager.More() { + page, err := pager.NextPage(ac.Ctx) + if err != nil { + return armcontainerservice.ManagedClusterAgentPoolProfile{}, errors.New(fmt.Sprintf("Failed to List VPC err = %s", err.Error())) + } + + for _, vpc := range page.Value { + networkList = append(networkList, vpc) + } + } + + for _, vpc := range networkList { + for key, value := range vpc.Tags { + if key == "subnet-"+*subnet.Name && *value != "" { + foundZone = *value + break + } + } + } + + if foundZone != "" { + agentPoolProfile.AvailabilityZones = []*string{&foundZone} + } else if !strings.EqualFold(ac.Region.Zone, "") { agentPoolProfile.AvailabilityZones = []*string{&ac.Region.Zone} } diff --git a/cloud-control-manager/cloud-driver/drivers/azure/resources/TagHandler.go b/cloud-control-manager/cloud-driver/drivers/azure/resources/TagHandler.go index 3889dd7e5..cb7a924ad 100644 --- a/cloud-control-manager/cloud-driver/drivers/azure/resources/TagHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/azure/resources/TagHandler.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v6" "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources" "net/http" "strings" @@ -19,6 +20,8 @@ type AzureTagHandler struct { Region idrv.RegionInfo Ctx context.Context Client *armresources.TagsClient + VPCClient *armnetwork.VirtualNetworksClient + SubnetClient *armnetwork.SubnetsClient } type Resource struct { Id string `json:"id"` @@ -111,6 +114,100 @@ func findRSType(azureType string) (irs.RSType, error) { } } +func (tagHandler *AzureTagHandler) checkSubnetZoneTag(resIID irs.IID, tagKey string) (bool, error) { + vpcHandler := AzureVPCHandler{ + Region: tagHandler.Region, + Ctx: tagHandler.Ctx, + Client: tagHandler.VPCClient, + SubnetClient: tagHandler.SubnetClient, + } + vpcList, err := vpcHandler.ListVPC() + if err != nil { + return false, errors.New("failed to get VPC information") + } + + var vpcFound bool + var foundVPC irs.VPCInfo + + for _, vpc := range vpcList { + if vpc.IId.NameId == resIID.NameId || + vpc.IId.SystemId == resIID.SystemId { + foundVPC = *vpc + vpcFound = true + break + } + } + if !vpcFound { + return false, errors.New("failed to get VPC information") + } + + var found bool + for _, subnet := range foundVPC.SubnetInfoList { + if "subnet-"+subnet.IId.NameId == tagKey { + found = true + break + } + } + + if found { + return true, nil + } + + return false, nil +} + +func (tagHandler *AzureTagHandler) getTagsExceptSubnetZoneTags(resIID irs.IID) ([]irs.KeyValue, error) { + vpcHandler := AzureVPCHandler{ + Region: tagHandler.Region, + Ctx: tagHandler.Ctx, + Client: tagHandler.VPCClient, + SubnetClient: tagHandler.SubnetClient, + } + vpcList, err := vpcHandler.ListVPC() + if err != nil { + return []irs.KeyValue{}, errors.New("failed to get VPC information") + } + + var vpcFound bool + var foundVPC irs.VPCInfo + + for _, vpc := range vpcList { + if vpc.IId.NameId == resIID.NameId || + vpc.IId.SystemId == resIID.SystemId { + foundVPC = *vpc + vpcFound = true + break + } + } + if !vpcFound { + return []irs.KeyValue{}, errors.New("failed to get VPC information") + } + + var tagList []irs.KeyValue + + for _, tag := range foundVPC.TagList { + var found bool + + for _, subnet := range foundVPC.SubnetInfoList { + if "subnet-"+subnet.IId.NameId == tag.Key { + found = true + break + } + } + + if found { + continue + } + + tagList = append(tagList, irs.KeyValue{ + Key: tag.Key, + Value: tag.Value, + }) + } + + return tagList, nil +} + // AddTag adds a tag to the specified resource func (tagHandler *AzureTagHandler) AddTag(resType irs.RSType, resIID irs.IID, tag irs.KeyValue) (irs.KeyValue, error) { resourceID, err := FindIdByName(tagHandler.CredentialInfo, resIID) @@ -119,6 +216,24 @@ func (tagHandler *AzureTagHandler) AddTag(resType irs.RSType, resIID irs.IID, ta } resIID.SystemId = resourceID hiscallInfo := GetCallLogScheme(tagHandler.Region, call.TAG, string(resType), "AddTag()") + + if resType == irs.VPC { + yes, err := tagHandler.checkSubnetZoneTag(resIID, tag.Key) + if err != nil { + getErr := errors.New(fmt.Sprintf("Failed to add tag for resource ID %s: %s", resIID.SystemId, err.Error())) + cblogger.Error(getErr.Error()) + LoggingError(hiscallInfo, getErr) + return irs.KeyValue{}, getErr + } + + if yes { + getErr := errors.New(fmt.Sprintf("Failed to add tag for resource ID %s: Provided tag key is not allowed!", resIID.SystemId)) + cblogger.Error(getErr.Error()) + LoggingError(hiscallInfo, getErr) + return irs.KeyValue{}, getErr + } + } + // Fetch existing tags resp, err := tagHandler.Client.GetAtScope(tagHandler.Ctx, resIID.SystemId, nil) if err != nil { @@ -166,6 +281,18 @@ func (tagHandler *AzureTagHandler) ListTag(resType irs.RSType, resIID irs.IID) ( } LoggingInfo(hiscallInfo, start) + if resType == irs.VPC { + tagList, err := tagHandler.getTagsExceptSubnetZoneTags(resIID) + if err != nil { + getErr := errors.New(fmt.Sprintf("Failed to list tags for resource ID %s: %s", resIID.SystemId, err.Error())) + cblogger.Error(getErr.Error()) + LoggingError(hiscallInfo, getErr) + return nil, getErr + } + + return tagList, nil + } + var tagList []irs.KeyValue for key, value := range tagsResource.Properties.Tags { tagList = append(tagList, irs.KeyValue{Key: key, Value: *value}) @@ -192,7 +319,22 @@ func (tagHandler *AzureTagHandler) GetTag(resType irs.RSType, resIID irs.IID, ke } LoggingInfo(hiscallInfo, start) - if value, exists := tagsResource.Properties.Tags[key]; exists { + value, exists := tagsResource.Properties.Tags[key] + if exists { + if resType == irs.VPC { + yes, err := tagHandler.checkSubnetZoneTag(resIID, key) + if err != nil { + getErr := errors.New(fmt.Sprintf("Failed to get tag for resource ID %s: %s", resIID.SystemId, err.Error())) + cblogger.Error(getErr.Error()) + LoggingError(hiscallInfo, getErr) + return irs.KeyValue{}, getErr + } + + if yes { + return irs.KeyValue{}, errors.New("tag not found") + } + } + return irs.KeyValue{Key: key, Value: *value}, nil } @@ -207,6 +349,24 @@ func (tagHandler *AzureTagHandler) RemoveTag(resType irs.RSType, resIID irs.IID, } resIID.SystemId = resourceID hiscallInfo := GetCallLogScheme(tagHandler.Region, call.TAG, string(resType), "RemoveTag()") + + if resType == irs.VPC { + yes, err := tagHandler.checkSubnetZoneTag(resIID, key) + if err != nil { + getErr := errors.New(fmt.Sprintf("Failed to remove tag for resource ID %s: %s", resIID.SystemId, err.Error())) + cblogger.Error(getErr.Error()) + LoggingError(hiscallInfo, getErr) + return false, getErr + } + + if yes { + getErr := errors.New(fmt.Sprintf("Failed to remove tag for resource ID %s: Removing provided tag key is not allowed!", resIID.SystemId)) + cblogger.Error(getErr.Error()) + LoggingError(hiscallInfo, getErr) + return false, getErr + } + } + // Fetch existing tags resp, err := tagHandler.Client.GetAtScope(tagHandler.Ctx, resIID.SystemId, nil) if err != nil { @@ -215,10 +375,27 @@ func (tagHandler *AzureTagHandler) RemoveTag(resType irs.RSType, resIID irs.IID, LoggingError(hiscallInfo, delErr) return false, delErr } + // Remove the tag - if _, exists := resp.Properties.Tags[key]; !exists { + _, exists := resp.Properties.Tags[key] + if exists { + if resType == irs.VPC { + yes, err := tagHandler.checkSubnetZoneTag(resIID, key) + if err != nil { + getErr := errors.New(fmt.Sprintf("Failed to get existing tags for resource ID %s: %s", resIID.SystemId, err.Error())) + cblogger.Error(getErr.Error()) + LoggingError(hiscallInfo, getErr) + return false, getErr + } + + if yes { + return false, errors.New("tag not found") + } + } + } else { return false, errors.New("tag not found") } + delete(resp.Properties.Tags, key) // Update tags @@ -269,7 +446,15 @@ func (tagHandler *AzureTagHandler) FindTag(resType irs.RSType, keyword string) ( var foundTags []*irs.TagInfo for _, resource := range response.Value { var tagList []irs.KeyValue + resType, _ := findRSType(resource.Type) for key, value := range resource.Tags { + if resType == irs.VPC { + yes, err := tagHandler.checkSubnetZoneTag(irs.IID{NameId: resource.Name, SystemId: resource.Id}, key) + if yes || err != nil { + continue + } + } + if strings.Contains(key, keyword) || strings.Contains(value, keyword) { tagList = append(tagList, irs.KeyValue{Key: key, Value: value}) } @@ -280,6 +465,7 @@ func (tagHandler *AzureTagHandler) FindTag(resType irs.RSType, keyword string) ( if err != nil || resType == "" { continue // resType이 유효하지 않거나 지원되지 않는 경우 pass } + tagInfo := &irs.TagInfo{ ResType: resType, ResIId: irs.IID{NameId: resource.Name, SystemId: resource.Id}, diff --git a/cloud-control-manager/cloud-driver/drivers/azure/resources/VMHandler.go b/cloud-control-manager/cloud-driver/drivers/azure/resources/VMHandler.go index f98c8e0c2..a009aa633 100644 --- a/cloud-control-manager/cloud-driver/drivers/azure/resources/VMHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/azure/resources/VMHandler.go @@ -46,6 +46,7 @@ type AzureVMHandler struct { Region idrv.RegionInfo Ctx context.Context Client *armcompute.VirtualMachinesClient + VPCClient *armnetwork.VirtualNetworksClient SubnetClient *armnetwork.SubnetsClient NicClient *armnetwork.InterfacesClient PublicIPClient *armnetwork.PublicIPAddressesClient @@ -167,9 +168,33 @@ func (vmHandler *AzureVMHandler) StartVM(vmReqInfo irs.VMReqInfo) (irs.VMInfo, e } cleanResources := CleanVMClientRequestResource{} + // Find zone from the subnet + vpcHandler := AzureVPCHandler{ + Region: vmHandler.Region, + Ctx: vmHandler.Ctx, + Client: vmHandler.VPCClient, + SubnetClient: vmHandler.SubnetClient, + } + vpc, err := vpcHandler.getRawVPC(vmReqInfo.VpcIID) + if err != nil { + createErr := errors.New("Failed to Start VM. err = Failed to get VPC information.") + cblogger.Error(createErr.Error()) + LoggingError(hiscallInfo, createErr) + return irs.VMInfo{}, createErr + } + + var foundZone string + + for key, value := range vpc.Tags { + if key == "subnet-"+vmReqInfo.SubnetIID.NameId && *value != "" { + foundZone = *value + break + } + } + // 2. related Resource Create // publicip, vnic // 2-1. related Resource Create - PublicIP - publicIPIId, err := CreatePublicIP(vmHandler, vmReqInfo) + publicIPIId, err := CreatePublicIP(vmHandler, vmReqInfo, foundZone) if err != nil { createErr := errors.New(fmt.Sprintf("Failed to Start VM. err = %s", err.Error())) cblogger.Error(createErr.Error()) @@ -228,8 +253,12 @@ func (vmHandler *AzureVMHandler) StartVM(vmReqInfo irs.VMReqInfo) (irs.VMInfo, e }, } - // Setting zone if available - if vmHandler.Region.Zone != "" { + // Use default zone if zone is not found from the subnet + if foundZone != "" { + vmOpts.Zones = []*string{ + &foundZone, + } + } else if vmHandler.Region.Zone != "" { vmOpts.Zones = []*string{ &vmHandler.Region.Zone, } @@ -1163,18 +1192,19 @@ func (vmHandler *AzureVMHandler) mappingServerInfo(server armcompute.VirtualMach } // VM 생성 시 Public IP 자동 생성 (nested flow 적용) -func CreatePublicIP(vmHandler *AzureVMHandler, vmReqInfo irs.VMReqInfo) (irs.IID, error) { +func CreatePublicIP(vmHandler *AzureVMHandler, vmReqInfo irs.VMReqInfo, foundZone string) (irs.IID, error) { // PublicIP 이름 생성 publicIPName := generatePublicIPName(vmReqInfo.IId.NameId) publicIPAddressSKUNameBasic := armnetwork.PublicIPAddressSKUNameBasic + publicIPAddressSKUNameStandard := armnetwork.PublicIPAddressSKUNameStandard publicIPAddressVersion := armnetwork.IPVersionIPv4 publicIPAllocationMethod := armnetwork.IPAllocationMethodStatic createOpts := armnetwork.PublicIPAddress{ Name: &publicIPName, SKU: &armnetwork.PublicIPAddressSKU{ - Name: &publicIPAddressSKUNameBasic, + Name: &publicIPAddressSKUNameStandard, }, Properties: &armnetwork.PublicIPAddressPropertiesFormat{ PublicIPAddressVersion: &publicIPAddressVersion, @@ -1187,16 +1217,19 @@ func CreatePublicIP(vmHandler *AzureVMHandler, vmReqInfo irs.VMReqInfo) (irs.IID }, } - publicIPAddressSKUNameStandard := armnetwork.PublicIPAddressSKUNameStandard // Setting zone if available - if vmHandler.Region.Zone != "" { - createOpts.SKU = &armnetwork.PublicIPAddressSKU{ - Name: &publicIPAddressSKUNameStandard, + if foundZone != "" { + createOpts.Zones = []*string{ + toStrPtr(foundZone), } - createOpts.Properties.PublicIPAllocationMethod = &publicIPAllocationMethod + } else if vmHandler.Region.Zone != "" { createOpts.Zones = []*string{ toStrPtr(vmHandler.Region.Zone), } + } else { + createOpts.SKU = &armnetwork.PublicIPAddressSKU{ + Name: &publicIPAddressSKUNameBasic, + } } poller, err := vmHandler.PublicIPClient.BeginCreateOrUpdate(vmHandler.Ctx, vmHandler.Region.Region, publicIPName, createOpts, nil) diff --git a/cloud-control-manager/cloud-driver/drivers/azure/resources/VPCHandler.go b/cloud-control-manager/cloud-driver/drivers/azure/resources/VPCHandler.go index 666932fe3..e13ad2e23 100644 --- a/cloud-control-manager/cloud-driver/drivers/azure/resources/VPCHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/azure/resources/VPCHandler.go @@ -38,7 +38,29 @@ func (vpcHandler *AzureVPCHandler) setterVPC(network *armnetwork.VirtualNetwork) vpcInfo.SubnetInfoList = subnetArr if network.Tags != nil { - vpcInfo.TagList = setTagList(network.Tags) + var tagList []irs.KeyValue + + for key, value := range network.Tags { + var found bool + + for _, subnet := range vpcInfo.SubnetInfoList { + if "subnet-"+subnet.IId.NameId == key { + found = true + break + } + } + + if found { + continue + } + + tagList = append(tagList, irs.KeyValue{ + Key: key, + Value: *value, + }) + } + + vpcInfo.TagList = tagList } return vpcInfo } @@ -67,6 +89,19 @@ func (vpcHandler *AzureVPCHandler) CreateVPC(vpcReqInfo irs.VPCReqInfo) (irs.VPC LoggingError(hiscallInfo, createErr) return irs.VPCInfo{}, createErr } + + // Add subnet name and zone to tag list + for _, subnet := range vpcReqInfo.SubnetInfoList { + for _, tag := range vpcReqInfo.TagList { + if "subnet-"+subnet.IId.NameId == tag.Key { + createErr := errors.New(fmt.Sprintf("Failed to Create VPC err = Provided tag key (%s) is not allowed!", tag.Key)) + cblogger.Error(createErr.Error()) + LoggingError(hiscallInfo, createErr) + return irs.VPCInfo{}, createErr + } + } + } + // Create Tag tags := setTags(vpcReqInfo.TagList) @@ -117,6 +152,28 @@ func (vpcHandler *AzureVPCHandler) CreateVPC(vpcReqInfo irs.VPCReqInfo) (irs.VPC cblogger.Error(fmt.Sprintf("failed to get subnet with name %s", subnet.IId.NameId)) continue } + + vpc, err := vpcHandler.getRawVPC(vpcReqInfo.IId) + if err != nil { + cblogger.Error(fmt.Sprintf("failed to get VPC info %s", vpcReqInfo.IId.NameId)) + continue + } + tagKey := "subnet-" + subnet.IId.NameId + vpcReqInfo.TagList = append(vpcReqInfo.TagList, irs.KeyValue{ + Key: tagKey, + Value: subnet.Zone, + }) + vpc.Tags = setTags(vpcReqInfo.TagList) + poller2, err := vpcHandler.Client.BeginCreateOrUpdate(vpcHandler.Ctx, vpcHandler.Region.Region, vpcReqInfo.IId.NameId, *vpc, nil) + if err != nil { + cblogger.Error(fmt.Sprintf("failed to add subnet tag with key %s", tagKey)) + continue + } + _, err = poller2.PollUntilDone(vpcHandler.Ctx, nil) + if err != nil { + cblogger.Error(fmt.Sprintf("failed to get subnet tag with key %s", tagKey)) + continue + } } // 생성된 VNetwork 정보 리턴 @@ -207,6 +264,7 @@ func (vpcHandler *AzureVPCHandler) DeleteVPC(vpcIID irs.IID) (bool, error) { func (vpcHandler *AzureVPCHandler) AddSubnet(vpcIID irs.IID, subnetInfo irs.SubnetInfo) (irs.VPCInfo, error) { // log HisCall hiscallInfo := GetCallLogScheme(vpcHandler.Region, call.VPCSUBNET, subnetInfo.IId.NameId, "AddSubnet()") + start := call.Start() vpc, err := vpcHandler.getRawVPC(vpcIID) if err != nil { @@ -215,21 +273,47 @@ func (vpcHandler *AzureVPCHandler) AddSubnet(vpcIID irs.IID, subnetInfo irs.Subn LoggingError(hiscallInfo, addSubnetErr) return irs.VPCInfo{}, addSubnetErr } + + tagList := setTagList(vpc.Tags) + + // Add subnet name and zone to tag list + tagList = append(tagList, irs.KeyValue{ + Key: "subnet-" + subnetInfo.IId.NameId, + Value: subnetInfo.Zone, + }) + + // Update VPC + vpc.Tags = setTags(tagList) + + poller, err := vpcHandler.Client.BeginCreateOrUpdate(vpcHandler.Ctx, vpcHandler.Region.Region, vpcIID.NameId, *vpc, nil) + if err != nil { + createErr := errors.New(fmt.Sprintf("Failed to AddSubnet err = %s", err.Error())) + cblogger.Error(createErr.Error()) + LoggingError(hiscallInfo, createErr) + return irs.VPCInfo{}, createErr + } + _, err = poller.PollUntilDone(vpcHandler.Ctx, nil) + if err != nil { + createErr := errors.New(fmt.Sprintf("Failed to AddSubnet err = %s", err.Error())) + cblogger.Error(createErr.Error()) + + } + subnetCreateOpts := armnetwork.Subnet{ Name: &subnetInfo.IId.NameId, Properties: &armnetwork.SubnetPropertiesFormat{ AddressPrefix: toStrPtr(subnetInfo.IPv4_CIDR), }, } - start := call.Start() - poller, err := vpcHandler.SubnetClient.BeginCreateOrUpdate(vpcHandler.Ctx, vpcHandler.Region.Region, *vpc.Name, subnetInfo.IId.NameId, subnetCreateOpts, nil) + + poller2, err := vpcHandler.SubnetClient.BeginCreateOrUpdate(vpcHandler.Ctx, vpcHandler.Region.Region, *vpc.Name, subnetInfo.IId.NameId, subnetCreateOpts, nil) if err != nil { addSubnetErr := errors.New(fmt.Sprintf("Failed to AddSubnet err = %s", err.Error())) cblogger.Error(addSubnetErr.Error()) LoggingError(hiscallInfo, addSubnetErr) return irs.VPCInfo{}, addSubnetErr } - _, err = poller.PollUntilDone(vpcHandler.Ctx, nil) + _, err = poller2.PollUntilDone(vpcHandler.Ctx, nil) if err != nil { addSubnetErr := errors.New(fmt.Sprintf("Failed to AddSubnet err = %s", err.Error())) cblogger.Error(addSubnetErr.Error()) @@ -248,6 +332,44 @@ func (vpcHandler *AzureVPCHandler) AddSubnet(vpcIID irs.IID, subnetInfo irs.Subn func (vpcHandler *AzureVPCHandler) RemoveSubnet(vpcIID irs.IID, subnetIID irs.IID) (bool, error) { hiscallInfo := GetCallLogScheme(vpcHandler.Region, call.VPCSUBNET, subnetIID.NameId, "RemoveSubnet()") start := call.Start() + + vpc, err := vpcHandler.getRawVPC(vpcIID) + if err != nil { + delErr := errors.New(fmt.Sprintf("Failed to RemoveSubnet err = %s", err.Error())) + cblogger.Error(delErr.Error()) + LoggingError(hiscallInfo, delErr) + return false, delErr + } + + _, exists := vpc.Tags[subnetIID.NameId] + if exists { + delete(vpc.Tags, "subnet-"+subnetIID.NameId) + + // Update VPC + updateOpts := armnetwork.VirtualNetwork{ + Name: &vpcIID.NameId, + Tags: vpc.Tags, + } + + poller, err := vpcHandler.Client.BeginCreateOrUpdate(vpcHandler.Ctx, vpcHandler.Region.Region, vpcIID.NameId, updateOpts, nil) + if err != nil { + delErr := errors.New(fmt.Sprintf("Failed to RemoveSubnet err = %s", err.Error())) + cblogger.Error(delErr.Error()) + LoggingError(hiscallInfo, delErr) + return false, delErr + } + _, err = poller.PollUntilDone(vpcHandler.Ctx, nil) + if err != nil { + delErr := errors.New(fmt.Sprintf("Failed to RemoveSubnet err = %s", err.Error())) + cblogger.Error(delErr.Error()) + LoggingError(hiscallInfo, delErr) + return false, delErr + } + } else { + delErr := errors.New(fmt.Sprintf("Tag (%s) not found while removing the subnet", subnetIID.NameId)) + cblogger.Warn(delErr.Error()) + } + poller, err := vpcHandler.SubnetClient.BeginDelete(vpcHandler.Ctx, vpcHandler.Region.Region, vpcIID.NameId, subnetIID.NameId, nil) if err != nil { delErr := errors.New(fmt.Sprintf("Failed to RemoveSubnet err = %s", err.Error())) From 5de427ae26c313a74c8a9e5c6308e86972685f09 Mon Sep 17 00:00:00 2001 From: ish Date: Mon, 9 Sep 2024 23:05:48 +0900 Subject: [PATCH 2/4] Revert "Azure: Store zone information in VPC tags using the subnet name ID and zone" This reverts commit 575af34105786f79bb999162be32440f29252efa. --- .../azure/connect/Azure_CloudConnection.go | 3 - .../drivers/azure/resources/ClusterHandler.go | 56 +----- .../drivers/azure/resources/TagHandler.go | 190 +----------------- .../drivers/azure/resources/VMHandler.go | 53 +---- .../drivers/azure/resources/VPCHandler.go | 130 +----------- 5 files changed, 18 insertions(+), 414 deletions(-) diff --git a/cloud-control-manager/cloud-driver/drivers/azure/connect/Azure_CloudConnection.go b/cloud-control-manager/cloud-driver/drivers/azure/connect/Azure_CloudConnection.go index 9f8703122..8ae229adf 100644 --- a/cloud-control-manager/cloud-driver/drivers/azure/connect/Azure_CloudConnection.go +++ b/cloud-control-manager/cloud-driver/drivers/azure/connect/Azure_CloudConnection.go @@ -115,7 +115,6 @@ func (cloudConn *AzureCloudConnection) CreateVMHandler() (irs.VMHandler, error) Region: cloudConn.Region, Ctx: cloudConn.Ctx, Client: cloudConn.VMClient, - VPCClient: cloudConn.VNetClient, SubnetClient: cloudConn.SubnetClient, NicClient: cloudConn.VNicClient, PublicIPClient: cloudConn.PublicIPClient, @@ -240,8 +239,6 @@ func (cloudConn *AzureCloudConnection) CreateTagHandler() (irs.TagHandler, error Region: cloudConn.Region, Ctx: cloudConn.Ctx, Client: cloudConn.TagsClient, - VPCClient: cloudConn.VNetClient, - SubnetClient: cloudConn.SubnetClient, } return &tagHandler, nil // return nil, errors.New("Azure Driver: not implemented") diff --git a/cloud-control-manager/cloud-driver/drivers/azure/resources/ClusterHandler.go b/cloud-control-manager/cloud-driver/drivers/azure/resources/ClusterHandler.go index 236177a06..60ed3b2e6 100644 --- a/cloud-control-manager/cloud-driver/drivers/azure/resources/ClusterHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/azure/resources/ClusterHandler.go @@ -1417,33 +1417,7 @@ func generateAgentPoolProfileProperties(nodeGroupInfo irs.NodeGroupInfo, subnet VnetSubnetID: subnet.ID, } - var foundZone string - var networkList []*armnetwork.VirtualNetwork - - pager := ac.VirtualNetworksClient.NewListPager(ac.Region.Region, nil) - for pager.More() { - page, err := pager.NextPage(ac.Ctx) - if err != nil { - return armcontainerservice.ManagedClusterAgentPoolProfileProperties{}, errors.New(fmt.Sprintf("Failed to List VPC err = %s", err.Error())) - } - - for _, vpc := range page.Value { - networkList = append(networkList, vpc) - } - } - - for _, vpc := range networkList { - for key, value := range vpc.Tags { - if key == "subnet-"+*subnet.Name && *value != "" { - foundZone = *value - break - } - } - } - - if foundZone != "" { - agentPoolProfileProperties.AvailabilityZones = []*string{&foundZone} - } else if !strings.EqualFold(ac.Region.Zone, "") { + if !strings.EqualFold(ac.Region.Zone, "") { agentPoolProfileProperties.AvailabilityZones = []*string{&ac.Region.Zone} } @@ -1485,33 +1459,7 @@ func generateAgentPoolProfile(nodeGroupInfo irs.NodeGroupInfo, subnet armnetwork agentPoolProfile.MaxCount = nil } - var foundZone string - var networkList []*armnetwork.VirtualNetwork - - pager := ac.VirtualNetworksClient.NewListPager(ac.Region.Region, nil) - for pager.More() { - page, err := pager.NextPage(ac.Ctx) - if err != nil { - return armcontainerservice.ManagedClusterAgentPoolProfile{}, errors.New(fmt.Sprintf("Failed to List VPC err = %s", err.Error())) - } - - for _, vpc := range page.Value { - networkList = append(networkList, vpc) - } - } - - for _, vpc := range networkList { - for key, value := range vpc.Tags { - if key == "subnet-"+*subnet.Name && *value != "" { - foundZone = *value - break - } - } - } - - if foundZone != "" { - agentPoolProfile.AvailabilityZones = []*string{&foundZone} - } else if !strings.EqualFold(ac.Region.Zone, "") { + if !strings.EqualFold(ac.Region.Zone, "") { agentPoolProfile.AvailabilityZones = []*string{&ac.Region.Zone} } diff --git a/cloud-control-manager/cloud-driver/drivers/azure/resources/TagHandler.go b/cloud-control-manager/cloud-driver/drivers/azure/resources/TagHandler.go index cb7a924ad..3889dd7e5 100644 --- a/cloud-control-manager/cloud-driver/drivers/azure/resources/TagHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/azure/resources/TagHandler.go @@ -5,7 +5,6 @@ import ( "encoding/json" "errors" "fmt" - "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v6" "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources" "net/http" "strings" @@ -20,8 +19,6 @@ type AzureTagHandler struct { Region idrv.RegionInfo Ctx context.Context Client *armresources.TagsClient - VPCClient *armnetwork.VirtualNetworksClient - SubnetClient *armnetwork.SubnetsClient } type Resource struct { Id string `json:"id"` @@ -114,100 +111,6 @@ func findRSType(azureType string) (irs.RSType, error) { } } -func (tagHandler *AzureTagHandler) checkSubnetZoneTag(resIID irs.IID, tagKey string) (bool, error) { - vpcHandler := AzureVPCHandler{ - Region: tagHandler.Region, - Ctx: tagHandler.Ctx, - Client: tagHandler.VPCClient, - SubnetClient: tagHandler.SubnetClient, - } - vpcList, err := vpcHandler.ListVPC() - if err != nil { - return false, errors.New("failed to get VPC information") - } - - var vpcFound bool - var foundVPC irs.VPCInfo - - for _, vpc := range vpcList { - if vpc.IId.NameId == resIID.NameId || - vpc.IId.SystemId == resIID.SystemId { - foundVPC = *vpc - vpcFound = true - break - } - } - if !vpcFound { - return false, errors.New("failed to get VPC information") - } - - var found bool - for _, subnet := range foundVPC.SubnetInfoList { - if "subnet-"+subnet.IId.NameId == tagKey { - found = true - break - } - } - - if found { - return true, nil - } - - return false, nil -} - -func (tagHandler *AzureTagHandler) getTagsExceptSubnetZoneTags(resIID irs.IID) ([]irs.KeyValue, error) { - vpcHandler := AzureVPCHandler{ - Region: tagHandler.Region, - Ctx: tagHandler.Ctx, - Client: tagHandler.VPCClient, - SubnetClient: tagHandler.SubnetClient, - } - vpcList, err := vpcHandler.ListVPC() - if err != nil { - return []irs.KeyValue{}, errors.New("failed to get VPC information") - } - - var vpcFound bool - var foundVPC irs.VPCInfo - - for _, vpc := range vpcList { - if vpc.IId.NameId == resIID.NameId || - vpc.IId.SystemId == resIID.SystemId { - foundVPC = *vpc - vpcFound = true - break - } - } - if !vpcFound { - return []irs.KeyValue{}, errors.New("failed to get VPC information") - } - - var tagList []irs.KeyValue - - for _, tag := range foundVPC.TagList { - var found bool - - for _, subnet := range foundVPC.SubnetInfoList { - if "subnet-"+subnet.IId.NameId == tag.Key { - found = true - break - } - } - - if found { - continue - } - - tagList = append(tagList, irs.KeyValue{ - Key: tag.Key, - Value: tag.Value, - }) - } - - return tagList, nil -} - // AddTag adds a tag to the specified resource func (tagHandler *AzureTagHandler) AddTag(resType irs.RSType, resIID irs.IID, tag irs.KeyValue) (irs.KeyValue, error) { resourceID, err := FindIdByName(tagHandler.CredentialInfo, resIID) @@ -216,24 +119,6 @@ func (tagHandler *AzureTagHandler) AddTag(resType irs.RSType, resIID irs.IID, ta } resIID.SystemId = resourceID hiscallInfo := GetCallLogScheme(tagHandler.Region, call.TAG, string(resType), "AddTag()") - - if resType == irs.VPC { - yes, err := tagHandler.checkSubnetZoneTag(resIID, tag.Key) - if err != nil { - getErr := errors.New(fmt.Sprintf("Failed to add tag for resource ID %s: %s", resIID.SystemId, err.Error())) - cblogger.Error(getErr.Error()) - LoggingError(hiscallInfo, getErr) - return irs.KeyValue{}, getErr - } - - if yes { - getErr := errors.New(fmt.Sprintf("Failed to add tag for resource ID %s: Provided tag key is not allowed!", resIID.SystemId)) - cblogger.Error(getErr.Error()) - LoggingError(hiscallInfo, getErr) - return irs.KeyValue{}, getErr - } - } - // Fetch existing tags resp, err := tagHandler.Client.GetAtScope(tagHandler.Ctx, resIID.SystemId, nil) if err != nil { @@ -281,18 +166,6 @@ func (tagHandler *AzureTagHandler) ListTag(resType irs.RSType, resIID irs.IID) ( } LoggingInfo(hiscallInfo, start) - if resType == irs.VPC { - tagList, err := tagHandler.getTagsExceptSubnetZoneTags(resIID) - if err != nil { - getErr := errors.New(fmt.Sprintf("Failed to list tags for resource ID %s: %s", resIID.SystemId, err.Error())) - cblogger.Error(getErr.Error()) - LoggingError(hiscallInfo, getErr) - return nil, getErr - } - - return tagList, nil - } - var tagList []irs.KeyValue for key, value := range tagsResource.Properties.Tags { tagList = append(tagList, irs.KeyValue{Key: key, Value: *value}) @@ -319,22 +192,7 @@ func (tagHandler *AzureTagHandler) GetTag(resType irs.RSType, resIID irs.IID, ke } LoggingInfo(hiscallInfo, start) - value, exists := tagsResource.Properties.Tags[key] - if exists { - if resType == irs.VPC { - yes, err := tagHandler.checkSubnetZoneTag(resIID, key) - if err != nil { - getErr := errors.New(fmt.Sprintf("Failed to get tag for resource ID %s: %s", resIID.SystemId, err.Error())) - cblogger.Error(getErr.Error()) - LoggingError(hiscallInfo, getErr) - return irs.KeyValue{}, getErr - } - - if yes { - return irs.KeyValue{}, errors.New("tag not found") - } - } - + if value, exists := tagsResource.Properties.Tags[key]; exists { return irs.KeyValue{Key: key, Value: *value}, nil } @@ -349,24 +207,6 @@ func (tagHandler *AzureTagHandler) RemoveTag(resType irs.RSType, resIID irs.IID, } resIID.SystemId = resourceID hiscallInfo := GetCallLogScheme(tagHandler.Region, call.TAG, string(resType), "RemoveTag()") - - if resType == irs.VPC { - yes, err := tagHandler.checkSubnetZoneTag(resIID, key) - if err != nil { - getErr := errors.New(fmt.Sprintf("Failed to remove tag for resource ID %s: %s", resIID.SystemId, err.Error())) - cblogger.Error(getErr.Error()) - LoggingError(hiscallInfo, getErr) - return false, getErr - } - - if yes { - getErr := errors.New(fmt.Sprintf("Failed to remove tag for resource ID %s: Removing provided tag key is not allowed!", resIID.SystemId)) - cblogger.Error(getErr.Error()) - LoggingError(hiscallInfo, getErr) - return false, getErr - } - } - // Fetch existing tags resp, err := tagHandler.Client.GetAtScope(tagHandler.Ctx, resIID.SystemId, nil) if err != nil { @@ -375,27 +215,10 @@ func (tagHandler *AzureTagHandler) RemoveTag(resType irs.RSType, resIID irs.IID, LoggingError(hiscallInfo, delErr) return false, delErr } - // Remove the tag - _, exists := resp.Properties.Tags[key] - if exists { - if resType == irs.VPC { - yes, err := tagHandler.checkSubnetZoneTag(resIID, key) - if err != nil { - getErr := errors.New(fmt.Sprintf("Failed to get existing tags for resource ID %s: %s", resIID.SystemId, err.Error())) - cblogger.Error(getErr.Error()) - LoggingError(hiscallInfo, getErr) - return false, getErr - } - - if yes { - return false, errors.New("tag not found") - } - } - } else { + if _, exists := resp.Properties.Tags[key]; !exists { return false, errors.New("tag not found") } - delete(resp.Properties.Tags, key) // Update tags @@ -446,15 +269,7 @@ func (tagHandler *AzureTagHandler) FindTag(resType irs.RSType, keyword string) ( var foundTags []*irs.TagInfo for _, resource := range response.Value { var tagList []irs.KeyValue - resType, _ := findRSType(resource.Type) for key, value := range resource.Tags { - if resType == irs.VPC { - yes, err := tagHandler.checkSubnetZoneTag(irs.IID{NameId: resource.Name, SystemId: resource.Id}, key) - if yes || err != nil { - continue - } - } - if strings.Contains(key, keyword) || strings.Contains(value, keyword) { tagList = append(tagList, irs.KeyValue{Key: key, Value: value}) } @@ -465,7 +280,6 @@ func (tagHandler *AzureTagHandler) FindTag(resType irs.RSType, keyword string) ( if err != nil || resType == "" { continue // resType이 유효하지 않거나 지원되지 않는 경우 pass } - tagInfo := &irs.TagInfo{ ResType: resType, ResIId: irs.IID{NameId: resource.Name, SystemId: resource.Id}, diff --git a/cloud-control-manager/cloud-driver/drivers/azure/resources/VMHandler.go b/cloud-control-manager/cloud-driver/drivers/azure/resources/VMHandler.go index a009aa633..f98c8e0c2 100644 --- a/cloud-control-manager/cloud-driver/drivers/azure/resources/VMHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/azure/resources/VMHandler.go @@ -46,7 +46,6 @@ type AzureVMHandler struct { Region idrv.RegionInfo Ctx context.Context Client *armcompute.VirtualMachinesClient - VPCClient *armnetwork.VirtualNetworksClient SubnetClient *armnetwork.SubnetsClient NicClient *armnetwork.InterfacesClient PublicIPClient *armnetwork.PublicIPAddressesClient @@ -168,33 +167,9 @@ func (vmHandler *AzureVMHandler) StartVM(vmReqInfo irs.VMReqInfo) (irs.VMInfo, e } cleanResources := CleanVMClientRequestResource{} - // Find zone from the subnet - vpcHandler := AzureVPCHandler{ - Region: vmHandler.Region, - Ctx: vmHandler.Ctx, - Client: vmHandler.VPCClient, - SubnetClient: vmHandler.SubnetClient, - } - vpc, err := vpcHandler.getRawVPC(vmReqInfo.VpcIID) - if err != nil { - createErr := errors.New("Failed to Start VM. err = Failed to get VPC information.") - cblogger.Error(createErr.Error()) - LoggingError(hiscallInfo, createErr) - return irs.VMInfo{}, createErr - } - - var foundZone string - - for key, value := range vpc.Tags { - if key == "subnet-"+vmReqInfo.SubnetIID.NameId && *value != "" { - foundZone = *value - break - } - } - // 2. related Resource Create // publicip, vnic // 2-1. related Resource Create - PublicIP - publicIPIId, err := CreatePublicIP(vmHandler, vmReqInfo, foundZone) + publicIPIId, err := CreatePublicIP(vmHandler, vmReqInfo) if err != nil { createErr := errors.New(fmt.Sprintf("Failed to Start VM. err = %s", err.Error())) cblogger.Error(createErr.Error()) @@ -253,12 +228,8 @@ func (vmHandler *AzureVMHandler) StartVM(vmReqInfo irs.VMReqInfo) (irs.VMInfo, e }, } - // Use default zone if zone is not found from the subnet - if foundZone != "" { - vmOpts.Zones = []*string{ - &foundZone, - } - } else if vmHandler.Region.Zone != "" { + // Setting zone if available + if vmHandler.Region.Zone != "" { vmOpts.Zones = []*string{ &vmHandler.Region.Zone, } @@ -1192,19 +1163,18 @@ func (vmHandler *AzureVMHandler) mappingServerInfo(server armcompute.VirtualMach } // VM 생성 시 Public IP 자동 생성 (nested flow 적용) -func CreatePublicIP(vmHandler *AzureVMHandler, vmReqInfo irs.VMReqInfo, foundZone string) (irs.IID, error) { +func CreatePublicIP(vmHandler *AzureVMHandler, vmReqInfo irs.VMReqInfo) (irs.IID, error) { // PublicIP 이름 생성 publicIPName := generatePublicIPName(vmReqInfo.IId.NameId) publicIPAddressSKUNameBasic := armnetwork.PublicIPAddressSKUNameBasic - publicIPAddressSKUNameStandard := armnetwork.PublicIPAddressSKUNameStandard publicIPAddressVersion := armnetwork.IPVersionIPv4 publicIPAllocationMethod := armnetwork.IPAllocationMethodStatic createOpts := armnetwork.PublicIPAddress{ Name: &publicIPName, SKU: &armnetwork.PublicIPAddressSKU{ - Name: &publicIPAddressSKUNameStandard, + Name: &publicIPAddressSKUNameBasic, }, Properties: &armnetwork.PublicIPAddressPropertiesFormat{ PublicIPAddressVersion: &publicIPAddressVersion, @@ -1217,19 +1187,16 @@ func CreatePublicIP(vmHandler *AzureVMHandler, vmReqInfo irs.VMReqInfo, foundZon }, } + publicIPAddressSKUNameStandard := armnetwork.PublicIPAddressSKUNameStandard // Setting zone if available - if foundZone != "" { - createOpts.Zones = []*string{ - toStrPtr(foundZone), + if vmHandler.Region.Zone != "" { + createOpts.SKU = &armnetwork.PublicIPAddressSKU{ + Name: &publicIPAddressSKUNameStandard, } - } else if vmHandler.Region.Zone != "" { + createOpts.Properties.PublicIPAllocationMethod = &publicIPAllocationMethod createOpts.Zones = []*string{ toStrPtr(vmHandler.Region.Zone), } - } else { - createOpts.SKU = &armnetwork.PublicIPAddressSKU{ - Name: &publicIPAddressSKUNameBasic, - } } poller, err := vmHandler.PublicIPClient.BeginCreateOrUpdate(vmHandler.Ctx, vmHandler.Region.Region, publicIPName, createOpts, nil) diff --git a/cloud-control-manager/cloud-driver/drivers/azure/resources/VPCHandler.go b/cloud-control-manager/cloud-driver/drivers/azure/resources/VPCHandler.go index e13ad2e23..666932fe3 100644 --- a/cloud-control-manager/cloud-driver/drivers/azure/resources/VPCHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/azure/resources/VPCHandler.go @@ -38,29 +38,7 @@ func (vpcHandler *AzureVPCHandler) setterVPC(network *armnetwork.VirtualNetwork) vpcInfo.SubnetInfoList = subnetArr if network.Tags != nil { - var tagList []irs.KeyValue - - for key, value := range network.Tags { - var found bool - - for _, subnet := range vpcInfo.SubnetInfoList { - if "subnet-"+subnet.IId.NameId == key { - found = true - break - } - } - - if found { - continue - } - - tagList = append(tagList, irs.KeyValue{ - Key: key, - Value: *value, - }) - } - - vpcInfo.TagList = tagList + vpcInfo.TagList = setTagList(network.Tags) } return vpcInfo } @@ -89,19 +67,6 @@ func (vpcHandler *AzureVPCHandler) CreateVPC(vpcReqInfo irs.VPCReqInfo) (irs.VPC LoggingError(hiscallInfo, createErr) return irs.VPCInfo{}, createErr } - - // Add subnet name and zone to tag list - for _, subnet := range vpcReqInfo.SubnetInfoList { - for _, tag := range vpcReqInfo.TagList { - if "subnet-"+subnet.IId.NameId == tag.Key { - createErr := errors.New(fmt.Sprintf("Failed to Create VPC err = Provided tag key (%s) is not allowed!", tag.Key)) - cblogger.Error(createErr.Error()) - LoggingError(hiscallInfo, createErr) - return irs.VPCInfo{}, createErr - } - } - } - // Create Tag tags := setTags(vpcReqInfo.TagList) @@ -152,28 +117,6 @@ func (vpcHandler *AzureVPCHandler) CreateVPC(vpcReqInfo irs.VPCReqInfo) (irs.VPC cblogger.Error(fmt.Sprintf("failed to get subnet with name %s", subnet.IId.NameId)) continue } - - vpc, err := vpcHandler.getRawVPC(vpcReqInfo.IId) - if err != nil { - cblogger.Error(fmt.Sprintf("failed to get VPC info %s", vpcReqInfo.IId.NameId)) - continue - } - tagKey := "subnet-" + subnet.IId.NameId - vpcReqInfo.TagList = append(vpcReqInfo.TagList, irs.KeyValue{ - Key: tagKey, - Value: subnet.Zone, - }) - vpc.Tags = setTags(vpcReqInfo.TagList) - poller2, err := vpcHandler.Client.BeginCreateOrUpdate(vpcHandler.Ctx, vpcHandler.Region.Region, vpcReqInfo.IId.NameId, *vpc, nil) - if err != nil { - cblogger.Error(fmt.Sprintf("failed to add subnet tag with key %s", tagKey)) - continue - } - _, err = poller2.PollUntilDone(vpcHandler.Ctx, nil) - if err != nil { - cblogger.Error(fmt.Sprintf("failed to get subnet tag with key %s", tagKey)) - continue - } } // 생성된 VNetwork 정보 리턴 @@ -264,7 +207,6 @@ func (vpcHandler *AzureVPCHandler) DeleteVPC(vpcIID irs.IID) (bool, error) { func (vpcHandler *AzureVPCHandler) AddSubnet(vpcIID irs.IID, subnetInfo irs.SubnetInfo) (irs.VPCInfo, error) { // log HisCall hiscallInfo := GetCallLogScheme(vpcHandler.Region, call.VPCSUBNET, subnetInfo.IId.NameId, "AddSubnet()") - start := call.Start() vpc, err := vpcHandler.getRawVPC(vpcIID) if err != nil { @@ -273,47 +215,21 @@ func (vpcHandler *AzureVPCHandler) AddSubnet(vpcIID irs.IID, subnetInfo irs.Subn LoggingError(hiscallInfo, addSubnetErr) return irs.VPCInfo{}, addSubnetErr } - - tagList := setTagList(vpc.Tags) - - // Add subnet name and zone to tag list - tagList = append(tagList, irs.KeyValue{ - Key: "subnet-" + subnetInfo.IId.NameId, - Value: subnetInfo.Zone, - }) - - // Update VPC - vpc.Tags = setTags(tagList) - - poller, err := vpcHandler.Client.BeginCreateOrUpdate(vpcHandler.Ctx, vpcHandler.Region.Region, vpcIID.NameId, *vpc, nil) - if err != nil { - createErr := errors.New(fmt.Sprintf("Failed to AddSubnet err = %s", err.Error())) - cblogger.Error(createErr.Error()) - LoggingError(hiscallInfo, createErr) - return irs.VPCInfo{}, createErr - } - _, err = poller.PollUntilDone(vpcHandler.Ctx, nil) - if err != nil { - createErr := errors.New(fmt.Sprintf("Failed to AddSubnet err = %s", err.Error())) - cblogger.Error(createErr.Error()) - - } - subnetCreateOpts := armnetwork.Subnet{ Name: &subnetInfo.IId.NameId, Properties: &armnetwork.SubnetPropertiesFormat{ AddressPrefix: toStrPtr(subnetInfo.IPv4_CIDR), }, } - - poller2, err := vpcHandler.SubnetClient.BeginCreateOrUpdate(vpcHandler.Ctx, vpcHandler.Region.Region, *vpc.Name, subnetInfo.IId.NameId, subnetCreateOpts, nil) + start := call.Start() + poller, err := vpcHandler.SubnetClient.BeginCreateOrUpdate(vpcHandler.Ctx, vpcHandler.Region.Region, *vpc.Name, subnetInfo.IId.NameId, subnetCreateOpts, nil) if err != nil { addSubnetErr := errors.New(fmt.Sprintf("Failed to AddSubnet err = %s", err.Error())) cblogger.Error(addSubnetErr.Error()) LoggingError(hiscallInfo, addSubnetErr) return irs.VPCInfo{}, addSubnetErr } - _, err = poller2.PollUntilDone(vpcHandler.Ctx, nil) + _, err = poller.PollUntilDone(vpcHandler.Ctx, nil) if err != nil { addSubnetErr := errors.New(fmt.Sprintf("Failed to AddSubnet err = %s", err.Error())) cblogger.Error(addSubnetErr.Error()) @@ -332,44 +248,6 @@ func (vpcHandler *AzureVPCHandler) AddSubnet(vpcIID irs.IID, subnetInfo irs.Subn func (vpcHandler *AzureVPCHandler) RemoveSubnet(vpcIID irs.IID, subnetIID irs.IID) (bool, error) { hiscallInfo := GetCallLogScheme(vpcHandler.Region, call.VPCSUBNET, subnetIID.NameId, "RemoveSubnet()") start := call.Start() - - vpc, err := vpcHandler.getRawVPC(vpcIID) - if err != nil { - delErr := errors.New(fmt.Sprintf("Failed to RemoveSubnet err = %s", err.Error())) - cblogger.Error(delErr.Error()) - LoggingError(hiscallInfo, delErr) - return false, delErr - } - - _, exists := vpc.Tags[subnetIID.NameId] - if exists { - delete(vpc.Tags, "subnet-"+subnetIID.NameId) - - // Update VPC - updateOpts := armnetwork.VirtualNetwork{ - Name: &vpcIID.NameId, - Tags: vpc.Tags, - } - - poller, err := vpcHandler.Client.BeginCreateOrUpdate(vpcHandler.Ctx, vpcHandler.Region.Region, vpcIID.NameId, updateOpts, nil) - if err != nil { - delErr := errors.New(fmt.Sprintf("Failed to RemoveSubnet err = %s", err.Error())) - cblogger.Error(delErr.Error()) - LoggingError(hiscallInfo, delErr) - return false, delErr - } - _, err = poller.PollUntilDone(vpcHandler.Ctx, nil) - if err != nil { - delErr := errors.New(fmt.Sprintf("Failed to RemoveSubnet err = %s", err.Error())) - cblogger.Error(delErr.Error()) - LoggingError(hiscallInfo, delErr) - return false, delErr - } - } else { - delErr := errors.New(fmt.Sprintf("Tag (%s) not found while removing the subnet", subnetIID.NameId)) - cblogger.Warn(delErr.Error()) - } - poller, err := vpcHandler.SubnetClient.BeginDelete(vpcHandler.Ctx, vpcHandler.Region.Region, vpcIID.NameId, subnetIID.NameId, nil) if err != nil { delErr := errors.New(fmt.Sprintf("Failed to RemoveSubnet err = %s", err.Error())) From afff41e825042ce310b507cd75fd504d509fc93d Mon Sep 17 00:00:00 2001 From: ish Date: Mon, 9 Sep 2024 23:35:48 +0900 Subject: [PATCH 3/4] Azure: Fix VM zone control --- .../drivers/azure/resources/VMHandler.go | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/cloud-control-manager/cloud-driver/drivers/azure/resources/VMHandler.go b/cloud-control-manager/cloud-driver/drivers/azure/resources/VMHandler.go index f98c8e0c2..09ed4af81 100644 --- a/cloud-control-manager/cloud-driver/drivers/azure/resources/VMHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/azure/resources/VMHandler.go @@ -229,7 +229,11 @@ func (vmHandler *AzureVMHandler) StartVM(vmReqInfo irs.VMReqInfo) (irs.VMInfo, e } // Setting zone if available - if vmHandler.Region.Zone != "" { + if vmHandler.Region.TargetZone != "" { + vmOpts.Zones = []*string{ + &vmHandler.Region.TargetZone, + } + } else if vmHandler.Region.Zone != "" { vmOpts.Zones = []*string{ &vmHandler.Region.Zone, } @@ -999,7 +1003,6 @@ func (vmHandler *AzureVMHandler) cleanDeleteVm(vmIId irs.IID) error { } func (vmHandler *AzureVMHandler) mappingServerInfo(server armcompute.VirtualMachine) irs.VMInfo { - // Get Default VM Info vmInfo := irs.VMInfo{ IId: irs.IID{ @@ -1164,7 +1167,6 @@ func (vmHandler *AzureVMHandler) mappingServerInfo(server armcompute.VirtualMach // VM 생성 시 Public IP 자동 생성 (nested flow 적용) func CreatePublicIP(vmHandler *AzureVMHandler, vmReqInfo irs.VMReqInfo) (irs.IID, error) { - // PublicIP 이름 생성 publicIPName := generatePublicIPName(vmReqInfo.IId.NameId) @@ -1189,13 +1191,19 @@ func CreatePublicIP(vmHandler *AzureVMHandler, vmReqInfo irs.VMReqInfo) (irs.IID publicIPAddressSKUNameStandard := armnetwork.PublicIPAddressSKUNameStandard // Setting zone if available - if vmHandler.Region.Zone != "" { + if vmHandler.Region.TargetZone != "" || vmHandler.Region.Zone != "" { createOpts.SKU = &armnetwork.PublicIPAddressSKU{ Name: &publicIPAddressSKUNameStandard, } createOpts.Properties.PublicIPAllocationMethod = &publicIPAllocationMethod - createOpts.Zones = []*string{ - toStrPtr(vmHandler.Region.Zone), + if vmHandler.Region.TargetZone != "" { + createOpts.Zones = []*string{ + toStrPtr(vmHandler.Region.TargetZone), + } + } else { + createOpts.Zones = []*string{ + toStrPtr(vmHandler.Region.Zone), + } } } From aadb3cc2f9c777c952b924c908a83a63ddd20084 Mon Sep 17 00:00:00 2001 From: ish Date: Mon, 9 Sep 2024 23:36:04 +0900 Subject: [PATCH 4/4] Azure: Fix disk zone control --- .../drivers/azure/resources/DiskHandler.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cloud-control-manager/cloud-driver/drivers/azure/resources/DiskHandler.go b/cloud-control-manager/cloud-driver/drivers/azure/resources/DiskHandler.go index 5a86ed566..b1158b4eb 100644 --- a/cloud-control-manager/cloud-driver/drivers/azure/resources/DiskHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/azure/resources/DiskHandler.go @@ -69,12 +69,22 @@ func (diskHandler *AzureDiskHandler) CreateDisk(DiskReqInfo irs.DiskInfo) (diskI Location: &diskHandler.Region.Region, Tags: tags, } + // Setting zone if available - if diskHandler.Region.Zone != "" { + if DiskReqInfo.Zone != "" { diskCreateOpt.Zones = []*string{ &DiskReqInfo.Zone, } + } else if diskHandler.Region.TargetZone != "" { + diskCreateOpt.Zones = []*string{ + &diskHandler.Region.TargetZone, + } + } else if diskHandler.Region.Zone != "" { + diskCreateOpt.Zones = []*string{ + &diskHandler.Region.Zone, + } } + poller, err := diskHandler.DiskClient.BeginCreateOrUpdate(diskHandler.Ctx, diskHandler.Region.Region, DiskReqInfo.IId.NameId, diskCreateOpt, nil) if err != nil { createErr = errors.New(fmt.Sprintf("Failed to Create Disk. err = %s", err.Error()))