Skip to content

Commit 0598584

Browse files
committed
add --env flag to pass env vars
1 parent b1ca4bc commit 0598584

File tree

8 files changed

+192
-128
lines changed

8 files changed

+192
-128
lines changed

commands/action.go

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -401,8 +401,10 @@ func parseAction(cmd *cobra.Command, args []string, update bool) (*whisk.Action,
401401
var existingAction *whisk.Action
402402
var paramArgs []string
403403
var annotArgs []string
404+
var envArgs []string
404405
var parameters interface{}
405406
var annotations interface{}
407+
var environment interface{}
406408

407409
var qualifiedName = new(QualifiedName)
408410

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

427429
paramArgs = Flags.common.param
428430
annotArgs = Flags.common.annotation
431+
envArgs = Flags.common.env
429432

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

449+
if len(envArgs) > 0 {
450+
if environment, err = getJSONFromStrings(envArgs, true); err != nil {
451+
return nil, getJSONFromStringsEnvError(envArgs, true, err)
452+
}
453+
454+
action.Env = environment.(whisk.KeyValueArr)
455+
}
456+
446457
if len(Flags.action.kind) > 0 && len(Flags.action.docker) > 0 {
447458
errStr := wski18n.T("Cannot specify both --kind and --docker at the same time.")
448459
return nil, whisk.MakeWskError(errors.New(errStr), whisk.NOT_ALLOWED, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
@@ -465,6 +476,7 @@ func parseAction(cmd *cobra.Command, args []string, update bool) (*whisk.Action,
465476
action.Exec = existingAction.Exec
466477
action.Parameters = append(action.Parameters, existingAction.Parameters...)
467478
action.Annotations = append(action.Annotations, existingAction.Annotations...)
479+
action.Env = append(action.Env, existingAction.Env...)
468480
} else if Flags.action.sequence {
469481
if len(args) == 2 {
470482
action.Exec = new(whisk.Exec)
@@ -895,11 +907,11 @@ func updateWebSecureAnnotation(websecure string, annotations whisk.KeyValueArr)
895907
return annotations
896908
}
897909

898-
//
899910
// Generate a secret according to the --web-secure setting
900-
// true: return a random int64
901-
// false: return false, meaning no secret was returned
902-
// string: return the same string
911+
//
912+
// true: return a random int64
913+
// false: return false, meaning no secret was returned
914+
// string: return the same string
903915
func webSecureSecret(webSecureMode string) interface{} {
904916
switch strings.ToLower(webSecureMode) {
905917
case "true":
@@ -1005,6 +1017,19 @@ func getJSONFromStringsAnnotError(annots []string, keyValueFormat bool, err erro
10051017
return nestedError(errMsg, err)
10061018
}
10071019

1020+
func getJSONFromStringsEnvError(envs []string, keyValueFormat bool, err error) error {
1021+
whisk.Debug(whisk.DbgError, "getJSONFromStrings(%#v, %t) failed: %s\n", envs, keyValueFormat, err)
1022+
1023+
errMsg := wski18n.T(
1024+
"Invalid annotation argument '{{.annotation}}': {{.err}}",
1025+
map[string]interface{}{
1026+
"env": fmt.Sprintf("%#v", envs),
1027+
"err": err,
1028+
})
1029+
1030+
return nestedError(errMsg, err)
1031+
}
1032+
10081033
func invalidFieldFilterError(field string) error {
10091034
errMsg := wski18n.T(
10101035
"Invalid field filter '{{.arg}}'.",
@@ -1304,6 +1329,8 @@ func init() {
13041329
actionCreateCmd.Flags().StringVarP(&Flags.common.paramFile, "param-file", "P", "", wski18n.T("`FILE` containing parameter values in JSON format"))
13051330
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"))
13061331
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"))
1332+
actionCreateCmd.Flags().StringSliceVarP(&Flags.common.env, "env", "e", nil, wski18n.T("environment variables in `KEY VALUE` format"))
1333+
actionCreateCmd.Flags().StringVarP(&Flags.common.envFile, "env-file", "E", "", wski18n.T("`FILE` containing environment variables in JSON format"))
13071334

13081335
actionUpdateCmd.Flags().BoolVar(&Flags.action.native, "native", false, wski18n.T("treat ACTION as native action (zip file provides a compatible executable to run)"))
13091336
actionUpdateCmd.Flags().StringVar(&Flags.action.docker, "docker", "", wski18n.T("use provided docker image (a path on DockerHub) to run the action"))
@@ -1322,6 +1349,8 @@ func init() {
13221349
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"))
13231350
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"))
13241351
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"))
1352+
actionUpdateCmd.Flags().StringSliceVarP(&Flags.common.env, "env", "e", nil, wski18n.T("environment variables in `KEY VALUE` format"))
1353+
actionUpdateCmd.Flags().StringVarP(&Flags.common.envFile, "env-file", "E", "", wski18n.T("`FILE` containing environment variables in JSON format"))
13251354

13261355
actionInvokeCmd.Flags().StringSliceVarP(&Flags.common.param, "param", "p", []string{}, wski18n.T("parameter values in `KEY VALUE` format"))
13271356
actionInvokeCmd.Flags().StringVarP(&Flags.common.paramFile, "param-file", "P", "", wski18n.T("`FILE` containing parameter values in JSON format"))

commands/commands.go

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,10 @@ func getValueFromArgs(args []string, argIndex int, parsedArgs []string) ([]strin
131131
return parsedArgs, args, whiskErr
132132
}
133133

134-
func parseArgs(args []string) ([]string, []string, []string, []string, []string, error) {
134+
func parseArgs(args []string) ([]string, []string, []string, []string, []string, []string, error) {
135135
var paramArgs []string
136136
var annotArgs []string
137+
var envArgs []string
137138
var feedParamArgs []string
138139
var triggerParamArgs []string
139140
var whiskErr error
@@ -149,14 +150,14 @@ func parseArgs(args []string) ([]string, []string, []string, []string, []string,
149150
map[string]interface{}{"err": whiskErr})
150151
whiskErr = whisk.MakeWskError(errors.New(errMsg), whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG,
151152
whisk.DISPLAY_USAGE)
152-
return nil, nil, nil, nil, nil, whiskErr
153+
return nil, nil, nil, nil, nil, nil, whiskErr
153154
}
154155

155156
filename := paramArgs[len(paramArgs)-1]
156157
paramArgs[len(paramArgs)-1], whiskErr = ReadFile(filename)
157158
if whiskErr != nil {
158159
whisk.Debug(whisk.DbgError, "readFile(%s) error: %s\n", filename, whiskErr)
159-
return nil, nil, nil, nil, nil, whiskErr
160+
return nil, nil, nil, nil, nil, nil, whiskErr
160161
}
161162
} else if args[i] == "-A" || args[i] == "--annotation-file" {
162163
annotArgs, args, whiskErr = getValueFromArgs(args, i, annotArgs)
@@ -166,14 +167,14 @@ func parseArgs(args []string) ([]string, []string, []string, []string, []string,
166167
map[string]interface{}{"err": whiskErr})
167168
whiskErr = whisk.MakeWskError(errors.New(errMsg), whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG,
168169
whisk.DISPLAY_USAGE)
169-
return nil, nil, nil, nil, nil, whiskErr
170+
return nil, nil, nil, nil, nil, nil, whiskErr
170171
}
171172

172173
filename := annotArgs[len(annotArgs)-1]
173174
annotArgs[len(annotArgs)-1], whiskErr = ReadFile(filename)
174175
if whiskErr != nil {
175176
whisk.Debug(whisk.DbgError, "readFile(%s) error: %s\n", filename, whiskErr)
176-
return nil, nil, nil, nil, nil, whiskErr
177+
return nil, nil, nil, nil, nil, nil, whiskErr
177178
}
178179
} else if args[i] == "-p" || args[i] == "--param" {
179180
paramArgs, args, whiskErr = getKeyValueArgs(args, i, paramArgs)
@@ -183,7 +184,7 @@ func parseArgs(args []string) ([]string, []string, []string, []string, []string,
183184
map[string]interface{}{"err": whiskErr})
184185
whiskErr = whisk.MakeWskError(errors.New(errMsg), whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG,
185186
whisk.DISPLAY_USAGE)
186-
return nil, nil, nil, nil, nil, whiskErr
187+
return nil, nil, nil, nil, nil, nil, whiskErr
187188
}
188189
} else if args[i] == "-a" || args[i] == "--annotation" {
189190
annotArgs, args, whiskErr = getKeyValueArgs(args, i, annotArgs)
@@ -193,23 +194,50 @@ func parseArgs(args []string) ([]string, []string, []string, []string, []string,
193194
map[string]interface{}{"err": whiskErr})
194195
whiskErr = whisk.MakeWskError(errors.New(errMsg), whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG,
195196
whisk.DISPLAY_USAGE)
196-
return nil, nil, nil, nil, nil, whiskErr
197+
return nil, nil, nil, nil, nil, nil, whiskErr
197198
}
198199
} else if args[i] == "-F" || args[i] == "--feed-param" {
199200
feedParamArgs, args, whiskErr = getKeyValueArgs(args, i, feedParamArgs)
200201
if whiskErr != nil {
201202
whisk.Debug(whisk.DbgError, "getKeyValueArgs(%#v, %d) failed: %s\n", args, i, whiskErr)
202203
whiskErr = whisk.MakeWskError(whiskErr, whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG,
203204
whisk.DISPLAY_USAGE)
204-
return nil, nil, nil, nil, nil, whiskErr
205+
return nil, nil, nil, nil, nil, nil, whiskErr
205206
}
206207
} else if args[i] == "-T" || args[i] == "--trigger-param" {
207208
triggerParamArgs, args, whiskErr = getKeyValueArgs(args, i, triggerParamArgs)
208209
if whiskErr != nil {
209210
whisk.Debug(whisk.DbgError, "getKeyValueArgs(%#v, %d) failed: %s\n", args, i, whiskErr)
210211
whiskErr = whisk.MakeWskError(whiskErr, whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG,
211212
whisk.DISPLAY_USAGE)
212-
return nil, nil, nil, nil, nil, whiskErr
213+
return nil, nil, nil, nil, nil, nil, whiskErr
214+
}
215+
} else if args[i] == "-E" || args[i] == "--env-file" {
216+
envArgs, args, whiskErr = getValueFromArgs(args, i, envArgs)
217+
if whiskErr != nil {
218+
whisk.Debug(whisk.DbgError, "getValueFromArgs(%#v, %d) failed: %s\n", args, i, whiskErr)
219+
errMsg := wski18n.T("The environment variable arguments are invalid: {{.err}}",
220+
map[string]interface{}{"err": whiskErr})
221+
whiskErr = whisk.MakeWskError(errors.New(errMsg), whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG,
222+
whisk.DISPLAY_USAGE)
223+
return nil, nil, nil, nil, nil, nil, whiskErr
224+
}
225+
226+
filename := envArgs[len(envArgs)-1]
227+
envArgs[len(envArgs)-1], whiskErr = ReadFile(filename)
228+
if whiskErr != nil {
229+
whisk.Debug(whisk.DbgError, "readFile(%s) error: %s\n", filename, whiskErr)
230+
return nil, nil, nil, nil, nil, nil, whiskErr
231+
}
232+
} else if args[i] == "-e" || args[i] == "--env" {
233+
envArgs, args, whiskErr = getKeyValueArgs(args, i, envArgs)
234+
if whiskErr != nil {
235+
whisk.Debug(whisk.DbgError, "getKeyValueArgs(%#v, %d) failed: %s\n", args, i, whiskErr)
236+
errMsg := wski18n.T("The environment variable arguments are invalid: {{.err}}",
237+
map[string]interface{}{"err": whiskErr})
238+
whiskErr = whisk.MakeWskError(errors.New(errMsg), whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG,
239+
whisk.DISPLAY_USAGE)
240+
return nil, nil, nil, nil, nil, nil, whiskErr
213241
}
214242
} else {
215243
i++
@@ -221,15 +249,16 @@ func parseArgs(args []string) ([]string, []string, []string, []string, []string,
221249
whisk.Debug(whisk.DbgInfo, "Found feed param args '%s'.\n", feedParamArgs)
222250
whisk.Debug(whisk.DbgInfo, "Found trigger param args '%s'.\n", triggerParamArgs)
223251
whisk.Debug(whisk.DbgInfo, "Arguments with param args removed '%s'.\n", args)
252+
whisk.Debug(whisk.DbgInfo, "Found env args '%s'.\n", envArgs)
224253

225-
return args, paramArgs, annotArgs, feedParamArgs, triggerParamArgs, nil
254+
return args, paramArgs, annotArgs, feedParamArgs, triggerParamArgs, envArgs, nil
226255
}
227256

228257
func Execute() error {
229258
var err error
230259

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

234263
if err != nil {
235264
whisk.Debug(whisk.DbgError, "parseParams(%s) failed: %s\n", os.Args, err)

commands/flags.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ type FlagsStruct struct {
6868
format string
6969
nameSort bool // sorts list alphabetically by entity name
7070
overwrite bool
71+
env []string
72+
envFile string
7173
}
7274

7375
property struct {

go.mod

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,18 @@ module github.com/apache/openwhisk-cli
33
go 1.15
44

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

0 commit comments

Comments
 (0)