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

pdesai 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 f310a24  Fixes export project with feed bug (#1052)
f310a24 is described below

commit f310a2400875174b3de2d5cbd0b40176def2feb1
Author: Pavel Kravchenko <kpa...@il.ibm.com>
AuthorDate: Wed May 1 00:57:22 2019 +0300

    Fixes export project with feed bug (#1052)
    
    Added test validating export trigger with feed action
---
 cmd/export.go                                   | 23 ++++++---
 tests/src/integration/common/wskdeploy.go       | 10 ++++
 tests/src/integration/export/export_test.go     | 62 +++++++++++++++++++++----
 tests/src/integration/export/manifest_feed.yaml | 15 ++++++
 4 files changed, 94 insertions(+), 16 deletions(-)

diff --git a/cmd/export.go b/cmd/export.go
index 5e5db05..a91d77d 100644
--- a/cmd/export.go
+++ b/cmd/export.go
@@ -216,12 +216,19 @@ func exportProject(projectName string, targetManifest 
string) error {
                                                // export trigger to manifest
 
                                                if feedname, isFeed := 
utils.IsFeedAction(&trg); isFeed {
-                                                       // export feed input 
parameters
-                                                       feedAction, _, _ := 
client.Actions.Get(feedname, true)
-                                                       if err != nil {
-                                                               return err
+                                                       // check if feed name 
starts with namespace and workaround it
+                                                       // the current problem 
is that client has user namespace and when feed specified with different 
namespace it will fail to invoke the feed action
+                                                       // we need to transform 
the path from e.g.
+                                                       // 
/api/v1/namespaces/kpa...@il.ibm.com_uspace/actions//whisk.system/alarms/interval?blocking=true
+                                                       // in to
+                                                       // 
/api/v1/namespaces/kpa...@il.ibm.com_uspace/actions/../../whisk.system/actions/alarms/interval?blocking=true
+                                                       if 
strings.HasPrefix(feedname, "/") {
+                                                               //  
/whisk.system/alarms/interval  ->  ../../whisk.system/actions/alarms/interval
+                                                               prts := 
strings.SplitN(feedname, "/", 3)
+                                                               feedname = 
"../../" + prts[1] + "/actions/" + prts[2]
                                                        }
 
+                                                       // export feed input 
parameters
                                                        params := 
make(map[string]interface{})
                                                        params["authKey"] = 
client.Config.AuthToken
                                                        
params["lifecycleEvent"] = "READ"
@@ -231,10 +238,12 @@ func exportProject(projectName string, targetManifest 
string) error {
                                                                return err
                                                        }
                                                        feedConfig := 
res["config"]
-                                                       for key, val := range 
feedConfig.(map[string]interface{}) {
 
-                                                               if i := 
feedAction.Parameters.FindKeyValue(key); i >= 0 {
-                                                                       
trg.Parameters = trg.Parameters.AddOrReplace(&whisk.KeyValue{Key: key, Value: 
val})
+                                                       if feedConfig != nil {
+                                                               for key, val := 
range feedConfig.(map[string]interface{}) {
+                                                                       if key 
!= "startDate" {
+                                                                               
trg.Parameters = trg.Parameters.AddOrReplace(&whisk.KeyValue{Key: key, Value: 
val})
+                                                                       }
                                                                }
                                                        }
                                                }
diff --git a/tests/src/integration/common/wskdeploy.go 
b/tests/src/integration/common/wskdeploy.go
index 5dddf56..b072a52 100644
--- a/tests/src/integration/common/wskdeploy.go
+++ b/tests/src/integration/common/wskdeploy.go
@@ -177,6 +177,11 @@ func (Wskdeploy *Wskdeploy) 
ManagedDeploymentManifestAndProject(manifestPath str
        return Wskdeploy.RunCommand("sync", "-m", manifestPath, 
"--projectname", projectName)
 }
 
+func (Wskdeploy *Wskdeploy) 
ManagedDeploymentManifestAndProjectWithCredentials(manifestPath string, 
projectName string, wskprops *whisk.Wskprops) (string, error) {
+       return Wskdeploy.RunCommand("sync", "-m", manifestPath, 
"--projectname", projectName, "--auth", wskprops.AuthKey,
+               "--namespace", wskprops.Namespace, "--apihost", 
wskprops.APIHost, "--apiversion", wskprops.Apiversion)
+}
+
 func (Wskdeploy *Wskdeploy) ManagedDeployment(manifestPath string, 
deploymentPath string) (string, error) {
        return Wskdeploy.RunCommand("sync", "-m", manifestPath, "-d", 
deploymentPath)
 }
@@ -189,6 +194,11 @@ func (wskdeploy *Wskdeploy) ExportProject(projectName 
string, targetManifestPath
        return wskdeploy.RunCommand("export", "-m", targetManifestPath, 
"--projectname", projectName)
 }
 
+func (wskdeploy *Wskdeploy) ExportProjectWithCredentials(projectName string, 
targetManifestPath string, wskprops *whisk.Wskprops) (string, error) {
+       return wskdeploy.RunCommand("export", "-m", targetManifestPath, 
"--projectname", projectName, "--auth", wskprops.AuthKey,
+               "--namespace", wskprops.Namespace, "--apihost", 
wskprops.APIHost, "--apiversion", wskprops.Apiversion)
+}
+
 // This method is only for testing
 // This method will mock a construction of deployment plan, creating all the 
memory objects
 // This method CANNOT be used for real deployment!
diff --git a/tests/src/integration/export/export_test.go 
b/tests/src/integration/export/export_test.go
index 7bc2ccc..650ee81 100644
--- a/tests/src/integration/export/export_test.go
+++ b/tests/src/integration/export/export_test.go
@@ -25,6 +25,7 @@ import (
        "os"
        "strconv"
        "testing"
+       "time"
 
        
"github.com/apache/incubator-openwhisk-wskdeploy/tests/src/integration/common"
        "github.com/stretchr/testify/assert"
@@ -44,8 +45,6 @@ func TestExport(t *testing.T) {
 
        wskdeploy := common.NewWskdeploy()
 
-       defer os.RemoveAll(targetManifestFolder)
-
        _, err := wskdeploy.ManagedDeploymentOnlyManifest(manifestLib1Path)
        assert.Equal(t, nil, err, "Failed to deploy the lib1 manifest file.")
 
@@ -55,6 +54,8 @@ func TestExport(t *testing.T) {
        _, err = wskdeploy.ManagedDeploymentOnlyManifest(manifestExtPath)
        assert.Equal(t, nil, err, "Failed to deploy the ext manifest file.")
 
+       time.Sleep(2 * time.Second) // should it sleep for few seconds before 
export?!
+
        _, err = wskdeploy.ExportProject(projectName, targetManifestPath)
        assert.Equal(t, nil, err, "Failed to export project.")
 
@@ -75,6 +76,7 @@ func TestExport(t *testing.T) {
 
        _, err = wskdeploy.UndeployManifestPathOnly(manifestLib1Path)
        assert.Equal(t, nil, err, "Failed to undeploy the lib2.")
+       os.RemoveAll(targetManifestFolder)
 }
 
 func SkipTestExportHelloWorld(t *testing.T) {
@@ -83,8 +85,6 @@ func SkipTestExportHelloWorld(t *testing.T) {
        targetManifestFolder := os.Getenv("GOPATH") + EXPORT_TEST_PATH + "tmp-" 
+ strconv.Itoa(rand.Intn(1000)) + "/"
        targetManifestHelloWorldPath := targetManifestFolder + "manifest-" + 
projectName + ".yaml"
 
-       defer os.RemoveAll(targetManifestFolder)
-
        wskdeploy := common.NewWskdeploy()
 
        _, err := 
wskdeploy.ManagedDeploymentManifestAndProject(manifestHelloWorldPath, 
projectName)
@@ -112,6 +112,8 @@ func SkipTestExportHelloWorld(t *testing.T) {
                _, err = 
wskdeploy.UndeployManifestPathOnly(targetManifestHelloWorldPath)
                assert.Equal(t, nil, err, "Failed to undeploy exported project")
        }
+
+       os.RemoveAll(targetManifestFolder)
 }
 
 func TestExport2Pack(t *testing.T) {
@@ -119,14 +121,13 @@ func TestExport2Pack(t *testing.T) {
        targetManifestFolder := os.Getenv("GOPATH") + EXPORT_TEST_PATH + "tmp-" 
+ strconv.Itoa(rand.Intn(1000)) + "/"
        target2PackManifestPath := targetManifestFolder + 
"exported2packmanifest.yaml"
 
-       defer os.RemoveAll(targetManifestFolder)
-
        projectName := "2pack"
        wskdeploy := common.NewWskdeploy()
 
        _, err := wskdeploy.ManagedDeploymentOnlyManifest(manifest2PackPath)
        assert.Equal(t, nil, err, "Failed to deploy the 2pack manifest file.")
 
+       time.Sleep(2 * time.Second) // should it sleep for few seconds before 
export?!
        _, err = wskdeploy.ExportProject(projectName, target2PackManifestPath)
        assert.Equal(t, nil, err, "Failed to export project.")
 
@@ -141,21 +142,22 @@ func TestExport2Pack(t *testing.T) {
 
        _, err = wskdeploy.UndeployManifestPathOnly(manifest2PackPath)
        assert.Equal(t, nil, err, "Failed to undeploy")
+
+       os.RemoveAll(targetManifestFolder)
 }
 
 func TestExportApi(t *testing.T) {
        projectName := "ApiExp"
        wskdeploy := common.NewWskdeploy()
 
-       defer os.RemoveAll(targetManifestFolder)
-
        _, err := 
wskdeploy.ManagedDeploymentManifestAndProject(manifestApiExpPath, projectName)
        assert.Equal(t, nil, err, "Failed to deploy the ApiExp manifest file.")
 
+       time.Sleep(2 * time.Second) // should it sleep for few seconds before 
export?!
        _, err = wskdeploy.ExportProject(projectName, targetApiExpManifestPath)
        assert.Equal(t, nil, err, "Failed to export project.")
 
-       _, err = os.Stat(manifestApiExpPath)
+       _, err = os.Stat(targetApiExpManifestPath)
        assert.Equal(t, nil, err, "Missing exported manifest file")
 
        _, err = os.Stat(targetManifestFolder + "api-gateway-test/greeting.js")
@@ -169,6 +171,45 @@ func TestExportApi(t *testing.T) {
 
        _, err = wskdeploy.UndeployManifestPathOnly(targetApiExpManifestPath)
        assert.Equal(t, nil, err, "Failed to undeploy the exported manifest 
file")
+
+       os.RemoveAll(targetManifestFolder)
+}
+
+func TestExportTriggerFeed(t *testing.T) {
+       projectName := "FeedExp"
+
+       wskprops := common.GetWskpropsFromEnvVars(common.BLUEMIX_APIHOST, 
common.BLUEMIX_NAMESPACE, common.BLUEMIX_AUTH)
+       err := common.ValidateWskprops(wskprops)
+       if err != nil {
+               fmt.Println(err.Error())
+               fmt.Println("Wsk properties are not properly configured, so 
tests are skipped.")
+       } else {
+               wskdeploy := common.NewWskdeploy()
+
+               _, err = 
wskdeploy.ManagedDeploymentManifestAndProjectWithCredentials(manifestFeedExpPath,
 projectName, wskprops)
+               assert.Equal(t, nil, err, "Failed to deploy the FeedExp 
manifest file.")
+
+               time.Sleep(2 * time.Second) // should it sleep for few seconds 
before export?!
+               _, err = wskdeploy.ExportProjectWithCredentials(projectName, 
targetFeedExpManifestPath, wskprops)
+               assert.Equal(t, nil, err, "Failed to export project with 
trigger feed.")
+
+               _, err = os.Stat(targetFeedExpManifestPath)
+               assert.Equal(t, nil, err, "Missing exported manifest file")
+
+               _, err = os.Stat(targetManifestFolder + 
"trigger-feed-test/greeting.js")
+               assert.Equal(t, nil, err, "Missing exported 
trigger-feed-test/greeting.js")
+
+               _, err = 
wskdeploy.UndeployWithCredentials(targetFeedExpManifestPath, 
manifestFeedExpPath, wskprops)
+               assert.Equal(t, nil, err, "Failed to undeploy manifest feed")
+
+               _, err = 
wskdeploy.ManagedDeploymentManifestAndProjectWithCredentials(manifestFeedExpPath,
 projectName, wskprops)
+               assert.Equal(t, nil, err, "Failed to redeploy the exported 
manifest file.")
+
+               _, err = 
wskdeploy.UndeployWithCredentials(targetFeedExpManifestPath, 
manifestFeedExpPath, wskprops)
+               assert.Equal(t, nil, err, "Failed to undeploy the exported 
manifest file")
+       }
+
+       os.RemoveAll(targetManifestFolder)
 }
 
 var (
@@ -184,4 +225,7 @@ var (
 
        manifestApiExpPath       = os.Getenv("GOPATH") + 
"/src/github.com/apache/incubator-openwhisk-wskdeploy/tests/src/integration/export/manifest_apiexp.yaml"
        targetApiExpManifestPath = targetManifestFolder + 
"exportedapimanifest.yaml"
+
+       manifestFeedExpPath       = os.Getenv("GOPATH") + 
"/src/github.com/apache/incubator-openwhisk-wskdeploy/tests/src/integration/export/manifest_feed.yaml"
+       targetFeedExpManifestPath = targetManifestFolder + 
"exportedfeedmanifest.yaml"
 )
diff --git a/tests/src/integration/export/manifest_feed.yaml 
b/tests/src/integration/export/manifest_feed.yaml
new file mode 100644
index 0000000..6519166
--- /dev/null
+++ b/tests/src/integration/export/manifest_feed.yaml
@@ -0,0 +1,15 @@
+# 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:
+  trigger-feed-test:
+    version: 1.0
+    license: Apache-2.0
+    actions:
+      greeting:
+        function: src/greeting.js
+        runtime: nodejs:6
+    triggers:
+      test_alarm_trigger:
+        feed: /whisk.system/alarms/interval
+        inputs:
+          minutes: 1

Reply via email to