Skip to content
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
10 changes: 10 additions & 0 deletions internal/cli/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -865,6 +865,16 @@ func resolveClusterArg(cmd, missingUsage, argsUsage string, required int, args [
if len(args) == required {
cluster := config.DefaultCluster()
if cluster == "" {
if required > 0 {
// The positional(s) supplied were consumed as the required
// entity (e.g. <repset>), leaving the cluster unset. Spell that
// out so a lone argument isn't silently misread as the cluster
// and reported back as a bare "cluster name is required".
return "", nil, fmt.Errorf(
"cluster name is required: %q was read as the %s argument (usage: %s %s); "+
"pass the cluster as the first argument or set default_cluster in ace.yaml",
strings.Join(args, " "), missingUsage, cmd, argsUsage)
}
return "", nil, fmt.Errorf("cluster name is required: specify one explicitly or set default_cluster in ace.yaml")
}
return cluster, args, nil
Expand Down
20 changes: 20 additions & 0 deletions internal/cli/cli_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ package cli

import (
"context"
"strings"
"testing"

"github.com/pgedge/ace/pkg/config"
Expand Down Expand Up @@ -61,6 +62,25 @@ func TestResolveClusterArgErrorsWithoutDefault(t *testing.T) {
}
}

// A lone positional is consumed as the required entity (repset), not the
// cluster. The error must name the consumed argument so the user sees why
// "cluster name is required" fired, instead of thinking their argument was
// ignored.
func TestResolveClusterArgSinglePositionalRevealsConsumedArg(t *testing.T) {
t.Cleanup(func() { config.Cfg = nil })
config.Cfg = &config.Config{}

_, _, err := resolveClusterArg("repset-diff", "<repset>", "[cluster] <repset>", 1, []string{"demo"})
if err == nil {
t.Fatalf("expected error for a lone positional with no default_cluster set")
}
for _, want := range []string{"demo", "<repset>", "repset-diff"} {
if !strings.Contains(err.Error(), want) {
t.Errorf("error %q missing expected substring %q", err.Error(), want)
}
}
}

func TestResolveClusterArgUnexpectedArgs(t *testing.T) {
t.Cleanup(func() { config.Cfg = nil })
config.Cfg = &config.Config{DefaultCluster: "default"}
Expand Down
Loading