Files
cloudpods/pkg/compute/tasks/guest_start_task.go
T
Qiu Jian fcee2de326 修正:1. 由于系统盘大小设置单位未转换,导致阿里云创建主机失败 2.
伪删除阿里云主机后,detach了系统盘,导致主机恢复后无系统盘 3.
修正一些格式错误 4. 补充一些climc命令
2018-07-31 00:42:18 +08:00

83 lines
2.8 KiB
Go

package tasks
import (
"context"
"github.com/yunionio/jsonutils"
"github.com/yunionio/onecloud/pkg/cloudcommon/db"
"github.com/yunionio/onecloud/pkg/cloudcommon/db/taskman"
"github.com/yunionio/onecloud/pkg/compute/models"
)
type GuestStartTask struct {
SGuestBaseTask
}
func init() {
taskman.RegisterTask(GuestStartTask{})
}
func (self *GuestStartTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) {
guest := obj.(*models.SGuest)
self.checkTemplate(ctx, guest)
}
func (self *GuestStartTask) checkTemplate(ctx context.Context, guest *models.SGuest) {
diskCat := guest.CategorizeDisks()
if diskCat.Root != nil && len(diskCat.Root.GetTemplateId()) > 0 {
self.SetStage("on_start_template_ready", nil)
guest.GetDriver().CheckDiskTemplateOnStorage(ctx, self.UserCred, diskCat.Root.GetTemplateId(), diskCat.Root.StorageId, self)
} else {
self.startStart(ctx, guest)
}
}
func (self *GuestStartTask) OnStartTemplateReady(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) {
guest := obj.(*models.SGuest)
self.startStart(ctx, guest)
}
func (self *GuestStartTask) startStart(ctx context.Context, guest *models.SGuest) {
db.OpsLog.LogEvent(guest, db.ACT_STARTING, nil, self.UserCred)
self.SetStage("on_start_complete", nil)
host := guest.GetHost()
guest.SetStatus(self.UserCred, models.VM_STARTING, "")
result, err := guest.GetDriver().RequestStartOnHost(guest, host, self.UserCred, self)
if err != nil {
self.onStartGuestFailed(ctx, guest, err)
} else {
if result != nil && jsonutils.QueryBoolean(result, "is_running", false) {
guest.SetStatus(self.UserCred, models.VM_RUNNING, "start")
self.taskComplete(ctx, guest)
}
}
}
func (self *GuestStartTask) OnStartComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) {
guest := obj.(*models.SGuest)
db.OpsLog.LogEvent(guest, db.ACT_START, guest.GetShortDesc(), self.UserCred)
self.SetStage("on_guest_syncstatus_after_start", nil)
guest.StartSyncstatus(ctx, self.UserCred, self.GetTaskId())
// self.taskComplete(ctx, guest)
}
func (self *GuestStartTask) OnGuestSyncstatusAfterStart(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) {
guest := obj.(*models.SGuest)
self.taskComplete(ctx, guest)
}
func (self *GuestStartTask) OnStartCompleteFailed(ctx context.Context, obj db.IStandaloneModel, err jsonutils.JSONObject) {
guest := obj.(*models.SGuest)
db.OpsLog.LogEvent(guest, db.ACT_START_FAIL, err, self.UserCred)
}
func (self *GuestStartTask) onStartGuestFailed(ctx context.Context, guest *models.SGuest, err error) {
self.SetStageFailed(ctx, err.Error())
self.OnStartCompleteFailed(ctx, guest, jsonutils.NewString(err.Error()))
}
func (self *GuestStartTask) taskComplete(ctx context.Context, guest *models.SGuest) {
models.HostManager.ClearSchedDescCache(guest.HostId)
self.SetStageComplete(ctx, nil)
}