Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions src/internal/app/actions_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/larkly/lazystack/internal/ui/consolelog"
"github.com/larkly/lazystack/internal/ui/fippicker"
"github.com/larkly/lazystack/internal/ui/modal"
"github.com/larkly/lazystack/internal/ui/serverrebuild"
"github.com/larkly/lazystack/internal/ui/serverrename"
"github.com/larkly/lazystack/internal/ui/serverresize"
"github.com/larkly/lazystack/internal/volume"
Expand Down Expand Up @@ -40,6 +41,26 @@ func (m Model) openRename() (Model, tea.Cmd) {
return m, m.serverRename.Init()
}

func (m Model) openRebuild() (Model, tea.Cmd) {
var id, name, imageID string
switch m.view {
case viewServerList:
if s := m.serverList.SelectedServer(); s != nil {
id, name, imageID = s.ID, s.Name, s.ImageID
}
case viewServerDetail:
id = m.serverDetail.ServerID()
name = m.serverDetail.ServerName()
imageID = m.serverDetail.ServerImageID()
}
if id == "" {
return m, nil
}
m.serverRebuild = serverrebuild.New(m.client.Compute, m.client.Image, id, name, imageID)
m.serverRebuild.SetSize(m.width, m.height)
return m, m.serverRebuild.Init()
}

func (m Model) openDeleteConfirm() (Model, tea.Cmd) {
if m.view == viewServerList && m.serverList.SelectionCount() > 0 {
servers := m.serverList.SelectedServers()
Expand Down
22 changes: 20 additions & 2 deletions src/internal/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import (
"github.com/larkly/lazystack/internal/ui/serverpicker"
"github.com/larkly/lazystack/internal/ui/serverdetail"
"github.com/larkly/lazystack/internal/ui/serverrename"
"github.com/larkly/lazystack/internal/ui/serverrebuild"
"github.com/larkly/lazystack/internal/ui/serverlist"
"github.com/larkly/lazystack/internal/ui/serverresize"
"github.com/larkly/lazystack/internal/ui/statusbar"
Expand Down Expand Up @@ -111,8 +112,9 @@ type Model struct {
serverCreate servercreate.Model
consoleLog consolelog.Model
actionLog actionlog.Model
serverRename serverrename.Model
serverResize serverresize.Model
serverRename serverrename.Model
serverRebuild serverrebuild.Model
serverResize serverresize.Model
fipPicker fippicker.Model
serverPicker serverpicker.Model
sgCreate sgcreate.Model
Expand Down Expand Up @@ -270,6 +272,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
m.quotaView.Width = m.width
m.quotaView.Height = m.height
m.serverRename.SetSize(m.width, m.height)
m.serverRebuild.SetSize(m.width, m.height)
m.serverResize.SetSize(m.width, m.height)
m.fipPicker.SetSize(m.width, m.height)
m.serverPicker.SetSize(m.width, m.height)
Expand Down Expand Up @@ -324,6 +327,13 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
return m, cmd
}

// Rebuild modal intercepts all keys when active
if m.serverRebuild.Active {
var cmd tea.Cmd
m.serverRebuild, cmd = m.serverRebuild.Update(msg)
return m, cmd
}

// Resize modal intercepts all keys when active
if m.serverResize.Active {
var cmd tea.Cmd
Expand Down Expand Up @@ -480,6 +490,9 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
if key.Matches(msg, shared.Keys.Rename) {
return m.openRename()
}
if key.Matches(msg, shared.Keys.Rebuild) {
return m.openRebuild()
}
if key.Matches(msg, shared.Keys.ConfirmResize) {
return m.doConfirmResize()
}
Expand Down Expand Up @@ -921,6 +934,11 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
m.serverRename, cmd = m.serverRename.Update(msg)
return m, tea.Batch(viewCmd, cmd)
}
if m.serverRebuild.Active {
var cmd tea.Cmd
m.serverRebuild, cmd = m.serverRebuild.Update(msg)
return m, tea.Batch(viewCmd, cmd)
}
if m.serverResize.Active {
var cmd tea.Cmd
m.serverResize, cmd = m.serverResize.Update(msg)
Expand Down
3 changes: 3 additions & 0 deletions src/internal/app/render.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@ func (m Model) viewContent() string {
if m.serverRename.Active {
return m.serverRename.View()
}
if m.serverRebuild.Active {
return m.serverRebuild.View()
}
if m.serverResize.Active {
return m.serverResize.View()
}
Expand Down
9 changes: 9 additions & 0 deletions src/internal/compute/servers.go
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,15 @@ func RevertResize(ctx context.Context, client *gophercloud.ServiceClient, id str
return nil
}

// RebuildServer rebuilds a server with a new image.
func RebuildServer(ctx context.Context, client *gophercloud.ServiceClient, id, imageRef string) error {
_, err := servers.Rebuild(ctx, client, id, servers.RebuildOpts{ImageRef: imageRef}).Extract()
if err != nil {
return fmt.Errorf("rebuilding server %s: %w", id, err)
}
return nil
}

// RenameServer updates a server's name.
func RenameServer(ctx context.Context, client *gophercloud.ServiceClient, id, newName string) error {
_, err := servers.Update(ctx, client, id, servers.UpdateOpts{Name: newName}).Extract()
Expand Down
5 changes: 5 additions & 0 deletions src/internal/shared/keys.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ type KeyMap struct {
StopStart key.Binding
Lock key.Binding
Rename key.Binding
Rebuild key.Binding
}

var Keys = KeyMap{
Expand Down Expand Up @@ -211,4 +212,8 @@ var Keys = KeyMap{
key.WithKeys("r"),
key.WithHelp("r", "rename"),
),
Rebuild: key.NewBinding(
key.WithKeys("ctrl+g"),
key.WithHelp("ctrl+g", "rebuild"),
),
}
2 changes: 2 additions & 0 deletions src/internal/ui/help/help.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ func (m *Model) buildLines() {
"o stop/start",
"ctrl+l lock/unlock",
"ctrl+f resize",
"ctrl+g rebuild",
"r rename",
"ctrl+a assign floating IP",
"L console log",
Expand All @@ -85,6 +86,7 @@ func (m *Model) buildLines() {
"o stop/start",
"ctrl+l lock/unlock",
"ctrl+f resize",
"ctrl+g rebuild",
"r rename",
"L console log",
"a action history",
Expand Down
8 changes: 8 additions & 0 deletions src/internal/ui/serverdetail/serverdetail.go
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,14 @@ func (m Model) ServerFlavor() string {
return ""
}

// ServerImageID returns the current server's image ID.
func (m Model) ServerImageID() string {
if m.server != nil {
return m.server.ImageID
}
return ""
}

// ServerLocked returns whether the server is locked.
func (m Model) ServerLocked() bool {
if m.server != nil {
Expand Down
Loading