mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-21 14:19:49 +08:00
Merge pull request #4063 from ioito/hotfix/qx-globalvpc-fix
fix: globalnetwork -> globalvpc
This commit is contained in:
@@ -21,27 +21,27 @@ import (
|
||||
)
|
||||
|
||||
func init() {
|
||||
type GlobalNetworkListOptions struct {
|
||||
type GlobalVpcListOptions struct {
|
||||
options.BaseListOptions
|
||||
}
|
||||
R(&GlobalNetworkListOptions{}, "global-network-list", "List global networks", func(s *mcclient.ClientSession, args *GlobalNetworkListOptions) error {
|
||||
R(&GlobalVpcListOptions{}, "global-vpc-list", "List global vpcs", func(s *mcclient.ClientSession, args *GlobalVpcListOptions) error {
|
||||
params, err := options.ListStructToParams(args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
result, err := modules.GlobalNetworks.List(s, params)
|
||||
result, err := modules.GlobalVpcs.List(s, params)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
printList(result, modules.GlobalNetworks.GetColumns(s))
|
||||
printList(result, modules.GlobalVpcs.GetColumns(s))
|
||||
return nil
|
||||
})
|
||||
|
||||
type GlobalNetworkShowOptions struct {
|
||||
ID string `help:"ID or Name of globalnetwork"`
|
||||
type GlobalVpcShowOptions struct {
|
||||
ID string `help:"ID or Name of globalvpc"`
|
||||
}
|
||||
R(&GlobalNetworkShowOptions{}, "global-network-show", "Show details of a global network", func(s *mcclient.ClientSession, args *GlobalNetworkShowOptions) error {
|
||||
result, err := modules.GlobalNetworks.GetById(s, args.ID, nil)
|
||||
R(&GlobalVpcShowOptions{}, "global-vpc-show", "Show details of a global vpc", func(s *mcclient.ClientSession, args *GlobalVpcShowOptions) error {
|
||||
result, err := modules.GlobalVpcs.GetById(s, args.ID, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -27,8 +27,9 @@ func init() {
|
||||
type VpcListOptions struct {
|
||||
options.BaseListOptions
|
||||
|
||||
Usable *bool `help:"Filter usable vpcs"`
|
||||
Region string `help:"ID or Name of region" json:"-"`
|
||||
Usable *bool `help:"Filter usable vpcs"`
|
||||
Region string `help:"ID or Name of region" json:"-"`
|
||||
Globalvpc string `help:"Filter by globalvpc"`
|
||||
}
|
||||
R(&VpcListOptions{}, "vpc-list", "List VPCs", func(s *mcclient.ClientSession, opts *VpcListOptions) error {
|
||||
params, err := options.ListStructToParams(opts)
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
// 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 compute
|
||||
|
||||
import (
|
||||
"yunion.io/x/onecloud/pkg/apis"
|
||||
)
|
||||
|
||||
type GlobalVpcCreateInput struct {
|
||||
apis.Meta
|
||||
|
||||
// description: global vpc name
|
||||
// unique: true
|
||||
// required: true
|
||||
// example: test-globalvpc
|
||||
Name string `json:"name"`
|
||||
|
||||
// description: global vpc description
|
||||
// required: false
|
||||
// example: test create globalvpc
|
||||
Description string `json:"description"`
|
||||
|
||||
// description: enable or disable global vpc
|
||||
// required: false
|
||||
// default: false
|
||||
Enabled *bool `json:"enabled"`
|
||||
|
||||
// description: global vpc status
|
||||
// required: false
|
||||
// default: available
|
||||
Status string `json:"status"`
|
||||
}
|
||||
@@ -15,6 +15,6 @@
|
||||
package compute
|
||||
|
||||
const (
|
||||
GLOBAL_NETWORK_STATUS_AVAILABLE = "available"
|
||||
GLOBAL_NETWORK_STATUS_UNKNOWN = "unknown"
|
||||
GLOBAL_VPC_STATUS_AVAILABLE = "available"
|
||||
GLOBAL_VPC_STATUS_UNKNOWN = "unknown"
|
||||
)
|
||||
@@ -469,19 +469,9 @@ type SExternalProject struct {
|
||||
apis.SExternalizedResourceBase
|
||||
}
|
||||
|
||||
// SGlobalNetwork is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SGlobalNetwork.
|
||||
type SGlobalNetwork struct {
|
||||
// SGlobalVpc is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SGlobalVpc.
|
||||
type SGlobalVpc struct {
|
||||
apis.SEnabledStatusStandaloneResourceBase
|
||||
apis.SExternalizedResourceBase
|
||||
SManagedResourceBase
|
||||
Provider string `json:"provider"`
|
||||
}
|
||||
|
||||
// SGlobalnetworkVpc is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SGlobalnetworkVpc.
|
||||
type SGlobalnetworkVpc struct {
|
||||
apis.SJointResourceBase
|
||||
GlobalnetworkId string `json:"globalnetwork_id"`
|
||||
VpcId string `json:"vpc_id"`
|
||||
}
|
||||
|
||||
// SGroup is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SGroup.
|
||||
@@ -1327,6 +1317,7 @@ type SVpc struct {
|
||||
IsDefault bool `json:"is_default"`
|
||||
CidrBlock string `json:"cidr_block"`
|
||||
CloudregionId string `json:"cloudregion_id"`
|
||||
GlobalvpcId string `json:"globalvpc_id"`
|
||||
}
|
||||
|
||||
// SWire is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SWire.
|
||||
|
||||
@@ -73,9 +73,6 @@ type ICloudProvider interface {
|
||||
GetIProjects() ([]ICloudProject, error)
|
||||
GetIRegionById(id string) (ICloudRegion, error)
|
||||
|
||||
GetIGlobalnetworks() ([]ICloudGlobalnetwork, error)
|
||||
GetIGlobalnetworkById(id string) (ICloudGlobalnetwork, error)
|
||||
|
||||
GetOnPremiseIRegion() (ICloudRegion, error)
|
||||
|
||||
GetBalance() (float64, string, error)
|
||||
|
||||
@@ -413,6 +413,7 @@ type ICloudSnapshotPolicy interface {
|
||||
}
|
||||
|
||||
type ICloudVpc interface {
|
||||
// GetGlobalId() // 若vpc属于globalvpc,此函数返回格式必须是 'region.GetGlobalId()/vpc.GetGlobalId()'
|
||||
ICloudResource
|
||||
|
||||
GetRegion() ICloudRegion
|
||||
@@ -427,7 +428,6 @@ type ICloudVpc interface {
|
||||
|
||||
GetIWireById(wireId string) (ICloudWire, error)
|
||||
GetINatGateways() ([]ICloudNatGateway, error)
|
||||
GetIGlobalNetworkId() string
|
||||
}
|
||||
|
||||
type ICloudWire interface {
|
||||
@@ -931,7 +931,3 @@ type ICloudEvent interface {
|
||||
|
||||
GetCreatedAt() time.Time
|
||||
}
|
||||
|
||||
type ICloudGlobalnetwork interface {
|
||||
ICloudResource
|
||||
}
|
||||
|
||||
@@ -1440,10 +1440,6 @@ func (account *SCloudaccount) syncAccountStatus(ctx context.Context, userCred mc
|
||||
log.Errorf("syncCloudproviderRegion fail %s", err)
|
||||
return err
|
||||
}
|
||||
err = providers[i].syncCloudproviderGlobalnetworks(ctx, userCred)
|
||||
if err != nil {
|
||||
log.Errorf("failed to sync cloudprovider globalnetwork for %s %s error: %v", providers[i].Provider, providers[i].Name, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -1085,25 +1085,6 @@ func (provider *SCloudprovider) markProviderConnected(ctx context.Context, userC
|
||||
return provider.ClearSchedDescCache()
|
||||
}
|
||||
|
||||
func (provider *SCloudprovider) syncCloudproviderGlobalnetworks(ctx context.Context, userCred mcclient.TokenCredential) error {
|
||||
driver, err := provider.GetProvider()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !driver.GetFactory().IsOnPremise() {
|
||||
globalnetworks, err := driver.GetIGlobalnetworks()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "GetIGlobalnetworks")
|
||||
}
|
||||
result := GlobalNetworkManager.SyncGlobalnetworks(ctx, userCred, provider, globalnetworks)
|
||||
if result.IsError() {
|
||||
log.Errorf("syncGlobalnetworks fail %s", result.Result())
|
||||
}
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (provider *SCloudprovider) prepareCloudproviderRegions(ctx context.Context, userCred mcclient.TokenCredential) ([]SCloudproviderregion, error) {
|
||||
driver, err := provider.GetProvider()
|
||||
if err != nil {
|
||||
@@ -1200,7 +1181,6 @@ func (self *SCloudprovider) RealDelete(ctx context.Context, userCred mcclient.To
|
||||
DBInstanceBackupManager,
|
||||
ElasticcacheManager,
|
||||
VpcManager,
|
||||
GlobalNetworkManager,
|
||||
ElasticipManager,
|
||||
NetworkInterfaceManager,
|
||||
CloudproviderRegionManager,
|
||||
|
||||
@@ -1,233 +0,0 @@
|
||||
// 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 models
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
"yunion.io/x/pkg/errors"
|
||||
"yunion.io/x/pkg/util/compare"
|
||||
"yunion.io/x/sqlchemy"
|
||||
|
||||
api "yunion.io/x/onecloud/pkg/apis/compute"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db/lockman"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
|
||||
"yunion.io/x/onecloud/pkg/cloudprovider"
|
||||
"yunion.io/x/onecloud/pkg/mcclient"
|
||||
)
|
||||
|
||||
type SGlobalNetworkManager struct {
|
||||
db.SEnabledStatusStandaloneResourceBaseManager
|
||||
}
|
||||
|
||||
var GlobalNetworkManager *SGlobalNetworkManager
|
||||
|
||||
func init() {
|
||||
GlobalNetworkManager = &SGlobalNetworkManager{
|
||||
SEnabledStatusStandaloneResourceBaseManager: db.NewEnabledStatusStandaloneResourceBaseManager(
|
||||
SGlobalNetwork{},
|
||||
"globalnetworks_tbl",
|
||||
"globalnetwork",
|
||||
"globalnetworks",
|
||||
),
|
||||
}
|
||||
GlobalNetworkManager.SetVirtualObject(GlobalNetworkManager)
|
||||
}
|
||||
|
||||
type SGlobalNetwork struct {
|
||||
db.SEnabledStatusStandaloneResourceBase
|
||||
db.SExternalizedResourceBase
|
||||
|
||||
SManagedResourceBase
|
||||
|
||||
Provider string `width:"64" charset:"ascii" list:"user"`
|
||||
}
|
||||
|
||||
func (manager *SGlobalNetworkManager) AllowCreateItem(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
|
||||
//current not support create
|
||||
return false
|
||||
}
|
||||
|
||||
func (self *SGlobalNetwork) ValidateDeleteCondition(ctx context.Context) error {
|
||||
return self.SEnabledStatusStandaloneResourceBase.ValidateDeleteCondition(ctx)
|
||||
}
|
||||
|
||||
func (self *SGlobalNetwork) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*jsonutils.JSONDict, error) {
|
||||
return self.SEnabledStatusStandaloneResourceBase.GetExtraDetails(ctx, userCred, query)
|
||||
}
|
||||
|
||||
func (self *SGlobalNetwork) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict {
|
||||
return self.SEnabledStatusStandaloneResourceBase.GetCustomizeColumns(ctx, userCred, query)
|
||||
}
|
||||
|
||||
func (manager *SGlobalNetworkManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
|
||||
return manager.SEnabledStatusStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, data)
|
||||
}
|
||||
|
||||
func (self *SGlobalNetwork) ValidateUpdateData(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
|
||||
return self.SEnabledStatusStandaloneResourceBase.ValidateUpdateData(ctx, userCred, query, data)
|
||||
}
|
||||
|
||||
func (self *SGlobalNetwork) Delete(ctx context.Context, userCred mcclient.TokenCredential) error {
|
||||
log.Infof("SGlobalNetwork delete do nothing")
|
||||
self.SetStatus(userCred, api.NETWORK_STATUS_START_DELETE, "")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *SGlobalNetwork) CustomizeDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) error {
|
||||
if len(self.ExternalId) > 0 {
|
||||
return self.StartDeleteGlobalNetworkTask(ctx, userCred)
|
||||
}
|
||||
return self.RealDelete(ctx, userCred)
|
||||
}
|
||||
|
||||
func (self *SGlobalNetwork) RealDelete(ctx context.Context, userCred mcclient.TokenCredential) error {
|
||||
db.OpsLog.LogEvent(self, db.ACT_DELOCATE, self.GetShortDesc(ctx), userCred)
|
||||
self.SetStatus(userCred, api.NETWORK_STATUS_DELETED, "real delete")
|
||||
return self.SEnabledStatusStandaloneResourceBase.Delete(ctx, userCred)
|
||||
}
|
||||
|
||||
func (self *SGlobalNetwork) StartDeleteGlobalNetworkTask(ctx context.Context, userCred mcclient.TokenCredential) error {
|
||||
task, err := taskman.TaskManager.NewTask(ctx, "GlobalNetworkDeleteTask", self, userCred, nil, "", "", nil)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "NewTask")
|
||||
}
|
||||
task.ScheduleRun(nil)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (manager *SGlobalNetworkManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) {
|
||||
return manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query)
|
||||
}
|
||||
|
||||
func (self *SGlobalNetwork) ValidateUpdateCondition(ctx context.Context) error {
|
||||
return self.SEnabledStatusStandaloneResourceBase.ValidateUpdateCondition(ctx)
|
||||
}
|
||||
|
||||
func (manager *SGlobalNetworkManager) GetGlobalNetworksByManagerId(id string) ([]SGlobalNetwork, error) {
|
||||
q := manager.Query().Equals("manager_id", id)
|
||||
q = q.Filter(sqlchemy.NOT(sqlchemy.IsNullOrEmpty(q.Field("external_id"))))
|
||||
globalnetworks := []SGlobalNetwork{}
|
||||
err := db.FetchModelObjects(manager, q, &globalnetworks)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return globalnetworks, nil
|
||||
}
|
||||
|
||||
func (self *SGlobalNetwork) GetGlobalNetworkVpcs() ([]SGlobalnetworkVpc, error) {
|
||||
gnvs := []SGlobalnetworkVpc{}
|
||||
q := GlobalnetworkVpcManager.Query().Equals("globalnetwork_id", self.Id)
|
||||
err := db.FetchModelObjects(GlobalnetworkVpcManager, q, &gnvs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return gnvs, nil
|
||||
}
|
||||
|
||||
func (manager *SGlobalNetworkManager) SyncGlobalnetworks(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, exts []cloudprovider.ICloudGlobalnetwork) compare.SyncResult {
|
||||
lockman.LockClass(ctx, manager, db.GetLockClassKey(manager, userCred))
|
||||
defer lockman.ReleaseClass(ctx, manager, db.GetLockClassKey(manager, userCred))
|
||||
|
||||
result := compare.SyncResult{}
|
||||
|
||||
dbNetworks, err := manager.GetGlobalNetworksByManagerId(provider.Id)
|
||||
if err != nil {
|
||||
result.Error(err)
|
||||
return result
|
||||
}
|
||||
|
||||
removed := make([]SGlobalNetwork, 0)
|
||||
commondb := make([]SGlobalNetwork, 0)
|
||||
commonext := make([]cloudprovider.ICloudGlobalnetwork, 0)
|
||||
added := make([]cloudprovider.ICloudGlobalnetwork, 0)
|
||||
err = compare.CompareSets(dbNetworks, exts, &removed, &commondb, &commonext, &added)
|
||||
if err != nil {
|
||||
result.Error(errors.Wrap(err, "CompareSets"))
|
||||
return result
|
||||
}
|
||||
for i := 0; i < len(removed); i += 1 {
|
||||
err = removed[i].syncRemoveGlobalnetwork(ctx, userCred)
|
||||
if err != nil {
|
||||
result.DeleteError(err)
|
||||
continue
|
||||
}
|
||||
result.Delete()
|
||||
}
|
||||
for i := 0; i < len(commondb); i += 1 {
|
||||
// update
|
||||
err = commondb[i].syncWithCloudGlobalnetwork(ctx, userCred, provider, commonext[i])
|
||||
if err != nil {
|
||||
result.UpdateError(err)
|
||||
continue
|
||||
}
|
||||
result.Update()
|
||||
}
|
||||
for i := 0; i < len(added); i += 1 {
|
||||
err := manager.newFromCloudGlobalnetwork(ctx, userCred, provider, added[i])
|
||||
if err != nil {
|
||||
result.AddError(err)
|
||||
continue
|
||||
}
|
||||
result.Add()
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func (self *SGlobalNetwork) syncWithCloudGlobalnetwork(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, ext cloudprovider.ICloudGlobalnetwork) error {
|
||||
diff, err := db.UpdateWithLock(ctx, self, func() error {
|
||||
self.Status = ext.GetStatus()
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "UpdateWithLock")
|
||||
}
|
||||
db.OpsLog.LogSyncUpdate(self, diff, userCred)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *SGlobalNetwork) syncRemoveGlobalnetwork(ctx context.Context, userCred mcclient.TokenCredential) error {
|
||||
err := self.ValidateDeleteCondition(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return self.RealDelete(ctx, userCred)
|
||||
}
|
||||
|
||||
func (manager *SGlobalNetworkManager) newFromCloudGlobalnetwork(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, ext cloudprovider.ICloudGlobalnetwork) error {
|
||||
network := SGlobalNetwork{}
|
||||
network.SetModelManager(manager, &network)
|
||||
|
||||
newName, err := db.GenerateName(manager, nil, ext.GetName())
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "GenerateName")
|
||||
}
|
||||
network.ExternalId = ext.GetGlobalId()
|
||||
network.Name = newName
|
||||
network.Status = ext.GetStatus()
|
||||
network.Enabled = true
|
||||
network.ManagerId = provider.Id
|
||||
network.Provider = provider.Provider
|
||||
|
||||
err = manager.TableSpec().Insert(&network)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Insert")
|
||||
}
|
||||
db.OpsLog.LogEvent(&network, db.ACT_CREATE, network.GetShortDesc(ctx), userCred)
|
||||
return nil
|
||||
}
|
||||
@@ -1,130 +0,0 @@
|
||||
// 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 models
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/pkg/errors"
|
||||
"yunion.io/x/sqlchemy"
|
||||
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db"
|
||||
"yunion.io/x/onecloud/pkg/mcclient"
|
||||
)
|
||||
|
||||
type SGlobalnetworkVpcManager struct {
|
||||
db.SJointResourceBaseManager
|
||||
}
|
||||
|
||||
var GlobalnetworkVpcManager *SGlobalnetworkVpcManager
|
||||
|
||||
func init() {
|
||||
db.InitManager(func() {
|
||||
GlobalnetworkVpcManager = &SGlobalnetworkVpcManager{
|
||||
SJointResourceBaseManager: db.NewJointResourceBaseManager(
|
||||
SGlobalnetworkVpc{},
|
||||
"globalnetworkvpcs_tbl",
|
||||
"globalnetworkvpc",
|
||||
"globalnetworkvpcs",
|
||||
GlobalNetworkManager,
|
||||
VpcManager,
|
||||
),
|
||||
}
|
||||
GlobalnetworkVpcManager.SetVirtualObject(GlobalnetworkVpcManager)
|
||||
})
|
||||
}
|
||||
|
||||
type SGlobalnetworkVpc struct {
|
||||
db.SJointResourceBase
|
||||
|
||||
GlobalnetworkId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"`
|
||||
VpcId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"`
|
||||
}
|
||||
|
||||
func (manager *SGlobalnetworkVpcManager) GetMasterFieldName() string {
|
||||
return "globalnetwork_id"
|
||||
}
|
||||
|
||||
func (manager *SGlobalnetworkVpcManager) GetSlaveFieldName() string {
|
||||
return "vpc_id"
|
||||
}
|
||||
|
||||
func (joint *SGlobalnetworkVpc) Master() db.IStandaloneModel {
|
||||
return db.JointMaster(joint)
|
||||
}
|
||||
|
||||
func (joint *SGlobalnetworkVpc) Slave() db.IStandaloneModel {
|
||||
return db.JointSlave(joint)
|
||||
}
|
||||
|
||||
func (manager *SGlobalnetworkVpcManager) AllowListItems(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) bool {
|
||||
return db.IsAdminAllowList(userCred, manager)
|
||||
}
|
||||
|
||||
func (manager *SGlobalnetworkVpcManager) AllowCreateItem(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
|
||||
return db.IsAdminAllowCreate(userCred, manager)
|
||||
}
|
||||
|
||||
func (manager *SGlobalnetworkVpcManager) AllowListDescendent(ctx context.Context, userCred mcclient.TokenCredential, model db.IStandaloneModel, query jsonutils.JSONObject) bool {
|
||||
return db.IsAdminAllowList(userCred, manager)
|
||||
}
|
||||
|
||||
func (manager *SGlobalnetworkVpcManager) AllowAttach(ctx context.Context, userCred mcclient.TokenCredential, master db.IStandaloneModel, slave db.IStandaloneModel) bool {
|
||||
return db.IsAdminAllowCreate(userCred, manager)
|
||||
}
|
||||
|
||||
func (self *SGlobalnetworkVpc) AllowGetDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) bool {
|
||||
return db.IsAdminAllowGet(userCred, self)
|
||||
}
|
||||
|
||||
func (self *SGlobalnetworkVpc) AllowUpdateItem(ctx context.Context, userCred mcclient.TokenCredential) bool {
|
||||
return db.IsAdminAllowUpdate(userCred, self)
|
||||
}
|
||||
|
||||
func (self *SGlobalnetworkVpc) AllowDeleteItem(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
|
||||
return db.IsAdminAllowDelete(userCred, self)
|
||||
}
|
||||
|
||||
func (self *SGlobalnetworkVpc) Detach(ctx context.Context, userCred mcclient.TokenCredential) error {
|
||||
return db.DetachJoint(ctx, userCred, self)
|
||||
}
|
||||
|
||||
func (self *SGlobalnetworkVpc) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict {
|
||||
return self.SJointResourceBase.GetCustomizeColumns(ctx, userCred, query)
|
||||
}
|
||||
|
||||
func (self *SGlobalnetworkVpc) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*jsonutils.JSONDict, error) {
|
||||
return self.SJointResourceBase.GetExtraDetails(ctx, userCred, query)
|
||||
}
|
||||
|
||||
func (manager *SGlobalnetworkVpcManager) NewGlobalnetworkVpc(vpc *SVpc, globalnetwork *SGlobalNetwork) error {
|
||||
q := manager.Query().Equals("vpc_id", vpc.Id).Equals("globalnetwork_id", globalnetwork.Id)
|
||||
count, err := q.CountWithError()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "CountWithError")
|
||||
}
|
||||
if count > 1 {
|
||||
return sqlchemy.ErrDuplicateEntry
|
||||
}
|
||||
if count == 1 {
|
||||
return nil
|
||||
}
|
||||
gv := &SGlobalnetworkVpc{}
|
||||
gv.SetModelManager(manager, gv)
|
||||
gv.VpcId = vpc.Id
|
||||
gv.GlobalnetworkId = globalnetwork.Id
|
||||
return manager.TableSpec().Insert(gv)
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
// 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 models
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/pkg/errors"
|
||||
"yunion.io/x/sqlchemy"
|
||||
|
||||
api "yunion.io/x/onecloud/pkg/apis/compute"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db"
|
||||
"yunion.io/x/onecloud/pkg/mcclient"
|
||||
)
|
||||
|
||||
type SGlobalVpcManager struct {
|
||||
db.SEnabledStatusStandaloneResourceBaseManager
|
||||
}
|
||||
|
||||
var GlobalVpcManager *SGlobalVpcManager
|
||||
|
||||
func init() {
|
||||
GlobalVpcManager = &SGlobalVpcManager{
|
||||
SEnabledStatusStandaloneResourceBaseManager: db.NewEnabledStatusStandaloneResourceBaseManager(
|
||||
SGlobalVpc{},
|
||||
"globalvpcs_tbl",
|
||||
"globalvpc",
|
||||
"globalvpcs",
|
||||
),
|
||||
}
|
||||
GlobalVpcManager.SetVirtualObject(GlobalVpcManager)
|
||||
}
|
||||
|
||||
type SGlobalVpc struct {
|
||||
db.SEnabledStatusStandaloneResourceBase
|
||||
}
|
||||
|
||||
func (manager *SGlobalVpcManager) AllowCreateItem(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
|
||||
return db.IsAdminAllowCreate(userCred, manager)
|
||||
}
|
||||
|
||||
func (self *SGlobalVpc) ValidateDeleteCondition(ctx context.Context) error {
|
||||
vpcs, err := self.GetVpcs()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "self.GetVpcs")
|
||||
}
|
||||
if len(vpcs) > 0 {
|
||||
return fmt.Errorf("not an empty globalvpc")
|
||||
}
|
||||
return self.SEnabledStatusStandaloneResourceBase.ValidateDeleteCondition(ctx)
|
||||
}
|
||||
|
||||
func (self *SGlobalVpc) GetVpcs() ([]SVpc, error) {
|
||||
vpcs := []SVpc{}
|
||||
q := VpcManager.Query().Equals("globalvpc_id", self.Id)
|
||||
err := db.FetchModelObjects(VpcManager, q, &vpcs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return vpcs, nil
|
||||
}
|
||||
|
||||
func (self *SGlobalVpc) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*jsonutils.JSONDict, error) {
|
||||
return self.SEnabledStatusStandaloneResourceBase.GetExtraDetails(ctx, userCred, query)
|
||||
}
|
||||
|
||||
func (self *SGlobalVpc) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict {
|
||||
return self.SEnabledStatusStandaloneResourceBase.GetCustomizeColumns(ctx, userCred, query)
|
||||
}
|
||||
|
||||
func (manager *SGlobalVpcManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, input *api.GlobalVpcCreateInput) (*jsonutils.JSONDict, error) {
|
||||
input.Status = api.GLOBAL_VPC_STATUS_AVAILABLE
|
||||
return manager.SEnabledStatusStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input.JSON(input))
|
||||
}
|
||||
|
||||
func (self *SGlobalVpc) ValidateUpdateData(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
|
||||
return self.SEnabledStatusStandaloneResourceBase.ValidateUpdateData(ctx, userCred, query, data)
|
||||
}
|
||||
|
||||
func (manager *SGlobalVpcManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) {
|
||||
return manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query)
|
||||
}
|
||||
|
||||
func (self *SGlobalVpc) ValidateUpdateCondition(ctx context.Context) error {
|
||||
return self.SEnabledStatusStandaloneResourceBase.ValidateUpdateCondition(ctx)
|
||||
}
|
||||
@@ -1624,56 +1624,3 @@ func (manager *SSecurityGroupCacheManager) purgeAll(ctx context.Context, userCre
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (gnv *SGlobalnetworkVpc) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
|
||||
lockman.LockObject(ctx, gnv)
|
||||
defer lockman.ReleaseObject(ctx, gnv)
|
||||
|
||||
return gnv.Delete(ctx, userCred)
|
||||
}
|
||||
|
||||
func (gn *SGlobalNetwork) purgeGlobalNetworkVpcs(ctx context.Context, userCred mcclient.TokenCredential) error {
|
||||
globalnetworkVpcs, err := gn.GetGlobalNetworkVpcs()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "gn.GetGlobalNetworkVpcs")
|
||||
}
|
||||
for i := range globalnetworkVpcs {
|
||||
err = globalnetworkVpcs[i].purge(ctx, userCred)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "globalnetworkVpcs[i].purge")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (gn *SGlobalNetwork) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
|
||||
lockman.LockObject(ctx, gn)
|
||||
defer lockman.ReleaseObject(ctx, gn)
|
||||
|
||||
err := gn.purgeGlobalNetworkVpcs(ctx, userCred)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "gn.purgeGlobalNetworkVpcs")
|
||||
}
|
||||
|
||||
err = gn.ValidateDeleteCondition(ctx)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "globalnetwork %s(%s)", gn.Name, gn.Id)
|
||||
}
|
||||
|
||||
return gn.RealDelete(ctx, userCred)
|
||||
}
|
||||
|
||||
func (manager *SGlobalNetworkManager) purgeAll(ctx context.Context, userCred mcclient.TokenCredential, providerId string) error {
|
||||
globalnetworks := []SGlobalNetwork{}
|
||||
err := fetchByManagerId(manager, providerId, &globalnetworks)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for i := range globalnetworks {
|
||||
err := globalnetworks[i].purge(ctx, userCred)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -117,7 +117,8 @@ type IRegionDriver interface {
|
||||
RequestSyncSecurityGroup(ctx context.Context, userCred mcclient.TokenCredential, vpcId string, vpc *SVpc, secgroup *SSecurityGroup) (string, error)
|
||||
IsSupportClassicSecurityGroup() bool
|
||||
IsSecurityGroupBelongVpc() bool
|
||||
IsSecurityGroupBelongGlobalNetwork() bool //安全组子账号范围内可用
|
||||
IsVpcBelongGlobalVpc() bool
|
||||
IsSecurityGroupBelongGlobalVpc() bool //安全组子账号范围内可用
|
||||
GetDefaultSecurityGroupVpcId() string
|
||||
GetSecurityGroupVpcId(ctx context.Context, userCred mcclient.TokenCredential, region *SCloudregion, host *SHost, vpc *SVpc, classic bool) (string, error)
|
||||
|
||||
|
||||
@@ -223,7 +223,7 @@ func (manager *SSecurityGroupCacheManager) SyncSecurityGroupCaches(ctx context.C
|
||||
}
|
||||
|
||||
vpcId := ""
|
||||
if region.GetDriver().IsSecurityGroupBelongGlobalNetwork() { //globalnetwork没有region属性
|
||||
if region.GetDriver().IsSecurityGroupBelongGlobalVpc() {
|
||||
vpcId, err = region.GetDriver().GetSecurityGroupVpcId(ctx, userCred, region, nil, vpc, false)
|
||||
if err != nil {
|
||||
syncResult.Error(errors.Wrap(err, "GetSecurityGroupVpcId"))
|
||||
|
||||
+93
-51
@@ -65,6 +65,7 @@ type SVpc struct {
|
||||
CidrBlock string `charset:"ascii" nullable:"true" list:"admin" create:"admin_required"`
|
||||
|
||||
CloudregionId string `width:"36" charset:"ascii" nullable:"false" list:"admin" create:"admin_required"`
|
||||
GlobalvpcId string `width:"36" charset:"ascii" list:"user"`
|
||||
}
|
||||
|
||||
func (manager *SVpcManager) GetContextManagers() [][]db.IModelManager {
|
||||
@@ -347,36 +348,30 @@ func (manager *SVpcManager) SyncVPCs(ctx context.Context, userCred mcclient.Toke
|
||||
err = commondb[i].SyncWithCloudVpc(ctx, userCred, commonext[i])
|
||||
if err != nil {
|
||||
syncResult.UpdateError(err)
|
||||
} else {
|
||||
syncMetadata(ctx, userCred, &commondb[i], commonext[i])
|
||||
localVPCs = append(localVPCs, commondb[i])
|
||||
remoteVPCs = append(remoteVPCs, commonext[i])
|
||||
syncResult.Update()
|
||||
continue
|
||||
}
|
||||
globalnetworkId := commonext[i].GetIGlobalNetworkId()
|
||||
if len(globalnetworkId) > 0 {
|
||||
err := commondb[i].checkAndSetGlobalNetwork(globalnetworkId)
|
||||
if err != nil {
|
||||
log.Errorf("failed to set globalnetwork for %s error: %v", globalnetworkId, err)
|
||||
}
|
||||
syncMetadata(ctx, userCred, &commondb[i], commonext[i])
|
||||
localVPCs = append(localVPCs, commondb[i])
|
||||
remoteVPCs = append(remoteVPCs, commonext[i])
|
||||
syncResult.Update()
|
||||
err = commondb[i].SyncGlobalVpc(ctx, userCred)
|
||||
if err != nil {
|
||||
log.Errorf("%s(%s) sync global vpc error: %v", commondb[i].Name, commondb[i].Id, err)
|
||||
}
|
||||
}
|
||||
for i := 0; i < len(added); i += 1 {
|
||||
new, err := manager.newFromCloudVpc(ctx, userCred, added[i], provider, region)
|
||||
newVpc, err := manager.newFromCloudVpc(ctx, userCred, added[i], provider, region)
|
||||
if err != nil {
|
||||
syncResult.AddError(err)
|
||||
} else {
|
||||
syncMetadata(ctx, userCred, new, added[i])
|
||||
localVPCs = append(localVPCs, *new)
|
||||
remoteVPCs = append(remoteVPCs, added[i])
|
||||
syncResult.Add()
|
||||
continue
|
||||
}
|
||||
globalnetworkId := added[i].GetIGlobalNetworkId()
|
||||
if len(globalnetworkId) > 0 {
|
||||
err := new.checkAndSetGlobalNetwork(globalnetworkId)
|
||||
if err != nil {
|
||||
log.Errorf("failed to set globalnetwork for %s error: %v", globalnetworkId, err)
|
||||
}
|
||||
syncMetadata(ctx, userCred, newVpc, added[i])
|
||||
localVPCs = append(localVPCs, *newVpc)
|
||||
remoteVPCs = append(remoteVPCs, added[i])
|
||||
syncResult.Add()
|
||||
err = newVpc.SyncGlobalVpc(ctx, userCred)
|
||||
if err != nil {
|
||||
log.Errorf("%s(%s) sync global vpc error: %v", newVpc.Name, newVpc.Id, err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -400,6 +395,61 @@ func (self *SVpc) syncRemoveCloudVpc(ctx context.Context, userCred mcclient.Toke
|
||||
return err
|
||||
}
|
||||
|
||||
func (self *SVpc) SyncGlobalVpc(ctx context.Context, userCred mcclient.TokenCredential) error {
|
||||
if len(self.GlobalvpcId) > 0 {
|
||||
return nil
|
||||
}
|
||||
region, err := self.GetRegion()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "GetRegion")
|
||||
}
|
||||
if region.GetDriver().IsVpcBelongGlobalVpc() {
|
||||
externalId := strings.Replace(self.ExternalId, region.ExternalId+"/", "", -1)
|
||||
vpcs := []SVpc{}
|
||||
sq := VpcManager.Query().SubQuery()
|
||||
q := sq.Query().Filter(
|
||||
sqlchemy.AND(
|
||||
sqlchemy.Equals(sq.Field("manager_id"), self.ManagerId),
|
||||
sqlchemy.NOT(sqlchemy.IsNullOrEmpty(sq.Field("globalvpc_id"))),
|
||||
sqlchemy.Endswith(sq.Field("external_id"), externalId),
|
||||
),
|
||||
)
|
||||
err := db.FetchModelObjects(VpcManager, q, &vpcs)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "db.FetchModelObjects")
|
||||
}
|
||||
globalvpcId := ""
|
||||
if len(vpcs) > 0 {
|
||||
globalvpcId = vpcs[0].GlobalvpcId
|
||||
} else {
|
||||
gv := &SGlobalVpc{}
|
||||
gv.Name = self.Name
|
||||
idx := strings.Index(gv.Name, "(")
|
||||
if idx > 0 {
|
||||
gv.Name = gv.Name[:idx]
|
||||
}
|
||||
gv.Name, err = db.GenerateName(GlobalVpcManager, userCred, gv.Name)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "db.GenerateName")
|
||||
}
|
||||
gv.Enabled = true
|
||||
gv.Status = api.GLOBAL_VPC_STATUS_AVAILABLE
|
||||
gv.SetModelManager(GlobalVpcManager, gv)
|
||||
err = GlobalVpcManager.TableSpec().Insert(gv)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "GlobalVpcManager.Insert")
|
||||
}
|
||||
globalvpcId = gv.Id
|
||||
}
|
||||
_, err = db.Update(self, func() error {
|
||||
self.GlobalvpcId = globalvpcId
|
||||
return nil
|
||||
})
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *SVpc) SyncWithCloudVpc(ctx context.Context, userCred mcclient.TokenCredential, extVPC cloudprovider.ICloudVpc) error {
|
||||
diff, err := db.UpdateWithLock(ctx, self, func() error {
|
||||
extVPC.Refresh()
|
||||
@@ -416,18 +466,11 @@ func (self *SVpc) SyncWithCloudVpc(ctx context.Context, userCred mcclient.TokenC
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
db.OpsLog.LogSyncUpdate(self, diff, userCred)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (vpc *SVpc) checkAndSetGlobalNetwork(globalnetworkId string) error {
|
||||
globalnetwork, err := db.FetchByExternalId(GlobalNetworkManager, globalnetworkId)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "FetchByExternalId")
|
||||
}
|
||||
return GlobalnetworkVpcManager.NewGlobalnetworkVpc(vpc, globalnetwork.(*SGlobalNetwork))
|
||||
}
|
||||
|
||||
func (manager *SVpcManager) newFromCloudVpc(ctx context.Context, userCred mcclient.TokenCredential, extVPC cloudprovider.ICloudVpc, provider *SCloudprovider, region *SCloudregion) (*SVpc, error) {
|
||||
vpc := SVpc{}
|
||||
vpc.SetModelManager(manager, &vpc)
|
||||
@@ -744,6 +787,18 @@ func (manager *SVpcManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQue
|
||||
q = q.In("id", sq.SubQuery())
|
||||
}
|
||||
|
||||
globalVpcStr, _ := query.GetString("globalvpc")
|
||||
if len(globalVpcStr) > 0 {
|
||||
globalVpc, err := GlobalVpcManager.FetchByIdOrName(userCred, globalVpcStr)
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, httperrors.NewResourceNotFoundError("globaalvpc %s not found", globalVpcStr)
|
||||
}
|
||||
return nil, httperrors.NewGeneralError(err)
|
||||
}
|
||||
q = q.Equals("globalvpc_id", globalVpc.GetId())
|
||||
}
|
||||
|
||||
return q, nil
|
||||
}
|
||||
|
||||
@@ -816,26 +871,13 @@ func (vpc *SVpc) StartVpcSyncstatusTask(ctx context.Context, userCred mcclient.T
|
||||
return nil
|
||||
}
|
||||
|
||||
func (vpc *SVpc) GetGlobalNetwork() (*SGlobalNetwork, error) {
|
||||
gv := GlobalnetworkVpcManager.Query().SubQuery()
|
||||
q := GlobalNetworkManager.Query()
|
||||
q.Join(gv, sqlchemy.Equals(q.Field("id"), gv.Field("globalnetwork_id")))
|
||||
q = q.Filter(sqlchemy.Equals(gv.Field("vpc_id"), vpc.Id))
|
||||
count, err := q.CountWithError()
|
||||
func (vpc *SVpc) GetGlobalVpc() (*SGlobalVpc, error) {
|
||||
if len(vpc.GlobalvpcId) == 0 {
|
||||
return nil, fmt.Errorf("vpc does not belong to any globalvpc")
|
||||
}
|
||||
gv, err := GlobalVpcManager.FetchById(vpc.GlobalvpcId)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "CountWithError")
|
||||
return nil, err
|
||||
}
|
||||
if count > 1 {
|
||||
return nil, sqlchemy.ErrDuplicateEntry
|
||||
}
|
||||
if count == 0 {
|
||||
return nil, sql.ErrNoRows
|
||||
}
|
||||
globalnetwork := &SGlobalNetwork{}
|
||||
globalnetwork.SetModelManager(GlobalNetworkManager, globalnetwork)
|
||||
err = q.First(globalnetwork)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "First")
|
||||
}
|
||||
return globalnetwork, nil
|
||||
return gv.(*SGlobalVpc), nil
|
||||
}
|
||||
|
||||
@@ -215,7 +215,11 @@ func (self *SBaseRegionDriver) IsSecurityGroupBelongVpc() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (self *SBaseRegionDriver) IsSecurityGroupBelongGlobalNetwork() bool {
|
||||
func (self *SBaseRegionDriver) IsVpcBelongGlobalVpc() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (self *SBaseRegionDriver) IsSecurityGroupBelongGlobalVpc() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,10 @@ func (self *SGoogleRegionDriver) GetProvider() string {
|
||||
return api.CLOUD_PROVIDER_GOOGLE
|
||||
}
|
||||
|
||||
func (self *SGoogleRegionDriver) IsSecurityGroupBelongGlobalNetwork() bool {
|
||||
func (self *SGoogleRegionDriver) IsSecurityGroupBelongGlobalVpc() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (self *SGoogleRegionDriver) IsVpcBelongGlobalVpc() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -1387,12 +1387,8 @@ func (self *SManagedVirtualizationRegionDriver) BindIPToNatgatewayRollback(ctx c
|
||||
}
|
||||
|
||||
func (self *SManagedVirtualizationRegionDriver) GetSecurityGroupVpcId(ctx context.Context, userCred mcclient.TokenCredential, region *models.SCloudregion, host *models.SHost, vpc *models.SVpc, classic bool) (string, error) {
|
||||
if region.GetDriver().IsSecurityGroupBelongGlobalNetwork() {
|
||||
globalnetwork, err := vpc.GetGlobalNetwork()
|
||||
if err != nil {
|
||||
return "", errors.Wrap(err, "vpc.GetGlobalNetwork")
|
||||
}
|
||||
return globalnetwork.ExternalId, nil
|
||||
if region.GetDriver().IsSecurityGroupBelongGlobalVpc() {
|
||||
return strings.TrimPrefix(vpc.ExternalId, region.ExternalId+"/"), nil
|
||||
} else if region.GetDriver().IsSupportClassicSecurityGroup() && (classic || (host != nil && strings.HasSuffix(host.Name, "-classic"))) {
|
||||
return "classic", nil
|
||||
} else if region.GetDriver().IsSecurityGroupBelongVpc() {
|
||||
|
||||
@@ -136,7 +136,7 @@ func InitHandlers(app *appsrv.Application) {
|
||||
models.ElasticcacheParameterManager,
|
||||
models.ElasticcacheBackupManager,
|
||||
models.ElasticcacheSkuManager,
|
||||
models.GlobalNetworkManager,
|
||||
models.GlobalVpcManager,
|
||||
|
||||
models.GuestTemplateManager,
|
||||
models.ServiceCatalogManager,
|
||||
@@ -164,7 +164,6 @@ func InitHandlers(app *appsrv.Application) {
|
||||
models.NetworkinterfacenetworkManager,
|
||||
models.SnapshotPolicyDiskManager,
|
||||
models.InstanceSnapshotJointManager,
|
||||
models.GlobalnetworkVpcManager,
|
||||
} {
|
||||
db.RegisterModelManager(manager)
|
||||
handler := db.NewJointModelHandler(manager)
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
// 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 modules
|
||||
|
||||
import "yunion.io/x/onecloud/pkg/mcclient/modulebase"
|
||||
|
||||
var (
|
||||
GlobalnetworkVpcs modulebase.JointResourceManager
|
||||
)
|
||||
|
||||
func init() {
|
||||
GlobalnetworkVpcs = NewJointComputeManager(
|
||||
"globalnetworkvpc",
|
||||
"globalnetworkvpcs",
|
||||
[]string{"Globalnetwork_Id", "Globalnetwork",
|
||||
"Vpc_Id", "Vpc"},
|
||||
[]string{},
|
||||
&GlobalNetworks,
|
||||
&Vpcs)
|
||||
registerCompute(&GlobalnetworkVpcs)
|
||||
}
|
||||
@@ -18,18 +18,18 @@ import (
|
||||
"yunion.io/x/onecloud/pkg/mcclient/modulebase"
|
||||
)
|
||||
|
||||
type GlobalNetworkManager struct {
|
||||
type GlobalVpcManager struct {
|
||||
modulebase.ResourceManager
|
||||
}
|
||||
|
||||
var (
|
||||
GlobalNetworks GlobalNetworkManager
|
||||
GlobalVpcs GlobalVpcManager
|
||||
)
|
||||
|
||||
func init() {
|
||||
GlobalNetworks = GlobalNetworkManager{NewComputeManager("globalnetwork", "globalnetworks",
|
||||
GlobalVpcs = GlobalVpcManager{NewComputeManager("globalvpc", "globalvpcs",
|
||||
[]string{},
|
||||
[]string{"ID", "Name", "Description"})}
|
||||
[]string{"ID", "Name", "Description", "Status", "Enabled"})}
|
||||
|
||||
registerCompute(&GlobalNetworks)
|
||||
registerCompute(&GlobalVpcs)
|
||||
}
|
||||
@@ -121,14 +121,6 @@ func (self *SAliyunProvider) GetIRegions() []cloudprovider.ICloudRegion {
|
||||
return self.client.GetIRegions()
|
||||
}
|
||||
|
||||
func (cli *SAliyunProvider) GetIGlobalnetworks() ([]cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return []cloudprovider.ICloudGlobalnetwork{}, nil
|
||||
}
|
||||
|
||||
func (cli *SAliyunProvider) GetIGlobalnetworkById(id string) (cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return nil, cloudprovider.ErrNotFound
|
||||
}
|
||||
|
||||
func (self *SAliyunProvider) GetIRegionById(extId string) (cloudprovider.ICloudRegion, error) {
|
||||
return self.client.GetIRegionById(extId)
|
||||
}
|
||||
|
||||
@@ -114,14 +114,6 @@ func (self *SAwsProvider) GetIRegions() []cloudprovider.ICloudRegion {
|
||||
return self.client.GetIRegions()
|
||||
}
|
||||
|
||||
func (self *SAwsProvider) GetIGlobalnetworks() ([]cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return []cloudprovider.ICloudGlobalnetwork{}, nil
|
||||
}
|
||||
|
||||
func (self *SAwsProvider) GetIGlobalnetworkById(id string) (cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return nil, cloudprovider.ErrNotFound
|
||||
}
|
||||
|
||||
func (self *SAwsProvider) GetSysInfo() (jsonutils.JSONObject, error) {
|
||||
regions := self.client.GetIRegions()
|
||||
info := jsonutils.NewDict()
|
||||
|
||||
@@ -166,14 +166,6 @@ func (self *SAzureProvider) GetIRegions() []cloudprovider.ICloudRegion {
|
||||
return self.client.GetIRegions()
|
||||
}
|
||||
|
||||
func (cli *SAzureProvider) GetIGlobalnetworks() ([]cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return []cloudprovider.ICloudGlobalnetwork{}, nil
|
||||
}
|
||||
|
||||
func (cli *SAzureProvider) GetIGlobalnetworkById(id string) (cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return nil, cloudprovider.ErrNotFound
|
||||
}
|
||||
|
||||
func (self *SAzureProvider) GetIRegionById(id string) (cloudprovider.ICloudRegion, error) {
|
||||
return self.client.GetIRegionById(id)
|
||||
}
|
||||
|
||||
@@ -110,14 +110,6 @@ type SCtyunProvider struct {
|
||||
client *ctyun.SCtyunClient
|
||||
}
|
||||
|
||||
func (self *SCtyunProvider) GetIGlobalnetworks() ([]cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return []cloudprovider.ICloudGlobalnetwork{}, nil
|
||||
}
|
||||
|
||||
func (self *SCtyunProvider) GetIGlobalnetworkById(id string) (cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return nil, cloudprovider.ErrNotFound
|
||||
}
|
||||
|
||||
func (self *SCtyunProvider) GetSubAccounts() ([]cloudprovider.SSubAccount, error) {
|
||||
return self.client.GetSubAccounts()
|
||||
}
|
||||
|
||||
@@ -166,14 +166,6 @@ func (self *SESXiProvider) GetIRegions() []cloudprovider.ICloudRegion {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cli *SESXiProvider) GetIGlobalnetworks() ([]cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return []cloudprovider.ICloudGlobalnetwork{}, nil
|
||||
}
|
||||
|
||||
func (cli *SESXiProvider) GetIGlobalnetworkById(id string) (cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return nil, cloudprovider.ErrNotFound
|
||||
}
|
||||
|
||||
func (self *SESXiProvider) GetIRegionById(id string) (cloudprovider.ICloudRegion, error) {
|
||||
return nil, cloudprovider.ErrNotSupported
|
||||
}
|
||||
|
||||
@@ -14,12 +14,6 @@
|
||||
|
||||
package google
|
||||
|
||||
import (
|
||||
"yunion.io/x/jsonutils"
|
||||
|
||||
api "yunion.io/x/onecloud/pkg/apis/compute"
|
||||
)
|
||||
|
||||
type SGlobalNetwork struct {
|
||||
Id string
|
||||
//CreationTimestamp time.Time
|
||||
@@ -43,31 +37,3 @@ func (cli *SGoogleClient) GetGlobalNetworks(maxResults int, pageToken string) ([
|
||||
resource := "global/networks"
|
||||
return networks, cli.list(resource, params, maxResults, pageToken, &networks)
|
||||
}
|
||||
|
||||
func (net *SGlobalNetwork) GetId() string {
|
||||
return net.SelfLink
|
||||
}
|
||||
|
||||
func (net *SGlobalNetwork) GetGlobalId() string {
|
||||
return getGlobalId(net.SelfLink)
|
||||
}
|
||||
|
||||
func (net *SGlobalNetwork) GetName() string {
|
||||
return net.Name
|
||||
}
|
||||
|
||||
func (net *SGlobalNetwork) GetMetadata() *jsonutils.JSONDict {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (net *SGlobalNetwork) GetStatus() string {
|
||||
return api.GLOBAL_NETWORK_STATUS_AVAILABLE
|
||||
}
|
||||
|
||||
func (net *SGlobalNetwork) IsEmulated() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (net *SGlobalNetwork) Refresh() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -267,26 +267,6 @@ func (self *SGoogleClient) fetchGlobalNetwork() ([]SGlobalNetwork, error) {
|
||||
return globalnetworks, nil
|
||||
}
|
||||
|
||||
func (cli *SGoogleClient) GetIGlobalnetworks() ([]cloudprovider.ICloudGlobalnetwork, error) {
|
||||
networks, err := cli.fetchGlobalNetwork()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "fetchGlobalNetwork")
|
||||
}
|
||||
inetworks := []cloudprovider.ICloudGlobalnetwork{}
|
||||
for i := range networks {
|
||||
inetworks = append(inetworks, &networks[i])
|
||||
}
|
||||
return inetworks, nil
|
||||
}
|
||||
|
||||
func (cli *SGoogleClient) GetIGlobalnetworkById(id string) (cloudprovider.ICloudGlobalnetwork, error) {
|
||||
network, err := cli.GetGlobalNetwork(id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return network, nil
|
||||
}
|
||||
|
||||
func (self *SGoogleClient) GetRegions() []SRegion {
|
||||
regions := make([]SRegion, len(self.iregions))
|
||||
for i := 0; i < len(regions); i++ {
|
||||
|
||||
@@ -56,7 +56,7 @@ func (host *SHost) GetIStorageById(id string) (cloudprovider.ICloudStorage, erro
|
||||
}
|
||||
|
||||
func (host *SHost) IsEmulated() bool {
|
||||
return false
|
||||
return true
|
||||
}
|
||||
|
||||
func (host *SHost) GetStatus() string {
|
||||
|
||||
@@ -330,7 +330,7 @@ func (instance *SInstance) GetSecurityGroupIds() ([]string, error) {
|
||||
if len(instance.ServiceAccounts) > 0 && isecgroup.GetName() == instance.ServiceAccounts[0].Email {
|
||||
secgroupIds = append(secgroupIds, isecgroup.GetGlobalId())
|
||||
}
|
||||
if isecgroup.GetName() == globalnetwork.GetName() {
|
||||
if isecgroup.GetName() == globalnetwork.Name {
|
||||
secgroupIds = append(secgroupIds, isecgroup.GetGlobalId())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,14 +164,6 @@ func (self *SGoogleProvider) GetIRegions() []cloudprovider.ICloudRegion {
|
||||
return self.client.GetIRegions()
|
||||
}
|
||||
|
||||
func (self *SGoogleProvider) GetIGlobalnetworks() ([]cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return self.client.GetIGlobalnetworks()
|
||||
}
|
||||
|
||||
func (self *SGoogleProvider) GetIGlobalnetworkById(id string) (cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return self.client.GetIGlobalnetworkById(id)
|
||||
}
|
||||
|
||||
func (self *SGoogleProvider) GetIRegionById(extId string) (cloudprovider.ICloudRegion, error) {
|
||||
return self.client.GetIRegionById(extId)
|
||||
}
|
||||
|
||||
@@ -119,15 +119,10 @@ func (region *SRegion) GetIVpcs() ([]cloudprovider.ICloudVpc, error) {
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "fetchGlobalNetwork")
|
||||
}
|
||||
substr := fmt.Sprintf("regions/%s/subnetworks", region.Name)
|
||||
ivpcs := []cloudprovider.ICloudVpc{}
|
||||
for i := range globalnetworks {
|
||||
for _, subnet := range globalnetworks[i].Subnetworks {
|
||||
if strings.Index(subnet, substr) >= 0 {
|
||||
vpc := SVpc{region: region, globalnetwork: &globalnetworks[i]}
|
||||
ivpcs = append(ivpcs, &vpc)
|
||||
}
|
||||
}
|
||||
vpc := SVpc{region: region, globalnetwork: &globalnetworks[i]}
|
||||
ivpcs = append(ivpcs, &vpc)
|
||||
}
|
||||
return ivpcs, nil
|
||||
}
|
||||
|
||||
@@ -166,7 +166,7 @@ func (firewall *SFirewall) toRules() ([]secrules.SecurityRule, error) {
|
||||
}
|
||||
|
||||
func (secgroup *SSecurityGroup) GetId() string {
|
||||
return secgroup.vpc.globalnetwork.GetGlobalId()
|
||||
return getGlobalId(secgroup.vpc.globalnetwork.SelfLink)
|
||||
}
|
||||
|
||||
func (secgroup *SSecurityGroup) GetGlobalId() string {
|
||||
@@ -190,7 +190,7 @@ func (secgroup *SSecurityGroup) GetName() string {
|
||||
if len(secgroup.ServiceAccount) > 0 {
|
||||
return secgroup.ServiceAccount
|
||||
}
|
||||
return secgroup.vpc.globalnetwork.GetName()
|
||||
return secgroup.vpc.globalnetwork.Name
|
||||
}
|
||||
|
||||
func (secgroup *SSecurityGroup) GetMetadata() *jsonutils.JSONDict {
|
||||
|
||||
@@ -41,7 +41,7 @@ func (vpc *SVpc) GetId() string {
|
||||
}
|
||||
|
||||
func (vpc *SVpc) GetGlobalId() string {
|
||||
return vpc.GetId()
|
||||
return fmt.Sprintf("%s/%s", vpc.region.GetGlobalId(), vpc.GetId())
|
||||
}
|
||||
|
||||
func (vpc *SVpc) Refresh() error {
|
||||
@@ -60,10 +60,6 @@ func (vpc *SVpc) GetCidrBlock() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (vpc *SVpc) GetIGlobalNetworkId() string {
|
||||
return vpc.globalnetwork.GetGlobalId()
|
||||
}
|
||||
|
||||
func (vpc *SVpc) IsEmulated() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -88,7 +88,7 @@ func (wire *SWire) GetStatus() string {
|
||||
}
|
||||
|
||||
func (wire *SWire) IsEmulated() bool {
|
||||
return false
|
||||
return true
|
||||
}
|
||||
|
||||
func (wire *SWire) Refresh() error {
|
||||
|
||||
@@ -110,7 +110,7 @@ func (zone *SZone) GetMetadata() *jsonutils.JSONDict {
|
||||
}
|
||||
|
||||
func (zone *SZone) IsEmulated() bool {
|
||||
return true
|
||||
return false
|
||||
}
|
||||
|
||||
func (zone *SZone) Refresh() error {
|
||||
|
||||
@@ -145,14 +145,6 @@ func (self *SHuaweiProvider) GetIRegions() []cloudprovider.ICloudRegion {
|
||||
return self.client.GetIRegions()
|
||||
}
|
||||
|
||||
func (cli *SHuaweiProvider) GetIGlobalnetworks() ([]cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return []cloudprovider.ICloudGlobalnetwork{}, nil
|
||||
}
|
||||
|
||||
func (cli *SHuaweiProvider) GetIGlobalnetworkById(id string) (cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return nil, cloudprovider.ErrNotFound
|
||||
}
|
||||
|
||||
func (self *SHuaweiProvider) GetIRegionById(extId string) (cloudprovider.ICloudRegion, error) {
|
||||
return self.client.GetIRegionById(extId)
|
||||
}
|
||||
|
||||
@@ -114,14 +114,6 @@ func (self *SObjectStoreProvider) GetIRegions() []cloudprovider.ICloudRegion {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *SObjectStoreProvider) GetIGlobalnetworks() ([]cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return []cloudprovider.ICloudGlobalnetwork{}, nil
|
||||
}
|
||||
|
||||
func (self *SObjectStoreProvider) GetIGlobalnetworkById(id string) (cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return nil, cloudprovider.ErrNotFound
|
||||
}
|
||||
|
||||
func (self *SObjectStoreProvider) GetIRegionById(id string) (cloudprovider.ICloudRegion, error) {
|
||||
return nil, cloudprovider.ErrNotSupported
|
||||
}
|
||||
|
||||
@@ -170,14 +170,6 @@ func (self *SOpenStackProvider) GetIRegions() []cloudprovider.ICloudRegion {
|
||||
return self.client.GetIRegions()
|
||||
}
|
||||
|
||||
func (self *SOpenStackProvider) GetIGlobalnetworks() ([]cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return []cloudprovider.ICloudGlobalnetwork{}, nil
|
||||
}
|
||||
|
||||
func (self *SOpenStackProvider) GetIGlobalnetworkById(id string) (cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return nil, cloudprovider.ErrNotFound
|
||||
}
|
||||
|
||||
func (self *SOpenStackProvider) GetIRegionById(extId string) (cloudprovider.ICloudRegion, error) {
|
||||
return self.client.GetIRegionById(extId)
|
||||
}
|
||||
|
||||
@@ -161,14 +161,6 @@ func (self *SQcloudProvider) GetIRegions() []cloudprovider.ICloudRegion {
|
||||
return self.client.GetIRegions()
|
||||
}
|
||||
|
||||
func (client *SQcloudProvider) GetIGlobalnetworks() ([]cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return []cloudprovider.ICloudGlobalnetwork{}, nil
|
||||
}
|
||||
|
||||
func (client *SQcloudProvider) GetIGlobalnetworkById(id string) (cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return nil, cloudprovider.ErrNotFound
|
||||
}
|
||||
|
||||
func (self *SQcloudProvider) GetIRegionById(id string) (cloudprovider.ICloudRegion, error) {
|
||||
return self.client.GetIRegionById(id)
|
||||
}
|
||||
|
||||
@@ -149,14 +149,6 @@ func (self *SUcloudProvider) GetIRegions() []cloudprovider.ICloudRegion {
|
||||
return self.client.GetIRegions()
|
||||
}
|
||||
|
||||
func (cli *SUcloudProvider) GetIGlobalnetworks() ([]cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return []cloudprovider.ICloudGlobalnetwork{}, nil
|
||||
}
|
||||
|
||||
func (cli *SUcloudProvider) GetIGlobalnetworkById(id string) (cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return nil, cloudprovider.ErrNotFound
|
||||
}
|
||||
|
||||
func (self *SUcloudProvider) GetIRegionById(extId string) (cloudprovider.ICloudRegion, error) {
|
||||
return self.client.GetIRegionById(extId)
|
||||
}
|
||||
|
||||
@@ -27,7 +27,3 @@ type SVpc struct {
|
||||
func (self *SVpc) GetINatGateways() ([]cloudprovider.ICloudNatGateway, error) {
|
||||
return nil, fmt.Errorf("Not Implemented GetNatGateways")
|
||||
}
|
||||
|
||||
func (self *SVpc) GetIGlobalNetworkId() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
@@ -124,14 +124,6 @@ func (self *SZStackProvider) GetIRegions() []cloudprovider.ICloudRegion {
|
||||
return self.client.GetIRegions()
|
||||
}
|
||||
|
||||
func (cli *SZStackProvider) GetIGlobalnetworks() ([]cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return []cloudprovider.ICloudGlobalnetwork{}, nil
|
||||
}
|
||||
|
||||
func (cli *SZStackProvider) GetIGlobalnetworkById(id string) (cloudprovider.ICloudGlobalnetwork, error) {
|
||||
return nil, cloudprovider.ErrNotFound
|
||||
}
|
||||
|
||||
func (self *SZStackProvider) GetIRegionById(extId string) (cloudprovider.ICloudRegion, error) {
|
||||
return self.client.GetIRegionById(extId)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user