Skip to content

Commit

Permalink
Error when Entity Names are Provided to List Commands (#2075)
Browse files Browse the repository at this point in the history
* Error when Entity Names are Provided to List Commands

- When entity names are pass to list commands display an appropriate error
- Share qualified name parsing error messages between commands
  • Loading branch information
dubee authored and Justin Berstler committed Jun 20, 2017
1 parent 6a87fbb commit dad7243
Show file tree
Hide file tree
Showing 12 changed files with 295 additions and 392 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ class WskBasicUsageTests
it should "reject creating entities with invalid names" in withAssetCleaner(wskprops) {
(wp, assetHelper) =>
val names = Seq(
("", NOT_ALLOWED),
("", ERROR_EXIT),
(" ", BAD_REQUEST),
("hi+there", BAD_REQUEST),
("$hola", BAD_REQUEST),
Expand Down Expand Up @@ -1194,6 +1194,7 @@ class WskBasicUsageTests
val apiDeleteReqMsg = "An API base path or API name is required. An optional API relative path and operation may also be provided."
val apiListReqMsg = "Optional parameters are: API base path (or API name), API relative path and operation."
val invalidShared = s"Cannot use value '$invalidArg' for shared"
val entityNameMsg = s"An entity name, '$invalidArg', was provided instead of a namespace. Valid namespaces are of the following format: /NAMESPACE."
val invalidArgs = Seq(
(Seq("api-experimental", "create"), s"${tooFewArgsMsg} ${apiCreateReqMsg}"),
(Seq("api-experimental", "create", "/basepath", "/path", "GET", "action", invalidArg), s"${tooManyArgsMsg}${invalidArg}. ${apiCreateReqMsg}"),
Expand Down Expand Up @@ -1241,10 +1242,12 @@ class WskBasicUsageTests
(Seq("package", "bind", "packageName", "bindingName", invalidArg), s"${tooManyArgsMsg}${invalidArg}."),
(Seq("package", "list", "namespace", invalidArg),
s"${tooManyArgsMsg}${invalidArg}. ${optNamespaceMsg}"),
(Seq("package", "list", invalidArg), entityNameMsg),
(Seq("package", "delete"), s"${tooFewArgsMsg} ${packageNameReqMsg}"),
(Seq("package", "delete", "namespace", invalidArg), s"${tooManyArgsMsg}${invalidArg}."),
(Seq("package", "refresh", "namespace", invalidArg),
s"${tooManyArgsMsg}${invalidArg}. ${optNamespaceMsg}"),
(Seq("package", "refresh", invalidArg), entityNameMsg),
(Seq("rule", "enable"), s"${tooFewArgsMsg} ${ruleNameReqMsg}"),
(Seq("rule", "enable", "ruleName", invalidArg), s"${tooManyArgsMsg}${invalidArg}."),
(Seq("rule", "disable"), s"${tooFewArgsMsg} ${ruleNameReqMsg}"),
Expand All @@ -1266,6 +1269,7 @@ class WskBasicUsageTests
(Seq("rule", "delete"), s"${tooFewArgsMsg} ${ruleNameReqMsg}"),
(Seq("rule", "delete", "ruleName", invalidArg), s"${tooManyArgsMsg}${invalidArg}."),
(Seq("rule", "list", "namespace", invalidArg), s"${tooManyArgsMsg}${invalidArg}. ${optNamespaceMsg}"),
(Seq("rule", "list", invalidArg), entityNameMsg),
(Seq("trigger", "fire"), s"${tooFewArgsMsg} ${triggerNameReqMsg} ${optPayloadMsg}"),
(Seq("trigger", "fire", "triggerName", "triggerPayload", invalidArg),
s"${tooManyArgsMsg}${invalidArg}. ${triggerNameReqMsg} ${optPayloadMsg}"),
Expand All @@ -1277,7 +1281,8 @@ class WskBasicUsageTests
(Seq("trigger", "get", "triggerName", "namespace", invalidArg), s"${tooManyArgsMsg}${invalidArg}."),
(Seq("trigger", "delete"), s"${tooFewArgsMsg} ${triggerNameReqMsg}"),
(Seq("trigger", "delete", "triggerName", invalidArg), s"${tooManyArgsMsg}${invalidArg}."),
(Seq("trigger", "list", "namespace", invalidArg), s"${tooManyArgsMsg}${invalidArg}. ${optNamespaceMsg}"))
(Seq("trigger", "list", "namespace", invalidArg), s"${tooManyArgsMsg}${invalidArg}. ${optNamespaceMsg}"),
(Seq("trigger", "list", invalidArg), entityNameMsg))

invalidArgs foreach {
case (cmd, err) =>
Expand Down
33 changes: 11 additions & 22 deletions tools/cli/go-whisk-cli/commands/action.go
Original file line number Diff line number Diff line change
Expand Up @@ -277,8 +277,8 @@ var actionDeleteCmd = &cobra.Command{
}

var actionListCmd = &cobra.Command{
Use: "list [NAMESPACE]",
Short: wski18n.T("list all actions"),
Use: "list [ NAMESPACE | PACKAGE_NAME ]",
Short: wski18n.T("list all actions in a namespace or actions contained in a package"),
SilenceUsage: true,
SilenceErrors: true,
PreRunE: setupClientConfig,
Expand All @@ -287,13 +287,7 @@ var actionListCmd = &cobra.Command{
var actions []whisk.Action
var err error

if len(args) == 1 {
if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
return parseQualifiedNameError(args[0], err)
}

client.Namespace = qualifiedName.namespace
} else if whiskErr := checkArgs(
if whiskErr := checkArgs(
args,
0,
1,
Expand All @@ -302,6 +296,14 @@ var actionListCmd = &cobra.Command{
return whiskErr
}

if len(args) == 1 {
if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
return parseQualifiedNameError(args[0], err)
}

client.Namespace = qualifiedName.namespace
}

options := &whisk.ActionListOptions{
Skip: flags.common.skip,
Limit: flags.common.limit,
Expand Down Expand Up @@ -615,19 +617,6 @@ func actionInsertError(action *whisk.Action, err error) (error) {
return nestedError(errMsg, err)
}

func parseQualifiedNameError(entityName string, err error) (error) {
whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", entityName, err)

errMsg := wski18n.T(
"'{{.name}}' is not a valid qualified name: {{.err}}",
map[string]interface{}{
"name": entityName,
"err": err,
})

return nestedError(errMsg, err)
}

func getJSONFromStringsParamError(params []string, keyValueFormat bool, err error) (error) {
whisk.Debug(whisk.DbgError, "getJSONFromStrings(%#v, %t) failed: %s\n", params, keyValueFormat, err)

Expand Down
31 changes: 11 additions & 20 deletions tools/cli/go-whisk-cli/commands/activation.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,35 +50,26 @@ var activationListCmd = &cobra.Command{
PreRunE: setupClientConfig,
RunE: func(cmd *cobra.Command, args []string) error {
var err error
qName := QualifiedName{}
var qualifiedName QualifiedName

if whiskErr := checkArgs(args, 0, 1, "Activation list",
wski18n.T("An optional namespace is the only valid argument.")); whiskErr != nil {
return whiskErr
}

// Specifying an activation item name filter is optional
if len(args) == 1 {
whisk.Debug(whisk.DbgInfo, "Activation item name filter '%s' provided\n", args[0])
qName, err = parseQualifiedName(args[0])
if err != nil {
whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
errStr := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
map[string]interface{}{"name": args[0], "err": err})
werr := whisk.MakeWskErrorFromWskError(errors.New(errStr), err, whisk.EXITCODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
return werr
}
ns := qName.namespace
if len(ns) == 0 {
whisk.Debug(whisk.DbgError, "Namespace '%s' is invalid\n", ns)
errStr := wski18n.T("Namespace '{{.name}}' is invalid", map[string]interface{}{"name": ns})
werr := whisk.MakeWskError(errors.New(errStr), whisk.EXITCODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
return werr

if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
return parseQualifiedNameError(args[0], err)
}

client.Namespace = ns
} else if whiskErr := checkArgs(args, 0, 1, "Activation list",
wski18n.T("An optional namespace is the only valid argument.")); whiskErr != nil {
return whiskErr
client.Namespace = qualifiedName.namespace
}

options := &whisk.ActivationListOptions{
Name: qName.entityName,
Name: qualifiedName.entityName,
Limit: flags.common.limit,
Skip: flags.common.skip,
Upto: flags.activation.upto,
Expand Down
22 changes: 8 additions & 14 deletions tools/cli/go-whisk-cli/commands/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -606,19 +606,13 @@ func parseApi(cmd *cobra.Command, args []string) (*whisk.Api, error) {
}

// Is the specified action name valid?
var qName QualifiedName
var qualifiedName QualifiedName
if (len(args) == 3) {
qName = QualifiedName{}
qName, err = parseQualifiedName(args[2])
if err != nil {
whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[2], err)
errMsg := wski18n.T("'{{.name}}' is not a valid action name: {{.err}}",
map[string]interface{}{"name": args[2], "err": err})
whiskErr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
return nil, whiskErr
if qualifiedName, err = parseQualifiedName(args[2]); err != nil {
return nil, parseQualifiedNameError(args[2], err)
}
if (qName.entityName == "") {

if (qualifiedName.entityName == "") {
whisk.Debug(whisk.DbgError, "Action name '%s' is invalid\n", args[2])
errMsg := wski18n.T("'{{.name}}' is not a valid action name.", map[string]interface{}{"name": args[2]})
whiskErr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
Expand All @@ -641,10 +635,10 @@ func parseApi(cmd *cobra.Command, args []string) (*whisk.Api, error) {

api.Namespace = client.Config.Namespace
api.Action = new(whisk.ApiAction)
api.Action.BackendUrl = "https://" + client.Config.Host + "/api/v1/namespaces/" + qName.namespace + "/actions/" + qName.entityName
api.Action.BackendUrl = "https://" + client.Config.Host + "/api/v1/namespaces/" + qualifiedName.namespace + "/actions/" + qualifiedName.entityName
api.Action.BackendMethod = "POST"
api.Action.Name = qName.entityName
api.Action.Namespace = qName.namespace
api.Action.Name = qualifiedName.entityName
api.Action.Namespace = qualifiedName.namespace
api.Action.Auth = client.Config.AuthToken
api.ApiName = apiname
api.GatewayBasePath = basepath
Expand Down
27 changes: 8 additions & 19 deletions tools/cli/go-whisk-cli/commands/namespace.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ var namespaceGetCmd = &cobra.Command{
SilenceErrors: true,
PreRunE: setupClientConfig,
RunE: func(cmd *cobra.Command, args []string) error {
var qName QualifiedName
var qualifiedName QualifiedName
var err error

if whiskErr := checkArgs(args, 0, 1, "Namespace get",
Expand All @@ -76,18 +76,16 @@ var namespaceGetCmd = &cobra.Command{

// Namespace argument is optional; defaults to configured property namespace
if len(args) == 1 {
qName, err = parseQualifiedName(args[0])
if err != nil {
whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
map[string]interface{}{"name": args[0], "err": err})
werr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
return werr
if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
return parseQualifiedNameError(args[0], err)
}

if len(qualifiedName.entityName) > 0 {
return entityNameError(qualifiedName.entityName)
}
}

namespace, _, err := client.Namespaces.Get(qName.namespace)
namespace, _, err := client.Namespaces.Get(qualifiedName.namespace)

if err != nil {
whisk.Debug(whisk.DbgError, "client.Namespaces.Get(%s) error: %s\n", getClientNamespace(), err)
Expand All @@ -109,15 +107,6 @@ var namespaceGetCmd = &cobra.Command{
},
}

var listCmd = &cobra.Command{
Use: "list",
Short: wski18n.T("list entities in the current namespace"),
SilenceUsage: true,
SilenceErrors: true,
PreRunE: setupClientConfig,
RunE: namespaceGetCmd.RunE,
}

func init() {
namespaceCmd.AddCommand(
namespaceListCmd,
Expand Down
Loading

0 comments on commit dad7243

Please sign in to comment.