Merge pull request #3422 from ioito/hotfix/qx-huawei-dbinstance-privilege-check

fix: 添加华为云Rds privilege校验
This commit is contained in:
yunion-ci-robot
2019-11-04 22:12:13 +08:00
committed by GitHub
10 changed files with 126 additions and 41 deletions
+29 -13
View File
@@ -37,14 +37,14 @@ import (
)
type SDBInstanceAccountManager struct {
db.SStatusStandaloneResourceBaseManager
db.SVirtualResourceBaseManager
}
var DBInstanceAccountManager *SDBInstanceAccountManager
func init() {
DBInstanceAccountManager = &SDBInstanceAccountManager{
SStatusStandaloneResourceBaseManager: db.NewStatusStandaloneResourceBaseManager(
SVirtualResourceBaseManager: db.NewVirtualResourceBaseManager(
SDBInstanceAccount{},
"dbinstanceaccounts_tbl",
"dbinstanceaccount",
@@ -55,7 +55,7 @@ func init() {
}
type SDBInstanceAccount struct {
db.SStatusStandaloneResourceBase
db.SVirtualResourceBase
db.SExternalizedResourceBase
Secret string `width:"256" charset:"ascii" nullable:"false" list:"domain" create:"optional"`
@@ -81,7 +81,7 @@ func (self *SDBInstanceAccount) AllowGetDetails(ctx context.Context, userCred mc
}
func (self *SDBInstanceAccount) AllowUpdateItem(ctx context.Context, userCred mcclient.TokenCredential) bool {
return db.IsAdminAllowUpdate(userCred, self)
return false
}
func (self *SDBInstanceAccount) AllowDeleteItem(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
@@ -105,7 +105,7 @@ func (self *SDBInstanceAccount) getPrivilegesDetails() (*jsonutils.JSONArray, er
}
func (self *SDBInstanceAccount) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict {
extra := self.SStandaloneResourceBase.GetCustomizeColumns(ctx, userCred, query)
extra := self.SVirtualResourceBase.GetCustomizeColumns(ctx, userCred, query)
extra, _ = self.getMoreDetails(ctx, userCred, extra)
return extra
}
@@ -120,7 +120,7 @@ func (self *SDBInstanceAccount) getMoreDetails(ctx context.Context, userCred mcc
}
func (self *SDBInstanceAccount) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*jsonutils.JSONDict, error) {
extra, err := self.SStandaloneResourceBase.GetExtraDetails(ctx, userCred, query)
extra, err := self.SVirtualResourceBase.GetExtraDetails(ctx, userCred, query)
if err != nil {
return nil, err
}
@@ -128,7 +128,7 @@ func (self *SDBInstanceAccount) GetExtraDetails(ctx context.Context, userCred mc
}
func (manager *SDBInstanceAccountManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) {
q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query)
q, err := manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query)
if err != nil {
return nil, err
}
@@ -138,6 +138,18 @@ func (manager *SDBInstanceAccountManager) ListItemFilter(ctx context.Context, q
})
}
func (manager *SDBInstanceAccountManager) FetchParentId(ctx context.Context, data jsonutils.JSONObject) string {
parentId, _ := data.GetString("dbinstance_id")
return parentId
}
func (manager *SDBInstanceAccountManager) FilterByParentId(q *sqlchemy.SQuery, parentId string) *sqlchemy.SQuery {
if len(parentId) > 0 {
q = q.Equals("dbinstance_id", parentId)
}
return q
}
func (manager *SDBInstanceAccountManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
input := &api.SDBInstanceAccountCreateInput{}
instanceV := validators.NewModelIdOrNameValidator("dbinstance", "dbinstance", userCred)
@@ -193,7 +205,7 @@ func (self *SDBInstanceAccount) GetPassword() (string, error) {
}
func (self *SDBInstanceAccount) PostCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) {
self.SStatusStandaloneResourceBase.PostCreate(ctx, userCred, ownerId, query, data)
self.SVirtualResourceBase.PostCreate(ctx, userCred, ownerId, query, data)
input := &api.SDBInstanceAccountCreateInput{}
data.Unmarshal(input)
self.savePassword(input.Password)
@@ -244,7 +256,7 @@ func (self *SDBInstanceAccount) PerformGrantPrivilege(ctx context.Context, userC
return nil, httperrors.NewInputParameterError("The account %s(%s) has permission %s to the database %s(%s)", self.Name, self.Id, privilege.Privilege, database.Name, database.Id)
}
err = instance.GetRegion().GetDriver().ValidateDBInstanceAccountPrivilege(ctx, userCred, instance, privilegeStr)
err = instance.GetRegion().GetDriver().ValidateDBInstanceAccountPrivilege(ctx, userCred, instance, self.Name, privilegeStr)
if err != nil {
return nil, err
}
@@ -280,7 +292,7 @@ func (self *SDBInstanceAccount) PerformSetPrivileges(ctx context.Context, userCr
return nil, httperrors.NewInputParameterError("Failed to found database %s for dbinstance %s(%s): %v", privilege.Database, instance.Name, instance.Id, err)
}
input.Privileges[i].DBInstancedatabaseId = database.Id
err = instance.GetRegion().GetDriver().ValidateDBInstanceAccountPrivilege(ctx, userCred, instance, privilege.Privilege)
err = instance.GetRegion().GetDriver().ValidateDBInstanceAccountPrivilege(ctx, userCred, instance, self.Name, privilege.Privilege)
if err != nil {
return nil, err
}
@@ -484,7 +496,7 @@ func (manager *SDBInstanceAccountManager) SyncDBInstanceAccounts(ctx context.Con
}
for i := 0; i < len(commondb); i++ {
err := commondb[i].SyncWithCloudDBInstanceAccount(ctx, userCred, commonext[i])
err := commondb[i].SyncWithCloudDBInstanceAccount(ctx, userCred, instance, commonext[i])
if err != nil {
result.UpdateError(err)
} else {
@@ -507,8 +519,10 @@ func (manager *SDBInstanceAccountManager) SyncDBInstanceAccounts(ctx context.Con
return localAccounts, remoteAccounts, result
}
func (self *SDBInstanceAccount) SyncWithCloudDBInstanceAccount(ctx context.Context, userCred mcclient.TokenCredential, extAccount cloudprovider.ICloudDBInstanceAccount) error {
func (self *SDBInstanceAccount) SyncWithCloudDBInstanceAccount(ctx context.Context, userCred mcclient.TokenCredential, instance *SDBInstance, extAccount cloudprovider.ICloudDBInstanceAccount) error {
_, err := db.UpdateWithLock(ctx, self, func() error {
self.ProjectId = instance.ProjectId
self.DomainId = instance.DomainId
self.Status = extAccount.GetStatus()
return nil
})
@@ -529,6 +543,8 @@ func (manager *SDBInstanceAccountManager) newFromCloudDBInstanceAccount(ctx cont
account.DBInstanceId = instance.Id
account.Status = extAccount.GetStatus()
account.ExternalId = extAccount.GetGlobalId()
account.ProjectId = instance.ProjectId
account.DomainId = instance.DomainId
err := manager.TableSpec().Insert(&account)
if err != nil {
@@ -543,7 +559,7 @@ func (self *SDBInstanceAccount) Delete(ctx context.Context, userCred mcclient.To
}
func (self *SDBInstanceAccount) RealDelete(ctx context.Context, userCred mcclient.TokenCredential) error {
return self.SStandaloneResourceBase.Delete(ctx, userCred)
return self.SVirtualResourceBase.Delete(ctx, userCred)
}
func (self *SDBInstanceAccount) CustomizeDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) error {
+12 -8
View File
@@ -34,14 +34,14 @@ import (
)
type SDBInstanceDatabaseManager struct {
db.SStatusStandaloneResourceBaseManager
db.SVirtualResourceBaseManager
}
var DBInstanceDatabaseManager *SDBInstanceDatabaseManager
func init() {
DBInstanceDatabaseManager = &SDBInstanceDatabaseManager{
SStatusStandaloneResourceBaseManager: db.NewStatusStandaloneResourceBaseManager(
SVirtualResourceBaseManager: db.NewVirtualResourceBaseManager(
SDBInstanceDatabase{},
"dbinstancedatabases_tbl",
"dbinstancedatabase",
@@ -52,7 +52,7 @@ func init() {
}
type SDBInstanceDatabase struct {
db.SStatusStandaloneResourceBase
db.SVirtualResourceBase
db.SExternalizedResourceBase
CharacterSet string `width:"32" charset:"ascii" nullable:"true" list:"user" create:"optional"`
@@ -87,7 +87,7 @@ func (self *SDBInstanceDatabase) AllowDeleteItem(ctx context.Context, userCred m
}
func (manager *SDBInstanceDatabaseManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) {
q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query)
q, err := manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query)
if err != nil {
return nil, err
}
@@ -179,7 +179,7 @@ func (self *SDBInstanceDatabase) GetDBInstance() (*SDBInstance, error) {
}
func (self *SDBInstanceDatabase) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict {
extra := self.SStandaloneResourceBase.GetCustomizeColumns(ctx, userCred, query)
extra := self.SVirtualResourceBase.GetCustomizeColumns(ctx, userCred, query)
extra, _ = self.getMoreDetails(ctx, userCred, extra)
return extra
}
@@ -239,7 +239,7 @@ func (manager *SDBInstanceDatabaseManager) SyncDBInstanceDatabases(ctx context.C
}
for i := 0; i < len(commondb); i++ {
err := commondb[i].SyncWithCloudDBInstanceDatabase(ctx, userCred, commonext[i])
err := commondb[i].SyncWithCloudDBInstanceDatabase(ctx, userCred, instance, commonext[i])
if err != nil {
result.UpdateError(err)
} else {
@@ -258,11 +258,13 @@ func (manager *SDBInstanceDatabaseManager) SyncDBInstanceDatabases(ctx context.C
return result
}
func (self *SDBInstanceDatabase) SyncWithCloudDBInstanceDatabase(ctx context.Context, userCred mcclient.TokenCredential, extDatabase cloudprovider.ICloudDBInstanceDatabase) error {
func (self *SDBInstanceDatabase) SyncWithCloudDBInstanceDatabase(ctx context.Context, userCred mcclient.TokenCredential, instance *SDBInstance, extDatabase cloudprovider.ICloudDBInstanceDatabase) error {
_, err := db.UpdateWithLock(ctx, self, func() error {
self.Status = extDatabase.GetStatus()
self.Name = extDatabase.GetName()
self.CharacterSet = extDatabase.GetCharacterSet()
self.ProjectId = instance.ProjectId
self.DomainId = instance.DomainId
return nil
})
@@ -284,6 +286,8 @@ func (manager *SDBInstanceDatabaseManager) newFromCloudDBInstanceDatabase(ctx co
database.Status = extDatabase.GetStatus()
database.CharacterSet = extDatabase.GetCharacterSet()
database.ExternalId = extDatabase.GetGlobalId()
database.ProjectId = instance.ProjectId
database.DomainId = instance.DomainId
err := manager.TableSpec().Insert(&database)
if err != nil {
@@ -298,7 +302,7 @@ func (self *SDBInstanceDatabase) Delete(ctx context.Context, userCred mcclient.T
}
func (self *SDBInstanceDatabase) RealDelete(ctx context.Context, userCred mcclient.TokenCredential) error {
return self.SStandaloneResourceBase.Delete(ctx, userCred)
return self.SVirtualResourceBase.Delete(ctx, userCred)
}
func (self *SDBInstanceDatabase) CustomizeDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) error {
+47 -3
View File
@@ -434,11 +434,50 @@ func (self *SDBInstance) GetIDBInstance() (cloudprovider.ICloudDBInstance, error
return iregion.GetIDBInstanceById(self.ExternalId)
}
func (self *SDBInstance) PerformChangeOwner(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
dataCopy := jsonutils.DeepCopy(data)
accounts, err := self.GetDBInstanceAccounts()
if err != nil {
return nil, httperrors.NewGeneralError(fmt.Errorf("failed get accounts: %v", err))
}
backups, err := self.GetDBInstanceBackups()
if err != nil {
return nil, httperrors.NewGeneralError(fmt.Errorf("failed get backups: %v", err))
}
databases, err := self.GetDBInstanceDatabases()
if err != nil {
return nil, httperrors.NewGeneralError(fmt.Errorf("failed get databases: %v", err))
}
for i := range accounts {
_, err := accounts[i].PerformChangeOwner(ctx, userCred, query, dataCopy)
if err != nil {
return nil, err
}
}
for i := range backups {
_, err := backups[i].PerformChangeOwner(ctx, userCred, query, dataCopy)
if err != nil {
return nil, err
}
}
for i := range databases {
_, err := databases[i].PerformChangeOwner(ctx, userCred, query, dataCopy)
if err != nil {
return nil, err
}
}
return self.SVirtualResourceBase.PerformChangeOwner(ctx, userCred, query, data)
}
func (self *SDBInstance) AllowPerformRecovery(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
return self.IsOwner(userCred) || db.IsAdminAllowPerform(userCred, self, "recovery")
}
func (self *SDBInstance) PerformRecovery(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
if !utils.IsInStringArray(self.Status, []string{api.DBINSTANCE_RUNNING}) {
return nil, httperrors.NewInvalidStatusError("Cannot do recovery dbinstance in status %s required status %s", self.Status, api.DBINSTANCE_RUNNING)
}
params := data.(*jsonutils.JSONDict)
backupV := validators.NewModelIdOrNameValidator("dbinstancebackup", "dbinstancebackup", userCred)
err := backupV.Validate(params)
@@ -512,10 +551,10 @@ func (self *SDBInstance) AllowPerformReboot(ctx context.Context, userCred mcclie
}
func (self *SDBInstance) PerformReboot(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
if utils.IsInStringArray(self.Status, []string{api.DBINSTANCE_RUNNING, api.DBINSTANCE_REBOOT_FAILED}) {
return nil, self.StartDBInstanceRebootTask(ctx, userCred, jsonutils.NewDict(), "")
if !utils.IsInStringArray(self.Status, []string{api.DBINSTANCE_RUNNING, api.DBINSTANCE_REBOOT_FAILED}) {
return nil, httperrors.NewInvalidStatusError("Cannot do reboot dbinstance in status %s", self.Status)
}
return nil, httperrors.NewInvalidStatusError("Cannot do reboot dbinstance in status %s", self.Status)
return nil, self.StartDBInstanceRebootTask(ctx, userCred, jsonutils.NewDict(), "")
}
func (self *SDBInstance) AllowPerformSyncStatus(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
@@ -531,6 +570,10 @@ func (self *SDBInstance) AllowPerformRenew(ctx context.Context, userCred mcclien
}
func (self *SDBInstance) PerformRenew(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
if !utils.IsInStringArray(self.Status, []string{api.DBINSTANCE_RUNNING}) {
return nil, httperrors.NewInvalidStatusError("Cannot do renew dbinstance in status %s required status %s", self.Status, api.DBINSTANCE_RUNNING)
}
durationStr := jsonutils.GetAnyString(data, []string{"duration"})
if len(durationStr) == 0 {
return nil, httperrors.NewInputParameterError("missong duration")
@@ -872,6 +915,7 @@ func (self *SDBInstance) GetDBInstancePrivilege(account, database string) (*SDBI
return nil, sql.ErrNoRows
}
privilege := &SDBInstancePrivilege{}
privilege.SetModelManager(DBInstancePrivilegeManager, privilege)
err = q.First(privilege)
if err != nil {
return nil, errors.Wrap(err, "q.First()")
+1 -1
View File
@@ -123,7 +123,7 @@ type IRegionDriver interface {
ValidateCreateDBInstanceDatabaseData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, instance *SDBInstance, input *api.SDBInstanceDatabaseCreateInput) (*api.SDBInstanceDatabaseCreateInput, error)
ValidateCreateDBInstanceBackupData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, instance *SDBInstance, input *api.SDBInstanceBackupCreateInput) (*api.SDBInstanceBackupCreateInput, error)
ValidateChangeDBInstanceConfigData(ctx context.Context, userCred mcclient.TokenCredential, instance *SDBInstance, input *api.SDBInstanceChangeConfigInput) error
ValidateDBInstanceAccountPrivilege(ctx context.Context, userCred mcclient.TokenCredential, instance *SDBInstance, privilege string) error
ValidateDBInstanceAccountPrivilege(ctx context.Context, userCred mcclient.TokenCredential, instance *SDBInstance, account string, privilege string) error
ValidateResetDBInstancePassword(ctx context.Context, userCred mcclient.TokenCredential, instance *SDBInstance, account string) error
RequestCreateDBInstance(ctx context.Context, userCred mcclient.TokenCredential, dbinstance *SDBInstance, task taskman.ITask) error
+3 -3
View File
@@ -1128,7 +1128,7 @@ func (self *SAliyunRegionDriver) ValidateCreateDBInstanceAccountData(ctx context
}
for _, privilege := range input.Privileges {
err := self.ValidateDBInstanceAccountPrivilege(ctx, userCred, instance, privilege.Privilege)
err := self.ValidateDBInstanceAccountPrivilege(ctx, userCred, instance, input.Name, privilege.Privilege)
if err != nil {
return nil, err
}
@@ -1143,7 +1143,7 @@ func (self *SAliyunRegionDriver) ValidateCreateDBInstanceDatabaseData(ctx contex
}
for _, account := range input.Accounts {
err := self.ValidateDBInstanceAccountPrivilege(ctx, userCred, instance, account.Privilege)
err := self.ValidateDBInstanceAccountPrivilege(ctx, userCred, instance, account.Account, account.Privilege)
if err != nil {
return nil, err
}
@@ -1156,7 +1156,7 @@ func (self *SAliyunRegionDriver) ValidateCreateDBInstanceBackupData(ctx context.
return input, nil
}
func (self *SAliyunRegionDriver) ValidateDBInstanceAccountPrivilege(ctx context.Context, userCred mcclient.TokenCredential, instance *models.SDBInstance, privilege string) error {
func (self *SAliyunRegionDriver) ValidateDBInstanceAccountPrivilege(ctx context.Context, userCred mcclient.TokenCredential, instance *models.SDBInstance, account string, privilege string) error {
switch privilege {
case api.DATABASE_PRIVILEGE_RW:
case api.DATABASE_PRIVILEGE_R:
+1 -1
View File
@@ -267,7 +267,7 @@ func (self *SBaseRegionDriver) ValidateChangeDBInstanceConfigData(ctx context.Co
return fmt.Errorf("Not Implement ValidateChangeDBInstanceConfigData")
}
func (self *SBaseRegionDriver) ValidateDBInstanceAccountPrivilege(ctx context.Context, userCred mcclient.TokenCredential, instance *models.SDBInstance, privilege string) error {
func (self *SBaseRegionDriver) ValidateDBInstanceAccountPrivilege(ctx context.Context, userCred mcclient.TokenCredential, instance *models.SDBInstance, account string, privilege string) error {
return fmt.Errorf("Not Implement ValidateDBInstanceAccountPrivilege")
}
+14
View File
@@ -2108,6 +2108,10 @@ func (self *SHuaWeiRegionDriver) ValidateCreateDBInstanceData(ctx context.Contex
return nil, httperrors.NewInputParameterError("Not support create read-only dbinstance for %s", input.Engine)
}
if len(input.Name) < 4 || len(input.Name) > 64 {
return nil, httperrors.NewInputParameterError("Huawei dbinstance name length shoud be 4~64 characters")
}
if input.DiskSizeGB < 40 || input.DiskSizeGB > 4000 {
return nil, httperrors.NewInputParameterError("%s require disk size must in 40 ~ 4000 GB", self.GetProvider())
}
@@ -2208,6 +2212,16 @@ func (self *SHuaWeiRegionDriver) IsSupportKeepDBInstanceManualBackup() bool {
return true
}
func (self *SHuaWeiRegionDriver) ValidateDBInstanceAccountPrivilege(ctx context.Context, userCred mcclient.TokenCredential, instance *models.SDBInstance, account string, privilege string) error {
if account == "root" {
return httperrors.NewInputParameterError("No need to grant or revoke privilege for admin account")
}
if utils.IsInStringArray(privilege, []string{api.DATABASE_PRIVILEGE_RW, api.DATABASE_PRIVILEGE_R}) {
return httperrors.NewInputParameterError("Unknown privilege %s", privilege)
}
return nil
}
func validatorSlaveZones(ownerId mcclient.IIdentityProvider, data *jsonutils.JSONDict, optional bool) error {
s, err := data.GetString("slave_zones")
if err != nil {
+3 -2
View File
@@ -1529,12 +1529,13 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateDBInstance(ctx cont
log.Debugf("create dbinstance params: %s", jsonutils.Marshal(desc).String())
idbinstance, err := iregion.CreateIDBInstance(&desc)
if idbinstance != nil { //避免创建失败后,删除本地的未能同步删除云上失败的RDS
db.SetExternalId(dbinstance, userCred, idbinstance.GetGlobalId())
}
if err != nil {
return nil, err
}
db.SetExternalId(dbinstance, userCred, idbinstance.GetGlobalId())
err = cloudprovider.WaitStatus(idbinstance, api.DBINSTANCE_RUNNING, time.Second*5, time.Hour*1)
if err != nil {
log.Errorf("timeout for waiting dbinstance running error: %v", err)
@@ -18,6 +18,7 @@ import (
"context"
"yunion.io/x/jsonutils"
"yunion.io/x/log"
"yunion.io/x/pkg/errors"
api "yunion.io/x/onecloud/pkg/apis/compute"
@@ -76,9 +77,12 @@ func (self *DBInstanceDatabaseCreateTask) CreateDBInstanceDatabase(ctx context.C
database.SetStatus(self.UserCred, api.DBINSTANCE_DATABASE_RUNNING, "")
input := api.SDBInstanceDatabaseCreateInput{}
self.GetParams().Unmarshal(&input)
for _, _account := range input.Accounts {
account, _ := instance.GetDBInstanceAccount(_account.DBInstancedccountId)
if account != nil {
account, err := instance.GetDBInstanceAccount(_account.DBInstancedccountId)
if err != nil {
log.Errorf("failed to found account %s(%s) for instance %s(%s) error: %v", _account.Account, _account.DBInstancedccountId, instance.Name, instance.Id, err)
} else {
account.StartGrantPrivilegeTask(ctx, self.UserCred, database.Name, _account.Privilege, "")
}
}
+10 -8
View File
@@ -538,22 +538,24 @@ func (region *SRegion) CreateIDBInstance(desc *cloudprovider.SManagedDBInstanceC
return nil, errors.Wrap(err, `resp.Unmarshal(&instance, "instance")`)
}
if jobId, _ := resp.GetString("job_id"); len(jobId) > 0 {
err = cloudprovider.WaitCreated(10*time.Second, 20*time.Minute, func() bool {
err = cloudprovider.Wait(10*time.Second, 20*time.Minute, func() (bool, error) {
job, err := region.ecsClient.DBInstanceJob.Get(jobId, map[string]string{"id": jobId})
if err != nil {
log.Errorf("failed to get job %s info error: %v", jobId, err)
return false
return false, nil
}
status, _ := job.GetString("status")
process, _ := job.GetString("process")
if status == "Completed" {
return true
}
log.Debugf("create dbinstance job %s status: %s process: %s", jobId, status, process)
return false
if status == "Completed" {
return true, nil
}
if status == "Failed" {
return false, fmt.Errorf("create failed")
}
return false, nil
})
}
return instance, nil
return instance, err
}
func (rds *SDBInstance) Reboot() error {