diff --git a/go.mod b/go.mod index 0b4a83aa86..68103ff2b0 100644 --- a/go.mod +++ b/go.mod @@ -88,7 +88,7 @@ require ( k8s.io/client-go v0.19.3 k8s.io/cluster-bootstrap v0.19.3 moul.io/http2curl/v2 v2.3.0 - yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240202081639-6a67ceb49f35 + yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240204082701-44d14a9946c9 yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32 yunion.io/x/jsonutils v1.0.1-0.20240203102553-4096f103b401 yunion.io/x/log v1.0.1-0.20230411060016-feb3f46ab361 diff --git a/go.sum b/go.sum index 10c90ae23e..7a4b5a6c46 100644 --- a/go.sum +++ b/go.sum @@ -1201,8 +1201,8 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240202081639-6a67ceb49f35 h1:pgyOGaIkGBhgBNMNAhRFHFn9oDS2iq4vBUJAelQfBiQ= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240202081639-6a67ceb49f35/go.mod h1:dsUESXIbXJ+/ywbNClhldOrbPOiBi2udrgOnB/ffoWk= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240204082701-44d14a9946c9 h1:5lPNvTBC+6aTacr6JmG8y3ulx2aZOIDRyhAkAkKphy8= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240204082701-44d14a9946c9/go.mod h1:dsUESXIbXJ+/ywbNClhldOrbPOiBi2udrgOnB/ffoWk= yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32 h1:v7POYkQwo1XzOxBoIoRVr/k0V9Y5JyjpshlIFa9raug= yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws= yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634= diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index 6c80a1a98c..1a734fdc41 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -675,7 +675,7 @@ func (manager *SNetworkManager) SyncNetworks( } if !xor { for i := 0; i < len(commondb); i += 1 { - err = commondb[i].SyncWithCloudNetwork(ctx, userCred, commonext[i], syncOwnerId, provider) + err = commondb[i].SyncWithCloudNetwork(ctx, userCred, commonext[i]) if err != nil { syncResult.UpdateError(err) continue @@ -722,7 +722,7 @@ func (snet *SNetwork) syncRemoveCloudNetwork(ctx context.Context, userCred mccli return err } -func (snet *SNetwork) SyncWithCloudNetwork(ctx context.Context, userCred mcclient.TokenCredential, extNet cloudprovider.ICloudNetwork, syncOwnerId mcclient.IIdentityProvider, provider *SCloudprovider) error { +func (snet *SNetwork) SyncWithCloudNetwork(ctx context.Context, userCred mcclient.TokenCredential, extNet cloudprovider.ICloudNetwork) error { diff, err := db.UpdateWithLock(ctx, snet, func() error { if options.Options.EnableSyncName { newName, _ := db.GenerateAlterName(snet, extNet.GetName()) @@ -763,10 +763,19 @@ func (snet *SNetwork) SyncWithCloudNetwork(ctx context.Context, userCred mcclien }) } - //syncVirtualResourceMetadata(ctx, userCred, snet, extNet) + vpc, err := snet.GetVpc() + if err != nil { + return errors.Wrapf(err, "GetVpc") + } + + provider := vpc.GetCloudprovider() if provider != nil { - SyncCloudProject(ctx, userCred, snet, syncOwnerId, extNet, provider) + if account, _ := provider.GetCloudaccount(); account != nil { + syncVirtualResourceMetadata(ctx, userCred, snet, extNet, account.ReadOnly) + } + + SyncCloudProject(ctx, userCred, snet, provider.GetOwnerId(), extNet, provider) shareInfo := provider.getAccountShareInfo() if utils.IsInStringArray(provider.Provider, api.PRIVATE_CLOUD_PROVIDERS) && extNet.GetPublicScope() == rbacscope.ScopeNone { @@ -3498,11 +3507,15 @@ func (net *SNetwork) PerformSyncstatus(ctx context.Context, userCred mcclient.To func (net *SNetwork) PerformSync(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input *api.NetworkSyncInput) (jsonutils.JSONObject, error) { vpc, _ := net.GetVpc() if vpc != nil && vpc.IsManaged() { - return nil, StartResourceSyncStatusTask(ctx, userCred, net, "NetworkSyncstatusTask", "") + return nil, net.StartSyncstatusTask(ctx, userCred, "") } return nil, httperrors.NewUnsupportOperationError("on-premise network cannot sync status") } +func (net *SNetwork) StartSyncstatusTask(ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string) error { + return StartResourceSyncStatusTask(ctx, userCred, net, "NetworkSyncstatusTask", parentTaskId) +} + // 更改IP子网状态 func (net *SNetwork) PerformStatus(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input apis.PerformStatusInput) (jsonutils.JSONObject, error) { if len(input.Status) == 0 { @@ -3763,3 +3776,33 @@ func (net *SNetwork) PerformSyncAdditionalWires( func (net *SNetwork) IsSupportIPv6() bool { return len(net.GuestIp6Start) > 0 && len(net.GuestIp6End) > 0 } + +func (net *SNetwork) OnMetadataUpdated(ctx context.Context, userCred mcclient.TokenCredential) { + if len(net.ExternalId) == 0 || options.Options.KeepTagLocalization { + return + } + vpc, err := net.GetVpc() + if err != nil { + return + } + if account := vpc.GetCloudaccount(); account != nil && account.ReadOnly { + return + } + err = net.StartRemoteUpdateTask(ctx, userCred, true, "") + if err != nil { + log.Errorf("StartRemoteUpdateTask fail: %s", err) + } +} + +func (net *SNetwork) StartRemoteUpdateTask(ctx context.Context, userCred mcclient.TokenCredential, replaceTags bool, parentTaskId string) error { + data := jsonutils.NewDict() + if replaceTags { + data.Add(jsonutils.JSONTrue, "replace_tags") + } + task, err := taskman.TaskManager.NewTask(ctx, "NetworkRemoteUpdateTask", net, userCred, data, parentTaskId, "", nil) + if err != nil { + return errors.Wrap(err, "Start NetworkRemoteUpdateTask") + } + net.SetStatus(ctx, userCred, apis.STATUS_UPDATE_TAGS, "StartRemoteUpdateTask") + return task.ScheduleRun(nil) +} diff --git a/pkg/compute/models/regiondrivers.go b/pkg/compute/models/regiondrivers.go index cb09c3fdb7..b244d00ec4 100644 --- a/pkg/compute/models/regiondrivers.go +++ b/pkg/compute/models/regiondrivers.go @@ -76,6 +76,7 @@ type IRegionDriver interface { RequestSyncDBInstanceBackupStatus(ctx context.Context, userCred mcclient.TokenCredential, backup *SDBInstanceBackup, task taskman.ITask) error RequestCreateNetwork(ctx context.Context, userCred mcclient.TokenCredential, network *SNetwork, task taskman.ITask) error + RequestRemoteUpdateNetwork(ctx context.Context, userCred mcclient.TokenCredential, network *SNetwork, replaceTags bool, task taskman.ITask) error ValidateCreateCdnData(ctx context.Context, userCred mcclient.TokenCredential, input api.CDNDomainCreateInput) (api.CDNDomainCreateInput, error) } diff --git a/pkg/compute/regiondrivers/base.go b/pkg/compute/regiondrivers/base.go index d82fbd293f..e174c17c8d 100644 --- a/pkg/compute/regiondrivers/base.go +++ b/pkg/compute/regiondrivers/base.go @@ -501,3 +501,7 @@ func (self *SBaseRegionDriver) RequestSnapshotPolicyBindDisks(ctx context.Contex func (self *SBaseRegionDriver) RequestSnapshotPolicyUnbindDisks(ctx context.Context, userCred mcclient.TokenCredential, sp *models.SSnapshotPolicy, diskIds []string, task taskman.ITask) error { return errors.Wrapf(cloudprovider.ErrNotImplemented, "RequestSnapshotPolicyUnbindDisks") } + +func (self *SBaseRegionDriver) RequestRemoteUpdateNetwork(ctx context.Context, userCred mcclient.TokenCredential, network *models.SNetwork, replaceTags bool, task taskman.ITask) error { + return errors.Wrapf(cloudprovider.ErrNotImplemented, "RequestRemoteUpdateNetwork") +} diff --git a/pkg/compute/regiondrivers/managedvirtual.go b/pkg/compute/regiondrivers/managedvirtual.go index 176df0a222..ae9c085c4a 100644 --- a/pkg/compute/regiondrivers/managedvirtual.go +++ b/pkg/compute/regiondrivers/managedvirtual.go @@ -3007,7 +3007,7 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateNetwork(ctx context return errors.Wrapf(err, "wait network available after 5 minutes, current status: %s", inet.GetStatus()) } - return net.SyncWithCloudNetwork(ctx, userCred, inet, nil, nil) + return net.SyncWithCloudNetwork(ctx, userCred, inet) } func (self *SManagedVirtualizationRegionDriver) RequestRemoteUpdateElasticSearch(ctx context.Context, userCred mcclient.TokenCredential, instance *models.SElasticSearch, replaceTags bool, task taskman.ITask) error { @@ -3551,3 +3551,39 @@ func (self *SManagedVirtualizationRegionDriver) RequestSnapshotPolicyUnbindDisks }) return nil } + +func (self *SManagedVirtualizationRegionDriver) RequestRemoteUpdateNetwork(ctx context.Context, userCred mcclient.TokenCredential, net *models.SNetwork, replaceTags bool, task taskman.ITask) error { + taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) { + iNet, err := net.GetINetwork(ctx) + if err != nil { + return nil, errors.Wrap(err, "GetINetwork") + } + vpc, err := net.GetVpc() + if err != nil { + return nil, errors.Wrapf(err, "GetVpc") + } + oldTags, err := iNet.GetTags() + if err != nil { + if errors.Cause(err) == cloudprovider.ErrNotSupported || errors.Cause(err) == cloudprovider.ErrNotImplemented { + return nil, nil + } + return nil, errors.Wrap(err, "GetTags()") + } + tags, err := net.GetAllUserMetadata() + if err != nil { + return nil, errors.Wrapf(err, "GetAllUserMetadata") + } + tagsUpdateInfo := cloudprovider.TagsUpdateInfo{OldTags: oldTags, NewTags: tags} + err = cloudprovider.SetTags(ctx, iNet, vpc.ManagerId, tags, replaceTags) + if err != nil { + if errors.Cause(err) == cloudprovider.ErrNotSupported || errors.Cause(err) == cloudprovider.ErrNotImplemented { + return nil, nil + } + logclient.AddActionLogWithStartable(task, net, logclient.ACT_UPDATE_TAGS, err, userCred, false) + return nil, errors.Wrap(err, "SetTags") + } + logclient.AddActionLogWithStartable(task, net, logclient.ACT_UPDATE_TAGS, tagsUpdateInfo, userCred, true) + return nil, nil + }) + return nil +} diff --git a/pkg/compute/tasks/network_remote_update_tags_task.go b/pkg/compute/tasks/network_remote_update_tags_task.go new file mode 100644 index 0000000000..0f469e36c3 --- /dev/null +++ b/pkg/compute/tasks/network_remote_update_tags_task.go @@ -0,0 +1,73 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tasks + +import ( + "context" + + "yunion.io/x/jsonutils" + "yunion.io/x/pkg/errors" + + "yunion.io/x/onecloud/pkg/apis" + "yunion.io/x/onecloud/pkg/cloudcommon/db" + "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" + "yunion.io/x/onecloud/pkg/compute/models" +) + +type NetworkRemoteUpdateTask struct { + taskman.STask +} + +func init() { + taskman.RegisterTask(NetworkRemoteUpdateTask{}) +} + +func (self *NetworkRemoteUpdateTask) taskFail(ctx context.Context, net *models.SNetwork, err error) { + net.SetStatus(ctx, self.UserCred, apis.STATUS_UPDATE_TAGS_FAILED, err.Error()) + self.SetStageFailed(ctx, jsonutils.NewString(err.Error())) +} + +func (self *NetworkRemoteUpdateTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { + net := obj.(*models.SNetwork) + region, err := net.GetRegion() + if err != nil { + self.taskFail(ctx, net, errors.Wrapf(err, "GetRegion")) + return + } + self.SetStage("OnRemoteUpdateComplete", nil) + replaceTags := jsonutils.QueryBoolean(self.Params, "replace_tags", false) + + err = region.GetDriver().RequestRemoteUpdateNetwork(ctx, self.GetUserCred(), net, replaceTags, self) + if err != nil { + self.taskFail(ctx, net, errors.Wrapf(err, "RequestRemoteUpdateNetwork")) + } +} + +func (self *NetworkRemoteUpdateTask) OnRemoteUpdateComplete(ctx context.Context, net *models.SNetwork, data jsonutils.JSONObject) { + self.SetStage("OnSyncStatusComplete", nil) + net.StartSyncstatusTask(ctx, self.UserCred, self.GetTaskId()) +} + +func (self *NetworkRemoteUpdateTask) OnRemoteUpdateCompleteFailed(ctx context.Context, net *models.SNetwork, data jsonutils.JSONObject) { + self.taskFail(ctx, net, errors.Errorf(data.String())) +} + +func (self *NetworkRemoteUpdateTask) OnSyncStatusComplete(ctx context.Context, net *models.SNetwork, data jsonutils.JSONObject) { + self.SetStageComplete(ctx, nil) +} + +func (self *NetworkRemoteUpdateTask) OnSyncStatusCompleteFailed(ctx context.Context, net *models.SNetwork, data jsonutils.JSONObject) { + self.SetStageFailed(ctx, data) +} diff --git a/pkg/compute/tasks/network_syncstatus_task.go b/pkg/compute/tasks/network_syncstatus_task.go index e673bc74bf..7de1cb061a 100644 --- a/pkg/compute/tasks/network_syncstatus_task.go +++ b/pkg/compute/tasks/network_syncstatus_task.go @@ -57,7 +57,7 @@ func (self *NetworkSyncstatusTask) OnInit(ctx context.Context, obj db.IStandalon return } - err = net.SyncWithCloudNetwork(ctx, self.UserCred, extNet, nil, nil) + err = net.SyncWithCloudNetwork(ctx, self.UserCred, extNet) if err != nil { self.taskFail(ctx, net, errors.Wrapf(err, "SyncWithCloudNetwork")) return diff --git a/vendor/modules.txt b/vendor/modules.txt index 71cd0ed49c..6ab2ffd442 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1465,7 +1465,7 @@ sigs.k8s.io/structured-merge-diff/v4/value # sigs.k8s.io/yaml v1.2.0 ## explicit; go 1.12 sigs.k8s.io/yaml -# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240202081639-6a67ceb49f35 +# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240204082701-44d14a9946c9 ## explicit; go 1.18 yunion.io/x/cloudmux/pkg/apis yunion.io/x/cloudmux/pkg/apis/billing diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/vswitch.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/vswitch.go index de0a248196..beef50e02f 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/vswitch.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/vswitch.go @@ -96,6 +96,10 @@ func (self *SVSwitch) GetIWire() cloudprovider.ICloudWire { return self.wire } +func (self *SVSwitch) SetTags(tags map[string]string, replace bool) error { + return self.wire.zone.region.SetResourceTags(ALIYUN_SERVICE_VPC, "VSWITCH", self.VSwitchId, tags, replace) +} + func (net *SVSwitch) GetIp6Start() string { if len(net.Ipv6CidrBlock) > 0 { prefix, err := netutils.NewIPV6Prefix(net.Ipv6CidrBlock) diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/network.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/network.go index 45a4508e64..b988846e78 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/network.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/network.go @@ -97,6 +97,10 @@ func (self *SNetwork) GetSysTags() map[string]string { return data } +func (self *SNetwork) SetTags(tags map[string]string, replace bool) error { + return self.wire.zone.region.setTags("subnet", self.SubnetId, tags, replace) +} + func (self *SNetwork) GetIWire() cloudprovider.ICloudWire { return self.wire } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/network.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/network.go index 42ac297ad1..82e886ec6c 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/network.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/network.go @@ -96,6 +96,86 @@ func (self *SNetwork) GetIWire() cloudprovider.ICloudWire { return self.wire } +func (self *SNetwork) GetTags() (map[string]string, error) { + res := fmt.Sprintf("subnets/%s/tags", self.ID) + resp, err := self.wire.vpc.region.list(SERVICE_VPC_V2_0, res, nil) + if err != nil { + return nil, errors.Wrapf(err, "list tags") + } + ret := []struct { + Key string + Value string + }{} + err = resp.Unmarshal(&ret, "tags") + if err != nil { + return nil, errors.Wrapf(err, "Unmarshal") + } + result := map[string]string{} + for _, tag := range ret { + result[tag.Key] = tag.Value + } + return result, nil + +} + +func (self *SNetwork) SetTags(tags map[string]string, replace bool) error { + existedTags, err := self.GetTags() + if err != nil { + return errors.Wrapf(err, "GetTags") + } + return self.wire.vpc.region.SetNetworkTags(self.ID, existedTags, tags, replace) +} + +// https://console.huaweicloud.com/apiexplorer/#/openapi/VPC/doc?version=v2&api=DeleteSubnetTag +func (self *SRegion) DeleteNetworkTag(subnetId string, key string) error { + res := fmt.Sprintf("subnets/%s/tags/%s", subnetId, key) + _, err := self.delete(SERVICE_VPC_V2_0, res) + return err +} + +// https://console.huaweicloud.com/apiexplorer/#/openapi/VPC/doc?version=v2&api=CreateSubnetTag +func (self *SRegion) CreateNetworkTag(subnetId string, tags map[string]string) error { + params := map[string]interface{}{ + "action": "create", + } + add := []map[string]string{} + for k, v := range tags { + add = append(add, map[string]string{"key": k, "value": v}) + } + params["tags"] = add + res := fmt.Sprintf("subnets/%s/tags/action", subnetId) + _, err := self.post(SERVICE_VPC_V2_0, res, params) + return err +} + +func (self *SRegion) SetNetworkTags(netId string, existedTags map[string]string, tags map[string]string, replace bool) error { + deleteTagsKey := []string{} + for k := range existedTags { + if replace { + deleteTagsKey = append(deleteTagsKey, k) + } else { + if _, ok := tags[k]; ok { + deleteTagsKey = append(deleteTagsKey, k) + } + } + } + if len(deleteTagsKey) > 0 { + for _, k := range deleteTagsKey { + err := self.DeleteNetworkTag(netId, k) + if err != nil { + return errors.Wrapf(err, "remove tags") + } + } + } + if len(tags) > 0 { + err := self.CreateNetworkTag(netId, tags) + if err != nil { + return errors.Wrapf(err, "add tags") + } + } + return nil +} + func (net *SNetwork) GetIp6Start() string { if len(net.CIDRV6) > 0 { prefix, err := netutils.NewIPV6Prefix(net.CIDRV6) diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/instance.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/instance.go index 40057bea2e..6436b54adf 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/instance.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/instance.go @@ -215,9 +215,13 @@ func (instance *SInstance) GetIEIP() (cloudprovider.ICloudEIP, error) { func (instance *SInstance) GetINics() ([]cloudprovider.ICloudNic, error) { ret := []cloudprovider.ICloudNic{} - for i := range instance.NetworkInterfaces { - instance.NetworkInterfaces[i].region = instance.host.zone.region - ret = append(ret, &instance.NetworkInterfaces[i]) + nics, err := instance.host.zone.region.GetNetworkInterfaces("", instance.InstanceId) + if err != nil { + return nil, err + } + for i := range nics { + nics[i].region = instance.host.zone.region + ret = append(ret, &nics[i]) } return ret, nil } @@ -246,7 +250,7 @@ func (instance *SInstance) GetInstanceType() string { } func (instance *SInstance) GetSecurityGroupIds() ([]string, error) { - nics, _, err := instance.host.zone.region.GetNetworkInterfaces(instance.InstanceId, 1, 10) + nics, err := instance.host.zone.region.GetNetworkInterfaces("", instance.InstanceId) if err != nil { return nil, err } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/instancenic.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/instancenic.go index c744a1f46f..795bfa6e8f 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/instancenic.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/instancenic.go @@ -53,12 +53,20 @@ type SNetworkInterface struct { ZoneId string PrivateIpAddresses []string AssociatedElasticIp SAssociatedElasticIp + IPv6Sets []string } func (nic *SNetworkInterface) GetIP() string { return nic.PrimaryIpAddress } +func (nic *SNetworkInterface) GetIP6() string { + for _, ip := range nic.IPv6Sets { + return ip + } + return "" +} + func (nic *SNetworkInterface) GetMAC() string { return nic.MacAddress } @@ -88,21 +96,12 @@ func (nic *SNetworkInterface) UnassignAddress(ipAddrs []string) error { } func (region *SRegion) GetSubAddress(nicId string) ([]string, error) { - params := map[string]string{ - "NetworkInterfaceId.1": nicId, - } - body, err := region.vpcRequest("DescribeNetworkInterfaces", params) + nics, err := region.GetNetworkInterfaces(nicId, "") if err != nil { - return nil, errors.Wrapf(err, "DescribeNetworkInterfaces") - } - - interfaces := []SNetworkInterface{} - err = body.Unmarshal(&interfaces, "NetworkInterfaceSets") - if err != nil { - return nil, errors.Wrapf(err, "Unmarshal") + return nil, errors.Wrapf(err, "GetNetworkInterfaces") } ipAddrs := []string{} - for _, net := range interfaces { + for _, net := range nics { if net.NetworkInterfaceId != nicId { continue } @@ -115,6 +114,39 @@ func (region *SRegion) GetSubAddress(nicId string) ([]string, error) { return ipAddrs, nil } +func (region *SRegion) GetNetworkInterfaces(nicId, instanceId string) ([]SNetworkInterface, error) { + params := map[string]string{ + "PageSize": "100", + } + if len(nicId) > 0 { + params["NetworkInterfaceId.1"] = nicId + } + if len(instanceId) > 0 { + params["InstanceId"] = instanceId + } + ret := []SNetworkInterface{} + for { + resp, err := region.vpcRequest("DescribeNetworkInterfaces", params) + if err != nil { + return nil, errors.Wrapf(err, "DescribeNetworkInterfaces") + } + part := struct { + NetworkInterfaceSets []SNetworkInterface + NextToken string + }{} + err = resp.Unmarshal(&part) + if err != nil { + return nil, err + } + ret = append(ret, part.NetworkInterfaceSets...) + if len(part.NextToken) == 0 { + break + } + params["NextToken"] = part.NextToken + } + return ret, nil +} + func (region *SRegion) AssignAddres(nicId string, ipAddrs []string) error { params := make(map[string]string) params["NetworkInterfaceId"] = nicId diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/network.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/network.go index 0b217f7bba..0f7a17e1ea 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/network.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/network.go @@ -88,6 +88,51 @@ func (subnet *SNetwork) GetProjectId() string { return subnet.ProjectName } +func (net *SNetwork) GetIp6Start() string { + if len(net.Ipv6CidrBlock) > 0 { + prefix, err := netutils.NewIPV6Prefix(net.Ipv6CidrBlock) + if err != nil { + return "" + } + return prefix.Address.NetAddr(prefix.MaskLen).StepUp().StepUp().String() + } + return "" +} + +func (net *SNetwork) GetIp6End() string { + if len(net.Ipv6CidrBlock) > 0 { + prefix, err := netutils.NewIPV6Prefix(net.Ipv6CidrBlock) + if err != nil { + return "" + } + end := prefix.Address.NetAddr(prefix.MaskLen).BroadcastAddr(prefix.MaskLen) + return end.StepDown().String() + } + return "" +} + +func (net *SNetwork) GetIp6Mask() uint8 { + if len(net.Ipv6CidrBlock) > 0 { + prefix, err := netutils.NewIPV6Prefix(net.Ipv6CidrBlock) + if err != nil { + return 0 + } + return prefix.MaskLen + } + return 0 +} + +func (net *SNetwork) GetGateway6() string { + if len(net.Ipv6CidrBlock) > 0 { + prefix, err := netutils.NewIPV6Prefix(net.Ipv6CidrBlock) + if err != nil { + return "" + } + return prefix.Address.NetAddr(prefix.MaskLen).StepUp().String() + } + return "" +} + func (subnet *SNetwork) GetIpStart() string { pref, _ := netutils.NewIPV4Prefix(subnet.CidrBlock) startIp := pref.Address.NetAddr(pref.MaskLen) diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/networkinterfaces.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/networkinterfaces.go index 8ac3c8388f..a76782c20a 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/networkinterfaces.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/networkinterfaces.go @@ -15,10 +15,6 @@ package volcengine import ( - "fmt" - - "yunion.io/x/pkg/errors" - api "yunion.io/x/cloudmux/pkg/apis/compute" "yunion.io/x/cloudmux/pkg/cloudprovider" ) @@ -87,18 +83,9 @@ func (nic *SNetworkInterface) GetStatus() string { } func (region *SRegion) GetINetworkInterfaces() ([]cloudprovider.ICloudNetworkInterface, error) { - interfaces := []SNetworkInterface{} - pageNumber := 1 - for { - parts, total, err := region.GetNetworkInterfaces("", pageNumber, 50) - if err != nil { - return nil, err - } - interfaces = append(interfaces, parts...) - if len(interfaces) >= total { - break - } - pageNumber += 1 + interfaces, err := region.GetNetworkInterfaces("", "") + if err != nil { + return nil, err } ret := []cloudprovider.ICloudNetworkInterface{} for i := 0; i < len(interfaces); i++ { @@ -118,32 +105,3 @@ func (nic *SNetworkInterface) GetICloudInterfaceAddresses() ([]cloudprovider.ICl } return address, nil } - -func (region *SRegion) GetNetworkInterfaces(instanceId string, pageNumber int, pageSize int) ([]SNetworkInterface, int, error) { - if pageSize > 100 || pageSize <= 0 { - pageSize = 100 - } - - params := map[string]string{ - "RegionId": region.RegionId, - "PageSize": fmt.Sprintf("%d", pageSize), - "PageNumber": fmt.Sprintf("%d", pageNumber), - } - - if len(instanceId) > 0 { - params["InstanceId"] = instanceId - } - - body, err := region.vpcRequest("DescribeNetworkInterfaces", params) - if err != nil { - return nil, 0, errors.Wrapf(err, "DescribeNetworkInterfaces") - } - - interfaces := []SNetworkInterface{} - err = body.Unmarshal(&interfaces, "NetworkInterfaceSets") - if err != nil { - return nil, 0, errors.Wrapf(err, "Unmarshal") - } - total, _ := body.Int("TotalCount") - return interfaces, int(total), nil -} diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/vpc.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/vpc.go index c2fa1e83b3..24049b893a 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/vpc.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/vpc.go @@ -37,6 +37,7 @@ type SVpc struct { VpcId string VpcName string CidrBlock string + Ipv6CidrBlock string CidrBlockAssociationSet []string IsDefault bool Status string @@ -58,10 +59,6 @@ func (vpc *SVpc) GetGlobalId() string { return vpc.VpcId } -func (vpc *SVpc) IsEmulated() bool { - return false -} - func (vpc *SVpc) GetIsDefault() bool { return vpc.IsDefault } @@ -70,6 +67,10 @@ func (vpc *SVpc) GetCidrBlock() string { return vpc.CidrBlock } +func (vpc *SVpc) GetCidrBlock6() string { + return vpc.Ipv6CidrBlock +} + func (vpc *SVpc) GetStatus() string { return strings.ToLower(vpc.Status) }