k9s/internal/view/drain_dialog.go

118 lines
2.8 KiB
Go

// SPDX-License-Identifier: Apache-2.0
// Copyright Authors of K9s
package view
import (
"fmt"
"strconv"
"time"
"github.com/derailed/k9s/internal/dao"
"github.com/derailed/k9s/internal/ui"
"github.com/derailed/tview"
)
const drainKey = "drain"
// DrainFunc represents a drain callback function.
type DrainFunc func(v ResourceViewer, sels []string, opts dao.DrainOptions)
// ShowDrain pops a node drain dialog.
func ShowDrain(view ResourceViewer, sels []string, opts dao.DrainOptions, okFn DrainFunc) {
styles := view.App().Styles.Dialog()
f := tview.NewForm().
SetItemPadding(0).
SetButtonsAlign(tview.AlignCenter).
SetButtonBackgroundColor(styles.ButtonBgColor.Color()).
SetButtonTextColor(styles.ButtonFgColor.Color()).
SetLabelColor(styles.LabelFgColor.Color()).
SetFieldTextColor(styles.FieldFgColor.Color()).
SetFieldBackgroundColor(styles.BgColor.Color())
f.AddInputField("GracePeriod:", strconv.Itoa(opts.GracePeriodSeconds), 0, nil, func(v string) {
a, err := asIntOpt(v)
if err != nil {
view.App().Flash().Err(err)
return
}
view.App().Flash().Clear()
opts.GracePeriodSeconds = a
})
f.AddInputField("Timeout:", opts.Timeout.String(), 0, nil, func(v string) {
a, err := asDurOpt(v)
if err != nil {
view.App().Flash().Err(err)
return
}
view.App().Flash().Clear()
opts.Timeout = a
})
f.AddCheckbox("Ignore DaemonSets:", opts.IgnoreAllDaemonSets, func(_ string, v bool) {
opts.IgnoreAllDaemonSets = v
})
f.AddCheckbox("Delete Local Data:", opts.DeleteEmptyDirData, func(_ string, v bool) {
opts.DeleteEmptyDirData = v
})
f.AddCheckbox("Force:", opts.Force, func(_ string, v bool) {
opts.Force = v
})
f.AddCheckbox("Disable Eviction:", opts.DisableEviction, func(_ string, v bool) {
opts.DisableEviction = v
})
pages := view.App().Content.Pages
f.AddButton("Cancel", func() {
DismissDrain(view, pages)
})
f.AddButton("OK", func() {
DismissDrain(view, pages)
okFn(view, sels, opts)
})
modal := tview.NewModalForm("<Drain>", f)
path := "Drain "
if len(sels) == 1 {
path += sels[0]
} else {
path += fmt.Sprintf("(%d) nodes", len(sels))
}
path += "?"
modal.SetText(path)
modal.SetDoneFunc(func(_ int, b string) {
DismissDrain(view, pages)
})
pages.AddPage(drainKey, modal, false, true)
pages.ShowPage(drainKey)
view.App().SetFocus(pages.GetPrimitive(drainKey))
}
// DismissDrain dismiss the port forward dialog.
func DismissDrain(v ResourceViewer, p *ui.Pages) {
p.RemovePage(drainKey)
v.App().SetFocus(p.CurrentPage().Item)
}
// ----------------------------------------------------------------------------
// Helpers...
func asDurOpt(v string) (time.Duration, error) {
d, err := time.ParseDuration(v)
if err != nil {
return 0, err
}
return d, nil
}
func asIntOpt(v string) (int, error) {
i, err := strconv.Atoi(v)
if err != nil {
return 0, err
}
return i, nil
}