This is an automated email from the ASF dual-hosted git repository. mrutkowski pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk-wskdeploy.git
The following commit(s) were added to refs/heads/master by this push: new 76ca1e0 adding support for using env. variables in inputs JSON (#766) 76ca1e0 is described below commit 76ca1e07f3f871f803d9b723e12c1c7255aa6c56 Author: Priti Desai <pde...@us.ibm.com> AuthorDate: Wed Mar 7 09:58:50 2018 -0800 adding support for using env. variables in inputs JSON (#766) * adding support for using env. variables in inputs JSON * fixing unit test failure * Update manifest_parser_test.go adding unset env. variable --- parsers/manifest_parser_test.go | 34 +++++++++++++++++++++-- parsers/parameters.go | 5 +++- tests/dat/manifest_validate_json_params.yaml | 6 ++++ tests/dat/manifest_validate_multiline_params.yaml | 9 ++++++ wskenv/environment.go | 10 +++++-- 5 files changed, 59 insertions(+), 5 deletions(-) diff --git a/parsers/manifest_parser_test.go b/parsers/manifest_parser_test.go index c66e5bb..3bc0a5e 100644 --- a/parsers/manifest_parser_test.go +++ b/parsers/manifest_parser_test.go @@ -304,7 +304,7 @@ func TestParseManifestForMultiLineParams(t *testing.T) { assert.Equal(t, expectedResult, actualResult, TEST_MSG_ACTION_FUNCTION_RUNTIME_MISMATCH) // test # input params - expectedResult = strconv.FormatInt(10, 10) + expectedResult = strconv.FormatInt(13, 10) actualResult = strconv.FormatInt(int64(len(action.Inputs)), 10) assert.Equal(t, expectedResult, actualResult, TEST_MSG_PARAMETER_NUMBER_MISMATCH) @@ -756,6 +756,10 @@ func TestComposeActionsForSingleLineParams(t *testing.T) { // Test 12: validate manifest_parser.ComposeActions() method for multi line parameters // manifest_parser should be able to parse input section with different types of values func TestComposeActionsForMultiLineParams(t *testing.T) { + os.Setenv("USERNAME", "MY_USERNAME") + os.Setenv("PASSWORD", "MY_PASSWORD") + defer os.Unsetenv("USERNAME") + defer os.Unsetenv("PASSWORD") p, m, _ := testLoadParseManifest(t, "../tests/dat/manifest_validate_multiline_params.yaml") @@ -826,6 +830,24 @@ func TestComposeActionsForMultiLineParams(t *testing.T) { expectedResult = strconv.FormatFloat(2.9, 'f', -1, 64) actualResult = strconv.FormatFloat(action.Action.Parameters.GetValue(paramName).(float64), 'f', -1, 64) assert.Equal(t, expectedResult, actualResult, fmt.Sprintf(TEST_MSG_ACTION_PARAMETER_VALUE_MISMATCH, paramName)) + + // param_json_type_and_value_only_1 should be { "name": "Sam", "place": "Shire" } + paramName = "param_json_type_and_value_only_1" + expectedResult1 := map[string]interface{}{"name": "Sam", "place": "Shire"} + actualResult1 := action.Action.Parameters.GetValue(paramName) + assert.Equal(t, expectedResult1, actualResult1, fmt.Sprintf(TEST_MSG_ACTION_PARAMETER_VALUE_MISMATCH, paramName)) + + // param_json_type_and_value_only_2 should be { "name": "MY_USERNAME", "password": "MY_PASSWORD" } + paramName = "param_json_type_and_value_only_2" + expectedResult2 := map[string]interface{}{"name": "MY_USERNAME", "password": "MY_PASSWORD"} + actualResult2 := action.Action.Parameters.GetValue(paramName) + assert.Equal(t, expectedResult2, actualResult2, fmt.Sprintf(TEST_MSG_ACTION_PARAMETER_VALUE_MISMATCH, paramName)) + + // param_json_type_and_value_only_3 should be { "name": "${USERNAME}", "password": "${PASSWORD}" } + paramName = "param_json_type_and_value_only_3" + expectedResult3 := map[string]interface{}{"name": "${USERNAME}", "password": "${PASSWORD}"} + actualResult3 := action.Action.Parameters.GetValue(paramName) + assert.Equal(t, expectedResult3, actualResult3, fmt.Sprintf(TEST_MSG_ACTION_PARAMETER_VALUE_MISMATCH, paramName)) } } @@ -1032,7 +1054,7 @@ func TestParseManifestForJSONParams(t *testing.T) { assert.Equal(t, expectedResult, actualResult, TEST_MSG_ACTION_FUNCTION_RUNTIME_MISMATCH) // validate the number of inputs to this action - expectedResult = strconv.FormatInt(6, 10) + expectedResult = strconv.FormatInt(8, 10) actualResult = strconv.FormatInt(int64(len(action.Inputs)), 10) assert.Equal(t, expectedResult, actualResult, TEST_MSG_PARAMETER_NUMBER_MISMATCH) @@ -1065,6 +1087,14 @@ func TestParseManifestForJSONParams(t *testing.T) { actualResult6 := param.Value.(map[interface{}]interface{}) expectedResult6 := map[interface{}]interface{}{"name": "Frodo", "place": "Undying Lands", "items": []interface{}{"Sting", "Mithril mail"}} assert.Equal(t, expectedResult6, actualResult6, fmt.Sprintf(TEST_MSG_ACTION_PARAMETER_VALUE_MISMATCH, input)) + case "member7": + actualResult7 := param.Value.(map[interface{}]interface{}) + expectedResult7 := map[interface{}]interface{}{"name": "${USERNAME}", "password": "${PASSWORD}"} + assert.Equal(t, expectedResult7, actualResult7, fmt.Sprintf(TEST_MSG_ACTION_PARAMETER_VALUE_MISMATCH, input)) + case "member8": + actualResult8 := param.Value.(map[interface{}]interface{}) + expectedResult8 := map[interface{}]interface{}{"name": "$${USERNAME}", "password": "$${PASSWORD}"} + assert.Equal(t, expectedResult8, actualResult8, fmt.Sprintf(TEST_MSG_ACTION_PARAMETER_VALUE_MISMATCH, input)) } } diff --git a/parsers/parameters.go b/parsers/parameters.go index 3bbb11b..4c03588 100644 --- a/parsers/parameters.go +++ b/parsers/parameters.go @@ -258,6 +258,9 @@ func resolveJSONParameter(filePath string, paramName string, param *Parameter, v if param.Value != nil && reflect.TypeOf(param.Value).Kind() == reflect.Map { if _, ok := param.Value.(map[interface{}]interface{}); ok { var temp map[string]interface{} = utils.ConvertInterfaceMap(param.Value.(map[interface{}]interface{})) + for name, val := range temp { + temp[name] = wskenv.InterpolateStringWithEnvVar(val) + } //fmt.Printf("EXIT: Parameter [%s] type=[%v] value=[%v]\n", paramName, param.Type, temp) return temp, errorParser } @@ -322,7 +325,7 @@ func ResolveParameter(paramName string, param *Parameter, filePath string) (inte } // JSON - Handle both cases, where value 1) is a string containing JSON, 2) is a map of JSON - if param.Type == "json" { + if param.Value != nil && param.Type == "json" { value, errorParser = resolveJSONParameter(filePath, paramName, param, value) } diff --git a/tests/dat/manifest_validate_json_params.yaml b/tests/dat/manifest_validate_json_params.yaml index fb77176..57030d0 100644 --- a/tests/dat/manifest_validate_json_params.yaml +++ b/tests/dat/manifest_validate_json_params.yaml @@ -44,6 +44,12 @@ packages: member6: type: json value: { "name": "Frodo", "place": "Undying Lands", "items": [ "Sting", "Mithril mail" ] } + member7: + type: json + value: { "name": "${USERNAME}", "password": "${PASSWORD}" } + member8: + type: json + value: { "name": "$${USERNAME}", "password": "$${PASSWORD}" } outputs: fellowship: type: json diff --git a/tests/dat/manifest_validate_multiline_params.yaml b/tests/dat/manifest_validate_multiline_params.yaml index 492b518..5877dc6 100644 --- a/tests/dat/manifest_validate_multiline_params.yaml +++ b/tests/dat/manifest_validate_multiline_params.yaml @@ -32,6 +32,15 @@ packages: param_string_type_and_value_only: type: string value: foo + param_json_type_and_value_only_1: + type: json + value: '{ "name": "Sam", "place": "Shire" }' + param_json_type_and_value_only_2: + type: json + value: { "name": "${USERNAME}", "password": "${PASSWORD}" } + param_json_type_and_value_only_3: + type: json + value: { "name": "$${USERNAME}", "password": "$${PASSWORD}" } # type only param_string_type_only: type: string diff --git a/wskenv/environment.go b/wskenv/environment.go index cf9026e..643d815 100644 --- a/wskenv/environment.go +++ b/wskenv/environment.go @@ -63,8 +63,13 @@ func InterpolateStringWithEnvVar(key interface{}) interface{} { return c == '$' || c == '{' || c == '}' } for _, substr := range strings.FieldsFunc(keystr, f) { - //if the substr is a $ENV_VAR - if strings.Contains(keystr, "$"+substr) { + //if the substr is a $${ENV_VAR} + // return ${ENV_VAR} + if strings.Contains(keystr, "$${"+substr+"}") { + keystr = strings.Replace(keystr, "$${"+substr+"}", "${"+substr+"}", -1) + //if the substr is a $ENV_VAR + // return interpolated string using env. variable + } else if strings.Contains(keystr, "$"+substr) { thisValue = os.Getenv(substr) if thisValue == "" { // TODO() i18n @@ -72,6 +77,7 @@ func InterpolateStringWithEnvVar(key interface{}) interface{} { } keystr = strings.Replace(keystr, "$"+substr, thisValue, -1) //if the substr is a ${ENV_VAR} + // return interpolated string using env. variable } else if strings.Contains(keystr, "${"+substr+"}") { thisValue = os.Getenv(substr) if thisValue == "" { -- To stop receiving notification emails like this one, please contact mrutkow...@apache.org.