You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by mr...@apache.org on 2017/09/21 02:27:29 UTC
[incubator-openwhisk-wskdeploy] branch master updated: Adding
packages support for dependencies in manifest file (#527)
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 5d0529d Adding packages support for dependencies in manifest file (#527)
5d0529d is described below
commit 5d0529d4b1622d2e239e780eb47298f191996e53
Author: Priti Desai <pd...@us.ibm.com>
AuthorDate: Wed Sep 20 19:27:27 2017 -0700
Adding packages support for dependencies in manifest file (#527)
---
deployers/manifestreader.go | 9 +-
deployers/servicedeployer.go | 1787 ++++++++++----------
parsers/manifest_parser.go | 28 +-
parsers/manifest_parser_test.go | 7 +-
.../validate-packages-in-manifest/manifest.yaml | 14 +-
5 files changed, 944 insertions(+), 901 deletions(-)
diff --git a/deployers/manifestreader.go b/deployers/manifestreader.go
index 0a8ec28..bed3230 100644
--- a/deployers/manifestreader.go
+++ b/deployers/manifestreader.go
@@ -66,7 +66,7 @@ func (reader *ManifestReader) InitRootPackage(manifestParser *parsers.YAMLParser
func (deployer *ManifestReader) HandleYaml(sdeployer *ServiceDeployer, manifestParser *parsers.YAMLParser, manifest *parsers.ManifestYAML) error {
var err error
- deps, err := manifestParser.ComposeDependencies(manifest, deployer.serviceDeployer.ProjectPath, deployer.serviceDeployer.ManifestPath)
+ deps, err := manifestParser.ComposeDependenciesFromAllPackages(manifest, deployer.serviceDeployer.ProjectPath, deployer.serviceDeployer.ManifestPath)
if err != nil {
return utils.NewInputYamlFormatError(err.Error())
}
@@ -131,7 +131,12 @@ func (deployer *ManifestReader) HandleYaml(sdeployer *ServiceDeployer, manifestP
}
func (reader *ManifestReader) SetDependencies(deps map[string]utils.DependencyRecord) error {
- for depName, dep := range deps {
+ for name, dep := range deps {
+ n := strings.Split(name, ":")
+ depName := n[1]
+ if (depName == "") {
+ return nil
+ }
if !dep.IsBinding && !reader.IsUndeploy {
if _, exists := reader.serviceDeployer.DependencyMaster[depName]; !exists {
// dependency
diff --git a/deployers/servicedeployer.go b/deployers/servicedeployer.go
index ac57c2d..c969931 100644
--- a/deployers/servicedeployer.go
+++ b/deployers/servicedeployer.go
@@ -18,49 +18,49 @@
package deployers
import (
- "bufio"
- "fmt"
- "os"
- "path"
- "strings"
- "sync"
- "strconv"
-
- "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"
+ "bufio"
+ "fmt"
+ "os"
+ "path"
+ "strconv"
+ "strings"
+ "sync"
+
+ "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"
)
type DeploymentApplication struct {
- Packages map[string]*DeploymentPackage
- Triggers map[string]*whisk.Trigger
- Rules map[string]*whisk.Rule
- Apis map[string]*whisk.ApiCreateRequest
+ Packages map[string]*DeploymentPackage
+ Triggers map[string]*whisk.Trigger
+ Rules map[string]*whisk.Rule
+ Apis map[string]*whisk.ApiCreateRequest
}
func NewDeploymentApplication() *DeploymentApplication {
- var dep DeploymentApplication
- dep.Packages = make(map[string]*DeploymentPackage)
- dep.Triggers = make(map[string]*whisk.Trigger)
- dep.Rules = make(map[string]*whisk.Rule)
- dep.Apis = make(map[string]*whisk.ApiCreateRequest)
- return &dep
+ var dep DeploymentApplication
+ dep.Packages = make(map[string]*DeploymentPackage)
+ dep.Triggers = make(map[string]*whisk.Trigger)
+ dep.Rules = make(map[string]*whisk.Rule)
+ dep.Apis = make(map[string]*whisk.ApiCreateRequest)
+ return &dep
}
type DeploymentPackage struct {
- Package *whisk.Package
- Dependencies map[string]utils.DependencyRecord
- Actions map[string]utils.ActionRecord
- Sequences map[string]utils.ActionRecord
+ Package *whisk.Package
+ Dependencies map[string]utils.DependencyRecord
+ Actions map[string]utils.ActionRecord
+ Sequences map[string]utils.ActionRecord
}
func NewDeploymentPackage() *DeploymentPackage {
- var dep DeploymentPackage
- dep.Dependencies = make(map[string]utils.DependencyRecord)
- dep.Actions = make(map[string]utils.ActionRecord)
- dep.Sequences = make(map[string]utils.ActionRecord)
- return &dep
+ var dep DeploymentPackage
+ dep.Dependencies = make(map[string]utils.DependencyRecord)
+ dep.Actions = make(map[string]utils.ActionRecord)
+ dep.Sequences = make(map[string]utils.ActionRecord)
+ return &dep
}
// ServiceDeployer defines a prototype service deployer.
@@ -70,1031 +70,1036 @@ 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 {
- Deployment *DeploymentApplication
- Client *whisk.Client
- mt sync.RWMutex
- RootPackageName string
- IsInteractive bool
- IsDefault bool
- ManifestPath string
- ProjectPath string
- DeploymentPath string
- // whether to deploy the action under the package
- DeployActionInPackage bool
- InteractiveChoice bool
- ClientConfig *whisk.Config
- DependencyMaster map[string]utils.DependencyRecord
+ Deployment *DeploymentApplication
+ Client *whisk.Client
+ mt sync.RWMutex
+ RootPackageName string
+ IsInteractive bool
+ IsDefault bool
+ ManifestPath string
+ ProjectPath string
+ DeploymentPath string
+ // whether to deploy the action under the package
+ DeployActionInPackage bool
+ InteractiveChoice bool
+ ClientConfig *whisk.Config
+ DependencyMaster map[string]utils.DependencyRecord
}
// NewServiceDeployer is a Factory to create a new ServiceDeployer
func NewServiceDeployer() *ServiceDeployer {
- var dep ServiceDeployer
- dep.Deployment = NewDeploymentApplication()
- dep.IsInteractive = true
- dep.DeployActionInPackage = true
- dep.DependencyMaster = make(map[string]utils.DependencyRecord)
+ var dep ServiceDeployer
+ dep.Deployment = NewDeploymentApplication()
+ dep.IsInteractive = true
+ dep.DeployActionInPackage = true
+ dep.DependencyMaster = make(map[string]utils.DependencyRecord)
- return &dep
+ return &dep
}
// Check if the manifest yaml could be parsed by Manifest Parser.
// Check if the deployment yaml could be parsed by Manifest Parser.
func (deployer *ServiceDeployer) Check() {
- ps := parsers.NewYAMLParser()
- if utils.FileExists(deployer.DeploymentPath) {
- ps.ParseDeployment(deployer.DeploymentPath)
- }
- ps.ParseManifest(deployer.ManifestPath)
- // add more schema check or manifest/deployment consistency checks here if
- // necessary
+ ps := parsers.NewYAMLParser()
+ if utils.FileExists(deployer.DeploymentPath) {
+ ps.ParseDeployment(deployer.DeploymentPath)
+ }
+ ps.ParseManifest(deployer.ManifestPath)
+ // add more schema check or manifest/deployment consistency checks here if
+ // necessary
}
func (deployer *ServiceDeployer) ConstructDeploymentPlan() error {
- var manifestReader = NewManfiestReader(deployer)
- manifestReader.IsUndeploy = false
- var err error
- manifest, manifestParser, err := manifestReader.ParseManifest()
- if err != nil {
- return err
- }
-
- deployer.RootPackageName = manifest.Package.Packagename
-
- manifestReader.InitRootPackage(manifestParser, manifest)
-
- if deployer.IsDefault == true {
- fileReader := NewFileSystemReader(deployer)
- fileActions, err := fileReader.ReadProjectDirectory(manifest)
- if err != nil {
- return err
- }
- fileReader.SetFileActions(fileActions)
- }
-
- // process manifest file
- err = manifestReader.HandleYaml(deployer, manifestParser, manifest)
- if err != nil {
- return err
- }
-
- // process deploymet file
- if utils.FileExists(deployer.DeploymentPath) {
- var deploymentReader = NewDeploymentReader(deployer)
- err = deploymentReader.HandleYaml()
- if err != nil {
- return err
- }
-
- deploymentReader.BindAssets()
- }
-
- return err
+ var manifestReader = NewManfiestReader(deployer)
+ manifestReader.IsUndeploy = false
+ var err error
+ manifest, manifestParser, err := manifestReader.ParseManifest()
+ if err != nil {
+ return err
+ }
+
+ deployer.RootPackageName = manifest.Package.Packagename
+
+ manifestReader.InitRootPackage(manifestParser, manifest)
+
+ if deployer.IsDefault == true {
+ fileReader := NewFileSystemReader(deployer)
+ fileActions, err := fileReader.ReadProjectDirectory(manifest)
+ if err != nil {
+ return err
+ }
+ fileReader.SetFileActions(fileActions)
+ }
+
+ // process manifest file
+ err = manifestReader.HandleYaml(deployer, manifestParser, manifest)
+ if err != nil {
+ return err
+ }
+
+ // process deploymet file
+ if utils.FileExists(deployer.DeploymentPath) {
+ var deploymentReader = NewDeploymentReader(deployer)
+ err = deploymentReader.HandleYaml()
+ if err != nil {
+ return err
+ }
+
+ deploymentReader.BindAssets()
+ }
+
+ return err
}
func (deployer *ServiceDeployer) ConstructUnDeploymentPlan() (*DeploymentApplication, error) {
- var manifestReader = NewManfiestReader(deployer)
- manifestReader.IsUndeploy = true
- var err error
- manifest, manifestParser, err := manifestReader.ParseManifest()
- if err != nil {
- return deployer.Deployment, err
- }
-
- deployer.RootPackageName = manifest.Package.Packagename
- manifestReader.InitRootPackage(manifestParser, manifest)
-
- // process file system
- if deployer.IsDefault == true {
- fileReader := NewFileSystemReader(deployer)
- fileActions, err := fileReader.ReadProjectDirectory(manifest)
- if err != nil {
- return deployer.Deployment, err
- }
-
- err = fileReader.SetFileActions(fileActions)
- if err != nil {
- return deployer.Deployment, err
- }
-
- }
-
- // process manifest file
- err = manifestReader.HandleYaml(deployer, manifestParser, manifest)
- if err != nil {
- return deployer.Deployment, err
- }
-
- // process deployment file
- if utils.FileExists(deployer.DeploymentPath) {
- var deploymentReader = NewDeploymentReader(deployer)
- err = deploymentReader.HandleYaml()
- if err != nil {
- return deployer.Deployment, err
- }
-
- deploymentReader.BindAssets()
- }
-
- verifiedPlan := deployer.Deployment
-
- return verifiedPlan, err
+ var manifestReader = NewManfiestReader(deployer)
+ manifestReader.IsUndeploy = true
+ var err error
+ manifest, manifestParser, err := manifestReader.ParseManifest()
+ if err != nil {
+ return deployer.Deployment, err
+ }
+
+ deployer.RootPackageName = manifest.Package.Packagename
+ manifestReader.InitRootPackage(manifestParser, manifest)
+
+ // process file system
+ if deployer.IsDefault == true {
+ fileReader := NewFileSystemReader(deployer)
+ fileActions, err := fileReader.ReadProjectDirectory(manifest)
+ if err != nil {
+ return deployer.Deployment, err
+ }
+
+ err = fileReader.SetFileActions(fileActions)
+ if err != nil {
+ return deployer.Deployment, err
+ }
+
+ }
+
+ // process manifest file
+ err = manifestReader.HandleYaml(deployer, manifestParser, manifest)
+ if err != nil {
+ return deployer.Deployment, err
+ }
+
+ // process deployment file
+ if utils.FileExists(deployer.DeploymentPath) {
+ var deploymentReader = NewDeploymentReader(deployer)
+ err = deploymentReader.HandleYaml()
+ if err != nil {
+ return deployer.Deployment, err
+ }
+
+ deploymentReader.BindAssets()
+ }
+
+ verifiedPlan := deployer.Deployment
+
+ return verifiedPlan, err
}
// Use reflect util to deploy everything in this service deployer
// TODO(TBD): according to some planning?
func (deployer *ServiceDeployer) Deploy() error {
- if deployer.IsInteractive == true {
- deployer.printDeploymentAssets(deployer.Deployment)
- reader := bufio.NewReader(os.Stdin)
- fmt.Print("Do you really want to deploy this? (y/N): ")
-
- text, _ := reader.ReadString('\n')
- text = strings.TrimSpace(text)
-
- if text == "" {
- text = "n"
- }
-
- if strings.EqualFold(text, "y") || strings.EqualFold(text, "yes") {
- deployer.InteractiveChoice = true
- if err := deployer.deployAssets(); err != nil {
- errString := wski18n.T("Deployment did not complete sucessfully. Run `wskdeploy undeploy` to remove partially deployed assets.\n")
- whisk.Debug(whisk.DbgError, errString)
- return err
- }
-
- utils.PrintOpenWhiskOutput(wski18n.T("Deployment completed successfully.\n"))
- return nil
-
- } else {
- deployer.InteractiveChoice = false
- utils.PrintOpenWhiskOutput(wski18n.T("OK. Cancelling deployment.\n"))
- return nil
- }
- }
-
- // non-interactive
- if err := deployer.deployAssets(); err != nil {
- errString := wski18n.T("Deployment did not complete sucessfully. Run `wskdeploy undeploy` to remove partially deployed assets.\n")
- whisk.Debug(whisk.DbgError, errString)
- return err
- }
-
- utils.PrintOpenWhiskOutput(wski18n.T("Deployment completed successfully.\n"))
- return nil
+ if deployer.IsInteractive == true {
+ deployer.printDeploymentAssets(deployer.Deployment)
+ reader := bufio.NewReader(os.Stdin)
+ fmt.Print("Do you really want to deploy this? (y/N): ")
+
+ text, _ := reader.ReadString('\n')
+ text = strings.TrimSpace(text)
+
+ if text == "" {
+ text = "n"
+ }
+
+ if strings.EqualFold(text, "y") || strings.EqualFold(text, "yes") {
+ deployer.InteractiveChoice = true
+ if err := deployer.deployAssets(); err != nil {
+ errString := wski18n.T("Deployment did not complete sucessfully. Run `wskdeploy undeploy` to remove partially deployed assets.\n")
+ whisk.Debug(whisk.DbgError, errString)
+ return err
+ }
+
+ utils.PrintOpenWhiskOutput(wski18n.T("Deployment completed successfully.\n"))
+ return nil
+
+ } else {
+ deployer.InteractiveChoice = false
+ utils.PrintOpenWhiskOutput(wski18n.T("OK. Cancelling deployment.\n"))
+ return nil
+ }
+ }
+
+ // non-interactive
+ if err := deployer.deployAssets(); err != nil {
+ errString := wski18n.T("Deployment did not complete sucessfully. Run `wskdeploy undeploy` to remove partially deployed assets.\n")
+ whisk.Debug(whisk.DbgError, errString)
+ return err
+ }
+
+ utils.PrintOpenWhiskOutput(wski18n.T("Deployment completed successfully.\n"))
+ return nil
}
func (deployer *ServiceDeployer) deployAssets() error {
- if err := deployer.DeployPackages(); err != nil {
- return err
- }
+ if err := deployer.DeployPackages(); err != nil {
+ return err
+ }
- if err := deployer.DeployDependencies(); err != nil {
- return err
- }
+ if err := deployer.DeployDependencies(); err != nil {
+ return err
+ }
- if err := deployer.DeployActions(); err != nil {
- return err
- }
+ if err := deployer.DeployActions(); err != nil {
+ return err
+ }
- if err := deployer.DeploySequences(); err != nil {
- return err
- }
+ if err := deployer.DeploySequences(); err != nil {
+ return err
+ }
- if err := deployer.DeployTriggers(); err != nil {
- return err
- }
+ if err := deployer.DeployTriggers(); err != nil {
+ return err
+ }
- if err := deployer.DeployRules(); err != nil {
- return err
- }
+ if err := deployer.DeployRules(); err != nil {
+ return err
+ }
- if err := deployer.DeployApis(); err != nil {
- return err
- }
+ if err := deployer.DeployApis(); err != nil {
+ return err
+ }
-
- return nil
+ return nil
}
func (deployer *ServiceDeployer) DeployDependencies() error {
- for _, pack := range deployer.Deployment.Packages {
- for depName, depRecord := range pack.Dependencies {
- output := wski18n.T("Deploying dependency {{.output}} ...",
- map[string]interface{}{"output": depName})
- whisk.Debug(whisk.DbgInfo, output)
-
- if depRecord.IsBinding {
- bindingPackage := new(whisk.BindingPackage)
- bindingPackage.Namespace = pack.Package.Namespace
- bindingPackage.Name = depName
- pub := false
- bindingPackage.Publish = &pub
-
- qName, err := utils.ParseQualifiedName(depRecord.Location, pack.Package.Namespace)
- if err != nil {
- return err
- }
- bindingPackage.Binding = whisk.Binding{qName.Namespace, qName.EntityName}
-
- bindingPackage.Parameters = depRecord.Parameters
- bindingPackage.Annotations = depRecord.Annotations
-
- error := deployer.createBinding(bindingPackage)
- if error != nil {
- return error
- } else {
- output := wski18n.T("Dependency {{.output}} has been successfully deployed.\n",
- map[string]interface{}{"output": depName})
- whisk.Debug(whisk.DbgInfo, output)
- }
-
- } else {
- depServiceDeployer, err := deployer.getDependentDeployer(depName, depRecord)
- if err != nil {
- return err
- }
-
- err = depServiceDeployer.ConstructDeploymentPlan()
- if err != nil {
- return err
- }
-
- if err := depServiceDeployer.deployAssets(); err != nil {
- errString := wski18n.T("Deployment of dependency {{.depName}} did not complete sucessfully. Run `wskdeploy undeploy` to remove partially deployed assets.\n",
- map[string]interface{}{"depName": depName})
- utils.PrintOpenWhiskErrorMessage(errString)
- return err
- }
-
- // if the RootPackageName is different from depName
- // create a binding to the origin package
- if (depServiceDeployer.RootPackageName != depName) {
- bindingPackage := new(whisk.BindingPackage)
- bindingPackage.Namespace = pack.Package.Namespace
- bindingPackage.Name = depName
- pub := false
- bindingPackage.Publish = &pub
-
- qName, err := utils.ParseQualifiedName(depServiceDeployer.RootPackageName, depServiceDeployer.Deployment.Packages[depServiceDeployer.RootPackageName].Package.Namespace)
- if err != nil {
- return err
- }
-
- bindingPackage.Binding = whisk.Binding{qName.Namespace, qName.EntityName}
-
- bindingPackage.Parameters = depRecord.Parameters
- bindingPackage.Annotations = depRecord.Annotations
-
- err = deployer.createBinding(bindingPackage)
- if err != nil {
- return err
- } else {
- output := wski18n.T("Dependency {{.output}} has been successfully deployed.\n",
- map[string]interface{}{"output": depName})
- whisk.Debug(whisk.DbgInfo, output)
- }
- }
- }
- }
- }
-
- return nil
+ for _, pack := range deployer.Deployment.Packages {
+ for depName, depRecord := range pack.Dependencies {
+ output := wski18n.T("Deploying dependency {{.output}} ...",
+ map[string]interface{}{"output": depName})
+ whisk.Debug(whisk.DbgInfo, output)
+
+ if depRecord.IsBinding {
+ bindingPackage := new(whisk.BindingPackage)
+ bindingPackage.Namespace = pack.Package.Namespace
+ bindingPackage.Name = depName
+ pub := false
+ bindingPackage.Publish = &pub
+
+ qName, err := utils.ParseQualifiedName(depRecord.Location, pack.Package.Namespace)
+ if err != nil {
+ return err
+ }
+ bindingPackage.Binding = whisk.Binding{qName.Namespace, qName.EntityName}
+
+ bindingPackage.Parameters = depRecord.Parameters
+ bindingPackage.Annotations = depRecord.Annotations
+
+ error := deployer.createBinding(bindingPackage)
+ if error != nil {
+ return error
+ } else {
+ output := wski18n.T("Dependency {{.output}} has been successfully deployed.\n",
+ map[string]interface{}{"output": depName})
+ whisk.Debug(whisk.DbgInfo, output)
+ }
+
+ } else {
+ depServiceDeployer, err := deployer.getDependentDeployer(depName, depRecord)
+ if err != nil {
+ return err
+ }
+
+ err = depServiceDeployer.ConstructDeploymentPlan()
+ if err != nil {
+ return err
+ }
+
+ if err := depServiceDeployer.deployAssets(); err != nil {
+ errString := wski18n.T("Deployment of dependency {{.depName}} did not complete sucessfully. Run `wskdeploy undeploy` to remove partially deployed assets.\n",
+ map[string]interface{}{"depName": depName})
+ utils.PrintOpenWhiskErrorMessage(errString)
+ return err
+ }
+
+ // if the RootPackageName is different from depName
+ // create a binding to the origin package
+ if depServiceDeployer.RootPackageName != depName {
+ bindingPackage := new(whisk.BindingPackage)
+ bindingPackage.Namespace = pack.Package.Namespace
+ bindingPackage.Name = depName
+ pub := false
+ bindingPackage.Publish = &pub
+
+ qName, err := utils.ParseQualifiedName(depServiceDeployer.RootPackageName, depServiceDeployer.Deployment.Packages[depServiceDeployer.RootPackageName].Package.Namespace)
+ if err != nil {
+ return err
+ }
+
+ bindingPackage.Binding = whisk.Binding{qName.Namespace, qName.EntityName}
+
+ bindingPackage.Parameters = depRecord.Parameters
+ bindingPackage.Annotations = depRecord.Annotations
+
+ err = deployer.createBinding(bindingPackage)
+ if err != nil {
+ return err
+ } else {
+ output := wski18n.T("Dependency {{.output}} has been successfully deployed.\n",
+ map[string]interface{}{"output": depName})
+ whisk.Debug(whisk.DbgInfo, output)
+ }
+ }
+ }
+ }
+ }
+
+ return nil
}
func (deployer *ServiceDeployer) DeployPackages() error {
- for _, pack := range deployer.Deployment.Packages {
- err := deployer.createPackage(pack.Package)
- if err != nil {
- return err
- }
- }
- return nil
+ for _, pack := range deployer.Deployment.Packages {
+ err := deployer.createPackage(pack.Package)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
}
// Deploy Sequences into OpenWhisk
func (deployer *ServiceDeployer) DeploySequences() error {
- for _, pack := range deployer.Deployment.Packages {
- for _, action := range pack.Sequences {
- error := deployer.createAction(pack.Package.Name, action.Action)
- if error != nil {
- return error
- }
- }
- }
- return nil
+ for _, pack := range deployer.Deployment.Packages {
+ for _, action := range pack.Sequences {
+ error := deployer.createAction(pack.Package.Name, action.Action)
+ if error != nil {
+ return error
+ }
+ }
+ }
+ return nil
}
// Deploy Actions into OpenWhisk
func (deployer *ServiceDeployer) DeployActions() error {
- for _, pack := range deployer.Deployment.Packages {
- for _, action := range pack.Actions {
- err := deployer.createAction(pack.Package.Name, action.Action)
- if err != nil {
- return err
- }
- }
- }
- return nil
+ for _, pack := range deployer.Deployment.Packages {
+ for _, action := range pack.Actions {
+ err := deployer.createAction(pack.Package.Name, action.Action)
+ if err != nil {
+ return err
+ }
+ }
+ }
+ return nil
}
// Deploy Triggers into OpenWhisk
func (deployer *ServiceDeployer) DeployTriggers() error {
- for _, trigger := range deployer.Deployment.Triggers {
-
- if feedname, isFeed := utils.IsFeedAction(trigger); isFeed {
- error := deployer.createFeedAction(trigger, feedname)
- if error != nil {
- return error
- }
- } else {
- error := deployer.createTrigger(trigger)
- if error != nil {
- return error
- }
- }
-
- }
- return nil
+ for _, trigger := range deployer.Deployment.Triggers {
+
+ if feedname, isFeed := utils.IsFeedAction(trigger); isFeed {
+ error := deployer.createFeedAction(trigger, feedname)
+ if error != nil {
+ return error
+ }
+ } else {
+ error := deployer.createTrigger(trigger)
+ if error != nil {
+ return error
+ }
+ }
+
+ }
+ return nil
}
// Deploy Rules into OpenWhisk
func (deployer *ServiceDeployer) DeployRules() error {
- for _, rule := range deployer.Deployment.Rules {
- error := deployer.createRule(rule)
- if error != nil {
- return error
- }
- }
- return nil
+ for _, rule := range deployer.Deployment.Rules {
+ error := deployer.createRule(rule)
+ if error != nil {
+ return error
+ }
+ }
+ return nil
}
// Deploy Apis into OpenWhisk
func (deployer *ServiceDeployer) DeployApis() error {
- for _, api := range deployer.Deployment.Apis {
- error := deployer.createApi(api)
- if error != nil {
- return error
- }
- }
- return nil
+ for _, api := range deployer.Deployment.Apis {
+ error := deployer.createApi(api)
+ if error != nil {
+ return error
+ }
+ }
+ return nil
}
func (deployer *ServiceDeployer) createBinding(packa *whisk.BindingPackage) error {
- output := wski18n.T("Deploying package binding {{.output}} ...",
- map[string]interface{}{"output": packa.Name})
- whisk.Debug(whisk.DbgInfo, output)
- _, _, err := deployer.Client.Packages.Insert(packa, true)
- 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
- } else {
- output := wski18n.T("Package binding {{.output}} has been successfully deployed.\n",
- map[string]interface{}{"output": packa.Name})
- whisk.Debug(whisk.DbgInfo, output)
- }
- return nil
+ output := wski18n.T("Deploying package binding {{.output}} ...",
+ map[string]interface{}{"output": packa.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+ _, _, err := deployer.Client.Packages.Insert(packa, true)
+ 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
+ } else {
+ output := wski18n.T("Package binding {{.output}} has been successfully deployed.\n",
+ map[string]interface{}{"output": packa.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+ }
+ return nil
}
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)
- _, _, err := deployer.Client.Packages.Insert(packa, true)
- 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
- } else {
- output := wski18n.T("Package {{.output}} has been successfully deployed.\n",
- map[string]interface{}{"output": packa.Name})
- whisk.Debug(whisk.DbgInfo, output)
- }
- return nil
+ output := wski18n.T("Deploying package {{.output}} ...",
+ map[string]interface{}{"output": packa.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+ _, _, err := deployer.Client.Packages.Insert(packa, true)
+ 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
+ } else {
+ output := wski18n.T("Package {{.output}} has been successfully deployed.\n",
+ map[string]interface{}{"output": packa.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+ }
+ return nil
}
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)
- _, _, err := deployer.Client.Triggers.Insert(trigger, true)
- 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
- } else {
- output := wski18n.T("Trigger {{.output}} has been successfully deployed.\n",
- map[string]interface{}{"output": trigger.Name})
- whisk.Debug(whisk.DbgInfo, output)
- }
- return nil
+ output := wski18n.T("Deploying trigger {{.output}} ...",
+ map[string]interface{}{"output": trigger.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+ _, _, err := deployer.Client.Triggers.Insert(trigger, true)
+ 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
+ } else {
+ output := wski18n.T("Trigger {{.output}} has been successfully deployed.\n",
+ map[string]interface{}{"output": trigger.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+ }
+ return nil
}
func (deployer *ServiceDeployer) createFeedAction(trigger *whisk.Trigger, feedName string) error {
- output := wski18n.T("Deploying trigger feed {{.output}} ...",
- map[string]interface{}{"output": trigger.Name})
- whisk.Debug(whisk.DbgInfo, output)
- // to hold and modify trigger parameters, not passed by ref?
- params := make(map[string]interface{})
-
- // check for strings that are JSON
- for _, keyVal := range trigger.Parameters {
- params[keyVal.Key] = keyVal.Value
- }
-
- params["authKey"] = deployer.ClientConfig.AuthToken
- params["lifecycleEvent"] = "CREATE"
- params["triggerName"] = "/" + deployer.Client.Namespace + "/" + trigger.Name
-
- pub := true
- t := &whisk.Trigger{
- Name: trigger.Name,
- Annotations: trigger.Annotations,
- Publish: &pub,
- }
-
- _, _, err := deployer.Client.Triggers.Insert(t, true)
- 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
- } else {
-
- qName, err := utils.ParseQualifiedName(feedName, deployer.ClientConfig.Namespace)
- if err != nil {
- return err
- }
-
- namespace := deployer.Client.Namespace
- deployer.Client.Namespace = qName.Namespace
- _, _, err = deployer.Client.Actions.Invoke(qName.EntityName, params, true, false)
- deployer.Client.Namespace = namespace
-
- if err != nil {
- 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
- }
- }
- output = wski18n.T("Trigger feed {{.output}} has been successfully deployed.\n",
- map[string]interface{}{"output": trigger.Name})
- whisk.Debug(whisk.DbgInfo, output)
- return nil
+ output := wski18n.T("Deploying trigger feed {{.output}} ...",
+ map[string]interface{}{"output": trigger.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+ // to hold and modify trigger parameters, not passed by ref?
+ params := make(map[string]interface{})
+
+ // check for strings that are JSON
+ for _, keyVal := range trigger.Parameters {
+ params[keyVal.Key] = keyVal.Value
+ }
+
+ params["authKey"] = deployer.ClientConfig.AuthToken
+ params["lifecycleEvent"] = "CREATE"
+ params["triggerName"] = "/" + deployer.Client.Namespace + "/" + trigger.Name
+
+ pub := true
+ t := &whisk.Trigger{
+ Name: trigger.Name,
+ Annotations: trigger.Annotations,
+ Publish: &pub,
+ }
+
+ _, _, err := deployer.Client.Triggers.Insert(t, true)
+ 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
+ } else {
+
+ qName, err := utils.ParseQualifiedName(feedName, deployer.ClientConfig.Namespace)
+ if err != nil {
+ return err
+ }
+
+ namespace := deployer.Client.Namespace
+ deployer.Client.Namespace = qName.Namespace
+ _, _, err = deployer.Client.Actions.Invoke(qName.EntityName, params, true, false)
+ deployer.Client.Namespace = namespace
+
+ if err != nil {
+ 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
+ }
+ }
+ output = wski18n.T("Trigger feed {{.output}} has been successfully deployed.\n",
+ map[string]interface{}{"output": trigger.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+ return nil
}
func (deployer *ServiceDeployer) createRule(rule *whisk.Rule) error {
- // The rule's trigger should include the namespace with pattern /namespace/trigger
- rule.Trigger = deployer.getQualifiedName(rule.Trigger.(string), deployer.ClientConfig.Namespace)
- // The rule's action should include the namespace and package
- // with pattern /namespace/package/action
- // TODO(TBD): please refer https://github.com/openwhisk/openwhisk/issues/1577
-
- // if it contains a slash, then the action is qualified by a package name
- if strings.Contains(rule.Action.(string), "/") {
- rule.Action = deployer.getQualifiedName(rule.Action.(string), deployer.ClientConfig.Namespace)
- } else {
- // if not, we assume the action is inside the root package
- rule.Action = deployer.getQualifiedName(strings.Join([]string{deployer.RootPackageName, rule.Action.(string)}, "/"), deployer.ClientConfig.Namespace)
- }
- output := wski18n.T("Deploying rule {{.output}} ...",
- map[string]interface{}{"output": rule.Name})
- whisk.Debug(whisk.DbgInfo, output)
-
- _, _, err := deployer.Client.Rules.Insert(rule, true)
- 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
- }
-
- _, _, err = deployer.Client.Rules.SetState(rule.Name, "active")
- if err != nil {
- wskErr := err.(*whisk.WskError)
- errString := wski18n.T("Got error setting the status of 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
- }
- output = wski18n.T("Rule {{.output}} has been successfully deployed.\n",
- map[string]interface{}{"output": rule.Name})
- whisk.Debug(whisk.DbgInfo, output)
- return nil
+ // The rule's trigger should include the namespace with pattern /namespace/trigger
+ rule.Trigger = deployer.getQualifiedName(rule.Trigger.(string), deployer.ClientConfig.Namespace)
+ // The rule's action should include the namespace and package
+ // with pattern /namespace/package/action
+ // TODO(TBD): please refer https://github.com/openwhisk/openwhisk/issues/1577
+
+ // if it contains a slash, then the action is qualified by a package name
+ if strings.Contains(rule.Action.(string), "/") {
+ rule.Action = deployer.getQualifiedName(rule.Action.(string), deployer.ClientConfig.Namespace)
+ } else {
+ // if not, we assume the action is inside the root package
+ rule.Action = deployer.getQualifiedName(strings.Join([]string{deployer.RootPackageName, rule.Action.(string)}, "/"), deployer.ClientConfig.Namespace)
+ }
+ output := wski18n.T("Deploying rule {{.output}} ...",
+ map[string]interface{}{"output": rule.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+
+ _, _, err := deployer.Client.Rules.Insert(rule, true)
+ 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
+ }
+
+ _, _, err = deployer.Client.Rules.SetState(rule.Name, "active")
+ if err != nil {
+ wskErr := err.(*whisk.WskError)
+ errString := wski18n.T("Got error setting the status of 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
+ }
+ output = wski18n.T("Rule {{.output}} has been successfully deployed.\n",
+ map[string]interface{}{"output": rule.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+ return nil
}
// Utility function to call go-whisk framework to make action
func (deployer *ServiceDeployer) createAction(pkgname string, action *whisk.Action) error {
- // call ActionService through the Client
- if deployer.DeployActionInPackage {
- // the action will be created under package with pattern 'packagename/actionname'
- action.Name = strings.Join([]string{pkgname, action.Name}, "/")
- }
- output := wski18n.T("Deploying action {{.output}} ...",
- map[string]interface{}{"output": action.Name})
- whisk.Debug(whisk.DbgInfo, output)
-
- _, _, err := deployer.Client.Actions.Insert(action, true)
- 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
- } else {
- output := wski18n.T("Action {{.output}} has been successfully deployed.\n",
- map[string]interface{}{"output": action.Name})
- whisk.Debug(whisk.DbgInfo, output)
- }
- return nil
+ // call ActionService through the Client
+ if deployer.DeployActionInPackage {
+ // the action will be created under package with pattern 'packagename/actionname'
+ action.Name = strings.Join([]string{pkgname, action.Name}, "/")
+ }
+ output := wski18n.T("Deploying action {{.output}} ...",
+ map[string]interface{}{"output": action.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+
+ _, _, err := deployer.Client.Actions.Insert(action, true)
+ 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
+ } else {
+ output := wski18n.T("Action {{.output}} has been successfully deployed.\n",
+ map[string]interface{}{"output": action.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+ }
+ return nil
}
// create api (API Gateway functionality)
func (deployer *ServiceDeployer) createApi(api *whisk.ApiCreateRequest) error {
- _, _, err := deployer.Client.Apis.Insert(api, nil, true)
- 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
- }
- return nil
+ _, _, err := deployer.Client.Apis.Insert(api, nil, true)
+ 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
+ }
+ return nil
}
func (deployer *ServiceDeployer) UnDeploy(verifiedPlan *DeploymentApplication) error {
- if deployer.IsInteractive == true {
- deployer.printDeploymentAssets(verifiedPlan)
- reader := bufio.NewReader(os.Stdin)
+ if deployer.IsInteractive == true {
+ deployer.printDeploymentAssets(verifiedPlan)
+ reader := bufio.NewReader(os.Stdin)
- fmt.Print("Do you really want to undeploy this? (y/N): ")
+ fmt.Print("Do you really want to undeploy this? (y/N): ")
- text, _ := reader.ReadString('\n')
- text = strings.TrimSpace(text)
+ text, _ := reader.ReadString('\n')
+ text = strings.TrimSpace(text)
- if text == "" {
- text = "n"
- }
+ if text == "" {
+ text = "n"
+ }
- if strings.EqualFold(text, "y") || strings.EqualFold(text, "yes") {
- deployer.InteractiveChoice = true
+ if strings.EqualFold(text, "y") || strings.EqualFold(text, "yes") {
+ deployer.InteractiveChoice = true
- if err := deployer.unDeployAssets(verifiedPlan); err != nil {
- utils.PrintOpenWhiskErrorMessage(wski18n.T("Undeployment did not complete sucessfully.\n"))
- return err
- }
+ if err := deployer.unDeployAssets(verifiedPlan); err != nil {
+ utils.PrintOpenWhiskErrorMessage(wski18n.T("Undeployment did not complete sucessfully.\n"))
+ return err
+ }
- utils.PrintOpenWhiskOutput(wski18n.T("Deployment removed successfully.\n"))
- return nil
+ utils.PrintOpenWhiskOutput(wski18n.T("Deployment removed successfully.\n"))
+ return nil
- } else {
- deployer.InteractiveChoice = false
- utils.PrintOpenWhiskOutput(wski18n.T("OK. Canceling undeployment.\n"))
- return nil
- }
- }
+ } else {
+ deployer.InteractiveChoice = false
+ utils.PrintOpenWhiskOutput(wski18n.T("OK. Canceling undeployment.\n"))
+ return nil
+ }
+ }
- // non-interactive
- if err := deployer.unDeployAssets(verifiedPlan); err != nil {
- errString := wski18n.T("Undeployment did not complete sucessfully.\n")
- whisk.Debug(whisk.DbgError, errString)
- return err
- }
+ // non-interactive
+ if err := deployer.unDeployAssets(verifiedPlan); err != nil {
+ errString := wski18n.T("Undeployment did not complete sucessfully.\n")
+ whisk.Debug(whisk.DbgError, errString)
+ return err
+ }
- utils.PrintOpenWhiskOutput(wski18n.T("Deployment removed successfully.\n"))
- return nil
+ utils.PrintOpenWhiskOutput(wski18n.T("Deployment removed successfully.\n"))
+ return nil
}
func (deployer *ServiceDeployer) unDeployAssets(verifiedPlan *DeploymentApplication) error {
- if err := deployer.UnDeployActions(verifiedPlan); err != nil {
- return err
- }
+ if err := deployer.UnDeployActions(verifiedPlan); err != nil {
+ return err
+ }
- if err := deployer.UnDeploySequences(verifiedPlan); err != nil {
- return err
- }
+ if err := deployer.UnDeploySequences(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.UnDeployRules(verifiedPlan); err != nil {
- return err
- }
+ if err := deployer.UnDeployRules(verifiedPlan); err != nil {
+ return err
+ }
- if err := deployer.UnDeployPackages(verifiedPlan); err != nil {
- return err
- }
+ if err := deployer.UnDeployPackages(verifiedPlan); err != nil {
+ return err
+ }
- if err := deployer.UnDeployDependencies(); err != nil {
- return err
- }
+ if err := deployer.UnDeployDependencies(); err != nil {
+ return err
+ }
- return nil
+ return nil
}
func (deployer *ServiceDeployer) UnDeployDependencies() error {
- for _, pack := range deployer.Deployment.Packages {
- for depName, depRecord := range pack.Dependencies {
- output := wski18n.T("Undeploying dependency {{.depName}} ...",
- map[string]interface{}{"depName": depName})
- whisk.Debug(whisk.DbgInfo, output)
-
- if depRecord.IsBinding {
- _, err := deployer.Client.Packages.Delete(depName)
- if err != nil {
- return err
- }
- } else {
-
- depServiceDeployer, err := deployer.getDependentDeployer(depName, depRecord)
- if err != nil {
- return err
- }
-
- plan, err := depServiceDeployer.ConstructUnDeploymentPlan()
- if err != nil {
- return err
- }
-
- // delete binding pkg if the origin package name is different
- if (depServiceDeployer.RootPackageName != depName) {
- _, err := deployer.Client.Packages.Delete(depName)
- 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
- }
- }
-
- if err := depServiceDeployer.unDeployAssets(plan); err != nil {
- errString := wski18n.T("Undeployment of dependency {{.depName}} did not complete sucessfully.\n",
- map[string]interface{}{"depName": depName})
- whisk.Debug(whisk.DbgError, errString)
- return err
- }
- }
- output = wski18n.T("Dependency {{.depName}} has been successfully undeployed.\n",
- map[string]interface{}{"depName": depName})
- whisk.Debug(whisk.DbgInfo, output)
- }
- }
-
- return nil
+ for _, pack := range deployer.Deployment.Packages {
+ for depName, depRecord := range pack.Dependencies {
+ output := wski18n.T("Undeploying dependency {{.depName}} ...",
+ map[string]interface{}{"depName": depName})
+ whisk.Debug(whisk.DbgInfo, output)
+
+ if depRecord.IsBinding {
+ _, err := deployer.Client.Packages.Delete(depName)
+ if err != nil {
+ return err
+ }
+ } else {
+
+ depServiceDeployer, err := deployer.getDependentDeployer(depName, depRecord)
+ if err != nil {
+ return err
+ }
+
+ plan, err := depServiceDeployer.ConstructUnDeploymentPlan()
+ if err != nil {
+ return err
+ }
+
+ // delete binding pkg if the origin package name is different
+ if depServiceDeployer.RootPackageName != depName {
+ if _, _, ok := deployer.Client.Packages.Get(depName); ok == nil {
+ _, err := deployer.Client.Packages.Delete(depName)
+ 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
+ }
+ }
+ }
+
+ if err := depServiceDeployer.unDeployAssets(plan); err != nil {
+ errString := wski18n.T("Undeployment of dependency {{.depName}} did not complete sucessfully.\n",
+ map[string]interface{}{"depName": depName})
+ whisk.Debug(whisk.DbgError, errString)
+ return err
+ }
+ }
+ output = wski18n.T("Dependency {{.depName}} has been successfully undeployed.\n",
+ map[string]interface{}{"depName": depName})
+ whisk.Debug(whisk.DbgInfo, output)
+ }
+ }
+
+ return nil
}
func (deployer *ServiceDeployer) UnDeployPackages(deployment *DeploymentApplication) error {
- for _, pack := range deployment.Packages {
- err := deployer.deletePackage(pack.Package)
- if err != nil {
- return err
- }
- }
- return nil
+ for _, pack := range deployment.Packages {
+ err := deployer.deletePackage(pack.Package)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
}
func (deployer *ServiceDeployer) UnDeploySequences(deployment *DeploymentApplication) error {
- for _, pack := range deployment.Packages {
- for _, action := range pack.Sequences {
- err := deployer.deleteAction(pack.Package.Name, action.Action)
- if err != nil {
- return err
- }
- }
- }
- return nil
+ for _, pack := range deployment.Packages {
+ for _, action := range pack.Sequences {
+ err := deployer.deleteAction(pack.Package.Name, action.Action)
+ if err != nil {
+ return err
+ }
+ }
+ }
+ return nil
}
// DeployActions into OpenWhisk
func (deployer *ServiceDeployer) UnDeployActions(deployment *DeploymentApplication) error {
- for _, pack := range deployment.Packages {
- for _, action := range pack.Actions {
- err := deployer.deleteAction(pack.Package.Name, action.Action)
- if err != nil {
- return err
- }
- }
- }
- return nil
+ for _, pack := range deployment.Packages {
+ for _, action := range pack.Actions {
+ err := deployer.deleteAction(pack.Package.Name, action.Action)
+ if err != nil {
+ return err
+ }
+ }
+ }
+ return nil
}
// Deploy Triggers into OpenWhisk
func (deployer *ServiceDeployer) UnDeployTriggers(deployment *DeploymentApplication) error {
- for _, trigger := range deployment.Triggers {
- if feedname, isFeed := utils.IsFeedAction(trigger); isFeed {
- err := deployer.deleteFeedAction(trigger, feedname)
- if err != nil {
- return err
- }
- } else {
- err := deployer.deleteTrigger(trigger)
- if err != nil {
- return err
- }
- }
- }
-
- return nil
+ for _, trigger := range deployment.Triggers {
+ if feedname, isFeed := utils.IsFeedAction(trigger); isFeed {
+ err := deployer.deleteFeedAction(trigger, feedname)
+ if err != nil {
+ return err
+ }
+ } else {
+ err := deployer.deleteTrigger(trigger)
+ if err != nil {
+ return err
+ }
+ }
+ }
+
+ return nil
}
// Deploy Rules into OpenWhisk
func (deployer *ServiceDeployer) UnDeployRules(deployment *DeploymentApplication) error {
- for _, rule := range deployment.Rules {
- err := deployer.deleteRule(rule)
- if err != nil {
- return err
- }
- }
- return nil
+ for _, rule := range deployment.Rules {
+ err := deployer.deleteRule(rule)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
}
func (deployer *ServiceDeployer) deletePackage(packa *whisk.Package) error {
- output := wski18n.T("Removing package {{.package}} ...",
- map[string]interface{}{"package": packa.Name})
- whisk.Debug(whisk.DbgInfo, output)
- _, err := deployer.Client.Packages.Delete(packa.Name)
- 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
- }
- return nil
+ output := wski18n.T("Removing package {{.package}} ...",
+ map[string]interface{}{"package": packa.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+ if _, _, ok := deployer.Client.Packages.Get(packa.Name); ok == nil {
+ _, err := deployer.Client.Packages.Delete(packa.Name)
+ 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
+ }
+ }
+ return nil
}
func (deployer *ServiceDeployer) deleteTrigger(trigger *whisk.Trigger) error {
- output := wski18n.T("Removing trigger {{.trigger}} ...",
- map[string]interface{}{"trigger": trigger.Name})
- whisk.Debug(whisk.DbgInfo, output)
- _, _, err := deployer.Client.Triggers.Delete(trigger.Name)
- 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
- } else {
- output := wski18n.T("Trigger {{.trigger}} has been removed.\n",
- map[string]interface{}{"trigger": trigger.Name})
- whisk.Debug(whisk.DbgInfo, output)
- }
- return nil
+ output := wski18n.T("Removing trigger {{.trigger}} ...",
+ map[string]interface{}{"trigger": trigger.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+ _, _, err := deployer.Client.Triggers.Delete(trigger.Name)
+ 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
+ } else {
+ output := wski18n.T("Trigger {{.trigger}} has been removed.\n",
+ map[string]interface{}{"trigger": trigger.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+ }
+ return nil
}
func (deployer *ServiceDeployer) deleteFeedAction(trigger *whisk.Trigger, feedName string) error {
- params := make(whisk.KeyValueArr, 0)
- params = append(params, whisk.KeyValue{Key: "authKey", Value: deployer.ClientConfig.AuthToken})
- params = append(params, whisk.KeyValue{Key: "lifecycleEvent", Value: "DELETE"})
- params = append(params, whisk.KeyValue{Key: "triggerName", Value: "/" + deployer.Client.Namespace + "/" + trigger.Name})
-
- trigger.Parameters = nil
-
- _, _, err := deployer.Client.Triggers.Delete(trigger.Name)
- 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
- } else {
- parameters := make(map[string]interface{})
- for _, keyVal := range params {
- parameters[keyVal.Key] = keyVal.Value
- }
-
- qName, err := utils.ParseQualifiedName(feedName, deployer.ClientConfig.Namespace)
- if err != nil {
- return err
- }
-
- namespace := deployer.Client.Namespace
- deployer.Client.Namespace = qName.Namespace
- _, _, err = deployer.Client.Actions.Invoke(qName.EntityName, parameters, true, true)
- deployer.Client.Namespace = namespace
-
- if err != nil {
- wskErr := err.(*whisk.WskError)
- errString := wski18n.T("Got error 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
-
- }
- }
- return nil
+ params := make(whisk.KeyValueArr, 0)
+ params = append(params, whisk.KeyValue{Key: "authKey", Value: deployer.ClientConfig.AuthToken})
+ params = append(params, whisk.KeyValue{Key: "lifecycleEvent", Value: "DELETE"})
+ params = append(params, whisk.KeyValue{Key: "triggerName", Value: "/" + deployer.Client.Namespace + "/" + trigger.Name})
+
+ trigger.Parameters = nil
+
+ _, _, err := deployer.Client.Triggers.Delete(trigger.Name)
+ 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
+ } else {
+ parameters := make(map[string]interface{})
+ for _, keyVal := range params {
+ parameters[keyVal.Key] = keyVal.Value
+ }
+
+ qName, err := utils.ParseQualifiedName(feedName, deployer.ClientConfig.Namespace)
+ if err != nil {
+ return err
+ }
+
+ namespace := deployer.Client.Namespace
+ deployer.Client.Namespace = qName.Namespace
+ _, _, err = deployer.Client.Actions.Invoke(qName.EntityName, parameters, true, true)
+ deployer.Client.Namespace = namespace
+
+ if err != nil {
+ wskErr := err.(*whisk.WskError)
+ errString := wski18n.T("Got error 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
+
+ }
+ }
+ return nil
}
func (deployer *ServiceDeployer) deleteRule(rule *whisk.Rule) error {
- output := wski18n.T("Removing rule {{.rule}} ...",
- map[string]interface{}{"rule": rule.Name})
- whisk.Debug(whisk.DbgInfo, output)
- _, _, err := deployer.Client.Rules.SetState(rule.Name, "inactive")
-
- if err != nil {
- wskErr := err.(*whisk.WskError)
- errString := wski18n.T("Got error setting the status of 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
- } else {
-
- _, err = deployer.Client.Rules.Delete(rule.Name)
-
- 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
- }
- }
- output = wski18n.T("Rule {{.rule}} has been removed.\n",
- map[string]interface{}{"rule": rule.Name})
- whisk.Debug(whisk.DbgInfo, output)
- return nil
+ output := wski18n.T("Removing rule {{.rule}} ...",
+ map[string]interface{}{"rule": rule.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+ _, _, err := deployer.Client.Rules.SetState(rule.Name, "inactive")
+
+ if err != nil {
+ wskErr := err.(*whisk.WskError)
+ errString := wski18n.T("Got error setting the status of 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
+ } else {
+
+ _, err = deployer.Client.Rules.Delete(rule.Name)
+
+ 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
+ }
+ }
+ output = wski18n.T("Rule {{.rule}} has been removed.\n",
+ map[string]interface{}{"rule": rule.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+ return nil
}
// Utility function to call go-whisk framework to make action
func (deployer *ServiceDeployer) deleteAction(pkgname string, action *whisk.Action) error {
- // call ActionService Thru Client
- if deployer.DeployActionInPackage {
- // the action will be deleted under package with pattern 'packagename/actionname'
- action.Name = strings.Join([]string{pkgname, action.Name}, "/")
- }
-
- output := wski18n.T("Removing action {{.action}} ...",
- map[string]interface{}{"action": action.Name})
- whisk.Debug(whisk.DbgInfo, output)
-
- _, err := deployer.Client.Actions.Delete(action.Name)
- 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
-
- }
- output = wski18n.T("Action {{.action}} has been removed.\n",
- map[string]interface{}{"action": action.Name})
- whisk.Debug(whisk.DbgInfo, output)
- return nil
+ // call ActionService Thru Client
+ if deployer.DeployActionInPackage {
+ // the action will be deleted under package with pattern 'packagename/actionname'
+ action.Name = strings.Join([]string{pkgname, action.Name}, "/")
+ }
+
+ output := wski18n.T("Removing action {{.action}} ...",
+ map[string]interface{}{"action": action.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+
+ if _, _, ok := deployer.Client.Actions.Get(action.Name); ok == nil {
+ _, err := deployer.Client.Actions.Delete(action.Name)
+ 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 utils.NewWhiskClientError(wskErr.Error(), wskErr.ExitCode)
+
+ }
+ output = wski18n.T("Action {{.action}} has been removed.\n",
+ map[string]interface{}{"action": action.Name})
+ whisk.Debug(whisk.DbgInfo, output)
+ }
+ return nil
}
// from whisk go client
func (deployer *ServiceDeployer) getQualifiedName(name string, namespace string) string {
- if strings.HasPrefix(name, "/") {
- return name
- } else if strings.HasPrefix(namespace, "/") {
- return fmt.Sprintf("%s/%s", namespace, name)
- } else {
- if len(namespace) == 0 {
- namespace = deployer.ClientConfig.Namespace
- }
- return fmt.Sprintf("/%s/%s", namespace, name)
- }
+ if strings.HasPrefix(name, "/") {
+ return name
+ } else if strings.HasPrefix(namespace, "/") {
+ return fmt.Sprintf("%s/%s", namespace, name)
+ } else {
+ if len(namespace) == 0 {
+ namespace = deployer.ClientConfig.Namespace
+ }
+ return fmt.Sprintf("/%s/%s", namespace, name)
+ }
}
func (deployer *ServiceDeployer) printDeploymentAssets(assets *DeploymentApplication) {
- // pretty ASCII OpenWhisk graphic
- utils.PrintOpenWhiskOutputln(" ____ ___ _ _ _ _ _\n /\\ \\ / _ \\ _ __ ___ _ __ | | | | |__ (_)___| | __\n /\\ /__\\ \\ | | | | '_ \\ / _ \\ '_ \\| | | | '_ \\| / __| |/ /\n / \\____ \\ / | |_| | |_) | __/ | | | |/\\| | | | | \\__ \\ <\n \\ \\ / \\/ \\___/| .__/ \\___|_| |_|__/\\__|_| |_|_|___/_|\\_\\ \n \\___\\/ |_|\n")
-
- utils.PrintOpenWhiskOutputln("Packages:")
- for _, pack := range assets.Packages {
- utils.PrintOpenWhiskOutputln("Name: " + pack.Package.Name)
- utils.PrintOpenWhiskOutputln(" bindings: ")
- for _, p := range pack.Package.Parameters {
- jsonValue, err := utils.PrettyJSON(p.Value)
- if err != nil {
- fmt.Printf(" - %s : %s\n", p.Key, "Unknown value")
- } else {
- fmt.Printf(" - %s : %v\n", p.Key, jsonValue)
- }
- }
-
- for key, dep := range pack.Dependencies {
- utils.PrintOpenWhiskOutputln(" * dependency: " + key)
- utils.PrintOpenWhiskOutputln(" location: " + dep.Location)
- if !dep.IsBinding {
- utils.PrintOpenWhiskOutputln(" local path: " + dep.ProjectPath)
- }
- }
-
- utils.PrintOpenWhiskOutputln("")
-
- for _, action := range pack.Actions {
- utils.PrintOpenWhiskOutputln(" * action: " + action.Action.Name)
- utils.PrintOpenWhiskOutputln(" bindings: ")
- for _, p := range action.Action.Parameters {
- jsonValue, err := utils.PrettyJSON(p.Value)
- if err != nil {
- fmt.Printf(" - %s : %s\n", p.Key, "Unknown value")
- } else {
- fmt.Printf(" - %s : %v\n", p.Key, jsonValue)
- }
- }
- utils.PrintOpenWhiskOutputln(" annotations: ")
- for _, p := range action.Action.Annotations {
- fmt.Printf(" - %s : %v\n", p.Key, p.Value)
-
- }
- }
-
- utils.PrintOpenWhiskOutputln("")
- for _, action := range pack.Sequences {
- utils.PrintOpenWhiskOutputln(" * sequence: " + action.Action.Name)
- }
-
- utils.PrintOpenWhiskOutputln("")
- }
-
- utils.PrintOpenWhiskOutputln("Triggers:")
- for _, trigger := range assets.Triggers {
- utils.PrintOpenWhiskOutputln("* trigger: " + trigger.Name)
- utils.PrintOpenWhiskOutputln(" bindings: ")
-
- for _, p := range trigger.Parameters {
- jsonValue, err := utils.PrettyJSON(p.Value)
- if err != nil {
- fmt.Printf(" - %s : %s\n", p.Key, "Unknown value")
- } else {
- fmt.Printf(" - %s : %v\n", p.Key, jsonValue)
- }
- }
-
- utils.PrintOpenWhiskOutputln(" annotations: ")
- for _, p := range trigger.Annotations {
-
- value := "?"
- if str, ok := p.Value.(string); ok {
- value = str
- }
- utils.PrintOpenWhiskOutputln(" - name: " + p.Key + " value: " + value)
- }
- }
-
- utils.PrintOpenWhiskOutputln("\n Rules")
- for _, rule := range assets.Rules {
- utils.PrintOpenWhiskOutputln("* rule: " + rule.Name)
- utils.PrintOpenWhiskOutputln(" - trigger: " + rule.Trigger.(string) + "\n - action: " + rule.Action.(string))
- }
-
- utils.PrintOpenWhiskOutputln("")
+ // pretty ASCII OpenWhisk graphic
+ utils.PrintOpenWhiskOutputln(" ____ ___ _ _ _ _ _\n /\\ \\ / _ \\ _ __ ___ _ __ | | | | |__ (_)___| | __\n /\\ /__\\ \\ | | | | '_ \\ / _ \\ '_ \\| | | | '_ \\| / __| |/ /\n / \\____ \\ / | |_| | |_) | __/ | | | |/\\| | | | | \\__ \\ <\n \\ \\ / \\/ \\___/| .__/ \\___|_| |_|__/\\__|_| |_|_|___/_|\\_\\ \n \\___\\/ |_|\n")
+
+ utils.PrintOpenWhiskOutputln("Packages:")
+ for _, pack := range assets.Packages {
+ utils.PrintOpenWhiskOutputln("Name: " + pack.Package.Name)
+ utils.PrintOpenWhiskOutputln(" bindings: ")
+ for _, p := range pack.Package.Parameters {
+ jsonValue, err := utils.PrettyJSON(p.Value)
+ if err != nil {
+ fmt.Printf(" - %s : %s\n", p.Key, "Unknown value")
+ } else {
+ fmt.Printf(" - %s : %v\n", p.Key, jsonValue)
+ }
+ }
+
+ for key, dep := range pack.Dependencies {
+ utils.PrintOpenWhiskOutputln(" * dependency: " + key)
+ utils.PrintOpenWhiskOutputln(" location: " + dep.Location)
+ if !dep.IsBinding {
+ utils.PrintOpenWhiskOutputln(" local path: " + dep.ProjectPath)
+ }
+ }
+
+ utils.PrintOpenWhiskOutputln("")
+
+ for _, action := range pack.Actions {
+ utils.PrintOpenWhiskOutputln(" * action: " + action.Action.Name)
+ utils.PrintOpenWhiskOutputln(" bindings: ")
+ for _, p := range action.Action.Parameters {
+ jsonValue, err := utils.PrettyJSON(p.Value)
+ if err != nil {
+ fmt.Printf(" - %s : %s\n", p.Key, "Unknown value")
+ } else {
+ fmt.Printf(" - %s : %v\n", p.Key, jsonValue)
+ }
+ }
+ utils.PrintOpenWhiskOutputln(" annotations: ")
+ for _, p := range action.Action.Annotations {
+ fmt.Printf(" - %s : %v\n", p.Key, p.Value)
+
+ }
+ }
+
+ utils.PrintOpenWhiskOutputln("")
+ for _, action := range pack.Sequences {
+ utils.PrintOpenWhiskOutputln(" * sequence: " + action.Action.Name)
+ }
+
+ utils.PrintOpenWhiskOutputln("")
+ }
+
+ utils.PrintOpenWhiskOutputln("Triggers:")
+ for _, trigger := range assets.Triggers {
+ utils.PrintOpenWhiskOutputln("* trigger: " + trigger.Name)
+ utils.PrintOpenWhiskOutputln(" bindings: ")
+
+ for _, p := range trigger.Parameters {
+ jsonValue, err := utils.PrettyJSON(p.Value)
+ if err != nil {
+ fmt.Printf(" - %s : %s\n", p.Key, "Unknown value")
+ } else {
+ fmt.Printf(" - %s : %v\n", p.Key, jsonValue)
+ }
+ }
+
+ utils.PrintOpenWhiskOutputln(" annotations: ")
+ for _, p := range trigger.Annotations {
+
+ value := "?"
+ if str, ok := p.Value.(string); ok {
+ value = str
+ }
+ utils.PrintOpenWhiskOutputln(" - name: " + p.Key + " value: " + value)
+ }
+ }
+
+ utils.PrintOpenWhiskOutputln("\n Rules")
+ for _, rule := range assets.Rules {
+ utils.PrintOpenWhiskOutputln("* rule: " + rule.Name)
+ utils.PrintOpenWhiskOutputln(" - trigger: " + rule.Trigger.(string) + "\n - action: " + rule.Action.(string))
+ }
+
+ utils.PrintOpenWhiskOutputln("")
}
func (deployer *ServiceDeployer) getDependentDeployer(depName string, depRecord utils.DependencyRecord) (*ServiceDeployer, error) {
- depServiceDeployer := NewServiceDeployer()
- projectPath := path.Join(depRecord.ProjectPath, depName+"-"+depRecord.Version)
- if len(depRecord.SubFolder)>0 {
- projectPath = path.Join(projectPath,depRecord.SubFolder)
- }
- manifestPath := utils.GetManifestFilePath(projectPath)
- deploymentPath := utils.GetDeploymentFilePath(projectPath)
- depServiceDeployer.ProjectPath = projectPath
- depServiceDeployer.ManifestPath = manifestPath
- depServiceDeployer.DeploymentPath = deploymentPath
- depServiceDeployer.IsInteractive = true
-
- depServiceDeployer.Client = deployer.Client
- depServiceDeployer.ClientConfig = deployer.ClientConfig
-
- depServiceDeployer.DependencyMaster = deployer.DependencyMaster
-
- // share the master dependency list
- depServiceDeployer.DependencyMaster = deployer.DependencyMaster
-
- return depServiceDeployer, nil
+ depServiceDeployer := NewServiceDeployer()
+ projectPath := path.Join(depRecord.ProjectPath, depName+"-"+depRecord.Version)
+ if len(depRecord.SubFolder) > 0 {
+ projectPath = path.Join(projectPath, depRecord.SubFolder)
+ }
+ manifestPath := utils.GetManifestFilePath(projectPath)
+ deploymentPath := utils.GetDeploymentFilePath(projectPath)
+ depServiceDeployer.ProjectPath = projectPath
+ depServiceDeployer.ManifestPath = manifestPath
+ depServiceDeployer.DeploymentPath = deploymentPath
+ depServiceDeployer.IsInteractive = true
+
+ depServiceDeployer.Client = deployer.Client
+ depServiceDeployer.ClientConfig = deployer.ClientConfig
+
+ depServiceDeployer.DependencyMaster = deployer.DependencyMaster
+
+ // share the master dependency list
+ depServiceDeployer.DependencyMaster = deployer.DependencyMaster
+
+ return depServiceDeployer, nil
}
diff --git a/parsers/manifest_parser.go b/parsers/manifest_parser.go
index d1665eb..ccaff6b 100644
--- a/parsers/manifest_parser.go
+++ b/parsers/manifest_parser.go
@@ -101,11 +101,30 @@ func (dm *YAMLParser) ParseManifest(manifestPath string) (*ManifestYAML, error)
return &maniyaml, nil
}
-func (dm *YAMLParser) ComposeDependencies(mani *ManifestYAML, projectPath string, filePath string) (map[string]utils.DependencyRecord, error) {
+func (dm *YAMLParser) ComposeDependenciesFromAllPackages(manifest *ManifestYAML, projectPath string, filePath string) (map[string]utils.DependencyRecord, error) {
+ dependencies := make(map[string]utils.DependencyRecord)
+ if manifest.Package.Packagename != "" {
+ return dm.ComposeDependencies(manifest.Package, projectPath, filePath, manifest.Package.Packagename)
+ } else if manifest.Packages != nil {
+ for n, p := range manifest.Packages {
+ d, err := dm.ComposeDependencies(p, projectPath, filePath, n)
+ if err == nil {
+ for k, v := range d {
+ dependencies[k] = v
+ }
+ } else {
+ return nil, err
+ }
+ }
+ }
+ return dependencies, nil
+}
+
+func (dm *YAMLParser) ComposeDependencies(pkg Package, projectPath string, filePath string, packageName string) (map[string]utils.DependencyRecord, error) {
var errorParser error
depMap := make(map[string]utils.DependencyRecord)
- for key, dependency := range mani.Package.Dependencies {
+ for key, dependency := range pkg.Dependencies {
version := dependency.Version
if version == "" {
version = "master"
@@ -158,7 +177,8 @@ func (dm *YAMLParser) ComposeDependencies(mani *ManifestYAML, projectPath string
}
packDir := path.Join(projectPath, "Packages")
- depMap[key] = utils.NewDependencyRecord(packDir, mani.Package.Packagename, location, version, keyValArrParams, keyValArrAnot, isBinding)
+ depName := packageName + ":" + key
+ depMap[depName] = utils.NewDependencyRecord(packDir, packageName, location, version, keyValArrParams, keyValArrAnot, isBinding)
}
return depMap, nil
@@ -217,7 +237,7 @@ func (dm *YAMLParser) ComposePackage(pkg Package, packageName string, filePath s
return pag, nil
}
-func (dm *YAMLParser) ComposeSequencesFromAllPackages(namespace string, mani *ManifestYAML) (ar []utils.ActionRecord, err error) {
+func (dm *YAMLParser) ComposeSequencesFromAllPackages(namespace string, mani *ManifestYAML) ([]utils.ActionRecord, error) {
var s1 []utils.ActionRecord = make([]utils.ActionRecord, 0)
if mani.Package.Packagename != "" {
return dm.ComposeSequences(namespace, mani.Package.Sequences, mani.Package.Packagename)
diff --git a/parsers/manifest_parser_test.go b/parsers/manifest_parser_test.go
index e9e9d8b..ed6ecbe 100644
--- a/parsers/manifest_parser_test.go
+++ b/parsers/manifest_parser_test.go
@@ -29,6 +29,7 @@ import (
"path/filepath"
"reflect"
"strconv"
+ "strings"
)
// Test 1: validate manifest_parser:Unmarshal() method with a sample manifest in NodeJS
@@ -1205,7 +1206,7 @@ func TestComposeDependencies(t *testing.T) {
// read and parse manifest.yaml file
p := NewYAMLParser()
m, _ := p.ParseManifest(tmpfile.Name())
- depdList, err := p.ComposeDependencies(m, "/project_folder", tmpfile.Name())
+ depdList, err := p.ComposeDependenciesFromAllPackages(m, "/project_folder", tmpfile.Name())
if err != nil {
assert.Fail(t, "Failed to compose rules")
}
@@ -1213,7 +1214,9 @@ func TestComposeDependencies(t *testing.T) {
for depdy_name, depdy := range depdList {
assert.Equal(t, "helloworld", depdy.Packagename, "Failed to set dependecy isbinding")
assert.Equal(t, "/project_folder/Packages", depdy.ProjectPath, "Failed to set dependecy isbinding")
- switch depdy_name {
+ d := strings.Split(depdy_name, ":")
+ assert.NotEqual(t, d[1], "", "Failed to get dependency name")
+ switch d[1] {
case "myhelloworld":
assert.Equal(t, "https://github.com/user/repo/folder", depdy.Location, "Failed to set dependecy location")
assert.Equal(t, false, depdy.IsBinding, "Failed to set dependecy isbinding")
diff --git a/tests/src/integration/validate-packages-in-manifest/manifest.yaml b/tests/src/integration/validate-packages-in-manifest/manifest.yaml
index 81679f6..0c9cec4 100644
--- a/tests/src/integration/validate-packages-in-manifest/manifest.yaml
+++ b/tests/src/integration/validate-packages-in-manifest/manifest.yaml
@@ -1,5 +1,10 @@
packages:
packageNodeJS:
+ dependencies:
+ hellowhisk:
+ location: github.com/apache/incubator-openwhisk-test/packages/hellowhisk
+ myhelloworlds:
+ location: github.com/apache/incubator-openwhisk-test/packages/helloworlds
actions:
helloNodejs-1:
function: actions/hello.js
@@ -30,7 +35,7 @@ packages:
description: location of a person
sequences:
helloworldnodejs-series:
- actions: helloNodejs-1, helloNodejs-2, helloNodejs-3
+ actions: helloNodejs-1, helloNodejs-2, helloNodejs-3, hellowhisk/greeting, hellowhisk/httpGet, myhelloworlds/hello-js
triggers:
triggerNodeJS:
rules:
@@ -38,6 +43,11 @@ packages:
trigger: triggerNodeJS
action: helloworldnodejs-series
packagePython:
+ dependencies:
+ hellowhisk:
+ location: github.com/apache/incubator-openwhisk-test/packages/hellowhisk
+ helloworlds:
+ location: github.com/apache/incubator-openwhisk-test/packages/helloworlds
actions:
helloPython-1:
function: actions/hello.py
@@ -66,7 +76,7 @@ packages:
runtime: python
sequences:
helloworldpython-series:
- actions: helloPython-1, helloPython-2, helloPython-3
+ actions: helloPython-1, helloPython-2, helloPython-3, hellowhisk/greeting, hellowhisk/httpGet, helloworlds/hello-js
triggers:
triggerPython:
rules:
--
To stop receiving notification emails like this one, please contact
['"commits@openwhisk.apache.org" <co...@openwhisk.apache.org>'].