Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Backport of Fix a couple inconsistencies in operator usage instances command into release/1.15.x #16420

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 13 additions & 6 deletions command/operator/usage/instances/usage_instances.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,10 @@ type cmd struct {

func (c *cmd) init() {
c.flags = flag.NewFlagSet("", flag.ContinueOnError)
c.flags.BoolVar(&c.onlyBillable, "billable", false, "Display only billable service info.")
c.flags.BoolVar(&c.onlyConnect, "connect", false, "Display only Connect service info.")
c.flags.BoolVar(&c.onlyBillable, "billable", false, "Display only billable service info. "+
"Cannot be used with -connect.")
c.flags.BoolVar(&c.onlyConnect, "connect", false, "Display only Connect service info."+
"Cannot be used with -billable.")
c.flags.BoolVar(&c.allDatacenters, "all-datacenters", false, "Display service counts from "+
"all datacenters.")

Expand All @@ -54,6 +56,11 @@ func (c *cmd) Run(args []string) int {
return 1
}

if c.onlyBillable && c.onlyConnect {
c.UI.Error("Cannot specify both -billable and -connect flags")
return 1
}

// Create and test the HTTP client
client, err := c.http.APIClient()
if err != nil {
Expand Down Expand Up @@ -219,22 +226,22 @@ func (c *cmd) Help() string {
const (
synopsis = "Display service instance usage information"
help = `
Usage: consul usage instances [options]
Usage: consul operator usage instances [options]

Retrieves usage information about the number of services registered in a given
datacenter. By default, the datacenter of the local agent is queried.

To retrieve the service usage data:

$ consul usage instances
$ consul operator usage instances

To show only billable service instance counts:

$ consul usage instances -billable
$ consul operator usage instances -billable

To show only connect service instance counts:

$ consul usage instances -connect
$ consul operator usage instances -connect

For a full list of options and examples, please see the Consul documentation.
`
Expand Down
44 changes: 35 additions & 9 deletions command/operator/usage/instances/usage_instances_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package instances

import (
"errors"
"testing"

"github.com/hashicorp/consul/agent"
Expand Down Expand Up @@ -36,15 +37,40 @@ func TestUsageInstancesCommand(t *testing.T) {
t.Fatal(err)
}

ui := cli.NewMockUi()
c := New(ui)
args := []string{
"-http-addr=" + a.HTTPAddr(),
cases := []struct {
name string
extraArgs []string
output string
err error
}{
{
name: "basic output",
output: "Billable Service Instances Total: 2",
},
{
name: "billable and connect flags together are invalid",
extraArgs: []string{"-billable", "-connect"},
err: errors.New("Cannot specify both -billable and -connect"),
},
}
code := c.Run(args)
if code != 0 {
t.Fatalf("bad exit code %d: %s", code, ui.ErrorWriter.String())

for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
ui := cli.NewMockUi()
c := New(ui)
args := []string{
"-http-addr=" + a.HTTPAddr(),
}
args = append(args, tc.extraArgs...)

code := c.Run(args)
if tc.err != nil {
require.Equal(t, 1, code)
require.Contains(t, ui.ErrorWriter.String(), tc.err.Error())
} else {
require.Equal(t, 0, code)
require.Contains(t, ui.OutputWriter.String(), tc.output)
}
})
}
output := ui.OutputWriter.String()
require.Contains(t, output, "Billable Service Instances Total: 2")
}