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 ", 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 ", 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 ", 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 ", 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 ", 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 ", 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 ", 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) }