k9s/internal/view/restart_extender.go

66 lines
1.5 KiB
Go

package view
import (
"errors"
"github.com/derailed/k9s/internal/client"
"github.com/derailed/k9s/internal/dao"
"github.com/derailed/k9s/internal/ui"
"github.com/derailed/k9s/internal/ui/dialog"
"github.com/gdamore/tcell"
)
// RestartExtender represents a restartable resource.
type RestartExtender struct {
ResourceViewer
}
// NewRestartExtender returns a new extender.
func NewRestartExtender(v ResourceViewer) ResourceViewer {
r := RestartExtender{ResourceViewer: v}
r.bindKeys(v.Actions())
return &r
}
// BindKeys creates additional menu actions.
func (r *RestartExtender) bindKeys(aa ui.KeyActions) {
aa.Add(ui.KeyActions{
tcell.KeyCtrlT: ui.NewKeyAction("Restart", r.restartCmd, true),
})
}
func (r *RestartExtender) restartCmd(evt *tcell.EventKey) *tcell.EventKey {
path := r.GetTable().GetSelectedItem()
if path == "" {
return nil
}
r.Stop()
defer r.Start()
msg := "Please confirm rollout restart for " + path
dialog.ShowConfirm(r.App().Content.Pages, "<Confirm Restart>", msg, func() {
if err := r.restartRollout(path); err != nil {
r.App().Flash().Err(err)
} else {
r.App().Flash().Infof("Rollout restart in progress for `%s...", path)
}
}, func() {})
return nil
}
func (r *RestartExtender) restartRollout(path string) error {
res, err := dao.AccessorFor(r.App().factory, client.GVR(r.GVR()))
if err != nil {
return nil
}
s, ok := res.(dao.Restartable)
if !ok {
return errors.New("resource is not restartable")
}
return s.Restart(path)
}