This is an automated email from the ASF dual-hosted git repository. mrutkowski pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk-wskdeploy.git
The following commit(s) were added to refs/heads/master by this push: new 15482e0 Adding message hub test back (#675) 15482e0 is described below commit 15482e0a54914fae1e6c7f4656925827d53e55cd Author: Priti Desai <pde...@us.ibm.com> AuthorDate: Sun Dec 24 08:40:01 2017 -0800 Adding message hub test back (#675) * Adding message hub test back Also, added response body and status in WhiskClientError * Updating unit test --- deployers/servicedeployer.go | 333 +++++++++++----------- tests/src/integration/message-hub/deployment.yaml | 2 +- tests/src/integration/message-hub/manifest.yaml | 4 +- wskderrors/wskdeployerror.go | 13 +- wskderrors/wskdeployerror_test.go | 2 +- 5 files changed, 189 insertions(+), 165 deletions(-) diff --git a/deployers/servicedeployer.go b/deployers/servicedeployer.go index 9b33c8a..5b2cf0c 100644 --- a/deployers/servicedeployer.go +++ b/deployers/servicedeployer.go @@ -22,24 +22,25 @@ import ( "fmt" "os" "path" + "reflect" "strconv" "strings" "sync" - "reflect" "time" "github.com/apache/incubator-openwhisk-client-go/whisk" "github.com/apache/incubator-openwhisk-wskdeploy/parsers" "github.com/apache/incubator-openwhisk-wskdeploy/utils" - "github.com/apache/incubator-openwhisk-wskdeploy/wski18n" "github.com/apache/incubator-openwhisk-wskdeploy/wskderrors" + "github.com/apache/incubator-openwhisk-wskdeploy/wski18n" + "net/http" ) const ( - CONFLICT_CODE = 153 - CONFLICT_MESSAGE = "Concurrent modification to resource detected" - DEFAULT_ATTEMPTS = 3 - DEFAULT_INTERVAL = 1 * time.Second + CONFLICT_CODE = 153 + CONFLICT_MESSAGE = "Concurrent modification to resource detected" + DEFAULT_ATTEMPTS = 3 + DEFAULT_INTERVAL = 1 * time.Second ) type DeploymentProject struct { @@ -80,7 +81,7 @@ func NewDeploymentPackage() *DeploymentPackage { // 3. Collect information about the source code files in the working directory // 4. Create a deployment plan to create OpenWhisk service type ServiceDeployer struct { - ProjectName string + ProjectName string Deployment *DeploymentProject Client *whisk.Client mt sync.RWMutex @@ -95,7 +96,7 @@ type ServiceDeployer struct { InteractiveChoice bool ClientConfig *whisk.Config DependencyMaster map[string]utils.DependencyRecord - ManagedAnnotation whisk.KeyValue + ManagedAnnotation whisk.KeyValue } // NewServiceDeployer is a Factory to create a new ServiceDeployer @@ -510,15 +511,15 @@ func (deployer *ServiceDeployer) RefreshManagedActions(packageName string, ma ma // that this action is deleted from the project in manifest file if aa[utils.OW_PROJECT_NAME] == ma[utils.OW_PROJECT_NAME] && aa[utils.OW_PROJECT_HASH] != ma[utils.OW_PROJECT_HASH] { actionName := strings.Join([]string{packageName, action.Name}, "/") - output := wski18n.T("Found the action {{.action}} which is deleted" + + output := wski18n.T("Found the action {{.action}} which is deleted"+ " from the current project {{.project}} in manifest file which is being undeployed.\n", map[string]interface{}{"action": actionName, "project": aa[utils.OW_PROJECT_NAME]}) whisk.Debug(whisk.DbgInfo, output) - var err error - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, err := deployer.Client.Actions.Delete(actionName) - return err - }) + var err error + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + _, err := deployer.Client.Actions.Delete(actionName) + return err + }) if err != nil { return err @@ -547,15 +548,15 @@ func (deployer *ServiceDeployer) RefreshManagedTriggers(ma map[string]interface{ ta := a.(map[string]interface{}) if ta[utils.OW_PROJECT_NAME] == ma[utils.OW_PROJECT_NAME] && ta[utils.OW_PROJECT_HASH] != ma[utils.OW_PROJECT_HASH] { // we have found a trigger which was earlier part of the current project - output := wski18n.T("Found the trigger {{.trigger}} which is deleted" + + output := wski18n.T("Found the trigger {{.trigger}} which is deleted"+ " from the current project {{.project}} in manifest file which is being undeployed.\n", map[string]interface{}{"trigger": trigger.Name, "project": ma[utils.OW_PROJECT_NAME]}) whisk.Debug(whisk.DbgInfo, output) - var err error - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, _, err := deployer.Client.Triggers.Delete(trigger.Name) - return err - }) + var err error + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + _, _, err := deployer.Client.Triggers.Delete(trigger.Name) + return err + }) if err != nil { return err @@ -592,16 +593,16 @@ func (deployer *ServiceDeployer) RefreshManagedPackages(ma map[string]interface{ return err } // we have found a package which was earlier part of the current project - if pa[utils.OW_PROJECT_NAME] == ma[utils.OW_PROJECT_NAME] && pa[utils.OW_PROJECT_HASH] != ma[utils.OW_PROJECT_HASH] { - output := wski18n.T("Found the package {{.package}} which is deleted" + + if pa[utils.OW_PROJECT_NAME] == ma[utils.OW_PROJECT_NAME] && pa[utils.OW_PROJECT_HASH] != ma[utils.OW_PROJECT_HASH] { + output := wski18n.T("Found the package {{.package}} which is deleted"+ " from the current project {{.project}} in manifest file which is being undeployed.\n", map[string]interface{}{"package": pkg.Name, "project": pa[utils.OW_PROJECT_NAME]}) whisk.Debug(whisk.DbgInfo, output) - var err error - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, err := deployer.Client.Packages.Delete(pkg.Name) - return err - }) + var err error + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + _, err := deployer.Client.Packages.Delete(pkg.Name) + return err + }) if err != nil { return err @@ -697,18 +698,20 @@ func (deployer *ServiceDeployer) createBinding(packa *whisk.BindingPackage) erro output := wski18n.T("Deploying package binding {{.output}} ...", map[string]interface{}{"output": packa.Name}) whisk.Debug(whisk.DbgInfo, output) - var err error - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, _, err := deployer.Client.Packages.Insert(packa, true) - return err - }) + var err error + + var response *http.Response + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + _, response, err = deployer.Client.Packages.Insert(packa, true) + return err + }) if err != nil { wskErr := err.(*whisk.WskError) errString := wski18n.T("Got error creating package binding with error message: {{.err}} and error code: {{.code}}.\n", map[string]interface{}{"err": wskErr.Error(), "code": strconv.Itoa(wskErr.ExitCode)}) whisk.Debug(whisk.DbgError, errString) - return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode) + return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode, response) } else { output := wski18n.T("Package binding {{.output}} has been successfully deployed.\n", map[string]interface{}{"output": packa.Name}) @@ -721,17 +724,18 @@ func (deployer *ServiceDeployer) createPackage(packa *whisk.Package) error { output := wski18n.T("Deploying package {{.output}} ...", map[string]interface{}{"output": packa.Name}) whisk.Debug(whisk.DbgInfo, output) - var err error - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, _, err := deployer.Client.Packages.Insert(packa, true) - return err - }) + var err error + var response *http.Response + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + _, response, err = deployer.Client.Packages.Insert(packa, true) + return err + }) if err != nil { wskErr := err.(*whisk.WskError) errString := wski18n.T("Got error creating package with error message: {{.err}} and error code: {{.code}}.\n", map[string]interface{}{"err": wskErr.Error(), "code": strconv.Itoa(wskErr.ExitCode)}) whisk.Debug(whisk.DbgError, errString) - return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode) + return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode, response) } else { output := wski18n.T("Package {{.output}} has been successfully deployed.\n", map[string]interface{}{"output": packa.Name}) @@ -744,17 +748,18 @@ func (deployer *ServiceDeployer) createTrigger(trigger *whisk.Trigger) error { output := wski18n.T("Deploying trigger {{.output}} ...", map[string]interface{}{"output": trigger.Name}) whisk.Debug(whisk.DbgInfo, output) - var err error - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, _, err := deployer.Client.Triggers.Insert(trigger, true) - return err - }) + var err error + var response *http.Response + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + _, response, err = deployer.Client.Triggers.Insert(trigger, true) + return err + }) if err != nil { wskErr := err.(*whisk.WskError) errString := wski18n.T("Got error creating trigger with error message: {{.err}} and error code: {{.code}}.\n", map[string]interface{}{"err": wskErr.Error(), "code": strconv.Itoa(wskErr.ExitCode)}) whisk.Debug(whisk.DbgError, errString) - return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode) + return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode, response) } else { output := wski18n.T("Trigger {{.output}} has been successfully deployed.\n", map[string]interface{}{"output": trigger.Name}) @@ -798,17 +803,18 @@ func (deployer *ServiceDeployer) createFeedAction(trigger *whisk.Trigger, feedNa deployer.deleteFeedAction(trigger, feedName) } - var err error - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, _, err := deployer.Client.Triggers.Insert(t, true) - return err - }) + var err error + var response *http.Response + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + _, response, err = deployer.Client.Triggers.Insert(t, true) + return err + }) if err != nil { wskErr := err.(*whisk.WskError) errString := wski18n.T("Got error creating trigger with error message: {{.err}} and error code: {{.code}}.\n", map[string]interface{}{"err": wskErr.Error(), "code": strconv.Itoa(wskErr.ExitCode)}) whisk.Debug(whisk.DbgError, errString) - return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode) + return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode, response) } else { qName, err := utils.ParseQualifiedName(feedName, deployer.ClientConfig.Namespace) @@ -818,26 +824,26 @@ func (deployer *ServiceDeployer) createFeedAction(trigger *whisk.Trigger, feedNa namespace := deployer.Client.Namespace deployer.Client.Namespace = qName.Namespace - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, _, err = deployer.Client.Actions.Invoke(qName.EntityName, params, true, false) - return err - }) + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + _, response, err = deployer.Client.Actions.Invoke(qName.EntityName, params, true, false) + return err + }) deployer.Client.Namespace = namespace if err != nil { // Remove the created trigger deployer.Client.Triggers.Delete(trigger.Name) - retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, _, err := deployer.Client.Triggers.Delete(trigger.Name) - return err - }) + retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + _, _, err := deployer.Client.Triggers.Delete(trigger.Name) + return err + }) wskErr := err.(*whisk.WskError) errString := wski18n.T("Got error creating trigger feed with error message: {{.err}} and error code: {{.code}}.\n", map[string]interface{}{"err": wskErr.Error(), "code": strconv.Itoa(wskErr.ExitCode)}) whisk.Debug(whisk.DbgError, errString) - return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode) + return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode, response) } } output = wski18n.T("Trigger feed {{.output}} has been successfully deployed.\n", @@ -864,18 +870,19 @@ func (deployer *ServiceDeployer) createRule(rule *whisk.Rule) error { map[string]interface{}{"output": rule.Name}) whisk.Debug(whisk.DbgInfo, output) - var err error - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, _, err := deployer.Client.Rules.Insert(rule, true) - return err - }) + var err error + var response *http.Response + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + _, response, err = deployer.Client.Rules.Insert(rule, true) + return err + }) if err != nil { wskErr := err.(*whisk.WskError) errString := wski18n.T("Got error creating rule with error message: {{.err}} and error code: {{.code}}.\n", map[string]interface{}{"err": wskErr.Error(), "code": strconv.Itoa(wskErr.ExitCode)}) whisk.Debug(whisk.DbgError, errString) - return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode) + return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode, response) } output = wski18n.T("Rule {{.output}} has been successfully deployed.\n", @@ -895,18 +902,19 @@ func (deployer *ServiceDeployer) createAction(pkgname string, action *whisk.Acti map[string]interface{}{"output": action.Name}) whisk.Debug(whisk.DbgInfo, output) - var err error - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, _, err := deployer.Client.Actions.Insert(action, true) - return err - }) + var err error + var response *http.Response + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + _, response, err = deployer.Client.Actions.Insert(action, true) + return err + }) if err != nil { wskErr := err.(*whisk.WskError) errString := wski18n.T("Got error creating action with error message: {{.err}} and error code: {{.code}}.\n", map[string]interface{}{"err": wskErr.Error(), "code": strconv.Itoa(wskErr.ExitCode)}) whisk.Debug(whisk.DbgError, errString) - return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode) + return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode, response) } else { output := wski18n.T("Action {{.output}} has been successfully deployed.\n", map[string]interface{}{"output": action.Name}) @@ -917,18 +925,19 @@ func (deployer *ServiceDeployer) createAction(pkgname string, action *whisk.Acti // create api (API Gateway functionality) func (deployer *ServiceDeployer) createApi(api *whisk.ApiCreateRequest) error { - var err error - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, _, err := deployer.Client.Apis.Insert(api, nil, true) - return err - }) + var err error + var response *http.Response + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + _, response, err = deployer.Client.Apis.Insert(api, nil, true) + return err + }) if err != nil { wskErr := err.(*whisk.WskError) errString := wski18n.T("Got error creating api with error message: {{.err}} and error code: {{.code}}.\n", map[string]interface{}{"err": wskErr.Error(), "code": strconv.Itoa(wskErr.ExitCode)}) whisk.Debug(whisk.DbgError, errString) - return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode) + return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode, response) } return nil } @@ -979,21 +988,21 @@ func (deployer *ServiceDeployer) UnDeploy(verifiedPlan *DeploymentProject) error func (deployer *ServiceDeployer) unDeployAssets(verifiedPlan *DeploymentProject) error { - if err := deployer.UnDeployRules(verifiedPlan); err != nil { - return err - } + if err := deployer.UnDeployRules(verifiedPlan); err != nil { + return err + } - if err := deployer.UnDeployTriggers(verifiedPlan); err != nil { - return err - } + if err := deployer.UnDeployTriggers(verifiedPlan); err != nil { + return err + } if err := deployer.UnDeploySequences(verifiedPlan); err != nil { return err } - if err := deployer.UnDeployActions(verifiedPlan); err != nil { - return err - } + if err := deployer.UnDeployActions(verifiedPlan); err != nil { + return err + } if err := deployer.UnDeployPackages(verifiedPlan); err != nil { return err @@ -1015,11 +1024,11 @@ func (deployer *ServiceDeployer) UnDeployDependencies() error { whisk.Debug(whisk.DbgInfo, output) if depRecord.IsBinding { - var err error - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, err := deployer.Client.Packages.Delete(depName) - return err - }) + var err error + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + _, err := deployer.Client.Packages.Delete(depName) + return err + }) if err != nil { return err } @@ -1038,17 +1047,18 @@ func (deployer *ServiceDeployer) UnDeployDependencies() error { // delete binding pkg if the origin package name is different if depServiceDeployer.RootPackageName != depName { if _, _, ok := deployer.Client.Packages.Get(depName); ok == nil { - var err error - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, err := deployer.Client.Packages.Delete(depName) - return err - }) + var err error + var response *http.Response + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + response, err = deployer.Client.Packages.Delete(depName) + return err + }) if err != nil { wskErr := err.(*whisk.WskError) errString := wski18n.T("Got error deleting binding package with error message: {{.err}} and error code: {{.code}}.\n", map[string]interface{}{"err": wskErr.Error(), "code": strconv.Itoa(wskErr.ExitCode)}) whisk.Debug(whisk.DbgError, errString) - return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode) + return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode, response) } } } @@ -1144,18 +1154,19 @@ func (deployer *ServiceDeployer) deletePackage(packa *whisk.Package) error { map[string]interface{}{"package": packa.Name}) whisk.Debug(whisk.DbgInfo, output) if _, _, ok := deployer.Client.Packages.Get(packa.Name); ok == nil { - var err error - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, err := deployer.Client.Packages.Delete(packa.Name) - return err - }) + var err error + var response *http.Response + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + response, err = deployer.Client.Packages.Delete(packa.Name) + return err + }) if err != nil { wskErr := err.(*whisk.WskError) errString := wski18n.T("Got error deleting package with error message: {{.err}} and error code: {{.code}}.\n", map[string]interface{}{"err": wskErr.Error(), "code": strconv.Itoa(wskErr.ExitCode)}) whisk.Debug(whisk.DbgError, errString) - return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode) + return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode, response) } } return nil @@ -1166,18 +1177,19 @@ func (deployer *ServiceDeployer) deleteTrigger(trigger *whisk.Trigger) error { map[string]interface{}{"trigger": trigger.Name}) whisk.Debug(whisk.DbgInfo, output) - var err error - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, _, err := deployer.Client.Triggers.Delete(trigger.Name) - return err - }) + var err error + var response *http.Response + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + _, response, err = deployer.Client.Triggers.Delete(trigger.Name) + return err + }) if err != nil { wskErr := err.(*whisk.WskError) errString := wski18n.T("Got error deleting trigger with error message: {{.err}} and error code: {{.code}}.\n", map[string]interface{}{"err": wskErr.Error(), "code": strconv.Itoa(wskErr.ExitCode)}) whisk.Debug(whisk.DbgError, errString) - return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode) + return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode, response) } else { output := wski18n.T("Trigger {{.trigger}} has been removed.\n", map[string]interface{}{"trigger": trigger.Name}) @@ -1205,10 +1217,11 @@ func (deployer *ServiceDeployer) deleteFeedAction(trigger *whisk.Trigger, feedNa namespace := deployer.Client.Namespace deployer.Client.Namespace = qName.Namespace - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, _, err := deployer.Client.Actions.Invoke(qName.EntityName, parameters, true, true) - return err - }) + var response *http.Response + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + _, response, err = deployer.Client.Actions.Invoke(qName.EntityName, parameters, true, false) + return err + }) deployer.Client.Namespace = namespace @@ -1217,22 +1230,22 @@ func (deployer *ServiceDeployer) deleteFeedAction(trigger *whisk.Trigger, feedNa errString := wski18n.T("Failed to invoke the feed when deleting trigger feed with error message: {{.err}} and error code: {{.code}}.\n", map[string]interface{}{"err": wskErr.Error(), "code": strconv.Itoa(wskErr.ExitCode)}) whisk.Debug(whisk.DbgError, errString) - return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode) + return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode, response) } else { trigger.Parameters = nil - var err error - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, _, err := deployer.Client.Triggers.Delete(trigger.Name) - return err - }) + var err error + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + _, response, err = deployer.Client.Triggers.Delete(trigger.Name) + return err + }) if err != nil { wskErr := err.(*whisk.WskError) errString := wski18n.T("Got error deleting trigger with error message: {{.err}} and error code: {{.code}}.\n", map[string]interface{}{"err": wskErr.Error(), "code": strconv.Itoa(wskErr.ExitCode)}) whisk.Debug(whisk.DbgError, errString) - return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode) + return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode, response) } } @@ -1244,19 +1257,20 @@ func (deployer *ServiceDeployer) deleteRule(rule *whisk.Rule) error { map[string]interface{}{"rule": rule.Name}) whisk.Debug(whisk.DbgInfo, output) - var err error - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, err := deployer.Client.Rules.Delete(rule.Name) - return err - }) - - if err != nil { - wskErr := err.(*whisk.WskError) - errString := wski18n.T("Got error deleting rule with error message: {{.err}} and error code: {{.code}}.\n", - map[string]interface{}{"err": wskErr.Error(), "code": strconv.Itoa(wskErr.ExitCode)}) - whisk.Debug(whisk.DbgError, errString) - return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode) - } + var err error + var response *http.Response + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + response, err = deployer.Client.Rules.Delete(rule.Name) + return err + }) + + if err != nil { + wskErr := err.(*whisk.WskError) + errString := wski18n.T("Got error deleting rule with error message: {{.err}} and error code: {{.code}}.\n", + map[string]interface{}{"err": wskErr.Error(), "code": strconv.Itoa(wskErr.ExitCode)}) + whisk.Debug(whisk.DbgError, errString) + return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode, response) + } output = wski18n.T("Rule {{.rule}} has been removed.\n", map[string]interface{}{"rule": rule.Name}) whisk.Debug(whisk.DbgInfo, output) @@ -1276,18 +1290,19 @@ func (deployer *ServiceDeployer) deleteAction(pkgname string, action *whisk.Acti whisk.Debug(whisk.DbgInfo, output) if _, _, ok := deployer.Client.Actions.Get(action.Name); ok == nil { - var err error - err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { - _, err := deployer.Client.Actions.Delete(action.Name) - return err - }) + var err error + var response *http.Response + err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error { + response, err = deployer.Client.Actions.Delete(action.Name) + return err + }) if err != nil { wskErr := err.(*whisk.WskError) errString := wski18n.T("Got error deleting action with error message: {{.err}} and error code: {{.code}}.\n", map[string]interface{}{"err": wskErr.Error(), "code": strconv.Itoa(wskErr.ExitCode)}) whisk.Debug(whisk.DbgError, errString) - return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode) + return wskderrors.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode, response) } output = wski18n.T("Action {{.action}} has been removed.\n", @@ -1298,25 +1313,25 @@ func (deployer *ServiceDeployer) deleteAction(pkgname string, action *whisk.Acti } func retry(attempts int, sleep time.Duration, callback func() error) error { - var err error - for i := 0; ; i++ { - err = callback() - if i >= (attempts - 1) { - break - } - if err != nil { - wskErr := err.(*whisk.WskError) - if wskErr.ExitCode == CONFLICT_CODE && strings.Contains(wskErr.Error(), CONFLICT_MESSAGE) { - time.Sleep(sleep) - whisk.Debug(whisk.DbgError, "Retrying [%s] after error: %s\n", strconv.Itoa(i + 1), err) - } else { - return err - } - } else { - return err - } - } - return err + var err error + for i := 0; ; i++ { + err = callback() + if i >= (attempts - 1) { + break + } + if err != nil { + wskErr := err.(*whisk.WskError) + if wskErr.ExitCode == CONFLICT_CODE && strings.Contains(wskErr.Error(), CONFLICT_MESSAGE) { + time.Sleep(sleep) + whisk.Debug(whisk.DbgError, "Retrying [%s] after error: %s\n", strconv.Itoa(i+1), err) + } else { + return err + } + } else { + return err + } + } + return err } // from whisk go client diff --git a/tests/src/integration/message-hub/deployment.yaml b/tests/src/integration/message-hub/deployment.yaml index e300229..de681c1 100644 --- a/tests/src/integration/message-hub/deployment.yaml +++ b/tests/src/integration/message-hub/deployment.yaml @@ -8,7 +8,7 @@ project: messagehub_instance: wskdeployMessageHub topic: $DESTINATION_TOPIC triggers: - wskdeployMessageHubTrigger: + wskdeployIntegrationTestMessageHubTrigger: inputs: isJSONData: true topic: $SOURCE_TOPIC diff --git a/tests/src/integration/message-hub/manifest.yaml b/tests/src/integration/message-hub/manifest.yaml index ddfcdb7..bc09849 100644 --- a/tests/src/integration/message-hub/manifest.yaml +++ b/tests/src/integration/message-hub/manifest.yaml @@ -20,11 +20,11 @@ packages: data-processing-sequence: actions: receive-messages-from-messagehub, process-messages-received-from-messagehub triggers: - wskdeployMessageHubTrigger: + wskdeployIntegrationTestMessageHubTrigger: feed: wskdeployMessageHub/messageHubFeed rules: data-processing-rule: - trigger: wskdeployMessageHubTrigger + trigger: wskdeployIntegrationTestMessageHubTrigger action: data-processing-sequence diff --git a/wskderrors/wskdeployerror.go b/wskderrors/wskdeployerror.go index 61881d1..461b356 100644 --- a/wskderrors/wskdeployerror.go +++ b/wskderrors/wskdeployerror.go @@ -22,6 +22,8 @@ import ( "runtime" "strings" "path/filepath" + "net/http" + "io/ioutil" ) const ( @@ -38,6 +40,8 @@ const ( STR_ACTION = "Action" STR_RUNTIME = "Runtime" STR_SUPPORTED_RUNTIMES = "Supported Runtimes" + STR_HTTP_STATUS = "HTTP Response Status" + STR_HTTP_BODY = "HTTP Response Body" // Formatting STR_INDENT_1 = "==>" @@ -169,14 +173,19 @@ type WhiskClientError struct { ErrorCode int } -func NewWhiskClientError(errorMessage string, code int) *WhiskClientError { +func NewWhiskClientError(errorMessage string, code int, response *http.Response) *WhiskClientError { var err = &WhiskClientError{ ErrorCode: code, } err.SetErrorType(ERROR_WHISK_CLIENT_ERROR) err.SetCallerByStackFrameSkip(2) err.SetMessageFormat("%s: %d: %s") - str := fmt.Sprintf(err.MessageFormat, STR_ERROR_CODE, code, errorMessage) + var str = fmt.Sprintf(err.MessageFormat, STR_ERROR_CODE, code, errorMessage) + if response != nil { + responseData, _ := ioutil.ReadAll(response.Body) + err.SetMessageFormat("%s: %d: %s: %s: %s %s: %s") + str = fmt.Sprintf(err.MessageFormat, STR_ERROR_CODE, code, errorMessage, STR_HTTP_STATUS, response.Status, STR_HTTP_BODY, string(responseData)) + } err.SetMessage(str) return err } diff --git a/wskderrors/wskdeployerror_test.go b/wskderrors/wskdeployerror_test.go index 117d973..6468425 100644 --- a/wskderrors/wskdeployerror_test.go +++ b/wskderrors/wskdeployerror_test.go @@ -64,7 +64,7 @@ func TestCustomErrorOutputFormat(t *testing.T) { /* * WhiskClientError */ - err2 := NewWhiskClientError(TEST_DEFAULT_ERROR_MESSAGE, TEST_ERROR_CODE) + err2 := NewWhiskClientError(TEST_DEFAULT_ERROR_MESSAGE, TEST_ERROR_CODE, nil) actualResult = strings.TrimSpace(err2.Error()) expectedResult = fmt.Sprintf("%s [%d]: [%s]: %s: %d: %s", packageName, -- To stop receiving notification emails like this one, please contact ['"commits@openwhisk.apache.org" <commits@openwhisk.apache.org>'].