Skip to content

Add env and env-file flags for action create/update #523

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

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
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