mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
Merge pull request #3422 from ioito/hotfix/qx-huawei-dbinstance-privilege-check
fix: 添加华为云Rds privilege校验
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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()")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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, "")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user