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