fix(region): support set network tags (#19439)

This commit is contained in:
屈轩
2024-02-04 18:05:15 +08:00
committed by GitHub
parent c5dcc6fa1d
commit bf320a5b32
17 changed files with 361 additions and 76 deletions
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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=
+48 -5
View File
@@ -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)
}
+1
View File
@@ -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)
}
+4
View File
@@ -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")
}
+37 -1
View File
@@ -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
}
@@ -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)
}
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+4
View File
@@ -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)
+4
View File
@@ -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
}
+80
View File
@@ -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)
+8 -4
View File
@@ -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
}
+44 -12
View File
@@ -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
+45
View File
@@ -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)
+3 -45
View File
@@ -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
}
+5 -4
View File
@@ -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)
}