feat(cli): proxdeploy in Go
Befehle login, servers, distros, profiles, presets, vm, lxc, template list|build, batch, status, logs --follow, cancel. Renderer im Aufbau der Vorgabe (zeichengenau per Golden-File), 24-bit/256/ohne Farbe, --ascii, --quiet, --json, --dry-run; live im Terminal, zeilenweise ohne. SSE mit Wiederverbinden und Polling als Rückfall. Typen aus openapi.json per oapi-codegen; Release-Builds per cli/bauen.sh. Refs #013 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
package befehle
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
func (u *umgebung) templateBefehl() *cobra.Command {
|
||||
gruppe := &cobra.Command{Use: "template", Short: "Templates ansehen und bauen"}
|
||||
|
||||
var listeServer string
|
||||
liste := &cobra.Command{
|
||||
Use: "list",
|
||||
Short: "ProxDeploy-Templates eines Servers",
|
||||
Args: cobra.NoArgs,
|
||||
RunE: func(cmd *cobra.Command, _ []string) error {
|
||||
c, instanz, err := u.client()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if listeServer == "" {
|
||||
listeServer = instanz.Server
|
||||
}
|
||||
if listeServer == "" {
|
||||
return bedienfehler("--server fehlt")
|
||||
}
|
||||
templates, err := c.TemplatesListe(cmd.Context(), listeServer)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if u.opt.json {
|
||||
return u.jsonAusgeben(templates)
|
||||
}
|
||||
zeilen := [][]string{}
|
||||
for _, t := range templates {
|
||||
profile := "–"
|
||||
if len(t.Profile) > 0 {
|
||||
profile = strings.Join(t.Profile, ", ")
|
||||
}
|
||||
zeilen = append(zeilen, []string{fmt.Sprint(t.Vmid), t.Name, t.Knoten, wert(t.DistributionId), profile})
|
||||
}
|
||||
u.tabelle(u.stil(), []string{"VMID", "NAME", "NODE", "DISTRIBUTION", "PROFILE"}, zeilen)
|
||||
return nil
|
||||
},
|
||||
}
|
||||
liste.Flags().StringVar(&listeServer, "server", "", "Proxmox-Server")
|
||||
|
||||
var server, distro, knoten, storage, bridge string
|
||||
var vlan int
|
||||
var profile []string
|
||||
var nichtWarten bool
|
||||
bauen := &cobra.Command{
|
||||
Use: "build",
|
||||
Short: "Template aus dem Cloud-Image bauen",
|
||||
Example: " proxdeploy template build --server rz1 --distro debian-13\n proxdeploy template build --server rz1 --distro debian-13 --profile base,docker",
|
||||
Args: cobra.NoArgs,
|
||||
RunE: func(cmd *cobra.Command, _ []string) error {
|
||||
c, instanz, err := u.client()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if server == "" {
|
||||
server = instanz.Server
|
||||
}
|
||||
if server == "" {
|
||||
return bedienfehler("--server fehlt")
|
||||
}
|
||||
if distro == "" {
|
||||
return bedienfehler("--distro fehlt (siehe `proxdeploy distros --type vm`)")
|
||||
}
|
||||
anfrage := map[string]any{"distribution": distro}
|
||||
gesetzt := cmd.Flags().Changed
|
||||
if gesetzt("node") {
|
||||
anfrage["knoten"] = knoten
|
||||
}
|
||||
if gesetzt("storage") {
|
||||
anfrage["storage"] = storage
|
||||
}
|
||||
if gesetzt("bridge") {
|
||||
anfrage["bridge"] = bridge
|
||||
}
|
||||
if gesetzt("vlan") {
|
||||
anfrage["vlan"] = vlan
|
||||
}
|
||||
if gesetzt("profile") {
|
||||
anfrage["profile"] = profile
|
||||
}
|
||||
angenommen, err := c.TemplateBauen(cmd.Context(), server, anfrage)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return u.angenommen(cmd.Context(), c, angenommen, nichtWarten)
|
||||
},
|
||||
}
|
||||
f := bauen.Flags()
|
||||
f.StringVar(&server, "server", "", "Proxmox-Server")
|
||||
f.StringVar(&distro, "distro", "", "Distribution, z. B. debian-13")
|
||||
f.StringVar(&knoten, "node", "", "Node (Standard: aus den Server-Einstellungen bzw. der erste)")
|
||||
f.StringVar(&storage, "storage", "", "Storage für die Disk (Standard: aus den Server-Einstellungen)")
|
||||
f.StringVar(&bridge, "bridge", "", "Bridge der Vorbereitungs-VM (Standard: vmbr0)")
|
||||
f.IntVar(&vlan, "vlan", 0, "VLAN der Vorbereitungs-VM")
|
||||
f.StringSliceVar(&profile, "profile", nil, "Profile einbacken, z. B. base,docker")
|
||||
f.BoolVar(&nichtWarten, "no-wait", false, "nicht verfolgen, nur die Auftrags-ID ausgeben")
|
||||
|
||||
gruppe.AddCommand(liste, bauen)
|
||||
return gruppe
|
||||
}
|
||||
Reference in New Issue
Block a user