talos-upgrade/pkg/upgrade/selectNode.go
2023-10-21 11:05:33 -04:00

87 lines
1.7 KiB
Go

package upgrade
import (
"log"
"git.cycore.io/scm/talos-upgrade/pkg/node"
"github.com/charmbracelet/bubbles/list"
tea "github.com/charmbracelet/bubbletea"
)
type SelectNode struct {
Core *CoreState
list list.Model
}
func NewSelectNode(core *CoreState) *SelectNode {
if err := core.UpdateNodeList(core.ctx); err != nil {
log.Println("failed update node list:", err)
return nil
}
upgradableNodes := node.NotVersion(core.Nodes, core.SelectedVersion)
s := &SelectNode{
Core: core,
list: node.ListFromNodes(upgradableNodes),
}
if len(upgradableNodes) == 0 {
s.list.Title = "All nodes upgraded!"
} else {
s.list.Title = "Select Node to Upgrade"
}
frameWidth, frameHeight := docStyle.GetFrameSize()
s.list.SetSize(s.Core.Width-frameWidth, s.Core.Height-frameHeight)
return s
}
func (s *SelectNode) Init() tea.Cmd {
return nil
}
func (s *SelectNode) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg := msg.(type) {
case tea.KeyMsg:
if msg.String() == "ctrl+c" {
return s, tea.Quit
}
if msg.String() == "enter" {
selectedItem := s.list.Items()[s.list.Index()]
selectedNode := selectedItem.(*node.ListItem)
u, err := NewUpgrader(s.Core, &Node{
core: s.Core,
node: selectedNode.Node,
})
if err != nil {
log.Fatal("failed to get upgrader:", err)
}
return u, u.Tick()
}
case tea.WindowSizeMsg:
s.Core.Width = msg.Width
s.Core.Height = msg.Height
frameWidth, frameHeight := docStyle.GetFrameSize()
s.list.SetSize(msg.Width-frameWidth, msg.Height-frameHeight)
default:
}
var cmd tea.Cmd
s.list, cmd = s.list.Update(msg)
return s, cmd
}
func (s *SelectNode) View() string {
return docStyle.Render(s.list.View())
}