fix: provide meaningful error messages and add test (#18772)

* fix: provide meaningful error messages and add test

* fix: return error instead of warning when extra args are provided
This commit is contained in:
Poonam Jadhav 2023-09-18 09:09:31 -04:00 committed by GitHub
parent 0018b7e5a8
commit bf4e0b1aa9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 47 additions and 34 deletions

View File

@ -85,7 +85,7 @@ func (c *cmd) Run(args []string) int {
} }
parsedResource = data parsedResource = data
} else { } else {
c.UI.Error("Flag -f is required") c.UI.Error("Incorrect argument format: Flag -f with file path argument is required")
return 1 return 1
} }

View File

@ -78,7 +78,7 @@ func TestResourceApplyInvalidArgs(t *testing.T) {
"missing required flag": { "missing required flag": {
args: []string{}, args: []string{},
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("Flag -f is required"), expectedErr: errors.New("Incorrect argument format: Flag -f with file path argument is required"),
}, },
"file parsing failure": { "file parsing failure": {
args: []string{"-f=../testdata/invalid.hcl"}, args: []string{"-f=../testdata/invalid.hcl"},

View File

@ -84,13 +84,13 @@ func (c *cmd) Run(args []string) int {
} }
} else { } else {
if len(args) < 2 { if len(args) < 2 {
c.UI.Error("Your argument format is incorrect: Must specify two arguments: resource type and resource name") c.UI.Error("Incorrect argument format: Must specify two arguments: resource type and resource name")
return 1 return 1
} }
var err error var err error
gvk, resourceName, err = resource.GetTypeAndResourceName(args) gvk, resourceName, err = resource.GetTypeAndResourceName(args)
if err != nil { if err != nil {
c.UI.Error(fmt.Sprintf("Your argument format is incorrect: %s", err)) c.UI.Error(fmt.Sprintf("Incorrect argument format: %s", err))
return 1 return 1
} }
@ -101,7 +101,8 @@ func (c *cmd) Run(args []string) int {
return 1 return 1
} }
if c.filePath != "" { if c.filePath != "" {
c.UI.Warn("We ignored the -f flag if you provide gvk and resource name") c.UI.Error("Incorrect argument format: File argument is not needed when resource information is provided with the command")
return 1
} }
opts = &api.QueryOptions{ opts = &api.QueryOptions{
Namespace: c.http.Namespace(), Namespace: c.http.Namespace(),

View File

@ -27,12 +27,12 @@ func TestResourceDeleteInvalidArgs(t *testing.T) {
"nil args": { "nil args": {
args: nil, args: nil,
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("Your argument format is incorrect: Must specify two arguments: resource type and resource name"), expectedErr: errors.New("Incorrect argument format: Must specify two arguments: resource type and resource name"),
}, },
"empty args": { "empty args": {
args: []string{}, args: []string{},
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("Your argument format is incorrect: Must specify two arguments: resource type and resource name"), expectedErr: errors.New("Incorrect argument format: Must specify two arguments: resource type and resource name"),
}, },
"missing file path": { "missing file path": {
args: []string{"-f"}, args: []string{"-f"},
@ -47,27 +47,27 @@ func TestResourceDeleteInvalidArgs(t *testing.T) {
"provide type and name": { "provide type and name": {
args: []string{"a.b.c"}, args: []string{"a.b.c"},
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("Your argument format is incorrect: Must specify two arguments: resource type and resource name"), expectedErr: errors.New("Incorrect argument format: Must specify two arguments: resource type and resource name"),
}, },
"provide type and name with -f": { "provide type and name with -f": {
args: []string{"a.b.c", "name", "-f", "test.hcl"}, args: []string{"a.b.c", "name", "-f", "test.hcl"},
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("We ignored the -f flag if you provide gvk and resource name"), expectedErr: errors.New("Incorrect argument format: File argument is not needed when resource information is provided with the command"),
}, },
"provide type and name with -f and other flags": { "provide type and name with -f and other flags": {
args: []string{"a.b.c", "name", "-f", "test.hcl", "-namespace", "default"}, args: []string{"a.b.c", "name", "-f", "test.hcl", "-namespace", "default"},
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("We ignored the -f flag if you provide gvk and resource name"), expectedErr: errors.New("Incorrect argument format: File argument is not needed when resource information is provided with the command"),
}, },
"does not provide resource name after type": { "does not provide resource name after type": {
args: []string{"a.b.c", "-namespace", "default"}, args: []string{"a.b.c", "-namespace", "default"},
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("Your argument format is incorrect: Must provide resource name right after type"), expectedErr: errors.New("Incorrect argument format: Must provide resource name right after type"),
}, },
"invalid resource type format": { "invalid resource type format": {
args: []string{"a.", "name", "-namespace", "default"}, args: []string{"a.", "name", "-namespace", "default"},
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("Your argument format is incorrect: Must include resource type argument in group.verion.kind format"), expectedErr: errors.New("Incorrect argument format: Must include resource type argument in group.verion.kind format"),
}, },
} }

View File

@ -47,11 +47,6 @@ func (c *cmd) Run(args []string) int {
var gvk *api.GVK var gvk *api.GVK
var opts *api.QueryOptions var opts *api.QueryOptions
if len(args) == 0 {
c.UI.Error("Please provide required arguments")
return 1
}
if err := c.flags.Parse(args); err != nil { if err := c.flags.Parse(args); err != nil {
if !errors.Is(err, flag.ErrHelp) { if !errors.Is(err, flag.ErrHelp) {
c.UI.Error(fmt.Sprintf("Failed to parse args: %v", err)) c.UI.Error(fmt.Sprintf("Failed to parse args: %v", err))
@ -93,7 +88,7 @@ func (c *cmd) Run(args []string) int {
// extract resource type // extract resource type
gvk, err = getResourceType(c.flags.Args()) gvk, err = getResourceType(c.flags.Args())
if err != nil { if err != nil {
c.UI.Error(fmt.Sprintf("Your argument format is incorrect: %v", err)) c.UI.Error(fmt.Sprintf("Incorrect argument format: %v", err))
return 1 return 1
} }
// skip resource type to parse remaining args // skip resource type to parse remaining args
@ -104,7 +99,8 @@ func (c *cmd) Run(args []string) int {
return 1 return 1
} }
if c.filePath != "" { if c.filePath != "" {
c.UI.Warn(fmt.Sprintf("File argument is ignored when resource definition is provided with the command")) c.UI.Error("Incorrect argument format: File argument is not needed when resource information is provided with the command")
return 1
} }
opts = &api.QueryOptions{ opts = &api.QueryOptions{
@ -142,6 +138,10 @@ func getResourceType(args []string) (gvk *api.GVK, e error) {
if len(args) < 1 { if len(args) < 1 {
return nil, fmt.Errorf("Must include resource type argument") return nil, fmt.Errorf("Must include resource type argument")
} }
// it should not have resource name
if len(args) > 1 && !strings.HasPrefix(args[1], "-") {
return nil, fmt.Errorf("Must include flag arguments after resource type")
}
s := strings.Split(args[0], ".") s := strings.Split(args[0], ".")
if len(s) < 3 { if len(s) < 3 {

View File

@ -99,12 +99,12 @@ func TestResourceListInvalidArgs(t *testing.T) {
"nil args": { "nil args": {
args: nil, args: nil,
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("Please provide required arguments"), expectedErr: errors.New("Incorrect argument format: Must include resource type argument"),
}, },
"minimum args required": { "minimum args required": {
args: []string{}, args: []string{},
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("Please provide required arguments"), expectedErr: errors.New("Incorrect argument format: Must include resource type argument"),
}, },
"no file path": { "no file path": {
args: []string{ args: []string{
@ -127,7 +127,7 @@ func TestResourceListInvalidArgs(t *testing.T) {
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("Failed to decode resource from input file"), expectedErr: errors.New("Failed to decode resource from input file"),
}, },
"file argument is ignored": { "file argument with resource type": {
args: []string{ args: []string{
"demo.v2.artist", "demo.v2.artist",
"-namespace=default", "-namespace=default",
@ -137,8 +137,8 @@ func TestResourceListInvalidArgs(t *testing.T) {
"-token=root", "-token=root",
"-f=demo.hcl", "-f=demo.hcl",
}, },
expectedCode: 0, expectedCode: 1,
expectedErr: errors.New("File argument is ignored when resource definition is provided with the command"), expectedErr: errors.New("Incorrect argument format: File argument is not needed when resource information is provided with the command"),
}, },
"resource type invalid": { "resource type invalid": {
args: []string{ args: []string{
@ -150,6 +150,17 @@ func TestResourceListInvalidArgs(t *testing.T) {
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("Must include resource type argument in group.verion.kind format"), expectedErr: errors.New("Must include resource type argument in group.verion.kind format"),
}, },
"resource name is provided": {
args: []string{
"demo.v2.artist",
"test",
"-namespace=default",
"-peer=local",
"-partition=default",
},
expectedCode: 1,
expectedErr: errors.New("Must include flag arguments after resource type"),
},
} }
for desc, tc := range cases { for desc, tc := range cases {

View File

@ -86,13 +86,13 @@ func (c *cmd) Run(args []string) int {
} }
} else { } else {
if len(args) < 2 { if len(args) < 2 {
c.UI.Error("Your argument format is incorrect: Must specify two arguments: resource type and resource name") c.UI.Error("Incorrect argument format: Must specify two arguments: resource type and resource name")
return 1 return 1
} }
var err error var err error
gvk, resourceName, err = resource.GetTypeAndResourceName(args) gvk, resourceName, err = resource.GetTypeAndResourceName(args)
if err != nil { if err != nil {
c.UI.Error(fmt.Sprintf("Your argument format is incorrect: %s", err)) c.UI.Error(fmt.Sprintf("Incorrect argument format: %s", err))
return 1 return 1
} }
@ -103,7 +103,8 @@ func (c *cmd) Run(args []string) int {
return 1 return 1
} }
if c.filePath != "" { if c.filePath != "" {
c.UI.Warn("We ignored the -f flag if you provide gvk and resource name") c.UI.Error("Incorrect argument format: File argument is not needed when resource information is provided with the command")
return 1
} }
opts = &api.QueryOptions{ opts = &api.QueryOptions{
Namespace: c.http.Namespace(), Namespace: c.http.Namespace(),

View File

@ -27,12 +27,12 @@ func TestResourceReadInvalidArgs(t *testing.T) {
"nil args": { "nil args": {
args: nil, args: nil,
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("Your argument format is incorrect: Must specify two arguments: resource type and resource name"), expectedErr: errors.New("Incorrect argument format: Must specify two arguments: resource type and resource name"),
}, },
"empty args": { "empty args": {
args: []string{}, args: []string{},
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("Your argument format is incorrect: Must specify two arguments: resource type and resource name"), expectedErr: errors.New("Incorrect argument format: Must specify two arguments: resource type and resource name"),
}, },
"missing file path": { "missing file path": {
args: []string{"-f"}, args: []string{"-f"},
@ -47,27 +47,27 @@ func TestResourceReadInvalidArgs(t *testing.T) {
"provide type and name": { "provide type and name": {
args: []string{"a.b.c"}, args: []string{"a.b.c"},
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("Your argument format is incorrect: Must specify two arguments: resource type and resource name"), expectedErr: errors.New("Incorrect argument format: Must specify two arguments: resource type and resource name"),
}, },
"provide type and name with -f": { "provide type and name with -f": {
args: []string{"a.b.c", "name", "-f", "test.hcl"}, args: []string{"a.b.c", "name", "-f", "test.hcl"},
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("We ignored the -f flag if you provide gvk and resource name"), expectedErr: errors.New("Incorrect argument format: File argument is not needed when resource information is provided with the command"),
}, },
"provide type and name with -f and other flags": { "provide type and name with -f and other flags": {
args: []string{"a.b.c", "name", "-f", "test.hcl", "-namespace", "default"}, args: []string{"a.b.c", "name", "-f", "test.hcl", "-namespace", "default"},
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("We ignored the -f flag if you provide gvk and resource name"), expectedErr: errors.New("Incorrect argument format: File argument is not needed when resource information is provided with the command"),
}, },
"does not provide resource name after type": { "does not provide resource name after type": {
args: []string{"a.b.c", "-namespace", "default"}, args: []string{"a.b.c", "-namespace", "default"},
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("Your argument format is incorrect: Must provide resource name right after type"), expectedErr: errors.New("Incorrect argument format: Must provide resource name right after type"),
}, },
"invalid resource type format": { "invalid resource type format": {
args: []string{"a.", "name", "-namespace", "default"}, args: []string{"a.", "name", "-namespace", "default"},
expectedCode: 1, expectedCode: 1,
expectedErr: errors.New("Your argument format is incorrect: Must include resource type argument in group.verion.kind format"), expectedErr: errors.New("Incorrect argument format: Must include resource type argument in group.verion.kind format"),
}, },
} }