mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-01 15:07:17 +08:00
fix(region): support set network tags (#19439)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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=
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Vendored
+1
-1
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user