runtimes (#946)
* enforcing strict flag
* wip
* adding runtimes json file
* creating a seperate package runtimes
* moving dependecies to its own package
* moving conductor out of utils
* moving webaction out of utils
* fixing unit testing
* fixing runtime.json
* fixing unit test
* updating limit datatype
* returning error from runtimes
* updating runtimes json
* adding strict flag when runtimes can not be accessed from server
* formatting url
* adding error reporting
* updating error title
diff --git a/cmd/export.go b/cmd/export.go
index 746854c..5135dba 100644
--- a/cmd/export.go
+++ b/cmd/export.go
@@ -27,6 +27,7 @@
"github.com/apache/incubator-openwhisk-client-go/whisk"
"github.com/apache/incubator-openwhisk-wskdeploy/deployers"
"github.com/apache/incubator-openwhisk-wskdeploy/parsers"
+ "github.com/apache/incubator-openwhisk-wskdeploy/runtimes"
"github.com/apache/incubator-openwhisk-wskdeploy/utils"
"github.com/apache/incubator-openwhisk-wskdeploy/wski18n"
"github.com/spf13/cobra"
@@ -389,7 +390,7 @@
filename = action.Name + getBinaryKindExtension(runtime)
} else {
- filename = action.Name + "." + utils.FileRuntimeExtensionsMap[action.Exec.Kind]
+ filename = action.Name + "." + runtimes.FileRuntimeExtensionsMap[action.Exec.Kind]
}
os.MkdirAll(directory, os.ModePerm)
diff --git a/cmd/root.go b/cmd/root.go
index 7d4469a..d468bc4 100644
--- a/cmd/root.go
+++ b/cmd/root.go
@@ -24,7 +24,9 @@
"strings"
"github.com/apache/incubator-openwhisk-client-go/whisk"
+ "github.com/apache/incubator-openwhisk-wskdeploy/dependencies"
"github.com/apache/incubator-openwhisk-wskdeploy/deployers"
+ "github.com/apache/incubator-openwhisk-wskdeploy/runtimes"
"github.com/apache/incubator-openwhisk-wskdeploy/utils"
"github.com/apache/incubator-openwhisk-wskdeploy/wskderrors"
"github.com/apache/incubator-openwhisk-wskdeploy/wski18n"
@@ -118,14 +120,16 @@
}
// TODO() add Trace of runtimes found at apihost
-func setSupportedRuntimes(apiHost string) {
- op, error := utils.ParseOpenWhisk(apiHost)
- if error == nil {
- utils.SupportedRunTimes = utils.ConvertToMap(op)
- utils.DefaultRunTimes = utils.DefaultRuntimes(op)
- utils.FileExtensionRuntimeKindMap = utils.FileExtensionRuntimes(op)
- utils.FileRuntimeExtensionsMap = utils.FileRuntimeExtensions(op)
+func setSupportedRuntimes(apiHost string) error {
+ op, err := runtimes.ParseOpenWhisk(apiHost)
+ if err != nil {
+ return err
}
+ runtimes.SupportedRunTimes = runtimes.ConvertToMap(op)
+ runtimes.DefaultRunTimes = runtimes.DefaultRuntimes(op)
+ runtimes.FileExtensionRuntimeKindMap = runtimes.FileExtensionRuntimes(op)
+ runtimes.FileRuntimeExtensionsMap = runtimes.FileRuntimeExtensions(op)
+ return nil
}
func displayCommandUsingFilenameMessage(command string, filetype string, path string) {
@@ -213,7 +217,7 @@
deployer.Report = utils.Flags.Report
// master record of any dependency that has been downloaded
- deployer.DependencyMaster = make(map[string]utils.DependencyRecord)
+ deployer.DependencyMaster = make(map[string]dependencies.DependencyRecord)
// Read credentials from Configuration file, manifest file or deployment file
clientConfig, error := deployers.NewWhiskConfig(
@@ -233,10 +237,13 @@
deployer.ClientConfig = clientConfig
// The auth, apihost and namespace have been chosen, so that we can check the supported runtimes here.
- setSupportedRuntimes(clientConfig.Host)
+ err := setSupportedRuntimes(clientConfig.Host)
+ if err != nil {
+ return err
+ }
// Construct Deployment Plan
- err := deployer.ConstructDeploymentPlan()
+ err = deployer.ConstructDeploymentPlan()
if err != nil {
return err
}
@@ -282,9 +289,12 @@
deployer.ClientConfig = clientConfig
// The auth, apihost and namespace have been chosen, so that we can check the supported runtimes here.
- setSupportedRuntimes(clientConfig.Host)
+ err := setSupportedRuntimes(clientConfig.Host)
+ if err != nil {
+ return err
+ }
- err := deployer.UnDeployProject()
+ err = deployer.UnDeployProject()
if err != nil {
return err
}
@@ -336,7 +346,10 @@
deployer.ClientConfig = clientConfig
// The auth, apihost and namespace have been chosen, so that we can check the supported runtimes here.
- setSupportedRuntimes(clientConfig.Host)
+ err := setSupportedRuntimes(clientConfig.Host)
+ if err != nil {
+ return err
+ }
verifiedPlan, err := deployer.ConstructUnDeploymentPlan()
if err != nil {
diff --git a/utils/conductor.go b/conductor/conductor.go
similarity index 97%
rename from utils/conductor.go
rename to conductor/conductor.go
index 8688d81..8f833d1 100644
--- a/utils/conductor.go
+++ b/conductor/conductor.go
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package utils
+package conductor
import "github.com/apache/incubator-openwhisk-client-go/whisk"
diff --git a/utils/conductor_test.go b/conductor/conductor_test.go
similarity index 98%
rename from utils/conductor_test.go
rename to conductor/conductor_test.go
index ffaab6b..0a007fb 100644
--- a/utils/conductor_test.go
+++ b/conductor/conductor_test.go
@@ -17,7 +17,7 @@
* limitations under the License.
*/
-package utils
+package conductor
import (
"testing"
diff --git a/utils/dependencies.go b/dependencies/dependencies.go
similarity index 98%
rename from utils/dependencies.go
rename to dependencies/dependencies.go
index eba29b8..062b2d6 100644
--- a/utils/dependencies.go
+++ b/dependencies/dependencies.go
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package utils
+package dependencies
import (
"strings"
diff --git a/utils/dependencies_test.go b/dependencies/dependencies_test.go
similarity index 99%
rename from utils/dependencies_test.go
rename to dependencies/dependencies_test.go
index 7ed5c24..2f4ccb0 100644
--- a/utils/dependencies_test.go
+++ b/dependencies/dependencies_test.go
@@ -17,7 +17,7 @@
* limitations under the License.
*/
-package utils
+package dependencies
import (
"testing"
diff --git a/utils/gitreader.go b/dependencies/gitreader.go
similarity index 98%
rename from utils/gitreader.go
rename to dependencies/gitreader.go
index 741da88..09a62a2 100644
--- a/utils/gitreader.go
+++ b/dependencies/gitreader.go
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package utils
+package dependencies
import (
"archive/zip"
diff --git a/deployers/manifestreader.go b/deployers/manifestreader.go
index 29fbd94..6434907 100644
--- a/deployers/manifestreader.go
+++ b/deployers/manifestreader.go
@@ -22,6 +22,7 @@
"fmt"
"github.com/apache/incubator-openwhisk-client-go/whisk"
+ "github.com/apache/incubator-openwhisk-wskdeploy/dependencies"
"github.com/apache/incubator-openwhisk-wskdeploy/parsers"
"github.com/apache/incubator-openwhisk-wskdeploy/utils"
"github.com/apache/incubator-openwhisk-wskdeploy/wskderrors"
@@ -161,7 +162,7 @@
return nil
}
-func (reader *ManifestReader) SetDependencies(deps map[string]utils.DependencyRecord) error {
+func (reader *ManifestReader) SetDependencies(deps map[string]dependencies.DependencyRecord) error {
dep := reader.serviceDeployer
@@ -176,7 +177,7 @@
}
if !dependency.IsBinding && !reader.IsUndeploy {
if _, exists := dep.DependencyMaster[depName]; exists {
- if !utils.CompareDependencyRecords(dep.DependencyMaster[depName], dependency) {
+ if !dependencies.CompareDependencyRecords(dep.DependencyMaster[depName], dependency) {
location := strings.Join([]string{dep.DependencyMaster[depName].Location, dependency.Location}, ",")
errmsg := wski18n.T(wski18n.ID_ERR_DEPENDENCIES_WITH_SAME_LABEL_X_dependency_X_location_X,
map[string]interface{}{wski18n.KEY_DEPENDENCY: depName,
@@ -184,7 +185,7 @@
return wskderrors.NewYAMLParserErr(dep.ManifestPath, errmsg)
}
}
- gitReader := utils.NewGitReader(depName, dependency)
+ gitReader := dependencies.NewGitReader(depName, dependency)
err := gitReader.CloneDependency()
if err != nil {
return err
diff --git a/deployers/manifestreader_test.go b/deployers/manifestreader_test.go
index c0ea0d7..475608a 100644
--- a/deployers/manifestreader_test.go
+++ b/deployers/manifestreader_test.go
@@ -24,7 +24,9 @@
"testing"
"github.com/apache/incubator-openwhisk-client-go/whisk"
+ "github.com/apache/incubator-openwhisk-wskdeploy/dependencies"
"github.com/apache/incubator-openwhisk-wskdeploy/parsers"
+ "github.com/apache/incubator-openwhisk-wskdeploy/runtimes"
"github.com/apache/incubator-openwhisk-wskdeploy/utils"
"github.com/apache/incubator-openwhisk-wskdeploy/wskprint"
"github.com/stretchr/testify/assert"
@@ -63,7 +65,7 @@
deployer.DeploymentPath = deploymentFile
deployer.Preview = utils.Flags.Preview
- deployer.DependencyMaster = make(map[string]utils.DependencyRecord)
+ deployer.DependencyMaster = make(map[string]dependencies.DependencyRecord)
config := whisk.Config{
Namespace: "test",
@@ -73,12 +75,12 @@
}
deployer.ClientConfig = &config
- op, error := utils.ParseOpenWhisk(deployer.ClientConfig.Host)
+ op, error := runtimes.ParseOpenWhisk(deployer.ClientConfig.Host)
if error == nil {
- utils.SupportedRunTimes = utils.ConvertToMap(op)
- utils.DefaultRunTimes = utils.DefaultRuntimes(op)
- utils.FileExtensionRuntimeKindMap = utils.FileExtensionRuntimes(op)
- utils.FileRuntimeExtensionsMap = utils.FileRuntimeExtensions(op)
+ runtimes.SupportedRunTimes = runtimes.ConvertToMap(op)
+ runtimes.DefaultRunTimes = runtimes.DefaultRuntimes(op)
+ runtimes.FileExtensionRuntimeKindMap = runtimes.FileExtensionRuntimes(op)
+ runtimes.FileRuntimeExtensionsMap = runtimes.FileRuntimeExtensions(op)
}
return deployer, nil
diff --git a/deployers/servicedeployer.go b/deployers/servicedeployer.go
index d5447c0..a0e84e7 100644
--- a/deployers/servicedeployer.go
+++ b/deployers/servicedeployer.go
@@ -29,6 +29,7 @@
"time"
"github.com/apache/incubator-openwhisk-client-go/whisk"
+ "github.com/apache/incubator-openwhisk-wskdeploy/dependencies"
"github.com/apache/incubator-openwhisk-wskdeploy/parsers"
"github.com/apache/incubator-openwhisk-wskdeploy/utils"
"github.com/apache/incubator-openwhisk-wskdeploy/wskderrors"
@@ -61,7 +62,7 @@
type DeploymentPackage struct {
Package *whisk.Package
- Dependencies map[string]utils.DependencyRecord
+ Dependencies map[string]dependencies.DependencyRecord
Actions map[string]utils.ActionRecord
Sequences map[string]utils.ActionRecord
Inputs parsers.PackageInputs
@@ -69,7 +70,7 @@
func NewDeploymentPackage() *DeploymentPackage {
var dep DeploymentPackage
- dep.Dependencies = make(map[string]utils.DependencyRecord)
+ dep.Dependencies = make(map[string]dependencies.DependencyRecord)
dep.Actions = make(map[string]utils.ActionRecord)
dep.Sequences = make(map[string]utils.ActionRecord)
dep.Inputs = parsers.PackageInputs{}
@@ -94,7 +95,7 @@
ProjectPath string
DeploymentPath string
ClientConfig *whisk.Config
- DependencyMaster map[string]utils.DependencyRecord
+ DependencyMaster map[string]dependencies.DependencyRecord
ManagedAnnotation whisk.KeyValue
}
@@ -103,7 +104,7 @@
var dep ServiceDeployer
dep.Deployment = NewDeploymentProject()
dep.Preview = true
- dep.DependencyMaster = make(map[string]utils.DependencyRecord)
+ dep.DependencyMaster = make(map[string]dependencies.DependencyRecord)
dep.ProjectInputs = make(map[string]parsers.Parameter, 0)
return &dep
}
@@ -1594,7 +1595,7 @@
}
-func (deployer *ServiceDeployer) getDependentDeployer(depName string, depRecord utils.DependencyRecord) (*ServiceDeployer, error) {
+func (deployer *ServiceDeployer) getDependentDeployer(depName string, depRecord dependencies.DependencyRecord) (*ServiceDeployer, error) {
depServiceDeployer := NewServiceDeployer()
projectPath := path.Join(depRecord.ProjectPath, depName+"-"+depRecord.Version)
if len(depRecord.SubFolder) > 0 {
diff --git a/parsers/manifest_parser.go b/parsers/manifest_parser.go
index b41a7be..f7853be 100644
--- a/parsers/manifest_parser.go
+++ b/parsers/manifest_parser.go
@@ -20,15 +20,20 @@
import (
"encoding/base64"
"errors"
- "gopkg.in/yaml.v2"
"io/ioutil"
"os"
"path"
"path/filepath"
"strings"
+ "gopkg.in/yaml.v2"
+
"github.com/apache/incubator-openwhisk-client-go/whisk"
+ "github.com/apache/incubator-openwhisk-wskdeploy/conductor"
+ "github.com/apache/incubator-openwhisk-wskdeploy/dependencies"
+ "github.com/apache/incubator-openwhisk-wskdeploy/runtimes"
"github.com/apache/incubator-openwhisk-wskdeploy/utils"
+ "github.com/apache/incubator-openwhisk-wskdeploy/webaction"
"github.com/apache/incubator-openwhisk-wskdeploy/wskderrors"
"github.com/apache/incubator-openwhisk-wskdeploy/wskenv"
"github.com/apache/incubator-openwhisk-wskdeploy/wski18n"
@@ -184,8 +189,8 @@
return listOfAnnotations
}
-func (dm *YAMLParser) ComposeDependenciesFromAllPackages(manifest *YAML, projectPath string, filePath string, managedAnnotations whisk.KeyValue, packageInputs map[string]PackageInputs) (map[string]utils.DependencyRecord, error) {
- dependencies := make(map[string]utils.DependencyRecord)
+func (dm *YAMLParser) ComposeDependenciesFromAllPackages(manifest *YAML, projectPath string, filePath string, managedAnnotations whisk.KeyValue, packageInputs map[string]PackageInputs) (map[string]dependencies.DependencyRecord, error) {
+ dependencies := make(map[string]dependencies.DependencyRecord)
packages := make(map[string]Package)
if len(manifest.Packages) != 0 {
@@ -207,9 +212,9 @@
return dependencies, nil
}
-func (dm *YAMLParser) ComposeDependencies(pkg Package, projectPath string, filePath string, packageName string, managedAnnotations whisk.KeyValue, packageInputs PackageInputs) (map[string]utils.DependencyRecord, error) {
+func (dm *YAMLParser) ComposeDependencies(pkg Package, projectPath string, filePath string, packageName string, managedAnnotations whisk.KeyValue, packageInputs PackageInputs) (map[string]dependencies.DependencyRecord, error) {
- depMap := make(map[string]utils.DependencyRecord)
+ depMap := make(map[string]dependencies.DependencyRecord)
for key, dependency := range pkg.Dependencies {
version := dependency.Version
if len(version) == 0 {
@@ -219,12 +224,12 @@
location := dependency.Location
isBinding := false
- if utils.LocationIsBinding(location) {
+ if dependencies.LocationIsBinding(location) {
if !strings.HasPrefix(location, PATH_SEPARATOR) {
location = PATH_SEPARATOR + dependency.Location
}
isBinding = true
- } else if utils.LocationIsGithub(location) {
+ } else if dependencies.LocationIsGithub(location) {
// TODO() define const for the protocol prefix, etc.
if !strings.HasPrefix(location, HTTPS) && !strings.HasPrefix(location, HTTP) {
@@ -250,7 +255,7 @@
packDir := path.Join(projectPath, strings.Title(YAML_KEY_PACKAGES))
depName := packageName + ":" + key
- depMap[depName] = utils.NewDependencyRecord(packDir, packageName, location, version, inputs, annotations, isBinding)
+ depMap[depName] = dependencies.NewDependencyRecord(packDir, packageName, location, version, inputs, annotations, isBinding)
}
return depMap, nil
@@ -504,7 +509,7 @@
// when web-export is set to raw, treat sequence as a raw HTTP web action,
// when web-export is set to no | false, treat sequence as a standard action
if len(sequence.Web) != 0 {
- wskaction.Annotations, errorParser = utils.WebAction(manifestFilePath, wskaction.Name, sequence.Web, wskaction.Annotations, false)
+ wskaction.Annotations, errorParser = webaction.WebAction(manifestFilePath, wskaction.Name, sequence.Web, wskaction.Annotations, false)
if errorParser != nil {
return nil, errorParser
}
@@ -566,10 +571,10 @@
// even if runtime is invalid, deploy action with specified runtime in strict mode
if utils.Flags.Strict {
exec.Kind = action.Runtime
- } else if utils.CheckExistRuntime(action.Runtime, utils.SupportedRunTimes) {
+ } else if runtimes.CheckExistRuntime(action.Runtime, runtimes.SupportedRunTimes) {
exec.Kind = action.Runtime
- } else if len(utils.DefaultRunTimes[action.Runtime]) != 0 {
- exec.Kind = utils.DefaultRunTimes[action.Runtime]
+ } else if len(runtimes.DefaultRunTimes[action.Runtime]) != 0 {
+ exec.Kind = runtimes.DefaultRunTimes[action.Runtime]
} else {
err := wski18n.T(wski18n.ID_ERR_RUNTIME_INVALID_X_runtime_X_action_X,
map[string]interface{}{
@@ -590,16 +595,16 @@
// and its not explicitly specified in the manifest YAML file
// and action source is not a zip file
if len(action.Runtime) == 0 && len(action.Docker) == 0 && !action.Native {
- if ext == utils.ZIP_FILE_EXTENSION {
+ if ext == runtimes.ZIP_FILE_EXTENSION {
errMessage := wski18n.T(wski18n.ID_ERR_RUNTIME_INVALID_X_runtime_X_action_X,
map[string]interface{}{
- wski18n.KEY_RUNTIME: utils.RUNTIME_NOT_SPECIFIED,
+ wski18n.KEY_RUNTIME: runtimes.RUNTIME_NOT_SPECIFIED,
wski18n.KEY_ACTION: action.Name})
return wskderrors.NewInvalidRuntimeError(errMessage,
manifestFileName,
action.Name,
- utils.RUNTIME_NOT_SPECIFIED,
- utils.ListOfSupportedRuntimes(utils.SupportedRunTimes))
+ runtimes.RUNTIME_NOT_SPECIFIED,
+ runtimes.ListOfSupportedRuntimes(runtimes.SupportedRunTimes))
} else if len(kind) == 0 {
errMessage := wski18n.T(wski18n.ID_ERR_RUNTIME_ACTION_SOURCE_NOT_SUPPORTED_X_ext_X_action_X,
map[string]interface{}{
@@ -608,8 +613,8 @@
return wskderrors.NewInvalidRuntimeError(errMessage,
manifestFileName,
action.Name,
- utils.RUNTIME_NOT_SPECIFIED,
- utils.ListOfSupportedRuntimes(utils.SupportedRunTimes))
+ runtimes.RUNTIME_NOT_SPECIFIED,
+ runtimes.ListOfSupportedRuntimes(runtimes.SupportedRunTimes))
}
}
return nil
@@ -639,7 +644,7 @@
}
if utils.IsDirectory(actionFilePath) {
- zipFileName = actionFilePath + "." + utils.ZIP_FILE_EXTENSION
+ zipFileName = actionFilePath + "." + runtimes.ZIP_FILE_EXTENSION
err := utils.NewZipWritter(actionFilePath, zipFileName).Zip()
if err != nil {
return actionFilePath, nil, err
@@ -659,8 +664,8 @@
// determine default runtime for the given file extension
var kind string
- r := utils.FileExtensionRuntimeKindMap[ext]
- kind = utils.DefaultRunTimes[r]
+ r := runtimes.FileExtensionRuntimeKindMap[ext]
+ kind = runtimes.DefaultRunTimes[r]
if err := dm.validateActionFunction(manifestFileName, action, ext, kind); err != nil {
return actionFilePath, nil, err
}
@@ -671,7 +676,7 @@
return actionFilePath, nil, err
}
code := string(dat)
- if ext == utils.ZIP_FILE_EXTENSION || ext == utils.JAR_FILE_EXTENSION {
+ if ext == runtimes.ZIP_FILE_EXTENSION || ext == runtimes.JAR_FILE_EXTENSION {
code = base64.StdEncoding.EncodeToString([]byte(dat))
}
exec.Code = &code
@@ -684,13 +689,13 @@
* Set the action runtime to match with the source file extension, if wskdeploy is not invoked in strict mode
*/
if len(action.Runtime) != 0 {
- if utils.CheckExistRuntime(action.Runtime, utils.SupportedRunTimes) {
+ if runtimes.CheckExistRuntime(action.Runtime, runtimes.SupportedRunTimes) {
// for zip actions, rely on the runtimes from the manifest file as it can not be derived from the action source file extension
// pick runtime from manifest file if its supported by OpenWhisk server
- if ext == utils.ZIP_FILE_EXTENSION {
+ if ext == runtimes.ZIP_FILE_EXTENSION {
exec.Kind = action.Runtime
} else {
- if utils.CheckRuntimeConsistencyWithFileExtension(ext, action.Runtime) {
+ if runtimes.CheckRuntimeConsistencyWithFileExtension(ext, action.Runtime) {
exec.Kind = action.Runtime
} else {
warnStr := wski18n.T(wski18n.ID_ERR_RUNTIME_MISMATCH_X_runtime_X_ext_X_action_X,
@@ -719,20 +724,24 @@
wski18n.KEY_ACTION: action.Name})
wskprint.PrintOpenWhiskWarning(warnStr)
- if ext == utils.ZIP_FILE_EXTENSION {
+ if ext == runtimes.ZIP_FILE_EXTENSION {
// for zip action, error out if specified runtime is not supported by
// OpenWhisk server
return actionFilePath, nil, wskderrors.NewInvalidRuntimeError(warnStr,
manifestFileName,
action.Name,
action.Runtime,
- utils.ListOfSupportedRuntimes(utils.SupportedRunTimes))
+ runtimes.ListOfSupportedRuntimes(runtimes.SupportedRunTimes))
} else {
- warnStr := wski18n.T(wski18n.ID_WARN_RUNTIME_CHANGED_X_runtime_X_action_X,
- map[string]interface{}{
- wski18n.KEY_RUNTIME: exec.Kind,
- wski18n.KEY_ACTION: action.Name})
- wskprint.PrintOpenWhiskWarning(warnStr)
+ if utils.Flags.Strict {
+ exec.Kind = action.Runtime
+ } else {
+ warnStr := wski18n.T(wski18n.ID_WARN_RUNTIME_CHANGED_X_runtime_X_action_X,
+ map[string]interface{}{
+ wski18n.KEY_RUNTIME: exec.Kind,
+ wski18n.KEY_ACTION: action.Name})
+ wskprint.PrintOpenWhiskWarning(warnStr)
+ }
}
}
@@ -769,7 +778,7 @@
// when an action Native is set to true,
// set exec.Image to openwhisk/skeleton
if len(action.Docker) != 0 || action.Native {
- exec.Kind = utils.BLACKBOX
+ exec.Kind = runtimes.BLACKBOX
if action.Native {
exec.Image = NATIVE_DOCKER_IMAGE
} else {
@@ -900,7 +909,7 @@
// when web-export is set to no | false, treat action as a standard action
dm.validateActionWebFlag(action)
if len(action.GetWeb()) != 0 {
- wskaction.Annotations, errorParser = utils.WebAction(manifestFilePath, action.Name, action.GetWeb(), wskaction.Annotations, false)
+ wskaction.Annotations, errorParser = webaction.WebAction(manifestFilePath, action.Name, action.GetWeb(), wskaction.Annotations, false)
if errorParser != nil {
return listOfActions, errorParser
}
@@ -914,7 +923,7 @@
}
// Conductor Action
if action.Conductor {
- wskaction.Annotations = append(wskaction.Annotations, utils.ConductorAction())
+ wskaction.Annotations = append(wskaction.Annotations, conductor.ConductorAction())
}
wskaction.Name = actionName
@@ -1154,7 +1163,7 @@
// verify that the action is defined as web action
// web or web-export set to any of [true, yes, raw]
a := pkg.Actions[actionName]
- if !utils.IsWebAction(a.GetWeb()) {
+ if !webaction.IsWebAction(a.GetWeb()) {
warningString := wski18n.T(wski18n.ID_WARN_API_MISSING_WEB_ACTION_X_action_X_api_X,
map[string]interface{}{
wski18n.KEY_ACTION: actionName,
@@ -1163,7 +1172,7 @@
if a.Annotations == nil {
a.Annotations = make(map[string]interface{}, 0)
}
- a.Annotations[utils.WEB_EXPORT_ANNOT] = true
+ a.Annotations[webaction.WEB_EXPORT_ANNOT] = true
pkg.Actions[actionName] = a
}
// verify that the sequence is defined under sequences sections
@@ -1171,7 +1180,7 @@
// verify that the sequence is defined as web sequence
// web set to any of [true, yes, raw]
a := pkg.Sequences[actionName]
- if !utils.IsWebSequence(a.Web) {
+ if !webaction.IsWebSequence(a.Web) {
warningString := wski18n.T(wski18n.ID_WARN_API_MISSING_WEB_SEQUENCE_X_sequence_X_api_X,
map[string]interface{}{
wski18n.KEY_SEQUENCE: actionName,
@@ -1180,7 +1189,7 @@
if a.Annotations == nil {
a.Annotations = make(map[string]interface{}, 0)
}
- a.Annotations[utils.WEB_EXPORT_ANNOT] = true
+ a.Annotations[webaction.WEB_EXPORT_ANNOT] = true
pkg.Sequences[actionName] = a
}
// return failure since action or sequence are not defined in the manifest
diff --git a/parsers/manifest_parser_test.go b/parsers/manifest_parser_test.go
index 8cbe644..b4a3cc8 100644
--- a/parsers/manifest_parser_test.go
+++ b/parsers/manifest_parser_test.go
@@ -30,7 +30,7 @@
"testing"
"github.com/apache/incubator-openwhisk-client-go/whisk"
- "github.com/apache/incubator-openwhisk-wskdeploy/utils"
+ "github.com/apache/incubator-openwhisk-wskdeploy/runtimes"
"github.com/apache/incubator-openwhisk-wskdeploy/wskderrors"
"github.com/apache/incubator-openwhisk-wskdeploy/wskprint"
"github.com/stretchr/testify/assert"
@@ -49,7 +49,7 @@
TEST_MSG_PARAMETER_NUMBER_MISMATCH = "Number of Paramaters mismatched."
TEST_MSG_MANIFEST_UNMARSHALL_ERROR_EXPECTED = "Manifest [%s]: Expected Unmarshal error."
TEST_MSG_ACTION_FUNCTION_RUNTIME_ERROR_EXPECTED = "Manifest [%s]: Expected runtime error."
- TEST_MSG_ACTION_DOCKER_KIND_MISMATCH = "Docker action kind is set to [%s] instead of " + utils.BLACKBOX
+ TEST_MSG_ACTION_DOCKER_KIND_MISMATCH = "Docker action kind is set to [%s] instead of " + runtimes.BLACKBOX
TEST_MSG_ACTION_DOCKER_IMAGE_MISMATCH = "Docker action image had a value mismatch."
TEST_MSG_ACTION_CODE_MISSING = "Action code is missing."
TEST_MSG_ACTION_FUNCTION_PATH_MISSING = "Action function path missing"
@@ -66,11 +66,11 @@
)
func init() {
- op, error := utils.ParseOpenWhisk("")
+ op, error := runtimes.ParseOpenWhisk("")
if error == nil {
- utils.SupportedRunTimes = utils.ConvertToMap(op)
- utils.DefaultRunTimes = utils.DefaultRuntimes(op)
- utils.FileExtensionRuntimeKindMap = utils.FileExtensionRuntimes(op)
+ runtimes.SupportedRunTimes = runtimes.ConvertToMap(op)
+ runtimes.DefaultRunTimes = runtimes.DefaultRuntimes(op)
+ runtimes.FileExtensionRuntimeKindMap = runtimes.FileExtensionRuntimes(op)
}
}
@@ -507,13 +507,13 @@
var expectedResult string
for i := 0; i < len(actions); i++ {
if actions[i].Action.Name == "helloNodejs" {
- expectedResult = utils.DefaultRunTimes[utils.FileExtensionRuntimeKindMap["js"]]
+ expectedResult = runtimes.DefaultRunTimes[runtimes.FileExtensionRuntimeKindMap["js"]]
} else if actions[i].Action.Name == "helloJava" {
- expectedResult = utils.DefaultRunTimes[utils.FileExtensionRuntimeKindMap["jar"]]
+ expectedResult = runtimes.DefaultRunTimes[runtimes.FileExtensionRuntimeKindMap["jar"]]
} else if actions[i].Action.Name == "helloPython" {
- expectedResult = utils.DefaultRunTimes[utils.FileExtensionRuntimeKindMap["py"]]
+ expectedResult = runtimes.DefaultRunTimes[runtimes.FileExtensionRuntimeKindMap["py"]]
} else if actions[i].Action.Name == "helloSwift" {
- expectedResult = utils.DefaultRunTimes[utils.FileExtensionRuntimeKindMap["swift"]]
+ expectedResult = runtimes.DefaultRunTimes[runtimes.FileExtensionRuntimeKindMap["swift"]]
}
actualResult := actions[i].Action.Exec.Kind
assert.Equal(t, expectedResult, actualResult, TEST_MSG_ACTION_FUNCTION_RUNTIME_MISMATCH)
@@ -916,23 +916,23 @@
switch action.Action.Name {
case "OpenWhiskSkeleton":
case "OpenWhiskSkeletonWithNative":
- assert.Equal(t, utils.BLACKBOX, action.Action.Exec.Kind, fmt.Sprintf(TEST_MSG_ACTION_DOCKER_KIND_MISMATCH, action.Action.Exec.Kind))
+ assert.Equal(t, runtimes.BLACKBOX, action.Action.Exec.Kind, fmt.Sprintf(TEST_MSG_ACTION_DOCKER_KIND_MISMATCH, action.Action.Exec.Kind))
assert.Equal(t, NATIVE_DOCKER_IMAGE, action.Action.Exec.Image, TEST_MSG_ACTION_DOCKER_IMAGE_MISMATCH)
case "CustomDockerAction1":
case "CustomDockerAction2":
expectedResult, _ = filepath.Abs(actionFile)
actualResult, _ = filepath.Abs(action.Filepath)
assert.Equal(t, expectedResult, actualResult, TEST_MSG_ACTION_FUNCTION_PATH_MISMATCH)
- assert.Equal(t, utils.BLACKBOX, action.Action.Exec.Kind, fmt.Sprintf(TEST_MSG_ACTION_DOCKER_KIND_MISMATCH, action.Action.Exec.Kind))
+ assert.Equal(t, runtimes.BLACKBOX, action.Action.Exec.Kind, fmt.Sprintf(TEST_MSG_ACTION_DOCKER_KIND_MISMATCH, action.Action.Exec.Kind))
assert.Equal(t, NATIVE_DOCKER_IMAGE, action.Action.Exec.Image, TEST_MSG_ACTION_DOCKER_IMAGE_MISMATCH)
case "CustomDockerAction3":
case "CustomDockerAction4":
assert.NotNil(t, action.Action.Exec.Code, TEST_MSG_ACTION_CODE_MISSING)
- assert.Equal(t, utils.BLACKBOX, action.Action.Exec.Kind, fmt.Sprintf(TEST_MSG_ACTION_DOCKER_KIND_MISMATCH, action.Action.Exec.Kind))
+ assert.Equal(t, runtimes.BLACKBOX, action.Action.Exec.Kind, fmt.Sprintf(TEST_MSG_ACTION_DOCKER_KIND_MISMATCH, action.Action.Exec.Kind))
assert.Equal(t, NATIVE_DOCKER_IMAGE, action.Action.Exec.Image, TEST_MSG_ACTION_DOCKER_IMAGE_MISMATCH)
case "CustomDockerAction5":
assert.NotNil(t, action.Action.Exec.Code, TEST_MSG_ACTION_CODE_MISSING)
- assert.Equal(t, utils.BLACKBOX, action.Action.Exec.Kind, fmt.Sprintf(TEST_MSG_ACTION_DOCKER_KIND_MISMATCH, action.Action.Exec.Kind))
+ assert.Equal(t, runtimes.BLACKBOX, action.Action.Exec.Kind, fmt.Sprintf(TEST_MSG_ACTION_DOCKER_KIND_MISMATCH, action.Action.Exec.Kind))
assert.Equal(t, "mydockerhub/myimage", action.Action.Exec.Image, TEST_MSG_ACTION_DOCKER_IMAGE_MISMATCH)
}
}
diff --git a/utils/runtimes.go b/runtimes/runtimes.go
similarity index 71%
rename from utils/runtimes.go
rename to runtimes/runtimes.go
index 15399ef..361c614 100644
--- a/utils/runtimes.go
+++ b/runtimes/runtimes.go
@@ -15,18 +15,23 @@
* limitations under the License.
*/
-package utils
+package runtimes
import (
"crypto/tls"
"encoding/json"
- "github.com/apache/incubator-openwhisk-client-go/whisk"
- "github.com/apache/incubator-openwhisk-wskdeploy/wski18n"
- "github.com/apache/incubator-openwhisk-wskdeploy/wskprint"
"io/ioutil"
"net/http"
"strings"
"time"
+
+ "github.com/apache/incubator-openwhisk-client-go/whisk"
+ "github.com/apache/incubator-openwhisk-wskdeploy/utils"
+ "github.com/apache/incubator-openwhisk-wskdeploy/wskderrors"
+ "github.com/apache/incubator-openwhisk-wskdeploy/wski18n"
+ "github.com/apache/incubator-openwhisk-wskdeploy/wskprint"
+ "path/filepath"
+ "runtime"
)
const (
@@ -41,14 +46,15 @@
HTTP_CONTENT_TYPE_VALUE = "application/json; charset=UTF-8"
RUNTIME_NOT_SPECIFIED = "NOT SPECIFIED"
BLACKBOX = "blackbox"
- HTTP_FILE_EXTENSION = "http"
+ RUNTIMES_FILE_NAME = "runtimes.json"
+ HTTPS = "https://"
)
// Structs used to denote the OpenWhisk Runtime information
type Limit struct {
- Apm uint16 `json:"actions_per_minute"`
- Tpm uint16 `json:"triggers_per_minute"`
- ConAction uint16 `json:"concurrent_actions"`
+ Apm uint `json:"actions_per_minute"`
+ Tpm uint `json:"triggers_per_minute"`
+ ConAction uint `json:"concurrent_actions"`
}
type Runtime struct {
@@ -82,7 +88,7 @@
// `curl -k https://openwhisk.ng.bluemix.net`
// hard coding it here in case of network unavailable or failure.
func ParseOpenWhisk(apiHost string) (op OpenWhiskInfo, err error) {
- url := "https://" + apiHost
+ url := HTTPS + apiHost
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set(HTTP_CONTENT_TYPE_KEY, HTTP_CONTENT_TYPE_VALUE)
tlsConfig := &tls.Config{
@@ -94,7 +100,7 @@
}
var netClient = &http.Client{
- Timeout: time.Second * DEFAULT_HTTP_TIMEOUT,
+ Timeout: time.Second * utils.DEFAULT_HTTP_TIMEOUT,
Transport: netTransport,
}
@@ -104,6 +110,12 @@
errString := wski18n.T(wski18n.ID_ERR_RUNTIMES_GET_X_err_X,
map[string]interface{}{"err": err.Error()})
whisk.Debug(whisk.DbgWarn, errString)
+ if utils.Flags.Strict {
+ errMessage := wski18n.T(wski18n.ID_ERR_RUNTIME_PARSER_ERROR,
+ map[string]interface{}{wski18n.KEY_ERR: err.Error()})
+ err = wskderrors.NewRuntimeParserError(errMessage)
+ return
+ }
}
if res != nil {
@@ -114,7 +126,15 @@
if err != nil || !strings.Contains(HTTP_CONTENT_TYPE_VALUE, res.Header.Get(HTTP_CONTENT_TYPE_KEY)) {
stdout := wski18n.T(wski18n.ID_MSG_UNMARSHAL_LOCAL)
wskprint.PrintOpenWhiskInfo(stdout)
- err = json.Unmarshal(RUNTIME_DETAILS, &op)
+ runtimeDetails := readRuntimes()
+ if runtimeDetails != nil {
+ err = json.Unmarshal(runtimeDetails, &op)
+ if err != nil {
+ errMessage := wski18n.T(wski18n.ID_ERR_RUNTIME_PARSER_ERROR,
+ map[string]interface{}{wski18n.KEY_ERR: err.Error()})
+ err = wskderrors.NewRuntimeParserError(errMessage)
+ }
+ }
} else {
b, _ := ioutil.ReadAll(res.Body)
if b != nil && len(b) > 0 {
@@ -122,6 +142,11 @@
map[string]interface{}{"url": url})
wskprint.PrintOpenWhiskInfo(stdout)
err = json.Unmarshal(b, &op)
+ if err != nil {
+ errMessage := wski18n.T(wski18n.ID_ERR_RUNTIME_PARSER_ERROR,
+ map[string]interface{}{wski18n.KEY_ERR: err.Error()})
+ err = wskderrors.NewRuntimeParserError(errMessage)
+ }
}
}
return
@@ -226,101 +251,14 @@
return
}
-var RUNTIME_DETAILS = []byte(`{
- "support":{
- "github":"https://github.com/apache/incubator-openwhisk/issues",
- "slack":"http://slack.openwhisk.org"
- },
- "description":"OpenWhisk",
- "api_paths":["/api/v1"],
- "runtimes":{
- "nodejs":[{
- "image":"openwhisk/nodejsaction:latest",
- "deprecated":true,
- "requireMain":false,
- "default":false,
- "attached":false,
- "kind":"nodejs"
- },{
- "image":"openwhisk/nodejs6action:latest",
- "deprecated":false,
- "requireMain":false,
- "default":true,
- "attached":false,
- "kind":"nodejs:6"
- },{
- "image":"openwhisk/action-nodejs-v8:latest",
- "deprecated":false,
- "requireMain":false,
- "default":false,
- "attached":false,
- "kind":"nodejs:8"
- }],
- "java":[{
- "image":"openwhisk/java8action:latest",
- "deprecated":false,
- "requireMain":true,
- "default":true,
- "attached":true,
- "kind":"java"
- }],
- "php":[{
- "image":"openwhisk/action-php-v7.1:latest",
- "deprecated":false,
- "requireMain":false,
- "default":true,
- "attached":false,
- "kind":"php:7.1"
- }],
- "python":[{
- "image":"openwhisk/python2action:latest",
- "deprecated":false,
- "requireMain":false,
- "default":false,
- "attached":false,
- "kind":"python"
- },{
- "image":"openwhisk/python2action:latest",
- "deprecated":false,
- "requireMain":false,
- "default":true,
- "attached":false,
- "kind":"python:2"
- },{
- "image":"openwhisk/python3action:latest",
- "deprecated":false,
- "requireMain":false,
- "default":false,
- "attached":false,
- "kind":"python:3"
- }],
- "swift":[{
- "image":"openwhisk/swiftaction:latest",
- "deprecated":true,
- "requireMain":false,
- "default":false,
- "attached":false,
- "kind":"swift"
- },{
- "image":"openwhisk/swift3action:latest",
- "deprecated":true,
- "requireMain":false,
- "default":false,
- "attached":false,
- "kind":"swift:3"
- },{
- "image":"openwhisk/action-swift-v3.1.1:latest",
- "deprecated":false,
- "requireMain":false,
- "default":true,
- "attached":false,
- "kind":"swift:3.1.1"
- }]
- },
- "limits":{
- "actions_per_minute":5000,
- "triggers_per_minute":5000,
- "concurrent_actions":1000
+func readRuntimes() []byte {
+ _, b, _, _ := runtime.Caller(0)
+ basepath := filepath.Dir(b)
+ runtimesFileWithPath := filepath.Join(basepath, RUNTIMES_FILE_NAME)
+ file, readErr := ioutil.ReadFile(runtimesFileWithPath)
+ if readErr != nil {
+ wskprint.PrintlnOpenWhiskWarning(readErr.Error())
+ return nil
}
- }
-`)
+ return file
+}
diff --git a/runtimes/runtimes.json b/runtimes/runtimes.json
new file mode 100644
index 0000000..857331f
--- /dev/null
+++ b/runtimes/runtimes.json
@@ -0,0 +1,131 @@
+{
+ "support": {
+ "github": "https://github.com/apache/incubator-openwhisk/issues",
+ "slack": "http://slack.openwhisk.org"
+ },
+ "description": "OpenWhisk",
+ "api_paths": [
+ "/api/v1"
+ ],
+ "runtimes": {
+ "nodejs": [
+ {
+ "image": "openwhisk/nodejsaction:latest",
+ "deprecated": true,
+ "requireMain": false,
+ "default": false,
+ "attached": false,
+ "kind": "nodejs"
+ },
+ {
+ "image": "openwhisk/nodejs6action:latest",
+ "deprecated": false,
+ "requireMain": false,
+ "default": true,
+ "attached": false,
+ "kind": "nodejs:6"
+ },
+ {
+ "image": "ibmfunctions/action-nodejs-v8:1.13.0",
+ "deprecated": false,
+ "requireMain": false,
+ "default": false,
+ "attached": false,
+ "kind": "nodejs:8"
+ }
+ ],
+ "java": [
+ {
+ "image": "openwhisk/java8action:latest",
+ "deprecated": false,
+ "requireMain": true,
+ "default": true,
+ "attached": true,
+ "kind": "java"
+ }
+ ],
+ "php": [
+ {
+ "image": "openwhisk/action-php-v7.1:latest",
+ "deprecated": false,
+ "requireMain": false,
+ "default": true,
+ "attached": false,
+ "kind": "php:7.1"
+ }
+ ],
+ "python": [
+ {
+ "image": "openwhisk/python2action:latest",
+ "deprecated": false,
+ "requireMain": false,
+ "default": false,
+ "attached": false,
+ "kind": "python"
+ },
+ {
+ "image": "openwhisk/python2action:latest",
+ "deprecated": false,
+ "requireMain": false,
+ "default": true,
+ "attached": false,
+ "kind": "python:2"
+ },
+ {
+ "image": "openwhisk/python3action:latest",
+ "deprecated": false,
+ "requireMain": false,
+ "default": false,
+ "attached": false,
+ "kind": "python:3"
+ },
+ {
+ "image": "ibmfunctions/action-python-v3:1.6.0",
+ "deprecated": false,
+ "requireMain": false,
+ "default": false,
+ "attached": false,
+ "kind": "python-jessie:3"
+ }
+ ],
+ "swift": [
+ {
+ "image": "openwhisk/swiftaction:latest",
+ "deprecated": true,
+ "requireMain": false,
+ "default": false,
+ "attached": false,
+ "kind": "swift"
+ },
+ {
+ "image": "openwhisk/swift3action:latest",
+ "deprecated": true,
+ "requireMain": false,
+ "default": false,
+ "attached": false,
+ "kind": "swift:3"
+ },
+ {
+ "image": "openwhisk/action-swift-v3.1.1:latest",
+ "deprecated": false,
+ "requireMain": false,
+ "default": true,
+ "attached": false,
+ "kind": "swift:3.1.1"
+ },
+ {
+ "image": "ibmfunctions/action-swift-v4.1:1.5.0",
+ "deprecated": false,
+ "requireMain": false,
+ "default": false,
+ "attached": false,
+ "kind": "swift:4.1"
+ }
+ ]
+ },
+ "limits": {
+ "actions_per_minute": 5000,
+ "triggers_per_minute": 5000,
+ "concurrent_actions": 1000
+ }
+}
diff --git a/runtimes/runtimes_test.go b/runtimes/runtimes_test.go
new file mode 100644
index 0000000..f7650e3
--- /dev/null
+++ b/runtimes/runtimes_test.go
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package runtimes
+
+import (
+ "github.com/stretchr/testify/assert"
+ "testing"
+)
+
+func TestParseOpenWhisk(t *testing.T) {
+ openwhiskHost := "https://openwhisk.ng.bluemix.net"
+ openwhisk, err := ParseOpenWhisk(openwhiskHost)
+ assert.Equal(t, nil, err, "parse openwhisk info error happened.")
+ converted := ConvertToMap(openwhisk)
+ assert.Equal(t, 2, len(converted["nodejs"]), "not expected length")
+ assert.Equal(t, 1, len(converted["php"]), "not expected length")
+ assert.Equal(t, 1, len(converted["java"]), "not expected length")
+ assert.Equal(t, 4, len(converted["python"]), "not expected length")
+ assert.Equal(t, 2, len(converted["swift"]), "not expected length")
+}
diff --git a/tests/src/integration/common/wskdeploy.go b/tests/src/integration/common/wskdeploy.go
index 32938a2..5dddf56 100644
--- a/tests/src/integration/common/wskdeploy.go
+++ b/tests/src/integration/common/wskdeploy.go
@@ -28,7 +28,9 @@
"strings"
"github.com/apache/incubator-openwhisk-client-go/whisk"
+ "github.com/apache/incubator-openwhisk-wskdeploy/dependencies"
"github.com/apache/incubator-openwhisk-wskdeploy/deployers"
+ "github.com/apache/incubator-openwhisk-wskdeploy/runtimes"
"github.com/apache/incubator-openwhisk-wskdeploy/utils"
"github.com/apache/incubator-openwhisk-wskdeploy/wskderrors"
"github.com/fatih/color"
@@ -197,7 +199,7 @@
deployer.ProjectPath = filepath.Dir(manifestPath)
deployer.ManifestPath = manifestPath
deployer.DeploymentPath = deploymentPath
- deployer.DependencyMaster = make(map[string]utils.DependencyRecord)
+ deployer.DependencyMaster = make(map[string]dependencies.DependencyRecord)
//create client config with namespace, apihost, authkey and etc.
//these values might be mock values because it's only for testing
@@ -211,11 +213,11 @@
//setSupportedRuntimes(apiHost string)
//only for testing, mock values
- op, err := utils.ParseOpenWhisk(clientConfig.Host)
+ op, err := runtimes.ParseOpenWhisk(clientConfig.Host)
if err == nil {
- utils.SupportedRunTimes = utils.ConvertToMap(op)
- utils.DefaultRunTimes = utils.DefaultRuntimes(op)
- utils.FileExtensionRuntimeKindMap = utils.FileExtensionRuntimes(op)
+ runtimes.SupportedRunTimes = runtimes.ConvertToMap(op)
+ runtimes.DefaultRunTimes = runtimes.DefaultRuntimes(op)
+ runtimes.FileExtensionRuntimeKindMap = runtimes.FileExtensionRuntimes(op)
}
//invoke ConstructDeploymentPlan to create the in memory objects for deployment
diff --git a/utils/misc.go b/utils/misc.go
index 5280f7b..177fe10 100644
--- a/utils/misc.go
+++ b/utils/misc.go
@@ -36,6 +36,7 @@
const (
DEFAULT_HTTP_TIMEOUT = 30
DEFAULT_PROJECT_PATH = "."
+ HTTP_FILE_EXTENSION = "http"
// name of manifest and deployment files
ManifestFileNameYaml = "manifest.yaml"
ManifestFileNameYml = "manifest.yml"
@@ -154,26 +155,6 @@
return nil
}
-func deleteKey(key string, keyValueArr whisk.KeyValueArr) whisk.KeyValueArr {
- for i := 0; i < len(keyValueArr); i++ {
- if keyValueArr[i].Key == key {
- keyValueArr = append(keyValueArr[:i], keyValueArr[i+1:]...)
- break
- }
- }
-
- return keyValueArr
-}
-
-func addKeyValue(key string, value interface{}, keyValueArr whisk.KeyValueArr) whisk.KeyValueArr {
- keyValue := whisk.KeyValue{
- Key: key,
- Value: value,
- }
-
- return append(keyValueArr, keyValue)
-}
-
func GetManifestFilePath(projectPath string) string {
if _, err := os.Stat(path.Join(projectPath, ManifestFileNameYaml)); err == nil {
return path.Join(projectPath, ManifestFileNameYaml)
diff --git a/utils/misc_test.go b/utils/misc_test.go
index d4841e2..72d518b 100644
--- a/utils/misc_test.go
+++ b/utils/misc_test.go
@@ -20,6 +20,7 @@
package utils
import (
+ "github.com/apache/incubator-openwhisk-wskdeploy/dependencies"
"github.com/stretchr/testify/assert"
"os"
"testing"
@@ -44,31 +45,19 @@
}
func TestDependencies(t *testing.T) {
- var record = NewDependencyRecord("projectPath", "packageName", "http://github.com/user/repo", "master", nil, nil, false)
+ var record = dependencies.NewDependencyRecord("projectPath", "packageName", "http://github.com/user/repo", "master", nil, nil, false)
assert.Equal(t, "projectPath", record.ProjectPath, "ProjectPath is wrong")
assert.Equal(t, "http://github.com/user/repo", record.Location, "URL is wrong")
assert.Equal(t, "http://github.com/user/repo", record.BaseRepo, "BaseRepo is wrong")
assert.Equal(t, "", record.SubFolder, "SubFolder is wrong")
- record = NewDependencyRecord("projectPath", "packageName", "http://github.com/user/repo/subfolder1/subfolder2", "master", nil, nil, false)
+ record = dependencies.NewDependencyRecord("projectPath", "packageName", "http://github.com/user/repo/subfolder1/subfolder2", "master", nil, nil, false)
assert.Equal(t, "projectPath", record.ProjectPath, "ProjectPath is wrong")
assert.Equal(t, "http://github.com/user/repo/subfolder1/subfolder2", record.Location, "URL is wrong")
assert.Equal(t, "http://github.com/user/repo", record.BaseRepo, "BaseRepo is wrong")
assert.Equal(t, "/subfolder1/subfolder2", record.SubFolder, "SubFolder is wrong")
}
-func TestParseOpenWhisk(t *testing.T) {
- openwhiskHost := "https://openwhisk.ng.bluemix.net"
- openwhisk, err := ParseOpenWhisk(openwhiskHost)
- assert.Equal(t, nil, err, "parse openwhisk info error happened.")
- converted := ConvertToMap(openwhisk)
- assert.Equal(t, 2, len(converted["nodejs"]), "not expected length")
- assert.Equal(t, 1, len(converted["php"]), "not expected length")
- assert.Equal(t, 1, len(converted["java"]), "not expected length")
- assert.Equal(t, 3, len(converted["python"]), "not expected length")
- assert.Equal(t, 1, len(converted["swift"]), "not expected length")
-}
-
func TestNewZipWritter(t *testing.T) {
filePath := "../tests/src/integration/zipaction/actions/cat"
zipName := filePath + ".zip"
diff --git a/utils/webaction.go b/webaction/webaction.go
similarity index 89%
rename from utils/webaction.go
rename to webaction/webaction.go
index 64fe346..b339eae 100644
--- a/utils/webaction.go
+++ b/webaction/webaction.go
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package utils
+package webaction
import (
"github.com/apache/incubator-openwhisk-client-go/whisk"
@@ -39,6 +39,26 @@
"RAW": "raw",
}
+func deleteKey(key string, keyValueArr whisk.KeyValueArr) whisk.KeyValueArr {
+ for i := 0; i < len(keyValueArr); i++ {
+ if keyValueArr[i].Key == key {
+ keyValueArr = append(keyValueArr[:i], keyValueArr[i+1:]...)
+ break
+ }
+ }
+
+ return keyValueArr
+}
+
+func addKeyValue(key string, value interface{}, keyValueArr whisk.KeyValueArr) whisk.KeyValueArr {
+ keyValue := whisk.KeyValue{
+ Key: key,
+ Value: value,
+ }
+
+ return append(keyValueArr, keyValue)
+}
+
func WebAction(filePath string, action string, webMode string, annotations whisk.KeyValueArr, fetch bool) (whisk.KeyValueArr, error) {
switch strings.ToLower(webMode) {
case webExport["TRUE"]:
diff --git a/wskderrors/wskdeployerror.go b/wskderrors/wskdeployerror.go
index baa3956..978d1d3 100644
--- a/wskderrors/wskdeployerror.go
+++ b/wskderrors/wskdeployerror.go
@@ -64,6 +64,7 @@
ERROR_YAML_INVALID_RUNTIME = "ERROR_YAML_INVALID_RUNTIME"
ERROR_YAML_INVALID_WEB_EXPORT = "ERROR_YAML_INVALID_WEB_EXPORT"
ERROR_YAML_INVALID_API_GATEWAY_METHOD = "ERROR_YAML_INVALID_API_GATEWAY_METHOD"
+ ERROR_RUNTIME_PARSER_FAILURE = "ERROR_RUNTIME_PARSER_FAILURE"
)
/*
@@ -436,6 +437,21 @@
return err
}
+/*
+ * Failed to Retrieve/Parse Runtime
+ */
+type RuntimeParserError struct {
+ WskDeployBaseErr
+}
+
+func NewRuntimeParserError(errorMsg string) *RuntimeParserError {
+ var err = &RuntimeParserError{}
+ err.SetErrorType(ERROR_RUNTIME_PARSER_FAILURE)
+ err.SetCallerByStackFrameSkip(2)
+ err.SetMessage(errorMsg)
+ return err
+}
+
func IsCustomError(err error) bool {
switch err.(type) {
diff --git a/wski18n/i18n_ids.go b/wski18n/i18n_ids.go
index 4d51908..dc97872 100644
--- a/wski18n/i18n_ids.go
+++ b/wski18n/i18n_ids.go
@@ -199,6 +199,7 @@
ID_ERR_ARG_MISSING_KEY_VALUE_X_arg_X = "msg_err_arg_missing_key_value"
ID_ERR_INVALID_PARAM_FILE_X_file_X = "msg_err_invalid_param_file"
ID_ERR_REQUIRED_INPUTS_MISSING_VALUE_X_inputs_X = "msg_err_required_inputs_missing_value"
+ ID_ERR_RUNTIME_PARSER_ERROR = "msg_err_runtime_parser_error"
// Server-side Errors (wskdeploy as an Action)
ID_ERR_JSON_MISSING_KEY_CMD = "msg_err_json_missing_cmd_key"
diff --git a/wski18n/i18n_resources.go b/wski18n/i18n_resources.go
index 3459618..eb033ff 100755
--- a/wski18n/i18n_resources.go
+++ b/wski18n/i18n_resources.go
@@ -97,7 +97,7 @@
return a, nil
}
-var _wski18nResourcesEn_usAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x5b\x5f\x6f\x1b\x39\x92\x7f\xcf\xa7\x28\x0c\x0e\x98\x19\x40\x91\x33\x7b\x38\xe0\x10\x20\x0f\xb9\xc4\xd9\xf5\x6d\x12\x07\x76\xbc\xc1\x22\x67\xb4\xa9\xee\x92\xc4\x55\x37\xd9\x43\xb2\xa5\x68\x0c\x7d\xf7\x43\x15\xc9\xee\x96\xac\xfe\x23\x25\x73\x97\x97\x48\x26\x59\xf5\xab\x62\xb1\x58\x7f\xa8\xaf\xcf\x00\x1e\x9f\x01\x00\xfc\x24\xb3\x9f\x5e\xc2\x4f\x85\x5d\x24\xa5\xc1\xb9\xfc\x96\xa0\x31\xda\xfc\x34\xf1\xa3\xce\x08\x65\x73\xe1\xa4\x56\x34\xed\x92\xc7\x9e\x01\xec\x26\x3d\x14\xa4\x9a\xeb\x0e\x02\x57\x34\x34\xb4\xde\x56\x69\x8a\xd6\x76\x90\xb8\x0d\xa3\x43\x54\x36\xc2\x28\xa9\x16\x1d\x54\xbe\x84\xd1\x4e\x2a\x69\x91\x25\x19\xda\x34\xc9\xb5\x5a\x24\x06\x4b\x6d\x5c\x07\xad\x1b\x1e\xb4\xa0\x15\x64\x58\xe6\x7a\x8b\x19\xa0\x72\xd2\x49\xb4\xf0\x8b\x9c\xe2\x74\x02\x9f\x44\xba\x12\x0b\xb4\x13\x78\x9d\xd2\x3a\x3b\x81\xcf\x46\x2e\x16\x68\xec\x04\x6e\xaa\x9c\x46\xd0\xa5\xd3\x5f\x41\x58\xd8\x60\x9e\xd3\xff\x06\x53\x54\x8e\x57\xac\x99\x9b\x05\xa9\xc0\x2d\x11\x6c\x89\xa9\x9c\x4b\xcc\x40\x89\x02\x6d\x29\x52\x9c\x8e\x96\x45\xeb\x2e\x49\x5e\x83\xd3\x3a\x07\xa7\x83\x20\x13\xa8\x94\xff\x04\x42\x65\x60\xb7\x2a\x05\x5d\xa2\xda\x2c\xa5\x5d\x41\x19\x64\x82\xca\x4a\xb5\x00\x01\x85\x50\x72\x8e\xd6\xf1\x64\x5d\x12\x55\x91\x07\x52\x05\x49\x32\x97\x79\x3d\xfd\x9f\xaf\x3f\xbc\x1f\x83\xd9\x2e\xb5\x71\xfd\x1b\xf0\xc9\xe8\xb5\xcc\xd0\x82\x00\x5b\x15\x85\x30\x5b\xf0\xf3\x41\xcf\x61\xb3\x14\xee\x67\x0b\x33\xc4\xd6\xf6\x7c\x9f\x1a\x03\xa4\x41\x3d\x5a\x74\xa4\xcb\x25\xe6\x65\x60\x0d\x5b\x5d\x99\x51\x2a\x24\x55\x8d\xc7\xb2\x46\x63\x89\x77\x97\x7e\xa4\x72\x2c\x70\x98\x07\xaa\x2a\x66\x68\x58\x3d\x76\xe5\xa1\x8d\xe6\x45\x56\x30\x68\x3f\x6c\x2a\x2c\xec\x75\x89\xea\xcb\xbe\xb0\x33\x74\x1b\xda\x8e\x34\x97\x64\x15\x6c\x5a\x68\xd6\x68\x46\xdb\xf0\x78\x0c\x2d\xeb\x23\x3e\xd1\x9e\xf9\x0f\x7a\xfe\x7f\x69\xcd\xf3\x5c\x2c\x12\x51\xca\x64\xa9\x6d\x97\xe1\x78\x28\xaf\x3f\x5d\xc1\xc3\xdf\xae\x6f\x3f\x3f\x8c\xa4\xd8\xbf\xfd\x2d\xa2\xff\xb8\xbc\xb9\xbd\xba\xfe\x38\x8a\x6e\xe5\x96\xc9\x0a\xb7\x1d\x44\x69\x58\x1b\xf9\x07\xff\x01\x1e\xfe\x7e\xf9\xcf\x31\x44\x53\x34\x2e\x21\xbd\x75\x50\x2d\x85\x5b\xd2\xb6\x90\xad\x4e\x69\x32\x2b\x79\x0c\x61\xad\xe6\xb2\xcb\xd9\xfb\x41\x26\x05\xbf\x64\x38\x17\x55\xee\x40\x5a\xf8\xb7\xbf\x5d\x7f\xb8\xbc\x98\x6e\xec\xaa\x34\xba\xb4\xbf\x8e\xd1\x4a\x9e\xeb\x4d\x12\x68\x74\x5d\x51\x3c\x09\xea\x49\xc3\x54\x1b\xa3\xea\xd3\x4b\xed\x96\x6b\xeb\x1b\x41\xba\x34\xb8\x96\xb8\xe9\xa0\x6b\x97\x0c\x34\x12\xbd\xd8\x3b\x1e\x65\x2e\xd4\x08\x0e\x2b\xdc\x8e\xde\xd2\x15\x6e\xc7\x02\xf7\x9a\x2e\x84\x12\x0b\xcc\x7a\x15\x5d\x1a\xfd\x2f\x4c\x5d\x73\xe7\x3a\x0d\x33\x84\x42\x98\x15\x66\x10\x29\x8c\x51\x15\xd3\x49\xe8\x2e\xe8\x12\x26\xb0\xe2\x29\xc3\x14\xa3\x0b\x19\xd8\xd5\x3d\xa7\x3f\x82\x6c\x7d\x59\x75\xd0\x6d\xc6\x47\x0b\x3d\x80\xd0\xbb\xe7\x1c\xad\x8d\xda\x1e\x41\xda\x3a\x23\x3b\x29\xfb\xad\xab\x2c\x1a\x3a\x28\x52\x61\x06\xa6\x52\x4e\x16\xf5\x25\x35\x82\x83\x33\xdd\x4a\xe0\x31\xd0\x95\x2b\xab\x31\x60\xbd\xb9\xad\xd1\xcc\xb4\xed\x22\x19\x46\x4f\x25\x5a\x0a\x23\x8a\x4e\x05\x1b\x51\xa0\x43\x03\x6b\x91\x57\xc8\x01\x1e\x39\x53\xf8\xc7\xeb\xf7\x77\x97\x0f\x30\xd7\xa6\x10\x27\xb2\xea\x3b\x8d\x0f\xef\xae\xde\x5f\x3e\x40\xaa\x95\x13\x92\x22\x60\x38\x86\xe0\xbf\x6f\xaf\x3f\x0e\xb3\x66\xaf\x9a\x14\xd2\xd2\x0d\xc8\xf7\x45\xf7\x75\xf1\x79\x89\x40\x33\xe8\x8c\xa6\xfe\xce\x20\x5f\x20\x2d\x28\xed\xc0\x93\xaa\x0c\x66\xd3\xff\xe9\xdb\xf7\x03\x8e\xa5\xec\xb9\x4a\x89\x23\xdd\x79\x34\xe5\xfb\xf8\x0c\x1d\x37\xe2\x54\xcf\x39\x8f\x55\x10\xa5\x2f\x75\x3a\x94\xe7\xeb\xe3\xe3\x94\x3e\xef\x76\xf7\x13\x98\x1b\x5d\xc0\xe3\xe3\xd4\xea\xca\xa4\xb8\xdb\x8d\xe2\xe9\x37\x6c\x88\x27\x4d\x8b\x7b\x65\xd1\x9d\xc7\xab\x56\xcf\x10\xb7\x3d\x3d\x92\x88\xf5\x1f\xce\x97\xb3\x94\x8b\x4d\x22\x38\x6b\x4c\x9c\x5e\xa1\x1a\x14\x99\x56\x80\x5f\x01\xbc\xe2\x3c\xe1\x2b\x55\x08\x63\x97\x22\x4f\x72\x9d\x8a\xbc\x83\xe3\x5d\x9c\xd5\x0a\x95\x83\x2b\xb4\x9e\x1f\xaf\x0e\xc7\x73\x24\x43\x85\x6e\xa3\xcd\xea\x6c\x96\x52\x39\x34\x0a\x1d\x08\x47\xe2\x56\x26\x1f\x90\xb5\x89\x1b\x92\x54\xa8\x14\xf3\xbc\xf3\xd6\xbe\xfe\xfb\x14\xde\xf8\x39\xe4\x80\x9a\x95\x63\x19\xcc\x85\xec\xa6\xfe\xb6\x09\x60\x32\x99\x85\xb3\x58\x94\x39\x3a\x04\x5b\xd1\x96\xce\xab\x3c\xdf\x4e\xe1\xa6\x52\xf0\x50\xa7\x3f\x75\x66\xf0\x40\xf7\x9d\xc1\x42\xaf\x91\x7c\xa3\x93\x22\xcf\xb7\x4d\xe6\x28\xac\x45\xd7\xbf\x0b\x2d\xa4\x3e\x0d\x4d\xac\x13\xae\xea\x8a\x16\x9f\x3f\x7f\xfe\xfc\xd5\xab\x57\xaf\x5a\x7b\xd1\x92\xe1\x96\x97\x02\x4d\xa0\x89\xa3\xb8\x72\x01\x05\xb3\x31\x2a\x8a\xaa\xc9\x20\x54\x5d\xbc\x72\xfa\x8d\xec\xfc\xbd\x6e\xaf\x1d\xcf\xa4\x77\xbf\xef\xda\x21\x6b\xef\x8e\x8f\xe6\x37\xa4\xbf\x3d\x96\x67\x68\x30\xd5\x45\x21\x54\x96\x70\xea\xc8\xb7\x35\x79\xb9\x44\xb8\x84\xe2\xad\x0e\xa6\x8f\x8f\xd3\xb4\xc8\x76\xbb\x90\x70\x3e\x3e\x4e\x69\xa1\xdb\x96\xb8\xdb\xb1\xa7\xa4\xb5\xbb\xdd\xfd\x74\xda\xcb\x9b\x83\xe4\x6d\x12\xed\x79\xa0\xd8\xf6\xf8\x48\x21\x7b\x60\x40\x20\x77\xbb\x7b\x58\x8a\x50\x4e\x69\x0b\x5c\x9f\x90\xf1\xdc\xbb\xab\x73\x6f\xe3\x38\x1c\x05\x30\x9d\xf6\xa4\xda\x81\x45\xdc\xd0\x1f\x29\x62\x43\x73\x8c\x90\x71\x76\xb7\x98\x77\xcd\x8c\xa3\x82\xf6\xca\x99\x61\x89\x2a\x43\x95\x9e\xa2\xce\x66\xd1\xf9\x7c\x9a\x23\xd2\xa9\xd3\xb7\x47\xd9\x7c\x8f\xe1\x1c\x47\x41\x8e\xa1\x32\x5d\x71\xd9\xdb\xbd\x4a\xcf\x71\xd1\xff\x1f\xef\x88\x28\xcf\x69\x76\xf2\x7d\x3b\xf8\xd4\xcd\xfd\x98\x3d\x1c\x79\x32\xba\x90\xf4\xef\xe3\xdd\x41\xcd\xee\x9c\x9d\xec\x43\x15\x2a\x04\xe7\xde\x39\x8c\xc8\xdf\x00\x75\x05\xa2\x0f\x0b\x64\x95\xa1\x9d\x0c\x6c\xdb\xf1\xcf\x9f\x67\x6f\x51\xc6\xb9\xae\x54\x96\x04\xbc\xc1\x53\x75\x1a\x40\x8e\xae\xd3\x07\x6f\x96\x32\x5d\xc2\x86\xbb\x14\x84\x2b\xf3\x71\xa3\x5b\x22\xa4\x95\x31\xa4\x98\x28\x60\x2c\x9a\xf0\x25\xe5\x3f\x13\x05\x61\x59\x16\xd2\xdf\xe8\xb0\x20\xd4\xd4\x92\x50\xac\xed\xaa\x77\xfb\x51\x4e\x26\xa0\x55\xef\x33\xc8\x75\x8c\x6c\x02\x22\x6f\x87\xbe\xf5\xb6\x11\x0e\x53\xaf\x08\x4c\x40\x18\xac\x75\x7d\xd1\x58\x3a\x64\xd2\x60\xea\x82\xf5\x1b\x5f\xed\x1e\xea\x23\x5c\xde\xdc\x5c\xdf\xdc\x76\xe0\x7e\x75\xf8\x0f\xfc\x74\x78\x32\xf0\xea\x55\xcf\xf5\x63\xcc\xfe\x41\x5b\x29\xbd\x51\x09\x45\x0a\xc3\x47\x9d\x66\x91\xaa\xc2\xaa\x29\x34\x0d\x02\xd0\x2a\xdf\x82\xad\x4a\xdf\xed\xba\xe0\xb2\xf2\xd4\x6e\xad\xc3\x02\x66\x52\x65\x52\x2d\x2c\x68\x03\x0b\xe9\x96\xd5\x6c\x9a\xea\xa2\x2e\xaa\xf7\xdf\x97\xc6\xc4\x3b\x33\x35\x28\x5c\x17\x4c\xee\x3e\x02\x4f\xd9\x33\xcb\x8d\x74\x4b\xe0\xb6\x25\x14\x68\xad\x58\xe0\x4b\x1a\x44\x63\x76\x3b\x2e\xde\xfb\xb1\x54\x67\x7e\x80\x3e\x0c\x64\x33\x2d\x48\xfe\xac\xf4\x42\xca\x9e\x9c\x94\x3f\x09\xd2\x1c\x31\x4b\xa4\x5a\xeb\x55\x17\xa0\x77\xec\xb6\xc8\x5d\xf8\x69\x7c\x20\x69\x19\x6c\x96\xdc\x00\x0b\x48\x9d\x6f\x3e\x86\xa1\x3f\x07\xed\x0a\xb7\x75\x0d\x85\xe2\x5d\xe1\xb4\xe9\xab\x0f\xd5\x73\xb8\xdc\xf0\x35\x2a\xf3\x9e\xec\x31\xd0\x19\xe4\x19\x4b\xa9\x89\xd2\xce\x3b\xbb\x0e\x86\x1f\xda\x35\x57\xf6\xd5\x3c\x9b\xf2\x5d\x2e\x7a\xb6\x23\xea\x21\xa6\x1c\xbd\x17\xd2\x16\xc2\xa5\x5d\xe1\x3b\x09\x58\x9b\x07\x2d\xc8\x98\x45\x16\xfd\xa9\x54\x87\xc5\x7d\x3f\x1e\x30\x40\xa6\xd1\x17\x96\x98\x09\x6f\x2b\xbb\x37\x9a\x54\xb4\x88\xec\xd5\x92\xfd\x68\x14\xa3\x5f\x88\x90\xff\x93\x79\x89\x5c\x76\xa9\xed\xca\x8f\xd2\x31\x0f\x5b\x52\x97\x6d\x89\x57\xf8\x4c\x58\x9a\xde\xea\x1e\x2a\x6d\x18\xbb\xe0\x2e\x38\xaf\xf1\x1f\xc7\xe8\x39\x42\x1c\x50\xf5\xcd\x29\x80\x0e\xf4\xca\x47\xc1\x23\xfa\xd9\x82\xaf\xf2\x78\x55\xe2\x37\x87\xca\x46\xd0\xf8\x8d\xef\x30\x12\xe7\x7b\x44\xb1\xc9\x02\xbb\x0a\x98\xcd\x51\x5e\xa0\xef\xde\x06\xdf\xdb\x94\xca\x43\xb1\xa6\xb9\xc9\xe8\x7e\x93\x69\xeb\xf8\x8e\xd6\xa9\x87\x9e\x78\x89\xf9\xf4\xd4\xdc\x3a\xf0\xed\x09\xcc\x71\x21\xa9\xb1\xd1\xb2\x50\xdb\xda\x36\xc8\x89\xb4\xb6\x7d\x50\xaf\xa1\x88\x5a\x43\x18\x14\xa3\x32\xf9\xe9\x96\xeb\x0b\x5b\x21\x85\xbe\xbb\x79\xcf\x08\xb8\xd4\xc5\x47\xe9\xeb\x5e\x8e\x7d\xef\x5b\xf2\x63\x80\x14\x22\x9f\x6b\x53\x74\x6a\xee\x43\x1c\xef\x43\x30\x85\xcf\x66\x0b\x62\x21\xa4\x1a\x4a\xe9\x8d\x49\xfe\x65\xb5\xaa\x9d\x6d\x5a\x64\x3d\x9d\x5b\x2e\xee\x4b\x55\x56\x0e\x32\xe1\x04\x7c\x08\xda\xf8\x39\x2d\xb2\x9f\xc9\xf5\xf6\x73\x12\xa5\x6c\x2a\xf0\xde\x68\xb4\x49\x2c\xfe\x5e\xa1\xea\x2c\x91\xfb\x47\x2f\x17\xb7\x61\xd6\xfe\x61\x69\xf9\x77\x6f\xcf\x7b\x3e\x6c\xc2\x55\x6f\x5e\x50\x4a\x9a\x9d\x0a\xe5\x43\x91\x19\xfa\x60\x00\x33\x98\x09\x8b\x19\x68\xd5\x32\xb2\x8b\x08\xe9\x08\xcd\x29\x7c\xca\x51\x58\x84\xaa\xcc\x84\xc3\x03\xa7\xc9\x97\x67\x9a\x57\xd9\x21\x4e\x61\x41\xc0\x06\x67\x87\x1c\x06\x77\x27\xe8\xa9\xdf\x40\x5f\x1f\xf1\x23\xa4\x9a\xb0\x6a\x0a\x57\xce\x67\x5f\xda\x2d\xf9\x2e\xe6\x53\x35\xaf\x54\x38\x53\xf1\xe0\x4d\xbc\x76\xb4\xc2\xd0\x76\x2d\x88\x0a\x7e\x2b\x31\x1d\x73\x92\x02\xd6\xb8\xc5\xd1\x3f\x90\x63\x4c\x88\xeb\x77\xa2\x67\xe0\x8d\x93\x20\xb2\xba\x72\x6d\x67\x31\x85\x2f\x8d\x13\x8e\xae\x82\x96\x4d\x6a\x77\x42\x06\x13\x83\x85\x81\x6b\x2d\x88\x13\xd5\x94\x50\xb6\xe2\x30\xc9\xa4\x19\xe5\xe4\x8e\x8a\x45\x72\xd4\x7a\x2f\xb5\x54\x3e\xa4\xf2\x29\x9a\xc3\x90\x18\x50\x20\xd3\x1c\xe7\x09\xa5\x80\x51\x2a\xcb\x39\xc5\xbe\x87\xeb\x17\x23\x15\x94\xb0\x8b\x35\x26\x99\x4e\x57\xd8\xf5\x40\xef\x8d\x50\x4c\x55\xac\x11\xde\xf2\x44\x90\x05\x07\xe0\x03\x81\xa5\xcc\x31\x11\xb9\x41\x91\x6d\x13\xfc\x26\x6d\xe7\xdb\x86\x77\x74\x42\xc2\x4c\xf0\x33\x07\x68\x67\x72\x3e\x47\x4a\x08\x9b\xac\x44\xa2\xf5\x06\x65\x29\x72\xca\xc5\x0c\xbb\x9a\x23\xd7\x0a\x81\xec\x30\xc7\xc3\xb4\xbf\xf9\x1a\xb7\xc4\x6d\x34\xd4\xcc\xb8\x69\xe2\x75\x4d\xb3\xe3\x37\xef\x58\x97\xd2\xc2\x4a\xaa\x8c\x0e\x48\xb0\xc5\xd0\x94\x7c\x72\xf1\x1c\x78\x0a\xf2\x2f\x2d\x20\x0c\xfd\x08\x9c\xf0\xbe\xec\x89\x5f\x61\x63\xe1\x86\x3a\xc5\x6e\x11\x14\xc4\xb4\x06\x59\x06\x8b\xa5\x30\xf4\x85\xa9\x5b\x1f\x33\x1d\x97\x6d\x9c\xf1\x87\x43\x96\x90\xc8\xa7\xda\xb9\xd2\x5e\x53\x16\xdd\x69\xcc\x4e\xf5\x15\x81\x59\xeb\xbc\x0f\xf0\x8b\xde\x37\x59\x8a\x35\x79\x2a\xb6\x25\x5f\x48\xb7\x01\x4c\xd7\x13\xd2\xf6\x35\x14\xc9\x04\x7f\x15\x4d\x3b\x3e\x4a\x20\x9f\xaf\xa2\x33\xf2\x89\x3e\x87\x62\xb4\x7f\x21\xbb\x9d\xc6\x37\x9d\xe1\x25\x9b\xa7\x67\xf9\xa2\x22\x63\x5a\xd2\x69\xe4\x05\x1c\xb1\x4b\x05\x22\xda\x74\xa4\x30\x70\xf8\xb5\x9a\xe7\x32\x25\x2f\x93\x84\xc4\x8d\x24\x34\xda\xda\x58\x09\xe9\x3a\xae\xad\xf3\x13\x53\x3e\x12\x3a\x7c\x0e\x32\x47\x59\x39\xf8\x2d\xaa\xdc\xc9\x32\xf7\x59\xa3\x3f\x3c\xf4\x29\x44\x24\x9e\x39\xbb\xaf\x78\xf7\x1e\x94\x41\x5c\xbb\x8b\x3b\x01\xe9\xfc\x89\x2a\xb5\xb5\x72\xe6\x4f\x01\x2b\x24\x0a\xe2\xb9\x36\xea\x99\x51\x5c\x52\x5b\x3a\x83\x78\x72\x08\x83\x24\xcc\xe6\x49\xd2\x73\x82\x32\x4d\x95\xe3\x19\x9a\xa4\x65\x21\xbb\xc8\xf1\x98\x0e\x1b\xfc\xd1\xdf\x1f\x04\x12\x2a\xbb\xa0\x43\x1d\x55\xb0\xbf\x25\x53\xff\x20\xf8\x47\x28\x99\x05\x3c\xa6\x61\x61\xad\x4e\x25\x93\x3e\x8e\xf8\x22\x82\x3b\x54\x3e\x0b\x7f\x96\xe6\x85\x69\xde\x54\x70\x33\xbb\xf3\x05\x67\x68\x90\x41\x2e\x15\x82\x30\x8b\x8a\x93\x62\x52\xa1\x59\xec\x76\xed\x78\x91\xe9\x4c\xa0\xf4\x10\xbd\x2f\xdf\xb2\x3e\x78\xe4\x04\x44\x2b\xdc\xfe\x30\x54\x2b\xdc\x5e\x30\x2d\x28\x85\x34\x4f\xe0\xed\x0f\xb3\x7f\xc7\x6f\xa2\x28\x29\xd8\xad\xc9\xad\x70\x3b\x4a\x86\x10\x60\x0d\x3f\xfd\xe9\x12\xe0\x97\xc8\xf2\x57\xf6\xc1\x81\x9e\x7f\x17\xe4\x2f\xae\xba\x14\x32\xf1\x05\xc9\x56\x7a\x19\x8d\x23\x8a\x26\xc0\xaf\xe6\x24\xa3\x21\x31\x54\x7b\xc0\xdf\x2b\x69\xb8\xb6\x55\x56\xce\x8e\xb2\x92\x9b\xb0\xc6\xa7\x32\xfe\xb4\xec\x59\x85\x05\x5c\xa3\x02\x31\x77\x68\x40\x94\x65\xce\xfd\x13\x7e\xd8\x50\x6a\x4f\x27\xf4\x52\x51\xad\xa7\xb0\x16\x46\x8a\x59\x8e\x8d\xc1\x5b\x74\x35\xc5\xfd\x29\xf1\x00\xfb\x2c\xaa\x79\x37\x15\x4f\xc3\xc5\x61\x29\x47\x1b\x4a\x4e\xde\xbc\xbf\xe2\xcd\x9e\xeb\x3c\xd7\x1b\x8f\x86\xb0\xb3\x3e\xfd\xc7\xdd\x2e\x68\xea\x50\x55\x5f\x5e\xdf\x7c\xbc\xfa\xf8\xd7\xf1\xa5\xe3\xb8\xe0\xb4\xe2\xf1\x46\x18\x55\xf7\xa7\x0d\xba\xce\x82\xdd\x0d\x8d\x91\x08\x5f\x63\x63\xfa\x3e\xa8\x9a\x8b\x85\x2f\x7d\x36\x4f\x36\x72\xdf\x97\x71\x04\x7e\xfc\x50\xe7\xe4\xfc\xbd\xfd\xae\xb7\x55\xaf\x83\x0c\xdd\x70\xae\xc3\x9c\xe9\xd0\x67\x58\x1a\x4c\xc9\x15\x26\x06\xcb\x5c\xa4\x9d\xc9\xc0\xe7\xa5\xe7\xa3\xf3\x2c\x54\x26\xf9\x5d\x94\x8f\xf5\xf6\x1b\xf2\x1b\x99\xe7\x60\xb5\x56\x94\xa5\x36\x1c\x6a\x57\x50\x59\x1f\x4b\x72\x4b\x05\x37\x7b\xe4\xac\x43\x31\x12\x7b\xd0\xc4\x39\x45\x55\xbb\xd4\x55\x9e\x11\x3c\x0a\xed\xe0\xce\xfa\xee\xa2\x6f\x7d\x78\xef\x44\xb3\xf9\xd3\xf0\xb3\x82\x1a\x11\xcf\x1f\xd8\x4a\xc2\xe5\x39\xd0\x69\x78\x5a\xec\xa5\xab\xcc\x67\x8d\x27\xb0\xe4\x6c\x4e\xac\x7b\x37\x6f\x88\x29\xaf\x8f\x1b\x1a\xdb\x58\xf1\x37\x13\xed\x1f\x4b\x0c\x03\xcb\x65\x21\x5d\x22\x17\x4a\x9b\x4e\x48\xd1\xa4\x43\x74\xc9\x4b\x7c\xb6\x42\x9f\x0e\x0b\xba\x94\x4c\x7b\x72\x63\xb9\xa7\x4b\xa1\x16\x48\x1e\xab\x03\xc0\xfb\x9a\x63\x5d\x41\xb6\x51\xee\x7c\xeb\x3b\x98\x35\x8d\x29\x5c\x11\x7b\xa9\x16\x63\x6c\x81\x11\xd8\x24\xd7\x8b\xc4\xca\x3f\xba\x00\xe4\x7a\x71\x2b\xff\xe0\x42\x85\x5f\xb0\x27\x71\x63\xa2\x42\xb1\xe3\xa6\xa0\x2f\xfe\x78\xe4\x05\x47\xdb\xbf\xbd\x18\x0d\xa5\xc0\x42\x9b\x6d\x1f\x1a\x3f\xe3\x5c\x40\xbf\xfd\xe5\x3f\x19\xd2\x7f\xfc\xf6\x97\xd1\x98\x9c\x2c\x50\x57\x5d\x15\xe0\x30\x7a\x16\x98\x17\x5e\x3f\xff\xfe\x82\xfe\x0d\xe3\xe1\x66\x5e\x52\x1a\x5d\xa2\x71\xb2\x33\x08\x8e\x1e\xb0\xe5\xaf\x7c\x0b\xd8\x19\x89\x75\x13\xd8\x77\x06\x1b\x62\xb1\x59\x7c\xdc\x27\x46\x97\x98\x69\x36\x38\xf2\x8c\xd2\x81\xae\x9c\x95\x19\x6f\xc4\x67\x23\xd6\xd2\xc2\xac\x92\x79\xd6\xdf\x49\x64\x51\xbc\x3b\x30\x64\xb6\xa3\x5c\x41\x6d\xfd\x7b\x0e\x41\x1d\x38\xf4\xa0\x6d\xee\x8f\x52\xb4\xee\xff\x1a\xd5\xfd\xf8\x38\x2d\xa4\x0a\xdd\x32\xfa\x22\xd2\x81\xda\x3b\x43\x8d\xc5\x35\x7f\xc8\xba\xdc\x44\xec\x67\x84\x59\x14\xdc\x1f\xb4\x36\x8e\x94\x3f\x3b\xbb\x17\x67\xb5\x2c\x18\x6d\x68\x88\x72\x8a\xdd\x5b\x23\x7a\xd2\xeb\xda\x73\x31\x07\xc5\xa3\x26\xda\xca\x31\x75\x20\x94\x76\xcb\x90\xdb\x0d\x43\x8a\x39\xdb\x60\xbb\xef\xf3\x93\x6a\x4c\x3b\x60\x08\xcf\xe1\x31\x03\xa5\xc7\xf5\xac\x99\x7b\xeb\xb9\x08\x2b\x65\x0c\x88\xa3\x8f\x29\xc2\x8d\x73\x18\x35\x6e\x42\x4f\xc5\x77\x26\x8f\xd5\x94\x46\x68\xa8\xf5\xa3\x96\x44\xaf\xd1\x18\x99\x65\xd8\x55\x19\x21\x84\xed\xdf\xb8\x34\xcf\x7d\x9a\xa5\x31\x56\x68\xbf\xe6\x18\xbb\x51\x89\xb4\x49\x59\xcd\x72\xd9\xf5\xeb\x3d\xbf\x2b\x3c\x37\x76\x06\xfc\xcf\x78\x84\x05\xbf\xf0\x49\xd6\x49\xe9\xaf\xf7\x2d\x33\x84\xb5\xf4\x09\x30\x9d\xc3\x54\xb0\xa7\xf1\xef\xb8\x31\x83\xd9\x16\x84\xda\x6a\xd5\xf3\xb3\x18\xc6\x1a\x0b\x59\x38\x4b\xf0\x1b\xbf\xdf\xed\xbf\xc6\x9f\xd6\xb1\xb8\x44\xcf\x8d\x02\x95\xd1\xff\xcf\x3d\x9d\x27\x35\x7a\x3a\x08\xa4\xca\x0d\xce\x26\xfe\x72\x0f\xdf\xc2\x82\x9e\xb4\xc9\x23\x6d\xf5\x62\x08\x6e\x6f\xd5\xab\xab\x42\x4f\x16\xd6\x6e\x6b\x8c\x6a\xb8\xf8\xc4\xa9\x59\x34\x85\x37\x5a\xad\xc9\xdd\x87\x94\xa0\x61\xe1\xf4\x1e\xf9\x61\x93\x3d\x94\x6a\xa0\xb7\xd4\x57\xcd\x6b\x64\x8b\x03\x27\x4a\x57\xb7\x78\x0e\xe5\x6b\x33\xaa\x25\x1c\x6c\x08\xbd\xbd\xfc\xaf\xbb\xbf\x8e\x4e\xe1\x78\xf6\x69\xf9\x5b\x36\x5b\x24\x16\x85\x49\x97\xa4\xbd\x78\xf8\xeb\x86\x44\xa7\x0a\xc3\x8a\xfa\xf0\xef\xb7\x30\xa2\x9f\xa4\xbb\xa3\xb9\x24\x07\xc2\x40\x82\x72\xe8\x21\x7f\xb4\x77\x3c\xd3\x33\x12\xb4\xfa\xea\xf0\x4f\xe2\x7a\x7e\xcd\xfd\xf6\xc8\xbb\x8c\xa0\x91\x97\xf0\x8e\x11\x34\x3f\x1e\xe6\xf2\x1c\x11\x3b\x15\x40\xff\x0f\xf1\x4e\xc7\xd0\x7e\x75\x17\x5f\x89\x06\x48\xcf\xee\x9f\xfd\x6f\x00\x00\x00\xff\xff\x8f\xdc\xdb\x56\x02\x42\x00\x00")
+var _wski18nResourcesEn_usAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x5b\x5f\x6f\x1b\x39\x92\x7f\xcf\xa7\x28\x0c\x0e\x98\x19\x40\x91\x33\x7b\x38\xe0\x10\x20\x0f\xb9\xc4\xd9\xf5\x6d\x12\x07\x76\xbc\xc1\x22\x67\xb4\xa9\xee\x92\xc4\x55\x37\xd9\x43\xb2\xa5\x68\x0c\x7d\xf7\x43\x15\xc9\xee\x96\xac\xfe\x23\x25\x73\x97\x97\x48\x26\x59\xf5\xab\x62\xb1\x58\x7f\xa8\xaf\xcf\x00\x1e\x9f\x01\x00\xfc\x24\xb3\x9f\x5e\xc2\x4f\x85\x5d\x24\xa5\xc1\xb9\xfc\x96\xa0\x31\xda\xfc\x34\xf1\xa3\xce\x08\x65\x73\xe1\xa4\x56\x34\xed\x92\xc7\x9e\x01\xec\x26\x3d\x14\xa4\x9a\xeb\x0e\x02\x57\x34\x34\xb4\xde\x56\x69\x8a\xd6\x76\x90\xb8\x0d\xa3\x43\x54\x36\xc2\x28\xa9\x16\x1d\x54\xbe\x84\xd1\x4e\x2a\x69\x91\x25\x19\xda\x34\xc9\xb5\x5a\x24\x06\x4b\x6d\x5c\x07\xad\x1b\x1e\xb4\xa0\x15\x64\x58\xe6\x7a\x8b\x19\xa0\x72\xd2\x49\xb4\xf0\x8b\x9c\xe2\x74\x02\x9f\x44\xba\x12\x0b\xb4\x13\x78\x9d\xd2\x3a\x3b\x81\xcf\x46\x2e\x16\x68\xec\x04\x6e\xaa\x9c\x46\xd0\xa5\xd3\x5f\x41\x58\xd8\x60\x9e\xd3\xff\x06\x53\x54\x8e\x57\xac\x99\x9b\x05\xa9\xc0\x2d\x11\x6c\x89\xa9\x9c\x4b\xcc\x40\x89\x02\x6d\x29\x52\x9c\x8e\x96\x45\xeb\x2e\x49\x5e\x83\xd3\x3a\x07\xa7\x83\x20\x13\xa8\x94\xff\x04\x42\x65\x60\xb7\x2a\x05\x5d\xa2\xda\x2c\xa5\x5d\x41\x19\x64\x82\xca\x4a\xb5\x00\x01\x85\x50\x72\x8e\xd6\xf1\x64\x5d\x12\x55\x91\x07\x52\x05\x49\x32\x97\x79\x3d\xfd\x9f\xaf\x3f\xbc\x1f\x83\xd9\x2e\xb5\x71\xfd\x1b\xf0\xc9\xe8\xb5\xcc\xd0\x82\x00\x5b\x15\x85\x30\x5b\xf0\xf3\x41\xcf\x61\xb3\x14\xee\x67\x0b\x33\xc4\xd6\xf6\x7c\x9f\x1a\x03\xa4\x41\x3d\x5a\x74\xa4\xcb\x25\xe6\x65\x60\x0d\x5b\x5d\x99\x51\x2a\x24\x55\x8d\xc7\xb2\x46\x63\x89\x77\x97\x7e\xa4\x72\x2c\x70\x98\x07\xaa\x2a\x66\x68\x58\x3d\x76\xe5\xa1\x8d\xe6\x45\x56\x30\x68\x3f\x6c\x2a\x2c\xec\x75\x89\xea\xcb\xbe\xb0\x33\x74\x1b\xda\x8e\x34\x97\x64\x15\x6c\x5a\x68\xd6\x68\x46\xdb\xf0\x78\x0c\x2d\xeb\x23\x3e\xd1\x9e\xf9\x0f\x7a\xfe\x7f\x69\xcd\xf3\x5c\x2c\x12\x51\xca\x64\xa9\x6d\x97\xe1\x78\x28\xaf\x3f\x5d\xc1\xc3\xdf\xae\x6f\x3f\x3f\x8c\xa4\xd8\xbf\xfd\x2d\xa2\xff\xb8\xbc\xb9\xbd\xba\xfe\x38\x8a\x6e\xe5\x96\xc9\x0a\xb7\x1d\x44\x69\x58\x1b\xf9\x07\xff\x01\x1e\xfe\x7e\xf9\xcf\x31\x44\x53\x34\x2e\x21\xbd\x75\x50\x2d\x85\x5b\xd2\xb6\x90\xad\x4e\x69\x32\x2b\x79\x0c\x61\xad\xe6\xb2\xcb\xd9\xfb\x41\x26\x05\xbf\x64\x38\x17\x55\xee\x40\x5a\xf8\xb7\xbf\x5d\x7f\xb8\xbc\x98\x6e\xec\xaa\x34\xba\xb4\xbf\x8e\xd1\x4a\x9e\xeb\x4d\x12\x68\x74\x5d\x51\x3c\x09\xea\x49\xc3\x54\x1b\xa3\xea\xd3\x4b\xed\x96\x6b\xeb\x1b\x41\xba\x34\xb8\x96\xb8\xe9\xa0\x6b\x97\x0c\x34\x12\xbd\xd8\x3b\x1e\x65\x2e\xd4\x08\x0e\x2b\xdc\x8e\xde\xd2\x15\x6e\xc7\x02\xf7\x9a\x2e\x84\x12\x0b\xcc\x7a\x15\x5d\x1a\xfd\x2f\x4c\x5d\x73\xe7\x3a\x0d\x33\x84\x42\x98\x15\x66\x10\x29\x8c\x51\x15\xd3\x49\xe8\x2e\xe8\x12\x26\xb0\xe2\x29\xc3\x14\xa3\x0b\x19\xd8\xd5\x3d\xa7\x3f\x82\x6c\x7d\x59\x75\xd0\x6d\xc6\x47\x0b\x3d\x80\xd0\xbb\xe7\x1c\xad\x8d\xda\x1e\x41\xda\x3a\x23\x3b\x29\xfb\xad\xab\x2c\x1a\x3a\x28\x52\x61\x06\xa6\x52\x4e\x16\xf5\x25\x35\x82\x83\x33\xdd\x4a\xe0\x31\xd0\x95\x2b\xab\x31\x60\xbd\xb9\xad\xd1\xcc\xb4\xed\x22\x19\x46\x4f\x25\x5a\x0a\x23\x8a\x4e\x05\x1b\x51\xa0\x43\x03\x6b\x91\x57\xc8\x01\x1e\x39\x53\xf8\xc7\xeb\xf7\x77\x97\x0f\x30\xd7\xa6\x10\x27\xb2\xea\x3b\x8d\x0f\xef\xae\xde\x5f\x3e\x40\xaa\x95\x13\x92\x22\x60\x38\x86\xe0\xbf\x6f\xaf\x3f\x0e\xb3\x66\xaf\x9a\x14\xd2\xd2\x0d\xc8\xf7\x45\xf7\x75\xf1\x79\x89\x40\x33\xe8\x8c\xa6\xfe\xce\x20\x5f\x20\x2d\x28\xed\xc0\x93\xaa\x0c\x66\xd3\xff\xe9\xdb\xf7\x03\x8e\xa5\xec\xb9\x4a\x89\x23\xdd\x79\x34\xe5\xfb\xf8\x0c\x1d\x37\xe2\x54\xcf\x39\x8f\x55\x10\xa5\x2f\x75\x3a\x94\xe7\xeb\xe3\xe3\x94\x3e\xef\x76\xf7\x13\x98\x1b\x5d\xc0\xe3\xe3\xd4\xea\xca\xa4\xb8\xdb\x8d\xe2\xe9\x37\x6c\x88\x27\x4d\x8b\x7b\x65\xd1\x9d\xc7\xab\x56\xcf\x10\xb7\x3d\x3d\x92\x88\xf5\x1f\xce\x97\xb3\x94\x8b\x4d\x22\x38\x6b\x4c\x9c\x5e\xa1\x1a\x14\x99\x56\x80\x5f\x01\xbc\xe2\x3c\xe1\x2b\x55\x08\x63\x97\x22\x4f\x72\x9d\x8a\xbc\x83\xe3\x5d\x9c\xd5\x0a\x95\x83\x2b\xb4\x9e\x1f\xaf\x0e\xc7\x73\x24\x43\x85\x6e\xa3\xcd\xea\x6c\x96\x52\x39\x34\x0a\x1d\x08\x47\xe2\x56\x26\x1f\x90\xb5\x89\x1b\x92\x54\xa8\x14\xf3\xbc\xf3\xd6\xbe\xfe\xfb\x14\xde\xf8\x39\xe4\x80\x9a\x95\x63\x19\xcc\x85\xec\xa6\xfe\xb6\x09\x60\x32\x99\x85\xb3\x58\x94\x39\x3a\x04\x5b\xd1\x96\xce\xab\x3c\xdf\x4e\xe1\xa6\x52\xf0\x50\xa7\x3f\x75\x66\xf0\x40\xf7\x9d\xc1\x42\xaf\x91\x7c\xa3\x93\x22\xcf\xb7\x4d\xe6\x28\xac\x45\xd7\xbf\x0b\x2d\xa4\x3e\x0d\x4d\xac\x13\xae\xea\x8a\x16\x9f\x3f\x7f\xfe\xfc\xd5\xab\x57\xaf\x5a\x7b\xd1\x92\xe1\x96\x97\x02\x4d\xa0\x89\xa3\xb8\x72\x01\x05\xb3\x31\x2a\x8a\xaa\xc9\x20\x54\x5d\xbc\x72\xfa\x8d\xec\xfc\xbd\x6e\xaf\x1d\xcf\xa4\x77\xbf\xef\xda\x21\x6b\xef\x8e\x8f\xe6\x37\xa4\xbf\x3d\x96\x67\x68\x30\xd5\x45\x21\x54\x96\x70\xea\xc8\xb7\x35\x79\xb9\x44\xb8\x84\xe2\xad\x0e\xa6\x8f\x8f\xd3\xb4\xc8\x76\xbb\x90\x70\x3e\x3e\x4e\x69\xa1\xdb\x96\xb8\xdb\xb1\xa7\xa4\xb5\xbb\xdd\xfd\x74\xda\xcb\x9b\x83\xe4\x6d\x12\xed\x79\xa0\xd8\xf6\xf8\x48\x21\x7b\x60\x40\x20\x77\xbb\x7b\x58\x8a\x50\x4e\x69\x0b\x5c\x9f\x90\xf1\xdc\xbb\xab\x73\x6f\xe3\x38\x1c\x05\x30\x9d\xf6\xa4\xda\x81\x45\xdc\xd0\x1f\x29\x62\x43\x73\x8c\x90\x71\x76\xb7\x98\x77\xcd\x8c\xa3\x82\xf6\xca\x99\x61\x89\x2a\x43\x95\x9e\xa2\xce\x66\xd1\xf9\x7c\x9a\x23\xd2\xa9\xd3\xb7\x47\xd9\x7c\x8f\xe1\x1c\x47\x41\x8e\xa1\x32\x5d\x71\xd9\xdb\xbd\x4a\xcf\x71\xd1\xff\x1f\xef\x88\x28\xcf\x69\x76\xf2\x7d\x3b\xf8\xd4\xcd\xfd\x98\x3d\x1c\x79\x32\xba\x90\xf4\xef\xe3\xdd\x41\xcd\xee\x9c\x9d\xec\x43\x15\x2a\x04\xe7\xde\x39\x8c\xc8\xdf\x00\x75\x05\xa2\x0f\x0b\x64\x95\xa1\x9d\x0c\x6c\xdb\xf1\xcf\x9f\x67\x6f\x51\xc6\xb9\xae\x54\x96\x04\xbc\xc1\x53\x75\x1a\x40\x8e\xae\xd3\x07\x6f\x96\x32\x5d\xc2\x86\xbb\x14\x84\x2b\xf3\x71\xa3\x5b\x22\xa4\x95\x31\xa4\x98\x28\x60\x2c\x9a\xf0\x25\xe5\x3f\x13\x05\x61\x59\x16\xd2\xdf\xe8\xb0\x20\xd4\xd4\x92\x50\xac\xed\xaa\x77\xfb\x51\x4e\x26\xa0\x55\xef\x33\xc8\x75\x8c\x6c\x02\x22\x6f\x87\xbe\xf5\xb6\x11\x0e\x53\xaf\x08\x4c\x40\x18\xac\x75\x7d\xd1\x58\x3a\x64\xd2\x60\xea\x82\xf5\x1b\x5f\xed\x1e\xea\x23\x5c\xde\xdc\x5c\xdf\xdc\x76\xe0\x7e\x75\xf8\x0f\xfc\x74\x78\x32\xf0\xea\x55\xcf\xf5\x63\xcc\xfe\x41\x5b\x29\xbd\x51\x09\x45\x0a\xc3\x47\x9d\x66\x91\xaa\xc2\xaa\x29\x34\x0d\x02\xd0\x2a\xdf\x82\xad\x4a\xdf\xed\xba\xe0\xb2\xf2\xd4\x6e\xad\xc3\x02\x66\x52\x65\x52\x2d\x2c\x68\x03\x0b\xe9\x96\xd5\x6c\x9a\xea\xa2\x2e\xaa\xf7\xdf\x97\xc6\xc4\x3b\x33\x35\x28\x5c\x17\x4c\xee\x3e\x02\x4f\xd9\x33\xcb\x8d\x74\x4b\xe0\xb6\x25\x14\x68\xad\x58\xe0\x4b\x1a\x44\x63\x76\x3b\x2e\xde\xfb\xb1\x54\x67\x7e\x80\x3e\x0c\x64\x33\x2d\x48\xfe\xac\xf4\x42\xca\x9e\x9c\x94\x3f\x09\xd2\x1c\x31\x4b\xa4\x5a\xeb\x55\x17\xa0\x77\xec\xb6\xc8\x5d\xf8\x69\x7c\x20\x69\x19\x6c\x96\xdc\x00\x0b\x48\x9d\x6f\x3e\x86\xa1\x3f\x07\xed\x0a\xb7\x75\x0d\x85\xe2\x5d\xe1\xb4\xe9\xab\x0f\xd5\x73\xb8\xdc\xf0\x35\x2a\xf3\x9e\xec\x31\xd0\x19\xe4\x19\x4b\xa9\x89\xd2\xce\x3b\xbb\x0e\x86\x1f\xda\x35\x57\xf6\xd5\x3c\x9b\xf2\x5d\x2e\x7a\xb6\x23\xea\x21\xa6\x1c\xbd\x17\xd2\x16\xc2\xa5\x5d\xe1\x3b\x09\x58\x9b\x07\x2d\xc8\x98\x45\x16\xfd\xa9\x54\x87\xc5\x7d\x3f\x1e\x30\x40\xa6\xd1\x17\x96\x98\x09\x6f\x2b\xbb\x37\x9a\x54\xb4\x88\xec\xd5\x92\xfd\x68\x14\xa3\x5f\x88\x90\xff\x93\x79\x89\x5c\x76\xa9\xed\xca\x8f\xd2\x31\x0f\x5b\x52\x97\x6d\x89\x57\xf8\x4c\x58\x9a\xde\xea\x1e\x2a\x6d\x18\xbb\xe0\x2e\x38\xaf\xf1\x1f\xc7\xe8\x39\x42\x1c\x50\xf5\xcd\x29\x80\x0e\xf4\xca\x47\xc1\x23\xfa\xd9\x82\xaf\xf2\x78\x55\xe2\x37\x87\xca\x46\xd0\xf8\x8d\xef\x30\x12\xe7\x7b\x44\xb1\xc9\x02\xbb\x0a\x98\xcd\x51\x5e\xa0\xef\xde\x06\xdf\xdb\x94\xca\x43\xb1\xa6\xb9\xc9\xe8\x7e\x93\x69\xeb\xf8\x8e\xd6\xa9\x87\x9e\x78\x89\xf9\xf4\xd4\xdc\x3a\xf0\xed\x09\xcc\x71\x21\xa9\xb1\xd1\xb2\x50\xdb\xda\x36\xc8\x89\xb4\xb6\x7d\x50\xaf\xa1\x88\x5a\x43\x18\x14\xa3\x32\xf9\xe9\x96\xeb\x0b\x5b\x21\x85\xbe\xbb\x79\xcf\x08\xb8\xd4\xc5\x47\xe9\xeb\x5e\x8e\x7d\xef\x5b\xf2\x63\x80\x14\x22\x9f\x6b\x53\x74\x6a\xee\x43\x1c\xef\x43\x30\x85\xcf\x66\x0b\x62\x21\xa4\x1a\x4a\xe9\x8d\x49\xfe\x65\xb5\xaa\x9d\x6d\x5a\x64\x3d\x9d\x5b\x2e\xee\x4b\x55\x56\x0e\x32\xe1\x04\x7c\x08\xda\xf8\x39\x2d\xb2\x9f\xc9\xf5\xf6\x73\x12\xa5\x6c\x2a\xf0\xde\x68\xb4\x49\x2c\xfe\x5e\xa1\xea\x2c\x91\xfb\x47\x2f\x17\xb7\x61\xd6\xfe\x61\x69\xf9\x77\x6f\xcf\x7b\x3e\x6c\xc2\x55\x6f\x5e\x50\x4a\x9a\x9d\x0a\xe5\x43\x91\x19\xfa\x60\x00\x33\x98\x09\x8b\x19\x68\xd5\x32\xb2\x8b\x08\xe9\x08\xcd\x29\x7c\xca\x51\x58\x84\xaa\xcc\x84\xc3\x03\xa7\xc9\x97\x67\x9a\x57\xd9\x21\x4e\x61\x41\xc0\x06\x67\x87\x1c\x06\x77\x27\xe8\xa9\xdf\x40\x5f\x1f\xf1\x23\xa4\x9a\xb0\x6a\x0a\x57\xce\x67\x5f\xda\x2d\xf9\x2e\xe6\x53\x35\xaf\x54\x38\x53\xf1\xe0\x4d\xbc\x76\xb4\xc2\xd0\x76\x2d\x88\x0a\x7e\x2b\x31\x1d\x73\x92\x02\xd6\xb8\xc5\xd1\x3f\x90\x63\x4c\x88\xeb\x77\xa2\x67\xe0\x8d\x93\x20\xb2\xba\x72\x6d\x67\x31\x85\x2f\x8d\x13\x8e\xae\x82\x96\x4d\x6a\x77\x42\x06\x13\x83\x85\x81\x6b\x2d\x88\x13\xd5\x94\x50\xb6\xe2\x30\xc9\xa4\x19\xe5\xe4\x8e\x8a\x45\x72\xd4\x7a\x2f\xb5\x54\x3e\xa4\xf2\x29\x9a\xc3\x90\x18\x50\x20\xd3\x1c\xe7\x09\xa5\x80\x51\x2a\xcb\x39\xc5\xbe\x87\xeb\x17\x23\x15\x94\xb0\x8b\x35\x26\x99\x4e\x57\xd8\xf5\x40\xef\x8d\x50\x4c\x55\xac\x11\xde\xf2\x44\x90\x05\x07\xe0\x03\x81\xa5\xcc\x31\x11\xb9\x41\x91\x6d\x13\xfc\x26\x6d\xe7\xdb\x86\x77\x74\x42\xc2\x4c\xf0\x33\x07\x68\x67\x72\x3e\x47\x4a\x08\x9b\xac\x44\xa2\xf5\x06\x65\x29\x72\xca\xc5\x0c\xbb\x9a\x23\xd7\x0a\x81\xec\x30\xc7\xc3\xb4\xbf\xf9\x1a\xb7\xc4\x6d\x34\xd4\xcc\xb8\x69\xe2\x75\x4d\xb3\xe3\x37\xef\x58\x97\xd2\xc2\x4a\xaa\x8c\x0e\x48\xb0\xc5\xd0\x94\x7c\x72\xf1\x1c\x78\x0a\xf2\x2f\x2d\x20\x0c\xfd\x08\x9c\xf0\xbe\xec\x89\x5f\x61\x63\xe1\x86\x3a\xc5\x6e\x11\x14\xc4\xb4\x06\x59\x06\x8b\xa5\x30\xf4\x85\xa9\x5b\x1f\x33\x1d\x97\x6d\x9c\xf1\x87\x43\x96\x90\xc8\xa7\xda\xb9\xd2\x5e\x53\x16\xdd\x69\xcc\x4e\xf5\x15\x81\x59\xeb\xbc\x0f\xf0\x8b\xde\x37\x59\x8a\x35\x79\x2a\xb6\x25\x5f\x48\xb7\x01\x4c\xd7\x13\xd2\xf6\x35\x14\xc9\x04\x7f\x15\x4d\x3b\x3e\x4a\x20\x9f\xaf\xa2\x33\xf2\x89\x3e\x87\x62\xb4\x7f\x21\xbb\x9d\xc6\x37\x9d\xe1\x25\x9b\xa7\x67\xf9\xa2\x22\x63\x5a\xd2\x69\xe4\x05\x1c\xb1\x4b\x05\x22\xda\x74\xa4\x30\x70\xf8\xb5\x9a\xe7\x32\x25\x2f\x93\x84\xc4\x8d\x24\x34\xda\xda\x58\x09\xe9\x3a\xae\xad\xf3\x13\x53\x3e\x12\x3a\x7c\x0e\x32\x47\x59\x39\xf8\x2d\xaa\xdc\xc9\x32\xf7\x59\xa3\x3f\x3c\xf4\x29\x44\x24\x9e\x39\xbb\xaf\x78\xf7\x1e\x94\x41\x5c\xbb\x8b\x3b\x01\xe9\xfc\x89\x2a\xb5\xb5\x72\xe6\x4f\x01\x2b\x24\x0a\xe2\xb9\x36\xea\x99\x51\x5c\x52\x5b\x3a\x83\x78\x72\x08\x83\x24\xcc\xe6\x49\xd2\x73\x82\x32\x4d\x95\xe3\x19\x9a\xa4\x65\x21\xbb\xc8\xf1\x98\x0e\x1b\xfc\xd1\xdf\x1f\x04\x12\x2a\xbb\xa0\x43\x1d\x55\xb0\xbf\x25\x53\xff\x20\xf8\x47\x28\x99\x05\x3c\xa6\x61\x61\xad\x4e\x25\x93\x3e\x8e\xf8\x22\x82\x3b\x54\x3e\x0b\x7f\x96\xe6\x85\x69\xde\x54\x70\x33\xbb\xf3\x05\x67\x68\x90\x41\x2e\x15\x82\x30\x8b\x8a\x93\x62\x52\xa1\x59\xec\x76\xed\x78\x91\xe9\x4c\xa0\xf4\x10\xbd\x2f\xdf\xb2\x3e\x78\xe4\x04\x44\x2b\xdc\xfe\x30\x54\x2b\xdc\x5e\x30\x2d\x28\x85\x34\x4f\xe0\xed\x0f\xb3\x7f\xc7\x6f\xa2\x28\x29\xd8\xad\xc9\xad\x70\x3b\x4a\x86\x10\x60\x0d\x3f\xfd\xe9\x12\xe0\x97\xc8\xf2\x57\xf6\xc1\x81\x9e\x7f\x17\xe4\x2f\xae\xba\x14\x32\xf1\x05\xc9\x56\x7a\x19\x8d\x23\x8a\x26\xc0\xaf\xe6\x24\xa3\x21\x31\x54\x7b\xc0\xdf\x2b\x69\xb8\xb6\x55\x56\xce\x8e\xb2\x92\x9b\xb0\xc6\xa7\x32\xfe\xb4\xec\x59\x85\x05\x5c\xa3\x02\x31\x77\x68\x40\x94\x65\xce\xfd\x13\x7e\xd8\x50\x6a\x4f\x27\xf4\x52\x51\xad\xa7\xb0\x16\x46\x8a\x59\x8e\x8d\xc1\x5b\x74\x35\xc5\xfd\x29\xf1\x00\xfb\x2c\xaa\x79\x37\x15\x4f\xc3\xc5\x61\x29\x47\x1b\x4a\x4e\xde\xbc\xbf\xe2\xcd\x9e\xeb\x3c\xd7\x1b\x8f\x86\xb0\xb3\x3e\xfd\xc7\xdd\x6e\x5c\xba\x5e\x0a\x63\xd1\xf4\xfe\x58\xa3\xa9\x1f\x18\x74\x46\x22\xbb\x83\x50\x36\xa8\xf7\x2f\x70\x3b\x64\xf7\xe5\xf5\xcd\xc7\xab\x8f\x7f\x1d\x5f\xa8\x8e\x0b\x4e\x2b\x55\x6f\x84\x51\x75\x37\x9c\x50\x76\xe5\xac\x37\x34\x46\x0a\xfb\x1a\xdb\xe0\xf7\x61\x63\x59\x03\x2f\x7d\xed\x80\x24\xba\xef\xcb\x6f\x02\x3f\x7e\x16\x74\x72\xb5\xa0\xfd\x8a\xb8\x55\x1d\x84\x0c\xdd\x70\x66\xc5\x9c\xc9\xc5\x64\x58\x1a\x4c\xc9\xf1\x26\x06\xcb\x5c\xa4\x9d\xa9\xc7\xe7\xa5\xe7\xa3\xf3\x2c\xd4\x41\xf9\x15\x96\x8f\x2c\xf7\xdb\xff\x1b\x99\xe7\x60\xb5\x56\x94\x13\x37\x1c\x6a\xc7\x53\x59\x1f\xb9\x72\x03\x07\x37\x7b\xe4\xac\x43\x31\x12\x7b\xd0\xc4\x39\x25\x5c\xbb\xd4\x55\x9e\x11\x3c\x0a\x24\xe1\xce\xfa\x5e\xa6\x6f\xb4\x78\x5f\x48\xb3\xf9\xd3\xf0\x23\x86\x1a\x11\xcf\x1f\xd8\x4a\xc2\xe5\x39\xd0\xd9\x7b\x5a\x5a\xa6\x8b\xd3\xe7\xa8\x27\xb0\xe4\xdc\x51\xac\x7b\x37\x6f\x88\x29\xaf\x8f\x1b\x1a\x9b\x66\xf1\x17\x1a\xed\x9f\x66\x0c\x03\xcb\x65\x21\x5d\x22\x17\x4a\x9b\x4e\x48\xd1\xa4\x43\x2c\xcb\x4b\x7c\x6e\x44\x9f\x0e\xcb\xc7\x94\xba\x7b\x72\x63\xb9\xa7\x4b\xa1\x16\x48\xfe\xb1\x03\xc0\xfb\x9a\x63\x5d\xaf\xb6\x51\xee\x7c\xeb\xfb\xa5\x35\x8d\x29\x5c\x11\x7b\xa9\x16\x63\x6c\x81\x11\xd8\x24\xd7\x8b\xc4\xca\x3f\xba\x00\xe4\x7a\x71\x2b\xff\xe0\xb2\x88\x5f\xb0\x27\x71\x63\xa2\x42\xf1\x35\x41\x21\x66\xfc\xa9\xca\x0b\x8e\xed\x7f\x7b\x31\x1a\x4a\x81\x85\x36\xdb\x3e\x34\x7e\xc6\xb9\x80\x7e\xfb\xcb\x7f\x32\xa4\xff\xf8\xed\x2f\xa3\x31\x91\xef\xd7\x55\x57\xbd\x39\x8c\x9e\x05\xe6\x85\xd7\xcf\xbf\xbf\xa0\x7f\xc3\x78\xb8\x75\x98\x94\x46\x97\x68\x9c\xec\x0c\xb9\xa3\x07\x6c\xf9\x2b\xdf\x70\xf6\xd7\x59\x68\x39\xfb\x3e\x64\x43\x2c\xb6\xa6\x8f\xfb\xc4\xe8\x12\x33\xcd\x06\x47\x9e\x51\x3a\xd0\x95\xb3\x32\xe3\x8d\xf8\x6c\xc4\x5a\x5a\x98\x55\x32\xcf\xfa\xfb\x96\x2c\x8a\x77\x07\x86\xcc\x76\x94\x2b\xa8\xad\x7f\xcf\x21\xa8\x03\x87\x1e\xb4\xcd\xdd\x58\xca\x0d\xfc\x5f\xa3\xba\x1f\x1f\xa7\x85\x54\xa1\x37\x47\x5f\x44\x3a\x50\xe9\x67\xa8\x31\x76\xf0\x87\xac\xcb\x4d\xc4\xee\x49\x98\x45\xf1\xc3\x41\x23\xe5\x48\xb1\xb5\xb3\x57\x72\x56\x83\x84\xd1\x86\xf6\x2b\x27\xf4\xbd\x15\xa9\x27\x9d\xb5\x3d\x17\x73\x50\xaa\x6a\x62\xbb\x1c\x53\x07\x42\x69\xb7\x0c\x99\xe4\x30\xa4\x98\x21\x0e\x36\x17\x3f\x3f\xa9\xfd\xb4\x03\x86\xf0\xf8\x1e\x33\x50\x7a\x5c\x87\x9c\xb9\xb7\x1e\xa7\xb0\x52\xc6\x80\x38\xfa\x74\x23\xdc\x38\x87\x31\xea\x26\x74\x70\x7c\x1f\xf4\x58\x05\x6b\x84\x86\x5a\x3f\xa1\x49\xf4\x1a\x8d\x91\x59\x86\x5d\x75\x18\x42\xd8\xfe\x45\x4d\xf3\xb8\xa8\x59\x1a\x63\x85\xf6\xdb\x91\xb1\x1b\x95\x48\x9b\x94\xd5\x2c\x97\x5d\xbf\x15\xf4\xbb\xc2\x73\x63\x1f\xc2\xff\x68\x48\x58\xf0\x0b\x9f\xe4\xb8\x94\x6c\x7b\xdf\x32\x43\x58\x4b\x9f\x6e\xd3\x39\x4c\x05\x7b\x1a\xff\x6a\x1c\x33\x98\x6d\x41\xa8\xad\x56\x3d\x3f\xc2\x61\xac\xb1\x6c\x86\xb3\x04\xbf\xf1\x6b\xe1\xfe\x6b\xfc\x69\xd5\x8c\x1b\x02\xdc\x96\x50\x19\xfd\xff\xdc\xd3\x79\xd2\x11\xa0\x83\x40\xaa\xdc\xe0\x6c\xe2\x2f\xf7\xf0\x2d\x2c\xe8\x49\xd2\x3c\xd2\x56\xe7\x87\xe0\xf6\xd6\xd8\xba\xfa\x01\x64\x61\xed\x26\xca\xa8\xf6\x8e\x4f\xd3\x9a\x45\x53\x78\xa3\xd5\x9a\xdc\x7d\x48\x09\x1a\x16\x4e\xef\x91\x1f\x36\xd9\x43\xa9\x06\x3a\x59\x7d\xb5\xc3\x46\xb6\x38\x70\xa2\x74\x75\x43\xe9\x50\xbe\x36\xa3\x5a\xc2\xc1\xf6\xd3\xdb\xcb\xff\xba\xfb\xeb\xe8\x14\x8e\x67\x9f\x96\xbf\x65\xb3\x45\x62\x51\x98\x74\x49\xda\x8b\x87\xbf\x6e\x7f\x74\xaa\x30\xac\xa8\x0f\xff\x7e\xc3\x24\xfa\x49\xba\x3b\x9a\x4b\x72\x20\x0c\x24\x28\x87\x1e\xf2\x47\x7b\xc7\x33\x3d\x23\x41\xab\xaf\x0e\xff\x00\xaf\xe7\xb7\xe3\x6f\x8f\xbc\x02\x09\x1a\x79\x09\xef\x18\x41\xf3\x53\x65\x2e\x06\x12\xb1\x53\x01\xf4\xff\xec\xef\x74\x0c\xed\x37\x7e\xf1\x4d\x6a\x80\xf4\xec\xfe\xd9\xff\x06\x00\x00\xff\xff\x64\x87\x26\x11\x70\x42\x00\x00")
func wski18nResourcesEn_usAllJsonBytes() ([]byte, error) {
return bindataRead(
@@ -112,7 +112,7 @@
return nil, err
}
- info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 16898, mode: os.FileMode(420), modTime: time.Unix(1525997024, 0)}
+ info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 17008, mode: os.FileMode(420), modTime: time.Unix(1528157319, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
diff --git a/wski18n/resources/en_US.all.json b/wski18n/resources/en_US.all.json
index ea6505e..614d434 100644
--- a/wski18n/resources/en_US.all.json
+++ b/wski18n/resources/en_US.all.json
@@ -363,6 +363,10 @@
"id": "msg_err_required_inputs_missing_value",
"translation": "Required inputs are missing values even after applying interpolation using env. variables. Please set missing env. variables and/or input values in manifest/deployment file or on CLI for following inputs: {{.inputs}}"
},
+ {
+ "id": "msg_err_runtime_parser_error",
+ "translation": "Failed to retrieve runtimes {{.err}}."
+ },
{
"id": "WARNINGS",