1package command
2
3import (
4	"fmt"
5	"strings"
6
7	"github.com/hashicorp/nomad/api"
8	"github.com/posener/complete"
9)
10
11type QuotaInspectCommand struct {
12	Meta
13}
14
15type inspectedQuota struct {
16	Spec     *api.QuotaSpec
17	Usages   map[string]*api.QuotaUsage
18	Failures map[string]string `json:"UsageLookupErrors"`
19}
20
21func (c *QuotaInspectCommand) Help() string {
22	helpText := `
23Usage: nomad quota inspect [options] <quota>
24
25  Inspect is used to view raw information about a particular quota.
26
27General Options:
28
29  ` + generalOptionsUsage() + `
30
31Inspect Options:
32
33  -t
34    Format and display the namespaces using a Go template.
35`
36
37	return strings.TrimSpace(helpText)
38}
39
40func (c *QuotaInspectCommand) AutocompleteFlags() complete.Flags {
41	return mergeAutocompleteFlags(c.Meta.AutocompleteFlags(FlagSetClient),
42		complete.Flags{
43			"-t": complete.PredictAnything,
44		})
45}
46
47func (c *QuotaInspectCommand) AutocompleteArgs() complete.Predictor {
48	return QuotaPredictor(c.Meta.Client)
49}
50
51func (c *QuotaInspectCommand) Synopsis() string {
52	return "Inspect a quota specification"
53}
54
55func (c *QuotaInspectCommand) Name() string { return "quota inspect" }
56
57func (c *QuotaInspectCommand) Run(args []string) int {
58	var tmpl string
59	flags := c.Meta.FlagSet(c.Name(), FlagSetClient)
60	flags.Usage = func() { c.Ui.Output(c.Help()) }
61	flags.StringVar(&tmpl, "t", "", "")
62
63	if err := flags.Parse(args); err != nil {
64		return 1
65	}
66
67	// Check that we got one arguments
68	args = flags.Args()
69	if l := len(args); l != 1 {
70		c.Ui.Error("This command takes one argument: <quota>")
71		c.Ui.Error(commandErrorText(c))
72		return 1
73	}
74
75	name := args[0]
76
77	// Get the HTTP client
78	client, err := c.Meta.Client()
79	if err != nil {
80		c.Ui.Error(fmt.Sprintf("Error initializing client: %s", err))
81		return 1
82	}
83
84	// Do a prefix lookup
85	quotas := client.Quotas()
86	spec, possible, err := getQuota(quotas, name)
87	if err != nil {
88		c.Ui.Error(fmt.Sprintf("Error retrieving quota: %s", err))
89		return 1
90	}
91
92	if len(possible) != 0 {
93		c.Ui.Error(fmt.Sprintf("Prefix matched multiple quotas\n\n%s", formatQuotaSpecs(possible)))
94		return 1
95	}
96
97	// Get the quota usages
98	usages, failures := quotaUsages(spec, quotas)
99
100	failuresConverted := make(map[string]string, len(failures))
101	for r, e := range failures {
102		failuresConverted[r] = e.Error()
103	}
104
105	data := &inspectedQuota{
106		Spec:     spec,
107		Usages:   usages,
108		Failures: failuresConverted,
109	}
110
111	out, err := Format(len(tmpl) == 0, tmpl, data)
112	if err != nil {
113		c.Ui.Error(err.Error())
114		return 1
115	}
116
117	c.Ui.Output(out)
118	return 0
119}
120