From f415f21aff0379e0feac8e6dc2cffd4f8b53fc11 Mon Sep 17 00:00:00 2001 From: kpavel Date: Mon, 22 Apr 2019 07:28:53 -0400 Subject: [PATCH] Fixes export project with feed bug 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 ++++++++++++++++--- .../src/integration/export/manifest_feed.yaml | 15 +++++ 4 files changed, 94 insertions(+), 16 deletions(-) create mode 100644 tests/src/integration/export/manifest_feed.yaml diff --git a/cmd/export.go b/cmd/export.go index 5e5db0550..a91d77d59 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/kpavel@il.ibm.com_uspace/actions//whisk.system/alarms/interval?blocking=true + // in to + // /api/v1/namespaces/kpavel@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 5dddf5632..b072a52b0 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 7bc2ccc37..650ee81c7 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 000000000..651916674 --- /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