From 8dd88ecae192719583fac2fc2c975d8101727ec8 Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Mon, 6 Jan 2020 13:36:11 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=81=BF=E5=85=8D=E5=88=9B=E5=BB=BArds?= =?UTF-8?q?=20account,=20database=E5=90=8E=E6=9C=AA=E8=AE=BE=E7=BD=AEexter?= =?UTF-8?q?anl=5Fid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tasks/dbinstance_account_create_task.go | 18 ++++++----- pkg/compute/tasks/dbinstance_create_task.go | 30 +++++++++++++++++++ .../tasks/dbinstance_database_create_task.go | 29 ++++++++++++++++++ 3 files changed, 69 insertions(+), 8 deletions(-) diff --git a/pkg/compute/tasks/dbinstance_account_create_task.go b/pkg/compute/tasks/dbinstance_account_create_task.go index 48ecf03403..43d0ae862c 100644 --- a/pkg/compute/tasks/dbinstance_account_create_task.go +++ b/pkg/compute/tasks/dbinstance_account_create_task.go @@ -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) diff --git a/pkg/compute/tasks/dbinstance_create_task.go b/pkg/compute/tasks/dbinstance_create_task.go index fcdbb6ead4..ce4f7267cf 100644 --- a/pkg/compute/tasks/dbinstance_create_task.go +++ b/pkg/compute/tasks/dbinstance_create_task.go @@ -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()) } diff --git a/pkg/compute/tasks/dbinstance_database_create_task.go b/pkg/compute/tasks/dbinstance_database_create_task.go index 6af06af7cf..aa297c0012 100644 --- a/pkg/compute/tasks/dbinstance_database_create_task.go +++ b/pkg/compute/tasks/dbinstance_database_create_task.go @@ -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 {