mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
add server restart
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
|
||||
@@ -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"`
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user