|
|
|
@@ -8,6 +8,7 @@ import (
|
|
|
|
|
"yunion.io/x/onecloud/pkg/cloudcommon/db"
|
|
|
|
|
"yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
|
|
|
|
|
"yunion.io/x/onecloud/pkg/compute/models"
|
|
|
|
|
"yunion.io/x/onecloud/pkg/util/logclient"
|
|
|
|
|
"yunion.io/x/pkg/utils"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
@@ -39,7 +40,7 @@ func (self *GuestSwitchToBackupTask) OnEnsureMasterGuestStoped(ctx context.Conte
|
|
|
|
|
self.SetStage("OnBackupGuestStoped", nil)
|
|
|
|
|
err := guest.GetDriver().RequestStopOnHost(ctx, guest, backupHost, self)
|
|
|
|
|
if err != nil {
|
|
|
|
|
self.SetStageFailed(ctx, fmt.Sprintf("Stop backup guest error: %s", err))
|
|
|
|
|
self.OnFail(ctx, guest, fmt.Sprintf("Stop backup guest error: %s", err))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -55,16 +56,17 @@ func (self *GuestSwitchToBackupTask) OnBackupGuestStoped(ctx context.Context, gu
|
|
|
|
|
disk.SwitchToBackup()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
db.OpsLog.LogEvent(guest, db.ACT_SWITCH_FAILED, fmt.Sprintf("Switch to backup disk error: %s", err), self.UserCred)
|
|
|
|
|
self.SetStageFailed(ctx, fmt.Sprintf("Switch to backup disk error: %s", err))
|
|
|
|
|
self.OnFail(ctx, guest, fmt.Sprintf("Switch to backup disk error: %s", err))
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
err := guest.SwitchToBackup()
|
|
|
|
|
if err != nil {
|
|
|
|
|
db.OpsLog.LogEvent(guest, db.ACT_SWITCH_FAILED, fmt.Sprintf("Switch to backup guest error: %s", err), self.UserCred)
|
|
|
|
|
self.SetStageFailed(ctx, fmt.Sprintf("Switch to backup guest error: %s", err))
|
|
|
|
|
self.OnFail(ctx, guest, fmt.Sprintf("Switch to backup guest error: %s", err))
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
db.OpsLog.LogEvent(guest, db.ACT_SWITCHED, fmt.Sprintf("Switch to backup guest error: %s", err), self.UserCred)
|
|
|
|
|
db.OpsLog.LogEvent(guest, db.ACT_SWITCHED, "Switch to backup", self.UserCred)
|
|
|
|
|
logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_SWITCH_TO_BACKUP, "Switch to backup", self.UserCred, true)
|
|
|
|
|
self.SetStage("OnNewMasterStarted", nil)
|
|
|
|
|
guest.StartGueststartTask(ctx, self.UserCred, nil, self.GetTaskId())
|
|
|
|
|
}
|
|
|
|
@@ -73,6 +75,13 @@ func (self *GuestSwitchToBackupTask) OnNewMasterStarted(ctx context.Context, gue
|
|
|
|
|
self.SetStageComplete(ctx, nil)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (self *GuestSwitchToBackupTask) OnFail(ctx context.Context, guest *models.SGuest, reason string) {
|
|
|
|
|
guest.SetStatus(self.UserCred, models.VM_SWITCH_TO_BACKUP_FAILED, reason)
|
|
|
|
|
db.OpsLog.LogEvent(guest, db.ACT_SWITCH_FAILED, reason, self.UserCred)
|
|
|
|
|
logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_SWITCH_TO_BACKUP, reason, self.UserCred, false)
|
|
|
|
|
self.SetStageFailed(ctx, reason)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/********************* GuestStartAndSyncToBackupTask *********************/
|
|
|
|
|
|
|
|
|
|
type GuestStartAndSyncToBackupTask struct {
|
|
|
|
@@ -101,10 +110,21 @@ func (self *GuestStartAndSyncToBackupTask) checkTemplete(ctx context.Context, gu
|
|
|
|
|
func (self *GuestStartAndSyncToBackupTask) OnCheckTemplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
|
|
|
|
|
self.SetStage("OnStartBackupGuest", nil)
|
|
|
|
|
host := models.HostManager.FetchHostById(guest.BackupHostId)
|
|
|
|
|
guest.GetDriver().RequestStartOnHost(ctx, guest, host, self.UserCred, self)
|
|
|
|
|
if _, err := guest.GetDriver().RequestStartOnHost(ctx, guest, host, self.UserCred, self); err != nil {
|
|
|
|
|
self.SetStageFailed(ctx, err.Error())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (self *GuestStartAndSyncToBackupTask) OnStartBackupGuest(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
|
|
|
|
|
nbdServerPort, err := data.Int("nbd_server_port")
|
|
|
|
|
if err != nil {
|
|
|
|
|
self.SetStageFailed(ctx, "Start Backup Guest Missing Nbd Port")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
backupHost := models.HostManager.FetchHostById(guest.BackupHostId)
|
|
|
|
|
nbdServerUri := fmt.Sprintf("nbd:%s:%d", backupHost.AccessIp, nbdServerPort)
|
|
|
|
|
guest.SetMetadata(ctx, "backup_nbd_server_uri", nbdServerUri, self.UserCred)
|
|
|
|
|
|
|
|
|
|
db.OpsLog.LogEvent(guest, db.ACT_BACKUP_START, "", self.UserCred)
|
|
|
|
|
if utils.IsInStringArray(guest.Status, models.VM_RUNNING_STATUS) {
|
|
|
|
|
self.SetStage("OnRequestSyncToBackup", nil)
|
|
|
|
@@ -216,7 +236,7 @@ func (self *GuestCreateBackupTask) OnCreateBackup(ctx context.Context, guest *mo
|
|
|
|
|
if utils.IsInStringArray(guestStatus, models.VM_RUNNING_STATUS) {
|
|
|
|
|
self.OnGuestStart(ctx, guest, nil)
|
|
|
|
|
} else {
|
|
|
|
|
self.SetStageComplete(ctx, nil)
|
|
|
|
|
self.TaskCompleted(ctx, guest, "")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -229,12 +249,19 @@ func (self *GuestCreateBackupTask) OnGuestStart(ctx context.Context, guest *mode
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (self *GuestCreateBackupTask) OnSyncToBackup(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
|
|
|
|
|
self.TaskCompleted(ctx, guest, "")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (self *GuestCreateBackupTask) TaskCompleted(ctx context.Context, guest *models.SGuest, reason string) {
|
|
|
|
|
db.OpsLog.LogEvent(guest, db.ACT_CREATE_BACKUP, reason, self.UserCred)
|
|
|
|
|
logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_CREATE_BACKUP, reason, self.UserCred, true)
|
|
|
|
|
self.SetStageComplete(ctx, nil)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (self *GuestCreateBackupTask) TaskFailed(ctx context.Context, guest *models.SGuest, reason string) {
|
|
|
|
|
guest.SetStatus(self.UserCred, models.VM_BACKUP_CREATE_FAILED, reason)
|
|
|
|
|
db.OpsLog.LogEvent(guest, db.ACT_CREATE_BACKUP_FAILED, reason, self.UserCred)
|
|
|
|
|
logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_CREATE_BACKUP, reason, self.UserCred, false)
|
|
|
|
|
self.SetStageFailed(ctx, reason)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|