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