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>
110 lines
3.2 KiB
Go
110 lines
3.2 KiB
Go
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
|
||
}
|