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:
Zexi Li
2021-08-11 11:29:51 +08:00
committed by GitHub
15 changed files with 748 additions and 26 deletions
+4
View File
@@ -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())
}
+34
View File
@@ -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
}
+48
View File
@@ -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
+106
View File
@@ -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)
}
+59
View File
@@ -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",
}}
}
-16
View File
@@ -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)
}
+1
View File
@@ -111,6 +111,7 @@ func NewHuaweiClient(cfg *HuaweiClientConfig) (*SHuaweiClient, error) {
client := SHuaweiClient{
HuaweiClientConfig: cfg,
}
err := client.init()
if err != nil {
return nil, err
+97
View File
@@ -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
})
}
+8
View File
@@ -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")
}