You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by da...@apache.org on 2017/09/21 08:37:33 UTC

[incubator-openwhisk-wskdeploy] branch master updated: Updating all manifest files to use packages (#529)

This is an automated email from the ASF dual-hosted git repository.

daisyguo 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 453c919  Updating all manifest files to use packages (#529)
453c919 is described below

commit 453c919a9cf47a78e5c2c240799b5eba34450d88
Author: Priti Desai <pd...@us.ibm.com>
AuthorDate: Thu Sep 21 01:37:31 2017 -0700

    Updating all manifest files to use packages (#529)
    
    * Updating all manifest files to use packages
    
    * reading credentials from first package
    
    * fixing unit test failure
---
 cmd/root.go                                        |  68 +++---
 deployers/whiskclient.go                           |  16 +-
 parsers/manifest_parser.go                         |   1 +
 parsers/manifest_parser_test.go                    |  55 +++--
 parsers/yamlparser_test.go                         |  19 +-
 tests/dat/manifest3.yaml                           |  11 +-
 tests/dat/manifest4.yaml                           |  13 +-
 tests/dat/manifest5.yaml                           |  17 +-
 tests/dat/manifest6.yaml                           |  76 +++----
 tests/dat/manifest_bad_yaml.yaml                   |  28 +--
 tests/dat/manifest_validate_credentials.yaml       |  42 ++--
 tests/dat/manifest_validate_deployment_reader.yaml |  36 +--
 tests/dat/manifest_validate_multiline_params.yaml  |  78 +++----
 tests/dat/manifest_validate_package_grammar.yaml   |   8 +-
 tests/dat/manifest_validate_singleline_params.yaml |  78 +++----
 ...ifest_validate_trigger_action_rule_grammar.yaml |  72 +++---
 tests/src/integration/alarmtrigger/manifest.yaml   |  48 ++--
 tests/src/integration/apigateway/manifest.yml      |  68 +++---
 tests/src/integration/cloudant/manifest.yaml       |  68 +++---
 tests/src/integration/dependency/manifest.yaml     |  30 +--
 tests/src/integration/flagstests/manifest.yaml     |  46 ++--
 tests/src/integration/flagstests/manifest.yml      |  44 ++--
 tests/src/integration/helloworld/manifest.yaml     | 134 +++++------
 tests/src/integration/jaraction/manifest.yaml      |  14 +-
 tests/src/integration/runtimetests/manifest.yaml   | 246 ++++++++++-----------
 tests/src/integration/triggerrule/manifest.yml     |  42 ++--
 .../manifest.yaml                                  |  52 ++---
 .../manifest.yml                                   |  52 ++---
 .../not-standard-manifest.yaml                     |  52 ++---
 .../random-name-1.yaml                             |  52 ++---
 .../yaml-manifest-with-yml-deployment.yaml         |  52 ++---
 .../yml-manifest-with-yaml-deployment.yml          |  52 ++---
 .../validatePackageInDeployment/manifest.yaml      |  22 +-
 .../validatePackagesInDeployment/manifest.yaml     |  22 +-
 tests/src/integration/webaction/manifest.yml       |  38 ++--
 tests/src/integration/zipaction/manifest.yml       |  26 +--
 .../usecases/api-gateway/simple_api_manifest.yaml  |  22 +-
 tests/usecases/badyaml/manifest.yaml               |  16 +-
 tests/usecases/dependency/manifest.yaml            |  50 ++---
 tests/usecases/github/manifest.yaml                |  26 +--
 tests/usecases/slack/manifest.yaml                 |  54 ++---
 tests/usecases/triggerrule/manifest.yml            |  38 ++--
 42 files changed, 1003 insertions(+), 981 deletions(-)

diff --git a/cmd/root.go b/cmd/root.go
index b7111e2..1aa0f83 100644
--- a/cmd/root.go
+++ b/cmd/root.go
@@ -128,7 +128,7 @@ func initConfig() {
 		_, err := whisk.ReadProps(utils.Flags.CfgFile)
 		if err != nil {
 			utils.Flags.CfgFile = defaultPath
-            utils.PrintOpenWhiskOutputln("Invalid config file detected, so by bdefault it is set to " + utils.Flags.CfgFile)
+			utils.PrintOpenWhiskOutputln("Invalid config file detected, so by bdefault it is set to " + utils.Flags.CfgFile)
 		}
 
 	} else {
@@ -152,10 +152,10 @@ func Deploy() error {
 	// also set debug mode to true.
 	whisk.SetDebug(utils.Flags.Verbose)
 
-    project_Path := strings.TrimSpace(utils.Flags.ProjectPath)
-    if len(project_Path) == 0 {
-        project_Path = utils.DEFAULT_PROJECT_PATH
-    }
+	project_Path := strings.TrimSpace(utils.Flags.ProjectPath)
+	if len(project_Path) == 0 {
+		project_Path = utils.DEFAULT_PROJECT_PATH
+	}
 	projectPath, _ := filepath.Abs(project_Path)
 
 	if utils.Flags.ManifestPath == "" {
@@ -173,7 +173,7 @@ func Deploy() error {
 			whisk.Debug(whisk.DbgError, stderr)
 			errString := wski18n.T("Missing {{.yaml}}/{{.yml}} file. Manifest file not found at path {{.projectPath}}.\n",
 				map[string]interface{}{"yaml": utils.ManifestFileNameYaml, "yml": utils.ManifestFileNameYml,
-                    "projectPath": projectPath})
+					"projectPath": projectPath})
 			return utils.NewErrorManifestFileNotFound(errString)
 		}
 		whisk.Debug(whisk.DbgInfo, stdout)
@@ -200,17 +200,17 @@ func Deploy() error {
 		// master record of any dependency that has been downloaded
 		deployer.DependencyMaster = make(map[string]utils.DependencyRecord)
 
-        clientConfig, error := deployers.NewWhiskConfig(utils.Flags.CfgFile, utils.Flags.DeploymentPath, utils.Flags.ManifestPath, deployer.IsInteractive)
-        if error != nil {
-            return error
-        }
+		clientConfig, error := deployers.NewWhiskConfig(utils.Flags.CfgFile, utils.Flags.DeploymentPath, utils.Flags.ManifestPath, deployer.IsInteractive)
+		if error != nil {
+			return error
+		}
 
-        whiskClient, error := deployers.CreateNewClient(clientConfig)
-        if error != nil {
-            return error
-        }
+		whiskClient, error := deployers.CreateNewClient(clientConfig)
+		if error != nil {
+			return error
+		}
 
-        deployer.Client = whiskClient
+		deployer.Client = whiskClient
 		deployer.ClientConfig = clientConfig
 
 		// The auth, apihost and namespace have been chosen, so that we can check the supported runtimes here.
@@ -230,8 +230,8 @@ func Deploy() error {
 		}
 
 	} else {
-        errString := wski18n.T("Manifest file is not found at the path [{{.filePath}}].\n",
-            map[string]interface{}{"filePath": utils.Flags.ManifestPath})
+		errString := wski18n.T("Manifest file is not found at the path [{{.filePath}}].\n",
+			map[string]interface{}{"filePath": utils.Flags.ManifestPath})
 		whisk.Debug(whisk.DbgError, errString)
 		return utils.NewErrorManifestFileNotFound(errString)
 	}
@@ -245,11 +245,11 @@ func Undeploy() error {
 	// also set debug mode to true.
 	whisk.SetDebug(utils.Flags.Verbose)
 
-    project_Path := strings.TrimSpace(utils.Flags.ProjectPath)
-    if len(project_Path) == 0 {
-        project_Path = utils.DEFAULT_PROJECT_PATH
-    }
-    projectPath, _ := filepath.Abs(project_Path)
+	project_Path := strings.TrimSpace(utils.Flags.ProjectPath)
+	if len(project_Path) == 0 {
+		project_Path = utils.DEFAULT_PROJECT_PATH
+	}
+	projectPath, _ := filepath.Abs(project_Path)
 
 	if utils.Flags.ManifestPath == "" {
 		if _, err := os.Stat(path.Join(projectPath, utils.ManifestFileNameYaml)); err == nil {
@@ -266,7 +266,7 @@ func Undeploy() error {
 			whisk.Debug(whisk.DbgError, stderr)
 			errString := wski18n.T("Missing {{.yaml}}/{{.yml}} file. Manifest file not found at path {{.projectPath}}.\n",
 				map[string]interface{}{"yaml": utils.ManifestFileNameYaml, "yml": utils.ManifestFileNameYml,
-                    "projectPath": projectPath})
+					"projectPath": projectPath})
 			return utils.NewErrorManifestFileNotFound(errString)
 		}
 		whisk.Debug(whisk.DbgInfo, stdout)
@@ -292,17 +292,17 @@ func Undeploy() error {
 		deployer.IsInteractive = utils.Flags.UseInteractive
 		deployer.IsDefault = utils.Flags.UseDefaults
 
-        clientConfig, error := deployers.NewWhiskConfig(utils.Flags.CfgFile, utils.Flags.DeploymentPath, utils.Flags.ManifestPath, deployer.IsInteractive)
-        if error != nil {
-            return error
-        }
+		clientConfig, error := deployers.NewWhiskConfig(utils.Flags.CfgFile, utils.Flags.DeploymentPath, utils.Flags.ManifestPath, deployer.IsInteractive)
+		if error != nil {
+			return error
+		}
 
-        whiskClient, error := deployers.CreateNewClient(clientConfig)
-        if error != nil {
-            return error
-        }
+		whiskClient, error := deployers.CreateNewClient(clientConfig)
+		if error != nil {
+			return error
+		}
 
-        deployer.Client = whiskClient
+		deployer.Client = whiskClient
 		deployer.ClientConfig = clientConfig
 
 		// The auth, apihost and namespace have been chosen, so that we can check the supported runtimes here.
@@ -317,8 +317,8 @@ func Undeploy() error {
 		}
 
 	} else {
-        errString := wski18n.T("Manifest file is not found at the path [{{.filePath}}].\n",
-            map[string]interface{}{"filePath": utils.Flags.ManifestPath})
+		errString := wski18n.T("Manifest file is not found at the path [{{.filePath}}].\n",
+			map[string]interface{}{"filePath": utils.Flags.ManifestPath})
 		whisk.Debug(whisk.DbgError, errString)
 		return utils.NewErrorManifestFileNotFound(errString)
 	}
diff --git a/deployers/whiskclient.go b/deployers/whiskclient.go
index 1b7949f..fece4f7 100644
--- a/deployers/whiskclient.go
+++ b/deployers/whiskclient.go
@@ -105,9 +105,19 @@ func NewWhiskConfig(proppath string, deploymentPath string, manifestPath string,
 		if utils.FileExists(manifestPath) {
 			mm := parsers.NewYAMLParser()
 			manifest, _ := mm.ParseManifest(manifestPath)
-			credential = GetPropertyValue(credential, manifest.Package.Credential, path.Base(manifestPath))
-			namespace = GetPropertyValue(namespace, manifest.Package.Namespace, path.Base(manifestPath))
-			apiHost = GetPropertyValue(apiHost, manifest.Package.ApiHost, path.Base(manifestPath))
+			if manifest.Package.Packagename != "" {
+				credential = GetPropertyValue(credential, manifest.Package.Credential, path.Base(manifestPath))
+				namespace = GetPropertyValue(namespace, manifest.Package.Namespace, path.Base(manifestPath))
+				apiHost = GetPropertyValue(apiHost, manifest.Package.ApiHost, path.Base(manifestPath))
+			} else if manifest.Packages != nil {
+				if len(manifest.Packages) == 1 {
+					for _, pkg := range manifest.Packages {
+						credential = GetPropertyValue(credential, pkg.Credential, path.Base(manifestPath))
+						namespace = GetPropertyValue(namespace, pkg.Namespace, path.Base(manifestPath))
+						apiHost = GetPropertyValue(apiHost, pkg.ApiHost, path.Base(manifestPath))
+					}
+				}
+			}
 		}
 	}
 
diff --git a/parsers/manifest_parser.go b/parsers/manifest_parser.go
index ccaff6b..731ef15 100644
--- a/parsers/manifest_parser.go
+++ b/parsers/manifest_parser.go
@@ -187,6 +187,7 @@ func (dm *YAMLParser) ComposeDependencies(pkg Package, projectPath string, fileP
 func (dm *YAMLParser) ComposeAllPackages(manifest *ManifestYAML, filePath string) (map[string]*whisk.Package, error) {
 	packages := map[string]*whisk.Package{}
 	if manifest.Package.Packagename != "" {
+		fmt.Println("WARNING: using package inside of manifest file will soon be deprecated, please use packages instead.")
 		s, err := dm.ComposePackage(manifest.Package, manifest.Package.Packagename, filePath)
 		if err == nil {
 			packages[manifest.Package.Packagename] = s
diff --git a/parsers/manifest_parser_test.go b/parsers/manifest_parser_test.go
index ed6ecbe..523862a 100644
--- a/parsers/manifest_parser_test.go
+++ b/parsers/manifest_parser_test.go
@@ -218,6 +218,7 @@ func TestUnmarshalForMissingPackage(t *testing.T) {
     // And returns an error if parsing a manifest data fails
     err := NewYAMLParser().Unmarshal([]byte(data), &m)
     assert.NotNil(t, err, "Expected some error from Unmarshal but got no error")
+
 }
 
 /*
@@ -247,14 +248,13 @@ func TestParseManifestForMultiLineParams(t *testing.T) {
     m, _ := NewYAMLParser().ParseManifest(manifestFile)
 
     // validate package name should be "validate"
-    expectedPackageName := m.Package.Packagename
-    actualPackageName := "validate"
-    assert.Equal(t, expectedPackageName, actualPackageName,
-        "Expected " + expectedPackageName + " but got " + actualPackageName)
+    packageName := "validate"
+    assert.NotNil(t, m.Packages[packageName],
+        "Expected package named validate but got none")
 
     // validate this package contains one action
     expectedActionsCount := 1
-    actualActionsCount := len(m.Package.Actions)
+    actualActionsCount := len(m.Packages[packageName].Actions)
     assert.Equal(t, expectedActionsCount, actualActionsCount,
         "Expected " + string(expectedActionsCount) + " but got " + string(actualActionsCount))
 
@@ -263,7 +263,7 @@ func TestParseManifestForMultiLineParams(t *testing.T) {
     // same name, will go unnoticed
     // also, the Action struct does not have name field set it to action name
     actionName := "validate_multiline_params"
-    if action, ok := m.Package.Actions[actionName]; ok {
+    if action, ok := m.Packages[packageName].Actions[actionName]; ok {
         // validate location/function of an action to be "actions/dump_params.js"
         expectedResult := "actions/dump_params.js"
         actualResult := action.Function
@@ -360,19 +360,18 @@ func TestParseManifestForSingleLineParams(t *testing.T) {
     m, _ := NewYAMLParser().ParseManifest(manifestFile)
 
     // validate package name should be "validate"
-    expectedPackageName := m.Package.Packagename
-    actualPackageName := "validate"
-    assert.Equal(t, expectedPackageName, actualPackageName,
-        "Expected " + expectedPackageName + " but got " + actualPackageName)
+    packageName := "validate"
+    assert.NotNil(t, m.Packages[packageName],
+        "Expected package named "+ packageName + " but got none")
 
     // validate this package contains one action
     expectedActionsCount := 1
-    actualActionsCount := len(m.Package.Actions)
+    actualActionsCount := len(m.Packages[packageName].Actions)
     assert.Equal(t, expectedActionsCount, actualActionsCount,
         "Expected " + string(expectedActionsCount) + " but got " + string(actualActionsCount))
 
     actionName := "validate_singleline_params"
-    if action, ok := m.Package.Actions[actionName]; ok {
+    if action, ok := m.Packages[packageName].Actions[actionName]; ok {
         // validate location/function of an action to be "actions/dump_params.js"
         expectedResult := "actions/dump_params.js"
         actualResult := action.Function
@@ -1383,9 +1382,11 @@ func TestParseManifestYAML_trigger(t *testing.T) {
 		panic(err)
 	}
 
-	assert.Equal(t, 2, len(manifest.Package.Triggers), "Get trigger list failed.")
-	for trigger_name := range manifest.Package.Triggers {
-		var trigger = manifest.Package.Triggers[trigger_name]
+        packageName := "manifest3"
+
+	assert.Equal(t, 2, len(manifest.Packages[packageName].Triggers), "Get trigger list failed.")
+	for trigger_name := range manifest.Packages[packageName].Triggers {
+		var trigger = manifest.Packages[packageName].Triggers[trigger_name]
 		switch trigger_name {
 		case "trigger1":
 		case "trigger2":
@@ -1408,9 +1409,11 @@ func TestParseManifestYAML_rule(t *testing.T) {
 		panic(err)
 	}
 
-	assert.Equal(t, 1, len(manifest.Package.Rules), "Get trigger list failed.")
-	for rule_name := range manifest.Package.Rules {
-		var rule = manifest.Package.Rules[rule_name]
+        packageName := "manifest4"
+
+	assert.Equal(t, 1, len(manifest.Packages[packageName].Rules), "Get trigger list failed.")
+	for rule_name := range manifest.Packages[packageName].Rules {
+		var rule = manifest.Packages[packageName].Rules[rule_name]
 		switch rule_name {
 		case "rule1":
 			assert.Equal(t, "trigger1", rule.Trigger, "Get trigger name failed.")
@@ -1434,9 +1437,11 @@ func TestParseManifestYAML_feed(t *testing.T) {
 		panic(err)
 	}
 
-	assert.Equal(t, 1, len(manifest.Package.Feeds), "Get feed list failed.")
-	for feed_name := range manifest.Package.Feeds {
-		var feed = manifest.Package.Feeds[feed_name]
+        packageName := "manifest5"
+
+	assert.Equal(t, 1, len(manifest.Packages[packageName].Feeds), "Get feed list failed.")
+	for feed_name := range manifest.Packages[packageName].Feeds {
+		var feed = manifest.Packages[packageName].Feeds[feed_name]
 		switch feed_name {
 		case "feed1":
 			assert.Equal(t, "https://my.company.com/services/eventHub", feed.Location, "Get feed location failed.")
@@ -1468,9 +1473,11 @@ func TestParseManifestYAML_param(t *testing.T) {
 		panic(err)
 	}
 
-	assert.Equal(t, 1, len(manifest.Package.Actions), "Get action list failed.")
-	for action_name := range manifest.Package.Actions {
-		var action = manifest.Package.Actions[action_name]
+        packageName := "manifest6"
+
+	assert.Equal(t, 1, len(manifest.Packages[packageName].Actions), "Get action list failed.")
+	for action_name := range manifest.Packages[packageName].Actions {
+		var action = manifest.Packages[packageName].Actions[action_name]
 		switch action_name {
 		case "action1":
 			for param_name := range action.Inputs {
diff --git a/parsers/yamlparser_test.go b/parsers/yamlparser_test.go
index 21bfc12..d27a5f8 100644
--- a/parsers/yamlparser_test.go
+++ b/parsers/yamlparser_test.go
@@ -48,10 +48,11 @@ func TestComposeWskPackage(t *testing.T) {
 		assert.Equal(t, "/wskdeploy/samples/test", wskpkg.Namespace, "Get package namespace failed.")
 	}
 
-	pkg := manifest.Package
-	wskpkg := pkg.ComposeWskPackage()
-	assert.Equal(t, "helloworld", wskpkg.Name, "Get package name failed.")
-	assert.Equal(t, "1.0", wskpkg.Version, "Get package version failed.")
+	for n, p := range manifest.Packages{
+		wskpkg := p.ComposeWskPackage()
+		assert.Equal(t, "helloworld", n, "Get package name failed.")
+		assert.Equal(t, "1.0", wskpkg.Version, "Get package version failed.")
+	}
 }
 
 func TestComposeWskTrigger(t *testing.T) {
@@ -100,7 +101,7 @@ func TestComposeWskRule(t *testing.T) {
 func TestGetActionList(t *testing.T) {
 	mm := NewYAMLParser()
 	manifest, _ := mm.ParseManifest(manifestfile_val_tar)
-	pkg := manifest.Package
+	pkg := manifest.Packages["manifest2"]
 	actions := pkg.GetActionList()
 	assert.Equal(t,3, len(actions), "Get action list failed.")
 }
@@ -108,7 +109,7 @@ func TestGetActionList(t *testing.T) {
 func TestGetTriggerList(t *testing.T) {
 	mm := NewYAMLParser()
 	manifest, _ := mm.ParseManifest(manifestfile_val_tar)
-	pkg := manifest.Package
+	pkg := manifest.Packages["manifest2"]
 	triggers := pkg.GetTriggerList()
 	assert.Equal(t,2, len(triggers), "Get trigger list failed.")
 }
@@ -116,7 +117,7 @@ func TestGetTriggerList(t *testing.T) {
 func TestGetRuleList(t *testing.T) {
 	mm := NewYAMLParser()
 	manifest, _ := mm.ParseManifest(manifestfile_val_tar)
-	pkg := manifest.Package
+	pkg := manifest.Packages["manifest2"]
 	rules := pkg.GetRuleList()
 	assert.Equal(t,3, len(rules), "Get trigger list failed.")
 }
@@ -124,7 +125,7 @@ func TestGetRuleList(t *testing.T) {
 func TestGetFeedList(t *testing.T) {
 	mm := NewYAMLParser()
 	manifest, _ := mm.ParseManifest(manifestfile_val_tar)
-	pkg := manifest.Package
+	pkg := manifest.Packages["manifest2"]
 	feeds := pkg.GetFeedList()
 	assert.Equal(t,4, len(feeds), "Get feed list failed.")
 }
@@ -132,7 +133,7 @@ func TestGetFeedList(t *testing.T) {
 func TestGetApisList(t *testing.T) {
 	mm := NewYAMLParser()
 	manifest, _ := mm.ParseManifest(manifestfile_val_tar)
-	pkg := manifest.Package
+	pkg := manifest.Packages["manifest2"]
 	apis := pkg.GetApis()
 	assert.Equal(t,5, len(apis), "Get api list failed.")
 }
diff --git a/tests/dat/manifest3.yaml b/tests/dat/manifest3.yaml
index 5206d7c..80296c3 100644
--- a/tests/dat/manifest3.yaml
+++ b/tests/dat/manifest3.yaml
@@ -1,6 +1,7 @@
-package:
-  triggers:
-    trigger1:
-    trigger2:
-      feed: myfeed
+packages:
+  manifest3:
+    triggers:
+      trigger1:
+      trigger2:
+        feed: myfeed
       
diff --git a/tests/dat/manifest4.yaml b/tests/dat/manifest4.yaml
index f4f965b..024be0d 100644
--- a/tests/dat/manifest4.yaml
+++ b/tests/dat/manifest4.yaml
@@ -1,7 +1,8 @@
-package:
-  rules:
-    rule1:
-      trigger: trigger1
-      action: hellpworld
-      rule: true
+packages:
+  manifest4:
+    rules:
+      rule1:
+        trigger: trigger1
+        action: hellpworld
+        rule: true
       
diff --git a/tests/dat/manifest5.yaml b/tests/dat/manifest5.yaml
index 4d5d121..12ce24c 100644
--- a/tests/dat/manifest5.yaml
+++ b/tests/dat/manifest5.yaml
@@ -1,10 +1,11 @@
-package:
-  feeds:
-    feed1:
-      location: https://my.company.com/services/eventHub
-      credential: my_credential
-      operations:
-        operation1:
-        operation2:
+packages:
+  manifest5:
+    feeds:
+      feed1:
+        location: https://my.company.com/services/eventHub
+        credential: my_credential
+        operations:
+          operation1:
+          operation2:
 
       
diff --git a/tests/dat/manifest6.yaml b/tests/dat/manifest6.yaml
index 6fa6f2e..584b7ed 100644
--- a/tests/dat/manifest6.yaml
+++ b/tests/dat/manifest6.yaml
@@ -1,45 +1,45 @@
-package:
-  name: manifest6
-  actions:
-    action1:
-      inputs:
-        inline1: '{ "key": true }'
-        inline2: Just a string
-        inline3: null
-        inline4: true
-        inline5: 42
-        inline6: -531
-        inline7: 432.432E-43
-        inline8: '[ true, null, "boo", { "key": 0 }]'
-        inline9: !!bool false
-        inline0: !!float 456.423
-        inlin10:  # JSON null
-        inlin11: True # JSON true
+packages:
+  manifest6:
+    actions:
+      action1:
+        inputs:
+          inline1: '{ "key": true }'
+          inline2: Just a string
+          inline3: null
+          inline4: true
+          inline5: 42
+          inline6: -531
+          inline7: 432.432E-43
+          inline8: '[ true, null, "boo", { "key": 0 }]'
+          inline9: !!bool false
+          inline0: !!float 456.423
+          inlin10:  # JSON null
+          inlin11: True # JSON true
 
-        expand1:
-          value: null
-          type: string
+          expand1:
+            value: null
+            type: string
 
-        expand2:
-          value: true
-          type: string
+          expand2:
+            value: true
+            type: string
 
-        expand3:
-          value: false
-          type: string
+          expand3:
+            value: false
+            type: string
 
-        expand4:
-          value: 15646
-          type: string
+          expand4:
+            value: 15646
+            type: string
 
-        expand5:
-          value: '{ "key": true }'
-          type: string
+          expand5:
+            value: '{ "key": true }'
+            type: string
 
-        expand6:
-          value:  '[ true, null, "boo", { "key": 0 }]'
-          type: string
+          expand6:
+            value:  '[ true, null, "boo", { "key": 0 }]'
+            type: string
 
-        expand7:
-          value: !!null null
-          type: string
\ No newline at end of file
+          expand7:
+            value: !!null null
+            type: string
\ No newline at end of file
diff --git a/tests/dat/manifest_bad_yaml.yaml b/tests/dat/manifest_bad_yaml.yaml
index 9a8d689..e4fcf70 100644
--- a/tests/dat/manifest_bad_yaml.yaml
+++ b/tests/dat/manifest_bad_yaml.yaml
@@ -1,14 +1,14 @@
-package:
-  name: BadYAML
-  actions:
-    # helloworld action in NodeJS
-    helloNodejs:
-      function: actions/hello.js
-      inputs:
-        name:
-          type: string
-          description: name of a person
-        place:
-          type: string
-          /// bad description
-          description: location of a person
+packages:
+  BadYAML:
+    actions:
+      # helloworld action in NodeJS
+      helloNodejs:
+        function: actions/hello.js
+        inputs:
+          name:
+            type: string
+            description: name of a person
+          place:
+            type: string
+            /// bad description
+            description: location of a person
diff --git a/tests/dat/manifest_validate_credentials.yaml b/tests/dat/manifest_validate_credentials.yaml
index f8d3ce4..c0b4cab 100644
--- a/tests/dat/manifest_validate_credentials.yaml
+++ b/tests/dat/manifest_validate_credentials.yaml
@@ -1,21 +1,21 @@
-package:
-   name: ValidateWhiskConfig
-   apiHost: sample.manifest.openwhisk.org
-   credential: sample-manifest-credential
-   namespace: sample-manifest-namespace
-   actions:
-     # helloworld action in NodeJS
-     helloworld:
-       function: actions/hello.js
-       runtime: nodejs:6
-       inputs:
-         name:
-           type: string
-           description: name of a person
-         place:
-           type: string
-           description: location of a person
-       outputs:
-         payload:
-           type: string
-           description: a simple greeting message, Hello World!
+packages:
+   ValidateWhiskConfig:
+     apiHost: sample.manifest.openwhisk.org
+     credential: sample-manifest-credential
+     namespace: sample-manifest-namespace
+     actions:
+       # helloworld action in NodeJS
+       helloworld:
+         function: actions/hello.js
+         runtime: nodejs:6
+         inputs:
+           name:
+             type: string
+             description: name of a person
+           place:
+             type: string
+             description: location of a person
+         outputs:
+           payload:
+             type: string
+             description: a simple greeting message, Hello World!
diff --git a/tests/dat/manifest_validate_deployment_reader.yaml b/tests/dat/manifest_validate_deployment_reader.yaml
index b9a1970..baeb398 100644
--- a/tests/dat/manifest_validate_deployment_reader.yaml
+++ b/tests/dat/manifest_validate_deployment_reader.yaml
@@ -1,18 +1,18 @@
-package:
-  name: ValidateDeploymentReader
-  actions:
-    # helloworld action in NodeJS
-    helloNodejs:
-      function: actions/hello.js
-      runtime: nodejs:6
-      inputs:
-        name:
-          type: string
-          description: name of a person
-        place:
-          type: string
-          description: location of a person
-      outputs:
-        payload:
-          type: string
-          description: a simple greeting message, Hello World!
+packages:
+  ValidateDeploymentReader:
+     actions:
+        # helloworld action in NodeJS
+        helloNodejs:
+          function: actions/hello.js
+          runtime: nodejs:6
+          inputs:
+            name:
+              type: string
+              description: name of a person
+            place:
+              type: string
+              description: location of a person
+          outputs:
+            payload:
+              type: string
+              description: a simple greeting message, Hello World!
diff --git a/tests/dat/manifest_validate_multiline_params.yaml b/tests/dat/manifest_validate_multiline_params.yaml
index 9aa764d..650c43b 100644
--- a/tests/dat/manifest_validate_multiline_params.yaml
+++ b/tests/dat/manifest_validate_multiline_params.yaml
@@ -1,39 +1,39 @@
-package:
-    name: validate
-    actions:
-        validate_multiline_params:
-            function: actions/dump_params.js
-            runtime: nodejs:6
-            inputs:
-                # value only
-                param_string_value_only:
-                    value: foo
-                param_int_value_only:
-                    value: 123
-                param_float_value_only:
-                    value: 3.14
-                # type and value only
-                param_string_type_and_value_only:
-                    type: string
-                    value: foo
-                # type only
-                param_string_type_only:
-                    type: string
-                param_integer_type_only:
-                    type: integer
-                param_float_type_only:
-                    type: float
-                # No value, but with default value
-                param_string_with_default:
-                    type: string
-                    default: bar
-                param_integer_with_default:
-                    type: integer
-                    default: -1
-                param_float_with_default:
-                    type: float
-                    default: 2.9
-            outputs:
-                payload:
-                    type: string
-                    description: parameter dump
+packages:
+    validate:
+        actions:
+            validate_multiline_params:
+                function: actions/dump_params.js
+                runtime: nodejs:6
+                inputs:
+                    # value only
+                    param_string_value_only:
+                        value: foo
+                    param_int_value_only:
+                        value: 123
+                    param_float_value_only:
+                        value: 3.14
+                    # type and value only
+                    param_string_type_and_value_only:
+                        type: string
+                        value: foo
+                    # type only
+                    param_string_type_only:
+                        type: string
+                    param_integer_type_only:
+                        type: integer
+                    param_float_type_only:
+                        type: float
+                    # No value, but with default value
+                    param_string_with_default:
+                        type: string
+                        default: bar
+                    param_integer_with_default:
+                        type: integer
+                        default: -1
+                    param_float_with_default:
+                        type: float
+                        default: 2.9
+                outputs:
+                    payload:
+                        type: string
+                        description: parameter dump
diff --git a/tests/dat/manifest_validate_package_grammar.yaml b/tests/dat/manifest_validate_package_grammar.yaml
index 8d28a44..28ad462 100644
--- a/tests/dat/manifest_validate_package_grammar.yaml
+++ b/tests/dat/manifest_validate_package_grammar.yaml
@@ -1,5 +1,5 @@
 # This test file is used to test the basic Package grammar
-package:
-  name: helloworld
-  version: 1.0
-  license: Apache-2.0
+packages:
+  helloworld:
+    version: 1.0
+    license: Apache-2.0
diff --git a/tests/dat/manifest_validate_singleline_params.yaml b/tests/dat/manifest_validate_singleline_params.yaml
index ff78514..c60ec57 100644
--- a/tests/dat/manifest_validate_singleline_params.yaml
+++ b/tests/dat/manifest_validate_singleline_params.yaml
@@ -1,39 +1,39 @@
-package:
-    name: validate
-    actions:
-        validate_singleline_params:
-            function: actions/dump_params.js
-            runtime: nodejs:6
-            inputs:
-                # simple string
-                param_simple_string: foo
-                # simple integers
-                param_simple_integer_1: 1
-                param_simple_integer_2: 0
-                param_simple_integer_3: -1
-                param_simple_integer_4: 99999
-                param_simple_integer_5: -99999
-                # simple floats
-                param_simple_float_1: 1.1
-                param_simple_float_2: 0.0
-                param_simple_float_3: -1.1
-                # simple Environment variables
-                param_simple_env_var_1: $GOPATH
-                param_simple_env_var_2: ${GOPATH}
-                param_simple_env_var_3: ${}
-                param_simple_invalid_env_var: $DollarSignNotInEnv
-                param_simple_env_var_concat_1: ${GOPATH}/test
-                param_simple_env_var_concat_2: $GOPATH/test
-                param_simple_env_var_concat_3: ddd.ccc.${GOPATH}
-                # Empty (string)
-                param_simple_implied_empty:
-                param_simple_explicit_empty_1: ''
-                param_simple_explicit_empty_2: ""
-                # Type names (should default to a value for that type)
-                param_simple_type_string: string
-                param_simple_type_integer: integer
-                param_simple_type_float: float
-            outputs:
-                payload:
-                    type: string
-                    description: parameter dump
+packages:
+    validate:
+        actions:
+            validate_singleline_params:
+                function: actions/dump_params.js
+                runtime: nodejs:6
+                inputs:
+                    # simple string
+                    param_simple_string: foo
+                    # simple integers
+                    param_simple_integer_1: 1
+                    param_simple_integer_2: 0
+                    param_simple_integer_3: -1
+                    param_simple_integer_4: 99999
+                    param_simple_integer_5: -99999
+                    # simple floats
+                    param_simple_float_1: 1.1
+                    param_simple_float_2: 0.0
+                    param_simple_float_3: -1.1
+                    # simple Environment variables
+                    param_simple_env_var_1: $GOPATH
+                    param_simple_env_var_2: ${GOPATH}
+                    param_simple_env_var_3: ${}
+                    param_simple_invalid_env_var: $DollarSignNotInEnv
+                    param_simple_env_var_concat_1: ${GOPATH}/test
+                    param_simple_env_var_concat_2: $GOPATH/test
+                    param_simple_env_var_concat_3: ddd.ccc.${GOPATH}
+                    # Empty (string)
+                    param_simple_implied_empty:
+                    param_simple_explicit_empty_1: ''
+                    param_simple_explicit_empty_2: ""
+                    # Type names (should default to a value for that type)
+                    param_simple_type_string: string
+                    param_simple_type_integer: integer
+                    param_simple_type_float: float
+                outputs:
+                    payload:
+                        type: string
+                        description: parameter dump
diff --git a/tests/dat/manifest_validate_trigger_action_rule_grammar.yaml b/tests/dat/manifest_validate_trigger_action_rule_grammar.yaml
index 046b751..ba024f1 100644
--- a/tests/dat/manifest_validate_trigger_action_rule_grammar.yaml
+++ b/tests/dat/manifest_validate_trigger_action_rule_grammar.yaml
@@ -1,37 +1,37 @@
 # This test file is used to test the basic Trigger-Action-Rule grammar
-package:
-  name: manifest2
-  version: 1.0
-  license: Apache-2.0
-  actions:
-    first_action:
-    second_action:
-    third_action:
-  triggers:
-    trigger1:
-    trigger2:
-  rules:
-    rule1:
-      trigger: trigger1
-      action: first_action
-    rule3:
-      trigger: trigger2
-      action: second_action
-    rule2:
-      trigger: trigger1
-      action: second_action
-  feeds:
-    feed1:
-    feed2:
-    feed3:
-    feed4:
-  apis:
-    book-club: #api name
-      club: # shared base path
-        books:   #path
-           getBooks: get #action name:verb
-           postBooks: post
-           putBooks: put
-           deleteBooks: delete
-        members: #path
-           listMembers: get #action name:verb
+packages:
+  manifest2:
+      version: 1.0
+      license: Apache-2.0
+      actions:
+        first_action:
+        second_action:
+        third_action:
+      triggers:
+        trigger1:
+        trigger2:
+      rules:
+        rule1:
+          trigger: trigger1
+          action: first_action
+        rule3:
+          trigger: trigger2
+          action: second_action
+        rule2:
+          trigger: trigger1
+          action: second_action
+      feeds:
+        feed1:
+        feed2:
+        feed3:
+        feed4:
+      apis:
+        book-club: #api name
+          club: # shared base path
+            books:   #path
+               getBooks: get #action name:verb
+               postBooks: post
+               putBooks: put
+               deleteBooks: delete
+            members: #path
+               listMembers: get #action name:verb
diff --git a/tests/src/integration/alarmtrigger/manifest.yaml b/tests/src/integration/alarmtrigger/manifest.yaml
index 6149417..eef0b7c 100644
--- a/tests/src/integration/alarmtrigger/manifest.yaml
+++ b/tests/src/integration/alarmtrigger/manifest.yaml
@@ -1,24 +1,24 @@
-package:
-    name: helloworld
-    actions:
-        helloworld:
-            function: actions/hello.js
-            runtime: nodejs:6
-            inputs:
-                name:
-                    type: string
-                    description: name of a person
-                place:
-                    type: string
-                    description: location of a person
-            outputs:
-                payload:
-                    type: string
-                    description: a simple greeting message, Hello World!
-    triggers:
-        Every12Hours:
-            feed: /whisk.system/alarms/alarm
-    rules:
-        helloworldEvery12Hours:
-            action: helloworld
-            trigger: Every12Hours
+packages:
+    helloworld:
+        actions:
+            helloworld:
+                function: actions/hello.js
+                runtime: nodejs:6
+                inputs:
+                    name:
+                        type: string
+                        description: name of a person
+                    place:
+                        type: string
+                        description: location of a person
+                outputs:
+                    payload:
+                        type: string
+                        description: a simple greeting message, Hello World!
+        triggers:
+            Every12Hours:
+                feed: /whisk.system/alarms/alarm
+        rules:
+            helloworldEvery12Hours:
+                action: helloworld
+                trigger: Every12Hours
diff --git a/tests/src/integration/apigateway/manifest.yml b/tests/src/integration/apigateway/manifest.yml
index c7e37b0..56286e5 100644
--- a/tests/src/integration/apigateway/manifest.yml
+++ b/tests/src/integration/apigateway/manifest.yml
@@ -1,34 +1,34 @@
-package:
-  name: api-gateway-test
-  version: 1.0
-  license: Apache-2.0
-  actions:
-      greeting:
-        version: 1.0
-        function: src/greeting.js
-        runtime: nodejs:6
-        inputs:
-          name: string
-          place: string
-        outputs:
-          payload: string
-  apis: # new top-level key for defining groups of named APIs
-    book-club: #api name
-      club: # shared base path
-        books:   #path
-           getBooks: get #action name:verb
-           postBooks: post
-           putBooks: put
-           deleteBooks: delete
-        members: #path
-           listMembers: get #action name:verb
-    book-club2: #api name, added for multi api definition test
-          club2: # shared base path
-            books2:   #path
-               getBooks2: get #action name:verb
-               postBooks2: post
-               putBooks2: put
-               deleteBooks2: delete
-            members2: #path
-               listMembers2: get #action name:verb
-
+packages:
+  api-gateway-test:
+      version: 1.0
+      license: Apache-2.0
+      actions:
+          greeting:
+            version: 1.0
+            function: src/greeting.js
+            runtime: nodejs:6
+            inputs:
+              name: string
+              place: string
+            outputs:
+              payload: string
+      apis: # new top-level key for defining groups of named APIs
+        book-club: #api name
+          club: # shared base path
+            books:   #path
+               getBooks: get #action name:verb
+               postBooks: post
+               putBooks: put
+               deleteBooks: delete
+            members: #path
+               listMembers: get #action name:verb
+        book-club2: #api name, added for multi api definition test
+              club2: # shared base path
+                books2:   #path
+                   getBooks2: get #action name:verb
+                   postBooks2: post
+                   putBooks2: put
+                   deleteBooks2: delete
+                members2: #path
+                   listMembers2: get #action name:verb
+    
diff --git a/tests/src/integration/cloudant/manifest.yaml b/tests/src/integration/cloudant/manifest.yaml
index bb7033c..a31fe80 100644
--- a/tests/src/integration/cloudant/manifest.yaml
+++ b/tests/src/integration/cloudant/manifest.yaml
@@ -2,37 +2,37 @@
 #   CLOUDANT_USERNAME
 #   CLOUDANT_PASSWORD
 
-package:
-    name: cloudant-sample
-    dependencies:
-        # binding cloudant package named openwhisk-cloudant
-        openwhisk-cloudant:
-            location: /whisk.system/cloudant
-            inputs:
-                username: $CLOUDANT_USERNAME
-                password: $CLOUDANT_PASSWORD
-                host: ${CLOUDANT_USERNAME}.cloudant.com
-    triggers:
-        # Trigger named "data-inserted-trigger"
-        # Creating trigger to fire events when data is inserted into database
-        data-inserted-trigger:
-            source: openwhisk-cloudant/changes
-            inputs:
-                dbname: testdb
-    actions:
-        # Action named "process-change"
-        # Creating action that is printing data which is written to the database
-        process-change:
-            location: actions/process-change.js
-
-    sequences:
-        # Sequence named "process-change-cloudant-sequence"
-        # Creating sequence to connect the cloudant "read" action with the "process-change" action
-        process-change-cloudant-sequence:
-            actions: openwhisk-cloudant/read, process-change
-    rules:
-        # Rule named "log-change-rule"
-        # Creating rule that maps database change trigger to sequence
-        log-change-rule:
-            trigger: data-inserted-trigger
-            action: process-change-cloudant-sequence
+packages:
+    cloudant-sample:
+        dependencies:
+            # binding cloudant package named openwhisk-cloudant
+            openwhisk-cloudant:
+                location: /whisk.system/cloudant
+                inputs:
+                    username: $CLOUDANT_USERNAME
+                    password: $CLOUDANT_PASSWORD
+                    host: ${CLOUDANT_USERNAME}.cloudant.com
+        triggers:
+            # Trigger named "data-inserted-trigger"
+            # Creating trigger to fire events when data is inserted into database
+            data-inserted-trigger:
+                source: openwhisk-cloudant/changes
+                inputs:
+                    dbname: testdb
+        actions:
+            # Action named "process-change"
+            # Creating action that is printing data which is written to the database
+            process-change:
+                location: actions/process-change.js
+    
+        sequences:
+            # Sequence named "process-change-cloudant-sequence"
+            # Creating sequence to connect the cloudant "read" action with the "process-change" action
+            process-change-cloudant-sequence:
+                actions: openwhisk-cloudant/read, process-change
+        rules:
+            # Rule named "log-change-rule"
+            # Creating rule that maps database change trigger to sequence
+            log-change-rule:
+                trigger: data-inserted-trigger
+                action: process-change-cloudant-sequence
diff --git a/tests/src/integration/dependency/manifest.yaml b/tests/src/integration/dependency/manifest.yaml
index b0b241b..eeebe93 100644
--- a/tests/src/integration/dependency/manifest.yaml
+++ b/tests/src/integration/dependency/manifest.yaml
@@ -1,15 +1,15 @@
-package:
-  name: TestGitHubDependency
-  dependencies:
-    helloworlds:
-      location: github.com/apache/incubator-openwhisk-test/packages/helloworlds
-  triggers:
-    trigger1:
-    trigger2:
-  rules:
-    rule1:
-      trigger: trigger1
-      action: helloworlds/hello-js
-    rule2:
-      trigger: trigger2
-      action: helloworlds/helloworld-js
+packages:
+  TestGitHubDependency:
+      dependencies:
+        helloworlds:
+          location: github.com/apache/incubator-openwhisk-test/packages/helloworlds
+      triggers:
+        trigger1:
+        trigger2:
+      rules:
+        rule1:
+          trigger: trigger1
+          action: helloworlds/hello-js
+        rule2:
+          trigger: trigger2
+          action: helloworlds/helloworld-js
diff --git a/tests/src/integration/flagstests/manifest.yaml b/tests/src/integration/flagstests/manifest.yaml
index d119fca..a998688 100644
--- a/tests/src/integration/flagstests/manifest.yaml
+++ b/tests/src/integration/flagstests/manifest.yaml
@@ -1,24 +1,24 @@
-package:
-  name: helloWorldFlags
-  version: 1.0
-  license: Apache-2.0
-  actions:
-    greeting:
-      web-export: true
+packages:
+  helloWorldFlags:
       version: 1.0
-      function: src/greeting.js
-      runtime: nodejs:6
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
-  triggers:
-    locationUpdateFlags:
-  rules:
-    myRule:
-      trigger: locationUpdateFlags
-      #the action name and the action file greeting.js should consistent.
-      #currently the implementation deside the action name consistent with action file name?
-      action: greeting
-
+      license: Apache-2.0
+      actions:
+        greeting:
+          web-export: true
+          version: 1.0
+          function: src/greeting.js
+          runtime: nodejs:6
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
+      triggers:
+        locationUpdateFlags:
+      rules:
+        myRule:
+          trigger: locationUpdateFlags
+          #the action name and the action file greeting.js should consistent.
+          #currently the implementation deside the action name consistent with action file name?
+          action: greeting
+    
diff --git a/tests/src/integration/flagstests/manifest.yml b/tests/src/integration/flagstests/manifest.yml
index d119fca..8a25e38 100644
--- a/tests/src/integration/flagstests/manifest.yml
+++ b/tests/src/integration/flagstests/manifest.yml
@@ -1,24 +1,24 @@
-package:
-  name: helloWorldFlags
-  version: 1.0
-  license: Apache-2.0
-  actions:
-    greeting:
-      web-export: true
+packages:
+  helloWorldFlags:
       version: 1.0
-      function: src/greeting.js
-      runtime: nodejs:6
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
-  triggers:
-    locationUpdateFlags:
-  rules:
-    myRule:
-      trigger: locationUpdateFlags
-      #the action name and the action file greeting.js should consistent.
-      #currently the implementation deside the action name consistent with action file name?
-      action: greeting
+      license: Apache-2.0
+      actions:
+        greeting:
+          web-export: true
+          version: 1.0
+          function: src/greeting.js
+          runtime: nodejs:6
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
+      triggers:
+        locationUpdateFlags:
+      rules:
+        myRule:
+          trigger: locationUpdateFlags
+          #the action name and the action file greeting.js should consistent.
+          #currently the implementation deside the action name consistent with action file name?
+          action: greeting
 
diff --git a/tests/src/integration/helloworld/manifest.yaml b/tests/src/integration/helloworld/manifest.yaml
index b2fd76a..54c20e6 100644
--- a/tests/src/integration/helloworld/manifest.yaml
+++ b/tests/src/integration/helloworld/manifest.yaml
@@ -1,70 +1,70 @@
-package:
-  name: IntegrationTestHelloWorld
-  actions:
-    # helloworld action in NodeJS
-    helloNodejs:
-      function: actions/hello.js
-      runtime: nodejs:6
-      inputs:
-        name:
-          type: string
-          description: name of a person
-        place:
-          type: string
-          description: location of a person
-      outputs:
-        payload:
-          type: string
-          description: a simple greeting message, Hello World!
-    # helloworld action in Java
-    helloJava:
-      function: actions/hello.jar
-      main: Hello
-      runtime: java
-      inputs:
-        name:
-          type: string
-          description: name of a person
-      outputs:
-        payload:
-          type: string
-          description: a simple greeting message, Hello Bob!
-    # helloworld action in python
-    helloPython:
-      function: actions/hello.py
-      runtime: python
-      inputs:
-        name:
-          type: string
-          description: name of a person
-      outputs:
-        payload:
-          type: string
-          description: a simple greeting message, Hello Henry!
-    # helloworld action in swift
-    helloSwift:
-      function: actions/hello.swift
-      runtime: swift:3.1.1
-      inputs:
-        name:
-          type: string
-          description: name of a person
-      outputs:
-        payload:
-          type: string
-          description: a simple greeting message, Hello stranger!
-  sequences:
-    # sequence of helloworld in all four runtimes
-    hello-world-series:
-      actions: helloNodejs, helloJava, helloPython, helloSwift
-  triggers:
-    # trigger to activate helloworld sequence
-    triggerHelloworld:
-  rules:
-    # rule associating trigger with sequence of helloworld actions
-    ruleMappingHelloworld:
-      trigger: triggerHelloworld
-      action: hello-world-series
+packages:
+  IntegrationTestHelloWorld:
+      actions:
+        # helloworld action in NodeJS
+        helloNodejs:
+          function: actions/hello.js
+          runtime: nodejs:6
+          inputs:
+            name:
+              type: string
+              description: name of a person
+            place:
+              type: string
+              description: location of a person
+          outputs:
+            payload:
+              type: string
+              description: a simple greeting message, Hello World!
+        # helloworld action in Java
+        helloJava:
+          function: actions/hello.jar
+          main: Hello
+          runtime: java
+          inputs:
+            name:
+              type: string
+              description: name of a person
+          outputs:
+            payload:
+              type: string
+              description: a simple greeting message, Hello Bob!
+        # helloworld action in python
+        helloPython:
+          function: actions/hello.py
+          runtime: python
+          inputs:
+            name:
+              type: string
+              description: name of a person
+          outputs:
+            payload:
+              type: string
+              description: a simple greeting message, Hello Henry!
+        # helloworld action in swift
+        helloSwift:
+          function: actions/hello.swift
+          runtime: swift:3.1.1
+          inputs:
+            name:
+              type: string
+              description: name of a person
+          outputs:
+            payload:
+              type: string
+              description: a simple greeting message, Hello stranger!
+      sequences:
+        # sequence of helloworld in all four runtimes
+        hello-world-series:
+          actions: helloNodejs, helloJava, helloPython, helloSwift
+      triggers:
+        # trigger to activate helloworld sequence
+        triggerHelloworld:
+      rules:
+        # rule associating trigger with sequence of helloworld actions
+        ruleMappingHelloworld:
+          trigger: triggerHelloworld
+          action: hello-world-series
 
 
 
diff --git a/tests/src/integration/jaraction/manifest.yaml b/tests/src/integration/jaraction/manifest.yaml
index dfb83a9..19340fa 100644
--- a/tests/src/integration/jaraction/manifest.yaml
+++ b/tests/src/integration/jaraction/manifest.yaml
@@ -1,7 +1,7 @@
-package:
-    name: IntegrationTestHelloworldJar
-    actions:
-        hellojaraction:
-            function: src/hello.jar
-            runtime: java
-            main: Hello
\ No newline at end of file
+packages:
+    IntegrationTestHelloworldJar:
+        actions:
+            hellojaraction:
+                function: src/hello.jar
+                runtime: java
+                main: Hello
diff --git a/tests/src/integration/runtimetests/manifest.yaml b/tests/src/integration/runtimetests/manifest.yaml
index 18473e1..1f179a8 100644
--- a/tests/src/integration/runtimetests/manifest.yaml
+++ b/tests/src/integration/runtimetests/manifest.yaml
@@ -1,125 +1,125 @@
-package:
-  name: TestExplicitRuntimes
-  version: 1.0
-  license: Apache-2.0
-  actions:
-    greetingnodejs-with-explicit-runtime:
-      web-export: true
+packages:
+  TestExplicitRuntimes:
       version: 1.0
-      function: src/greeting.js
-      runtime: nodejs:6
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
-    greetingnodejs-without-explicit-runtime:
-      web-export: true
-      version: 1.0
-      function: src/greeting.js
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
-    greetingphp-with-explicit-runtime:
-      web-export: true
-      version: 1.0
-      function: src/hello.php
-      runtime: php:7.1
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
-    greetingphp-without-explicit-runtime:
-      web-export: true
-      version: 1.0
-      function: src/hello.php
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
-    greetingpython-with-explicit-runtime:
-      web-export: true
-      version: 1.0
-      function: src/hello.py
-      runtime: python
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
-    greetingpython-without-explicit-runtime:
-      web-export: true
-      version: 1.0
-      function: src/hello.py
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
-    greetingpython2-with-explicit-runtime:
-      web-export: true
-      version: 1.0
-      function: src/hello.py
-      runtime: python:2
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
-    greetingpython3-with-explicit-runtime:
-      web-export: true
-      version: 1.0
-      function: src/hello.py
-      runtime: python:3
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
-    greetingswift311-with-explicit-runtime:
-      web-export: true
-      version: 1.0
-      function: src/hello.swift
-      runtime: swift:3.1.1
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
-    greetingswift3-with-explicit-runtime:
-      web-export: true
-      version: 1.0
-      function: src/hello.swift
-      runtime: swift:3
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
-    greetingswift-without-explicit-runtime:
-      web-export: true
-      version: 1.0
-      function: src/hello.swift
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
-    helloworldjava-with-explicit-runtime:
-      function: src/hello.jar
-      runtime: java
-      main: Hello
-    helloworldjava-without-explicit-runtime:
-      function: src/hello.jar
-      main: Hello
-  triggers:
-    locationUpdateRuntime:
-  rules:
-    myRuleRuntime:
-      trigger: locationUpdateRuntime
-      action:  greetingnodejs-with-explicit-runtime
+      license: Apache-2.0
+      actions:
+        greetingnodejs-with-explicit-runtime:
+          web-export: true
+          version: 1.0
+          function: src/greeting.js
+          runtime: nodejs:6
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
+        greetingnodejs-without-explicit-runtime:
+          web-export: true
+          version: 1.0
+          function: src/greeting.js
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
+        greetingphp-with-explicit-runtime:
+          web-export: true
+          version: 1.0
+          function: src/hello.php
+          runtime: php:7.1
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
+        greetingphp-without-explicit-runtime:
+          web-export: true
+          version: 1.0
+          function: src/hello.php
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
+        greetingpython-with-explicit-runtime:
+          web-export: true
+          version: 1.0
+          function: src/hello.py
+          runtime: python
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
+        greetingpython-without-explicit-runtime:
+          web-export: true
+          version: 1.0
+          function: src/hello.py
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
+        greetingpython2-with-explicit-runtime:
+          web-export: true
+          version: 1.0
+          function: src/hello.py
+          runtime: python:2
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
+        greetingpython3-with-explicit-runtime:
+          web-export: true
+          version: 1.0
+          function: src/hello.py
+          runtime: python:3
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
+        greetingswift311-with-explicit-runtime:
+          web-export: true
+          version: 1.0
+          function: src/hello.swift
+          runtime: swift:3.1.1
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
+        greetingswift3-with-explicit-runtime:
+          web-export: true
+          version: 1.0
+          function: src/hello.swift
+          runtime: swift:3
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
+        greetingswift-without-explicit-runtime:
+          web-export: true
+          version: 1.0
+          function: src/hello.swift
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
+        helloworldjava-with-explicit-runtime:
+          function: src/hello.jar
+          runtime: java
+          main: Hello
+        helloworldjava-without-explicit-runtime:
+          function: src/hello.jar
+          main: Hello
+      triggers:
+        locationUpdateRuntime:
+      rules:
+        myRuleRuntime:
+          trigger: locationUpdateRuntime
+          action:  greetingnodejs-with-explicit-runtime
 
diff --git a/tests/src/integration/triggerrule/manifest.yml b/tests/src/integration/triggerrule/manifest.yml
index 4a816b8..cc6015d 100644
--- a/tests/src/integration/triggerrule/manifest.yml
+++ b/tests/src/integration/triggerrule/manifest.yml
@@ -1,22 +1,22 @@
-package:
-  name: helloWorldTriggerRule
-  version: 1.0
-  license: Apache-2.0
-  actions:
-    greeting:
+packages:
+  helloWorldTriggerRule:
       version: 1.0
-      function: src/greeting.js
-      runtime: nodejs:6
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
-  triggers:
-    locationUpdateTriggerRule:
-  rules:
-    myRuleTriggerRule:
-      trigger: locationUpdateTriggerRule
-      #the action name and the action file greeting.js should consistent.
-      #currently the implementation decide the action name consistent with action file name?
-      action: greeting
+      license: Apache-2.0
+      actions:
+        greeting:
+          version: 1.0
+          function: src/greeting.js
+          runtime: nodejs:6
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
+      triggers:
+        locationUpdateTriggerRule:
+      rules:
+        myRuleTriggerRule:
+          trigger: locationUpdateTriggerRule
+          #the action name and the action file greeting.js should consistent.
+          #currently the implementation decide the action name consistent with action file name?
+          action: greeting
diff --git a/tests/src/integration/validate-manifest-deployment-file-extensions/manifest.yaml b/tests/src/integration/validate-manifest-deployment-file-extensions/manifest.yaml
index 2b9d55a..3ebc6ad 100644
--- a/tests/src/integration/validate-manifest-deployment-file-extensions/manifest.yaml
+++ b/tests/src/integration/validate-manifest-deployment-file-extensions/manifest.yaml
@@ -1,29 +1,29 @@
-package:
-  name: ValidateYAMLExtension
-  actions:
-    # helloworld action in NodeJS
-    helloworld:
-      function: actions/hello.js
-      runtime: nodejs:6
-      inputs:
-        name:
-          type: string
-          description: name of a person
-        place:
-          type: string
-          description: location of a person
-      outputs:
-        payload:
-          type: string
-          description: a simple greeting message, Hello World!
-  triggers:
-    # trigger to activate helloworld action
-    trigger-for-valid-manifest-yaml:
-  rules:
-    # rule associating trigger with helloworld action
-    rule-for-valid-manifest-yaml:
-      trigger: trigger-for-valid-manifest-yaml
-      action: helloworld
+packages:
+  ValidateYAMLExtension:
+      actions:
+        # helloworld action in NodeJS
+        helloworld:
+          function: actions/hello.js
+          runtime: nodejs:6
+          inputs:
+            name:
+              type: string
+              description: name of a person
+            place:
+              type: string
+              description: location of a person
+          outputs:
+            payload:
+              type: string
+              description: a simple greeting message, Hello World!
+      triggers:
+        # trigger to activate helloworld action
+        trigger-for-valid-manifest-yaml:
+      rules:
+        # rule associating trigger with helloworld action
+        rule-for-valid-manifest-yaml:
+          trigger: trigger-for-valid-manifest-yaml
+          action: helloworld
 
 
 
diff --git a/tests/src/integration/validate-manifest-deployment-file-extensions/manifest.yml b/tests/src/integration/validate-manifest-deployment-file-extensions/manifest.yml
index e7c1ddd..6c017c0 100644
--- a/tests/src/integration/validate-manifest-deployment-file-extensions/manifest.yml
+++ b/tests/src/integration/validate-manifest-deployment-file-extensions/manifest.yml
@@ -1,29 +1,29 @@
-package:
-  name: ValidateYMLExtension
-  actions:
-    # helloworld action in NodeJS
-    helloworld:
-      function: actions/hello.js
-      runtime: nodejs:6
-      inputs:
-        name:
-          type: string
-          description: name of a person
-        place:
-          type: string
-          description: location of a person
-      outputs:
-        payload:
-          type: string
-          description: a simple greeting message, Hello World!
-  triggers:
-    # trigger to activate helloworld action
-    trigger-for-valid-manifest-yml:
-  rules:
-    # rule associating trigger with helloworld action
-    rule-for-valid-manifest-yml:
-      trigger: trigger-for-valid-manifest-yml
-      action: helloworld
+packages:
+  ValidateYMLExtension:
+      actions:
+        # helloworld action in NodeJS
+        helloworld:
+          function: actions/hello.js
+          runtime: nodejs:6
+          inputs:
+            name:
+              type: string
+              description: name of a person
+            place:
+              type: string
+              description: location of a person
+          outputs:
+            payload:
+              type: string
+              description: a simple greeting message, Hello World!
+      triggers:
+        # trigger to activate helloworld action
+        trigger-for-valid-manifest-yml:
+      rules:
+        # rule associating trigger with helloworld action
+        rule-for-valid-manifest-yml:
+          trigger: trigger-for-valid-manifest-yml
+          action: helloworld
 
 
 
diff --git a/tests/src/integration/validate-manifest-deployment-file-extensions/not-standard-manifest.yaml b/tests/src/integration/validate-manifest-deployment-file-extensions/not-standard-manifest.yaml
index 06b0de7..4d5add3 100644
--- a/tests/src/integration/validate-manifest-deployment-file-extensions/not-standard-manifest.yaml
+++ b/tests/src/integration/validate-manifest-deployment-file-extensions/not-standard-manifest.yaml
@@ -1,29 +1,29 @@
-package:
-  name: ValidateNotStandardFileNames
-  actions:
-    # helloworld action in NodeJS
-    helloworld:
-      function: actions/hello.js
-      runtime: nodejs:6
-      inputs:
-        name:
-          type: string
-          description: name of a person
-        place:
-          type: string
-          description: location of a person
-      outputs:
-        payload:
-          type: string
-          description: a simple greeting message, Hello World!
-  triggers:
-    # trigger to activate helloworld action
-    trigger-for-not-standard-file-names:
-  rules:
-    # rule associating trigger with helloworld action
-    rule-for-not-standard-file-names:
-      trigger: trigger-for-not-standard-file-names
-      action: helloworld
+packages:
+  ValidateNotStandardFileNames:
+      actions:
+        # helloworld action in NodeJS
+        helloworld:
+          function: actions/hello.js
+          runtime: nodejs:6
+          inputs:
+            name:
+              type: string
+              description: name of a person
+            place:
+              type: string
+              description: location of a person
+          outputs:
+            payload:
+              type: string
+              description: a simple greeting message, Hello World!
+      triggers:
+        # trigger to activate helloworld action
+        trigger-for-not-standard-file-names:
+      rules:
+        # rule associating trigger with helloworld action
+        rule-for-not-standard-file-names:
+          trigger: trigger-for-not-standard-file-names
+          action: helloworld
 
 
 
diff --git a/tests/src/integration/validate-manifest-deployment-file-extensions/random-name-1.yaml b/tests/src/integration/validate-manifest-deployment-file-extensions/random-name-1.yaml
index c4d7edc..302f2ff 100644
--- a/tests/src/integration/validate-manifest-deployment-file-extensions/random-name-1.yaml
+++ b/tests/src/integration/validate-manifest-deployment-file-extensions/random-name-1.yaml
@@ -1,29 +1,29 @@
-package:
-  name: ValidateRandomFileNames
-  actions:
-    # helloworld action in NodeJS
-    helloworld:
-      function: actions/hello.js
-      runtime: nodejs:6
-      inputs:
-        name:
-          type: string
-          description: name of a person
-        place:
-          type: string
-          description: location of a person
-      outputs:
-        payload:
-          type: string
-          description: a simple greeting message, Hello World!
-  triggers:
-    # trigger to activate helloworld action
-    trigger-for-random-file-names:
-  rules:
-    # rule associating trigger with helloworld action
-    rule-for-random-file-names:
-      trigger: trigger-for-random-file-names
-      action: helloworld
+packages:
+  ValidateRandomFileNames:
+      actions:
+        # helloworld action in NodeJS
+        helloworld:
+          function: actions/hello.js
+          runtime: nodejs:6
+          inputs:
+            name:
+              type: string
+              description: name of a person
+            place:
+              type: string
+              description: location of a person
+          outputs:
+            payload:
+              type: string
+              description: a simple greeting message, Hello World!
+      triggers:
+        # trigger to activate helloworld action
+        trigger-for-random-file-names:
+      rules:
+        # rule associating trigger with helloworld action
+        rule-for-random-file-names:
+          trigger: trigger-for-random-file-names
+          action: helloworld
 
 
 
diff --git a/tests/src/integration/validate-manifest-deployment-file-extensions/yaml-manifest-with-yml-deployment.yaml b/tests/src/integration/validate-manifest-deployment-file-extensions/yaml-manifest-with-yml-deployment.yaml
index 99c1497..d0d62ea 100644
--- a/tests/src/integration/validate-manifest-deployment-file-extensions/yaml-manifest-with-yml-deployment.yaml
+++ b/tests/src/integration/validate-manifest-deployment-file-extensions/yaml-manifest-with-yml-deployment.yaml
@@ -1,29 +1,29 @@
-package:
-  name: ValidateYAMLManifestWithYMLDeployment
-  actions:
-    # helloworld action in NodeJS
-    helloworld:
-      function: actions/hello.js
-      runtime: nodejs:6
-      inputs:
-        name:
-          type: string
-          description: name of a person
-        place:
-          type: string
-          description: location of a person
-      outputs:
-        payload:
-          type: string
-          description: a simple greeting message, Hello World!
-  triggers:
-    # trigger to activate helloworld action
-    trigger-for-yaml-manifest-yml-deployment:
-  rules:
-    # rule associating trigger with helloworld action
-    rule-for-yaml-manifest-yml-deployment:
-      trigger: trigger-for-yaml-manifest-yml-deployment
-      action: helloworld
+packages:
+  ValidateYAMLManifestWithYMLDeployment:
+      actions:
+        # helloworld action in NodeJS
+        helloworld:
+          function: actions/hello.js
+          runtime: nodejs:6
+          inputs:
+            name:
+              type: string
+              description: name of a person
+            place:
+              type: string
+              description: location of a person
+          outputs:
+            payload:
+              type: string
+              description: a simple greeting message, Hello World!
+      triggers:
+        # trigger to activate helloworld action
+        trigger-for-yaml-manifest-yml-deployment:
+      rules:
+        # rule associating trigger with helloworld action
+        rule-for-yaml-manifest-yml-deployment:
+          trigger: trigger-for-yaml-manifest-yml-deployment
+          action: helloworld
 
 
 
diff --git a/tests/src/integration/validate-manifest-deployment-file-extensions/yml-manifest-with-yaml-deployment.yml b/tests/src/integration/validate-manifest-deployment-file-extensions/yml-manifest-with-yaml-deployment.yml
index 7631ae9..730be63 100644
--- a/tests/src/integration/validate-manifest-deployment-file-extensions/yml-manifest-with-yaml-deployment.yml
+++ b/tests/src/integration/validate-manifest-deployment-file-extensions/yml-manifest-with-yaml-deployment.yml
@@ -1,29 +1,29 @@
-package:
-  name: ValidateYMLManifestWithYAMLDeployment
-  actions:
-    # helloworld action in NodeJS
-    helloworld:
-      function: actions/hello.js
-      runtime: nodejs:6
-      inputs:
-        name:
-          type: string
-          description: name of a person
-        place:
-          type: string
-          description: location of a person
-      outputs:
-        payload:
-          type: string
-          description: a simple greeting message, Hello World!
-  triggers:
-    # trigger to activate helloworld action
-    trigger-for-yml-manifest-yaml-deployment:
-  rules:
-    # rule associating trigger with helloworld action
-    rule-for-yml-manifest-yaml-deployment:
-      trigger: trigger-for-yml-manifest-yaml-deployment
-      action: helloworld
+packages:
+  ValidateYMLManifestWithYAMLDeployment:
+      actions:
+        # helloworld action in NodeJS
+        helloworld:
+          function: actions/hello.js
+          runtime: nodejs:6
+          inputs:
+            name:
+              type: string
+              description: name of a person
+            place:
+              type: string
+              description: location of a person
+          outputs:
+            payload:
+              type: string
+              description: a simple greeting message, Hello World!
+      triggers:
+        # trigger to activate helloworld action
+        trigger-for-yml-manifest-yaml-deployment:
+      rules:
+        # rule associating trigger with helloworld action
+        rule-for-yml-manifest-yaml-deployment:
+          trigger: trigger-for-yml-manifest-yaml-deployment
+          action: helloworld
 
 
 
diff --git a/tests/src/integration/validatePackageInDeployment/manifest.yaml b/tests/src/integration/validatePackageInDeployment/manifest.yaml
index ff59483..43e5507 100644
--- a/tests/src/integration/validatePackageInDeployment/manifest.yaml
+++ b/tests/src/integration/validatePackageInDeployment/manifest.yaml
@@ -1,12 +1,12 @@
-package:
-  name: TestPackageInDeploymentFile
-  actions:
-    helloworld:
-      function: actions/helloworld.js
-      runtime: nodejs:6
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
+packages:
+  TestPackageInDeploymentFile:
+      actions:
+        helloworld:
+          function: actions/helloworld.js
+          runtime: nodejs:6
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
 
diff --git a/tests/src/integration/validatePackagesInDeployment/manifest.yaml b/tests/src/integration/validatePackagesInDeployment/manifest.yaml
index 30918df..7b7a914 100644
--- a/tests/src/integration/validatePackagesInDeployment/manifest.yaml
+++ b/tests/src/integration/validatePackagesInDeployment/manifest.yaml
@@ -1,12 +1,12 @@
-package:
-  name: TestPackagesInDeploymentFile
-  actions:
-    helloworld:
-      function: actions/helloworld.js
-      runtime: nodejs:6
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
+packages:
+  TestPackagesInDeploymentFile:
+      actions:
+        helloworld:
+          function: actions/helloworld.js
+          runtime: nodejs:6
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
 
diff --git a/tests/src/integration/webaction/manifest.yml b/tests/src/integration/webaction/manifest.yml
index 6db70f5..5d71023 100644
--- a/tests/src/integration/webaction/manifest.yml
+++ b/tests/src/integration/webaction/manifest.yml
@@ -1,20 +1,20 @@
-package:
-  name: IntegrationTestWebAction
-  actions:
-    greeting:
-      web-export: true
-      version: 1.0
-      function: src/greeting.js
-      runtime: nodejs:6
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
-  triggers:
-    webActionTrigger:
-  rules:
-    webActionRule:
-      trigger: webActionTrigger
-      action: greeting
+packages:
+  IntegrationTestWebAction:
+      actions:
+        greeting:
+          web-export: true
+          version: 1.0
+          function: src/greeting.js
+          runtime: nodejs:6
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
+      triggers:
+        webActionTrigger:
+      rules:
+        webActionRule:
+          trigger: webActionTrigger
+          action: greeting
 
diff --git a/tests/src/integration/zipaction/manifest.yml b/tests/src/integration/zipaction/manifest.yml
index 84ec973..2118227 100644
--- a/tests/src/integration/zipaction/manifest.yml
+++ b/tests/src/integration/zipaction/manifest.yml
@@ -1,15 +1,15 @@
-package:
-  name: zipaction
-  version: 1.0
-  license: Apache-2.0
-  actions:
-    cat:
+packages:
+  zipaction:
       version: 1.0
-      function: actions/cat
-      runtime: nodejs:6
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
+      license: Apache-2.0
+      actions:
+        cat:
+          version: 1.0
+          function: actions/cat
+          runtime: nodejs:6
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
 
diff --git a/tests/usecases/api-gateway/simple_api_manifest.yaml b/tests/usecases/api-gateway/simple_api_manifest.yaml
index e8967a2..eb3d042 100644
--- a/tests/usecases/api-gateway/simple_api_manifest.yaml
+++ b/tests/usecases/api-gateway/simple_api_manifest.yaml
@@ -1,11 +1,11 @@
-package:
-  name: whiskbot
-  version: 1.0
-  license: Apache-2.0
-  actions:
-      fire:
-        function: actions/fire/index.js
-        inputs:
-          triggerName: trgger1
-          type: string
-        exposedUrl: post/whiskbot/slack-event/
+packages:
+  whiskbot:
+      version: 1.0
+      license: Apache-2.0
+      actions:
+          fire:
+            function: actions/fire/index.js
+            inputs:
+              triggerName: trgger1
+              type: string
+            exposedUrl: post/whiskbot/slack-event/
diff --git a/tests/usecases/badyaml/manifest.yaml b/tests/usecases/badyaml/manifest.yaml
index c12a74e..a678510 100644
--- a/tests/usecases/badyaml/manifest.yaml
+++ b/tests/usecases/badyaml/manifest.yaml
@@ -1,8 +1,8 @@
-package:
-  name: kafka
-  version: 1.0
-  license: Apache-2.0
-  inputs:
-  api_key: string
-    kafka_rest_url: string
-    topic: string
\ No newline at end of file
+packages:
+  kafka:
+      version: 1.0
+      license: Apache-2.0
+      inputs:
+      api_key: string
+        kafka_rest_url: string
+        topic: string
diff --git a/tests/usecases/dependency/manifest.yaml b/tests/usecases/dependency/manifest.yaml
index dad9bb0..bb622cc 100644
--- a/tests/usecases/dependency/manifest.yaml
+++ b/tests/usecases/dependency/manifest.yaml
@@ -1,25 +1,25 @@
-package:
-  name: opentest
-  dependencies:
-    hellowhisk:
-      location: github.com/apache/incubator-openwhisk-test/packages/hellowhisk
-    myhelloworlds:
-      location: github.com/apache/incubator-openwhisk-test/packages/helloworlds
-    myCloudant:
-      location: /whisk.system/cloudant
-      inputs:
-        dbname: myGreatDB
-      annotations:
-        myAnnotation: Here it is
-  sequences:
-    mySequence:
-      actions: hellowhisk/greeting, hellowhisk/httpGet, myhelloworlds/hello-js
-  triggers:
-    myTrigger:
-  rules:
-    myRule:
-      trigger: myTrigger
-      action: hellowhisk/httpGet
-    myCloudantRule:
-      trigger: myTrigger
-      action: myCloudant/create-database
+packages:
+  opentest:
+      dependencies:
+        hellowhisk:
+          location: github.com/apache/incubator-openwhisk-test/packages/hellowhisk
+        myhelloworlds:
+          location: github.com/apache/incubator-openwhisk-test/packages/helloworlds
+        myCloudant:
+          location: /whisk.system/cloudant
+          inputs:
+            dbname: myGreatDB
+          annotations:
+            myAnnotation: Here it is
+      sequences:
+        mySequence:
+          actions: hellowhisk/greeting, hellowhisk/httpGet, myhelloworlds/hello-js
+      triggers:
+        myTrigger:
+      rules:
+        myRule:
+          trigger: myTrigger
+          action: hellowhisk/httpGet
+        myCloudantRule:
+          trigger: myTrigger
+          action: myCloudant/create-database
diff --git a/tests/usecases/github/manifest.yaml b/tests/usecases/github/manifest.yaml
index fba48ba..c0c2bc3 100644
--- a/tests/usecases/github/manifest.yaml
+++ b/tests/usecases/github/manifest.yaml
@@ -1,13 +1,13 @@
-package:
-    name: GitHubCommits
-    actions:
-        print-github-commits:
-            location: src/print-github-commits.js
-            runtime: nodejs:6
-    triggers:
-        GitHubWebhookTrigger:
-            feed: /whisk.system/github/webhook
-    rules:
-        rule-for-github-commits:
-            action: print-github-commits
-            trigger: GitHubWebhookTrigger
+packages:
+    GitHubCommits:
+        actions:
+            print-github-commits:
+                location: src/print-github-commits.js
+                runtime: nodejs:6
+        triggers:
+            GitHubWebhookTrigger:
+                feed: /whisk.system/github/webhook
+        rules:
+            rule-for-github-commits:
+                action: print-github-commits
+                trigger: GitHubWebhookTrigger
diff --git a/tests/usecases/slack/manifest.yaml b/tests/usecases/slack/manifest.yaml
index 63ab31e..9c65745 100644
--- a/tests/usecases/slack/manifest.yaml
+++ b/tests/usecases/slack/manifest.yaml
@@ -1,28 +1,28 @@
-package:
-    name: SlackPackage
-    dependencies:
-        slack-package-to-post-messages:
-            location: /whisk.system/slack
-            inputs:
-                username: $SLACK_USERNAME
-                url: $SLACK_URL
-                channel: $SLACK_CHANNEL
-    actions:
-        post-to-slack:
-            function: actions/post-to-slack.js
-            runtime: nodejs:6
-            inputs:
-                message:
-                    type: string
-                    description: message to post on slack
-                slack_package:
-                    type: string
-                    description: slack package name
-    triggers:
-        everyhour:
-            feed: /whisk.system/alarms/alarm
-    rules:
-        post-to-slack-every-hour:
-            action: post-to-slack
-            trigger: everyhour
+packages:
+    SlackPackage:
+        dependencies:
+            slack-package-to-post-messages:
+                location: /whisk.system/slack
+                inputs:
+                    username: $SLACK_USERNAME
+                    url: $SLACK_URL
+                    channel: $SLACK_CHANNEL
+        actions:
+            post-to-slack:
+                function: actions/post-to-slack.js
+                runtime: nodejs:6
+                inputs:
+                    message:
+                        type: string
+                        description: message to post on slack
+                    slack_package:
+                        type: string
+                        description: slack package name
+        triggers:
+            everyhour:
+                feed: /whisk.system/alarms/alarm
+        rules:
+            post-to-slack-every-hour:
+                action: post-to-slack
+                trigger: everyhour
 
diff --git a/tests/usecases/triggerrule/manifest.yml b/tests/usecases/triggerrule/manifest.yml
index 43615f2..57bc430 100644
--- a/tests/usecases/triggerrule/manifest.yml
+++ b/tests/usecases/triggerrule/manifest.yml
@@ -1,21 +1,21 @@
-package:
-  name: triggerrule
-  version: 1.0
-  license: Apache-2.0
-  actions:
-    greeting:
+packages:
+  triggerrule:
       version: 1.0
-      function: src/greeting.js
-      runtime: nodejs:6
-      inputs:
-        name: string
-        place: string
-      outputs:
-        payload: string
-  triggers:
-    locationUpdate:
-  rules:
-    myRule:
-      trigger: locationUpdate
-      action: greeting
+      license: Apache-2.0
+      actions:
+        greeting:
+          version: 1.0
+          function: src/greeting.js
+          runtime: nodejs:6
+          inputs:
+            name: string
+            place: string
+          outputs:
+            payload: string
+      triggers:
+        locationUpdate:
+      rules:
+        myRule:
+          trigger: locationUpdate
+          action: greeting
 

-- 
To stop receiving notification emails like this one, please contact
['"commits@openwhisk.apache.org" <co...@openwhisk.apache.org>'].