From f9ae7d924455b0e91879103d2511ae090ee558af Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Mon, 9 Dec 2019 16:00:47 +0800 Subject: [PATCH] fix: globalnetwork -> globalvpc --- .../{globalnetworks.go => globalvpcs.go} | 16 +- cmd/climc/shell/vpcs.go | 5 +- pkg/apis/compute/globalvpc.go | 44 ++++ ...balnetwork_const.go => globalvpc_const.go} | 4 +- pkg/apis/compute/zz_generated.model.go | 15 +- pkg/cloudprovider/cloudprovider.go | 3 - pkg/cloudprovider/resources.go | 6 +- pkg/compute/models/cloudaccounts.go | 4 - pkg/compute/models/cloudproviders.go | 20 -- pkg/compute/models/globalnetworks.go | 233 ------------------ pkg/compute/models/globalnetworkvpcs.go | 130 ---------- pkg/compute/models/globalvpcs.go | 100 ++++++++ pkg/compute/models/purge.go | 53 ---- pkg/compute/models/regiondrivers.go | 3 +- pkg/compute/models/secgroupcache.go | 2 +- pkg/compute/models/vpcs.go | 144 +++++++---- pkg/compute/regiondrivers/base.go | 6 +- pkg/compute/regiondrivers/google.go | 6 +- pkg/compute/regiondrivers/managedvirtual.go | 8 +- pkg/compute/service/handlers.go | 3 +- pkg/mcclient/modules/mod_globalnetworkvpcs.go | 33 --- ...od_globalnetworks.go => mod_globalvpcs.go} | 10 +- pkg/multicloud/aliyun/provider/provider.go | 8 - pkg/multicloud/aws/provider/provider.go | 8 - pkg/multicloud/azure/provider/provider.go | 8 - pkg/multicloud/ctyun/provider/provider.go | 8 - pkg/multicloud/esxi/provider/provider.go | 8 - pkg/multicloud/google/globalnetwork.go | 34 --- pkg/multicloud/google/google.go | 20 -- pkg/multicloud/google/host.go | 2 +- pkg/multicloud/google/instance.go | 2 +- pkg/multicloud/google/provider/provider.go | 8 - pkg/multicloud/google/region.go | 9 +- pkg/multicloud/google/securitygroup.go | 4 +- pkg/multicloud/google/vpc.go | 6 +- pkg/multicloud/google/wire.go | 2 +- pkg/multicloud/google/zone.go | 2 +- pkg/multicloud/huawei/provider/provider.go | 8 - .../objectstore/provider/provider.go | 8 - pkg/multicloud/openstack/provider/provider.go | 8 - pkg/multicloud/qcloud/provider/provider.go | 8 - pkg/multicloud/ucloud/provider/provider.go | 8 - pkg/multicloud/vpc_base.go | 4 - pkg/multicloud/zstack/provider/provider.go | 8 - 44 files changed, 284 insertions(+), 745 deletions(-) rename cmd/climc/shell/{globalnetworks.go => globalvpcs.go} (61%) create mode 100644 pkg/apis/compute/globalvpc.go rename pkg/apis/compute/{globalnetwork_const.go => globalvpc_const.go} (86%) delete mode 100644 pkg/compute/models/globalnetworks.go delete mode 100644 pkg/compute/models/globalnetworkvpcs.go create mode 100644 pkg/compute/models/globalvpcs.go delete mode 100644 pkg/mcclient/modules/mod_globalnetworkvpcs.go rename pkg/mcclient/modules/{mod_globalnetworks.go => mod_globalvpcs.go} (75%) diff --git a/cmd/climc/shell/globalnetworks.go b/cmd/climc/shell/globalvpcs.go similarity index 61% rename from cmd/climc/shell/globalnetworks.go rename to cmd/climc/shell/globalvpcs.go index 99f5b3a8d2..8efceba8f1 100644 --- a/cmd/climc/shell/globalnetworks.go +++ b/cmd/climc/shell/globalvpcs.go @@ -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 } diff --git a/cmd/climc/shell/vpcs.go b/cmd/climc/shell/vpcs.go index e3ecb54f63..40f7e67392 100644 --- a/cmd/climc/shell/vpcs.go +++ b/cmd/climc/shell/vpcs.go @@ -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) diff --git a/pkg/apis/compute/globalvpc.go b/pkg/apis/compute/globalvpc.go new file mode 100644 index 0000000000..0de4f80672 --- /dev/null +++ b/pkg/apis/compute/globalvpc.go @@ -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"` +} diff --git a/pkg/apis/compute/globalnetwork_const.go b/pkg/apis/compute/globalvpc_const.go similarity index 86% rename from pkg/apis/compute/globalnetwork_const.go rename to pkg/apis/compute/globalvpc_const.go index 8a471f5d14..13aee5e74d 100644 --- a/pkg/apis/compute/globalnetwork_const.go +++ b/pkg/apis/compute/globalvpc_const.go @@ -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" ) diff --git a/pkg/apis/compute/zz_generated.model.go b/pkg/apis/compute/zz_generated.model.go index ca9bfd81ed..ac91c63109 100644 --- a/pkg/apis/compute/zz_generated.model.go +++ b/pkg/apis/compute/zz_generated.model.go @@ -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. diff --git a/pkg/cloudprovider/cloudprovider.go b/pkg/cloudprovider/cloudprovider.go index 22f37bc169..6a1514110a 100644 --- a/pkg/cloudprovider/cloudprovider.go +++ b/pkg/cloudprovider/cloudprovider.go @@ -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) diff --git a/pkg/cloudprovider/resources.go b/pkg/cloudprovider/resources.go index 77b33363be..94df375d25 100644 --- a/pkg/cloudprovider/resources.go +++ b/pkg/cloudprovider/resources.go @@ -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 -} diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index 6df0074ce2..3bf5177293 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -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 diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index 0cfbf8710e..d32b587da2 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -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, diff --git a/pkg/compute/models/globalnetworks.go b/pkg/compute/models/globalnetworks.go deleted file mode 100644 index 1754ec0bad..0000000000 --- a/pkg/compute/models/globalnetworks.go +++ /dev/null @@ -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 -} diff --git a/pkg/compute/models/globalnetworkvpcs.go b/pkg/compute/models/globalnetworkvpcs.go deleted file mode 100644 index e80c88218b..0000000000 --- a/pkg/compute/models/globalnetworkvpcs.go +++ /dev/null @@ -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) -} diff --git a/pkg/compute/models/globalvpcs.go b/pkg/compute/models/globalvpcs.go new file mode 100644 index 0000000000..e290628ab1 --- /dev/null +++ b/pkg/compute/models/globalvpcs.go @@ -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) +} diff --git a/pkg/compute/models/purge.go b/pkg/compute/models/purge.go index 400833e440..b03043f0ec 100644 --- a/pkg/compute/models/purge.go +++ b/pkg/compute/models/purge.go @@ -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 -} diff --git a/pkg/compute/models/regiondrivers.go b/pkg/compute/models/regiondrivers.go index eb0cc4c84b..c947076901 100644 --- a/pkg/compute/models/regiondrivers.go +++ b/pkg/compute/models/regiondrivers.go @@ -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) diff --git a/pkg/compute/models/secgroupcache.go b/pkg/compute/models/secgroupcache.go index b9e115279a..4bbfae06cd 100644 --- a/pkg/compute/models/secgroupcache.go +++ b/pkg/compute/models/secgroupcache.go @@ -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")) diff --git a/pkg/compute/models/vpcs.go b/pkg/compute/models/vpcs.go index c2f3822abd..477b678e57 100644 --- a/pkg/compute/models/vpcs.go +++ b/pkg/compute/models/vpcs.go @@ -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 } diff --git a/pkg/compute/regiondrivers/base.go b/pkg/compute/regiondrivers/base.go index fb8ce4dafd..8b1d988371 100644 --- a/pkg/compute/regiondrivers/base.go +++ b/pkg/compute/regiondrivers/base.go @@ -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 } diff --git a/pkg/compute/regiondrivers/google.go b/pkg/compute/regiondrivers/google.go index 54a34aeb7d..d020b8ff7a 100644 --- a/pkg/compute/regiondrivers/google.go +++ b/pkg/compute/regiondrivers/google.go @@ -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 } diff --git a/pkg/compute/regiondrivers/managedvirtual.go b/pkg/compute/regiondrivers/managedvirtual.go index 7c6a331b5f..07783cb8b5 100644 --- a/pkg/compute/regiondrivers/managedvirtual.go +++ b/pkg/compute/regiondrivers/managedvirtual.go @@ -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() { diff --git a/pkg/compute/service/handlers.go b/pkg/compute/service/handlers.go index fb8e3be230..4f6c8b5cd4 100644 --- a/pkg/compute/service/handlers.go +++ b/pkg/compute/service/handlers.go @@ -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) diff --git a/pkg/mcclient/modules/mod_globalnetworkvpcs.go b/pkg/mcclient/modules/mod_globalnetworkvpcs.go deleted file mode 100644 index 43f3df31b1..0000000000 --- a/pkg/mcclient/modules/mod_globalnetworkvpcs.go +++ /dev/null @@ -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) -} diff --git a/pkg/mcclient/modules/mod_globalnetworks.go b/pkg/mcclient/modules/mod_globalvpcs.go similarity index 75% rename from pkg/mcclient/modules/mod_globalnetworks.go rename to pkg/mcclient/modules/mod_globalvpcs.go index ce70a8486b..95de9ec398 100644 --- a/pkg/mcclient/modules/mod_globalnetworks.go +++ b/pkg/mcclient/modules/mod_globalvpcs.go @@ -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) } diff --git a/pkg/multicloud/aliyun/provider/provider.go b/pkg/multicloud/aliyun/provider/provider.go index 62889d05e7..e64f90e20a 100644 --- a/pkg/multicloud/aliyun/provider/provider.go +++ b/pkg/multicloud/aliyun/provider/provider.go @@ -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) } diff --git a/pkg/multicloud/aws/provider/provider.go b/pkg/multicloud/aws/provider/provider.go index 93e2a07204..5012ee2669 100644 --- a/pkg/multicloud/aws/provider/provider.go +++ b/pkg/multicloud/aws/provider/provider.go @@ -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() diff --git a/pkg/multicloud/azure/provider/provider.go b/pkg/multicloud/azure/provider/provider.go index 1bd4aee897..6e92a17e30 100644 --- a/pkg/multicloud/azure/provider/provider.go +++ b/pkg/multicloud/azure/provider/provider.go @@ -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) } diff --git a/pkg/multicloud/ctyun/provider/provider.go b/pkg/multicloud/ctyun/provider/provider.go index c0a54fb2b3..776e69e0a0 100644 --- a/pkg/multicloud/ctyun/provider/provider.go +++ b/pkg/multicloud/ctyun/provider/provider.go @@ -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() } diff --git a/pkg/multicloud/esxi/provider/provider.go b/pkg/multicloud/esxi/provider/provider.go index 66d94fa526..3e681ad2c9 100644 --- a/pkg/multicloud/esxi/provider/provider.go +++ b/pkg/multicloud/esxi/provider/provider.go @@ -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 } diff --git a/pkg/multicloud/google/globalnetwork.go b/pkg/multicloud/google/globalnetwork.go index bec584561f..7145deaf72 100644 --- a/pkg/multicloud/google/globalnetwork.go +++ b/pkg/multicloud/google/globalnetwork.go @@ -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 -} diff --git a/pkg/multicloud/google/google.go b/pkg/multicloud/google/google.go index 85983e48f2..981b28bee3 100644 --- a/pkg/multicloud/google/google.go +++ b/pkg/multicloud/google/google.go @@ -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++ { diff --git a/pkg/multicloud/google/host.go b/pkg/multicloud/google/host.go index 4b671df714..ead13b3d22 100644 --- a/pkg/multicloud/google/host.go +++ b/pkg/multicloud/google/host.go @@ -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 { diff --git a/pkg/multicloud/google/instance.go b/pkg/multicloud/google/instance.go index 693b9701e8..915bf73688 100644 --- a/pkg/multicloud/google/instance.go +++ b/pkg/multicloud/google/instance.go @@ -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()) } } diff --git a/pkg/multicloud/google/provider/provider.go b/pkg/multicloud/google/provider/provider.go index b92e255730..263831d45a 100644 --- a/pkg/multicloud/google/provider/provider.go +++ b/pkg/multicloud/google/provider/provider.go @@ -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) } diff --git a/pkg/multicloud/google/region.go b/pkg/multicloud/google/region.go index 76ec487495..d6c9cc290c 100644 --- a/pkg/multicloud/google/region.go +++ b/pkg/multicloud/google/region.go @@ -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 } diff --git a/pkg/multicloud/google/securitygroup.go b/pkg/multicloud/google/securitygroup.go index 90831fd174..d643c6c4f4 100644 --- a/pkg/multicloud/google/securitygroup.go +++ b/pkg/multicloud/google/securitygroup.go @@ -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 { diff --git a/pkg/multicloud/google/vpc.go b/pkg/multicloud/google/vpc.go index 4f26d6166e..01ce5a9786 100644 --- a/pkg/multicloud/google/vpc.go +++ b/pkg/multicloud/google/vpc.go @@ -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 } diff --git a/pkg/multicloud/google/wire.go b/pkg/multicloud/google/wire.go index 50c0d8944b..1cc7690963 100644 --- a/pkg/multicloud/google/wire.go +++ b/pkg/multicloud/google/wire.go @@ -88,7 +88,7 @@ func (wire *SWire) GetStatus() string { } func (wire *SWire) IsEmulated() bool { - return false + return true } func (wire *SWire) Refresh() error { diff --git a/pkg/multicloud/google/zone.go b/pkg/multicloud/google/zone.go index 9355328b24..4c44a715bb 100644 --- a/pkg/multicloud/google/zone.go +++ b/pkg/multicloud/google/zone.go @@ -110,7 +110,7 @@ func (zone *SZone) GetMetadata() *jsonutils.JSONDict { } func (zone *SZone) IsEmulated() bool { - return true + return false } func (zone *SZone) Refresh() error { diff --git a/pkg/multicloud/huawei/provider/provider.go b/pkg/multicloud/huawei/provider/provider.go index 275b3cabea..0d0c3f523d 100644 --- a/pkg/multicloud/huawei/provider/provider.go +++ b/pkg/multicloud/huawei/provider/provider.go @@ -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) } diff --git a/pkg/multicloud/objectstore/provider/provider.go b/pkg/multicloud/objectstore/provider/provider.go index 5e48ea6a9d..faaa0a901e 100644 --- a/pkg/multicloud/objectstore/provider/provider.go +++ b/pkg/multicloud/objectstore/provider/provider.go @@ -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 } diff --git a/pkg/multicloud/openstack/provider/provider.go b/pkg/multicloud/openstack/provider/provider.go index 923cafb436..b4648164ae 100644 --- a/pkg/multicloud/openstack/provider/provider.go +++ b/pkg/multicloud/openstack/provider/provider.go @@ -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) } diff --git a/pkg/multicloud/qcloud/provider/provider.go b/pkg/multicloud/qcloud/provider/provider.go index 02d238622b..4c83cec99c 100644 --- a/pkg/multicloud/qcloud/provider/provider.go +++ b/pkg/multicloud/qcloud/provider/provider.go @@ -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) } diff --git a/pkg/multicloud/ucloud/provider/provider.go b/pkg/multicloud/ucloud/provider/provider.go index 06627ed13f..78934ac1e4 100644 --- a/pkg/multicloud/ucloud/provider/provider.go +++ b/pkg/multicloud/ucloud/provider/provider.go @@ -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) } diff --git a/pkg/multicloud/vpc_base.go b/pkg/multicloud/vpc_base.go index e292f90a9c..474a1464f1 100644 --- a/pkg/multicloud/vpc_base.go +++ b/pkg/multicloud/vpc_base.go @@ -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 "" -} diff --git a/pkg/multicloud/zstack/provider/provider.go b/pkg/multicloud/zstack/provider/provider.go index 751f7278f5..f86e3fb85d 100644 --- a/pkg/multicloud/zstack/provider/provider.go +++ b/pkg/multicloud/zstack/provider/provider.go @@ -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) }