diff --git a/pkg/compute/guestdrivers/cloudpods.go b/pkg/compute/guestdrivers/cloudpods.go index 7b591337b7..99a1a625f2 100644 --- a/pkg/compute/guestdrivers/cloudpods.go +++ b/pkg/compute/guestdrivers/cloudpods.go @@ -15,12 +15,16 @@ package guestdrivers import ( + "context" + "yunion.io/x/cloudmux/pkg/cloudprovider" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/util/rbacscope" "yunion.io/x/pkg/utils" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db/quotas" + "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/compute/models" "yunion.io/x/onecloud/pkg/compute/options" "yunion.io/x/onecloud/pkg/httperrors" @@ -56,6 +60,14 @@ func (self *SCloudpodsGuestDriver) GetGuestInitialStateAfterCreate() string { return api.VM_READY } +func (self *SCloudpodsGuestDriver) DoGuestCreateDisksTask(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { + subtask, err := taskman.TaskManager.NewTask(ctx, "CloudpodsGuestCreateDiskTask", guest, task.GetUserCred(), task.GetParams(), task.GetTaskId(), "", nil) + if err != nil { + return errors.Wrapf(err, "NewTask") + } + return subtask.ScheduleRun(nil) +} + func (self *SCloudpodsGuestDriver) GetDetachDiskStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 4c1f876945..4999037a5c 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -1835,10 +1835,9 @@ func (self *SGuest) StartGuestCreateDiskTask(ctx context.Context, userCred mccli data.Add(jsonutils.Marshal(disks), "disks") task, err := taskman.TaskManager.NewTask(ctx, "GuestCreateDiskTask", self, userCred, data, parentTaskId, "", nil) if err != nil { - return err + return errors.Wrapf(err, "NewTask") } - task.ScheduleRun(nil) - return nil + return task.ScheduleRun(nil) } func (self *SGuest) PerformDetachdisk(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input api.ServerDetachDiskInput) (jsonutils.JSONObject, error) { diff --git a/pkg/compute/tasks/guest_create_disk_task.go b/pkg/compute/tasks/guest_create_disk_task.go index 2a6fb3e436..90ed5c223f 100644 --- a/pkg/compute/tasks/guest_create_disk_task.go +++ b/pkg/compute/tasks/guest_create_disk_task.go @@ -439,6 +439,10 @@ func (self *NutanixGuestCreateDiskTask) OnInit(ctx context.Context, obj db.IStan self.SetStageComplete(ctx, nil) } +type CloudpodsGuestCreateDiskTask struct { + NutanixGuestCreateDiskTask +} + func init() { taskman.RegisterTask(GuestCreateBackupDisksTask{}) taskman.RegisterTask(GuestCreateDiskTask{}) @@ -447,4 +451,5 @@ func init() { taskman.RegisterTask(ESXiGuestCreateDiskTask{}) taskman.RegisterTask(ProxmoxGuestCreateDiskTask{}) taskman.RegisterTask(NutanixGuestCreateDiskTask{}) + taskman.RegisterTask(CloudpodsGuestCreateDiskTask{}) } diff --git a/pkg/mcclient/cloudpods/instance.go b/pkg/mcclient/cloudpods/instance.go index b80e758f08..597a712fe8 100644 --- a/pkg/mcclient/cloudpods/instance.go +++ b/pkg/mcclient/cloudpods/instance.go @@ -67,6 +67,13 @@ func (self *SInstance) Refresh() error { if err != nil { return err } + self.DisksInfo = nil + self.Nics = nil + self.Secgroups = nil + self.SubIPs = nil + self.IsolatedDevices = nil + self.Cdrom = nil + self.Floppy = nil return jsonutils.Update(self, ins) } @@ -584,3 +591,42 @@ func (cli *SCloudpodsClient) GetMetrics(opts *cloudprovider.MetricListOptions) ( } return res, nil } + +func (self *SInstance) CreateDisk(ctx context.Context, opts *cloudprovider.GuestDiskCreateOptions) (string, error) { + diskIds := []string{} + for _, disk := range self.DisksInfo { + diskIds = append(diskIds, disk.Id) + } + input := jsonutils.Marshal(map[string]interface{}{ + "disks": []map[string]interface{}{ + { + "size": opts.SizeMb, + "storage_id": opts.StorageId, + "preallocation": opts.Preallocation, + }, + }, + }) + _, err := self.host.zone.region.perform(&modules.Servers, self.Id, "createdisk", input) + if err != nil { + return "", err + } + ret := "" + cloudprovider.Wait(time.Second*3, time.Minute*3, func() (bool, error) { + err = self.Refresh() + if err != nil { + return false, errors.Wrapf(err, "Refresh") + } + + for _, disk := range self.DisksInfo { + if !utils.IsInStringArray(disk.Id, diskIds) { + ret = disk.Id + return true, nil + } + } + return false, nil + }) + if len(ret) > 0 { + return ret, nil + } + return "", errors.Wrapf(cloudprovider.ErrNotFound, "after disk created") +}