diff --git a/pkg/compute/models/dbinstance_accounts.go b/pkg/compute/models/dbinstance_accounts.go index 5df27d3269..3e85223484 100644 --- a/pkg/compute/models/dbinstance_accounts.go +++ b/pkg/compute/models/dbinstance_accounts.go @@ -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 { diff --git a/pkg/compute/models/dbinstance_databases.go b/pkg/compute/models/dbinstance_databases.go index 20373d591b..943da7af45 100644 --- a/pkg/compute/models/dbinstance_databases.go +++ b/pkg/compute/models/dbinstance_databases.go @@ -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 { diff --git a/pkg/compute/models/dbinstances.go b/pkg/compute/models/dbinstances.go index 5d98912644..2270c55964 100644 --- a/pkg/compute/models/dbinstances.go +++ b/pkg/compute/models/dbinstances.go @@ -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()") diff --git a/pkg/compute/models/regiondrivers.go b/pkg/compute/models/regiondrivers.go index 5d9a2bce2b..ee8588d593 100644 --- a/pkg/compute/models/regiondrivers.go +++ b/pkg/compute/models/regiondrivers.go @@ -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 diff --git a/pkg/compute/regiondrivers/aliyun.go b/pkg/compute/regiondrivers/aliyun.go index 14f233a6e9..60e82b5cbf 100644 --- a/pkg/compute/regiondrivers/aliyun.go +++ b/pkg/compute/regiondrivers/aliyun.go @@ -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: diff --git a/pkg/compute/regiondrivers/base.go b/pkg/compute/regiondrivers/base.go index b0821f1b68..01c6f3685b 100644 --- a/pkg/compute/regiondrivers/base.go +++ b/pkg/compute/regiondrivers/base.go @@ -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") } diff --git a/pkg/compute/regiondrivers/huawei.go b/pkg/compute/regiondrivers/huawei.go index c58b493fb1..c28a5ed473 100644 --- a/pkg/compute/regiondrivers/huawei.go +++ b/pkg/compute/regiondrivers/huawei.go @@ -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 { diff --git a/pkg/compute/regiondrivers/managedvirtual.go b/pkg/compute/regiondrivers/managedvirtual.go index 2e3b04e405..b354cc1698 100644 --- a/pkg/compute/regiondrivers/managedvirtual.go +++ b/pkg/compute/regiondrivers/managedvirtual.go @@ -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) diff --git a/pkg/compute/tasks/dbinstance_database_create_task.go b/pkg/compute/tasks/dbinstance_database_create_task.go index c1c9468240..f32d326143 100644 --- a/pkg/compute/tasks/dbinstance_database_create_task.go +++ b/pkg/compute/tasks/dbinstance_database_create_task.go @@ -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, "") } } diff --git a/pkg/multicloud/huawei/dbinstance.go b/pkg/multicloud/huawei/dbinstance.go index 24d784aaae..5dfa07b419 100644 --- a/pkg/multicloud/huawei/dbinstance.go +++ b/pkg/multicloud/huawei/dbinstance.go @@ -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 {