optimized: aliyun create rds backup

This commit is contained in:
Qu Xuan
2020-11-16 20:12:43 +08:00
parent 2a54a139dc
commit aa5cbd0b0e
3 changed files with 54 additions and 45 deletions
-31
View File
@@ -1100,37 +1100,6 @@ func (self *SAliyunRegionDriver) IsSupportedBillingCycle(bc billing.SBillingCycl
return false
}
func (self *SAliyunRegionDriver) RequestCreateDBInstanceBackup(ctx context.Context, userCred mcclient.TokenCredential, instance *models.SDBInstance, backup *models.SDBInstanceBackup, task taskman.ITask) error {
taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) {
iRds, err := instance.GetIDBInstance()
if err != nil {
return nil, errors.Wrap(err, "instance.GetIDBInstance")
}
desc := &cloudprovider.SDBInstanceBackupCreateConfig{
Name: backup.Name,
}
if len(backup.DBNames) > 0 {
desc.Databases = strings.Split(backup.DBNames, ",")
}
_, err = iRds.CreateIBackup(desc)
if err != nil {
return nil, errors.Wrap(err, "iRds.CreateBackup")
}
backups, err := iRds.GetIDBInstanceBackups()
if err != nil {
return nil, errors.Wrap(err, "iRds.GetIDBInstanceBackups")
}
result := models.DBInstanceBackupManager.SyncDBInstanceBackups(ctx, userCred, backup.GetCloudprovider(), instance, backup.GetRegion(), backups)
log.Infof("SyncDBInstanceBackups for dbinstance %s(%s) result: %s", instance.Name, instance.Id, result.Result())
instance.SetStatus(userCred, api.DBINSTANCE_RUNNING, "")
return nil, nil
})
return nil
}
func (self *SAliyunRegionDriver) ValidateCreateDBInstanceAccountData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, instance *models.SDBInstance, input api.DBInstanceAccountCreateInput) (api.DBInstanceAccountCreateInput, error) {
if len(input.Name) < 2 || len(input.Name) > 16 {
return input, httperrors.NewInputParameterError("Aliyun DBInstance account name length shoud be 2~16 characters")
+38 -14
View File
@@ -184,9 +184,13 @@ func (rds *SDBInstance) GetIDBInstanceBackups() ([]cloudprovider.ICloudDBInstanc
return ibackups, nil
}
func (rds *SDBInstance) CreateIBackup(conf *cloudprovider.SDBInstanceBackupCreateConfig) (string, error) {
func (self *SRegion) CreateDBInstanceBackup(rdsId string, databases []string) (string, error) {
rds, err := self.GetDBInstanceDetail(rdsId)
if err != nil {
return "", errors.Wrapf(err, "GetDBInstanceDetail")
}
params := map[string]string{
"DBInstanceId": rds.DBInstanceId,
"DBInstanceId": rdsId,
}
switch rds.Engine {
case api.DBINSTANCE_TYPE_MYSQL:
@@ -199,9 +203,9 @@ func (rds *SDBInstance) CreateIBackup(conf *cloudprovider.SDBInstanceBackupCreat
params["BackupMethod"] = "Snapshot"
} else {
params["BackupMethod"] = "Physical"
if len(conf.Databases) > 0 {
if len(databases) > 0 {
params["BackupStrategy"] = "db"
params["DBName"] = strings.Join(conf.Databases, ",")
params["DBName"] = strings.Join(databases, ",")
params["BackupMethod"] = "Logical"
}
}
@@ -218,7 +222,7 @@ func (rds *SDBInstance) CreateIBackup(conf *cloudprovider.SDBInstanceBackupCreat
case api.DBINSTANCE_TYPE_PPAS:
params["BackupMethod"] = "Physical"
}
body, err := rds.region.rdsRequest("CreateBackup", params)
body, err := self.rdsRequest("CreateBackup", params)
if err != nil {
return "", errors.Wrap(err, "CreateBackup")
}
@@ -226,7 +230,11 @@ func (rds *SDBInstance) CreateIBackup(conf *cloudprovider.SDBInstanceBackupCreat
if err != nil {
return "", errors.Wrap(err, "body.BackupJobId")
}
return "", rds.region.waitBackupCreateComplete(rds.DBInstanceId, jobId)
return self.waitBackupCreateComplete(rds.DBInstanceId, jobId)
}
func (rds *SDBInstance) CreateIBackup(conf *cloudprovider.SDBInstanceBackupCreateConfig) (string, error) {
return rds.region.CreateDBInstanceBackup(rds.DBInstanceId, conf.Databases)
}
func (backup *SDBInstanceBackup) Delete() error {
@@ -249,6 +257,7 @@ type SDBInstanceBackupJob struct {
TaskAction string
BackupStatus string
BackupJobId string
BackupId string
}
type SDBInstanceBackupJobs struct {
@@ -279,25 +288,40 @@ func (region *SRegion) GetDBInstanceBackupJobs(instanceId, jobId string) (*SDBIn
return &jobs, nil
}
func (region *SRegion) waitBackupCreateComplete(instanceId, jobId string) error {
for i := 0; i < 20*40; i++ {
func (region *SRegion) waitBackupCreateComplete(instanceId, jobId string) (string, error) {
err := cloudprovider.Wait(time.Second*10, time.Minute*40, func() (bool, error) {
jobs, err := region.GetDBInstanceBackupJobs(instanceId, jobId)
if err != nil {
return errors.Wrapf(err, "region.GetDBInstanceBackupJobs(%s, %s)", instanceId, jobId)
return false, errors.Wrapf(err, "region.GetDBInstanceBackupJobs(%s, %s)", instanceId, jobId)
}
if len(jobs.BackupJob) == 0 {
return nil
return true, nil
}
for _, job := range jobs.BackupJob {
log.Infof("instance %s backup job %s status: %s(%s)", instanceId, jobId, job.BackupStatus, job.Process)
if job.BackupStatus == "Finished" && job.BackupJobId == jobId {
return nil
return true, nil
}
if job.BackupStatus == "Failed" && job.BackupJobId == jobId {
return fmt.Errorf("instance %s backup job %s failed", instanceId, jobId)
return false, fmt.Errorf("instance %s backup job %s failed", instanceId, jobId)
}
}
time.Sleep(time.Second * 3)
return false, nil
})
if err != nil {
return "", errors.Wrapf(err, "wait backup create job")
}
return fmt.Errorf("timeout for waiting create job complete")
jobs, err := region.GetDBInstanceBackupJobs(instanceId, jobId)
if err != nil {
return "", errors.Wrapf(err, "region.GetDBInstanceBackupJobs(%s, %s)", instanceId, jobId)
}
for _, job := range jobs.BackupJob {
if job.BackupStatus == "Finished" && job.BackupJobId == jobId {
if len(job.BackupId) == 0 {
return "", fmt.Errorf("Missing backup id")
}
return job.BackupId, nil
}
}
return "", fmt.Errorf("failed to found backup job %s backupid", jobId)
}
@@ -15,6 +15,8 @@
package shell
import (
"fmt"
"yunion.io/x/onecloud/pkg/multicloud/aliyun"
"yunion.io/x/onecloud/pkg/util/shellutils"
)
@@ -61,4 +63,18 @@ func init() {
return nil
})
type DBInstanceBackupCreateOptions struct {
INSTANCE_ID string
Database []string
}
shellutils.R(&DBInstanceBackupCreateOptions{}, "dbinstance-backup-create", "Create dbintance backup", func(cli *aliyun.SRegion, args *DBInstanceBackupCreateOptions) error {
backupId, err := cli.CreateDBInstanceBackup(args.INSTANCE_ID, args.Database)
if err != nil {
return err
}
fmt.Println("backup id: ", backupId)
return nil
})
}