diff --git a/pkg/apis/compute/api.go b/pkg/apis/compute/api.go index 7cb1a4a45e..70f47a9d69 100644 --- a/pkg/apis/compute/api.go +++ b/pkg/apis/compute/api.go @@ -64,15 +64,27 @@ type NetworkConfig struct { // requried: false Mac string `json:"mac"` - // 子网内的IPv4地址, 若不指定会安装子网的地址分配策略分配一个IP地址 + // 如果是批量创建,指定每个网卡MAC地址 + // requried: false + Macs []string `json:"macs"` + + // 子网内的IPv4地址, 若不指定会按照子网的地址分配策略分配一个IP地址 // required: false Address string `json:"address"` + // 如果是批量创建,指定每台主机子网内的IPv4地址 + // required: false + Addresses []string `json:"addresses"` + // 子网内的IPv6地址 // required: false // swagger:ignore Address6 string `json:"address6"` + // 如果是批量创建,指定每台主机子网内的IPv4地址 + // required: false + Addresses6 []string `json:"addresses6"` + // 驱动方式 // 若指定镜像的网络驱动方式,此参数会被覆盖 Driver string `json:"driver"` diff --git a/pkg/cloudcommon/cmdline/parser.go b/pkg/cloudcommon/cmdline/parser.go index c8a210e5b9..6dded0adf8 100644 --- a/pkg/cloudcommon/cmdline/parser.go +++ b/pkg/cloudcommon/cmdline/parser.go @@ -239,6 +239,17 @@ func ParseNetworkConfig(desc string, idx int) (*compute.NetworkConfig, error) { netConfig.Mac = netutils.MacUnpackHex(p) } else if strings.HasPrefix(p, "wire=") { netConfig.Wire = p[len("wire="):] + } else if strings.HasPrefix(p, "macs=") { + macSegs := strings.Split(p[len("macs="):], ",") + macs := make([]string, len(macSegs)) + for i := range macSegs { + macs[i] = netutils.MacUnpackHex(macSegs[i]) + } + netConfig.Macs = macs + } else if strings.HasPrefix(p, "ips=") { + netConfig.Addresses = strings.Split(p[len("ips="):], ",") + } else if strings.HasPrefix(p, "ip6s=") { + netConfig.Addresses6 = strings.Split(p[len("ip6s="):], ",") } else if p == "[require_designated_ip]" { netConfig.RequireDesignatedIP = true } else if p == "[random_exit]" { diff --git a/pkg/cloudcommon/db/caller.go b/pkg/cloudcommon/db/caller.go index 12b1ffd736..1e44a2a28b 100644 --- a/pkg/cloudcommon/db/caller.go +++ b/pkg/cloudcommon/db/caller.go @@ -253,6 +253,22 @@ func ValidateCreateData(funcName string, manager IModelManager, ctx context.Cont return mergeInputOutputData(data, resVal), nil } +func ExpandBatchCreateData(manager IModelManager, ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict, index int) (*jsonutils.JSONDict, error) { + funcName := "ExpandBatchCreateData" + ret, err := call(manager, funcName, ctx, userCred, ownerId, query, data, index) + if err != nil { + return nil, errors.Wrapf(err, "call %s", funcName) + } + if len(ret) != 2 { + return nil, httperrors.NewInternalServerError("Invald %s return value", funcName) + } + resVal := ret[0] + if err := ValueToError(ret[1]); err != nil { + return nil, errors.Wrap(err, "ValueToError") + } + return mergeInputOutputData(data, resVal), nil +} + func ListItemFilter(manager IModelManager, ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { return _callListQueryFilter(manager, "ListItemFilter", ctx, q, userCred, query) } diff --git a/pkg/cloudcommon/db/db_dispatcher.go b/pkg/cloudcommon/db/db_dispatcher.go index 7de6e2cfb8..e8de6b1c27 100644 --- a/pkg/cloudcommon/db/db_dispatcher.go +++ b/pkg/cloudcommon/db/db_dispatcher.go @@ -1428,11 +1428,18 @@ func (dispatcher *DBModelDispatcher) Create(ctx context.Context, query jsonutils OpsLog.LogEvent(model, ACT_CREATE, notes, userCred) logclient.AddActionLogWithContext(ctx, model, logclient.ACT_CREATE, notes, userCred, true) } - manager.OnCreateComplete(ctx, []IModel{model}, userCred, ownerId, query, data) + manager.OnCreateComplete(ctx, []IModel{model}, userCred, ownerId, query, []jsonutils.JSONObject{data}) return getItemDetails(manager, model, ctx, userCred, query) } -func expandMultiCreateParams(manager IModelManager, data jsonutils.JSONObject, count int) ([]jsonutils.JSONObject, error) { +func expandMultiCreateParams(manager IModelManager, + ctx context.Context, + userCred mcclient.TokenCredential, + ownerId mcclient.IIdentityProvider, + query jsonutils.JSONObject, + data jsonutils.JSONObject, + count int, +) ([]jsonutils.JSONObject, error) { jsonDict, ok := data.(*jsonutils.JSONDict) if !ok { return nil, httperrors.NewInputParameterError("body is not a json?") @@ -1450,7 +1457,16 @@ func expandMultiCreateParams(manager IModelManager, data jsonutils.JSONObject, c } ret := make([]jsonutils.JSONObject, count) for i := 0; i < count; i += 1 { - ret[i] = jsonDict.Copy() + input, err := ExpandBatchCreateData(manager, ctx, userCred, ownerId, query, jsonDict.Copy(), i) + if err != nil { + if errors.Cause(err) == MethodNotFoundError { + ret[i] = jsonDict.Copy() + } else { + return nil, errors.Wrap(err, "ExpandBatchCreateData") + } + } else { + ret[i] = input + } } return ret, nil } @@ -1508,7 +1524,7 @@ func (dispatcher *DBModelDispatcher) BatchCreate(ctx context.Context, query json return nil, errors.Wrap(err, "manager.BatchPreValidate") } - multiData, err = expandMultiCreateParams(manager, data, count) + multiData, err = expandMultiCreateParams(manager, ctx, userCred, ownerId, query, data, count) if err != nil { return nil, errors.Wrap(err, "expandMultiCreateParams") } @@ -1517,6 +1533,7 @@ func (dispatcher *DBModelDispatcher) BatchCreate(ctx context.Context, query json ret := make([]sCreateResult, len(multiData)) for i := range multiData { var model IModel + log.Debugf("batchCreateDoCreateItem %d %s", i, multiData[i].String()) model, err = batchCreateDoCreateItem(manager, ctx, userCred, ownerId, query, multiData[i], i+1) if err == nil { ret[i] = sCreateResult{model: model, err: nil} @@ -1576,7 +1593,7 @@ func (dispatcher *DBModelDispatcher) BatchCreate(ctx context.Context, query json lockman.LockClass(ctx, manager, GetLockClassKey(manager, ownerId)) defer lockman.ReleaseClass(ctx, manager, GetLockClassKey(manager, ownerId)) - manager.OnCreateComplete(ctx, models, userCred, ownerId, query, multiData[0]) + manager.OnCreateComplete(ctx, models, userCred, ownerId, query, multiData) } return results, nil } diff --git a/pkg/cloudcommon/db/db_joint_dispatcher.go b/pkg/cloudcommon/db/db_joint_dispatcher.go index 14cc345f06..e949576d99 100644 --- a/pkg/cloudcommon/db/db_joint_dispatcher.go +++ b/pkg/cloudcommon/db/db_joint_dispatcher.go @@ -190,7 +190,7 @@ func attachItems( } item.PostCreate(ctx, userCred, nil, query, data) OpsLog.LogAttachEvent(ctx, master, slave, userCred, jsonutils.Marshal(item)) - dispatcher.manager.OnCreateComplete(ctx, []IModel{item}, userCred, nil, query, data) + dispatcher.manager.OnCreateComplete(ctx, []IModel{item}, userCred, nil, query, []jsonutils.JSONObject{data}) return getItemDetails(dispatcher.JointModelManager(), item, ctx, userCred, query) } diff --git a/pkg/cloudcommon/db/interface.go b/pkg/cloudcommon/db/interface.go index 9c0ff1b990..88d56554c7 100644 --- a/pkg/cloudcommon/db/interface.go +++ b/pkg/cloudcommon/db/interface.go @@ -96,7 +96,7 @@ type IModelManager interface { // BatchCreateValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) // ValidateCreateData dynamic called by dispatcher // ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) - OnCreateComplete(ctx context.Context, items []IModel, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) + OnCreateComplete(ctx context.Context, items []IModel, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data []jsonutils.JSONObject) BatchPreValidate(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict, count int) error diff --git a/pkg/cloudcommon/db/modelbase.go b/pkg/cloudcommon/db/modelbase.go index 9e887948ba..8894022ceb 100644 --- a/pkg/cloudcommon/db/modelbase.go +++ b/pkg/cloudcommon/db/modelbase.go @@ -271,7 +271,7 @@ func (manager *SModelBaseManager) ValidateCreateData(ctx context.Context, userCr return input, nil } -func (manager *SModelBaseManager) OnCreateComplete(ctx context.Context, items []IModel, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) { +func (manager *SModelBaseManager) OnCreateComplete(ctx context.Context, items []IModel, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data []jsonutils.JSONObject) { // do nothing } diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index 6bb00d68ed..3addd619cd 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -738,15 +738,15 @@ func (disk *SDisk) PostCreate(ctx context.Context, userCred mcclient.TokenCreden } } -func (manager *SDiskManager) OnCreateComplete(ctx context.Context, items []db.IModel, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) { +func (manager *SDiskManager) OnCreateComplete(ctx context.Context, items []db.IModel, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data []jsonutils.JSONObject) { input := api.DiskCreateInput{} - err := data.Unmarshal(&input) + err := data[0].Unmarshal(&input) if err != nil { log.Errorf("!!!data.Unmarshal api.DiskCreateInput fail %s", err) } pendingUsage := getDiskResourceRequirements(ctx, userCred, ownerId, input, len(items)) - parentTaskId, _ := data.GetString("parent_task_id") + parentTaskId, _ := data[0].GetString("parent_task_id") RunBatchCreateTask(ctx, items, userCred, data, pendingUsage, SRegionQuota{}, "DiskBatchCreateTask", parentTaskId) } diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 84434a291d..38e27d4cc8 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -1339,6 +1339,33 @@ func parseInstanceBackup(input *api.ServerCreateInput) (*api.ServerCreateInput, return input, nil } +func (manager *SGuestManager) ExpandBatchCreateData( + ctx context.Context, + userCred mcclient.TokenCredential, + ownerId mcclient.IIdentityProvider, + query jsonutils.JSONObject, + data *jsonutils.JSONDict, + index int, +) (*api.ServerCreateInput, error) { + input, err := cmdline.FetchServerCreateInputByJSON(data) + if err != nil { + return nil, err + } + for i := range input.Networks { + if index < len(input.Networks[i].Macs) { + input.Networks[i].Mac = input.Networks[i].Macs[index] + } + if index < len(input.Networks[i].Addresses) { + input.Networks[i].Address = input.Networks[i].Addresses[index] + } + if index < len(input.Networks[i].Addresses6) { + input.Networks[i].Address6 = input.Networks[i].Addresses6[index] + } + } + log.Debugf("ExpandBatchCreateData %s", jsonutils.Marshal(input)) + return input, nil +} + func (manager *SGuestManager) validateCreateData( ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*api.ServerCreateInput, error) { @@ -2279,9 +2306,9 @@ func (manager *SGuestManager) SetPropertiesWithInstanceSnapshot( } } -func (manager *SGuestManager) OnCreateComplete(ctx context.Context, items []db.IModel, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) { +func (manager *SGuestManager) OnCreateComplete(ctx context.Context, items []db.IModel, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data []jsonutils.JSONObject) { input := api.ServerCreateInput{} - data.Unmarshal(&input) + data[0].Unmarshal(&input) if len(input.InstanceSnapshotId) > 0 { manager.SetPropertiesWithInstanceSnapshot(ctx, userCred, input.InstanceSnapshotId, items) } diff --git a/pkg/compute/models/helper.go b/pkg/compute/models/helper.go index 257d4ee8aa..c8801ffb16 100644 --- a/pkg/compute/models/helper.go +++ b/pkg/compute/models/helper.go @@ -33,7 +33,7 @@ func RunBatchCreateTask( ctx context.Context, items []db.IModel, userCred mcclient.TokenCredential, - data jsonutils.JSONObject, + data []jsonutils.JSONObject, pendingUsage SQuota, pendingRegionUsage SRegionQuota, taskName string, @@ -43,11 +43,14 @@ func RunBatchCreateTask( for i, t := range items { taskItems[i] = t.(db.IStandaloneModel) } - params := data.(*jsonutils.JSONDict) + params := jsonutils.NewDict() + params.Set("data", jsonutils.NewArray(data...)) + task, err := taskman.TaskManager.NewParallelTask(ctx, taskName, taskItems, userCred, params, parentTaskId, "", &pendingUsage, &pendingRegionUsage) if err != nil { return errors.Wrapf(err, "NewParallelTask %s", taskName) } + return task.ScheduleRun(nil) } diff --git a/pkg/compute/models/instance_backup.go b/pkg/compute/models/instance_backup.go index f74e8f5fff..a3fdd6294d 100644 --- a/pkg/compute/models/instance_backup.go +++ b/pkg/compute/models/instance_backup.go @@ -536,8 +536,8 @@ func (manager *SInstanceBackupManager) ValidateCreateData(ctx context.Context, u return input, nil } -func (manager *SInstanceBackupManager) OnCreateComplete(ctx context.Context, items []db.IModel, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) { - packageName, _ := data.GetString("package_name") +func (manager *SInstanceBackupManager) OnCreateComplete(ctx context.Context, items []db.IModel, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data []jsonutils.JSONObject) { + packageName, _ := data[0].GetString("package_name") params := jsonutils.NewDict() params.Set("package_name", jsonutils.NewString(packageName)) for i := range items { diff --git a/pkg/compute/models/snapshotpolicy.go b/pkg/compute/models/snapshotpolicy.go index 8fd9753510..e780f9e93b 100644 --- a/pkg/compute/models/snapshotpolicy.go +++ b/pkg/compute/models/snapshotpolicy.go @@ -204,7 +204,7 @@ func (manager *SSnapshotPolicyManager) ValidateCreateData( } func (manager *SSnapshotPolicyManager) OnCreateComplete(ctx context.Context, items []db.IModel, - userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) { + userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data []jsonutils.JSONObject) { for i := range items { sp := items[i].(*SSnapshotPolicy) db.Update(sp, func() error { diff --git a/pkg/compute/models/snapshots.go b/pkg/compute/models/snapshots.go index 6f2037b4ee..9bf74b8ae0 100644 --- a/pkg/compute/models/snapshots.go +++ b/pkg/compute/models/snapshots.go @@ -529,7 +529,7 @@ func (snapshot *SSnapshot) PostCreate(ctx context.Context, userCred mcclient.Tok } } -func (manager *SSnapshotManager) OnCreateComplete(ctx context.Context, items []db.IModel, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) { +func (manager *SSnapshotManager) OnCreateComplete(ctx context.Context, items []db.IModel, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data []jsonutils.JSONObject) { snapshot := items[0].(*SSnapshot) snapshot.StartSnapshotCreateTask(ctx, userCred, nil, "") } diff --git a/pkg/compute/tasks/baremetal_convert_hypervisor_task.go b/pkg/compute/tasks/baremetal_convert_hypervisor_task.go index 0792501384..77deec8e4f 100644 --- a/pkg/compute/tasks/baremetal_convert_hypervisor_task.go +++ b/pkg/compute/tasks/baremetal_convert_hypervisor_task.go @@ -64,7 +64,7 @@ func (self *BaremetalConvertHypervisorTask) OnInit(ctx context.Context, obj db.I return } input.ParentTaskId = self.GetTaskId() - models.GuestManager.OnCreateComplete(ctx, []db.IModel{guest}, self.UserCred, self.UserCred, nil, jsonutils.Marshal(input)) + models.GuestManager.OnCreateComplete(ctx, []db.IModel{guest}, self.UserCred, self.UserCred, nil, []jsonutils.JSONObject{jsonutils.Marshal(input)}) } func (self *BaremetalConvertHypervisorTask) OnGuestDeployComplete(ctx context.Context, baremetal *models.SHost, body jsonutils.JSONObject) { diff --git a/pkg/compute/tasks/disk_backup_recovery_task.go b/pkg/compute/tasks/disk_backup_recovery_task.go index 59057c193f..12682e573f 100644 --- a/pkg/compute/tasks/disk_backup_recovery_task.go +++ b/pkg/compute/tasks/disk_backup_recovery_task.go @@ -96,7 +96,7 @@ func (self *DiskBackupRecoveryTask) OnInit(ctx context.Context, obj db.IStandalo self.SetStage("OnCreateDisk", params) params.Set("parent_task_id", jsonutils.NewString(self.GetTaskId())) - models.DiskManager.OnCreateComplete(ctx, []db.IModel{disk}, self.UserCred, ownerId, nil, params) + models.DiskManager.OnCreateComplete(ctx, []db.IModel{disk}, self.UserCred, ownerId, nil, []jsonutils.JSONObject{params}) } func (self *DiskBackupRecoveryTask) OnCreateDisk(ctx context.Context, backup *models.SDiskBackup, data jsonutils.JSONObject) { diff --git a/pkg/compute/tasks/disk_batch_create_task.go b/pkg/compute/tasks/disk_batch_create_task.go index 578b9fe267..99c70ac7a3 100644 --- a/pkg/compute/tasks/disk_batch_create_task.go +++ b/pkg/compute/tasks/disk_batch_create_task.go @@ -39,7 +39,7 @@ func init() { taskman.RegisterTask(DiskBatchCreateTask{}) } -func (self *DiskBatchCreateTask) getNeedScheduleDisks(objs []db.IStandaloneModel) []db.IStandaloneModel { +func (task *DiskBatchCreateTask) getNeedScheduleDisks(objs []db.IStandaloneModel) []db.IStandaloneModel { toSchedDisks := make([]db.IStandaloneModel, 0) for _, obj := range objs { disk := obj.(*models.SDisk) @@ -50,32 +50,37 @@ func (self *DiskBatchCreateTask) getNeedScheduleDisks(objs []db.IStandaloneModel return toSchedDisks } -func (self *DiskBatchCreateTask) clearPendingUsage(ctx context.Context, disk *models.SDisk) { - ClearTaskPendingUsage(ctx, self) - ClearTaskPendingRegionUsage(ctx, self) +func (task *DiskBatchCreateTask) clearPendingUsage(ctx context.Context, disk *models.SDisk) { + ClearTaskPendingUsage(ctx, task) + ClearTaskPendingRegionUsage(ctx, task) } -func (self *DiskBatchCreateTask) OnInit(ctx context.Context, objs []db.IStandaloneModel, body jsonutils.JSONObject) { - toSchedDisks := self.getNeedScheduleDisks(objs) +func (task *DiskBatchCreateTask) OnInit(ctx context.Context, objs []db.IStandaloneModel, body jsonutils.JSONObject) { + toSchedDisks := task.getNeedScheduleDisks(objs) if len(toSchedDisks) == 0 { - self.SetStage("OnScheduleComplete", nil) + task.SetStage("OnScheduleComplete", nil) // create not need schedule disks directly for _, disk := range objs { - self.startCreateDisk(ctx, disk.(*models.SDisk)) + task.startCreateDisk(ctx, disk.(*models.SDisk)) } return } - StartScheduleObjects(ctx, self, toSchedDisks) + StartScheduleObjects(ctx, task, toSchedDisks) } -func (self *DiskBatchCreateTask) GetCreateInput() (*api.DiskCreateInput, error) { +func (task *DiskBatchCreateTask) GetCreateInput(data jsonutils.JSONObject) (*api.DiskCreateInput, error) { input := new(api.DiskCreateInput) - err := self.GetParams().Unmarshal(input) + err := data.Unmarshal(input) return input, err } -func (self *DiskBatchCreateTask) GetSchedParams() (*schedapi.ScheduleInput, error) { - input, err := self.GetCreateInput() +func (task *DiskBatchCreateTask) GetSchedParams() (*schedapi.ScheduleInput, error) { + data := getBatchParamsAtIndex(task, 0) + return task.getSchedParamsInternal(data) +} + +func (task *DiskBatchCreateTask) getSchedParamsInternal(data jsonutils.JSONObject) (*schedapi.ScheduleInput, error) { + input, err := task.GetCreateInput(data) if err != nil { return nil, err } @@ -85,16 +90,16 @@ func (self *DiskBatchCreateTask) GetSchedParams() (*schedapi.ScheduleInput, erro return ret, err } -func (self *DiskBatchCreateTask) GetDisks() ([]*api.DiskConfig, error) { - input, err := self.GetSchedParams() +func (task *DiskBatchCreateTask) GetDisks(data jsonutils.JSONObject) ([]*api.DiskConfig, error) { + input, err := task.getSchedParamsInternal(data) if err != nil { return nil, err } return input.Disks, nil } -func (self *DiskBatchCreateTask) GetFirstDisk() (*api.DiskConfig, error) { - disks, err := self.GetDisks() +func (task *DiskBatchCreateTask) GetFirstDisk(data jsonutils.JSONObject) (*api.DiskConfig, error) { + disks, err := task.GetDisks(data) if err != nil { return nil, err } @@ -104,37 +109,39 @@ func (self *DiskBatchCreateTask) GetFirstDisk() (*api.DiskConfig, error) { return disks[0], nil } -func (self *DiskBatchCreateTask) OnScheduleFailCallback(ctx context.Context, obj IScheduleModel, reason jsonutils.JSONObject) { - self.SSchedTask.OnScheduleFailCallback(ctx, obj, reason) +func (task *DiskBatchCreateTask) OnScheduleFailCallback(ctx context.Context, obj IScheduleModel, reason jsonutils.JSONObject, index int) { + task.SSchedTask.OnScheduleFailCallback(ctx, obj, reason, index) disk := obj.(*models.SDisk) log.Errorf("Schedule disk %s failed", disk.Name) - self.clearPendingUsage(ctx, disk) + task.clearPendingUsage(ctx, disk) } -func (self *DiskBatchCreateTask) SaveScheduleResult(ctx context.Context, obj IScheduleModel, candidate *schedapi.CandidateResource) { +func (task *DiskBatchCreateTask) SaveScheduleResult(ctx context.Context, obj IScheduleModel, candidate *schedapi.CandidateResource, index int) { var err error disk := obj.(*models.SDisk) // pendingUsage := models.SQuota{} - // err = self.GetPendingUsage(&pendingUsage, 0) + // err = task.GetPendingUsage(&pendingUsage, 0) // if err != nil { // log.Errorf("GetPendingUsage fail %s", err) // } - // input, _ := self.GetCreateInput() + // input, _ := task.GetCreateInput() // quotaPlatform := models.GetQuotaPlatformID(input.Hypervisor) // quotaStorage := models.SQuota{Storage: disk.DiskSize} onError := func(err error) { - self.clearPendingUsage(ctx, disk) - disk.SetStatus(self.UserCred, api.DISK_ALLOC_FAILED, "") - logclient.AddActionLogWithStartable(self, disk, logclient.ACT_ALLOCATE, err, self.UserCred, false) - self.SetStageFailed(ctx, jsonutils.NewString(err.Error())) - db.OpsLog.LogEvent(disk, db.ACT_ALLOCATE_FAIL, err, self.UserCred) + task.clearPendingUsage(ctx, disk) + disk.SetStatus(task.UserCred, api.DISK_ALLOC_FAILED, "") + logclient.AddActionLogWithStartable(task, disk, logclient.ACT_ALLOCATE, err, task.UserCred, false) + task.SetStageFailed(ctx, jsonutils.NewString(err.Error())) + db.OpsLog.LogEvent(disk, db.ACT_ALLOCATE_FAIL, err, task.UserCred) notifyclient.NotifySystemErrorWithCtx(ctx, disk.Id, disk.Name, api.DISK_ALLOC_FAILED, err.Error()) } - diskConfig, err := self.GetFirstDisk() + data := getBatchParamsAtIndex(task, index) + + diskConfig, err := task.GetFirstDisk(data) if err != nil { onError(err) return @@ -152,12 +159,12 @@ func (self *DiskBatchCreateTask) SaveScheduleResult(ctx context.Context, obj ISc return } - self.startCreateDisk(ctx, disk) + task.startCreateDisk(ctx, disk) } -func (self *DiskBatchCreateTask) startCreateDisk(ctx context.Context, disk *models.SDisk) { +func (task *DiskBatchCreateTask) startCreateDisk(ctx context.Context, disk *models.SDisk) { pendingUsage := models.SQuota{} - err := self.GetPendingUsage(&pendingUsage, 0) + err := task.GetPendingUsage(&pendingUsage, 0) if err != nil { log.Warningf("GetPendingUsage fail %s", err) } @@ -168,12 +175,12 @@ func (self *DiskBatchCreateTask) startCreateDisk(ctx context.Context, disk *mode log.Warningf("disk.GetQuotaKeys fail %s", err) } quotaStorage.SetKeys(keys) - quotas.CancelPendingUsage(ctx, self.UserCred, &pendingUsage, "aStorage, true) // success - self.SetPendingUsage(&pendingUsage, 0) + quotas.CancelPendingUsage(ctx, task.UserCred, &pendingUsage, "aStorage, true) // success + task.SetPendingUsage(&pendingUsage, 0) - disk.StartDiskCreateTask(ctx, self.GetUserCred(), false, disk.SnapshotId, self.GetTaskId()) + disk.StartDiskCreateTask(ctx, task.GetUserCred(), false, disk.SnapshotId, task.GetTaskId()) } -func (self *DiskBatchCreateTask) OnScheduleComplete(ctx context.Context, items []db.IStandaloneModel, data *jsonutils.JSONDict) { - self.SetStageComplete(ctx, nil) +func (task *DiskBatchCreateTask) OnScheduleComplete(ctx context.Context, items []db.IStandaloneModel, data *jsonutils.JSONDict) { + task.SetStageComplete(ctx, nil) } diff --git a/pkg/compute/tasks/guest_backup_tasks.go b/pkg/compute/tasks/guest_backup_tasks.go index 99dba59ed5..12a51c20f4 100644 --- a/pkg/compute/tasks/guest_backup_tasks.go +++ b/pkg/compute/tasks/guest_backup_tasks.go @@ -39,87 +39,87 @@ type GuestSwitchToBackupTask struct { 2. switch guest master host to backup host 3. start guest with new master */ -func (self *GuestSwitchToBackupTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { +func (task *GuestSwitchToBackupTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { guest := obj.(*models.SGuest) host, _ := guest.GetHost() - self.Params.Set("is_force", jsonutils.JSONTrue) - self.SetStage("OnEnsureMasterGuestStoped", nil) - err := guest.GetDriver().RequestStopOnHost(ctx, guest, host, self, true) + task.Params.Set("is_force", jsonutils.JSONTrue) + task.SetStage("OnEnsureMasterGuestStoped", nil) + err := guest.GetDriver().RequestStopOnHost(ctx, guest, host, task, true) if err != nil { // In case of master host crash - self.OnEnsureMasterGuestStoped(ctx, guest, nil) + task.OnEnsureMasterGuestStoped(ctx, guest, nil) } } -func (self *GuestSwitchToBackupTask) OnEnsureMasterGuestStoped(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { +func (task *GuestSwitchToBackupTask) OnEnsureMasterGuestStoped(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { backupHost := models.HostManager.FetchHostById(guest.BackupHostId) - self.Params.Set("is_force", jsonutils.JSONTrue) - self.SetStage("OnBackupGuestStoped", nil) - err := guest.GetDriver().RequestStopOnHost(ctx, guest, backupHost, self, true) + task.Params.Set("is_force", jsonutils.JSONTrue) + task.SetStage("OnBackupGuestStoped", nil) + err := guest.GetDriver().RequestStopOnHost(ctx, guest, backupHost, task, true) if err != nil { - self.OnFail(ctx, guest, jsonutils.NewString(err.Error())) + task.OnFail(ctx, guest, jsonutils.NewString(err.Error())) } } -func (self *GuestSwitchToBackupTask) OnBackupGuestStoped(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { +func (task *GuestSwitchToBackupTask) OnBackupGuestStoped(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { disks, err := guest.GetDisks() if err != nil { - self.OnFail(ctx, guest, jsonutils.NewString(err.Error())) + task.OnFail(ctx, guest, jsonutils.NewString(err.Error())) return } for i := 0; i < len(disks); i++ { disk := disks[i] - err := disk.SwitchToBackup(self.UserCred) + err := disk.SwitchToBackup(task.UserCred) if err != nil { if i > 0 { for j := 0; j < i; j++ { disk = disks[j] - disk.SwitchToBackup(self.UserCred) + disk.SwitchToBackup(task.UserCred) } } - self.OnFail(ctx, guest, jsonutils.NewString(fmt.Sprintf("Switch to backup disk error: %s", err))) + task.OnFail(ctx, guest, jsonutils.NewString(fmt.Sprintf("Switch to backup disk error: %s", err))) return } } - err = guest.SwitchToBackup(self.UserCred) + err = guest.SwitchToBackup(task.UserCred) if err != nil { - self.OnFail(ctx, guest, jsonutils.NewString(fmt.Sprintf("Switch to backup guest error: %s", err))) + task.OnFail(ctx, guest, jsonutils.NewString(fmt.Sprintf("Switch to backup guest error: %s", err))) return } - 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) - oldStatus, _ := self.Params.GetString("old_status") - autoStart := jsonutils.QueryBoolean(self.Params, "auto_start", false) || + db.OpsLog.LogEvent(guest, db.ACT_SWITCHED, "Switch to backup", task.UserCred) + logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_SWITCH_TO_BACKUP, "Switch to backup", task.UserCred, true) + oldStatus, _ := task.Params.GetString("old_status") + autoStart := jsonutils.QueryBoolean(task.Params, "auto_start", false) || utils.IsInStringArray(oldStatus, api.VM_RUNNING_STATUS) if autoStart { - self.SetStage("OnGuestStartCompleted", nil) - if err := guest.StartGueststartTask(ctx, self.UserCred, nil, self.GetId()); err != nil { - self.OnGuestStartCompletedFailed(ctx, guest, + task.SetStage("OnGuestStartCompleted", nil) + if err := guest.StartGueststartTask(ctx, task.UserCred, nil, task.GetId()); err != nil { + task.OnGuestStartCompletedFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("start guest start task: %s", err))) } } else { - self.OnComplete(ctx, guest, nil) + task.OnComplete(ctx, guest, nil) } } -func (self *GuestSwitchToBackupTask) OnFail(ctx context.Context, guest *models.SGuest, reason jsonutils.JSONObject) { - guest.SetStatus(self.UserCred, api.VM_SWITCH_TO_BACKUP_FAILED, reason.String()) - 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) +func (task *GuestSwitchToBackupTask) OnFail(ctx context.Context, guest *models.SGuest, reason jsonutils.JSONObject) { + guest.SetStatus(task.UserCred, api.VM_SWITCH_TO_BACKUP_FAILED, reason.String()) + db.OpsLog.LogEvent(guest, db.ACT_SWITCH_FAILED, reason, task.UserCred) + logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_SWITCH_TO_BACKUP, reason, task.UserCred, false) + task.SetStageFailed(ctx, reason) } -func (self *GuestSwitchToBackupTask) OnGuestStartCompleted(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.SetStageComplete(ctx, nil) +func (task *GuestSwitchToBackupTask) OnGuestStartCompleted(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.SetStageComplete(ctx, nil) } -func (self *GuestSwitchToBackupTask) OnGuestStartCompletedFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.SetStageFailed(ctx, data) +func (task *GuestSwitchToBackupTask) OnGuestStartCompletedFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.SetStageFailed(ctx, data) } -func (self *GuestSwitchToBackupTask) OnComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.SetStageComplete(ctx, nil) +func (task *GuestSwitchToBackupTask) OnComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.SetStageComplete(ctx, nil) } /********************* GuestStartAndSyncToBackupTask *********************/ @@ -128,156 +128,156 @@ type GuestStartAndSyncToBackupTask struct { SGuestBaseTask } -func (self *GuestStartAndSyncToBackupTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { +func (task *GuestStartAndSyncToBackupTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { guest := obj.(*models.SGuest) - guest.SetStatus(self.UserCred, api.VM_BACKUP_STARTING, "GuestStartAndSyncToBackupTask") - self.SetStage("OnCheckTemplete", nil) - self.checkTemplete(ctx, guest) + guest.SetStatus(task.UserCred, api.VM_BACKUP_STARTING, "GuestStartAndSyncToBackupTask") + task.SetStage("OnCheckTemplete", nil) + task.checkTemplete(ctx, guest) } -func (self *GuestStartAndSyncToBackupTask) checkTemplete(ctx context.Context, guest *models.SGuest) { +func (task *GuestStartAndSyncToBackupTask) checkTemplete(ctx context.Context, guest *models.SGuest) { diskCat := guest.CategorizeDisks() if diskCat.Root != nil && len(diskCat.Root.GetTemplateId()) > 0 { - err := guest.GetDriver().CheckDiskTemplateOnStorage(ctx, self.UserCred, diskCat.Root.GetTemplateId(), diskCat.Root.DiskFormat, - diskCat.Root.BackupStorageId, self) + err := guest.GetDriver().CheckDiskTemplateOnStorage(ctx, task.UserCred, diskCat.Root.GetTemplateId(), diskCat.Root.DiskFormat, + diskCat.Root.BackupStorageId, task) if err != nil { - self.SetStageFailed(ctx, jsonutils.NewString(err.Error())) + task.SetStageFailed(ctx, jsonutils.NewString(err.Error())) } } else { - self.OnCheckTemplete(ctx, guest, nil) + task.OnCheckTemplete(ctx, guest, nil) } } -func (self *GuestStartAndSyncToBackupTask) OnCheckTemplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.SetStage("OnStartBackupGuest", nil) +func (task *GuestStartAndSyncToBackupTask) OnCheckTemplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.SetStage("OnStartBackupGuest", nil) host := models.HostManager.FetchHostById(guest.BackupHostId) - if !guest.IsGuestBackupMirrorJobReady(ctx, self.UserCred) { + if !guest.IsGuestBackupMirrorJobReady(ctx, task.UserCred) { hostMaster := models.HostManager.FetchHostById(guest.HostId) - self.Params.Set("block_ready", jsonutils.JSONFalse) + task.Params.Set("block_ready", jsonutils.JSONFalse) diskUri := fmt.Sprintf("%s/disks", hostMaster.GetFetchUrl(true)) - self.Params.Set("disk_uri", jsonutils.NewString(diskUri)) + task.Params.Set("disk_uri", jsonutils.NewString(diskUri)) } else { - self.Params.Set("block_ready", jsonutils.JSONTrue) + task.Params.Set("block_ready", jsonutils.JSONTrue) } - err := guest.GetDriver().RequestStartOnHost(ctx, guest, host, self.UserCred, self) + err := guest.GetDriver().RequestStartOnHost(ctx, guest, host, task.UserCred, task) if err != nil { - self.SetStageFailed(ctx, jsonutils.NewString(err.Error())) + task.SetStageFailed(ctx, jsonutils.NewString(err.Error())) } } -func (self *GuestStartAndSyncToBackupTask) OnStartBackupGuest(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - guest.SetBackupGuestStatus(self.UserCred, api.VM_RUNNING, "on start backup guest") +func (task *GuestStartAndSyncToBackupTask) OnStartBackupGuest(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + guest.SetBackupGuestStatus(task.UserCred, api.VM_RUNNING, "on start backup guest") nbdServerPort, err := data.Int("nbd_server_port") if err != nil { - self.SetStageFailed(ctx, jsonutils.NewString("Start Backup Guest Missing Nbd Port")) + task.SetStageFailed(ctx, jsonutils.NewString("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, guest.GetShortDesc(ctx), self.UserCred) + guest.SetMetadata(ctx, "backup_nbd_server_uri", nbdServerUri, task.UserCred) + db.OpsLog.LogEvent(guest, db.ACT_BACKUP_START, guest.GetShortDesc(ctx), task.UserCred) // try get origin guest status - guestStatus, err := self.Params.GetString("guest_status") + guestStatus, err := task.Params.GetString("guest_status") if err != nil { guestStatus = guest.Status } if utils.IsInStringArray(guestStatus, api.VM_RUNNING_STATUS) { - self.SetStage("OnRequestSyncToBackup", nil) - err = guest.GetDriver().RequestSyncToBackup(ctx, guest, self) + task.SetStage("OnRequestSyncToBackup", nil) + err = guest.GetDriver().RequestSyncToBackup(ctx, guest, task) if err != nil { - self.SetStageFailed(ctx, jsonutils.NewString(err.Error())) + task.SetStageFailed(ctx, jsonutils.NewString(err.Error())) } } else { - self.onComplete(ctx, guest) + task.onComplete(ctx, guest) } } -func (self *GuestStartAndSyncToBackupTask) OnStartBackupGuestFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - guest.SetGuestBackupMirrorJobFailed(ctx, self.UserCred) - db.OpsLog.LogEvent(guest, db.ACT_BACKUP_START_FAILED, data.String(), self.UserCred) - self.SetStageFailed(ctx, data) +func (task *GuestStartAndSyncToBackupTask) OnStartBackupGuestFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + guest.SetGuestBackupMirrorJobFailed(ctx, task.UserCred) + db.OpsLog.LogEvent(guest, db.ACT_BACKUP_START_FAILED, data.String(), task.UserCred) + task.SetStageFailed(ctx, data) } -func (self *GuestStartAndSyncToBackupTask) OnRequestSyncToBackup(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - guest.SetGuestBackupMirrorJobInProgress(ctx, self.UserCred) - err := guest.GetDriver().RequestSlaveBlockStreamDisks(ctx, guest, self) +func (task *GuestStartAndSyncToBackupTask) OnRequestSyncToBackup(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + guest.SetGuestBackupMirrorJobInProgress(ctx, task.UserCred) + err := guest.GetDriver().RequestSlaveBlockStreamDisks(ctx, guest, task) if err != nil { - guest.SetGuestBackupMirrorJobFailed(ctx, self.UserCred) - guest.SetBackupGuestStatus(self.UserCred, api.VM_BLOCK_STREAM_FAIL, err.Error()) - self.SetStageFailed(ctx, jsonutils.NewString(err.Error())) + guest.SetGuestBackupMirrorJobFailed(ctx, task.UserCred) + guest.SetBackupGuestStatus(task.UserCred, api.VM_BLOCK_STREAM_FAIL, err.Error()) + task.SetStageFailed(ctx, jsonutils.NewString(err.Error())) return } - guest.SetGuestBackupMirrorJobInProgress(ctx, self.UserCred) - guest.SetBackupGuestStatus(self.UserCred, api.VM_BLOCK_STREAM, "OnSyncToBackup") - self.onComplete(ctx, guest) + guest.SetGuestBackupMirrorJobInProgress(ctx, task.UserCred) + guest.SetBackupGuestStatus(task.UserCred, api.VM_BLOCK_STREAM, "OnSyncToBackup") + task.onComplete(ctx, guest) } -func (self *GuestStartAndSyncToBackupTask) onComplete(ctx context.Context, guest *models.SGuest) { - guestStatus, _ := self.Params.GetString("guest_status") - guest.SetStatus(self.UserCred, guestStatus, "on GuestStartAndSyncToBackupTask completed") - self.SetStageComplete(ctx, nil) +func (task *GuestStartAndSyncToBackupTask) onComplete(ctx context.Context, guest *models.SGuest) { + guestStatus, _ := task.Params.GetString("guest_status") + guest.SetStatus(task.UserCred, guestStatus, "on GuestStartAndSyncToBackupTask completed") + task.SetStageComplete(ctx, nil) } -func (self *GuestStartAndSyncToBackupTask) OnRequestSyncToBackupFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - guest.SetGuestBackupMirrorJobFailed(ctx, self.UserCred) - guest.SetStatus(self.UserCred, api.VM_BLOCK_STREAM_FAIL, "OnSyncToBackup") - self.SetStageFailed(ctx, data) +func (task *GuestStartAndSyncToBackupTask) OnRequestSyncToBackupFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + guest.SetGuestBackupMirrorJobFailed(ctx, task.UserCred) + guest.SetStatus(task.UserCred, api.VM_BLOCK_STREAM_FAIL, "OnSyncToBackup") + task.SetStageFailed(ctx, data) } type GuestCreateBackupTask struct { SSchedTask } -func (self *GuestCreateBackupTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { - StartScheduleObjects(ctx, self, []db.IStandaloneModel{obj}) +func (task *GuestCreateBackupTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { + StartScheduleObjects(ctx, task, []db.IStandaloneModel{obj}) } -func (self *GuestCreateBackupTask) OnStartSchedule(obj IScheduleModel) { +func (task *GuestCreateBackupTask) OnStartSchedule(obj IScheduleModel) { guest := obj.(*models.SGuest) - db.OpsLog.LogEvent(guest, db.ACT_START_CREATE_BACKUP, "", self.UserCred) + db.OpsLog.LogEvent(guest, db.ACT_START_CREATE_BACKUP, "", task.UserCred) } -func (self *GuestCreateBackupTask) GetSchedParams() (*schedapi.ScheduleInput, error) { - obj := self.GetObject() +func (task *GuestCreateBackupTask) GetSchedParams() (*schedapi.ScheduleInput, error) { + obj := task.GetObject() guest := obj.(*models.SGuest) schedDesc := guest.ToSchedDesc() - if self.Params.Contains("prefer_host_id") { - preferHostId, _ := self.Params.GetString("prefer_host_id") + if task.Params.Contains("prefer_host_id") { + preferHostId, _ := task.Params.GetString("prefer_host_id") schedDesc.ServerConfig.PreferHost = preferHostId } schedDesc.ReuseNetwork = true return schedDesc, nil } -func (self *GuestCreateBackupTask) OnScheduleFailCallback(ctx context.Context, obj IScheduleModel, reason jsonutils.JSONObject) { +func (task *GuestCreateBackupTask) OnScheduleFailCallback(ctx context.Context, obj IScheduleModel, reason jsonutils.JSONObject, index int) { // do nothing } -func (self *GuestCreateBackupTask) OnScheduleFailed(ctx context.Context, reason jsonutils.JSONObject) { - obj := self.GetObject() +func (task *GuestCreateBackupTask) OnScheduleFailed(ctx context.Context, reason jsonutils.JSONObject) { + obj := task.GetObject() guest := obj.(*models.SGuest) - self.TaskFailed(ctx, guest, reason) + task.TaskFailed(ctx, guest, reason) } -func (self *GuestCreateBackupTask) SaveScheduleResult(ctx context.Context, obj IScheduleModel, candidate *schedapi.CandidateResource) { +func (task *GuestCreateBackupTask) SaveScheduleResult(ctx context.Context, obj IScheduleModel, candidate *schedapi.CandidateResource, index int) { guest := obj.(*models.SGuest) targetHostId := candidate.HostId targetHost := models.HostManager.FetchHostById(candidate.HostId) if targetHost == nil { - self.TaskFailed(ctx, guest, jsonutils.NewString("target host not found?")) + task.TaskFailed(ctx, guest, jsonutils.NewString("target host not found?")) return } - guest.SetHostIdWithBackup(self.UserCred, guest.HostId, targetHostId) - db.OpsLog.LogEvent(guest, db.ACT_CREATE_BACKUP, fmt.Sprintf("guest backup start create on host %s", targetHostId), self.UserCred) + guest.SetHostIdWithBackup(task.UserCred, guest.HostId, targetHostId) + db.OpsLog.LogEvent(guest, db.ACT_CREATE_BACKUP, fmt.Sprintf("guest backup start create on host %s", targetHostId), task.UserCred) - self.StartCreateBackupDisks(ctx, guest, targetHost, candidate.Disks) + task.StartCreateBackupDisks(ctx, guest, targetHost, candidate.Disks) } -func (self *GuestCreateBackupTask) StartCreateBackupDisks(ctx context.Context, guest *models.SGuest, host *models.SHost, candidateDisks []*schedapi.CandidateDisk) { +func (task *GuestCreateBackupTask) StartCreateBackupDisks(ctx context.Context, guest *models.SGuest, host *models.SHost, candidateDisks []*schedapi.CandidateDisk) { guestDisks, _ := guest.GetGuestDisks() for i := 0; i < len(guestDisks); i++ { var candidateDisk *schedapi.CandidateDisk @@ -287,11 +287,11 @@ func (self *GuestCreateBackupTask) StartCreateBackupDisks(ctx context.Context, g diskConfig := &api.DiskConfig{Backend: api.STORAGE_LOCAL} storage, err := guest.ChooseHostStorage(host, diskConfig, candidateDisk) if err != nil { - self.TaskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("unable to ChooseHostStorage: %v", err))) + task.TaskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("unable to ChooseHostStorage: %v", err))) return } if storage == nil { - self.TaskFailed(ctx, guest, jsonutils.NewString("Get backup storage error")) + task.TaskFailed(ctx, guest, jsonutils.NewString("Get backup storage error")) return } disk := guestDisks[i].GetDisk() @@ -300,99 +300,99 @@ func (self *GuestCreateBackupTask) StartCreateBackupDisks(ctx context.Context, g return nil }) } - self.SetStage("OnCreateBackupDisks", nil) - err := guest.CreateBackupDisks(ctx, self.UserCred, self.GetTaskId()) + task.SetStage("OnCreateBackupDisks", nil) + err := guest.CreateBackupDisks(ctx, task.UserCred, task.GetTaskId()) if err != nil { - self.TaskFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.TaskFailed(ctx, guest, jsonutils.NewString(err.Error())) } } -func (self *GuestCreateBackupTask) StartInsertIso(ctx context.Context, guest *models.SGuest, imageId string) { - self.SetStage("OnInsertIso", nil) - guest.StartInsertIsoTask(ctx, 0, imageId, false, nil, guest.BackupHostId, self.UserCred, self.GetTaskId()) +func (task *GuestCreateBackupTask) StartInsertIso(ctx context.Context, guest *models.SGuest, imageId string) { + task.SetStage("OnInsertIso", nil) + guest.StartInsertIsoTask(ctx, 0, imageId, false, nil, guest.BackupHostId, task.UserCred, task.GetTaskId()) } -func (self *GuestCreateBackupTask) OnInsertIso(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.SetStage("OnCreateBackup", nil) - guest.StartCreateBackup(ctx, self.UserCred, self.GetTaskId(), nil) +func (task *GuestCreateBackupTask) OnInsertIso(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.SetStage("OnCreateBackup", nil) + guest.StartCreateBackup(ctx, task.UserCred, task.GetTaskId(), nil) } -func (self *GuestCreateBackupTask) OnInsertIsoFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.TaskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("Backup guest insert ISO failed %s", data.String()))) +func (task *GuestCreateBackupTask) OnInsertIsoFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.TaskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("Backup guest insert ISO failed %s", data.String()))) } -func (self *GuestCreateBackupTask) OnCreateBackupDisks(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { +func (task *GuestCreateBackupTask) OnCreateBackupDisks(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { if cdrom := guest.GetCdrom(); cdrom != nil && len(cdrom.ImageId) > 0 { - self.StartInsertIso(ctx, guest, cdrom.ImageId) + task.StartInsertIso(ctx, guest, cdrom.ImageId) } else { - self.SetStage("OnCreateBackup", nil) - guest.StartCreateBackup(ctx, self.UserCred, self.GetTaskId(), nil) + task.SetStage("OnCreateBackup", nil) + guest.StartCreateBackup(ctx, task.UserCred, task.GetTaskId(), nil) } } -func (self *GuestCreateBackupTask) OnCreateBackupDisksFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.TaskFailed(ctx, guest, data) +func (task *GuestCreateBackupTask) OnCreateBackupDisksFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.TaskFailed(ctx, guest, data) } -func (self *GuestCreateBackupTask) OnCreateBackupFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.TaskFailed(ctx, guest, data) +func (task *GuestCreateBackupTask) OnCreateBackupFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.TaskFailed(ctx, guest, data) } -func (self *GuestCreateBackupTask) OnCreateBackup(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - guest.SetBackupGuestStatus(self.UserCred, api.VM_READY, "on create backup") - guestStatus, _ := self.Params.GetString("guest_status") +func (task *GuestCreateBackupTask) OnCreateBackup(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + guest.SetBackupGuestStatus(task.UserCred, api.VM_READY, "on create backup") + guestStatus, _ := task.Params.GetString("guest_status") if utils.IsInStringArray(guestStatus, api.VM_RUNNING_STATUS) { - self.OnGuestStart(ctx, guest, guestStatus) - } else if jsonutils.QueryBoolean(self.Params, "auto_start", false) { - self.RequestStartGuest(ctx, guest) + task.OnGuestStart(ctx, guest, guestStatus) + } else if jsonutils.QueryBoolean(task.Params, "auto_start", false) { + task.RequestStartGuest(ctx, guest) } else { - self.TaskCompleted(ctx, guest, "") + task.TaskCompleted(ctx, guest, "") } } -func (self *GuestCreateBackupTask) OnGuestStart(ctx context.Context, guest *models.SGuest, guestStatus string) { - self.SetStage("OnSyncToBackup", nil) - err := guest.GuestStartAndSyncToBackup(ctx, self.UserCred, self.GetTaskId(), guestStatus) +func (task *GuestCreateBackupTask) OnGuestStart(ctx context.Context, guest *models.SGuest, guestStatus string) { + task.SetStage("OnSyncToBackup", nil) + err := guest.GuestStartAndSyncToBackup(ctx, task.UserCred, task.GetTaskId(), guestStatus) if err != nil { - self.TaskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("Guest sycn to backup error %s", err.Error()))) + task.TaskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("Guest sycn to backup error %s", err.Error()))) } } -func (self *GuestCreateBackupTask) OnSyncToBackup(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.TaskCompleted(ctx, guest, "") +func (task *GuestCreateBackupTask) OnSyncToBackup(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.TaskCompleted(ctx, guest, "") } -func (self *GuestCreateBackupTask) OnSyncToBackupFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.TaskFailed(ctx, guest, data) +func (task *GuestCreateBackupTask) OnSyncToBackupFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.TaskFailed(ctx, guest, data) } -func (self *GuestCreateBackupTask) RequestStartGuest(ctx context.Context, guest *models.SGuest) { - self.SetStage("OnGuestStartCompleted", nil) - guest.StartGueststartTask(ctx, self.UserCred, nil, self.GetId()) +func (task *GuestCreateBackupTask) RequestStartGuest(ctx context.Context, guest *models.SGuest) { + task.SetStage("OnGuestStartCompleted", nil) + guest.StartGueststartTask(ctx, task.UserCred, nil, task.GetId()) } -func (self *GuestCreateBackupTask) OnGuestStartCompleted(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.TaskCompleted(ctx, guest, "") +func (task *GuestCreateBackupTask) OnGuestStartCompleted(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.TaskCompleted(ctx, guest, "") } -func (self *GuestCreateBackupTask) OnGuestStartCompletedFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - db.OpsLog.LogEvent(guest, db.ACT_CREATE_BACKUP_FAILED, data.String(), self.UserCred) - logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_CREATE_BACKUP, data.String(), self.UserCred, false) - self.SetStageFailed(ctx, data) +func (task *GuestCreateBackupTask) OnGuestStartCompletedFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + db.OpsLog.LogEvent(guest, db.ACT_CREATE_BACKUP_FAILED, data.String(), task.UserCred) + logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_CREATE_BACKUP, data.String(), task.UserCred, false) + task.SetStageFailed(ctx, data) } -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) - guest.StartSyncstatus(ctx, self.UserCred, "") +func (task *GuestCreateBackupTask) TaskCompleted(ctx context.Context, guest *models.SGuest, reason string) { + db.OpsLog.LogEvent(guest, db.ACT_CREATE_BACKUP, reason, task.UserCred) + logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_CREATE_BACKUP, reason, task.UserCred, true) + task.SetStageComplete(ctx, nil) + guest.StartSyncstatus(ctx, task.UserCred, "") } -func (self *GuestCreateBackupTask) TaskFailed(ctx context.Context, guest *models.SGuest, reason jsonutils.JSONObject) { - guest.SetStatus(self.UserCred, api.VM_BACKUP_CREATE_FAILED, reason.String()) - 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) +func (task *GuestCreateBackupTask) TaskFailed(ctx context.Context, guest *models.SGuest, reason jsonutils.JSONObject) { + guest.SetStatus(task.UserCred, api.VM_BACKUP_CREATE_FAILED, reason.String()) + db.OpsLog.LogEvent(guest, db.ACT_CREATE_BACKUP_FAILED, reason, task.UserCred) + logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_CREATE_BACKUP, reason, task.UserCred, false) + task.SetStageFailed(ctx, reason) } func init() { @@ -406,14 +406,14 @@ type GuestReSyncToBackup struct { GuestStartAndSyncToBackupTask } -func (self *GuestReSyncToBackup) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { +func (task *GuestReSyncToBackup) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { guest := obj.(*models.SGuest) - self.StartSyncToBackup(ctx, guest) + task.StartSyncToBackup(ctx, guest) } -func (self *GuestReSyncToBackup) StartSyncToBackup(ctx context.Context, guest *models.SGuest) { +func (task *GuestReSyncToBackup) StartSyncToBackup(ctx context.Context, guest *models.SGuest) { data := jsonutils.NewDict() - nbdServerPort, _ := self.Params.Int("nbd_server_port") + nbdServerPort, _ := task.Params.Int("nbd_server_port") data.Set("nbd_server_port", jsonutils.NewInt(nbdServerPort)) - self.OnStartBackupGuest(ctx, guest, data) + task.OnStartBackupGuest(ctx, guest, data) } diff --git a/pkg/compute/tasks/guest_batch_create_task.go b/pkg/compute/tasks/guest_batch_create_task.go index abb5778fe1..9e6038c5d2 100644 --- a/pkg/compute/tasks/guest_batch_create_task.go +++ b/pkg/compute/tasks/guest_batch_create_task.go @@ -42,8 +42,8 @@ func init() { taskman.RegisterTask(GuestBatchCreateTask{}) } -func (self *GuestBatchCreateTask) GetSchedParams() (*schedapi.ScheduleInput, error) { - params := self.GetParams() +func (task *GuestBatchCreateTask) GetSchedParams() (*schedapi.ScheduleInput, error) { + params := getBatchParamsAtIndex(task, 0) input, err := cmdline.FetchScheduleInputByJSON(params) if err != nil { return nil, fmt.Errorf("Unmarsh to schedule input: %v", err) @@ -51,16 +51,16 @@ func (self *GuestBatchCreateTask) GetSchedParams() (*schedapi.ScheduleInput, err return input, err } -func (self *GuestBatchCreateTask) GetDisks() ([]*api.DiskConfig, error) { - input, err := self.GetSchedParams() +func (task *GuestBatchCreateTask) GetDisks() ([]*api.DiskConfig, error) { + input, err := task.GetSchedParams() if err != nil { return nil, err } return input.Disks, nil } -func (self *GuestBatchCreateTask) GetFirstDisk() (*api.DiskConfig, error) { - disks, err := self.GetDisks() +func (task *GuestBatchCreateTask) GetFirstDisk() (*api.DiskConfig, error) { + disks, err := task.GetDisks() if err != nil { return nil, err } @@ -70,46 +70,46 @@ func (self *GuestBatchCreateTask) GetFirstDisk() (*api.DiskConfig, error) { return disks[0], nil } -func (self *GuestBatchCreateTask) GetCreateInput() (*api.ServerCreateInput, error) { +func (task *GuestBatchCreateTask) GetCreateInput(data jsonutils.JSONObject) (*api.ServerCreateInput, error) { input := new(api.ServerCreateInput) - err := self.GetParams().Unmarshal(input) + err := data.Unmarshal(input) return input, err } -func (self *GuestBatchCreateTask) clearPendingUsage(ctx context.Context, guest *models.SGuest) { - ClearTaskPendingUsage(ctx, self) - ClearTaskPendingRegionUsage(ctx, self) +func (task *GuestBatchCreateTask) clearPendingUsage(ctx context.Context, guest *models.SGuest) { + ClearTaskPendingUsage(ctx, task) + ClearTaskPendingRegionUsage(ctx, task) } -func (self *GuestBatchCreateTask) OnInit(ctx context.Context, objs []db.IStandaloneModel, body jsonutils.JSONObject) { - StartScheduleObjects(ctx, self, objs) +func (task *GuestBatchCreateTask) OnInit(ctx context.Context, objs []db.IStandaloneModel, body jsonutils.JSONObject) { + StartScheduleObjects(ctx, task, objs) } -func (self *GuestBatchCreateTask) OnScheduleFailCallback(ctx context.Context, obj IScheduleModel, reason jsonutils.JSONObject) { +func (task *GuestBatchCreateTask) OnScheduleFailCallback(ctx context.Context, obj IScheduleModel, reason jsonutils.JSONObject, index int) { guest := obj.(*models.SGuest) if guest.DisableDelete.IsTrue() { - guest.SetDisableDelete(self.UserCred, false) + guest.SetDisableDelete(task.UserCred, false) } - self.clearPendingUsage(ctx, guest) - self.SSchedTask.OnScheduleFailCallback(ctx, obj, reason) + task.clearPendingUsage(ctx, guest) + task.SSchedTask.OnScheduleFailCallback(ctx, obj, reason, index) } -func (self *GuestBatchCreateTask) SaveScheduleResultWithBackup(ctx context.Context, obj IScheduleModel, master, slave *schedapi.CandidateResource) { +func (task *GuestBatchCreateTask) SaveScheduleResultWithBackup(ctx context.Context, obj IScheduleModel, master, slave *schedapi.CandidateResource, index int) { guest := obj.(*models.SGuest) - guest.SetHostIdWithBackup(self.UserCred, master.HostId, slave.HostId) - self.SaveScheduleResult(ctx, obj, master) + guest.SetHostIdWithBackup(task.UserCred, master.HostId, slave.HostId) + task.SaveScheduleResult(ctx, obj, master, index) } -func (self *GuestBatchCreateTask) allocateGuestOnHost(ctx context.Context, guest *models.SGuest, candidate *schedapi.CandidateResource) error { +func (task *GuestBatchCreateTask) allocateGuestOnHost(ctx context.Context, guest *models.SGuest, candidate *schedapi.CandidateResource, data *jsonutils.JSONDict) error { pendingUsage := models.SQuota{} - err := self.GetPendingUsage(&pendingUsage, 0) + err := task.GetPendingUsage(&pendingUsage, 0) if err != nil { log.Errorf("GetPendingUsage fail %s", err) } if conditionparser.IsTemplate(guest.Name) { guestInfo := guest.GetShortDesc(ctx) - generateName := guest.GetMetadata(ctx, "generate_name", self.UserCred) + generateName := guest.GetMetadata(ctx, "generate_name", task.UserCred) if len(generateName) == 0 { generateName = guest.Name } @@ -146,40 +146,42 @@ func (self *GuestBatchCreateTask) allocateGuestOnHost(ctx context.Context, guest log.Errorf("guest.GetQuotaKeys fail %s", err) } quotaCpuMem.SetKeys(keys) - err = quotas.CancelPendingUsage(ctx, self.UserCred, &pendingUsage, "aCpuMem, true) // success - self.SetPendingUsage(&pendingUsage, 0) + err = quotas.CancelPendingUsage(ctx, task.UserCred, &pendingUsage, "aCpuMem, true) // success + task.SetPendingUsage(&pendingUsage, 0) - input, err := self.GetCreateInput() + input, err := task.GetCreateInput(data) if err != nil { log.Errorf("GetCreateInput fail %s", err) - } - - if host.IsPrepaidRecycle() { - input, err = host.SetGuestCreateNetworkAndDiskParams(ctx, self.UserCred, input) - if err != nil { - log.Errorf("host.SetGuestCreateNetworkAndDiskParams fail %s", err) - guest.SetStatus(self.UserCred, api.VM_CREATE_FAILED, err.Error()) - return err - } - params := input.JSON(input) - self.SaveParams(params) - } - - input, err = self.GetCreateInput() - if err != nil { - guest.SetStatus(self.UserCred, api.VM_CREATE_FAILED, err.Error()) + guest.SetStatus(task.UserCred, api.VM_CREATE_FAILED, err.Error()) return err } + if host.IsPrepaidRecycle() { + input, err = host.SetGuestCreateNetworkAndDiskParams(ctx, task.UserCred, input) + if err != nil { + log.Errorf("host.SetGuestCreateNetworkAndDiskParams fail %s", err) + guest.SetStatus(task.UserCred, api.VM_CREATE_FAILED, err.Error()) + return err + } + // params := input.JSON(input) + // task.SaveParams(params) + } + + /*input, err = task.GetCreateInput(data) + if err != nil { + guest.SetStatus(task.UserCred, api.VM_CREATE_FAILED, err.Error()) + return err + }*/ + pendingRegionUsage := models.SRegionQuota{} - self.GetPendingUsage(&pendingRegionUsage, 1) + task.GetPendingUsage(&pendingRegionUsage, 1) // allocate networks - err = guest.CreateNetworksOnHost(ctx, self.UserCred, host, input.Networks, &pendingRegionUsage, &pendingUsage, candidate.Nets) - self.SetPendingUsage(&pendingUsage, 0) - self.SetPendingUsage(&pendingRegionUsage, 1) + err = guest.CreateNetworksOnHost(ctx, task.UserCred, host, input.Networks, &pendingRegionUsage, &pendingUsage, candidate.Nets) + task.SetPendingUsage(&pendingUsage, 0) + task.SetPendingUsage(&pendingRegionUsage, 1) if err != nil { log.Errorf("Network failed: %s", err) - guest.SetStatus(self.UserCred, api.VM_NETWORK_FAILED, err.Error()) + guest.SetStatus(task.UserCred, api.VM_NETWORK_FAILED, err.Error()) return err } @@ -189,7 +191,7 @@ func (self *GuestBatchCreateTask) allocateGuestOnHost(ctx context.Context, guest // allocate eips if input.EipBw > 0 { - eip, err := models.ElasticipManager.NewEipForVMOnHost(ctx, self.UserCred, &models.NewEipForVMOnHostArgs{ + eip, err := models.ElasticipManager.NewEipForVMOnHost(ctx, task.UserCred, &models.NewEipForVMOnHostArgs{ Bandwidth: input.EipBw, BgpType: input.EipBgpType, ChargeType: input.EipChargeType, @@ -199,20 +201,20 @@ func (self *GuestBatchCreateTask) allocateGuestOnHost(ctx context.Context, guest Host: host, PendingUsage: &pendingRegionUsage, }) - self.SetPendingUsage(&pendingRegionUsage, 1) + task.SetPendingUsage(&pendingRegionUsage, 1) if err != nil { log.Errorf("guest.CreateElasticipOnHost failed: %s", err) - guest.SetStatus(self.UserCred, api.VM_NETWORK_FAILED, err.Error()) + guest.SetStatus(task.UserCred, api.VM_NETWORK_FAILED, err.Error()) return err } input.Eip = eip.Id } // allocate disks - extraDisks, err := guest.GetDriver().PrepareDiskRaidConfig(self.UserCred, host, input.BaremetalDiskConfigs, input.Disks) + extraDisks, err := guest.GetDriver().PrepareDiskRaidConfig(task.UserCred, host, input.BaremetalDiskConfigs, input.Disks) if err != nil { log.Errorf("PrepareDiskRaidConfig fail: %s", err) - guest.SetStatus(self.UserCred, api.VM_DISK_FAILED, err.Error()) + guest.SetStatus(task.UserCred, api.VM_DISK_FAILED, err.Error()) return err } if len(extraDisks) > 0 { @@ -224,39 +226,39 @@ func (self *GuestBatchCreateTask) allocateGuestOnHost(ctx context.Context, guest backupCandidateDisks = candidate.BackupCandidate.Disks } // 纳管的云需要有关联关系后,在做deploy时才有磁盘的信息 - err = guest.CreateDisksOnHost(ctx, self.UserCred, host, input.Disks, &pendingUsage, true, true, candidate.Disks, backupCandidateDisks, true) - self.SetPendingUsage(&pendingUsage, 0) + err = guest.CreateDisksOnHost(ctx, task.UserCred, host, input.Disks, &pendingUsage, true, true, candidate.Disks, backupCandidateDisks, true) + task.SetPendingUsage(&pendingUsage, 0) if err != nil { log.Errorf("Disk create failed: %s", err) - guest.SetStatus(self.UserCred, api.VM_DISK_FAILED, err.Error()) + guest.SetStatus(task.UserCred, api.VM_DISK_FAILED, err.Error()) return err } // allocate GPUs - err = guest.CreateIsolatedDeviceOnHost(ctx, self.UserCred, host, input.IsolatedDevices, &pendingUsage) - self.SetPendingUsage(&pendingUsage, 0) + err = guest.CreateIsolatedDeviceOnHost(ctx, task.UserCred, host, input.IsolatedDevices, &pendingUsage) + task.SetPendingUsage(&pendingUsage, 0) if err != nil { log.Errorf("IsolatedDevices create failed: %s", err) - guest.SetStatus(self.UserCred, api.VM_DEVICE_FAILED, err.Error()) + guest.SetStatus(task.UserCred, api.VM_DEVICE_FAILED, err.Error()) return err } // join groups if input.InstanceGroupIds != nil && len(input.InstanceGroupIds) != 0 { - err := guest.JoinGroups(ctx, self.UserCred, input.InstanceGroupIds) + err := guest.JoinGroups(ctx, task.UserCred, input.InstanceGroupIds) if err != nil { log.Errorf("Join Groups failed: %v", err) - guest.SetStatus(self.UserCred, api.VM_CREATE_FAILED, err.Error()) + guest.SetStatus(task.UserCred, api.VM_CREATE_FAILED, err.Error()) return err } } if guest.IsPrepaidRecycle() { - err := host.RebuildRecycledGuest(ctx, self.UserCred, guest) + err := host.RebuildRecycledGuest(ctx, task.UserCred, guest) if err != nil { log.Errorf("start guest create task fail %s", err) - guest.SetStatus(self.UserCred, api.VM_CREATE_FAILED, err.Error()) + guest.SetStatus(task.UserCred, api.VM_CREATE_FAILED, err.Error()) return err } @@ -266,46 +268,48 @@ func (self *GuestBatchCreateTask) allocateGuestOnHost(ctx context.Context, guest resetPassword = *input.ResetPassword } passwd := input.Password - err = guest.StartRebuildRootTask(ctx, self.UserCred, "", false, autoStart, passwd, resetPassword, true) + err = guest.StartRebuildRootTask(ctx, task.UserCred, "", false, autoStart, passwd, resetPassword, true) if err != nil { log.Errorf("start guest create task fail %s", err) - guest.SetStatus(self.UserCred, api.VM_CREATE_FAILED, err.Error()) + guest.SetStatus(task.UserCred, api.VM_CREATE_FAILED, err.Error()) return err } return nil } - err = guest.StartGuestCreateTask(ctx, self.UserCred, input, nil, self.GetId()) + err = guest.StartGuestCreateTask(ctx, task.UserCred, input, nil, task.GetId()) if err != nil { log.Errorf("start guest create task fail %s", err) - guest.SetStatus(self.UserCred, api.VM_CREATE_FAILED, err.Error()) + guest.SetStatus(task.UserCred, api.VM_CREATE_FAILED, err.Error()) return err } return nil } -func (self *GuestBatchCreateTask) SaveScheduleResult(ctx context.Context, obj IScheduleModel, candidate *schedapi.CandidateResource) { +func (task *GuestBatchCreateTask) SaveScheduleResult(ctx context.Context, obj IScheduleModel, candidate *schedapi.CandidateResource, index int) { var err error hostId := candidate.HostId guest := obj.(*models.SGuest) if len(guest.HostId) == 0 { - guest.OnScheduleToHost(ctx, self.UserCred, hostId) + guest.OnScheduleToHost(ctx, task.UserCred, hostId) } - err = self.allocateGuestOnHost(ctx, guest, candidate) + data := getBatchParamsAtIndex(task, index) + + err = task.allocateGuestOnHost(ctx, guest, candidate, data) if err != nil { - self.clearPendingUsage(ctx, guest) - db.OpsLog.LogEvent(guest, db.ACT_ALLOCATE_FAIL, err, self.UserCred) - logclient.AddActionLogWithStartable(self, obj, logclient.ACT_ALLOCATE, err, self.GetUserCred(), false) - notifyclient.EventNotify(ctx, self.GetUserCred(), notifyclient.SEventNotifyParam{ + task.clearPendingUsage(ctx, guest) + db.OpsLog.LogEvent(guest, db.ACT_ALLOCATE_FAIL, err, task.UserCred) + logclient.AddActionLogWithStartable(task, obj, logclient.ACT_ALLOCATE, err, task.GetUserCred(), false) + notifyclient.EventNotify(ctx, task.GetUserCred(), notifyclient.SEventNotifyParam{ Obj: guest, Action: notifyclient.ActionCreateBackupServer, IsFail: true, }) - self.SetStageFailed(ctx, jsonutils.NewString(err.Error())) + task.SetStageFailed(ctx, jsonutils.NewString(err.Error())) } } -func (self *GuestBatchCreateTask) OnScheduleComplete(ctx context.Context, items []db.IStandaloneModel, data *jsonutils.JSONDict) { - self.SetStageComplete(ctx, nil) +func (task *GuestBatchCreateTask) OnScheduleComplete(ctx context.Context, items []db.IStandaloneModel, data *jsonutils.JSONDict) { + task.SetStageComplete(ctx, nil) } diff --git a/pkg/compute/tasks/guest_change_config_task.go b/pkg/compute/tasks/guest_change_config_task.go index ddb8ef84cb..95c2a924c5 100644 --- a/pkg/compute/tasks/guest_change_config_task.go +++ b/pkg/compute/tasks/guest_change_config_task.go @@ -40,49 +40,49 @@ func init() { taskman.RegisterTask(GuestChangeConfigTask{}) } -func (self *GuestChangeConfigTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { - StartScheduleObjects(ctx, self, nil) +func (task *GuestChangeConfigTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { + StartScheduleObjects(ctx, task, nil) } -func (self *GuestChangeConfigTask) GetSchedParams() (*schedapi.ScheduleInput, error) { +func (task *GuestChangeConfigTask) GetSchedParams() (*schedapi.ScheduleInput, error) { schedInput := new(schedapi.ScheduleInput) - err := self.Params.Unmarshal(schedInput, "sched_desc") + err := task.Params.Unmarshal(schedInput, "sched_desc") if err != nil { return nil, err } return schedInput, nil } -func (self *GuestChangeConfigTask) OnStartSchedule(obj IScheduleModel) { +func (task *GuestChangeConfigTask) OnStartSchedule(obj IScheduleModel) { // do nothing } -func (self *GuestChangeConfigTask) OnScheduleFailCallback(ctx context.Context, obj IScheduleModel, reason jsonutils.JSONObject) { +func (task *GuestChangeConfigTask) OnScheduleFailCallback(ctx context.Context, obj IScheduleModel, reason jsonutils.JSONObject, index int) { // do nothing } -func (self *GuestChangeConfigTask) OnScheduleFailed(ctx context.Context, reason jsonutils.JSONObject) { - obj := self.GetObject() +func (task *GuestChangeConfigTask) OnScheduleFailed(ctx context.Context, reason jsonutils.JSONObject) { + obj := task.GetObject() guest := obj.(*models.SGuest) - self.markStageFailed(ctx, guest, reason) + task.markStageFailed(ctx, guest, reason) } -func (self *GuestChangeConfigTask) SaveScheduleResult(ctx context.Context, obj IScheduleModel, target *schedapi.CandidateResource) { +func (task *GuestChangeConfigTask) SaveScheduleResult(ctx context.Context, obj IScheduleModel, target *schedapi.CandidateResource, index int) { // must get object from task, because of obj is nil - guest := self.GetObject().(*models.SGuest) - self.Params.Set("sched_session_id", jsonutils.NewString(target.SessionId)) - if self.Params.Contains("create") { + guest := task.GetObject().(*models.SGuest) + task.Params.Set("sched_session_id", jsonutils.NewString(target.SessionId)) + if task.Params.Contains("create") { disks := make([]*api.DiskConfig, 0) - err := self.Params.Unmarshal(&disks, "create") + err := task.Params.Unmarshal(&disks, "create") if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.markStageFailed(ctx, guest, jsonutils.NewString(err.Error())) return } var resizeDisksCount = 0 - if self.Params.Contains("resize") { - iResizeDisks, err := self.Params.Get("resize") + if task.Params.Contains("resize") { + iResizeDisks, err := task.Params.Get("resize") if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.markStageFailed(ctx, guest, jsonutils.NewString(err.Error())) return } resizeDisksCount = iResizeDisks.(*jsonutils.JSONArray).Length() @@ -90,120 +90,120 @@ func (self *GuestChangeConfigTask) SaveScheduleResult(ctx context.Context, obj I for i := 0; i < len(disks); i++ { disks[i].Storage = target.Disks[resizeDisksCount+i].StorageIds[0] } - self.Params.Set("create", jsonutils.Marshal(disks)) + task.Params.Set("create", jsonutils.Marshal(disks)) } - self.SetStage("StartResizeDisks", nil) + task.SetStage("StartResizeDisks", nil) - self.StartResizeDisks(ctx, guest, nil) + task.StartResizeDisks(ctx, guest, nil) } -func (self *GuestChangeConfigTask) StartResizeDisks(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - _, err := self.Params.Get("resize") +func (task *GuestChangeConfigTask) StartResizeDisks(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + _, err := task.Params.Get("resize") if err == nil { - self.SetStage("OnDisksResizeComplete", nil) - self.OnDisksResizeComplete(ctx, guest, data) + task.SetStage("OnDisksResizeComplete", nil) + task.OnDisksResizeComplete(ctx, guest, data) } else { - self.DoCreateDisksTask(ctx, guest) + task.DoCreateDisksTask(ctx, guest) } } -func (self *GuestChangeConfigTask) OnDisksResizeComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { +func (task *GuestChangeConfigTask) OnDisksResizeComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { guest := obj.(*models.SGuest) - iResizeDisks, err := self.Params.Get("resize") + iResizeDisks, err := task.Params.Get("resize") if iResizeDisks == nil || err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.markStageFailed(ctx, guest, jsonutils.NewString(err.Error())) return } resizeDisks := iResizeDisks.(*jsonutils.JSONArray) for i := 0; i < resizeDisks.Length(); i++ { iResizeSet, err := resizeDisks.GetAt(i) if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("resizeDisks.GetAt fail %s", err))) + task.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("resizeDisks.GetAt fail %s", err))) return } resizeSet := iResizeSet.(*jsonutils.JSONArray) diskId, err := resizeSet.GetAt(0) if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("resizeSet.GetAt(0) fail %s", err))) + task.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("resizeSet.GetAt(0) fail %s", err))) return } idStr, err := diskId.GetString() if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("diskId.GetString fail %s", err))) + task.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("diskId.GetString fail %s", err))) return } jSize, err := resizeSet.GetAt(1) if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("resizeSet.GetAt(1) fail %s", err))) + task.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("resizeSet.GetAt(1) fail %s", err))) return } size, err := jSize.Int() if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("jSize.Int fail %s", err))) + task.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("jSize.Int fail %s", err))) return } iDisk, err := models.DiskManager.FetchById(idStr) if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("models.DiskManager.FetchById(idStr) fail %s", err))) + task.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("models.DiskManager.FetchById(idStr) fail %s", err))) return } disk := iDisk.(*models.SDisk) if disk.DiskSize < int(size) { var pendingUsage models.SQuota - err = self.GetPendingUsage(&pendingUsage, 0) + err = task.GetPendingUsage(&pendingUsage, 0) if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("self.GetPendingUsage(&pendingUsage) fail %s", err))) + task.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("task.GetPendingUsage(&pendingUsage) fail %s", err))) return } - err = guest.StartGuestDiskResizeTask(ctx, self.UserCred, disk.Id, size, self.GetTaskId(), &pendingUsage) + err = guest.StartGuestDiskResizeTask(ctx, task.UserCred, disk.Id, size, task.GetTaskId(), &pendingUsage) if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("guest.StartGuestDiskResizeTask fail %s", err))) + task.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("guest.StartGuestDiskResizeTask fail %s", err))) return } return } } - self.DoCreateDisksTask(ctx, guest) + task.DoCreateDisksTask(ctx, guest) } -func (self *GuestChangeConfigTask) DoCreateDisksTask(ctx context.Context, guest *models.SGuest) { +func (task *GuestChangeConfigTask) DoCreateDisksTask(ctx context.Context, guest *models.SGuest) { disks := make([]*api.DiskConfig, 0) - err := self.Params.Unmarshal(&disks, "create") + err := task.Params.Unmarshal(&disks, "create") if err != nil || len(disks) == 0 { - self.OnCreateDisksComplete(ctx, guest, nil) + task.OnCreateDisksComplete(ctx, guest, nil) return } host, _ := guest.GetHost() - err = guest.CreateDisksOnHost(ctx, self.UserCred, host, disks, nil, false, false, nil, nil, false) + err = guest.CreateDisksOnHost(ctx, task.UserCred, host, disks, nil, false, false, nil, nil, false) if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.markStageFailed(ctx, guest, jsonutils.NewString(err.Error())) return } - self.SetStage("OnCreateDisksComplete", nil) - guest.StartGuestCreateDiskTask(ctx, self.UserCred, disks, self.GetTaskId()) + task.SetStage("OnCreateDisksComplete", nil) + guest.StartGuestCreateDiskTask(ctx, task.UserCred, disks, task.GetTaskId()) } -func (self *GuestChangeConfigTask) OnCreateDisksCompleteFailed(ctx context.Context, obj db.IStandaloneModel, err jsonutils.JSONObject) { +func (task *GuestChangeConfigTask) OnCreateDisksCompleteFailed(ctx context.Context, obj db.IStandaloneModel, err jsonutils.JSONObject) { guest := obj.(*models.SGuest) - self.markStageFailed(ctx, guest, err) + task.markStageFailed(ctx, guest, err) } -func (self *GuestChangeConfigTask) OnCreateDisksComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { +func (task *GuestChangeConfigTask) OnCreateDisksComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { guest := obj.(*models.SGuest) - if self.Params.Contains("instance_type") || self.Params.Contains("vcpu_count") || self.Params.Contains("vmem_size") { - self.SetStage("OnGuestChangeCpuMemSpecComplete", nil) - instanceType, _ := self.Params.GetString("instance_type") - vcpuCount, _ := self.Params.Int("vcpu_count") - vmemSize, _ := self.Params.Int("vmem_size") + if task.Params.Contains("instance_type") || task.Params.Contains("vcpu_count") || task.Params.Contains("vmem_size") { + task.SetStage("OnGuestChangeCpuMemSpecComplete", nil) + instanceType, _ := task.Params.GetString("instance_type") + vcpuCount, _ := task.Params.Int("vcpu_count") + vmemSize, _ := task.Params.Int("vmem_size") if len(instanceType) > 0 { provider := guest.GetDriver().GetProvider() sku, err := models.ServerSkuManager.FetchSkuByNameAndProvider(instanceType, provider, false) if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("models.ServerSkuManager.FetchSkuByNameAndProvider error %s", err))) + task.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("models.ServerSkuManager.FetchSkuByNameAndProvider error %s", err))) return } vcpuCount = int64(sku.CpuCoreCount) @@ -216,26 +216,26 @@ func (self *GuestChangeConfigTask) OnCreateDisksComplete(ctx context.Context, ob vmemSize = int64(guest.VmemSize) } } - self.startGuestChangeCpuMemSpec(ctx, guest, instanceType, vcpuCount, vmemSize) + task.startGuestChangeCpuMemSpec(ctx, guest, instanceType, vcpuCount, vmemSize) } else { - self.OnGuestChangeCpuMemSpecComplete(ctx, obj, data) + task.OnGuestChangeCpuMemSpecComplete(ctx, obj, data) } } -func (self *GuestChangeConfigTask) startGuestChangeCpuMemSpec(ctx context.Context, guest *models.SGuest, instanceType string, vcpuCount int64, vmemSize int64) { - err := guest.GetDriver().RequestChangeVmConfig(ctx, guest, self, instanceType, vcpuCount, vmemSize) +func (task *GuestChangeConfigTask) startGuestChangeCpuMemSpec(ctx context.Context, guest *models.SGuest, instanceType string, vcpuCount int64, vmemSize int64) { + err := guest.GetDriver().RequestChangeVmConfig(ctx, guest, task, instanceType, vcpuCount, vmemSize) if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.markStageFailed(ctx, guest, jsonutils.NewString(err.Error())) return } } -func (self *GuestChangeConfigTask) OnGuestChangeCpuMemSpecComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { +func (task *GuestChangeConfigTask) OnGuestChangeCpuMemSpecComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { guest := obj.(*models.SGuest) - instanceType, _ := self.Params.GetString("instance_type") - vcpuCount, _ := self.Params.Int("vcpu_count") - vmemSize, _ := self.Params.Int("vmem_size") + instanceType, _ := task.Params.GetString("instance_type") + vcpuCount, _ := task.Params.Int("vcpu_count") + vmemSize, _ := task.Params.Int("vmem_size") if len(instanceType) == 0 { skus, err := models.ServerSkuManager.GetSkus(api.CLOUD_PROVIDER_ONECLOUD, int(vcpuCount), int(vmemSize)) @@ -260,7 +260,7 @@ func (self *GuestChangeConfigTask) OnGuestChangeCpuMemSpecComplete(ctx context.C return nil }) if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("Update fail %s", err))) + task.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("Update fail %s", err))) return } changeConfigSpec := guest.GetShortDesc(ctx) @@ -274,12 +274,12 @@ func (self *GuestChangeConfigTask) OnGuestChangeCpuMemSpecComplete(ctx context.C changeConfigSpec.Set("instance_type", jsonutils.NewString(instanceType)) } - db.OpsLog.LogEvent(guest, db.ACT_CHANGE_FLAVOR, changeConfigSpec.String(), self.UserCred) + db.OpsLog.LogEvent(guest, db.ACT_CHANGE_FLAVOR, changeConfigSpec.String(), task.UserCred) var pendingUsage models.SQuota - err = self.GetPendingUsage(&pendingUsage, 0) + err = task.GetPendingUsage(&pendingUsage, 0) if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("GetPendingUsage %s", err))) + task.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("GetPendingUsage %s", err))) return } var cancelUsage models.SQuota @@ -297,7 +297,7 @@ func (self *GuestChangeConfigTask) OnGuestChangeCpuMemSpecComplete(ctx context.C keys, err := guest.GetQuotaKeys() if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("guest.GetQuotaKeys %s", err))) + task.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("guest.GetQuotaKeys %s", err))) return } cancelUsage.SetKeys(keys) @@ -307,108 +307,108 @@ func (self *GuestChangeConfigTask) OnGuestChangeCpuMemSpecComplete(ctx context.C defer lockman.ReleaseClass(ctx, guest.GetModelManager(), guest.ProjectId) if !cancelUsage.IsEmpty() { - err = quotas.CancelPendingUsage(ctx, self.UserCred, &pendingUsage, &cancelUsage, true) // success + err = quotas.CancelPendingUsage(ctx, task.UserCred, &pendingUsage, &cancelUsage, true) // success if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("CancelPendingUsage fail %s", err))) + task.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("CancelPendingUsage fail %s", err))) return } - err = self.SetPendingUsage(&pendingUsage, 0) + err = task.SetPendingUsage(&pendingUsage, 0) if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("SetPendingUsage fail %s", err))) + task.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("SetPendingUsage fail %s", err))) return } } if !reduceUsage.IsEmpty() { - quotas.CancelUsages(ctx, self.UserCred, []db.IUsage{&reduceUsage}) + quotas.CancelUsages(ctx, task.UserCred, []db.IUsage{&reduceUsage}) } - self.OnGuestChangeCpuMemSpecFinish(ctx, guest) + task.OnGuestChangeCpuMemSpecFinish(ctx, guest) } -func (self *GuestChangeConfigTask) OnGuestChangeCpuMemSpecCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - if err := guest.GetDriver().OnGuestChangeCpuMemFailed(ctx, guest, data.(*jsonutils.JSONDict), self); err != nil { +func (task *GuestChangeConfigTask) OnGuestChangeCpuMemSpecCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + if err := guest.GetDriver().OnGuestChangeCpuMemFailed(ctx, guest, data.(*jsonutils.JSONDict), task); err != nil { log.Errorln(err) } - self.markStageFailed(ctx, guest, data) + task.markStageFailed(ctx, guest, data) } -func (self *GuestChangeConfigTask) OnGuestChangeCpuMemSpecFinish(ctx context.Context, guest *models.SGuest) { +func (task *GuestChangeConfigTask) OnGuestChangeCpuMemSpecFinish(ctx context.Context, guest *models.SGuest) { models.HostManager.ClearSchedDescCache(guest.HostId) - self.SetStage("OnSyncConfigComplete", nil) - err := guest.StartSyncTaskWithoutSyncstatus(ctx, self.UserCred, false, self.GetTaskId()) + task.SetStage("OnSyncConfigComplete", nil) + err := guest.StartSyncTaskWithoutSyncstatus(ctx, task.UserCred, false, task.GetTaskId()) if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("StartSyncstatus fail %s", err))) + task.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("StartSyncstatus fail %s", err))) return } } -func (self *GuestChangeConfigTask) OnSyncConfigComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { +func (task *GuestChangeConfigTask) OnSyncConfigComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { guest := obj.(*models.SGuest) - self.SetStage("on_sync_status_complete", nil) - err := guest.StartSyncstatus(ctx, self.UserCred, self.GetTaskId()) + task.SetStage("on_sync_status_complete", nil) + err := guest.StartSyncstatus(ctx, task.UserCred, task.GetTaskId()) if err != nil { - self.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("StartSyncstatus fail %s", err))) + task.markStageFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("StartSyncstatus fail %s", err))) return } } -func (self *GuestChangeConfigTask) OnSyncStatusComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { +func (task *GuestChangeConfigTask) OnSyncStatusComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { guest := obj.(*models.SGuest) - if guest.Status == api.VM_READY && jsonutils.QueryBoolean(self.Params, "auto_start", false) { - self.SetStage("OnGuestStartComplete", nil) - guest.StartGueststartTask(ctx, self.UserCred, nil, self.GetTaskId()) + if guest.Status == api.VM_READY && jsonutils.QueryBoolean(task.Params, "auto_start", false) { + task.SetStage("OnGuestStartComplete", nil) + guest.StartGueststartTask(ctx, task.UserCred, nil, task.GetTaskId()) } else { dt := jsonutils.NewDict() dt.Add(jsonutils.NewString(guest.Id), "id") - self.SetStageComplete(ctx, dt) + task.SetStageComplete(ctx, dt) } - logclient.AddActionLogWithStartable(self, guest, logclient.ACT_VM_CHANGE_FLAVOR, "", self.UserCred, true) - guest.EventNotify(ctx, self.UserCred, notifyclient.ActionChangeConfig) + logclient.AddActionLogWithStartable(task, guest, logclient.ACT_VM_CHANGE_FLAVOR, "", task.UserCred, true) + guest.EventNotify(ctx, task.UserCred, notifyclient.ActionChangeConfig) } -func (self *GuestChangeConfigTask) OnGuestStartComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { +func (task *GuestChangeConfigTask) OnGuestStartComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { guest := obj.(*models.SGuest) dt := jsonutils.NewDict() dt.Add(jsonutils.NewString(guest.Id), "id") - self.SetStageComplete(ctx, dt) + task.SetStageComplete(ctx, dt) } -func (self *GuestChangeConfigTask) OnGuestStartCompleteFailed(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { - self.SetStageFailed(ctx, data) +func (task *GuestChangeConfigTask) OnGuestStartCompleteFailed(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { + task.SetStageFailed(ctx, data) } -func (self *GuestChangeConfigTask) markStageFailed(ctx context.Context, guest *models.SGuest, reason jsonutils.JSONObject) { - guest.SetStatus(self.UserCred, api.VM_CHANGE_FLAVOR_FAIL, reason.String()) - db.OpsLog.LogEvent(guest, db.ACT_CHANGE_FLAVOR_FAIL, reason, self.UserCred) - logclient.AddActionLogWithStartable(self, guest, logclient.ACT_VM_CHANGE_FLAVOR, reason, self.UserCred, false) - notifyclient.EventNotify(ctx, self.GetUserCred(), notifyclient.SEventNotifyParam{ +func (task *GuestChangeConfigTask) markStageFailed(ctx context.Context, guest *models.SGuest, reason jsonutils.JSONObject) { + guest.SetStatus(task.UserCred, api.VM_CHANGE_FLAVOR_FAIL, reason.String()) + db.OpsLog.LogEvent(guest, db.ACT_CHANGE_FLAVOR_FAIL, reason, task.UserCred) + logclient.AddActionLogWithStartable(task, guest, logclient.ACT_VM_CHANGE_FLAVOR, reason, task.UserCred, false) + notifyclient.EventNotify(ctx, task.GetUserCred(), notifyclient.SEventNotifyParam{ Obj: guest, Action: notifyclient.ActionChangeConfig, IsFail: true, }) - self.SetStageFailed(ctx, reason) + task.SetStageFailed(ctx, reason) } -func (self *GuestChangeConfigTask) SetStageFailed(ctx context.Context, reason jsonutils.JSONObject) { - guest := self.GetObject().(*models.SGuest) +func (task *GuestChangeConfigTask) SetStageFailed(ctx context.Context, reason jsonutils.JSONObject) { + guest := task.GetObject().(*models.SGuest) hostId := guest.HostId - sessionId, _ := self.Params.GetString("sched_session_id") + sessionId, _ := task.Params.GetString("sched_session_id") lockman.LockRawObject(ctx, models.HostManager.KeywordPlural(), hostId) defer lockman.ReleaseRawObject(ctx, models.HostManager.KeywordPlural(), hostId) models.HostManager.ClearSchedDescSessionCache(hostId, sessionId) - self.SSchedTask.SetStageFailed(ctx, reason) + task.SSchedTask.SetStageFailed(ctx, reason) } -func (self *GuestChangeConfigTask) SetStageComplete(ctx context.Context, data *jsonutils.JSONDict) { - guest := self.GetObject().(*models.SGuest) +func (task *GuestChangeConfigTask) SetStageComplete(ctx context.Context, data *jsonutils.JSONDict) { + guest := task.GetObject().(*models.SGuest) hostId := guest.HostId - sessionId, _ := self.Params.GetString("sched_session_id") + sessionId, _ := task.Params.GetString("sched_session_id") lockman.LockRawObject(ctx, models.HostManager.KeywordPlural(), hostId) defer lockman.ReleaseRawObject(ctx, models.HostManager.KeywordPlural(), hostId) models.HostManager.ClearSchedDescSessionCache(hostId, sessionId) - self.SSchedTask.SetStageComplete(ctx, data) + task.SSchedTask.SetStageComplete(ctx, data) } diff --git a/pkg/compute/tasks/guest_convert_esxi_to_kvm_task.go b/pkg/compute/tasks/guest_convert_esxi_to_kvm_task.go index 9adf356d0c..dad938b991 100644 --- a/pkg/compute/tasks/guest_convert_esxi_to_kvm_task.go +++ b/pkg/compute/tasks/guest_convert_esxi_to_kvm_task.go @@ -39,16 +39,16 @@ func init() { taskman.RegisterTask(GuestConvertEsxiToKvmTask{}) } -func (self *GuestConvertEsxiToKvmTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { - StartScheduleObjects(ctx, self, []db.IStandaloneModel{obj}) +func (task *GuestConvertEsxiToKvmTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { + StartScheduleObjects(ctx, task, []db.IStandaloneModel{obj}) } -func (self *GuestConvertEsxiToKvmTask) GetSchedParams() (*schedapi.ScheduleInput, error) { - obj := self.GetObject() +func (task *GuestConvertEsxiToKvmTask) GetSchedParams() (*schedapi.ScheduleInput, error) { + obj := task.GetObject() guest := obj.(*models.SGuest) schedDesc := guest.ToSchedDesc() - if self.Params.Contains("prefer_host_id") { - preferHostId, _ := self.Params.GetString("prefer_host_id") + if task.Params.Contains("prefer_host_id") { + preferHostId, _ := task.Params.GetString("prefer_host_id") schedDesc.ServerConfig.PreferHost = preferHostId } for i := range schedDesc.Disks { @@ -60,28 +60,28 @@ func (self *GuestConvertEsxiToKvmTask) GetSchedParams() (*schedapi.ScheduleInput return schedDesc, nil } -func (self *GuestConvertEsxiToKvmTask) OnStartSchedule(obj IScheduleModel) { +func (task *GuestConvertEsxiToKvmTask) OnStartSchedule(obj IScheduleModel) { guest := obj.(*models.SGuest) - guest.SetStatus(self.UserCred, api.VM_CONVERTING, "") - db.OpsLog.LogEvent(guest, db.ACT_VM_CONVERTING, "", self.UserCred) + guest.SetStatus(task.UserCred, api.VM_CONVERTING, "") + db.OpsLog.LogEvent(guest, db.ACT_VM_CONVERTING, "", task.UserCred) } -func (self *GuestConvertEsxiToKvmTask) OnScheduleFailed(ctx context.Context, reason jsonutils.JSONObject) { - guest := self.GetObject().(*models.SGuest) - self.taskFailed(ctx, guest, reason) +func (task *GuestConvertEsxiToKvmTask) OnScheduleFailed(ctx context.Context, reason jsonutils.JSONObject) { + guest := task.GetObject().(*models.SGuest) + task.taskFailed(ctx, guest, reason) } -func (self *GuestConvertEsxiToKvmTask) taskFailed(ctx context.Context, guest *models.SGuest, reason jsonutils.JSONObject) { - guest.SetStatus(self.UserCred, api.VM_CONVERT_FAILED, reason.String()) - targetGuest := self.getTargetGuest() - targetGuest.SetStatus(self.UserCred, api.VM_CONVERT_FAILED, reason.String()) - db.OpsLog.LogEvent(guest, db.ACT_VM_CONVERT_FAIL, reason, self.UserCred) - logclient.AddSimpleActionLog(guest, logclient.ACT_VM_CONVERT, reason, self.UserCred, false) - logclient.AddSimpleActionLog(targetGuest, logclient.ACT_VM_CONVERT, reason, self.UserCred, false) - self.SetStageFailed(ctx, reason) +func (task *GuestConvertEsxiToKvmTask) taskFailed(ctx context.Context, guest *models.SGuest, reason jsonutils.JSONObject) { + guest.SetStatus(task.UserCred, api.VM_CONVERT_FAILED, reason.String()) + targetGuest := task.getTargetGuest() + targetGuest.SetStatus(task.UserCred, api.VM_CONVERT_FAILED, reason.String()) + db.OpsLog.LogEvent(guest, db.ACT_VM_CONVERT_FAIL, reason, task.UserCred) + logclient.AddSimpleActionLog(guest, logclient.ACT_VM_CONVERT, reason, task.UserCred, false) + logclient.AddSimpleActionLog(targetGuest, logclient.ACT_VM_CONVERT, reason, task.UserCred, false) + task.SetStageFailed(ctx, reason) } -func (self *GuestConvertEsxiToKvmTask) GenerateEsxiAcceessInfo(guest *models.SGuest) (*jsonutils.JSONDict, error) { +func (task *GuestConvertEsxiToKvmTask) GenerateEsxiAcceessInfo(guest *models.SGuest) (*jsonutils.JSONDict, error) { ret := jsonutils.NewDict() host, _ := guest.GetHost() accessInfo, err := host.GetCloudaccount().GetVCenterAccessInfo("") @@ -94,28 +94,28 @@ func (self *GuestConvertEsxiToKvmTask) GenerateEsxiAcceessInfo(guest *models.SGu return ret, nil } -func (self *GuestConvertEsxiToKvmTask) getTargetGuest() *models.SGuest { - guestId, _ := self.Params.GetString("target_guest_id") +func (task *GuestConvertEsxiToKvmTask) getTargetGuest() *models.SGuest { + guestId, _ := task.Params.GetString("target_guest_id") return models.GuestManager.FetchGuestById(guestId) } // update database for convert esxi to kvm in the part of guest, guestdisks, guestnetworks -func (self *GuestConvertEsxiToKvmTask) SaveScheduleResult(ctx context.Context, obj IScheduleModel, target *schedapi.CandidateResource) { +func (task *GuestConvertEsxiToKvmTask) SaveScheduleResult(ctx context.Context, obj IScheduleModel, target *schedapi.CandidateResource, index int) { guest := obj.(*models.SGuest) - targetGuest := self.getTargetGuest() - esxiAccessInfo, err := self.GenerateEsxiAcceessInfo(guest) + targetGuest := task.getTargetGuest() + esxiAccessInfo, err := task.GenerateEsxiAcceessInfo(guest) if err != nil { - self.taskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("generate esxi access info %s", err))) + task.taskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("generate esxi access info %s", err))) return } - err = targetGuest.SetHostId(self.UserCred, target.HostId) + err = targetGuest.SetHostId(task.UserCred, target.HostId) if err != nil { - self.taskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("update guest %s", err))) + task.taskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("update guest %s", err))) return } - err = targetGuest.SetMetadata(ctx, api.SERVER_META_CONVERT_FROM_ESXI, guest.Id, self.UserCred) + err = targetGuest.SetMetadata(ctx, api.SERVER_META_CONVERT_FROM_ESXI, guest.Id, task.UserCred) if err != nil { - self.taskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("guest set metadata %s", err))) + task.taskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("guest set metadata %s", err))) return } host, _ := targetGuest.GetHost() @@ -123,29 +123,29 @@ func (self *GuestConvertEsxiToKvmTask) SaveScheduleResult(ctx context.Context, o //pendingUsage := models.SQuota{} input := new(api.ServerCreateInput) - err = self.Params.Unmarshal(input, "input") + err = task.Params.Unmarshal(input, "input") if err != nil { log.Errorf("fail to unmarshal params input") - input = guest.ToCreateInput(ctx, self.UserCred) + input = guest.ToCreateInput(ctx, task.UserCred) } //pendingUsage.Storage = guest.GetDisksSize() - err = targetGuest.CreateDisksOnHost(ctx, self.UserCred, host, input.Disks, nil, + err = targetGuest.CreateDisksOnHost(ctx, task.UserCred, host, input.Disks, nil, true, true, target.Disks, nil, true) if err != nil { - self.taskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("guest create disks %s", err))) + task.taskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("guest create disks %s", err))) return } - self.SetStage("OnHostCreateGuest", nil) - if err = self.RequestHostCreateGuestFromEsxi(ctx, targetGuest, esxiAccessInfo); err != nil { - self.taskFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.SetStage("OnHostCreateGuest", nil) + if err = task.RequestHostCreateGuestFromEsxi(ctx, targetGuest, esxiAccessInfo); err != nil { + task.taskFailed(ctx, guest, jsonutils.NewString(err.Error())) return } host.ClearSchedDescCache() } -func (self *GuestConvertEsxiToKvmTask) RequestHostCreateGuestFromEsxi( +func (task *GuestConvertEsxiToKvmTask) RequestHostCreateGuestFromEsxi( ctx context.Context, guest *models.SGuest, esxiAccessInfo *jsonutils.JSONDict, ) error { host, _ := guest.GetHost() @@ -154,7 +154,7 @@ func (self *GuestConvertEsxiToKvmTask) RequestHostCreateGuestFromEsxi( params.Set("desc", jsonutils.Marshal(desc)) params.Set("esxi_access_info", esxiAccessInfo) url := fmt.Sprintf("%s/servers/%s/create-form-esxi", host.ManagerUri, guest.Id) - header := self.GetTaskRequestHeader() + header := task.GetTaskRequestHeader() _, _, err := httputils.JSONRequest(httputils.GetDefaultClient(), ctx, "POST", url, header, params, false) if err != nil { return err @@ -162,10 +162,10 @@ func (self *GuestConvertEsxiToKvmTask) RequestHostCreateGuestFromEsxi( return nil } -func (self *GuestConvertEsxiToKvmTask) OnHostCreateGuest( +func (task *GuestConvertEsxiToKvmTask) OnHostCreateGuest( ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject, ) { - targetGuest := self.getTargetGuest() + targetGuest := task.getTargetGuest() guestDisks, _ := targetGuest.GetGuestDisks() for i := 0; i < len(guestDisks); i++ { disk := guestDisks[i].GetDisk() @@ -177,53 +177,53 @@ func (self *GuestConvertEsxiToKvmTask) OnHostCreateGuest( return nil }) // TODO: update flat file path on guest start - err = disk.SetMetadata(ctx, api.DISK_META_ESXI_FLAT_FILE_PATH, esxiFlatFilePath, self.UserCred) + err = disk.SetMetadata(ctx, api.DISK_META_ESXI_FLAT_FILE_PATH, esxiFlatFilePath, task.UserCred) if err != nil { log.Errorf("disk set metadata failed %s", err) - self.taskFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.taskFailed(ctx, guest, jsonutils.NewString(err.Error())) return } - db.OpsLog.LogEvent(disk, db.ACT_ALLOCATE, disk.GetShortDesc(ctx), self.UserCred) + db.OpsLog.LogEvent(disk, db.ACT_ALLOCATE, disk.GetShortDesc(ctx), task.UserCred) } if err := guest.ConvertEsxiNetworks(targetGuest); err != nil { - self.taskFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.taskFailed(ctx, guest, jsonutils.NewString(err.Error())) return } - self.TaskComplete(ctx, guest, targetGuest) + task.TaskComplete(ctx, guest, targetGuest) } -func (self *GuestConvertEsxiToKvmTask) OnHostCreateGuestFailed( +func (task *GuestConvertEsxiToKvmTask) OnHostCreateGuestFailed( ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject, ) { - self.taskFailed(ctx, guest, data) + task.taskFailed(ctx, guest, data) } -func (self *GuestConvertEsxiToKvmTask) TaskComplete(ctx context.Context, guest, targetGuest *models.SGuest) { - guest.SetMetadata(ctx, api.SERVER_META_CONVERTED_SERVER, targetGuest.Id, self.UserCred) - guest.SetStatus(self.UserCred, api.VM_CONVERTED, "") - if osProfile := guest.GetMetadata(ctx, "__os_profile__", self.UserCred); len(osProfile) > 0 { - targetGuest.SetMetadata(ctx, "__os_profile__", osProfile, self.UserCred) +func (task *GuestConvertEsxiToKvmTask) TaskComplete(ctx context.Context, guest, targetGuest *models.SGuest) { + guest.SetMetadata(ctx, api.SERVER_META_CONVERTED_SERVER, targetGuest.Id, task.UserCred) + guest.SetStatus(task.UserCred, api.VM_CONVERTED, "") + if osProfile := guest.GetMetadata(ctx, "__os_profile__", task.UserCred); len(osProfile) > 0 { + targetGuest.SetMetadata(ctx, "__os_profile__", osProfile, task.UserCred) } - if account := guest.GetMetadata(ctx, api.VM_METADATA_LOGIN_ACCOUNT, self.UserCred); len(account) > 0 { - targetGuest.SetMetadata(ctx, api.VM_METADATA_LOGIN_ACCOUNT, account, self.UserCred) + if account := guest.GetMetadata(ctx, api.VM_METADATA_LOGIN_ACCOUNT, task.UserCred); len(account) > 0 { + targetGuest.SetMetadata(ctx, api.VM_METADATA_LOGIN_ACCOUNT, account, task.UserCred) } - if loginKey := guest.GetMetadata(ctx, api.VM_METADATA_LOGIN_KEY, self.UserCred); len(loginKey) > 0 { + if loginKey := guest.GetMetadata(ctx, api.VM_METADATA_LOGIN_KEY, task.UserCred); len(loginKey) > 0 { passwd, _ := utils.DescryptAESBase64(guest.Id, loginKey) if len(passwd) > 0 { secret, err := utils.EncryptAESBase64(targetGuest.Id, passwd) if err == nil { - targetGuest.SetMetadata(ctx, api.VM_METADATA_LOGIN_KEY, secret, self.UserCred) + targetGuest.SetMetadata(ctx, api.VM_METADATA_LOGIN_KEY, secret, task.UserCred) } } } for _, k := range []string{api.VM_METADATA_OS_ARCH, api.VM_METADATA_OS_DISTRO, api.VM_METADATA_OS_NAME, api.VM_METADATA_OS_VERSION} { - if v := guest.GetMetadata(ctx, k, self.UserCred); len(v) > 0 { - targetGuest.SetMetadata(ctx, k, v, self.UserCred) + if v := guest.GetMetadata(ctx, k, task.UserCred); len(v) > 0 { + targetGuest.SetMetadata(ctx, k, v, task.UserCred) } } - db.OpsLog.LogEvent(guest, db.ACT_VM_CONVERT, "", self.UserCred) - logclient.AddSimpleActionLog(guest, logclient.ACT_VM_CONVERT, "", self.UserCred, true) - self.SetStageComplete(ctx, nil) - targetGuest.StartGueststartTask(ctx, self.UserCred, nil, "") + db.OpsLog.LogEvent(guest, db.ACT_VM_CONVERT, "", task.UserCred) + logclient.AddSimpleActionLog(guest, logclient.ACT_VM_CONVERT, "", task.UserCred, true) + task.SetStageComplete(ctx, nil) + targetGuest.StartGueststartTask(ctx, task.UserCred, nil, "") } diff --git a/pkg/compute/tasks/guest_live_migrate_task.go b/pkg/compute/tasks/guest_live_migrate_task.go index 92ad9d175e..20e0b82677 100644 --- a/pkg/compute/tasks/guest_live_migrate_task.go +++ b/pkg/compute/tasks/guest_live_migrate_task.go @@ -54,67 +54,67 @@ func init() { taskman.RegisterTask(ManagedGuestLiveMigrateTask{}) } -func (self *GuestMigrateTask) isLiveMigrate() bool { - guestStatus, _ := self.Params.GetString("guest_status") - if !self.isRescueMode() && (guestStatus == api.VM_RUNNING || guestStatus == api.VM_SUSPEND) { +func (task *GuestMigrateTask) isLiveMigrate() bool { + guestStatus, _ := task.Params.GetString("guest_status") + if !task.isRescueMode() && (guestStatus == api.VM_RUNNING || guestStatus == api.VM_SUSPEND) { return true } return false } -func (self *GuestMigrateTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { - StartScheduleObjects(ctx, self, []db.IStandaloneModel{obj}) +func (task *GuestMigrateTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { + StartScheduleObjects(ctx, task, []db.IStandaloneModel{obj}) } -func (self *GuestMigrateTask) GetSchedParams() (*schedapi.ScheduleInput, error) { - obj := self.GetObject() +func (task *GuestMigrateTask) GetSchedParams() (*schedapi.ScheduleInput, error) { + obj := task.GetObject() guest := obj.(*models.SGuest) input := new(api.ServerMigrateForecastInput) - if self.Params.Contains("prefer_host_id") { - preferHostId, _ := self.Params.GetString("prefer_host_id") + if task.Params.Contains("prefer_host_id") { + preferHostId, _ := task.Params.GetString("prefer_host_id") input.PreferHostId = preferHostId } - if self.isLiveMigrate() { + if task.isLiveMigrate() { input.LiveMigrate = true - skipCpuCheck := jsonutils.QueryBoolean(self.Params, "skip_cpu_check", false) - skipKernelCheck := jsonutils.QueryBoolean(self.Params, "skip_kernel_check", false) + skipCpuCheck := jsonutils.QueryBoolean(task.Params, "skip_cpu_check", false) + skipKernelCheck := jsonutils.QueryBoolean(task.Params, "skip_kernel_check", false) input.SkipCpuCheck = skipCpuCheck input.SkipKernelCheck = skipKernelCheck } - return guest.GetSchedMigrateParams(self.GetUserCred(), input), nil + return guest.GetSchedMigrateParams(task.GetUserCred(), input), nil } -func (self *GuestMigrateTask) OnStartSchedule(obj IScheduleModel) { +func (task *GuestMigrateTask) OnStartSchedule(obj IScheduleModel) { guest := obj.(*models.SGuest) - guestStatus, _ := self.Params.GetString("guest_status") + guestStatus, _ := task.Params.GetString("guest_status") if guestStatus != api.VM_RUNNING && guestStatus != api.VM_SUSPEND { - guest.SetStatus(self.UserCred, api.VM_MIGRATING, "") + guest.SetStatus(task.UserCred, api.VM_MIGRATING, "") } - db.OpsLog.LogEvent(guest, db.ACT_MIGRATING, "", self.UserCred) + db.OpsLog.LogEvent(guest, db.ACT_MIGRATING, "", task.UserCred) } -func (self *GuestMigrateTask) OnScheduleFailCallback(ctx context.Context, obj IScheduleModel, reason jsonutils.JSONObject) { +func (task *GuestMigrateTask) OnScheduleFailCallback(ctx context.Context, obj IScheduleModel, reason jsonutils.JSONObject, index int) { // do nothing } -func (self *GuestMigrateTask) OnScheduleFailed(ctx context.Context, reason jsonutils.JSONObject) { - obj := self.GetObject() +func (task *GuestMigrateTask) OnScheduleFailed(ctx context.Context, reason jsonutils.JSONObject) { + obj := task.GetObject() guest := obj.(*models.SGuest) - self.TaskFailed(ctx, guest, reason) + task.TaskFailed(ctx, guest, reason) } -func (self *GuestMigrateTask) SaveScheduleResult(ctx context.Context, obj IScheduleModel, target *schedapi.CandidateResource) { +func (task *GuestMigrateTask) SaveScheduleResult(ctx context.Context, obj IScheduleModel, target *schedapi.CandidateResource, index int) { targetHostId := target.HostId guest := obj.(*models.SGuest) targetHost := models.HostManager.FetchHostById(targetHostId) if targetHost == nil { - self.TaskFailed(ctx, guest, jsonutils.NewString("target host not found?")) + task.TaskFailed(ctx, guest, jsonutils.NewString("target host not found?")) return } - db.OpsLog.LogEvent(guest, db.ACT_MIGRATING, fmt.Sprintf("guest start migrate from host %s to %s", guest.HostId, targetHostId), self.UserCred) + db.OpsLog.LogEvent(guest, db.ACT_MIGRATING, fmt.Sprintf("guest start migrate from host %s to %s", guest.HostId, targetHostId), task.UserCred) logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATING, - fmt.Sprintf("guest start migrate from host %s to %s(%s)", guest.HostId, targetHostId, targetHost.GetName()), self.UserCred, true) + fmt.Sprintf("guest start migrate from host %s to %s(%s)", guest.HostId, targetHostId, targetHost.GetName()), task.UserCred, true) body := jsonutils.NewDict() body.Set("target_host_id", jsonutils.NewString(targetHostId)) @@ -146,7 +146,7 @@ func (self *GuestMigrateTask) SaveScheduleResult(ctx context.Context, obj ISched body.Set("is_local_storage", jsonutils.JSONFalse) } - self.SetStage("OnCachedImageComplete", body) + task.SetStage("OnCachedImageComplete", body) // prepare disk for migration if len(disk.TemplateId) > 0 && isLocalStorage { targetStorageCache := targetHost.GetLocalStoragecache() @@ -156,24 +156,24 @@ func (self *GuestMigrateTask) SaveScheduleResult(ctx context.Context, obj ISched Format: disk.DiskFormat, IsForce: false, SourceHostId: guest.HostId, - ParentTaskId: self.GetTaskId(), + ParentTaskId: task.GetTaskId(), } - err := targetStorageCache.StartImageCacheTask(ctx, self.UserCred, input) + err := targetStorageCache.StartImageCacheTask(ctx, task.UserCred, input) if err != nil { - self.TaskFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.TaskFailed(ctx, guest, jsonutils.NewString(err.Error())) } return } } - self.OnCachedImageComplete(ctx, guest, nil) + task.OnCachedImageComplete(ctx, guest, nil) } // For local storage get disk info -func (self *GuestMigrateTask) OnCachedImageComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.SetStage("OnCachedCdromComplete", nil) - isLocalStorage, _ := self.Params.Bool("is_local_storage") +func (task *GuestMigrateTask) OnCachedImageComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.SetStage("OnCachedCdromComplete", nil) + isLocalStorage, _ := task.Params.Bool("is_local_storage") if cdrom := guest.GetCdrom(); cdrom != nil && len(cdrom.ImageId) > 0 && isLocalStorage { - targetHostId, _ := self.Params.GetString("target_host_id") + targetHostId, _ := task.Params.GetString("target_host_id") targetHost := models.HostManager.FetchHostById(targetHostId) targetStorageCache := targetHost.GetLocalStoragecache() if targetStorageCache != nil { @@ -181,173 +181,173 @@ func (self *GuestMigrateTask) OnCachedImageComplete(ctx context.Context, guest * ImageId: cdrom.ImageId, Format: "iso", IsForce: false, - ParentTaskId: self.GetTaskId(), + ParentTaskId: task.GetTaskId(), } - err := targetStorageCache.StartImageCacheTask(ctx, self.UserCred, input) + err := targetStorageCache.StartImageCacheTask(ctx, task.UserCred, input) if err != nil { - self.TaskFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.TaskFailed(ctx, guest, jsonutils.NewString(err.Error())) } return } } - self.OnCachedCdromComplete(ctx, guest, nil) + task.OnCachedCdromComplete(ctx, guest, nil) } -func (self *GuestMigrateTask) OnCachedCdromComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - header := self.GetTaskRequestHeader() +func (task *GuestMigrateTask) OnCachedCdromComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + header := task.GetTaskRequestHeader() body := jsonutils.NewDict() - if self.isLiveMigrate() { + if task.isLiveMigrate() { body.Set("live_migrate", jsonutils.JSONTrue) - body.Set("enable_tls", jsonutils.NewBool(jsonutils.QueryBoolean(self.GetParams(), "enable_tls", false))) + body.Set("enable_tls", jsonutils.NewBool(jsonutils.QueryBoolean(task.GetParams(), "enable_tls", false))) } - if !self.isRescueMode() { + if !task.isRescueMode() { host, _ := guest.GetHost() url := fmt.Sprintf("%s/servers/%s/src-prepare-migrate", host.ManagerUri, guest.Id) - self.SetStage("OnSrcPrepareComplete", body) + task.SetStage("OnSrcPrepareComplete", body) _, _, err := httputils.JSONRequest(httputils.GetDefaultClient(), ctx, "POST", url, header, body, false) if err != nil { - self.TaskFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.TaskFailed(ctx, guest, jsonutils.NewString(err.Error())) return } } else { - self.OnSrcPrepareComplete(ctx, guest, nil) + task.OnSrcPrepareComplete(ctx, guest, nil) } } -func (self *GuestMigrateTask) OnCachedCdromCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.TaskFailed(ctx, guest, data) +func (task *GuestMigrateTask) OnCachedCdromCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.TaskFailed(ctx, guest, data) } -func (self *GuestMigrateTask) OnCachedImageCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.TaskFailed(ctx, guest, data) +func (task *GuestMigrateTask) OnCachedImageCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.TaskFailed(ctx, guest, data) } -func (self *GuestMigrateTask) OnSrcPrepareCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.TaskFailed(ctx, guest, data) +func (task *GuestMigrateTask) OnSrcPrepareCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.TaskFailed(ctx, guest, data) } -func (self *GuestMigrateTask) OnSrcPrepareComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - targetHostId, _ := self.Params.GetString("target_host_id") +func (task *GuestMigrateTask) OnSrcPrepareComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + targetHostId, _ := task.Params.GetString("target_host_id") targetHost := models.HostManager.FetchHostById(targetHostId) var body *jsonutils.JSONDict var err error - if jsonutils.QueryBoolean(self.Params, "is_local_storage", false) { - body, err = self.localStorageMigrateConf(ctx, guest, targetHost, data) + if jsonutils.QueryBoolean(task.Params, "is_local_storage", false) { + body, err = task.localStorageMigrateConf(ctx, guest, targetHost, data) } else { - body, err = self.sharedStorageMigrateConf(ctx, guest, targetHost) + body, err = task.sharedStorageMigrateConf(ctx, guest, targetHost) } - if self.isLiveMigrate() { + if task.isLiveMigrate() { srcDesc, err := data.Get("src_desc") if err != nil { - self.TaskFailed(ctx, guest, jsonutils.NewString(errors.Wrap(err, "get src_desc from data").Error())) + task.TaskFailed(ctx, guest, jsonutils.NewString(errors.Wrap(err, "get src_desc from data").Error())) return } body.Set("src_desc", srcDesc) body.Set("live_migrate", jsonutils.JSONTrue) } - if jsonutils.QueryBoolean(self.GetParams(), "enable_tls", false) { + if jsonutils.QueryBoolean(task.GetParams(), "enable_tls", false) { body.Set("enable_tls", jsonutils.JSONTrue) certsObj, err := data.Get("migrate_certs") if err != nil { - self.TaskFailed(ctx, guest, jsonutils.NewString(errors.Wrap(err, "get migrate_certs from data").Error())) + task.TaskFailed(ctx, guest, jsonutils.NewString(errors.Wrap(err, "get migrate_certs from data").Error())) return } body.Set("migrate_certs", certsObj) } if err != nil { - self.TaskFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.TaskFailed(ctx, guest, jsonutils.NewString(err.Error())) return } - headers := self.GetTaskRequestHeader() + headers := task.GetTaskRequestHeader() url := fmt.Sprintf("%s/servers/%s/dest-prepare-migrate", targetHost.ManagerUri, guest.Id) - self.SetStage("OnMigrateConfAndDiskComplete", nil) + task.SetStage("OnMigrateConfAndDiskComplete", nil) _, _, err = httputils.JSONRequest(httputils.GetDefaultClient(), ctx, "POST", url, headers, body, false) if err != nil { - self.TaskFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.TaskFailed(ctx, guest, jsonutils.NewString(err.Error())) } } -func (self *GuestMigrateTask) OnMigrateConfAndDiskCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - targetHostId, _ := self.Params.GetString("target_host_id") +func (task *GuestMigrateTask) OnMigrateConfAndDiskCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + targetHostId, _ := task.Params.GetString("target_host_id") err := jsonutils.NewDict() err.Set("MigrateConfAndDiskFailedReason", data) - self.SetStage("OnUndeployTargetGuestSucc", err) - guest.StartUndeployGuestTask(ctx, self.UserCred, self.GetTaskId(), targetHostId) - self.TaskFailed(ctx, guest, data) + task.SetStage("OnUndeployTargetGuestSucc", err) + guest.StartUndeployGuestTask(ctx, task.UserCred, task.GetTaskId(), targetHostId) + task.TaskFailed(ctx, guest, data) } -func (self *GuestMigrateTask) OnUndeployTargetGuestSucc(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - err, _ := self.Params.Get("MigrateConfAndDiskFailedReason") - self.TaskFailed(ctx, guest, err) +func (task *GuestMigrateTask) OnUndeployTargetGuestSucc(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + err, _ := task.Params.Get("MigrateConfAndDiskFailedReason") + task.TaskFailed(ctx, guest, err) } -func (self *GuestMigrateTask) OnUndeployTargetGuestSuccFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - prevErr, _ := self.Params.Get("MigrateConfAndDiskFailedReason") +func (task *GuestMigrateTask) OnUndeployTargetGuestSuccFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + prevErr, _ := task.Params.Get("MigrateConfAndDiskFailedReason") err := jsonutils.NewDict() err.Set("MigrateConfAndDiskFailedReason", prevErr) err.Set("UndeployTargetGuestFailedReason", data) - self.TaskFailed(ctx, guest, err) + task.TaskFailed(ctx, guest, err) } -func (self *GuestMigrateTask) OnMigrateConfAndDiskComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { +func (task *GuestMigrateTask) OnMigrateConfAndDiskComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { if data.Contains("dest_prepared_memory_snapshots") { msData, _ := data.Get("dest_prepared_memory_snapshots") - self.Params.Set("dest_prepared_memory_snapshots", msData) + task.Params.Set("dest_prepared_memory_snapshots", msData) } - if self.isLiveMigrate() { + if task.isLiveMigrate() { // Live migrate - self.SetStage("OnStartDestComplete", nil) + task.SetStage("OnStartDestComplete", nil) } else { // Normal migrate - self.OnNormalMigrateComplete(ctx, guest, data) + task.OnNormalMigrateComplete(ctx, guest, data) } } -func (self *GuestMigrateTask) OnNormalMigrateComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { +func (task *GuestMigrateTask) OnNormalMigrateComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { oldHostId := guest.HostId - self.setGuest(ctx, guest) - guestStatus, _ := self.Params.GetString("guest_status") - guest.SetStatus(self.UserCred, guestStatus, "") - if self.isRescueMode() { - guest.StartGueststartTask(ctx, self.UserCred, nil, "") - self.TaskComplete(ctx, guest) + task.setGuest(ctx, guest) + guestStatus, _ := task.Params.GetString("guest_status") + guest.SetStatus(task.UserCred, guestStatus, "") + if task.isRescueMode() { + guest.StartGueststartTask(ctx, task.UserCred, nil, "") + task.TaskComplete(ctx, guest) } else { - self.SetStage("OnUndeployOldHostSucc", nil) - guest.StartUndeployGuestTask(ctx, self.UserCred, self.GetTaskId(), oldHostId) + task.SetStage("OnUndeployOldHostSucc", nil) + guest.StartUndeployGuestTask(ctx, task.UserCred, task.GetTaskId(), oldHostId) } } // Server migrate complete -func (self *GuestMigrateTask) OnUndeployOldHostSucc(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - if jsonutils.QueryBoolean(self.Params, "auto_start", false) { - self.SetStage("OnGuestStartSucc", nil) - guest.StartGueststartTask(ctx, self.UserCred, nil, self.GetId()) +func (task *GuestMigrateTask) OnUndeployOldHostSucc(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + if jsonutils.QueryBoolean(task.Params, "auto_start", false) { + task.SetStage("OnGuestStartSucc", nil) + guest.StartGueststartTask(ctx, task.UserCred, nil, task.GetId()) } else { - self.TaskComplete(ctx, guest) + task.TaskComplete(ctx, guest) } } -func (self *GuestMigrateTask) OnUndeployOldHostSuccFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.TaskFailed(ctx, guest, data) +func (task *GuestMigrateTask) OnUndeployOldHostSuccFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.TaskFailed(ctx, guest, data) } -func (self *GuestMigrateTask) OnGuestStartSucc(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.TaskComplete(ctx, guest) +func (task *GuestMigrateTask) OnGuestStartSucc(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.TaskComplete(ctx, guest) } -func (self *GuestMigrateTask) OnGuestStartSuccFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.TaskFailed(ctx, guest, data) +func (task *GuestMigrateTask) OnGuestStartSuccFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.TaskFailed(ctx, guest, data) } -func (self *GuestMigrateTask) isRescueMode() bool { - return jsonutils.QueryBoolean(self.Params, "is_rescue_mode", false) +func (task *GuestMigrateTask) isRescueMode() bool { + return jsonutils.QueryBoolean(task.Params, "is_rescue_mode", false) } -func (self *GuestMigrateTask) getInstanceSnapShotsWithMemory(guest *models.SGuest) ([]*models.SInstanceSnapshot, error) { +func (task *GuestMigrateTask) getInstanceSnapShotsWithMemory(guest *models.SGuest) ([]*models.SInstanceSnapshot, error) { isps, err := guest.GetInstanceSnapshots() if err != nil { return nil, errors.Wrap(err, "GetInstanceSnapshots") @@ -355,7 +355,7 @@ func (self *GuestMigrateTask) getInstanceSnapShotsWithMemory(guest *models.SGues ret := make([]*models.SInstanceSnapshot, 0) for idx := range isps { if isps[idx].WithMemory { - if self.isRescueMode() { + if task.isRescueMode() { // do not copy memory snapshot in rescure mode, as it is not accessible // remove memory flag, because the memory snapshot will be lost after migration db.Update(&isps[idx], func() error { @@ -370,8 +370,8 @@ func (self *GuestMigrateTask) getInstanceSnapShotsWithMemory(guest *models.SGues return ret, nil } -func (self *GuestMigrateTask) getInstanceSnapShotIdsWithMemory(guest *models.SGuest) (*jsonutils.JSONArray, error) { - isps, err := self.getInstanceSnapShotsWithMemory(guest) +func (task *GuestMigrateTask) getInstanceSnapShotIdsWithMemory(guest *models.SGuest) (*jsonutils.JSONArray, error) { + isps, err := task.getInstanceSnapShotsWithMemory(guest) if err != nil { return nil, errors.Wrap(err, "getInstanceSnapshotsWithMemory") } @@ -382,8 +382,8 @@ func (self *GuestMigrateTask) getInstanceSnapShotIdsWithMemory(guest *models.SGu return jsonutils.Marshal(ret).(*jsonutils.JSONArray), nil } -func (self *GuestMigrateTask) setBodyMemorySnapshotParams(guest *models.SGuest, srcHost *models.SHost, body *jsonutils.JSONDict) error { - isps, err := self.getInstanceSnapShotIdsWithMemory(guest) +func (task *GuestMigrateTask) setBodyMemorySnapshotParams(guest *models.SGuest, srcHost *models.SHost, body *jsonutils.JSONDict) error { + isps, err := task.getInstanceSnapShotIdsWithMemory(guest) if err != nil { return errors.Wrap(err, "getInstanceSnapShotsWithMemory") } @@ -393,21 +393,21 @@ func (self *GuestMigrateTask) setBodyMemorySnapshotParams(guest *models.SGuest, return nil } -func (self *GuestMigrateTask) sharedStorageMigrateConf(ctx context.Context, guest *models.SGuest, targetHost *models.SHost) (*jsonutils.JSONDict, error) { +func (task *GuestMigrateTask) sharedStorageMigrateConf(ctx context.Context, guest *models.SGuest, targetHost *models.SHost) (*jsonutils.JSONDict, error) { body := jsonutils.NewDict() body.Set("is_local_storage", jsonutils.JSONFalse) - body.Set("qemu_version", jsonutils.NewString(guest.GetQemuVersion(self.UserCred))) + body.Set("qemu_version", jsonutils.NewString(guest.GetQemuVersion(task.UserCred))) targetDesc := guest.GetJsonDescAtHypervisor(ctx, targetHost) body.Set("desc", jsonutils.Marshal(targetDesc)) sourceHost, _ := guest.GetHost() - if err := self.setBodyMemorySnapshotParams(guest, sourceHost, body); err != nil { + if err := task.setBodyMemorySnapshotParams(guest, sourceHost, body); err != nil { return nil, errors.Wrap(err, "setBodyMemorySnapshotParams") } return body, nil } -func (self *GuestMigrateTask) localStorageMigrateConf(ctx context.Context, +func (task *GuestMigrateTask) localStorageMigrateConf(ctx context.Context, guest *models.SGuest, targetHost *models.SHost, data jsonutils.JSONObject) (*jsonutils.JSONDict, error) { body := jsonutils.NewDict() if data != nil { @@ -442,9 +442,9 @@ func (self *GuestMigrateTask) localStorageMigrateConf(ctx context.Context, body.Set("snapshots_uri", jsonutils.NewString(snapshotsUri)) body.Set("disks_uri", jsonutils.NewString(disksUri)) body.Set("server_url", jsonutils.NewString(serverUrl)) - body.Set("qemu_version", jsonutils.NewString(guest.GetQemuVersion(self.UserCred))) + body.Set("qemu_version", jsonutils.NewString(guest.GetQemuVersion(task.UserCred))) - if err := self.setBodyMemorySnapshotParams(guest, sourceHost, body); err != nil { + if err := task.setBodyMemorySnapshotParams(guest, sourceHost, body); err != nil { return nil, errors.Wrap(err, "setBodyMemorySnapshotParams") } @@ -452,7 +452,7 @@ func (self *GuestMigrateTask) localStorageMigrateConf(ctx context.Context, if len(targetDesc.Disks) == 0 { return nil, errors.Errorf("Get disksDesc error") } - targetStorages, _ := self.Params.GetArray("target_storages") + targetStorages, _ := task.Params.GetArray("target_storages") for i := 0; i < len(disks); i++ { targetStorageId, err := targetStorages[i].GetString() if err != nil { @@ -467,59 +467,59 @@ func (self *GuestMigrateTask) localStorageMigrateConf(ctx context.Context, return body, nil } -func (self *GuestLiveMigrateTask) OnStartDestComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { +func (task *GuestLiveMigrateTask) OnStartDestComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { liveMigrateDestPort, err := data.Get("live_migrate_dest_port") if err != nil { - self.TaskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("Get migrate port error: %s", err))) + task.TaskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("Get migrate port error: %s", err))) return } nbdServerPort, err := data.Get("nbd_server_port") if err != nil { - self.TaskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("Get nbd server port error: %s", err))) + task.TaskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("Get nbd server port error: %s", err))) return } - targetHostId, _ := self.Params.GetString("target_host_id") + targetHostId, _ := task.Params.GetString("target_host_id") targetHost := models.HostManager.FetchHostById(targetHostId) body := jsonutils.NewDict() - isLocalStorage, _ := self.Params.Get("is_local_storage") + isLocalStorage, _ := task.Params.Get("is_local_storage") body.Set("is_local_storage", isLocalStorage) body.Set("live_migrate_dest_port", liveMigrateDestPort) body.Set("nbd_server_port", nbdServerPort) body.Set("dest_ip", jsonutils.NewString(targetHost.AccessIp)) - body.Set("enable_tls", jsonutils.NewBool(jsonutils.QueryBoolean(self.GetParams(), "enable_tls", false))) - body.Set("quickly_finish", jsonutils.NewBool(jsonutils.QueryBoolean(self.GetParams(), "quickly_finish", false))) - if self.Params.Contains("max_bandwidth_mb") { - maxBandwidthMb, _ := self.Params.Get("max_bandwidth_mb") + body.Set("enable_tls", jsonutils.NewBool(jsonutils.QueryBoolean(task.GetParams(), "enable_tls", false))) + body.Set("quickly_finish", jsonutils.NewBool(jsonutils.QueryBoolean(task.GetParams(), "quickly_finish", false))) + if task.Params.Contains("max_bandwidth_mb") { + maxBandwidthMb, _ := task.Params.Get("max_bandwidth_mb") body.Set("max_bandwidth_mb", maxBandwidthMb) } - headers := self.GetTaskRequestHeader() + headers := task.GetTaskRequestHeader() host, _ := guest.GetHost() url := fmt.Sprintf("%s/servers/%s/live-migrate", host.ManagerUri, guest.Id) - self.SetStage("OnLiveMigrateComplete", nil) - guest.SetStatus(self.UserCred, api.VM_LIVE_MIGRATING, "") + task.SetStage("OnLiveMigrateComplete", nil) + guest.SetStatus(task.UserCred, api.VM_LIVE_MIGRATING, "") _, _, err = httputils.JSONRequest(httputils.GetDefaultClient(), ctx, "POST", url, headers, body, false) if err != nil { - self.OnLiveMigrateCompleteFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.OnLiveMigrateCompleteFailed(ctx, guest, jsonutils.NewString(err.Error())) } } -func (self *GuestLiveMigrateTask) OnStartDestCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - if !jsonutils.QueryBoolean(self.Params, "keep_dest_guest_on_failed", false) { - targetHostId, _ := self.Params.GetString("target_host_id") - guest.StartUndeployGuestTask(ctx, self.UserCred, "", targetHostId) +func (task *GuestLiveMigrateTask) OnStartDestCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + if !jsonutils.QueryBoolean(task.Params, "keep_dest_guest_on_failed", false) { + targetHostId, _ := task.Params.GetString("target_host_id") + guest.StartUndeployGuestTask(ctx, task.UserCred, "", targetHostId) } - self.TaskFailed(ctx, guest, data) + task.TaskFailed(ctx, guest, data) } -func (self *GuestMigrateTask) setGuest(ctx context.Context, guest *models.SGuest) error { - targetHostId, _ := self.Params.GetString("target_host_id") - if jsonutils.QueryBoolean(self.Params, "is_local_storage", false) { - targetStorages, _ := self.Params.GetArray("target_storages") +func (task *GuestMigrateTask) setGuest(ctx context.Context, guest *models.SGuest) error { + targetHostId, _ := task.Params.GetString("target_host_id") + if jsonutils.QueryBoolean(task.Params, "is_local_storage", false) { + targetStorages, _ := task.Params.GetArray("target_storages") disks, _ := guest.GetDisks() for i := 0; i < len(disks); i++ { disk := &disks[i] @@ -539,114 +539,114 @@ func (self *GuestMigrateTask) setGuest(ctx context.Context, guest *models.SGuest } oldHost, _ := guest.GetHost() oldHost.ClearSchedDescCache() - err := guest.OnScheduleToHost(ctx, self.UserCred, targetHostId) + err := guest.OnScheduleToHost(ctx, task.UserCred, targetHostId) if err != nil { return err } return nil } -func (self *GuestLiveMigrateTask) OnLiveMigrateCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - if !jsonutils.QueryBoolean(self.Params, "keep_dest_guest_on_failed", false) { - targetHostId, _ := self.Params.GetString("target_host_id") - guest.StartUndeployGuestTask(ctx, self.UserCred, "", targetHostId) +func (task *GuestLiveMigrateTask) OnLiveMigrateCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + if !jsonutils.QueryBoolean(task.Params, "keep_dest_guest_on_failed", false) { + targetHostId, _ := task.Params.GetString("target_host_id") + guest.StartUndeployGuestTask(ctx, task.UserCred, "", targetHostId) } - self.TaskFailed(ctx, guest, data) + task.TaskFailed(ctx, guest, data) } -func (self *GuestLiveMigrateTask) OnLiveMigrateComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { +func (task *GuestLiveMigrateTask) OnLiveMigrateComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { if migInfo, err := data.Get("migration_info"); err != nil { - db.OpsLog.LogEvent(guest, db.ACT_MIGRATE, migInfo, self.UserCred) - logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, migInfo, self.UserCred, true) + db.OpsLog.LogEvent(guest, db.ACT_MIGRATE, migInfo, task.UserCred) + logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, migInfo, task.UserCred, true) } - headers := self.GetTaskRequestHeader() + headers := task.GetTaskRequestHeader() body := jsonutils.NewDict() body.Set("live_migrate", jsonutils.JSONTrue) - body.Set("clean_tls", jsonutils.NewBool(jsonutils.QueryBoolean(self.GetParams(), "enable_tls", false))) - targetHostId, _ := self.Params.GetString("target_host_id") + body.Set("clean_tls", jsonutils.NewBool(jsonutils.QueryBoolean(task.GetParams(), "enable_tls", false))) + targetHostId, _ := task.Params.GetString("target_host_id") - self.SetStage("OnResumeDestGuestComplete", nil) + task.SetStage("OnResumeDestGuestComplete", nil) targetHost := models.HostManager.FetchHostById(targetHostId) url := fmt.Sprintf("%s/servers/%s/resume", targetHost.ManagerUri, guest.Id) _, _, err := httputils.JSONRequest(httputils.GetDefaultClient(), ctx, "POST", url, headers, body, false) if err != nil { - self.OnResumeDestGuestCompleteFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.OnResumeDestGuestCompleteFailed(ctx, guest, jsonutils.NewString(err.Error())) } } -func (self *GuestLiveMigrateTask) OnResumeDestGuestCompleteFailed(ctx context.Context, +func (task *GuestLiveMigrateTask) OnResumeDestGuestCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.markFailed(ctx, guest, data) - if !jsonutils.QueryBoolean(self.Params, "keep_dest_guest_on_failed", false) { - targetHostId, _ := self.Params.GetString("target_host_id") - guest.StartUndeployGuestTask(ctx, self.UserCred, "", targetHostId) + task.markFailed(ctx, guest, data) + if !jsonutils.QueryBoolean(task.Params, "keep_dest_guest_on_failed", false) { + targetHostId, _ := task.Params.GetString("target_host_id") + guest.StartUndeployGuestTask(ctx, task.UserCred, "", targetHostId) } - self.SetStage("OnResumeSourceGuestComplete", nil) + task.SetStage("OnResumeSourceGuestComplete", nil) sourceHost := models.HostManager.FetchHostById(guest.HostId) - headers := self.GetTaskRequestHeader() + headers := task.GetTaskRequestHeader() body := jsonutils.NewDict() url := fmt.Sprintf("%s/servers/%s/resume", sourceHost.ManagerUri, guest.Id) _, _, err := httputils.JSONRequest(httputils.GetDefaultClient(), ctx, "POST", url, headers, body, false) if err != nil { - self.OnResumeSourceGuestCompleteFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.OnResumeSourceGuestCompleteFailed(ctx, guest, jsonutils.NewString(err.Error())) } } -func (self *GuestLiveMigrateTask) OnResumeSourceGuestCompleteFailed(ctx context.Context, +func (task *GuestLiveMigrateTask) OnResumeSourceGuestCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - db.OpsLog.LogEvent(guest, db.ACT_RESUME_FAIL, data, self.UserCred) - logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_VM_RESUME, data, self.UserCred, false) - self.TaskFailed(ctx, guest, data) + db.OpsLog.LogEvent(guest, db.ACT_RESUME_FAIL, data, task.UserCred) + logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_VM_RESUME, data, task.UserCred, false) + task.TaskFailed(ctx, guest, data) } -func (self *GuestLiveMigrateTask) OnResumeSourceGuestComplete(ctx context.Context, +func (task *GuestLiveMigrateTask) OnResumeSourceGuestComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.TaskFailed(ctx, guest, data) + task.TaskFailed(ctx, guest, data) } -func (self *GuestLiveMigrateTask) OnResumeDestGuestComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { +func (task *GuestLiveMigrateTask) OnResumeDestGuestComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { oldHostId := guest.HostId - err := self.setGuest(ctx, guest) + err := task.setGuest(ctx, guest) if err != nil { - self.TaskFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.TaskFailed(ctx, guest, jsonutils.NewString(err.Error())) } - self.SetStage("OnUndeploySrcGuestComplete", nil) - err = guest.StartUndeployGuestTask(ctx, self.UserCred, self.GetTaskId(), oldHostId) + task.SetStage("OnUndeploySrcGuestComplete", nil) + err = guest.StartUndeployGuestTask(ctx, task.UserCred, task.GetTaskId(), oldHostId) if err != nil { - self.TaskFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.TaskFailed(ctx, guest, jsonutils.NewString(err.Error())) } } -func (self *GuestLiveMigrateTask) OnUndeploySrcGuestComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - db.OpsLog.LogEvent(guest, db.ACT_MIGRATE, "OnUndeploySrcGuestComplete", self.UserCred) - status, _ := self.Params.GetString("guest_status") +func (task *GuestLiveMigrateTask) OnUndeploySrcGuestComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + db.OpsLog.LogEvent(guest, db.ACT_MIGRATE, "OnUndeploySrcGuestComplete", task.UserCred) + status, _ := task.Params.GetString("guest_status") if status != guest.Status { - self.SetStage("OnGuestSyncStatus", nil) - guest.StartSyncstatus(ctx, self.UserCred, self.GetTaskId()) + task.SetStage("OnGuestSyncStatus", nil) + guest.StartSyncstatus(ctx, task.UserCred, task.GetTaskId()) } else { - self.OnGuestSyncStatus(ctx, guest, nil) + task.OnGuestSyncStatus(ctx, guest, nil) } } // Server live migrate complete -func (self *GuestLiveMigrateTask) OnGuestSyncStatus(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.TaskComplete(ctx, guest) +func (task *GuestLiveMigrateTask) OnGuestSyncStatus(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.TaskComplete(ctx, guest) } -func (self *GuestMigrateTask) updateInstanceSnapshotMemory(ctx context.Context, guest *models.SGuest) error { - if !self.Params.Contains("dest_prepared_memory_snapshots") { +func (task *GuestMigrateTask) updateInstanceSnapshotMemory(ctx context.Context, guest *models.SGuest) error { + if !task.Params.Contains("dest_prepared_memory_snapshots") { return nil } - ms, err := self.Params.Get("dest_prepared_memory_snapshots") + ms, err := task.Params.Get("dest_prepared_memory_snapshots") if err != nil { return errors.Wrap(err, "get dest_prepared_memory_snapshots from params") } - isps, err := self.getInstanceSnapShotsWithMemory(guest) + isps, err := task.getInstanceSnapShotsWithMemory(guest) if err != nil { return errors.Wrap(err, "getInstanceSnapShotsWithMemory") } @@ -666,27 +666,27 @@ func (self *GuestMigrateTask) updateInstanceSnapshotMemory(ctx context.Context, return nil } -func (self *GuestMigrateTask) TaskComplete(ctx context.Context, guest *models.SGuest) { - if err := self.updateInstanceSnapshotMemory(ctx, guest); err != nil { - self.TaskFailed(ctx, guest, jsonutils.NewString(err.Error())) +func (task *GuestMigrateTask) TaskComplete(ctx context.Context, guest *models.SGuest) { + if err := task.updateInstanceSnapshotMemory(ctx, guest); err != nil { + task.TaskFailed(ctx, guest, jsonutils.NewString(err.Error())) return } - self.SetStageComplete(ctx, nil) - db.OpsLog.LogEvent(guest, db.ACT_MIGRATE, "Migrate success", self.UserCred) - logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, self.Params, self.UserCred, true) + task.SetStageComplete(ctx, nil) + db.OpsLog.LogEvent(guest, db.ACT_MIGRATE, "Migrate success", task.UserCred) + logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, task.Params, task.UserCred, true) } -func (self *GuestMigrateTask) TaskFailed(ctx context.Context, guest *models.SGuest, reason jsonutils.JSONObject) { - self.markFailed(ctx, guest, reason) - self.SetStageFailed(ctx, reason) +func (task *GuestMigrateTask) TaskFailed(ctx context.Context, guest *models.SGuest, reason jsonutils.JSONObject) { + task.markFailed(ctx, guest, reason) + task.SetStageFailed(ctx, reason) } -func (self *GuestMigrateTask) markFailed(ctx context.Context, guest *models.SGuest, reason jsonutils.JSONObject) { - guest.SetStatus(self.UserCred, api.VM_MIGRATE_FAILED, reason.String()) - db.OpsLog.LogEvent(guest, db.ACT_MIGRATE_FAIL, reason, self.UserCred) - logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, reason, self.UserCred, false) +func (task *GuestMigrateTask) markFailed(ctx context.Context, guest *models.SGuest, reason jsonutils.JSONObject) { + guest.SetStatus(task.UserCred, api.VM_MIGRATE_FAILED, reason.String()) + db.OpsLog.LogEvent(guest, db.ACT_MIGRATE_FAIL, reason, task.UserCred) + logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, reason, task.UserCred, false) notifyclient.NotifySystemErrorWithCtx(ctx, guest.Id, guest.Name, api.VM_MIGRATE_FAILED, reason.String()) - notifyclient.EventNotify(ctx, self.GetUserCred(), notifyclient.SEventNotifyParam{ + notifyclient.EventNotify(ctx, task.GetUserCred(), notifyclient.SEventNotifyParam{ Obj: guest, Action: notifyclient.ActionMigrate, IsFail: true, @@ -694,95 +694,95 @@ func (self *GuestMigrateTask) markFailed(ctx context.Context, guest *models.SGue } // ManagedGuestMigrateTask -func (self *ManagedGuestMigrateTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { +func (task *ManagedGuestMigrateTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { guest := obj.(*models.SGuest) - db.OpsLog.LogEvent(guest, db.ACT_MIGRATING, nil, self.UserCred) - self.MigrateStart(ctx, guest, data) + db.OpsLog.LogEvent(guest, db.ACT_MIGRATING, nil, task.UserCred) + task.MigrateStart(ctx, guest, data) } -func (self *ManagedGuestMigrateTask) MigrateStart(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.SetStage("OnMigrateComplete", nil) - guest.SetStatus(self.UserCred, api.VM_MIGRATING, "") +func (task *ManagedGuestMigrateTask) MigrateStart(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.SetStage("OnMigrateComplete", nil) + guest.SetStatus(task.UserCred, api.VM_MIGRATING, "") input := api.GuestMigrateInput{} - self.GetParams().Unmarshal(&input) - if err := guest.GetDriver().RequestMigrate(ctx, guest, self.UserCred, input, self); err != nil { - self.OnMigrateCompleteFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.GetParams().Unmarshal(&input) + if err := guest.GetDriver().RequestMigrate(ctx, guest, task.UserCred, input, task); err != nil { + task.OnMigrateCompleteFailed(ctx, guest, jsonutils.NewString(err.Error())) } } -func (self *ManagedGuestMigrateTask) OnMigrateComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { +func (task *ManagedGuestMigrateTask) OnMigrateComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { guest := obj.(*models.SGuest) - logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, self.Params, self.UserCred, true) - db.OpsLog.LogEvent(guest, db.ACT_MIGRATE, guest.GetShortDesc(ctx), self.UserCred) - if jsonutils.QueryBoolean(self.Params, "auto_start", false) { - self.SetStage("OnGuestStartSucc", nil) - guest.StartGueststartTask(ctx, self.UserCred, nil, self.GetId()) + logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, task.Params, task.UserCred, true) + db.OpsLog.LogEvent(guest, db.ACT_MIGRATE, guest.GetShortDesc(ctx), task.UserCred) + if jsonutils.QueryBoolean(task.Params, "auto_start", false) { + task.SetStage("OnGuestStartSucc", nil) + guest.StartGueststartTask(ctx, task.UserCred, nil, task.GetId()) } else { - self.SetStage("OnGuestSyncStatus", nil) - guest.StartSyncstatus(ctx, self.UserCred, self.GetTaskId()) + task.SetStage("OnGuestSyncStatus", nil) + guest.StartSyncstatus(ctx, task.UserCred, task.GetTaskId()) } } -func (self *ManagedGuestMigrateTask) OnGuestStartSucc(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.SetStageComplete(ctx, nil) +func (task *ManagedGuestMigrateTask) OnGuestStartSucc(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.SetStageComplete(ctx, nil) } -func (self *ManagedGuestMigrateTask) OnGuestSyncStatus(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.SetStageComplete(ctx, nil) +func (task *ManagedGuestMigrateTask) OnGuestSyncStatus(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.SetStageComplete(ctx, nil) } -func (self *ManagedGuestMigrateTask) OnGuestSyncStatusFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.SetStageFailed(ctx, data) +func (task *ManagedGuestMigrateTask) OnGuestSyncStatusFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.SetStageFailed(ctx, data) } -func (self *ManagedGuestMigrateTask) OnGuestStartSuccFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.SetStageFailed(ctx, data) +func (task *ManagedGuestMigrateTask) OnGuestStartSuccFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.SetStageFailed(ctx, data) } -func (self *ManagedGuestMigrateTask) OnMigrateCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - guest.SetStatus(self.UserCred, api.VM_MIGRATE_FAILED, "") - db.OpsLog.LogEvent(guest, db.ACT_MIGRATE_FAIL, data, self.UserCred) - logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, data, self.UserCred, false) - self.SetStageFailed(ctx, data) +func (task *ManagedGuestMigrateTask) OnMigrateCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + guest.SetStatus(task.UserCred, api.VM_MIGRATE_FAILED, "") + db.OpsLog.LogEvent(guest, db.ACT_MIGRATE_FAIL, data, task.UserCred) + logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, data, task.UserCred, false) + task.SetStageFailed(ctx, data) notifyclient.NotifySystemErrorWithCtx(ctx, guest.Id, guest.Name, api.VM_MIGRATE_FAILED, data.String()) } // ManagedGuestLiveMigrateTask -func (self *ManagedGuestLiveMigrateTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { +func (task *ManagedGuestLiveMigrateTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { guest := obj.(*models.SGuest) - db.OpsLog.LogEvent(guest, db.ACT_MIGRATING, nil, self.UserCred) - self.MigrateStart(ctx, guest, data) + db.OpsLog.LogEvent(guest, db.ACT_MIGRATING, nil, task.UserCred) + task.MigrateStart(ctx, guest, data) } -func (self *ManagedGuestLiveMigrateTask) MigrateStart(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.SetStage("OnMigrateComplete", nil) - guest.SetStatus(self.UserCred, api.VM_MIGRATING, "") +func (task *ManagedGuestLiveMigrateTask) MigrateStart(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.SetStage("OnMigrateComplete", nil) + guest.SetStatus(task.UserCred, api.VM_MIGRATING, "") input := api.GuestLiveMigrateInput{} - self.GetParams().Unmarshal(&input) - if err := guest.GetDriver().RequestLiveMigrate(ctx, guest, self.UserCred, input, self); err != nil { - self.OnMigrateCompleteFailed(ctx, guest, jsonutils.NewString(err.Error())) + task.GetParams().Unmarshal(&input) + if err := guest.GetDriver().RequestLiveMigrate(ctx, guest, task.UserCred, input, task); err != nil { + task.OnMigrateCompleteFailed(ctx, guest, jsonutils.NewString(err.Error())) } } -func (self *ManagedGuestLiveMigrateTask) OnMigrateComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.SetStage("OnGuestSyncStatus", nil) - db.OpsLog.LogEvent(guest, db.ACT_MIGRATE, guest.GetShortDesc(ctx), self.UserCred) - logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, self.Params, self.UserCred, true) - guest.StartSyncstatus(ctx, self.UserCred, self.GetTaskId()) +func (task *ManagedGuestLiveMigrateTask) OnMigrateComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.SetStage("OnGuestSyncStatus", nil) + db.OpsLog.LogEvent(guest, db.ACT_MIGRATE, guest.GetShortDesc(ctx), task.UserCred) + logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, task.Params, task.UserCred, true) + guest.StartSyncstatus(ctx, task.UserCred, task.GetTaskId()) } -func (self *ManagedGuestLiveMigrateTask) OnGuestSyncStatus(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.SetStageComplete(ctx, nil) +func (task *ManagedGuestLiveMigrateTask) OnGuestSyncStatus(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.SetStageComplete(ctx, nil) } -func (self *ManagedGuestLiveMigrateTask) OnGuestSyncStatusFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.SetStageFailed(ctx, data) +func (task *ManagedGuestLiveMigrateTask) OnGuestSyncStatusFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + task.SetStageFailed(ctx, data) } -func (self *ManagedGuestLiveMigrateTask) OnMigrateCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - guest.SetStatus(self.UserCred, api.VM_MIGRATE_FAILED, "") - db.OpsLog.LogEvent(guest, db.ACT_MIGRATE_FAIL, data, self.UserCred) - logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, data, self.UserCred, false) - self.SetStageFailed(ctx, data) +func (task *ManagedGuestLiveMigrateTask) OnMigrateCompleteFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + guest.SetStatus(task.UserCred, api.VM_MIGRATE_FAILED, "") + db.OpsLog.LogEvent(guest, db.ACT_MIGRATE_FAIL, data, task.UserCred) + logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, data, task.UserCred, false) + task.SetStageFailed(ctx, data) notifyclient.NotifySystemErrorWithCtx(ctx, guest.Id, guest.Name, api.VM_MIGRATE_FAILED, data.String()) } diff --git a/pkg/compute/tasks/instance_backup_recovery_task.go b/pkg/compute/tasks/instance_backup_recovery_task.go index 098e22f446..4571076434 100644 --- a/pkg/compute/tasks/instance_backup_recovery_task.go +++ b/pkg/compute/tasks/instance_backup_recovery_task.go @@ -106,7 +106,7 @@ func (self *InstanceBackupRecoveryTask) OnInit(ctx context.Context, obj db.IStan params.Set("guest_id", jsonutils.NewString(guest.Id)) self.SetStage("OnCreateGuest", params) params.Set("parent_task_id", jsonutils.NewString(self.GetTaskId())) - models.GuestManager.OnCreateComplete(ctx, []db.IModel{guest}, self.UserCred, ownerId, nil, params) + models.GuestManager.OnCreateComplete(ctx, []db.IModel{guest}, self.UserCred, ownerId, nil, []jsonutils.JSONObject{params}) } func (self *InstanceBackupRecoveryTask) OnCreateGuest(ctx context.Context, ib *models.SInstanceBackup, data jsonutils.JSONObject) { diff --git a/pkg/compute/tasks/instance_snapshot_and_clone_task.go b/pkg/compute/tasks/instance_snapshot_and_clone_task.go index eeeb60146b..64190ed4f1 100644 --- a/pkg/compute/tasks/instance_snapshot_and_clone_task.go +++ b/pkg/compute/tasks/instance_snapshot_and_clone_task.go @@ -129,7 +129,7 @@ func (self *InstanceSnapshotAndCloneTask) doGuestCreate( continue } isp.AddRefCount(ctx) - models.GuestManager.OnCreateComplete(ctx, []db.IModel{newGuest}, self.UserCred, self.UserCred, nil, params) + models.GuestManager.OnCreateComplete(ctx, []db.IModel{newGuest}, self.UserCred, self.UserCred, nil, []jsonutils.JSONObject{params}) } if len(errStr) > 0 { return fmt.Errorf(errStr) diff --git a/pkg/compute/tasks/schedule.go b/pkg/compute/tasks/schedule.go index 229ef4aae2..17cf74595d 100644 --- a/pkg/compute/tasks/schedule.go +++ b/pkg/compute/tasks/schedule.go @@ -50,10 +50,10 @@ type IScheduleTask interface { SetStageFailed(ctx context.Context, reason jsonutils.JSONObject) OnStartSchedule(obj IScheduleModel) - OnScheduleFailCallback(ctx context.Context, obj IScheduleModel, reason jsonutils.JSONObject) + OnScheduleFailCallback(ctx context.Context, obj IScheduleModel, reason jsonutils.JSONObject, index int) // OnScheduleComplete(ctx context.Context, items []db.IStandaloneModel, data *jsonutils.JSONDict) - SaveScheduleResult(ctx context.Context, obj IScheduleModel, candidate *schedapi.CandidateResource) - SaveScheduleResultWithBackup(ctx context.Context, obj IScheduleModel, master, slave *schedapi.CandidateResource) + SaveScheduleResult(ctx context.Context, obj IScheduleModel, candidate *schedapi.CandidateResource, index int) + SaveScheduleResultWithBackup(ctx context.Context, obj IScheduleModel, master, slave *schedapi.CandidateResource, index int) OnScheduleFailed(ctx context.Context, reason jsonutils.JSONObject) } @@ -67,7 +67,7 @@ func (self *SSchedTask) OnStartSchedule(obj IScheduleModel) { obj.SetStatus(self.GetUserCred(), api.VM_SCHEDULE, "") } -func (self *SSchedTask) OnScheduleFailCallback(ctx context.Context, obj IScheduleModel, reason jsonutils.JSONObject) { +func (self *SSchedTask) OnScheduleFailCallback(ctx context.Context, obj IScheduleModel, reason jsonutils.JSONObject, index int) { obj.SetStatus(self.GetUserCred(), api.VM_SCHEDULE_FAILED, reason.String()) db.OpsLog.LogEvent(obj, db.ACT_ALLOCATE_FAIL, reason, self.GetUserCred()) logclient.AddActionLogWithStartable(self, obj, logclient.ACT_ALLOCATE, reason, self.GetUserCred(), false) @@ -78,11 +78,11 @@ func (self *SSchedTask) OnScheduleComplete(ctx context.Context, items []db.IStan self.SetStageComplete(ctx, nil) } -func (self *SSchedTask) SaveScheduleResult(ctx context.Context, obj IScheduleModel, candidate *schedapi.CandidateResource) { +func (self *SSchedTask) SaveScheduleResult(ctx context.Context, obj IScheduleModel, candidate *schedapi.CandidateResource, index int) { // ... } -func (self *SSchedTask) SaveScheduleResultWithBackup(ctx context.Context, obj IScheduleModel, master, slave *schedapi.CandidateResource) { +func (self *SSchedTask) SaveScheduleResultWithBackup(ctx context.Context, obj IScheduleModel, master, slave *schedapi.CandidateResource, index int) { // ... } @@ -160,8 +160,8 @@ func onSchedulerRequestFail( objs []IScheduleModel, reason jsonutils.JSONObject, ) { - for _, obj := range objs { - onObjScheduleFail(ctx, task, obj, reason) + for i, obj := range objs { + onObjScheduleFail(ctx, task, obj, reason, i) } task.OnScheduleFailed(ctx, reason) cancelPendingUsage(ctx, task) @@ -172,6 +172,7 @@ func onObjScheduleFail( task IScheduleTask, obj IScheduleModel, msg jsonutils.JSONObject, + idx int, ) { lockman.LockObject(ctx, obj) defer lockman.ReleaseObject(ctx, obj) @@ -181,7 +182,7 @@ func onObjScheduleFail( if msg != nil { reason = jsonutils.NewArray(reason, msg) } - task.OnScheduleFailCallback(ctx, obj, reason) + task.OnScheduleFailCallback(ctx, obj, reason, idx) } type sortedIScheduleModelList []IScheduleModel @@ -198,7 +199,7 @@ func onSchedulerResults( ) { if len(objs) == 0 { // sched with out object can't clean sched cache immediately - task.SaveScheduleResult(ctx, nil, results[0]) + task.SaveScheduleResult(ctx, nil, results[0], 0) return } sort.Sort(sortedIScheduleModelList(objs)) @@ -208,16 +209,16 @@ func onSchedulerResults( result := results[idx] if len(result.Error) != 0 { - onObjScheduleFail(ctx, task, obj, jsonutils.NewString(result.Error)) + onObjScheduleFail(ctx, task, obj, jsonutils.NewString(result.Error), idx) continue } if result.BackupCandidate == nil { // normal schedule - onScheduleSucc(ctx, task, obj, result) + onScheduleSucc(ctx, task, obj, result, idx) } else { // backup schedule - onMasterSlaveScheduleSucc(ctx, task, obj, result, result.BackupCandidate) + onMasterSlaveScheduleSucc(ctx, task, obj, result, result.BackupCandidate, idx) } succCount += 1 } @@ -232,10 +233,11 @@ func onMasterSlaveScheduleSucc( task IScheduleTask, obj IScheduleModel, master, slave *schedapi.CandidateResource, + index int, ) { lockman.LockObject(ctx, obj) defer lockman.ReleaseObject(ctx, obj) - task.SaveScheduleResultWithBackup(ctx, obj, master, slave) + task.SaveScheduleResultWithBackup(ctx, obj, master, slave, index) models.HostManager.ClearSchedDescSessionCache(master.HostId, master.SessionId) models.HostManager.ClearSchedDescSessionCache(slave.HostId, slave.SessionId) } @@ -245,11 +247,28 @@ func onScheduleSucc( task IScheduleTask, obj IScheduleModel, candidate *schedapi.CandidateResource, + index int, ) { hostId := candidate.HostId lockman.LockRawObject(ctx, models.HostManager.KeywordPlural(), hostId) defer lockman.ReleaseRawObject(ctx, models.HostManager.KeywordPlural(), hostId) - task.SaveScheduleResult(ctx, obj, candidate) + task.SaveScheduleResult(ctx, obj, candidate, index) models.HostManager.ClearSchedDescSessionCache(candidate.HostId, candidate.SessionId) } + +func getBatchParamsAtIndex(task taskman.ITask, index int) *jsonutils.JSONDict { + var data *jsonutils.JSONDict + params := task.GetParams() + paramsArray, _ := params.GetArray("data") + if len(paramsArray) > 0 { + if len(paramsArray) > index { + data = paramsArray[index].(*jsonutils.JSONDict) + } else { + data = paramsArray[0].(*jsonutils.JSONDict) + } + } else { + data = params + } + return data +} diff --git a/pkg/hostman/guestfs/fsdriver/userdata.go b/pkg/hostman/guestfs/fsdriver/userdata.go new file mode 100644 index 0000000000..7389fffb07 --- /dev/null +++ b/pkg/hostman/guestfs/fsdriver/userdata.go @@ -0,0 +1,15 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fsdriver