mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-08-31 01:35:56 +08:00
Merge pull request #11861 from ioito/automated-cherry-pick-of-#11860-upstream-release-3.7
Automated cherry pick of #11860: feat: hcso sku sync
This commit is contained in:
@@ -323,6 +323,10 @@ func IsSupportRds(prod ICloudProvider) bool {
|
||||
return utils.IsInStringArray(CLOUD_CAPABILITY_RDS, prod.GetCapabilities())
|
||||
}
|
||||
|
||||
func IsSupportNAT(prod ICloudProvider) bool {
|
||||
return utils.IsInStringArray(CLOUD_CAPABILITY_NAT, prod.GetCapabilities())
|
||||
}
|
||||
|
||||
func IsSupportElasticCache(prod ICloudProvider) bool {
|
||||
return utils.IsInStringArray(CLOUD_CAPABILITY_CACHE, prod.GetCapabilities())
|
||||
}
|
||||
|
||||
@@ -125,6 +125,8 @@ type ICloudRegion interface {
|
||||
GetISkus() ([]ICloudSku, error)
|
||||
CreateISku(opts *SServerSkuCreateOption) (ICloudSku, error)
|
||||
|
||||
GetICloudNatSkus() ([]ICloudNatSku, error)
|
||||
|
||||
GetINetworkInterfaces() ([]ICloudNetworkInterface, error)
|
||||
|
||||
GetIBuckets() ([]ICloudBucket, error)
|
||||
@@ -138,6 +140,7 @@ type ICloudRegion interface {
|
||||
GetIDBInstanceById(instanceId string) (ICloudDBInstance, error)
|
||||
GetIDBInstanceBackups() ([]ICloudDBInstanceBackup, error)
|
||||
GetIDBInstanceBackupById(backupId string) (ICloudDBInstanceBackup, error)
|
||||
GetIDBInstanceSkus() ([]ICloudDBInstanceSku, error)
|
||||
|
||||
CreateIDBInstance(desc *SManagedDBInstanceCreateConfig) (ICloudDBInstance, error)
|
||||
|
||||
@@ -1278,3 +1281,34 @@ type ICloudAccessGroup interface {
|
||||
|
||||
Delete() error
|
||||
}
|
||||
|
||||
type ICloudDBInstanceSku interface {
|
||||
GetName() string
|
||||
GetGlobalId() string
|
||||
GetStatus() string
|
||||
GetEngine() string
|
||||
GetEngineVersion() string
|
||||
GetStorageType() string
|
||||
GetDiskSizeStep() int
|
||||
GetMaxDiskSizeGb() int
|
||||
GetMinDiskSizeGb() int
|
||||
GetIOPS() int
|
||||
GetTPS() int
|
||||
GetQPS() int
|
||||
GetMaxConnections() int
|
||||
GetVcpuCount() int
|
||||
GetVmemSizeMb() int
|
||||
GetCategory() string
|
||||
GetZone1Id() string
|
||||
GetZone2Id() string
|
||||
GetZone3Id() string
|
||||
GetZoneId() string
|
||||
}
|
||||
|
||||
type ICloudNatSku interface {
|
||||
GetName() string
|
||||
GetDesc() string
|
||||
GetGlobalId() string
|
||||
GetPrepaidStatus() string
|
||||
GetPostpaidStatus() string
|
||||
}
|
||||
|
||||
@@ -900,6 +900,48 @@ func syncRegionDBInstances(ctx context.Context, userCred mcclient.TokenCredentia
|
||||
}
|
||||
}
|
||||
|
||||
func syncDBInstanceSkus(ctx context.Context, userCred mcclient.TokenCredential, syncResults SSyncResultSet, provider *SCloudprovider, localRegion *SCloudregion, remoteRegion cloudprovider.ICloudRegion, syncRange *SSyncRange) {
|
||||
skus, err := remoteRegion.GetIDBInstanceSkus()
|
||||
if err != nil {
|
||||
if errors.Cause(err) == cloudprovider.ErrNotImplemented {
|
||||
return
|
||||
}
|
||||
msg := fmt.Sprintf("GetIDBInstanceSkus for region %s failed %s", remoteRegion.GetName(), err)
|
||||
log.Errorf(msg)
|
||||
return
|
||||
}
|
||||
result := localRegion.SyncDBInstanceSkus(ctx, userCred, provider, skus)
|
||||
|
||||
syncResults.Add(DBInstanceSkuManager, result)
|
||||
|
||||
msg := result.Result()
|
||||
log.Infof("SyncDBInstanceSkus for region %s result: %s", localRegion.Name, msg)
|
||||
if result.IsError() {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func syncNATSkus(ctx context.Context, userCred mcclient.TokenCredential, syncResults SSyncResultSet, provider *SCloudprovider, localRegion *SCloudregion, remoteRegion cloudprovider.ICloudRegion, syncRange *SSyncRange) {
|
||||
skus, err := remoteRegion.GetICloudNatSkus()
|
||||
if err != nil {
|
||||
if errors.Cause(err) == cloudprovider.ErrNotImplemented {
|
||||
return
|
||||
}
|
||||
msg := fmt.Sprintf("GetINatSkus for region %s failed %s", remoteRegion.GetName(), err)
|
||||
log.Errorf(msg)
|
||||
return
|
||||
}
|
||||
result := localRegion.SyncPrivateCloudNatSkus(ctx, userCred, skus)
|
||||
|
||||
syncResults.Add(NasSkuManager, result)
|
||||
|
||||
msg := result.Result()
|
||||
log.Infof("SyncNasSkus for region %s result: %s", localRegion.Name, msg)
|
||||
if result.IsError() {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func syncDBInstanceResource(ctx context.Context, userCred mcclient.TokenCredential, syncResults SSyncResultSet, localInstance *SDBInstance, remoteInstance cloudprovider.ICloudDBInstance) {
|
||||
err := syncDBInstanceNetwork(ctx, userCred, syncResults, localInstance, remoteInstance)
|
||||
if err != nil {
|
||||
@@ -1199,6 +1241,12 @@ func syncPublicCloudProviderInfo(
|
||||
SyncRegionNasSkus(ctx, userCred, localRegion.Id, true)
|
||||
} else {
|
||||
syncSkusFromPrivateCloud(ctx, userCred, syncResults, localRegion, remoteRegion)
|
||||
if cloudprovider.IsSupportRds(driver) {
|
||||
syncDBInstanceSkus(ctx, userCred, syncResults, provider, localRegion, remoteRegion, syncRange)
|
||||
}
|
||||
if cloudprovider.IsSupportNAT(driver) {
|
||||
syncNATSkus(ctx, userCred, syncResults, provider, localRegion, remoteRegion, syncRange)
|
||||
}
|
||||
}
|
||||
|
||||
// no need to lock public cloud region as cloud region for public cloud is readonly
|
||||
|
||||
@@ -23,6 +23,7 @@ import (
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
"yunion.io/x/pkg/errors"
|
||||
"yunion.io/x/pkg/tristate"
|
||||
"yunion.io/x/pkg/util/compare"
|
||||
"yunion.io/x/pkg/utils"
|
||||
"yunion.io/x/sqlchemy"
|
||||
@@ -692,3 +693,108 @@ func (manager *SDBInstanceSkuManager) AllowGetPropertySyncTasks(ctx context.Cont
|
||||
func (manager *SDBInstanceSkuManager) GetPropertySyncTasks(ctx context.Context, userCred mcclient.TokenCredential, query api.SkuTaskQueryInput) (jsonutils.JSONObject, error) {
|
||||
return GetPropertySkusSyncTasks(ctx, userCred, query)
|
||||
}
|
||||
|
||||
func (self *SCloudregion) GetDBInstanceSkus() ([]SDBInstanceSku, error) {
|
||||
q := DBInstanceSkuManager.Query().Equals("cloudregion_id", self.Id)
|
||||
skus := []SDBInstanceSku{}
|
||||
err := db.FetchModelObjects(DBInstanceSkuManager, q, &skus)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "db.FetchModelObjects")
|
||||
}
|
||||
return skus, nil
|
||||
}
|
||||
|
||||
func (self *SCloudregion) SyncDBInstanceSkus(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, exts []cloudprovider.ICloudDBInstanceSku) compare.SyncResult {
|
||||
lockman.LockRawObject(ctx, DBInstanceSkuManager.Keyword(), self.Id)
|
||||
defer lockman.ReleaseRawObject(ctx, DBInstanceSkuManager.Keyword(), self.Id)
|
||||
|
||||
result := compare.SyncResult{}
|
||||
dbSkus, err := self.GetDBInstanceSkus()
|
||||
if err != nil {
|
||||
result.Error(err)
|
||||
return result
|
||||
}
|
||||
|
||||
removed := make([]SDBInstanceSku, 0)
|
||||
commondb := make([]SDBInstanceSku, 0)
|
||||
commonext := make([]cloudprovider.ICloudDBInstanceSku, 0)
|
||||
added := make([]cloudprovider.ICloudDBInstanceSku, 0)
|
||||
|
||||
err = compare.CompareSets(dbSkus, exts, &removed, &commondb, &commonext, &added)
|
||||
if err != nil {
|
||||
result.Error(err)
|
||||
return result
|
||||
}
|
||||
|
||||
for i := 0; i < len(removed); i += 1 {
|
||||
err = removed[i].Delete(ctx, userCred)
|
||||
if err != nil {
|
||||
result.DeleteError(err)
|
||||
continue
|
||||
}
|
||||
result.Delete()
|
||||
}
|
||||
for i := 0; i < len(added); i += 1 {
|
||||
err = self.newFromCloudSku(ctx, userCred, added[i])
|
||||
if err != nil {
|
||||
result.AddError(err)
|
||||
continue
|
||||
}
|
||||
result.Add()
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func (self *SCloudregion) newFromCloudSku(ctx context.Context, userCred mcclient.TokenCredential, ext cloudprovider.ICloudDBInstanceSku) error {
|
||||
sku := &SDBInstanceSku{}
|
||||
sku.SetModelManager(DBInstanceSkuManager, sku)
|
||||
sku.Name = ext.GetName()
|
||||
sku.Status = ext.GetStatus()
|
||||
sku.CloudregionId = self.Id
|
||||
sku.Enabled = tristate.True
|
||||
sku.ExternalId = ext.GetGlobalId()
|
||||
sku.Engine = ext.GetEngine()
|
||||
sku.EngineVersion = ext.GetEngineVersion()
|
||||
sku.StorageType = ext.GetStorageType()
|
||||
sku.DiskSizeStep = ext.GetDiskSizeStep()
|
||||
sku.MaxDiskSizeGb = ext.GetMaxDiskSizeGb()
|
||||
sku.MinDiskSizeGb = ext.GetMinDiskSizeGb()
|
||||
sku.IOPS = ext.GetIOPS()
|
||||
sku.TPS = ext.GetTPS()
|
||||
sku.QPS = ext.GetQPS()
|
||||
sku.MaxConnections = ext.GetMaxConnections()
|
||||
sku.VcpuCount = ext.GetVcpuCount()
|
||||
sku.VmemSizeMb = ext.GetVmemSizeMb()
|
||||
sku.Category = ext.GetCategory()
|
||||
sku.ZoneId = ext.GetZoneId()
|
||||
sku.Provider = self.Provider
|
||||
zones, _ := self.GetZones()
|
||||
if zone1 := ext.GetZone1Id(); len(zone1) > 0 {
|
||||
for _, zone := range zones {
|
||||
if strings.HasSuffix(zone.ExternalId, zone1) {
|
||||
sku.Zone1 = zone.Id
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if zone2 := ext.GetZone2Id(); len(zone2) > 0 {
|
||||
for _, zone := range zones {
|
||||
if strings.HasSuffix(zone.ExternalId, zone2) {
|
||||
sku.Zone2 = zone.Id
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if zone3 := ext.GetZone3Id(); len(zone3) > 0 {
|
||||
for _, zone := range zones {
|
||||
if strings.HasSuffix(zone.ExternalId, zone3) {
|
||||
sku.Zone3 = zone.Id
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return DBInstanceSkuManager.TableSpec().Insert(ctx, sku)
|
||||
}
|
||||
|
||||
@@ -23,12 +23,14 @@ import (
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
"yunion.io/x/pkg/errors"
|
||||
"yunion.io/x/pkg/tristate"
|
||||
"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/cloudprovider"
|
||||
"yunion.io/x/onecloud/pkg/httperrors"
|
||||
"yunion.io/x/onecloud/pkg/mcclient"
|
||||
"yunion.io/x/onecloud/pkg/util/stringutils2"
|
||||
@@ -331,3 +333,60 @@ func (manager *SNatSkuManager) AllowGetPropertySyncTasks(ctx context.Context, us
|
||||
func (manager *SNatSkuManager) GetPropertySyncTasks(ctx context.Context, userCred mcclient.TokenCredential, query api.SkuTaskQueryInput) (jsonutils.JSONObject, error) {
|
||||
return GetPropertySkusSyncTasks(ctx, userCred, query)
|
||||
}
|
||||
|
||||
func (self *SCloudregion) SyncPrivateCloudNatSkus(ctx context.Context, userCred mcclient.TokenCredential, iskus []cloudprovider.ICloudNatSku) compare.SyncResult {
|
||||
lockman.LockRawObject(ctx, self.Id, NatSkuManager.Keyword())
|
||||
defer lockman.ReleaseRawObject(ctx, self.Id, NatSkuManager.Keyword())
|
||||
|
||||
result := compare.SyncResult{}
|
||||
|
||||
dbSkus, err := self.GetNatSkus()
|
||||
if err != nil {
|
||||
result.Error(err)
|
||||
return result
|
||||
}
|
||||
|
||||
removed := make([]SNatSku, 0)
|
||||
commondb := make([]SNatSku, 0)
|
||||
commonext := make([]cloudprovider.ICloudNatSku, 0)
|
||||
added := make([]cloudprovider.ICloudNatSku, 0)
|
||||
|
||||
err = compare.CompareSets(dbSkus, iskus, &removed, &commondb, &commonext, &added)
|
||||
if err != nil {
|
||||
result.Error(err)
|
||||
return result
|
||||
}
|
||||
|
||||
for i := 0; i < len(removed); i += 1 {
|
||||
err = removed[i].Delete(ctx, userCred)
|
||||
if err != nil {
|
||||
result.DeleteError(err)
|
||||
continue
|
||||
}
|
||||
result.Delete()
|
||||
}
|
||||
for i := 0; i < len(added); i += 1 {
|
||||
err = self.newFromPrivateCloudNatSku(ctx, userCred, added[i])
|
||||
if err != nil {
|
||||
result.AddError(err)
|
||||
} else {
|
||||
result.Add()
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func (self *SCloudregion) newFromPrivateCloudNatSku(ctx context.Context, userCred mcclient.TokenCredential, ext cloudprovider.ICloudNatSku) error {
|
||||
sku := &SNasSku{}
|
||||
sku.SetModelManager(NatSkuManager, sku)
|
||||
sku.Name = ext.GetName()
|
||||
sku.Description = ext.GetDesc()
|
||||
sku.ExternalId = ext.GetGlobalId()
|
||||
sku.CloudregionId = self.Id
|
||||
sku.Provider = self.Provider
|
||||
sku.PrepaidStatus = ext.GetPrepaidStatus()
|
||||
sku.PostpaidStatus = ext.GetPostpaidStatus()
|
||||
sku.Enabled = tristate.True
|
||||
sku.Status = api.NAT_SKU_AVAILABLE
|
||||
return NatSkuManager.TableSpec().Insert(ctx, sku)
|
||||
}
|
||||
|
||||
@@ -77,6 +77,8 @@ type Client struct {
|
||||
DBInstance *modules.SDBInstanceManager
|
||||
DBInstanceBackup *modules.SDBInstanceBackupManager
|
||||
DBInstanceFlavor *modules.SDBInstanceFlavorManager
|
||||
DBInstanceDatastore *modules.SDBInstanceDatastoreManager
|
||||
DBInstanceStorage *modules.SDBInstanceStorageManager
|
||||
DBInstanceJob *modules.SDBInstanceJobManager
|
||||
Traces *modules.STraceManager
|
||||
CloudEye *modules.SCloudEyeManager
|
||||
@@ -258,6 +260,8 @@ func (self *Client) initManagers() {
|
||||
self.DBInstance = modules.NewDBInstanceManager(self.cfg)
|
||||
self.DBInstanceBackup = modules.NewDBInstanceBackupManager(self.cfg)
|
||||
self.DBInstanceFlavor = modules.NewDBInstanceFlavorManager(self.cfg)
|
||||
self.DBInstanceStorage = modules.NewDBInstanceStorageManager(self.cfg)
|
||||
self.DBInstanceDatastore = modules.NewDBInstanceDatastoreManager(self.cfg)
|
||||
self.DBInstanceJob = modules.NewDBInstanceJobManager(self.cfg)
|
||||
self.Traces = modules.NewTraceManager(self.cfg)
|
||||
self.CloudEye = modules.NewCloudEyeManager(self.cfg)
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
// 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/multicloud/huaweistack/client/manager"
|
||||
)
|
||||
|
||||
type SDBInstanceDatastoreManager struct {
|
||||
SResourceManager
|
||||
}
|
||||
|
||||
func NewDBInstanceDatastoreManager(cfg manager.IManagerConfig) *SDBInstanceDatastoreManager {
|
||||
return &SDBInstanceDatastoreManager{SResourceManager: SResourceManager{
|
||||
SBaseManager: NewBaseManager(cfg),
|
||||
ServiceName: ServiceNameRDS,
|
||||
Region: cfg.GetRegionId(),
|
||||
ProjectId: cfg.GetProjectId(),
|
||||
version: "v3",
|
||||
Keyword: "dataStore",
|
||||
KeywordPlural: "dataStores",
|
||||
|
||||
ResourceKeyword: "datastores",
|
||||
}}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
// 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/multicloud/huaweistack/client/manager"
|
||||
)
|
||||
|
||||
type SDBInstanceStorageManager struct {
|
||||
SResourceManager
|
||||
}
|
||||
|
||||
func NewDBInstanceStorageManager(cfg manager.IManagerConfig) *SDBInstanceStorageManager {
|
||||
return &SDBInstanceStorageManager{SResourceManager: SResourceManager{
|
||||
SBaseManager: NewBaseManager(cfg),
|
||||
ServiceName: ServiceNameRDS,
|
||||
Region: cfg.GetRegionId(),
|
||||
ProjectId: cfg.GetProjectId(),
|
||||
version: "v3",
|
||||
Keyword: "",
|
||||
KeywordPlural: "storage_type",
|
||||
|
||||
ResourceKeyword: "storage-type",
|
||||
}}
|
||||
}
|
||||
@@ -602,22 +602,6 @@ func (region *SRegion) RebootDBInstance(instanceId string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
type SDBInstanceFlavor struct {
|
||||
Vcpus int
|
||||
Ram int //单位GB
|
||||
SpecCode string
|
||||
InstanceMode string //实例模型
|
||||
}
|
||||
|
||||
func (region *SRegion) GetDBInstanceFlavors(engine string, version string) ([]SDBInstanceFlavor, error) {
|
||||
flavors := []SDBInstanceFlavor{}
|
||||
resp, err := region.ecsClient.DBInstanceFlavor.ListInContextWithSpec(nil, engine, map[string]string{"version_name": version}, "flavors")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return flavors, jsonutils.Update(&flavors, resp.Data)
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) CreateAccount(conf *cloudprovider.SDBInstanceAccountCreateConfig) error {
|
||||
return rds.region.CreateDBInstanceAccount(rds.Id, conf.Name, conf.Password)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,263 @@
|
||||
// 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 huaweistack
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/pkg/errors"
|
||||
|
||||
api "yunion.io/x/onecloud/pkg/apis/compute"
|
||||
"yunion.io/x/onecloud/pkg/cloudprovider"
|
||||
)
|
||||
|
||||
type SDBInstanceSku struct {
|
||||
Vcpus int
|
||||
Ram int //单位GB
|
||||
SpecCode string
|
||||
InstanceMode string //实例模型
|
||||
|
||||
StorageType string
|
||||
Az1 string
|
||||
Az2 string
|
||||
Engine string
|
||||
EngineVersion string
|
||||
}
|
||||
|
||||
func (self *SDBInstanceSku) GetName() string {
|
||||
return self.SpecCode
|
||||
}
|
||||
|
||||
func (self *SDBInstanceSku) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s-%s-%s-%s-%s-%s", self.Engine, self.EngineVersion, self.InstanceMode, self.SpecCode, self.StorageType, self.GetZoneId())
|
||||
}
|
||||
|
||||
func (self *SDBInstanceSku) GetCategory() string {
|
||||
return self.InstanceMode
|
||||
}
|
||||
|
||||
func (self *SDBInstanceSku) GetDiskSizeStep() int {
|
||||
return 10
|
||||
}
|
||||
|
||||
func (self *SDBInstanceSku) GetIOPS() int {
|
||||
return 0
|
||||
}
|
||||
|
||||
func (self *SDBInstanceSku) GetTPS() int {
|
||||
return 0
|
||||
}
|
||||
|
||||
func (self *SDBInstanceSku) GetZone1Id() string {
|
||||
return self.Az1
|
||||
}
|
||||
|
||||
func (self *SDBInstanceSku) GetZone2Id() string {
|
||||
return self.Az2
|
||||
}
|
||||
|
||||
func (self *SDBInstanceSku) GetZone3Id() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (self *SDBInstanceSku) GetZoneId() string {
|
||||
zones := []string{}
|
||||
for _, zone := range []string{self.Az1, self.Az2} {
|
||||
if len(zone) > 0 {
|
||||
zones = append(zones, zone)
|
||||
}
|
||||
}
|
||||
return strings.Join(zones, ",")
|
||||
}
|
||||
|
||||
func (self *SDBInstanceSku) GetMaxConnections() int {
|
||||
return 0
|
||||
}
|
||||
|
||||
func (self *SDBInstanceSku) GetMaxDiskSizeGb() int {
|
||||
return 4000
|
||||
}
|
||||
|
||||
func (self *SDBInstanceSku) GetMinDiskSizeGb() int {
|
||||
return 40
|
||||
}
|
||||
|
||||
func (self *SDBInstanceSku) GetVcpuCount() int {
|
||||
return self.Vcpus
|
||||
}
|
||||
|
||||
func (self *SDBInstanceSku) GetVmemSizeMb() int {
|
||||
return self.Ram * 1024
|
||||
}
|
||||
|
||||
func (self *SDBInstanceSku) GetStorageType() string {
|
||||
return self.StorageType
|
||||
}
|
||||
|
||||
func (sku *SDBInstanceSku) GetEngine() string {
|
||||
return sku.Engine
|
||||
}
|
||||
|
||||
func (sku *SDBInstanceSku) GetEngineVersion() string {
|
||||
return sku.EngineVersion
|
||||
}
|
||||
|
||||
func (self *SDBInstanceSku) GetStatus() string {
|
||||
return api.DBINSTANCE_SKU_AVAILABLE
|
||||
}
|
||||
|
||||
func (sku *SDBInstanceSku) GetQPS() int {
|
||||
return 0
|
||||
}
|
||||
|
||||
type SDBInstanceFlavor struct {
|
||||
Vcpus int
|
||||
Ram int //单位GB
|
||||
SpecCode string
|
||||
InstanceMode string //实例模型
|
||||
|
||||
StorageType string
|
||||
AzStatus map[string]string
|
||||
Engine string
|
||||
EngineVersion string
|
||||
}
|
||||
|
||||
func (self *SDBInstanceFlavor) GetISkus() []cloudprovider.ICloudDBInstanceSku {
|
||||
ret := []cloudprovider.ICloudDBInstanceSku{}
|
||||
switch self.InstanceMode {
|
||||
case api.HUAWEI_DBINSTANCE_CATEGORY_HA:
|
||||
for az1, status1 := range self.AzStatus {
|
||||
if status1 != "normal" {
|
||||
continue
|
||||
}
|
||||
for az2, status2 := range self.AzStatus {
|
||||
if status2 != "normal" {
|
||||
continue
|
||||
}
|
||||
sku := &SDBInstanceSku{
|
||||
Vcpus: self.Vcpus,
|
||||
Ram: self.Ram,
|
||||
SpecCode: self.SpecCode,
|
||||
InstanceMode: self.InstanceMode,
|
||||
StorageType: self.StorageType,
|
||||
Az1: az1,
|
||||
Az2: az2,
|
||||
Engine: self.Engine,
|
||||
EngineVersion: self.EngineVersion,
|
||||
}
|
||||
ret = append(ret, sku)
|
||||
}
|
||||
}
|
||||
case api.HUAWEI_DBINSTANCE_CATEGORY_SINGLE:
|
||||
for az, status := range self.AzStatus {
|
||||
if status != "normal" {
|
||||
continue
|
||||
}
|
||||
sku := &SDBInstanceSku{
|
||||
Vcpus: self.Vcpus,
|
||||
Ram: self.Ram,
|
||||
SpecCode: self.SpecCode,
|
||||
InstanceMode: self.InstanceMode,
|
||||
StorageType: self.StorageType,
|
||||
Az1: az,
|
||||
Engine: self.Engine,
|
||||
EngineVersion: self.EngineVersion,
|
||||
}
|
||||
ret = append(ret, sku)
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func (self *SRegion) GetIDBInstanceSkus() ([]cloudprovider.ICloudDBInstanceSku, error) {
|
||||
skus, err := self.GetDBInstanceSkus()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ret := []cloudprovider.ICloudDBInstanceSku{}
|
||||
for i := range skus {
|
||||
ret = append(ret, skus[i].GetISkus()...)
|
||||
}
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
type SDBInstanceDatastore struct {
|
||||
Id string
|
||||
Name string
|
||||
}
|
||||
|
||||
func (self *SRegion) GetDBInstanceSkus() ([]SDBInstanceFlavor, error) {
|
||||
skus := []SDBInstanceFlavor{}
|
||||
for _, engine := range []string{api.DBINSTANCE_TYPE_MYSQL, api.DBINSTANCE_TYPE_POSTGRESQL, api.DBINSTANCE_TYPE_SQLSERVER} {
|
||||
stores, err := self.GetDBInstanceDatastores(engine)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for _, version := range stores {
|
||||
storages, err := self.GetDBInstanceStorages(engine, version.Name)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "GetDBInstanceStorages(%s,%s)", engine, version.Name)
|
||||
}
|
||||
flavors, err := self.GetDBInstanceFlavors(engine, version.Name)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "GetDBInstanceFlavors(%s, %s)", engine, version.Name)
|
||||
}
|
||||
for i := range flavors {
|
||||
flavors[i].Engine = engine
|
||||
flavors[i].EngineVersion = version.Name
|
||||
for j := range storages {
|
||||
flavors[i].StorageType = storages[j].Name
|
||||
flavors[i].AzStatus = storages[j].AzStatus
|
||||
skus = append(skus, flavors[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return skus, nil
|
||||
}
|
||||
|
||||
func (region *SRegion) GetDBInstanceFlavors(engine string, version string) ([]SDBInstanceFlavor, error) {
|
||||
flavors := []SDBInstanceFlavor{}
|
||||
resp, err := region.ecsClient.DBInstanceFlavor.ListInContextWithSpec(nil, engine, map[string]string{"version_name": version}, "flavors")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return flavors, jsonutils.Update(&flavors, resp.Data)
|
||||
}
|
||||
|
||||
func (region *SRegion) GetDBInstanceDatastores(engine string) ([]SDBInstanceDatastore, error) {
|
||||
stores := []SDBInstanceDatastore{}
|
||||
resp, err := region.ecsClient.DBInstanceDatastore.ListInContextWithSpec(nil, engine, nil, region.ecsClient.DBInstanceDatastore.KeywordPlural)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return stores, jsonutils.Update(&stores, resp.Data)
|
||||
}
|
||||
|
||||
type SDBInstanceStorage struct {
|
||||
Name string
|
||||
AzStatus map[string]string
|
||||
}
|
||||
|
||||
func (region *SRegion) GetDBInstanceStorages(engine, engineVersion string) ([]SDBInstanceStorage, error) {
|
||||
storages := []SDBInstanceStorage{}
|
||||
resp, err := region.ecsClient.DBInstanceStorage.ListInContextWithSpec(nil, engine, map[string]string{"version_name": engineVersion}, region.ecsClient.DBInstanceStorage.KeywordPlural)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return storages, jsonutils.Update(&storages, resp.Data)
|
||||
}
|
||||
@@ -111,6 +111,7 @@ func NewHuaweiClient(cfg *HuaweiClientConfig) (*SHuaweiClient, error) {
|
||||
client := SHuaweiClient{
|
||||
HuaweiClientConfig: cfg,
|
||||
}
|
||||
|
||||
err := client.init()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
// 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 huaweistack
|
||||
|
||||
import (
|
||||
api "yunion.io/x/onecloud/pkg/apis/compute"
|
||||
"yunion.io/x/onecloud/pkg/cloudprovider"
|
||||
)
|
||||
|
||||
const (
|
||||
HUAWEI_NAT_SKU_SMALL = "Small"
|
||||
HUAWEI_NAT_SKU_MIDDLE = "Middle"
|
||||
HUAWEI_NAT_SKU_LARGE = "Large"
|
||||
HUAWEI_NAT_SKU_XLARGE = "XLarge"
|
||||
)
|
||||
|
||||
type SNatSku struct {
|
||||
spec string
|
||||
}
|
||||
|
||||
func (self *SNatSku) GetName() string {
|
||||
return self.spec
|
||||
}
|
||||
|
||||
func (self *SNatSku) GetPps() int {
|
||||
return 1000000
|
||||
}
|
||||
|
||||
func (self *SNatSku) GetConns() int {
|
||||
switch self.spec {
|
||||
case HUAWEI_NAT_SKU_SMALL:
|
||||
return 10000
|
||||
case HUAWEI_NAT_SKU_MIDDLE:
|
||||
return 50000
|
||||
case HUAWEI_NAT_SKU_LARGE:
|
||||
return 200000
|
||||
case HUAWEI_NAT_SKU_XLARGE:
|
||||
return 1000000
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (self *SNatSku) GetThroughput() int {
|
||||
return 10
|
||||
}
|
||||
|
||||
func (self *SNatSku) GetDesc() string {
|
||||
switch self.spec {
|
||||
case HUAWEI_NAT_SKU_SMALL:
|
||||
return "小型"
|
||||
case HUAWEI_NAT_SKU_MIDDLE:
|
||||
return "中型"
|
||||
case HUAWEI_NAT_SKU_LARGE:
|
||||
return "大型"
|
||||
case HUAWEI_NAT_SKU_XLARGE:
|
||||
return "超大型"
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (self *SNatSku) GetPostpaidStatus() string {
|
||||
return api.NAT_SKU_AVAILABLE
|
||||
}
|
||||
|
||||
func (self *SNatSku) GetPrepaidStatus() string {
|
||||
return api.NAT_SKU_SOLDOUT
|
||||
}
|
||||
|
||||
func (self *SNatSku) GetGlobalId() string {
|
||||
return self.spec
|
||||
}
|
||||
|
||||
func (self *SRegion) GetICloudNatSkus() ([]cloudprovider.ICloudNatSku, error) {
|
||||
ret := []cloudprovider.ICloudNatSku{}
|
||||
for _, spec := range []string{
|
||||
HUAWEI_NAT_SKU_SMALL,
|
||||
HUAWEI_NAT_SKU_MIDDLE,
|
||||
HUAWEI_NAT_SKU_LARGE,
|
||||
HUAWEI_NAT_SKU_XLARGE,
|
||||
} {
|
||||
sku := &SNatSku{spec: spec}
|
||||
ret = append(ret, sku)
|
||||
}
|
||||
return ret, nil
|
||||
}
|
||||
@@ -29,7 +29,7 @@ import (
|
||||
)
|
||||
|
||||
type SHuaweiCloudStackProviderFactory struct {
|
||||
cloudprovider.SPublicCloudBaseProviderFactory
|
||||
cloudprovider.SPrivateCloudBaseProviderFactory
|
||||
}
|
||||
|
||||
func (self *SHuaweiCloudStackProviderFactory) GetId() string {
|
||||
@@ -212,15 +212,7 @@ func (self *SHuaweiCloudStackProvider) GetIRegionById(extId string) (cloudprovid
|
||||
}
|
||||
|
||||
func (self *SHuaweiCloudStackProvider) GetBalance() (float64, string, error) {
|
||||
balance, err := self.client.QueryAccountBalance()
|
||||
if err != nil {
|
||||
return 0.0, api.CLOUD_PROVIDER_HEALTH_UNKNOWN, err
|
||||
}
|
||||
status := api.CLOUD_PROVIDER_HEALTH_NORMAL
|
||||
if balance.AvailableAmount < 0.0 && balance.CreditAmount < 0.0 {
|
||||
status = api.CLOUD_PROVIDER_HEALTH_ARREARS
|
||||
}
|
||||
return balance.AvailableAmount, status, nil
|
||||
return 0.0, api.CLOUD_PROVIDER_HEALTH_NORMAL, nil
|
||||
}
|
||||
|
||||
func (self *SHuaweiCloudStackProvider) GetSubAccounts() ([]cloudprovider.SSubAccount, error) {
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
// 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 shell
|
||||
|
||||
import (
|
||||
huawei "yunion.io/x/onecloud/pkg/multicloud/huaweistack"
|
||||
"yunion.io/x/onecloud/pkg/util/shellutils"
|
||||
)
|
||||
|
||||
func init() {
|
||||
type DBInstanceDatastoreOptions struct {
|
||||
ENGINE string `help:"DBInstance Engine" choices:"MySQL|PostgreSQL|SQLServer"`
|
||||
}
|
||||
|
||||
shellutils.R(&DBInstanceDatastoreOptions{}, "dbinstance-datastore-list", "List dbinstance datastores", func(cli *huawei.SRegion, args *DBInstanceDatastoreOptions) error {
|
||||
stores, err := cli.GetDBInstanceDatastores(args.ENGINE)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
printList(stores, 0, 0, 0, nil)
|
||||
return nil
|
||||
})
|
||||
|
||||
type DBInstanceSkuListOptions struct {
|
||||
}
|
||||
|
||||
shellutils.R(&DBInstanceSkuListOptions{}, "dbinstance-sku-list", "List dbinstance datastores", func(cli *huawei.SRegion, args *DBInstanceSkuListOptions) error {
|
||||
skus, err := cli.GetDBInstanceSkus()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
printList(skus, 0, 0, 0, nil)
|
||||
return nil
|
||||
})
|
||||
|
||||
}
|
||||
@@ -174,3 +174,11 @@ func (self *SRegion) CreateICloudAccessGroup(opts *cloudprovider.SAccessGroup) (
|
||||
func (self *SRegion) CreateICloudFileSystem(opts *cloudprovider.FileSystemCraeteOptions) (cloudprovider.ICloudFileSystem, error) {
|
||||
return nil, errors.Wrapf(cloudprovider.ErrNotImplemented, "CreateICloudFileSystem")
|
||||
}
|
||||
|
||||
func (self *SRegion) GetIDBInstanceSkus() ([]cloudprovider.ICloudDBInstanceSku, error) {
|
||||
return nil, errors.Wrapf(cloudprovider.ErrNotImplemented, "GetIDBInstanceSkus")
|
||||
}
|
||||
|
||||
func (self *SRegion) GetICloudNatSkus() ([]cloudprovider.ICloudNatSku, error) {
|
||||
return nil, errors.Wrapf(cloudprovider.ErrNotImplemented, "GetICloudNatSkus")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user