87 lines
1.7 KiB
Go
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())
|
|
}
|