1package firewall 2 3import ( 4 "fmt" 5 6 "github.com/hetznercloud/hcloud-go/hcloud" 7 "github.com/spf13/cobra" 8 9 "github.com/hetznercloud/cli/internal/cmd/cmpl" 10 "github.com/hetznercloud/cli/internal/cmd/util" 11 "github.com/hetznercloud/cli/internal/state" 12) 13 14func newAddLabelCommand(cli *state.State) *cobra.Command { 15 cmd := &cobra.Command{ 16 Use: "add-label [FLAGS] FIREWALL LABEL", 17 Short: "Add a label to a Firewall", 18 Args: cobra.ExactArgs(2), 19 ValidArgsFunction: cmpl.SuggestArgs(cmpl.SuggestCandidatesF(cli.FirewallNames)), 20 TraverseChildren: true, 21 DisableFlagsInUseLine: true, 22 PreRunE: util.ChainRunE(validateFirewallAddLabel, cli.EnsureToken), 23 RunE: cli.Wrap(runFirewallAddLabel), 24 } 25 26 cmd.Flags().BoolP("overwrite", "o", false, "Overwrite label if it exists already") 27 return cmd 28} 29 30func validateFirewallAddLabel(cmd *cobra.Command, args []string) error { 31 label := util.SplitLabel(args[1]) 32 if len(label) != 2 { 33 return fmt.Errorf("invalid label: %s", args[1]) 34 } 35 36 return nil 37} 38 39func runFirewallAddLabel(cli *state.State, cmd *cobra.Command, args []string) error { 40 overwrite, _ := cmd.Flags().GetBool("overwrite") 41 42 idOrName := args[0] 43 firewall, _, err := cli.Client().Firewall.Get(cli.Context, idOrName) 44 if err != nil { 45 return err 46 } 47 if firewall == nil { 48 return fmt.Errorf("Firewall not found: %v", idOrName) 49 } 50 51 label := util.SplitLabel(args[1]) 52 53 if _, ok := firewall.Labels[label[0]]; ok && !overwrite { 54 return fmt.Errorf("label %s on Firewall %d already exists", label[0], firewall.ID) 55 } 56 labels := firewall.Labels 57 labels[label[0]] = label[1] 58 opts := hcloud.FirewallUpdateOpts{ 59 Labels: labels, 60 } 61 _, _, err = cli.Client().Firewall.Update(cli.Context, firewall, opts) 62 if err != nil { 63 return err 64 } 65 fmt.Printf("Label %s added to Firewall %d\n", label[0], firewall.ID) 66 67 return nil 68} 69