add server restart

This commit is contained in:
wanyaoqi
2018-09-30 15:20:41 +08:00
parent ec7f2ee981
commit bf55d0ef3e
7 changed files with 59 additions and 0 deletions
+10
View File
@@ -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))
+4
View File
@@ -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")
}
@@ -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)
+1
View File
@@ -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
+16
View File
@@ -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
+12
View File
@@ -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())
}
+5
View File
@@ -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"`
}