diff --git a/pkg/compute/guestdrivers/kvm.go b/pkg/compute/guestdrivers/kvm.go index 78a916e22d..d777f19843 100644 --- a/pkg/compute/guestdrivers/kvm.go +++ b/pkg/compute/guestdrivers/kvm.go @@ -329,7 +329,7 @@ func (self *SKVMGuestDriver) RequestSyncToBackup(ctx context.Context, guest *mod body := jsonutils.NewDict() body.Set("backup_nbd_server_uri", jsonutils.NewString(guest.GetMetadata("backup_nbd_server_uri", task.GetUserCred()))) host := guest.GetHost() - url := fmt.Sprintf("%s/server/%s/drive-mirror", host.ManagerUri, guest.Id) + url := fmt.Sprintf("%s/servers/%s/drive-mirror", host.ManagerUri, guest.Id) header := self.getTaskRequestHeader(task) _, _, err := httputils.JSONRequest(httputils.GetDefaultClient(), ctx, "POST", url, header, body, false) if err != nil { diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index aeeffa117d..8011d8beb6 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -95,7 +95,7 @@ type SDisk struct { AutoDelete bool `nullable:"false" default:"false" get:"user" update:"user"` // Column(Boolean, nullable=False, default=False) StorageId string `width:"128" charset:"ascii" nullable:"true" list:"admin" create:"required"` // Column(VARCHAR(ID_LENGTH, charset='ascii'), nullable=False) - BackupStorageId string `width:"128" charset:"ascii" nullable:"true" list:"admin" create:"required"` + BackupStorageId string `width:"128" charset:"ascii" nullable:"true" list:"admin"` // # backing template id and type TemplateId string `width:"256" charset:"ascii" nullable:"true" list:"user"` // Column(VARCHAR(ID_LENGTH, charset='ascii'), nullable=True) diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 8239026e7a..18dbf27bf3 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -199,8 +199,9 @@ func (self *SGuest) AllowPerformStop(ctx context.Context, func (self *SGuest) PerformStop(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { - isForce := jsonutils.QueryBoolean(data, "is_force", false) - if utils.IsInStringArray(self.Status, []string{VM_RUNNING, VM_STOP_FAILED}) || (isForce && self.Status == VM_STOPPING) { + // XXX if is force, force stop guest + var isForce = jsonutils.QueryBoolean(data, "is_force", false) + if isForce || utils.IsInStringArray(self.Status, []string{VM_RUNNING, VM_STOP_FAILED}) { return nil, self.StartGuestStopTask(ctx, userCred, isForce, "") } else { return nil, httperrors.NewInvalidStatusError("Cannot stop server in status %s", self.Status) diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 4a3b3fd5ae..5bb4ee2bce 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -90,6 +90,7 @@ const ( VM_SNAPSHOT = "snapshot" VM_SNAPSHOT_DELETE = "snapshot_delete" VM_BLOCK_STREAM = "block_stream" + VM_MIRROR_FAIL = "mirror_failed" VM_SNAPSHOT_SUCC = "snapshot_succ" VM_SNAPSHOT_FAILED = "snapshot_failed" diff --git a/pkg/compute/tasks/guest_start_task.go b/pkg/compute/tasks/guest_start_task.go index ba9f250e89..0f6c5454d1 100644 --- a/pkg/compute/tasks/guest_start_task.go +++ b/pkg/compute/tasks/guest_start_task.go @@ -110,7 +110,7 @@ func (self *GuestStartTask) OnStartBackupGuestComplete(ctx context.Context, gues func (self *GuestStartTask) OnStartComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { guest := obj.(*models.SGuest) db.OpsLog.LogEvent(guest, db.ACT_START, guest.GetShortDesc(), self.UserCred) - self.SetStage("on_guest_syncstatus_after_start", nil) + self.SetStage("OnGuestSyncstatusAfterStart", nil) guest.StartSyncstatus(ctx, self.UserCred, self.GetTaskId()) logclient.AddActionLog(guest, logclient.ACT_VM_START, "", self.UserCred, true) // self.taskComplete(ctx, guest)