feature: capability of a cloudprovider in a region

This commit is contained in:
Qiu Jian
2020-03-13 22:45:00 +08:00
parent 9a3edfc6bf
commit ea73f5a9a4
25 changed files with 169 additions and 19 deletions
+2
View File
@@ -27,6 +27,8 @@ func init() {
type CloudproviderRegionListOptions struct {
options.BaseListOptions
Region string `help:"ID or Name of Host"`
Capability []string `help:"capability filter" choices:"project|compute|network|loadbalancer|objectstore|rds|cache|event"`
}
R(&CloudproviderRegionListOptions{}, "cloud-provider-region-list", "List cloudprovider region synchronization status", func(s *mcclient.ClientSession, args *CloudproviderRegionListOptions) error {
var params *jsonutils.JSONDict
+2
View File
@@ -35,6 +35,8 @@ func init() {
City string `help:"List regions in the specified city"`
Capability []string `help:"capability filter" choices:"project|compute|network|loadbalancer|objectstore|rds|cache|event"`
DistinctField string `help:"list the specified distinct field, e.g. city, region"`
}
R(&CloudregionListOptions{}, "cloud-region-list", "List cloud regions", func(s *mcclient.ClientSession, opts *CloudregionListOptions) error {
+8 -4
View File
@@ -14,6 +14,10 @@
package compute
import (
"yunion.io/x/onecloud/pkg/cloudprovider"
)
const (
CLOUD_PROVIDER_INIT = "init"
CLOUD_PROVIDER_CONNECTED = "connected"
@@ -91,11 +95,11 @@ var (
)
const (
CLOUD_ENV_PUBLIC_CLOUD = "public"
CLOUD_ENV_PRIVATE_CLOUD = "private"
CLOUD_ENV_ON_PREMISE = "onpremise"
CLOUD_ENV_PUBLIC_CLOUD = cloudprovider.CLOUD_ENV_PUBLIC_CLOUD
CLOUD_ENV_PRIVATE_CLOUD = cloudprovider.CLOUD_ENV_PRIVATE_CLOUD
CLOUD_ENV_ON_PREMISE = cloudprovider.CLOUD_ENV_ON_PREMISE
CLOUD_ENV_PRIVATE_ON_PREMISE = "private_or_onpremise"
CLOUD_ENV_PRIVATE_ON_PREMISE = cloudprovider.CLOUD_ENV_PRIVATE_ON_PREMISE
)
const (
+4
View File
@@ -38,6 +38,9 @@ type CloudproviderregionDetails struct {
// 自动同步周期
// example: 300
SyncIntervalSeconds int `json:"sync_interval_seconds"`
// 支持服务列表
Capabilities []string `json:"capabilities"`
}
type CloudproviderregionListInput struct {
@@ -45,6 +48,7 @@ type CloudproviderregionListInput struct {
SyncableBaseResourceListInput
RegionalFilterListInput
ManagedResourceListInput
CapabilityListInput
// 是否启用
Enabled *bool `json:"enabled"`
+4
View File
@@ -40,6 +40,10 @@ type CloudregionDetails struct {
SCloudregionUsage
SCloudregion
// 云类型, public, private or onpremise
// example: public
CloudEnv string `json:"cloud_env"`
}
type CloudregionResourceInfo struct {
+2
View File
@@ -77,6 +77,8 @@ type CloudregionListInput struct {
UsableResourceListInput
UsableVpcResourceListInput
CapabilityListInput
// 过滤位于指定城市的区域
City string `json:"city"`
// 过滤提供特定服务的区域
+14
View File
@@ -324,6 +324,20 @@ func GetOnPremiseProviders() []string {
return providers
}
func GetProviderCloudEnv(provider string) string {
p, err := GetProviderFactory(provider)
if err != nil {
return ""
}
if p.IsPublicCloud() {
return CLOUD_ENV_PUBLIC_CLOUD
}
if p.IsOnPremise() {
return CLOUD_ENV_ON_PREMISE
}
return CLOUD_ENV_PRIVATE_CLOUD
}
type baseProviderFactory struct {
}
+8
View File
@@ -50,3 +50,11 @@ const (
CLOUD_CAPABILITY_CACHE = "cache"
CLOUD_CAPABILITY_EVENT = "event"
)
const (
CLOUD_ENV_PUBLIC_CLOUD = "public"
CLOUD_ENV_PRIVATE_CLOUD = "private"
CLOUD_ENV_ON_PREMISE = "onpremise"
CLOUD_ENV_PRIVATE_ON_PREMISE = "private_or_onpremise"
)
+2
View File
@@ -136,6 +136,8 @@ type ICloudRegion interface {
GetProvider() string
GetICloudEvents(start time.Time, end time.Time, withReadEvent bool) ([]ICloudEvent, error) //获取公有云操作日志接口
GetCapabilities() []string
}
type ICloudZone interface {
+17 -3
View File
@@ -47,11 +47,16 @@ type SCloudproviderCapability struct {
db.SResourceBase
CloudproviderId string `width:"36" charset:"ascii" nullable:"false" primary:"true"`
CloudregionId string `width:"36" charset:"ascii" nullable:"false" default:"" primary:"true"`
Capability string `width:"18" charset:"ascii" nullable:"false" primary:"true"`
}
func (manager *SCloudproviderCapabilityManager) setCapabilities(ctx context.Context, userCred mcclient.TokenCredential, cloudproviderId string, capabilities []string) error {
oldCapabilities, err := manager.getCapabilities(cloudproviderId)
return manager.setRegionCapabilities(ctx, userCred, cloudproviderId, "", capabilities)
}
func (manager *SCloudproviderCapabilityManager) setRegionCapabilities(ctx context.Context, userCred mcclient.TokenCredential, cloudproviderId string, cloudregionId string, capabilities []string) error {
oldCapabilities, err := manager.getRegionCapabilities(cloudproviderId, cloudregionId)
if err != nil {
return errors.Wrap(err, "manager.getCapabilities")
}
@@ -61,6 +66,7 @@ func (manager *SCloudproviderCapabilityManager) setCapabilities(ctx context.Cont
cpc := SCloudproviderCapability{
CloudproviderId: cloudproviderId,
CloudregionId: cloudregionId,
}
cpc.SetModelManager(manager, &cpc)
@@ -82,7 +88,11 @@ func (manager *SCloudproviderCapabilityManager) setCapabilities(ctx context.Cont
}
func (manager *SCloudproviderCapabilityManager) getCapabilities(cloudproviderId string) ([]string, error) {
q := manager.Query().Equals("cloudprovider_id", cloudproviderId)
return manager.getRegionCapabilities(cloudproviderId, "")
}
func (manager *SCloudproviderCapabilityManager) getRegionCapabilities(cloudproviderId string, cloudregionId string) ([]string, error) {
q := manager.Query().Equals("cloudprovider_id", cloudproviderId).Equals("cloudregion_id", cloudregionId)
capabilities := make([]SCloudproviderCapability, 0)
err := db.FetchModelObjects(manager, q, &capabilities)
if err != nil {
@@ -97,5 +107,9 @@ func (manager *SCloudproviderCapabilityManager) getCapabilities(cloudproviderId
}
func (manager *SCloudproviderCapabilityManager) removeCapabilities(ctx context.Context, userCred mcclient.TokenCredential, cloudproviderId string) error {
return manager.setCapabilities(ctx, userCred, cloudproviderId, []string{})
return manager.removeRegionCapabilities(ctx, userCred, cloudproviderId, "")
}
func (manager *SCloudproviderCapabilityManager) removeRegionCapabilities(ctx context.Context, userCred mcclient.TokenCredential, cloudproviderId string, cloudregionId string) error {
return manager.setRegionCapabilities(ctx, userCred, cloudproviderId, cloudregionId, []string{})
}
@@ -147,6 +147,7 @@ func (manager *SCloudproviderregionManager) FetchCustomizeColumns(
for i := range rows {
rows[i].JointResourceBaseDetails = jointRows[i]
rows[i].CloudregionResourceInfo = regionRows[i]
rows[i].Capabilities, _ = objs[i].(*SCloudproviderregion).getCapabilities()
managerIds[i] = objs[i].(*SCloudproviderregion).CloudproviderId
}
@@ -521,6 +522,15 @@ func (manager *SCloudproviderregionManager) ListItemFilter(
}
}
if len(query.Capability) > 0 {
subq := CloudproviderCapabilityManager.Query().SubQuery()
q = q.Join(subq, sqlchemy.AND(
sqlchemy.Equals(q.Field("cloudprovider_id"), subq.Field("cloudprovider_id")),
sqlchemy.Equals(q.Field("cloudregion_id"), subq.Field("cloudregion_id")),
))
q = q.Filter(sqlchemy.In(subq.Field("capability"), query.Capability))
}
return q, nil
}
@@ -566,3 +576,15 @@ func (manager *SCloudproviderregionManager) QueryDistinctExtraField(q *sqlchemy.
return q, httperrors.ErrNotFound
}
func (cpr *SCloudproviderregion) setCapabilities(ctx context.Context, userCred mcclient.TokenCredential, capa []string) error {
return CloudproviderCapabilityManager.setRegionCapabilities(ctx, userCred, cpr.CloudproviderId, cpr.CloudregionId, capa)
}
func (cpr *SCloudproviderregion) removeCapabilities(ctx context.Context, userCred mcclient.TokenCredential) error {
return CloudproviderCapabilityManager.removeRegionCapabilities(ctx, userCred, cpr.CloudproviderId, cpr.CloudregionId)
}
func (cpr *SCloudproviderregion) getCapabilities() ([]string, error) {
return CloudproviderCapabilityManager.getRegionCapabilities(cpr.CloudproviderId, cpr.CloudregionId)
}
+1
View File
@@ -1154,6 +1154,7 @@ func (provider *SCloudprovider) prepareCloudproviderRegions(ctx context.Context,
}
if driver.GetFactory().IsOnPremise() {
cpr := CloudproviderRegionManager.FetchByIdsOrCreate(provider.Id, api.DEFAULT_REGION_ID)
cpr.setCapabilities(ctx, userCred, driver.GetCapabilities())
return []SCloudproviderregion{*cpr}, nil
}
iregions := driver.GetIRegions()
+27 -7
View File
@@ -65,10 +65,10 @@ type SCloudregion struct {
// 云环境
// example: ChinaCloud
Environment string `width:"32" charset:"ascii" list:"user" json:"environment"`
Environment string `width:"32" charset:"ascii" list:"user"`
// 云平台
// example: Huawei
Provider string `width:"64" charset:"ascii" list:"user" nullable:"false" default:"OneCloud" json:"provider"`
Provider string `width:"64" charset:"ascii" list:"user" nullable:"false" default:"OneCloud"`
}
func (manager *SCloudregionManager) AllowListItems(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) bool {
@@ -277,6 +277,7 @@ func (manager *SCloudregionManager) FetchCustomizeColumns(
rows[i] = api.CloudregionDetails{
EnabledStatusStandaloneResourceDetails: stdRows[i],
SCloudregionUsage: region.getUsage(),
CloudEnv: region.GetCloudEnv(),
}
}
return rows
@@ -376,6 +377,7 @@ func (manager *SCloudregionManager) SyncRegions(
} else {
syncMetadata(ctx, userCred, &commondb[i], commonext[i])
cpr := CloudproviderRegionManager.FetchByIdsOrCreate(cloudProvider.Id, commondb[i].Id)
cpr.setCapabilities(ctx, userCred, commonext[i].GetCapabilities())
cloudProviderRegions = append(cloudProviderRegions, *cpr)
localRegions = append(localRegions, commondb[i])
remoteRegions = append(remoteRegions, commonext[i])
@@ -389,6 +391,7 @@ func (manager *SCloudregionManager) SyncRegions(
} else {
syncMetadata(ctx, userCred, new, added[i])
cpr := CloudproviderRegionManager.FetchByIdsOrCreate(cloudProvider.Id, new.Id)
cpr.setCapabilities(ctx, userCred, added[i].GetCapabilities())
cloudProviderRegions = append(cloudProviderRegions, *cpr)
localRegions = append(localRegions, *new)
remoteRegions = append(remoteRegions, added[i])
@@ -415,6 +418,9 @@ func (self *SCloudregion) syncRemoveCloudRegion(ctx context.Context, userCred mc
cpr := CloudproviderRegionManager.FetchByIds(cloudProvider.Id, self.Id)
if cpr != nil {
err = cpr.Detach(ctx, userCred)
if err == nil {
err = cpr.removeCapabilities(ctx, userCred)
}
}
return err
@@ -541,16 +547,20 @@ func (manager *SCloudregionManager) InitializeData() error {
defRegion.Status = api.CLOUD_REGION_STATUS_INSERVER
defRegion.Provider = api.CLOUD_PROVIDER_ONECLOUD
err := manager.TableSpec().Insert(&defRegion)
return err
if err != nil {
return errors.Wrap(err, "insert default region")
}
} else {
return errors.Wrap(err, "fetch default region")
}
return err
}
if region := obj.(*SCloudregion); region.Provider != api.CLOUD_PROVIDER_ONECLOUD {
} else if region := obj.(*SCloudregion); region.Provider != api.CLOUD_PROVIDER_ONECLOUD {
_, err := db.Update(region, func() error {
region.Provider = api.CLOUD_PROVIDER_ONECLOUD
return nil
})
return err
if err != nil {
return errors.Wrap(err, "update default region provider")
}
}
return nil
}
@@ -767,6 +777,11 @@ func (manager *SCloudregionManager) ListItemFilter(
q = q.In("environment", query.Environment)
}
if len(query.Capability) > 0 {
subq := CloudproviderCapabilityManager.Query("cloudregion_id").In("capability", query.Capability).Distinct().SubQuery()
q = q.In("id", subq)
}
return q, nil
}
@@ -804,6 +819,7 @@ func (self *SCloudregion) getCloudaccounts() []SCloudaccount {
func (self *SCloudregion) GetRegionCloudenvInfo() api.CloudenvResourceInfo {
info := api.CloudenvResourceInfo{
CloudEnv: self.GetCloudEnv(),
Provider: self.Provider,
Environment: self.Environment,
}
@@ -871,3 +887,7 @@ func (self *SCloudregion) getMaxDataDiskCount() int {
func (manager *SCloudregionManager) FetchDefaultRegion() *SCloudregion {
return manager.FetchRegionById(api.DEFAULT_REGION_ID)
}
func (self *SCloudregion) GetCloudEnv() string {
return cloudprovider.GetProviderCloudEnv(self.Provider)
}
+4
View File
@@ -1123,3 +1123,7 @@ func (self *SRegion) GetIElasticcaches() ([]cloudprovider.ICloudElasticcache, er
return icaches, nil
}
func (region *SRegion) GetCapabilities() []string {
return region.client.GetCapabilities()
}
+4
View File
@@ -1091,3 +1091,7 @@ func (self *SRegion) CreateISecurityGroup(conf *cloudprovider.SecurityGroupCreat
}
return self.GetISecurityGroupById(groupId)
}
func (region *SRegion) GetCapabilities() []string {
return region.client.GetCapabilities()
}
+4
View File
@@ -685,3 +685,7 @@ func (region *SRegion) GetIBucketById(name string) (cloudprovider.ICloudBucket,
func (region *SRegion) GetIBucketByName(name string) (cloudprovider.ICloudBucket, error) {
return region.GetIBucketById(name)
}
func (region *SRegion) GetCapabilities() []string {
return region.client.GetCapabilities()
}
+4
View File
@@ -520,3 +520,7 @@ func (self *SRegion) GetInstanceFlavors() ([]FlavorObj, error) {
return ret, nil
}
func (region *SRegion) GetCapabilities() []string {
return region.client.GetCapabilities()
}
+10 -4
View File
@@ -133,17 +133,23 @@ func (self *SGoogleClient) fetchRegions() error {
regions[i].client = self
self.iregions = append(self.iregions, &regions[i])
}
objectstoreCapability := []string{
cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE,
}
for _, region := range MultiRegions {
_region := SRegion{
Name: region,
client: self,
Name: region,
client: self,
capabilities: objectstoreCapability,
}
self.iregions = append(self.iregions, &_region)
}
for _, region := range DualRegions {
_region := SRegion{
Name: region,
client: self,
Name: region,
client: self,
capabilities: objectstoreCapability,
}
self.iregions = append(self.iregions, &_region)
}
+9
View File
@@ -34,6 +34,8 @@ type SRegion struct {
multicloud.SRegion
client *SGoogleClient
capabilities []string
Description string
ID string
Kind string
@@ -626,3 +628,10 @@ func (region *SRegion) CreateEIP(args *cloudprovider.SEip) (cloudprovider.ICloud
}
return eip, nil
}
func (region *SRegion) GetCapabilities() []string {
if region.capabilities == nil {
return region.client.GetCapabilities()
}
return region.capabilities
}
+4
View File
@@ -1073,3 +1073,7 @@ func (self *SRegion) GetIElasticcaches() ([]cloudprovider.ICloudElasticcache, er
return icaches, nil
}
func (region *SRegion) GetCapabilities() []string {
return region.client.GetCapabilities()
}
+1 -1
View File
@@ -40,5 +40,5 @@ type IBucketProvider interface {
GetIBucketAcl(name string) (cloudprovider.TBucketACLType, error)
SetIBucketAcl(name string, cannedAcl cloudprovider.TBucketACLType) error
GetCapabilities() []string
// GetCapabilities() []string
}
+4
View File
@@ -534,3 +534,7 @@ func (region *SRegion) GetISecurityGroupByName(vpcId string, name string) (cloud
func (region *SRegion) CreateISecurityGroup(conf *cloudprovider.SecurityGroupCreateInput) (cloudprovider.ICloudSecurityGroup, error) {
return region.CreateSecurityGroup(conf.Name, conf.Desc)
}
func (region *SRegion) GetCapabilities() []string {
return region.client.GetCapabilities()
}
+4
View File
@@ -947,3 +947,7 @@ func (self *SRegion) GetISecurityGroupByName(vpcId string, name string) (cloudpr
func (self *SRegion) CreateISecurityGroup(conf *cloudprovider.SecurityGroupCreateInput) (cloudprovider.ICloudSecurityGroup, error) {
return self.CreateSecurityGroup(conf.Name, conf.Desc)
}
func (region *SRegion) GetCapabilities() []string {
return region.client.GetCapabilities()
}
+4
View File
@@ -751,3 +751,7 @@ func (region *SRegion) GetIBucketById(bucketId string) (cloudprovider.ICloudBuck
func (region *SRegion) GetIBucketByName(name string) (cloudprovider.ICloudBucket, error) {
return region.GetIBucketByName(name)
}
func (region *SRegion) GetCapabilities() []string {
return region.client.GetCapabilities()
}
+4
View File
@@ -401,3 +401,7 @@ func (region *SRegion) SyncSecurityGroup(secgroupId string, vpcId string, name s
}
return secgroupId, region.syncSecgroupRules(secgroupId, rules)
}
func (region *SRegion) GetCapabilities() []string {
return region.client.GetCapabilities()
}