Add support to parse the type slice (#1010)

Closes-bug: #999
diff --git a/parsers/manifest_parser_test.go b/parsers/manifest_parser_test.go
index 61f9e96..5b93a6d 100644
--- a/parsers/manifest_parser_test.go
+++ b/parsers/manifest_parser_test.go
@@ -56,6 +56,7 @@
 	TEST_MSG_ACTION_FUNCTION_PATH_MISSING           = "Action function path missing"
 	TEST_MSG_INVALID_ACTION_ANNOTATION              = "Action annotations are invalid"
 	TEST_MSG_PACKAGE_PARAMETER_VALUE_MISMATCH       = "Package parameter value mismatched."
+	TEST_MSG_MISMATCH_ACTION_INPUT_PARAMS           = "Action parameters mismatched."
 
 	// local error messages
 	TEST_ERROR_MANIFEST_PARSE_FAILURE     = "Manifest [%s]: Failed to parse. Error: %s"
@@ -1338,6 +1339,28 @@
 	}
 }
 
+// Test 18: validate manifest_parser.ComposeActions() method for parsing the correct inputs to the action
+func TestComposeActionsForInputs(t *testing.T) {
+	file := "../tests/dat/manifest_data_compose_actions_for_inputs.yaml"
+	_, m, _ := testLoadParseManifest(t, file)
+	packageName := "testActionInputsInManifest"
+	actionName := "helloNodejs"
+
+	if action, ok := m.Packages[packageName].Actions[actionName]; ok {
+		// validate Inputs to this action
+		for input, param := range action.Inputs {
+			switch input {
+			case "param1":
+				assert.Equal(t, []interface{}{"v1", "v2"},
+					param.Value.([]interface{}), TEST_MSG_MISMATCH_ACTION_INPUT_PARAMS)
+			case "param2":
+				assert.Equal(t, []interface{}{"value1", "value2"},
+					param.Value.([]interface{}), TEST_MSG_MISMATCH_ACTION_INPUT_PARAMS)
+			}
+		}
+	}
+}
+
 func TestComposePackage(t *testing.T) {
 
 	file := "../tests/dat/manifest_data_compose_packages.yaml"
diff --git a/parsers/parameters.go b/parsers/parameters.go
index c9d9f85..25dff91 100644
--- a/parsers/parameters.go
+++ b/parsers/parameters.go
@@ -35,6 +35,7 @@
 	FLOAT   string = "float"
 	BOOLEAN string = "boolean"
 	JSON    string = "json"
+	SLICE   string = "slice"
 )
 
 var validParameterNameMap = map[string]string{
@@ -52,6 +53,7 @@
 	"float64": FLOAT,
 	JSON:      JSON,
 	"map":     JSON,
+	"slice":   SLICE,
 }
 
 var typeDefaultValueMap = map[string]interface{}{
@@ -347,6 +349,11 @@
 		value, errorParser = resolveJSONParameter(filePath, paramName, param, value)
 	}
 
+	if param.Value != nil && param.Type == "slice" {
+		value = wskenv.InterpolateStringWithEnvVar(param.Value)
+		value = utils.ConvertInterfaceValue(value)
+	}
+
 	// Default value to zero value for the Type
 	// Do NOT error/terminate as Value may be provided later by a Deployment file.
 	if value == nil {
diff --git a/runtimes/runtimes_test.go b/runtimes/runtimes_test.go
index 5ea5840..2f2ade0 100644
--- a/runtimes/runtimes_test.go
+++ b/runtimes/runtimes_test.go
@@ -32,7 +32,7 @@
 	println(converted["nodejs"])
 	println(converted["python"])
 	//println(converted["go"])
-	assert.Equal(t, 2, len(converted["nodejs"]), "not expected length")
+	assert.Equal(t, 3, len(converted["nodejs"]), "not expected length")
 	assert.Equal(t, 2, len(converted["php"]), "not expected length")
 	assert.Equal(t, 1, len(converted["java"]), "not expected length")
 	assert.Equal(t, 6, len(converted["python"]), "not expected length")
diff --git a/tests/dat/manifest_data_compose_actions_for_inputs.yaml b/tests/dat/manifest_data_compose_actions_for_inputs.yaml
new file mode 100644
index 0000000..05fdfa9
--- /dev/null
+++ b/tests/dat/manifest_data_compose_actions_for_inputs.yaml
@@ -0,0 +1,14 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more contributor
+# license agreements; and to You under the Apache License, Version 2.0.
+
+packages:
+  testActionInputsInManifest:
+    actions:
+      helloNodejs:
+        function: actions/hello.js
+        inputs:
+          name: Tom
+          param1: ["v1", "v2"]
+          param2:
+            - "value1"
+            - "value2"