Skip to content
Open
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
37 changes: 33 additions & 4 deletions commands/action.go
Original file line number Diff line number Diff line change
Expand Up @@ -401,8 +401,10 @@ func parseAction(cmd *cobra.Command, args []string, update bool) (*whisk.Action,
var existingAction *whisk.Action
var paramArgs []string
var annotArgs []string
var envArgs []string
var parameters interface{}
var annotations interface{}
var environment interface{}

var qualifiedName = new(QualifiedName)

Expand All @@ -426,6 +428,7 @@ func parseAction(cmd *cobra.Command, args []string, update bool) (*whisk.Action,

paramArgs = Flags.common.param
annotArgs = Flags.common.annotation
envArgs = Flags.common.env

if len(paramArgs) > 0 {
if parameters, err = getJSONFromStrings(paramArgs, true); err != nil {
Expand All @@ -443,6 +446,14 @@ func parseAction(cmd *cobra.Command, args []string, update bool) (*whisk.Action,
action.Annotations = annotations.(whisk.KeyValueArr)
}

if len(envArgs) > 0 {
if environment, err = getJSONFromStrings(envArgs, true); err != nil {
return nil, getJSONFromStringsEnvError(envArgs, true, err)
}

action.Env = environment.(whisk.KeyValueArr)
}

if len(Flags.action.kind) > 0 && len(Flags.action.docker) > 0 {
errStr := wski18n.T("Cannot specify both --kind and --docker at the same time.")
return nil, whisk.MakeWskError(errors.New(errStr), whisk.NOT_ALLOWED, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
Expand All @@ -465,6 +476,7 @@ func parseAction(cmd *cobra.Command, args []string, update bool) (*whisk.Action,
action.Exec = existingAction.Exec
action.Parameters = append(action.Parameters, existingAction.Parameters...)
action.Annotations = append(action.Annotations, existingAction.Annotations...)
action.Env = append(action.Env, existingAction.Env...)
} else if Flags.action.sequence {
if len(args) == 2 {
action.Exec = new(whisk.Exec)
Expand Down Expand Up @@ -895,11 +907,11 @@ func updateWebSecureAnnotation(websecure string, annotations whisk.KeyValueArr)
return annotations
}

//
// Generate a secret according to the --web-secure setting
// true: return a random int64
// false: return false, meaning no secret was returned
// string: return the same string
//
// true: return a random int64
// false: return false, meaning no secret was returned
// string: return the same string
func webSecureSecret(webSecureMode string) interface{} {
switch strings.ToLower(webSecureMode) {
case "true":
Expand Down Expand Up @@ -1005,6 +1017,19 @@ func getJSONFromStringsAnnotError(annots []string, keyValueFormat bool, err erro
return nestedError(errMsg, err)
}

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

errMsg := wski18n.T(
"Invalid annotation argument '{{.annotation}}': {{.err}}",
map[string]interface{}{
"env": fmt.Sprintf("%#v", envs),
"err": err,
})

return nestedError(errMsg, err)
}

func invalidFieldFilterError(field string) error {
errMsg := wski18n.T(
"Invalid field filter '{{.arg}}'.",
Expand Down Expand Up @@ -1304,6 +1329,8 @@ func init() {
actionCreateCmd.Flags().StringVarP(&Flags.common.paramFile, "param-file", "P", "", wski18n.T("`FILE` containing parameter values in JSON format"))
actionCreateCmd.Flags().StringVar(&Flags.action.web, WEB_FLAG, "", wski18n.T("treat ACTION as a web action, a raw HTTP web action, or as a standard action; yes | true = web action, raw = raw HTTP web action, no | false = standard action"))
actionCreateCmd.Flags().StringVar(&Flags.action.websecure, WEB_SECURE_FLAG, "", wski18n.T("secure the web action. where `SECRET` is true, false, or any string. Only valid when the ACTION is a web action"))
actionCreateCmd.Flags().StringSliceVarP(&Flags.common.env, "env", "e", nil, wski18n.T("environment variables in `KEY VALUE` format"))
actionCreateCmd.Flags().StringVarP(&Flags.common.envFile, "env-file", "E", "", wski18n.T("`FILE` containing environment variables in JSON format"))

actionUpdateCmd.Flags().BoolVar(&Flags.action.native, "native", false, wski18n.T("treat ACTION as native action (zip file provides a compatible executable to run)"))
actionUpdateCmd.Flags().StringVar(&Flags.action.docker, "docker", "", wski18n.T("use provided docker image (a path on DockerHub) to run the action"))
Expand All @@ -1322,6 +1349,8 @@ func init() {
actionUpdateCmd.Flags().StringVar(&Flags.action.web, WEB_FLAG, "", wski18n.T("treat ACTION as a web action, a raw HTTP web action, or as a standard action; yes | true = web action, raw = raw HTTP web action, no | false = standard action"))
actionUpdateCmd.Flags().StringVar(&Flags.action.websecure, WEB_SECURE_FLAG, "", wski18n.T("secure the web action. where `SECRET` is true, false, or any string. Only valid when the ACTION is a web action"))
actionUpdateCmd.Flags().StringArrayVar(&Flags.action.delAnnotation, "del-annotation", []string{}, wski18n.T("the list of annotations to be deleted from the action, e.g. --del-annotation key1 --del-annotation key2"))
actionUpdateCmd.Flags().StringSliceVarP(&Flags.common.env, "env", "e", nil, wski18n.T("environment variables in `KEY VALUE` format"))
actionUpdateCmd.Flags().StringVarP(&Flags.common.envFile, "env-file", "E", "", wski18n.T("`FILE` containing environment variables in JSON format"))

actionInvokeCmd.Flags().StringSliceVarP(&Flags.common.param, "param", "p", []string{}, wski18n.T("parameter values in `KEY VALUE` format"))
actionInvokeCmd.Flags().StringVarP(&Flags.common.paramFile, "param-file", "P", "", wski18n.T("`FILE` containing parameter values in JSON format"))
Expand Down
51 changes: 40 additions & 11 deletions commands/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,10 @@ func getValueFromArgs(args []string, argIndex int, parsedArgs []string) ([]strin
return parsedArgs, args, whiskErr
}

func parseArgs(args []string) ([]string, []string, []string, []string, []string, error) {
func parseArgs(args []string) ([]string, []string, []string, []string, []string, []string, error) {
var paramArgs []string
var annotArgs []string
var envArgs []string
var feedParamArgs []string
var triggerParamArgs []string
var whiskErr error
Expand All @@ -149,14 +150,14 @@ func parseArgs(args []string) ([]string, []string, []string, []string, []string,
map[string]interface{}{"err": whiskErr})
whiskErr = whisk.MakeWskError(errors.New(errMsg), whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG,
whisk.DISPLAY_USAGE)
return nil, nil, nil, nil, nil, whiskErr
return nil, nil, nil, nil, nil, nil, whiskErr
}

filename := paramArgs[len(paramArgs)-1]
paramArgs[len(paramArgs)-1], whiskErr = ReadFile(filename)
if whiskErr != nil {
whisk.Debug(whisk.DbgError, "readFile(%s) error: %s\n", filename, whiskErr)
return nil, nil, nil, nil, nil, whiskErr
return nil, nil, nil, nil, nil, nil, whiskErr
}
} else if args[i] == "-A" || args[i] == "--annotation-file" {
annotArgs, args, whiskErr = getValueFromArgs(args, i, annotArgs)
Expand All @@ -166,14 +167,14 @@ func parseArgs(args []string) ([]string, []string, []string, []string, []string,
map[string]interface{}{"err": whiskErr})
whiskErr = whisk.MakeWskError(errors.New(errMsg), whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG,
whisk.DISPLAY_USAGE)
return nil, nil, nil, nil, nil, whiskErr
return nil, nil, nil, nil, nil, nil, whiskErr
}

filename := annotArgs[len(annotArgs)-1]
annotArgs[len(annotArgs)-1], whiskErr = ReadFile(filename)
if whiskErr != nil {
whisk.Debug(whisk.DbgError, "readFile(%s) error: %s\n", filename, whiskErr)
return nil, nil, nil, nil, nil, whiskErr
return nil, nil, nil, nil, nil, nil, whiskErr
}
} else if args[i] == "-p" || args[i] == "--param" {
paramArgs, args, whiskErr = getKeyValueArgs(args, i, paramArgs)
Expand All @@ -183,7 +184,7 @@ func parseArgs(args []string) ([]string, []string, []string, []string, []string,
map[string]interface{}{"err": whiskErr})
whiskErr = whisk.MakeWskError(errors.New(errMsg), whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG,
whisk.DISPLAY_USAGE)
return nil, nil, nil, nil, nil, whiskErr
return nil, nil, nil, nil, nil, nil, whiskErr
}
} else if args[i] == "-a" || args[i] == "--annotation" {
annotArgs, args, whiskErr = getKeyValueArgs(args, i, annotArgs)
Expand All @@ -193,23 +194,50 @@ func parseArgs(args []string) ([]string, []string, []string, []string, []string,
map[string]interface{}{"err": whiskErr})
whiskErr = whisk.MakeWskError(errors.New(errMsg), whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG,
whisk.DISPLAY_USAGE)
return nil, nil, nil, nil, nil, whiskErr
return nil, nil, nil, nil, nil, nil, whiskErr
}
} else if args[i] == "-F" || args[i] == "--feed-param" {
feedParamArgs, args, whiskErr = getKeyValueArgs(args, i, feedParamArgs)
if whiskErr != nil {
whisk.Debug(whisk.DbgError, "getKeyValueArgs(%#v, %d) failed: %s\n", args, i, whiskErr)
whiskErr = whisk.MakeWskError(whiskErr, whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG,
whisk.DISPLAY_USAGE)
return nil, nil, nil, nil, nil, whiskErr
return nil, nil, nil, nil, nil, nil, whiskErr
}
} else if args[i] == "-T" || args[i] == "--trigger-param" {
triggerParamArgs, args, whiskErr = getKeyValueArgs(args, i, triggerParamArgs)
if whiskErr != nil {
whisk.Debug(whisk.DbgError, "getKeyValueArgs(%#v, %d) failed: %s\n", args, i, whiskErr)
whiskErr = whisk.MakeWskError(whiskErr, whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG,
whisk.DISPLAY_USAGE)
return nil, nil, nil, nil, nil, whiskErr
return nil, nil, nil, nil, nil, nil, whiskErr
}
} else if args[i] == "-E" || args[i] == "--env-file" {
envArgs, args, whiskErr = getValueFromArgs(args, i, envArgs)
if whiskErr != nil {
whisk.Debug(whisk.DbgError, "getValueFromArgs(%#v, %d) failed: %s\n", args, i, whiskErr)
errMsg := wski18n.T("The environment variable arguments are invalid: {{.err}}",
map[string]interface{}{"err": whiskErr})
whiskErr = whisk.MakeWskError(errors.New(errMsg), whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG,
whisk.DISPLAY_USAGE)
return nil, nil, nil, nil, nil, nil, whiskErr
}

filename := envArgs[len(envArgs)-1]
envArgs[len(envArgs)-1], whiskErr = ReadFile(filename)
if whiskErr != nil {
whisk.Debug(whisk.DbgError, "readFile(%s) error: %s\n", filename, whiskErr)
return nil, nil, nil, nil, nil, nil, whiskErr
}
} else if args[i] == "-e" || args[i] == "--env" {
envArgs, args, whiskErr = getKeyValueArgs(args, i, envArgs)
if whiskErr != nil {
whisk.Debug(whisk.DbgError, "getKeyValueArgs(%#v, %d) failed: %s\n", args, i, whiskErr)
errMsg := wski18n.T("The environment variable arguments are invalid: {{.err}}",
map[string]interface{}{"err": whiskErr})
whiskErr = whisk.MakeWskError(errors.New(errMsg), whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG,
whisk.DISPLAY_USAGE)
return nil, nil, nil, nil, nil, nil, whiskErr
}
} else {
i++
Expand All @@ -221,15 +249,16 @@ func parseArgs(args []string) ([]string, []string, []string, []string, []string,
whisk.Debug(whisk.DbgInfo, "Found feed param args '%s'.\n", feedParamArgs)
whisk.Debug(whisk.DbgInfo, "Found trigger param args '%s'.\n", triggerParamArgs)
whisk.Debug(whisk.DbgInfo, "Arguments with param args removed '%s'.\n", args)
whisk.Debug(whisk.DbgInfo, "Found env args '%s'.\n", envArgs)

return args, paramArgs, annotArgs, feedParamArgs, triggerParamArgs, nil
return args, paramArgs, annotArgs, feedParamArgs, triggerParamArgs, envArgs, nil
}

func Execute() error {
var err error

whisk.Debug(whisk.DbgInfo, "wsk args: %#v\n", os.Args)
os.Args, Flags.common.param, Flags.common.annotation, Flags.trigger.feedParam, Flags.trigger.triggerParam, err = parseArgs(os.Args)
os.Args, Flags.common.param, Flags.common.annotation, Flags.trigger.feedParam, Flags.trigger.triggerParam, Flags.common.env, err = parseArgs(os.Args)

if err != nil {
whisk.Debug(whisk.DbgError, "parseParams(%s) failed: %s\n", os.Args, err)
Expand Down
2 changes: 2 additions & 0 deletions commands/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ type FlagsStruct struct {
format string
nameSort bool // sorts list alphabetically by entity name
overwrite bool
env []string
envFile string
}

property struct {
Expand Down
9 changes: 1 addition & 8 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,18 @@ module github.com/apache/openwhisk-cli
go 1.15

require (
github.com/apache/openwhisk-client-go v0.0.0-20220811044404-a6921af2f086
github.com/apache/openwhisk-client-go v0.0.0-20230421081559-13fc65f65684
github.com/apache/openwhisk-wskdeploy v0.0.0-20220815044620-520cbbbffb6e
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 // indirect
github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21
github.com/fatih/color v1.10.0
github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32
github.com/google/go-querystring v1.1.0 // indirect
github.com/jteeuwen/go-bindata v3.0.7+incompatible // indirect
github.com/mattn/go-colorable v0.1.8
github.com/mitchellh/go-homedir v1.1.0
github.com/nicksnyder/go-i18n v1.10.1
github.com/onsi/ginkgo v1.15.0
github.com/onsi/gomega v1.10.5
github.com/pelletier/go-buffruneio v0.1.0 // indirect
github.com/spf13/cobra v1.1.3
github.com/spf13/pflag v1.0.5 // indirect
github.com/stretchr/testify v1.6.1
github.com/ugorji/go v1.1.4 // indirect
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 // indirect
golang.org/x/sys v0.0.0-20210324051608-47abb6519492 // indirect
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
)
Loading