Files
rainyun-cli/internal/cmd/server.go
T

178 lines
4.1 KiB
Go

package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
var serverCmd = &cobra.Command{
Use: "server",
Short: "Manage cloud servers",
}
var serverListCmd = &cobra.Command{
Use: "list",
Short: "List servers",
RunE: func(cmd *cobra.Command, args []string) error {
svc := prov.Server()
if svc == nil {
return fmt.Errorf("server management not supported by current provider")
}
servers, err := svc.List(cmd.Context())
if err != nil {
return err
}
if flagRaw {
var raw []any
for _, s := range servers {
raw = append(raw, s.Raw)
}
return out.Print(raw)
}
return out.Print(servers)
},
}
var serverGetCmd = &cobra.Command{
Use: "get <id>",
Short: "Get server details",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
svc := prov.Server()
if svc == nil {
return fmt.Errorf("server management not supported")
}
s, err := svc.Get(cmd.Context(), args[0])
if err != nil {
return err
}
if flagRaw {
return out.Print(s.Raw)
}
return out.Print(s)
},
}
var serverStartCmd = &cobra.Command{
Use: "start <id>",
Short: "Start a server",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
svc := prov.Server()
if svc == nil {
return fmt.Errorf("server management not supported")
}
if err := svc.Start(cmd.Context(), args[0]); err != nil {
return err
}
fmt.Printf("Server %s started\n", args[0])
return nil
},
}
var serverStopCmd = &cobra.Command{
Use: "stop <id>",
Short: "Stop a server",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
svc := prov.Server()
if svc == nil {
return fmt.Errorf("server management not supported")
}
if err := svc.Stop(cmd.Context(), args[0]); err != nil {
return err
}
fmt.Printf("Server %s stopped\n", args[0])
return nil
},
}
var serverRebootCmd = &cobra.Command{
Use: "reboot <id>",
Short: "Reboot a server",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
svc := prov.Server()
if svc == nil {
return fmt.Errorf("server management not supported")
}
if err := svc.Reboot(cmd.Context(), args[0]); err != nil {
return err
}
fmt.Printf("Server %s rebooted\n", args[0])
return nil
},
}
var serverReinstallCmd = &cobra.Command{
Use: "reinstall <id>",
Short: "Reinstall server OS",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
svc := prov.Server()
if svc == nil {
return fmt.Errorf("server management not supported")
}
osTemplate, _ := cmd.Flags().GetString("os")
if osTemplate == "" {
return fmt.Errorf("--os flag is required (e.g. --os ubuntu-22.04)")
}
if err := svc.Reinstall(cmd.Context(), args[0], osTemplate); err != nil {
return err
}
fmt.Printf("Server %s reinstalling with %s\n", args[0], osTemplate)
return nil
},
}
var serverResetPasswordCmd = &cobra.Command{
Use: "reset-password <id>",
Short: "Reset server password",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
svc := prov.Server()
if svc == nil {
return fmt.Errorf("server management not supported")
}
if err := svc.ResetPassword(cmd.Context(), args[0]); err != nil {
return err
}
fmt.Printf("Password reset for server %s\n", args[0])
return nil
},
}
var serverVNCCmd = &cobra.Command{
Use: "vnc <id>",
Short: "Get VNC connection URL",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
svc := prov.Server()
if svc == nil {
return fmt.Errorf("server management not supported")
}
url, err := svc.GetVNC(cmd.Context(), args[0])
if err != nil {
return err
}
fmt.Println(url)
return nil
},
}
func init() {
serverReinstallCmd.Flags().String("os", "", "OS template name (required)")
serverReinstallCmd.MarkFlagRequired("os")
serverCmd.AddCommand(serverListCmd)
serverCmd.AddCommand(serverGetCmd)
serverCmd.AddCommand(serverStartCmd)
serverCmd.AddCommand(serverStopCmd)
serverCmd.AddCommand(serverRebootCmd)
serverCmd.AddCommand(serverReinstallCmd)
serverCmd.AddCommand(serverResetPasswordCmd)
serverCmd.AddCommand(serverVNCCmd)
rootCmd.AddCommand(serverCmd)
}