From bf55d0ef3ec246a18ceb044a7a211b673bc2f872 Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Sun, 30 Sep 2018 15:20:41 +0800 Subject: [PATCH] add server restart --- cmd/climc/shell/servers.go | 10 ++++++++++ pkg/compute/guestdrivers/base.go | 4 ++++ pkg/compute/guestdrivers/virtualization.go | 11 +++++++++++ pkg/compute/models/guestdrivers.go | 1 + pkg/compute/models/guests.go | 16 ++++++++++++++++ pkg/compute/tasks/guest_reset_task.go | 12 ++++++++++++ pkg/mcclient/options/servers.go | 5 +++++ 7 files changed, 59 insertions(+) diff --git a/cmd/climc/shell/servers.go b/cmd/climc/shell/servers.go index 23c2ff5fd9..d6957bfb8e 100644 --- a/cmd/climc/shell/servers.go +++ b/cmd/climc/shell/servers.go @@ -145,6 +145,16 @@ func init() { return nil }) + R(&options.ServerRestartOptions{}, "server-restart", "Restart servers", func(s *mcclient.ClientSession, opts *options.ServerRestartOptions) error { + params, err := options.StructToParams(opts) + if err != nil { + return err + } + ret := modules.Servers.BatchPerformAction(s, opts.ID, "restart", params) + printBatchResults(ret, modules.Servers.GetColumns(s)) + return nil + }) + R(&options.ServerIdsOptions{}, "server-purge", "Purge obsolete servers", func(s *mcclient.ClientSession, opts *options.ServerIdsOptions) error { ret := modules.Servers.BatchPerformAction(s, opts.ID, "purge", nil) printBatchResults(ret, modules.Servers.GetColumns(s)) diff --git a/pkg/compute/guestdrivers/base.go b/pkg/compute/guestdrivers/base.go index 2652c88e7e..7de34d2f89 100644 --- a/pkg/compute/guestdrivers/base.go +++ b/pkg/compute/guestdrivers/base.go @@ -106,6 +106,10 @@ func (self *SBaseGuestDriver) StartGuestResetTask(guest *models.SGuest, ctx cont return fmt.Errorf("Not Implement") } +func (self *SBaseGuestDriver) StartGuestRestartTask(guest *models.SGuest, ctx context.Context, userCred mcclient.TokenCredential, isForce bool, parentTaskId string) error { + return fmt.Errorf("Not Implement") +} + func (self *SBaseGuestDriver) RequestSoftReset(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { return fmt.Errorf("Not Implement") } diff --git a/pkg/compute/guestdrivers/virtualization.go b/pkg/compute/guestdrivers/virtualization.go index e8e7aed019..38158c87fd 100644 --- a/pkg/compute/guestdrivers/virtualization.go +++ b/pkg/compute/guestdrivers/virtualization.go @@ -109,6 +109,17 @@ func (self *SVirtualizedGuestDriver) StartGuestResetTask(guest *models.SGuest, c return nil } +func (self *SVirtualizedGuestDriver) StartGuestRestartTask(guest *models.SGuest, ctx context.Context, userCred mcclient.TokenCredential, isForce bool, parentTaskId string) error { + data := jsonutils.NewDict() + data.Set("is_force", jsonutils.NewBool(isForce)) + task, err := taskman.TaskManager.NewTask(ctx, "GuestRestartTask", guest, userCred, nil, parentTaskId, "", nil) + if err != nil { + return err + } + task.ScheduleRun(nil) + return nil +} + func (self *SVirtualizedGuestDriver) OnGuestDeployTaskComplete(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { if jsonutils.QueryBoolean(task.GetParams(), "restart", false) { task.SetStage("OnDeployStartGuestComplete", nil) diff --git a/pkg/compute/models/guestdrivers.go b/pkg/compute/models/guestdrivers.go index b1e60c20b8..464d32743e 100644 --- a/pkg/compute/models/guestdrivers.go +++ b/pkg/compute/models/guestdrivers.go @@ -40,6 +40,7 @@ type IGuestDriver interface { StartGuestStopTask(guest *SGuest, ctx context.Context, userCred mcclient.TokenCredential, params *jsonutils.JSONDict, parentTaskId string) error StartGuestResetTask(guest *SGuest, ctx context.Context, userCred mcclient.TokenCredential, isHard bool, parentTaskId string) error + StartGuestRestartTask(guest *SGuest, ctx context.Context, userCred mcclient.TokenCredential, isForce bool, parentTaskId string) error RequestSoftReset(ctx context.Context, guest *SGuest, task taskman.ITask) error diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 4839c19d24..7d53b31407 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -3983,6 +3983,22 @@ func (self *SGuest) PerformStop(ctx context.Context, userCred mcclient.TokenCred } } +func (self *SGuest) AllowPerformRestart(ctx context.Context, + userCred mcclient.TokenCredential, + query jsonutils.JSONObject, + data jsonutils.JSONObject) bool { + return self.IsOwner(userCred) +} + +func (self *SGuest) PerformRestart(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) { + return nil, self.GetDriver().StartGuestRestartTask(self, ctx, userCred, isForce, "") + } else { + return nil, httperrors.NewInvalidStatusError("Cannot do restart server in status %s", self.Status) + } +} + /* TODO diff --git a/pkg/compute/tasks/guest_reset_task.go b/pkg/compute/tasks/guest_reset_task.go index 72a5273e2d..242eff6f38 100644 --- a/pkg/compute/tasks/guest_reset_task.go +++ b/pkg/compute/tasks/guest_reset_task.go @@ -13,6 +13,7 @@ import ( func init() { taskman.RegisterTask(GuestSoftResetTask{}) taskman.RegisterTask(GuestHardResetTask{}) + taskman.RegisterTask(GuestRestartTask{}) } type GuestSoftResetTask struct { @@ -56,3 +57,14 @@ func (self *GuestHardResetTask) StartServer(ctx context.Context, guest *models.S func (self *GuestHardResetTask) OnServerStartComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { self.SetStageComplete(ctx, nil) } + +type GuestRestartTask struct { + GuestHardResetTask +} + +func (self *GuestRestartTask) StopServer(ctx context.Context, guest *models.SGuest) { + guest.SetStatus(self.UserCred, models.VM_STOPPING, "") + self.SetStage("OnServerStopComplete", nil) + isForce := jsonutils.QueryBoolean(self.Params, "is_force", false) + guest.StartGuestStopTask(ctx, self.UserCred, isForce, self.GetTaskId()) +} diff --git a/pkg/mcclient/options/servers.go b/pkg/mcclient/options/servers.go index 5d77248f4f..06110971d5 100644 --- a/pkg/mcclient/options/servers.go +++ b/pkg/mcclient/options/servers.go @@ -283,3 +283,8 @@ type ServerResetOptions struct { ID []string `help:"ID of servers to operate" metavar:"SERVER" json:"-"` Hard *bool `help:"Hard reset or not; default soft" json:"is_hard"` } + +type ServerRestartOptions struct { + ID []string `help:"ID of servers to operate" metavar:"SERVER" json:"-"` + IsForce *bool `help:"Force reset or not; default false" json:"is_force"` +}