mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-10-16 06:57:44 +08:00
fix(region): cloudregion&zone add namei18n
This commit is contained in:
@@ -0,0 +1,291 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"golang.org/x/text/language"
|
||||
|
||||
"yunion.io/x/log"
|
||||
"yunion.io/x/pkg/util/compare"
|
||||
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db/lockman"
|
||||
"yunion.io/x/onecloud/pkg/i18n"
|
||||
"yunion.io/x/onecloud/pkg/mcclient"
|
||||
)
|
||||
|
||||
type IModelI18nBase interface {
|
||||
GetKeyValue() string
|
||||
Lookup(tag i18n.Tag) string
|
||||
}
|
||||
|
||||
type IModelI18nEntry interface {
|
||||
IModelI18nBase
|
||||
GetGlobalId() string
|
||||
GetObjType() string
|
||||
GetObjId() string
|
||||
GetKeyName() string
|
||||
}
|
||||
|
||||
type IModelI18nTable interface {
|
||||
GetI18nEntries() map[string]IModelI18nEntry
|
||||
}
|
||||
|
||||
type SModelI18nEntry struct {
|
||||
model IModel
|
||||
i18nEntry IModelI18nBase
|
||||
modelKeyName string
|
||||
}
|
||||
|
||||
func NewSModelI18nEntry(keyName string, model IModel, i18nEntry IModelI18nBase) *SModelI18nEntry {
|
||||
return &SModelI18nEntry{model: model, modelKeyName: keyName, i18nEntry: i18nEntry}
|
||||
}
|
||||
|
||||
func (self *SModelI18nEntry) GetObjType() string {
|
||||
return self.model.Keyword()
|
||||
}
|
||||
|
||||
func (self *SModelI18nEntry) GetObjId() string {
|
||||
return self.model.GetId()
|
||||
}
|
||||
|
||||
func (self *SModelI18nEntry) GetKeyName() string {
|
||||
return self.modelKeyName
|
||||
}
|
||||
|
||||
func (self *SModelI18nEntry) GetKeyValue() string {
|
||||
return self.i18nEntry.GetKeyValue()
|
||||
}
|
||||
|
||||
func (self *SModelI18nEntry) Lookup(tag i18n.Tag) string {
|
||||
return self.i18nEntry.Lookup(tag)
|
||||
}
|
||||
|
||||
func (self *SModelI18nEntry) GetGlobalId() string {
|
||||
return self.model.Keyword() + "::" + self.model.GetId() + "::" + self.modelKeyName
|
||||
}
|
||||
|
||||
type SModelI18nTable struct {
|
||||
i18nEntires []IModelI18nEntry
|
||||
}
|
||||
|
||||
func NewSModelI18nTable(i18nEntires []IModelI18nEntry) *SModelI18nTable {
|
||||
return &SModelI18nTable{i18nEntires: i18nEntires}
|
||||
}
|
||||
|
||||
func (t *SModelI18nTable) GetI18nEntries() map[string]IModelI18nEntry {
|
||||
ret := make(map[string]IModelI18nEntry, 0)
|
||||
for i := range t.i18nEntires {
|
||||
entry := t.i18nEntires[i]
|
||||
ret[entry.GetKeyValue()] = entry
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
type SI18nManager struct {
|
||||
SStandaloneAnonResourceBaseManager
|
||||
}
|
||||
|
||||
type SI18n struct {
|
||||
SStandaloneAnonResourceBase
|
||||
|
||||
// 资源类型
|
||||
// example: network
|
||||
ObjType string `width:"40" charset:"ascii" index:"true" list:"user" get:"user"`
|
||||
|
||||
// 资源ID
|
||||
// example: 87321a70-1ecb-422a-8b0c-c9aa632a46a7
|
||||
ObjId string `width:"88" charset:"ascii" index:"true" list:"user" get:"user"`
|
||||
|
||||
// 资源KEY
|
||||
// exmaple: name
|
||||
KeyName string `width:"64" charset:"utf8" primary:"true" list:"user" get:"user"`
|
||||
|
||||
// 资源原始值
|
||||
// example: 技术部
|
||||
KeyValue string `charset:"utf8" list:"user" get:"user"`
|
||||
|
||||
// KeyValue 对应中文翻译
|
||||
Cn string `charset:"utf8" list:"user" get:"user" update:"admin_required" update:"admin"`
|
||||
|
||||
// KeyValue 对应英文翻译
|
||||
En string `charset:"utf8" list:"user" get:"user" update:"admin_required" update:"admin"`
|
||||
}
|
||||
|
||||
var I18nManager *SI18nManager
|
||||
|
||||
func init() {
|
||||
I18nManager = &SI18nManager{
|
||||
SStandaloneAnonResourceBaseManager: NewStandaloneAnonResourceBaseManager(
|
||||
SI18n{},
|
||||
"i18n_tbl",
|
||||
"i18n",
|
||||
"i18ns",
|
||||
),
|
||||
}
|
||||
I18nManager.SetVirtualObject(I18nManager)
|
||||
}
|
||||
|
||||
var tableLangSupported = []language.Tag{
|
||||
language.English,
|
||||
language.Chinese,
|
||||
}
|
||||
var tableLangMatcher = language.NewMatcher(tableLangSupported)
|
||||
|
||||
func tableLangMatch(tag language.Tag) language.Tag {
|
||||
_, i, _ := tableLangMatcher.Match(tag)
|
||||
return tableLangSupported[i]
|
||||
}
|
||||
|
||||
func (manager *SModelBaseManager) GetModelI18N(ctx context.Context, model IModel) ([]SI18n, error) {
|
||||
ret := []SI18n{}
|
||||
q := manager.Query().Equals("obj_type", model.Keyword()).Equals("obj_id", model.GetId())
|
||||
err := FetchModelObjects(manager, q, &ret)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "FetchModelObjects")
|
||||
}
|
||||
|
||||
return ret, err
|
||||
}
|
||||
|
||||
func (manager *SI18nManager) getExternalI18nItems(ctx context.Context, table IModelI18nTable) []IModelI18nEntry {
|
||||
ret := make([]IModelI18nEntry, 0)
|
||||
items := table.GetI18nEntries()
|
||||
for k, _ := range items {
|
||||
ret = append(ret, items[k])
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func (manager *SI18nManager) RemoveI18ns(ctx context.Context, userCred mcclient.TokenCredential, model IModel) error {
|
||||
dbItems := []SI18n{}
|
||||
err := manager.Query().Equals("obj_type", model.Keyword()).Equals("obj_id", model.GetId()).All(&dbItems)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for i := 0; i < len(dbItems); i += 1 {
|
||||
err = dbItems[i].removeI18n(ctx, userCred)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (manager *SI18nManager) SyncI18ns(ctx context.Context, userCred mcclient.TokenCredential, model IModel, table IModelI18nTable) ([]SI18n, []IModelI18nEntry, compare.SyncResult) {
|
||||
lockman.LockClass(ctx, manager, "")
|
||||
defer lockman.ReleaseClass(ctx, manager, "")
|
||||
syncResult := compare.SyncResult{}
|
||||
|
||||
extItems := manager.getExternalI18nItems(ctx, table)
|
||||
dbItems := make([]SI18n, 0)
|
||||
q := manager.Query().Equals("obj_type", model.Keyword()).Equals("obj_id", model.GetId())
|
||||
err := FetchModelObjects(manager, q, &dbItems)
|
||||
if err != nil {
|
||||
syncResult.Error(err)
|
||||
return nil, nil, syncResult
|
||||
}
|
||||
|
||||
removed := make([]SI18n, 0)
|
||||
commondb := make([]SI18n, 0)
|
||||
commonext := make([]IModelI18nEntry, 0)
|
||||
added := make([]IModelI18nEntry, 0)
|
||||
|
||||
err = compare.CompareSets(dbItems, extItems, &removed, &commondb, &commonext, &added)
|
||||
if err != nil {
|
||||
syncResult.Error(err)
|
||||
return nil, nil, syncResult
|
||||
}
|
||||
|
||||
for i := 0; i < len(removed); i += 1 {
|
||||
err = removed[i].removeI18n(ctx, userCred)
|
||||
if err != nil {
|
||||
syncResult.DeleteError(err)
|
||||
} else {
|
||||
syncResult.Delete()
|
||||
}
|
||||
}
|
||||
|
||||
locals := make([]SI18n, 0)
|
||||
remotes := make([]IModelI18nEntry, 0)
|
||||
for i := 0; i < len(commondb); i += 1 {
|
||||
err = commondb[i].updateFromI18n(ctx, userCred, commonext[i])
|
||||
if err != nil {
|
||||
syncResult.UpdateError(err)
|
||||
} else {
|
||||
locals = append(locals, commondb[i])
|
||||
remotes = append(remotes, commonext[i])
|
||||
syncResult.Update()
|
||||
}
|
||||
}
|
||||
for i := 0; i < len(added); i += 1 {
|
||||
new, err := manager.newFromI18n(ctx, userCred, added[i])
|
||||
if err != nil {
|
||||
syncResult.AddError(err)
|
||||
} else {
|
||||
locals = append(locals, *new)
|
||||
remotes = append(remotes, added[i])
|
||||
syncResult.Add()
|
||||
}
|
||||
}
|
||||
|
||||
return locals, remotes, syncResult
|
||||
}
|
||||
|
||||
func (manager *SI18nManager) newFromI18n(ctx context.Context, userCred mcclient.TokenCredential, entry IModelI18nEntry) (*SI18n, error) {
|
||||
in := SI18n{}
|
||||
in.SetModelManager(manager, &in)
|
||||
|
||||
in.ObjId = entry.GetObjId()
|
||||
in.ObjType = entry.GetObjType()
|
||||
in.KeyName = entry.GetKeyName()
|
||||
in.KeyValue = entry.GetKeyValue()
|
||||
in.Cn = entry.Lookup(i18n.I18N_TAG_CHINESE)
|
||||
in.En = entry.Lookup(i18n.I18N_TAG_ENGLISH)
|
||||
|
||||
err := manager.TableSpec().Insert(ctx, &in)
|
||||
if err != nil {
|
||||
log.Infof("newFromI18n fail %s", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &in, nil
|
||||
}
|
||||
|
||||
func (self *SI18n) updateFromI18n(ctx context.Context, userCred mcclient.TokenCredential, entry IModelI18nEntry) error {
|
||||
_, err := UpdateWithLock(ctx, self, func() error {
|
||||
self.KeyValue = entry.GetKeyValue()
|
||||
self.Cn = entry.Lookup(i18n.I18N_TAG_CHINESE)
|
||||
self.En = entry.Lookup(i18n.I18N_TAG_ENGLISH)
|
||||
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
log.Infof("updateFromI18n error %s", err)
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *SI18n) removeI18n(ctx context.Context, userCred mcclient.TokenCredential) error {
|
||||
lockman.LockObject(ctx, self)
|
||||
defer lockman.ReleaseObject(ctx, self)
|
||||
|
||||
err := self.Delete(ctx, userCred)
|
||||
return err
|
||||
}
|
||||
|
||||
func (self SI18n) GetExternalId() string {
|
||||
return self.ObjType + "::" + self.ObjId + "::" + self.KeyName
|
||||
}
|
||||
|
||||
func (self *SI18n) Lookup(ctx context.Context) string {
|
||||
entry := i18n.NewTableEntry().CN(self.Cn).EN(self.En)
|
||||
v, _ := entry.Lookup(ctx)
|
||||
return v
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package cloudprovider
|
||||
|
||||
import (
|
||||
"yunion.io/x/onecloud/pkg/i18n"
|
||||
)
|
||||
|
||||
type SModelI18nEntry struct {
|
||||
Value string
|
||||
valueI18n map[i18n.Tag]string
|
||||
}
|
||||
|
||||
func NewSModelI18nEntry(value string) *SModelI18nEntry {
|
||||
vn := make(map[i18n.Tag]string, 0)
|
||||
return &SModelI18nEntry{Value: value, valueI18n: vn}
|
||||
}
|
||||
|
||||
func (self *SModelI18nEntry) GetKeyValue() string {
|
||||
return self.Value
|
||||
}
|
||||
|
||||
func (self *SModelI18nEntry) Lookup(tag i18n.Tag) string {
|
||||
if v, ok := self.valueI18n[tag]; ok {
|
||||
return v
|
||||
}
|
||||
|
||||
return self.Value
|
||||
}
|
||||
|
||||
func (self *SModelI18nEntry) CN(v string) *SModelI18nEntry {
|
||||
self.valueI18n[i18n.I18N_TAG_CHINESE] = v
|
||||
return self
|
||||
}
|
||||
|
||||
func (self *SModelI18nEntry) EN(v string) *SModelI18nEntry {
|
||||
self.valueI18n[i18n.I18N_TAG_ENGLISH] = v
|
||||
return self
|
||||
}
|
||||
|
||||
type SModelI18nTable map[string]*SModelI18nEntry
|
||||
@@ -59,8 +59,13 @@ type IBillingResource interface {
|
||||
IsAutoRenew() bool
|
||||
}
|
||||
|
||||
type ICloudI18nResource interface {
|
||||
GetI18n() SModelI18nTable
|
||||
}
|
||||
|
||||
type ICloudRegion interface {
|
||||
ICloudResource
|
||||
ICloudI18nResource
|
||||
|
||||
// GetLatitude() float32
|
||||
// GetLongitude() float32
|
||||
@@ -152,6 +157,7 @@ type ICloudRegion interface {
|
||||
|
||||
type ICloudZone interface {
|
||||
ICloudResource
|
||||
ICloudI18nResource
|
||||
|
||||
GetIRegion() ICloudRegion
|
||||
|
||||
|
||||
@@ -96,7 +96,7 @@ func (manager *SCloudregionResourceBaseManager) FetchCustomizeColumns(
|
||||
}
|
||||
for i := range rows {
|
||||
if region, ok := regions[regionIds[i]]; ok {
|
||||
rows[i] = region.GetRegionInfo()
|
||||
rows[i] = region.GetRegionInfo(ctx)
|
||||
} else {
|
||||
rows[i] = api.CloudregionResourceInfo{}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@ import (
|
||||
type SCloudregionManager struct {
|
||||
db.SEnabledStatusStandaloneResourceBaseManager
|
||||
db.SExternalizedResourceBaseManager
|
||||
SI18nResourceBaseManager
|
||||
}
|
||||
|
||||
var CloudregionManager *SCloudregionManager
|
||||
@@ -59,6 +60,7 @@ func init() {
|
||||
|
||||
type SCloudregion struct {
|
||||
db.SEnabledStatusStandaloneResourceBase
|
||||
SI18nResourceBase
|
||||
SManagedResourceBase
|
||||
db.SExternalizedResourceBase
|
||||
|
||||
@@ -445,12 +447,17 @@ func (self *SCloudregion) syncRemoveCloudRegion(ctx context.Context, userCred mc
|
||||
lockman.LockObject(ctx, self)
|
||||
defer lockman.ReleaseObject(ctx, self)
|
||||
|
||||
err := self.RemoveI18ns(ctx, userCred, self)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// err := self.ValidateDeleteCondition(ctx)
|
||||
// if err == nil {
|
||||
// err = self.Delete(ctx, userCred)
|
||||
// }
|
||||
|
||||
err := self.SetStatus(userCred, api.CLOUD_REGION_STATUS_OUTOFSERVICE, "Out of sync")
|
||||
err = self.SetStatus(userCred, api.CLOUD_REGION_STATUS_OUTOFSERVICE, "Out of sync")
|
||||
if err == nil {
|
||||
_, err = self.PerformDisable(ctx, userCred, nil, apis.PerformDisableInput{})
|
||||
}
|
||||
@@ -467,6 +474,11 @@ func (self *SCloudregion) syncRemoveCloudRegion(ctx context.Context, userCred mc
|
||||
}
|
||||
|
||||
func (self *SCloudregion) syncWithCloudRegion(ctx context.Context, userCred mcclient.TokenCredential, cloudRegion cloudprovider.ICloudRegion, provider *SCloudprovider) error {
|
||||
err := CloudregionManager.SyncI18ns(ctx, userCred, self, cloudRegion.GetI18n())
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "SyncI18ns")
|
||||
}
|
||||
|
||||
factory, err := provider.GetProviderFactory()
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -529,6 +541,12 @@ func (manager *SCloudregionManager) newFromCloudRegion(ctx context.Context, user
|
||||
log.Errorf("newFromCloudRegion fail %s", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = manager.SyncI18ns(ctx, userCred, ®ion, cloudRegion.GetI18n())
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "SyncI18ns")
|
||||
}
|
||||
|
||||
db.OpsLog.LogEvent(®ion, db.ACT_CREATE, region.GetShortDesc(ctx), userCred)
|
||||
return ®ion, nil
|
||||
}
|
||||
@@ -872,7 +890,12 @@ func (self *SCloudregion) GetRegionCloudenvInfo() api.CloudenvResourceInfo {
|
||||
return info
|
||||
}
|
||||
|
||||
func (self *SCloudregion) GetRegionInfo() api.CloudregionResourceInfo {
|
||||
func (self *SCloudregion) GetI18N(ctx context.Context) *jsonutils.JSONDict {
|
||||
return self.GetModelI18N(ctx, self)
|
||||
}
|
||||
|
||||
func (self *SCloudregion) GetRegionInfo(ctx context.Context) api.CloudregionResourceInfo {
|
||||
// name := self.nameI18nLookup(ctx)
|
||||
return api.CloudregionResourceInfo{
|
||||
Region: self.Name,
|
||||
Cloudregion: self.Name,
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
"yunion.io/x/pkg/errors"
|
||||
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db"
|
||||
"yunion.io/x/onecloud/pkg/cloudprovider"
|
||||
"yunion.io/x/onecloud/pkg/mcclient"
|
||||
)
|
||||
|
||||
type SI18nResourceBase struct {
|
||||
}
|
||||
|
||||
type SI18nResourceBaseManager struct {
|
||||
}
|
||||
|
||||
func (man *SI18nResourceBaseManager) getSModelI18nTable(model db.IModel, table cloudprovider.SModelI18nTable) *db.SModelI18nTable {
|
||||
entries := make([]db.IModelI18nEntry, 0)
|
||||
for k, _ := range table {
|
||||
entries = append(entries, db.NewSModelI18nEntry(k, model, table[k]))
|
||||
}
|
||||
|
||||
return db.NewSModelI18nTable(entries)
|
||||
}
|
||||
|
||||
func (man *SI18nResourceBaseManager) SyncI18ns(ctx context.Context, userCred mcclient.TokenCredential, model db.IModel, table cloudprovider.SModelI18nTable) error {
|
||||
itable := man.getSModelI18nTable(model, table)
|
||||
_, _, r := db.I18nManager.SyncI18ns(ctx, userCred, model, itable)
|
||||
if r.IsError() {
|
||||
log.Infof("SyncI18ns for %s %s result: %s", model.Keyword(), model.GetId(), r.Result())
|
||||
return errors.Wrap(r.AllError(), "SyncI18ns")
|
||||
}
|
||||
|
||||
log.Debugf("SyncI18ns for %s %s result: %s", model.Keyword(), model.GetId(), r.Result())
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *SI18nResourceBase) RemoveI18ns(ctx context.Context, userCred mcclient.TokenCredential, model db.IModel) error {
|
||||
err := db.I18nManager.RemoveI18ns(ctx, userCred, model)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "RemoveI18ns")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *SI18nResourceBase) GetModelI18N(ctx context.Context, model db.IModel) *jsonutils.JSONDict {
|
||||
entries, err := db.I18nManager.GetModelI18N(ctx, model)
|
||||
if err != nil {
|
||||
log.Infof("GetI18N %s", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
_i18n := jsonutils.NewDict()
|
||||
for i := range entries {
|
||||
_i18n.Set(entries[i].KeyName, jsonutils.NewString(entries[i].Lookup(ctx)))
|
||||
}
|
||||
|
||||
return _i18n
|
||||
}
|
||||
@@ -1168,6 +1168,7 @@ func (manager *SServerSkuManager) newPublicCloudSku(ctx context.Context, userCre
|
||||
func (self *SServerSku) syncWithCloudSku(ctx context.Context, userCred mcclient.TokenCredential, extSku SServerSku) error {
|
||||
_, err := db.Update(self, func() error {
|
||||
self.ZoneId = extSku.ZoneId
|
||||
self.InstanceTypeCategory = extSku.InstanceTypeCategory
|
||||
self.PrepaidStatus = extSku.PrepaidStatus
|
||||
self.PostpaidStatus = extSku.PostpaidStatus
|
||||
self.SysDiskType = extSku.SysDiskType
|
||||
|
||||
@@ -39,6 +39,7 @@ import (
|
||||
type SZoneManager struct {
|
||||
db.SStatusStandaloneResourceBaseManager
|
||||
db.SExternalizedResourceBaseManager
|
||||
SI18nResourceBaseManager
|
||||
SCloudregionResourceBaseManager
|
||||
}
|
||||
|
||||
@@ -60,6 +61,7 @@ func init() {
|
||||
type SZone struct {
|
||||
db.SStatusStandaloneResourceBase
|
||||
db.SExternalizedResourceBase
|
||||
SI18nResourceBase
|
||||
SCloudregionResourceBase `width:"36" charset:"ascii" nullable:"false" list:"user" create:"admin_required"`
|
||||
|
||||
Location string `width:"256" charset:"utf8" get:"user" list:"user" update:"admin"`
|
||||
@@ -184,6 +186,10 @@ func (zone *SZone) GetCloudRegionId() string {
|
||||
}
|
||||
}
|
||||
|
||||
func (zone *SZone) GetI18N(ctx context.Context) *jsonutils.JSONDict {
|
||||
return zone.GetModelI18N(ctx, zone)
|
||||
}
|
||||
|
||||
func (manager *SZoneManager) SyncZones(ctx context.Context, userCred mcclient.TokenCredential, region *SCloudregion, zones []cloudprovider.ICloudZone) ([]SZone, []cloudprovider.ICloudZone, compare.SyncResult) {
|
||||
lockman.LockClass(ctx, manager, db.GetLockClassKey(manager, userCred))
|
||||
defer lockman.ReleaseClass(ctx, manager, db.GetLockClassKey(manager, userCred))
|
||||
@@ -247,7 +253,12 @@ func (self *SZone) syncRemoveCloudZone(ctx context.Context, userCred mcclient.To
|
||||
lockman.LockObject(ctx, self)
|
||||
defer lockman.ReleaseObject(ctx, self)
|
||||
|
||||
err := self.ValidateDeleteCondition(ctx)
|
||||
err := self.RemoveI18ns(ctx, userCred, self)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = self.ValidateDeleteCondition(ctx)
|
||||
if err != nil { // cannot delete
|
||||
err = self.SetStatus(userCred, api.ZONE_DISABLE, "sync to delete")
|
||||
} else {
|
||||
@@ -257,12 +268,16 @@ func (self *SZone) syncRemoveCloudZone(ctx context.Context, userCred mcclient.To
|
||||
}
|
||||
|
||||
func (self *SZone) syncWithCloudZone(ctx context.Context, userCred mcclient.TokenCredential, extZone cloudprovider.ICloudZone, region *SCloudregion) error {
|
||||
err := ZoneManager.SyncI18ns(ctx, userCred, self, extZone.GetI18n())
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "SyncI18ns")
|
||||
}
|
||||
|
||||
diff, err := db.UpdateWithLock(ctx, self, func() error {
|
||||
self.Name = extZone.GetName()
|
||||
self.Status = extZone.GetStatus()
|
||||
|
||||
self.IsEmulated = extZone.IsEmulated()
|
||||
|
||||
self.CloudregionId = region.Id
|
||||
|
||||
return nil
|
||||
@@ -296,6 +311,12 @@ func (manager *SZoneManager) newFromCloudZone(ctx context.Context, userCred mccl
|
||||
log.Errorf("newFromCloudZone fail %s", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = manager.SyncI18ns(ctx, userCred, &zone, extZone.GetI18n())
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "SyncI18ns")
|
||||
}
|
||||
|
||||
db.OpsLog.LogEvent(&zone, db.ACT_CREATE, zone.GetShortDesc(ctx), userCred)
|
||||
return &zone, nil
|
||||
}
|
||||
|
||||
@@ -57,6 +57,7 @@ func InitHandlers(app *appsrv.Application) {
|
||||
db.UserCacheManager,
|
||||
db.TenantCacheManager,
|
||||
db.SharedResourceManager,
|
||||
db.I18nManager,
|
||||
models.GuestcdromManager,
|
||||
models.NetInterfaceManager,
|
||||
models.VCenterManager,
|
||||
|
||||
@@ -7,10 +7,11 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
)
|
||||
|
||||
const (
|
||||
|
||||
@@ -4,6 +4,7 @@ package api
|
||||
|
||||
import (
|
||||
context "context"
|
||||
|
||||
grpc "google.golang.org/grpc"
|
||||
codes "google.golang.org/grpc/codes"
|
||||
status "google.golang.org/grpc/status"
|
||||
|
||||
@@ -6,6 +6,13 @@ import (
|
||||
"golang.org/x/text/language"
|
||||
)
|
||||
|
||||
type Tag = language.Tag
|
||||
|
||||
var (
|
||||
I18N_TAG_CHINESE Tag = Tag(language.Chinese)
|
||||
I18N_TAG_ENGLISH Tag = Tag(language.English)
|
||||
)
|
||||
|
||||
type ITable interface {
|
||||
Lookup(ctx context.Context, key string) string
|
||||
}
|
||||
@@ -27,6 +34,14 @@ func (te TableEntry) EN(v string) TableEntry {
|
||||
return te
|
||||
}
|
||||
|
||||
func (te TableEntry) Lookup(ctx context.Context) (string, bool) {
|
||||
lang := Lang(ctx)
|
||||
lang = tableLangMatch(lang)
|
||||
|
||||
v, ok := te[lang]
|
||||
return v, ok
|
||||
}
|
||||
|
||||
func (tbl Table) Set(k string, te TableEntry) {
|
||||
tbl[k] = te
|
||||
}
|
||||
@@ -41,11 +56,13 @@ func (tbl Table) LookupByLang(lang language.Tag, key string) string {
|
||||
if !ok {
|
||||
return key
|
||||
}
|
||||
|
||||
lang = tableLangMatch(lang)
|
||||
v, ok := te[lang]
|
||||
if !ok {
|
||||
return key
|
||||
}
|
||||
|
||||
return v
|
||||
}
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ const (
|
||||
|
||||
CLOUD_PROVIDER_ALIYUN = api.CLOUD_PROVIDER_ALIYUN
|
||||
CLOUD_PROVIDER_ALIYUN_CN = "阿里云"
|
||||
CLOUD_PROVIDER_ALIYUN_EN = "Aliyun"
|
||||
|
||||
ALIYUN_DEFAULT_REGION = "cn-hangzhou"
|
||||
|
||||
|
||||
@@ -244,6 +244,13 @@ func (self *SRegion) GetName() string {
|
||||
}
|
||||
}
|
||||
|
||||
func (self *SRegion) GetI18n() cloudprovider.SModelI18nTable {
|
||||
en := fmt.Sprintf("%s %s", CLOUD_PROVIDER_ALIYUN_EN, self.LocalName)
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(self.GetName()).CN(self.GetName()).EN(en)
|
||||
return table
|
||||
}
|
||||
|
||||
func (self *SRegion) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s/%s", self.client.GetAccessEnv(), self.RegionId)
|
||||
}
|
||||
|
||||
@@ -152,6 +152,12 @@ func (self *SZone) GetName() string {
|
||||
}
|
||||
}
|
||||
|
||||
func (self *SZone) GetI18n() cloudprovider.SModelI18nTable {
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(self.GetName()).CN(self.GetName())
|
||||
return table
|
||||
}
|
||||
|
||||
func (self *SZone) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s/%s", self.region.GetGlobalId(), self.ZoneId)
|
||||
}
|
||||
|
||||
@@ -39,6 +39,7 @@ import (
|
||||
const (
|
||||
CLOUD_PROVIDER_APSARA = api.CLOUD_PROVIDER_APSARA
|
||||
CLOUD_PROVIDER_APSARA_CN = "阿里云专有云"
|
||||
CLOUD_PROVIDER_APSARA_EN = "Aliyun Apsara"
|
||||
|
||||
APSARA_API_VERSION = "2014-05-26"
|
||||
APSARA_API_VERSION_VPC = "2016-04-28"
|
||||
|
||||
@@ -173,6 +173,13 @@ func (self *SRegion) GetName() string {
|
||||
}
|
||||
}
|
||||
|
||||
func (self *SRegion) GetI18n() cloudprovider.SModelI18nTable {
|
||||
en := fmt.Sprintf("%s %s", CLOUD_PROVIDER_APSARA_EN, self.LocalName)
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(self.GetName()).CN(self.GetName()).EN(en)
|
||||
return table
|
||||
}
|
||||
|
||||
func (self *SRegion) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s/%s", CLOUD_PROVIDER_APSARA, self.RegionId)
|
||||
}
|
||||
|
||||
@@ -139,6 +139,13 @@ func (self *SZone) GetName() string {
|
||||
return fmt.Sprintf("%s %s", CLOUD_PROVIDER_APSARA_CN, self.LocalName)
|
||||
}
|
||||
|
||||
func (self *SZone) GetI18n() cloudprovider.SModelI18nTable {
|
||||
en := fmt.Sprintf("%s %s", CLOUD_PROVIDER_APSARA_EN, self.LocalName)
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(self.GetName()).CN(self.GetName()).EN(en)
|
||||
return table
|
||||
}
|
||||
|
||||
func (self *SZone) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s/%s", self.region.GetGlobalId(), self.ZoneId)
|
||||
}
|
||||
|
||||
@@ -43,6 +43,7 @@ import (
|
||||
const (
|
||||
CLOUD_PROVIDER_AWS = api.CLOUD_PROVIDER_AWS
|
||||
CLOUD_PROVIDER_AWS_CN = "AWS"
|
||||
CLOUD_PROVIDER_AWS_EN = "AWS"
|
||||
|
||||
AWS_INTERNATIONAL_CLOUDENV = "InternationalCloud"
|
||||
AWS_CHINA_CLOUDENV = "ChinaCloud"
|
||||
|
||||
@@ -73,6 +73,33 @@ var RegionLocations = map[string]string{
|
||||
"us-gov-east-1": "AWS GovCloud(美国东部)",
|
||||
}
|
||||
|
||||
var RegionLocationsEN = map[string]string{
|
||||
"us-east-1": "US East (N. Virginia)",
|
||||
"us-east-2": "US East (Ohio)",
|
||||
"us-west-1": "US West (N. California)",
|
||||
"us-west-2": "US West (Oregon)",
|
||||
"af-south-1": "Cape Town",
|
||||
"ap-east-1": "Asia Pacific (Hong Kong)",
|
||||
"ap-south-1": "Asia Pacific (Mumbai)",
|
||||
"ap-northeast-2": "Asia Pacific (Seoul)",
|
||||
"ap-southeast-1": "Asia Pacific (Singapore)",
|
||||
"ap-southeast-2": "Asia Pacific (Sydney)",
|
||||
"ap-northeast-1": "Asia Pacific (Tokyo)",
|
||||
"ca-central-1": "Canada (Central)",
|
||||
"eu-central-1": "Europe (Frankfurt)",
|
||||
"eu-west-1": "Europe (Ireland)",
|
||||
"eu-west-2": "Europe (London)",
|
||||
"eu-south-1": "Europe (Milan)",
|
||||
"eu-west-3": "Europe (Paris)",
|
||||
"eu-north-1": "Europe (Stockholm)",
|
||||
"me-south-1": "Middle East (Bahrain)",
|
||||
"sa-east-1": "South America (São Paulo)",
|
||||
"cn-north-1": "China (Beijing)",
|
||||
"cn-northwest-1": "China (Ninxia)",
|
||||
"us-gov-west-1": "AWS GovCloud(US West)",
|
||||
"us-gov-east-1": "AWS GovCloud(US East)",
|
||||
}
|
||||
|
||||
const (
|
||||
RDS_SERVICE_NAME = "rds"
|
||||
RDS_SERVICE_ID = "RDS"
|
||||
@@ -420,6 +447,19 @@ func (self *SRegion) GetName() string {
|
||||
return fmt.Sprintf("%s %s", CLOUD_PROVIDER_AWS_CN, self.RegionId)
|
||||
}
|
||||
|
||||
func (self *SRegion) GetI18n() cloudprovider.SModelI18nTable {
|
||||
var en string
|
||||
if localName, ok := RegionLocationsEN[self.RegionId]; ok {
|
||||
en = fmt.Sprintf("%s %s", CLOUD_PROVIDER_AWS_EN, localName)
|
||||
} else {
|
||||
en = fmt.Sprintf("%s %s", CLOUD_PROVIDER_AWS_EN, self.RegionId)
|
||||
}
|
||||
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(self.GetName()).CN(self.GetName()).EN(en)
|
||||
return table
|
||||
}
|
||||
|
||||
func (self *SRegion) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s/%s", self.client.GetAccessEnv(), self.RegionId)
|
||||
}
|
||||
|
||||
@@ -113,6 +113,13 @@ func (self *SZone) GetName() string {
|
||||
return fmt.Sprintf("%s %s", CLOUD_PROVIDER_AWS_CN, self.LocalName)
|
||||
}
|
||||
|
||||
func (self *SZone) GetI18n() cloudprovider.SModelI18nTable {
|
||||
en := fmt.Sprintf("%s %s", CLOUD_PROVIDER_AWS_EN, self.LocalName)
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(self.GetName()).CN(self.GetName()).EN(en)
|
||||
return table
|
||||
}
|
||||
|
||||
func (self *SZone) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s/%s", self.region.GetGlobalId(), self.ZoneId)
|
||||
}
|
||||
|
||||
@@ -40,6 +40,7 @@ import (
|
||||
const (
|
||||
CLOUD_PROVIDER_AZURE = api.CLOUD_PROVIDER_AZURE
|
||||
CLOUD_PROVIDER_AZURE_CN = "微软"
|
||||
CLOUD_PROVIDER_AZURE_EN = "Azure"
|
||||
|
||||
AZURE_API_VERSION = "2016-02-01"
|
||||
)
|
||||
|
||||
@@ -106,6 +106,13 @@ func (self *SRegion) GetName() string {
|
||||
return fmt.Sprintf("%s %s", CLOUD_PROVIDER_AZURE_CN, self.DisplayName)
|
||||
}
|
||||
|
||||
func (self *SRegion) GetI18n() cloudprovider.SModelI18nTable {
|
||||
en := fmt.Sprintf("%s %s", CLOUD_PROVIDER_AZURE_EN, self.DisplayName)
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(self.GetName()).CN(self.GetName()).EN(en)
|
||||
return table
|
||||
}
|
||||
|
||||
func (self *SRegion) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s/%s", self.client.GetAccessEnv(), self.Name)
|
||||
}
|
||||
|
||||
@@ -37,6 +37,10 @@ func (self *SZone) GetName() string {
|
||||
return self.region.GetName()
|
||||
}
|
||||
|
||||
func (self *SZone) GetI18n() cloudprovider.SModelI18nTable {
|
||||
return self.region.GetI18n()
|
||||
}
|
||||
|
||||
func (self *SZone) GetGlobalId() string {
|
||||
return self.region.GetGlobalId()
|
||||
}
|
||||
|
||||
@@ -39,6 +39,7 @@ const (
|
||||
CTYUN_API_HOST = "https://api.ctyun.cn"
|
||||
CLOUD_PROVIDER_CTYUN = api.CLOUD_PROVIDER_CTYUN
|
||||
CLOUD_PROVIDER_CTYUN_CN = "天翼云"
|
||||
CLOUD_PROVIDER_CTYUN_EN = "Ctyun"
|
||||
CTYUN_DEFAULT_REGION = "cn-bj4"
|
||||
|
||||
CTYUN_API_VERSION = "2019-11-22"
|
||||
|
||||
@@ -163,6 +163,13 @@ func (self *SRegion) GetName() string {
|
||||
return fmt.Sprintf("%s %s", CLOUD_PROVIDER_CTYUN_CN, self.RegionName)
|
||||
}
|
||||
|
||||
func (self *SRegion) GetI18n() cloudprovider.SModelI18nTable {
|
||||
en := fmt.Sprintf("%s %s", CLOUD_PROVIDER_CTYUN_EN, self.RegionName)
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(self.GetName()).CN(self.GetName()).EN(en)
|
||||
return table
|
||||
}
|
||||
|
||||
func (self *SRegion) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s/%s", self.client.GetAccessEnv(), self.ID)
|
||||
}
|
||||
|
||||
@@ -58,6 +58,12 @@ func (self *SZone) GetName() string {
|
||||
return fmt.Sprintf("%s %s", CLOUD_PROVIDER_CTYUN_CN, self.ZoneID)
|
||||
}
|
||||
|
||||
func (self *SZone) GetI18n() cloudprovider.SModelI18nTable {
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(self.GetName()).CN(self.GetName()).EN(self.ZoneID)
|
||||
return table
|
||||
}
|
||||
|
||||
func (self *SZone) GetGlobalId() string {
|
||||
return getZoneGlobalId(self.region, self.GetId())
|
||||
}
|
||||
|
||||
@@ -247,6 +247,12 @@ func (cli *SESXiClient) GetAccountId() string {
|
||||
return fmt.Sprintf("%s@%s:%d", cli.account, cli.host, cli.port)
|
||||
}
|
||||
|
||||
func (cli *SESXiClient) GetI18n() cloudprovider.SModelI18nTable {
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(cli.GetName()).CN(cli.GetName())
|
||||
return table
|
||||
}
|
||||
|
||||
func (cli *SESXiClient) GetVersion() string {
|
||||
return cli.client.ServiceContent.About.Version
|
||||
}
|
||||
|
||||
@@ -57,6 +57,13 @@ func (region *SRegion) GetName() string {
|
||||
return fmt.Sprintf("%s %s", CLOUD_PROVIDER_GOOGLE_CN, region.Name)
|
||||
}
|
||||
|
||||
func (self *SRegion) GetI18n() cloudprovider.SModelI18nTable {
|
||||
en := fmt.Sprintf("%s %s", CLOUD_PROVIDER_GOOGLE, self.Name)
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(self.GetName()).CN(self.GetName()).EN(en)
|
||||
return table
|
||||
}
|
||||
|
||||
func (region *SRegion) GetId() string {
|
||||
return region.Name
|
||||
}
|
||||
|
||||
@@ -55,6 +55,12 @@ func (zone *SZone) GetName() string {
|
||||
return zone.Name
|
||||
}
|
||||
|
||||
func (zone *SZone) GetI18n() cloudprovider.SModelI18nTable {
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(zone.GetName()).CN(zone.GetName())
|
||||
return table
|
||||
}
|
||||
|
||||
func (zone *SZone) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s/%s", zone.region.GetGlobalId(), zone.Name)
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@ import (
|
||||
const (
|
||||
CLOUD_PROVIDER_HUAWEI = api.CLOUD_PROVIDER_HUAWEI
|
||||
CLOUD_PROVIDER_HUAWEI_CN = "华为云"
|
||||
CLOUD_PROVIDER_HUAWEI_EN = "Huawei"
|
||||
|
||||
HUAWEI_INTERNATIONAL_CLOUDENV = "InternationalCloud"
|
||||
HUAWEI_CHINA_CLOUDENV = "ChinaCloud"
|
||||
|
||||
@@ -355,6 +355,13 @@ func (self *SRegion) GetName() string {
|
||||
return fmt.Sprintf("%s %s", CLOUD_PROVIDER_HUAWEI_CN, self.Locales.ZhCN)
|
||||
}
|
||||
|
||||
func (self *SRegion) GetI18n() cloudprovider.SModelI18nTable {
|
||||
en := fmt.Sprintf("%s %s", CLOUD_PROVIDER_HUAWEI_EN, self.Locales.EnUs)
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(self.GetName()).CN(self.GetName()).EN(en)
|
||||
return table
|
||||
}
|
||||
|
||||
func (self *SRegion) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s/%s", self.client.GetAccessEnv(), self.ID)
|
||||
}
|
||||
|
||||
@@ -95,6 +95,13 @@ func (self *SZone) GetName() string {
|
||||
return fmt.Sprintf("%s %s", CLOUD_PROVIDER_HUAWEI_CN, self.ZoneName)
|
||||
}
|
||||
|
||||
func (self *SZone) GetI18n() cloudprovider.SModelI18nTable {
|
||||
en := fmt.Sprintf("%s %s", CLOUD_PROVIDER_HUAWEI_EN, self.ZoneName)
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(self.GetName()).CN(self.GetName()).EN(en)
|
||||
return table
|
||||
}
|
||||
|
||||
func (self *SZone) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s/%s", self.region.GetGlobalId(), self.ZoneName)
|
||||
}
|
||||
|
||||
@@ -166,6 +166,12 @@ func (cli *SObjectStoreClient) GetIBucketProvider() IBucketProvider {
|
||||
return cli.GetVirtualObject().(IBucketProvider)
|
||||
}
|
||||
|
||||
func (cli *SObjectStoreClient) GetI18n() cloudprovider.SModelI18nTable {
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(cli.GetName()).CN(cli.GetName())
|
||||
return table
|
||||
}
|
||||
|
||||
func (cli *SObjectStoreClient) GetVersion() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
@@ -67,6 +67,12 @@ func (region *SRegion) GetName() string {
|
||||
return fmt.Sprintf("%s-%s", region.client.cpcfg.Name, region.Name)
|
||||
}
|
||||
|
||||
func (region *SRegion) GetI18n() cloudprovider.SModelI18nTable {
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(region.GetName()).CN(region.GetName())
|
||||
return table
|
||||
}
|
||||
|
||||
func (region *SRegion) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s/%s/%s", CLOUD_PROVIDER_OPENSTACK, region.client.cpcfg.Id, region.Name)
|
||||
}
|
||||
|
||||
@@ -57,6 +57,12 @@ func (zone *SZone) GetName() string {
|
||||
return zone.ZoneName
|
||||
}
|
||||
|
||||
func (zone *SZone) GetI18n() cloudprovider.SModelI18nTable {
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(zone.GetName()).CN(zone.GetName())
|
||||
return table
|
||||
}
|
||||
|
||||
func (zone *SZone) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s/%s/%s", CLOUD_PROVIDER_OPENSTACK, zone.region.Name, zone.ZoneName)
|
||||
}
|
||||
|
||||
@@ -45,6 +45,7 @@ import (
|
||||
const (
|
||||
CLOUD_PROVIDER_QCLOUD = api.CLOUD_PROVIDER_QCLOUD
|
||||
CLOUD_PROVIDER_QCLOUD_CN = "腾讯云"
|
||||
CLOUD_PROVIDER_QCLOUD_EN = "QCloud"
|
||||
|
||||
QCLOUD_DEFAULT_REGION = "ap-beijing"
|
||||
|
||||
|
||||
@@ -223,6 +223,13 @@ func (self *SRegion) GetName() string {
|
||||
return fmt.Sprintf("%s %s", CLOUD_PROVIDER_QCLOUD_CN, self.RegionName)
|
||||
}
|
||||
|
||||
func (self *SRegion) GetI18n() cloudprovider.SModelI18nTable {
|
||||
en := fmt.Sprintf("%s %s", CLOUD_PROVIDER_QCLOUD_EN, self.RegionName)
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(self.GetName()).CN(self.GetName()).EN(en)
|
||||
return table
|
||||
}
|
||||
|
||||
func (self *SRegion) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s/%s", CLOUD_PROVIDER_QCLOUD, self.Region)
|
||||
}
|
||||
|
||||
@@ -65,6 +65,13 @@ func (self *SZone) GetName() string {
|
||||
return fmt.Sprintf("%s %s", CLOUD_PROVIDER_QCLOUD_CN, self.ZoneName)
|
||||
}
|
||||
|
||||
func (self *SZone) GetI18n() cloudprovider.SModelI18nTable {
|
||||
en := fmt.Sprintf("%s %s", CLOUD_PROVIDER_QCLOUD_EN, self.ZoneName)
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(self.GetName()).CN(self.GetName()).EN(en)
|
||||
return table
|
||||
}
|
||||
|
||||
func (self *SZone) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s/%s", self.region.GetGlobalId(), self.Zone)
|
||||
}
|
||||
|
||||
@@ -41,6 +41,32 @@ var UCLOUD_REGION_NAMES = map[string]string{
|
||||
"vn-sng": "胡志明市",
|
||||
}
|
||||
|
||||
var UCLOUD_REGION_NAMES_EN = map[string]string{
|
||||
"cn-bj1": "Beijing 1",
|
||||
"cn-bj2": "Beijing 2",
|
||||
"cn-sh": "Shanghai 1",
|
||||
"cn-sh2": "Shanghai 2",
|
||||
"cn-gd": "Guangzhou",
|
||||
"hk": "Hongkong",
|
||||
"us-ca": "Los Angeles",
|
||||
"us-ws": "Washington",
|
||||
"ge-fra": "Frankfurt",
|
||||
"th-bkk": "Bangkok",
|
||||
"kr-seoul": "Seoul",
|
||||
"sg": "Singapore",
|
||||
"tw-tp": "TaiPei",
|
||||
"tw-kh": "Gaoxiong",
|
||||
"jpn-tky": "Tokyo",
|
||||
"rus-mosc": "Moscow",
|
||||
"uae-dubai": "Dubai",
|
||||
"idn-jakarta": "Jakarta",
|
||||
"ind-mumbai": "Mumbai",
|
||||
"bra-saopaulo": "Sao Paulo",
|
||||
"uk-london": "London",
|
||||
"afr-nigeria": "Lagos",
|
||||
"vn-sng": "Ho Chi Min City",
|
||||
}
|
||||
|
||||
var UCLOUD_ZONE_NAMES = map[string]string{
|
||||
"cn-bj1-01": "北京一可用区A",
|
||||
"cn-bj2-02": "北京二可用区B",
|
||||
@@ -71,3 +97,34 @@ var UCLOUD_ZONE_NAMES = map[string]string{
|
||||
"afr-nigeria-01": "拉各斯可用区A",
|
||||
"vn-sng-01": "胡志明市可用区A",
|
||||
}
|
||||
|
||||
var UCLOUD_ZONE_NAMES_EN = map[string]string{
|
||||
"cn-bj1-01": "Beijing 1 Zone A",
|
||||
"cn-bj2-02": "Beijing 2 Zone B",
|
||||
"cn-bj2-03": "Beijing 2 Zone C",
|
||||
"cn-bj2-04": "Beijing 2 Zone D",
|
||||
"cn-bj2-05": "Beijing 2 Zone E",
|
||||
"cn-sh-01": "Shanghai 1 Zone A",
|
||||
"cn-sh2-01": "Shanghai 2 Zone A",
|
||||
"cn-sh2-02": "Shanghai 2 Zone B",
|
||||
"cn-gd-02": "Guangzhou Zone B",
|
||||
"hk-01": "Hongkong Zone A",
|
||||
"hk-02": "Hongkong Zone B",
|
||||
"us-ca-01": "Los Angeles Zone A",
|
||||
"us-ws-01": "Washington Zone A",
|
||||
"ge-fra-01": "Frankfurt Zone A",
|
||||
"th-bkk-01": "Bangkok Zone A",
|
||||
"kr-seoul-01": "Seoul Zone A",
|
||||
"sg-01": "Singapore Zone A",
|
||||
"tw-kh-01": "Gaoxiong Zone A",
|
||||
"tw-tp-01": "TaiPei Zone A",
|
||||
"jpn-tky-01": "Tokyo Zone A",
|
||||
"rus-mosc-01": "Moscow Zone A",
|
||||
"uae-dubai-01": "Dubai Zone A",
|
||||
"idn-jakarta-01": "Jakarta Zone A",
|
||||
"ind-mumbai-01": "Mumbai Zone A",
|
||||
"bra-saopaulo-01": "Sao Paulo Zone A",
|
||||
"uk-london-01": "London Zone A",
|
||||
"afr-nigeria-01": "Lagos Zone A",
|
||||
"vn-sng-01": "Ho Chi Min City Zone A",
|
||||
}
|
||||
|
||||
@@ -58,6 +58,19 @@ func (self *SRegion) GetName() string {
|
||||
return fmt.Sprintf("%s %s", CLOUD_PROVIDER_UCLOUD_CN, self.GetId())
|
||||
}
|
||||
|
||||
func (self *SRegion) GetI18n() cloudprovider.SModelI18nTable {
|
||||
var en string
|
||||
if name, exist := UCLOUD_REGION_NAMES_EN[self.GetId()]; exist {
|
||||
en = fmt.Sprintf("%s %s", CLOUD_PROVIDER_UCLOUD, name)
|
||||
} else {
|
||||
en = fmt.Sprintf("%s %s", CLOUD_PROVIDER_UCLOUD, self.GetId())
|
||||
}
|
||||
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(self.GetName()).CN(self.GetName()).EN(en)
|
||||
return table
|
||||
}
|
||||
|
||||
func (self *SRegion) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s/%s", CLOUD_PROVIDER_UCLOUD, self.GetId())
|
||||
}
|
||||
|
||||
@@ -91,6 +91,19 @@ func (self *SZone) GetName() string {
|
||||
return self.GetId()
|
||||
}
|
||||
|
||||
func (self *SZone) GetI18n() cloudprovider.SModelI18nTable {
|
||||
var en string
|
||||
if name, exists := UCLOUD_ZONE_NAMES_EN[self.GetId()]; exists {
|
||||
en = name
|
||||
} else {
|
||||
en = self.GetId()
|
||||
}
|
||||
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(self.GetName()).CN(self.GetName()).EN(en)
|
||||
return table
|
||||
}
|
||||
|
||||
func (self *SZone) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s/%s", self.region.GetGlobalId(), self.GetId())
|
||||
}
|
||||
|
||||
@@ -55,6 +55,12 @@ func (region *SRegion) GetName() string {
|
||||
return region.client.cpcfg.Name
|
||||
}
|
||||
|
||||
func (region *SRegion) GetI18n() cloudprovider.SModelI18nTable {
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(region.GetName()).CN(region.GetName())
|
||||
return table
|
||||
}
|
||||
|
||||
func (region *SRegion) GetGlobalId() string {
|
||||
return fmt.Sprintf("%s/%s", CLOUD_PROVIDER_ZSTACK, region.client.cpcfg.Id)
|
||||
}
|
||||
|
||||
@@ -50,6 +50,12 @@ func (zone *SZone) GetName() string {
|
||||
return zone.Name
|
||||
}
|
||||
|
||||
func (zone *SZone) GetI18n() cloudprovider.SModelI18nTable {
|
||||
table := cloudprovider.SModelI18nTable{}
|
||||
table["name"] = cloudprovider.NewSModelI18nEntry(zone.GetName()).CN(zone.GetName())
|
||||
return table
|
||||
}
|
||||
|
||||
func (zone *SZone) GetGlobalId() string {
|
||||
return zone.GetId()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user