Merge pull request #4650 from ioito/hotfix/qx-rds-account-fix

fix: 避免创建rds account, database后未设置exteranl_id
This commit is contained in:
yunion-ci-robot
2020-01-08 11:39:57 +08:00
committed by GitHub
3 changed files with 69 additions and 8 deletions
@@ -73,14 +73,6 @@ func (self *DBInstanceAccountCreateTask) CreateDBInstanceAccount(ctx context.Con
return
}
input := api.SDBInstanceAccountCreateInput{}
self.GetParams().Unmarshal(&input)
if len(input.Privileges) == 0 {
account.SetStatus(self.UserCred, api.DBINSTANCE_USER_AVAILABLE, "")
self.SetStageComplete(ctx, nil)
return
}
iAccounts, err := iRds.GetIDBInstanceAccounts()
if err != nil {
msg := fmt.Sprintf("failed to found accounts from cloud dbinstance error: %v", err)
@@ -108,6 +100,16 @@ func (self *DBInstanceAccountCreateTask) CreateDBInstanceAccount(ctx context.Con
return
}
db.SetExternalId(account, self.UserCred, iAccount.GetGlobalId())
input := api.SDBInstanceAccountCreateInput{}
self.GetParams().Unmarshal(&input)
if len(input.Privileges) == 0 {
account.SetStatus(self.UserCred, api.DBINSTANCE_USER_AVAILABLE, "")
self.SetStageComplete(ctx, nil)
return
}
account.SetStatus(self.UserCred, api.DBINSTANCE_USER_GRANT_PRIVILEGE, "")
for _, privilege := range input.Privileges {
err = iAccount.GrantPrivilege(privilege.Database, privilege.Privilege)
@@ -19,6 +19,7 @@ import (
"fmt"
"yunion.io/x/jsonutils"
"yunion.io/x/log"
api "yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
@@ -61,6 +62,35 @@ func (self *DBInstanceCreateTask) OnCreateDBInstanceComplete(ctx context.Context
dbinstance := obj.(*models.SDBInstance)
logclient.AddActionLogWithStartable(self, dbinstance, logclient.ACT_CREATE, nil, self.UserCred, true)
accounts, err := dbinstance.GetDBInstanceAccounts()
if err != nil {
log.Errorf("failed to get dbinstance %s account error: %v", dbinstance.Name, err)
}
if len(accounts) > 0 {
iRds, err := dbinstance.GetIDBInstance()
if err != nil {
log.Errorf("failed to found dbinstance %s error: %v", dbinstance.Name, err)
} else {
iAccounts, err := iRds.GetIDBInstanceAccounts()
if err != nil {
log.Errorf("failed to get accounts from cloud dbinstance %s error: %v", dbinstance.Name, err)
}
externalIds := map[string]string{}
for _, iAccount := range iAccounts {
externalIds[iAccount.GetName()] = iAccount.GetGlobalId()
}
for i := range accounts {
externalId, ok := externalIds[accounts[i].Name]
if !ok {
log.Errorf("failed to get dbinstance account %s from cloud dbinstance for set externalId", accounts[i].Name)
} else {
db.SetExternalId(&accounts[i], self.UserCred, externalId)
}
}
}
}
self.SetStage("OnSyncDBInstanceStatusComplete", nil)
dbinstance.StartDBInstanceSyncStatusTask(ctx, self.UserCred, nil, self.GetTaskId())
}
@@ -74,6 +74,35 @@ func (self *DBInstanceDatabaseCreateTask) CreateDBInstanceDatabase(ctx context.C
return
}
iDatabases, err := iRds.GetIDBInstanceDatabases()
if err != nil {
msg := fmt.Sprintf("failed to found databases from cloud dbinstance error: %v", err)
db.OpsLog.LogEvent(database, db.ACT_CREATE, msg, self.GetUserCred())
logclient.AddActionLogWithStartable(self, database, logclient.ACT_CREATE, msg, self.UserCred, false)
database.SetStatus(self.UserCred, api.DBINSTANCE_UNKNOWN, "")
self.SetStageComplete(ctx, nil)
return
}
var iDatabase cloudprovider.ICloudDBInstanceDatabase = nil
for i := range iDatabases {
if iDatabases[i].GetName() == database.Name {
iDatabase = iDatabases[i]
break
}
}
if iDatabase == nil {
msg := fmt.Sprintf("failed to found database %s from cloud dbinstance", database.Name)
db.OpsLog.LogEvent(database, db.ACT_CREATE, msg, self.GetUserCred())
logclient.AddActionLogWithStartable(self, database, logclient.ACT_CREATE, msg, self.UserCred, false)
database.SetStatus(self.UserCred, api.DBINSTANCE_UNKNOWN, "")
self.SetStageComplete(ctx, nil)
return
}
db.SetExternalId(database, self.UserCred, iDatabase.GetGlobalId())
input := api.SDBInstanceDatabaseCreateInput{}
self.GetParams().Unmarshal(&input)
if len(input.Accounts) == 0 {