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/02 03:08:50 UTC

[incubator-openwhisk-wskdeploy] branch master updated: Create new error types (#433)

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 2caf7b6  Create new error types (#433)
2caf7b6 is described below

commit 2caf7b61640f06c3d060c3c0355bb9770d8d0b87
Author: Vincent <sh...@us.ibm.com>
AuthorDate: Fri Sep 1 23:08:47 2017 -0400

    Create new error types (#433)
---
 cmd/report.go                    | 20 ++++++++-----
 cmd/root.go                      | 27 ++++++++++++++---
 deployers/manifestreader.go      |  3 +-
 deployers/servicedeployer.go     | 13 ++++++---
 deployers/whiskclient.go         | 59 ++++++++++++++++++++++---------------
 parsers/manifest_parser.go       |  4 +--
 parsers/manifest_parser_test.go  | 12 ++++++--
 utils/errorhandlers.go           |  5 ++--
 utils/misc.go                    | 17 -----------
 utils/wskdeployerror.go          | 63 ++++++++++++++++++++++++++++++++++++----
 wski18n/i18n_resources.go        | 21 ++++++++++++--
 wski18n/resources/en_US.all.json | 28 ++++++++++++++++++
 12 files changed, 199 insertions(+), 73 deletions(-)

diff --git a/cmd/report.go b/cmd/report.go
index 73b6c51..65842bf 100644
--- a/cmd/report.go
+++ b/cmd/report.go
@@ -27,6 +27,7 @@ import (
 	"github.com/spf13/cobra"
 	"path"
 	"sync"
+    "net/http"
 )
 
 var wskpropsPath string
@@ -42,15 +43,18 @@ var reportCmd = &cobra.Command{
 on OpenWhisk with specific OpenWhisk namespace. By default it will read the wsk property file
 located under current user home.`,
 	Run: func(cmd *cobra.Command, args []string) {
-		// TODO: Work your own magic here
 		if wskpropsPath != "" {
-			client, _ = deployers.NewWhiskClient(wskpropsPath, utils.Flags.DeploymentPath, utils.Flags.ManifestPath, false)
-		}
-		userHome := utils.GetHomeDirectory()
-		//default to ~/.wskprops
-		propPath := path.Join(userHome, ".wskprops")
-		client, _ = deployers.NewWhiskClient(propPath, utils.Flags.DeploymentPath, utils.Flags.ManifestPath, false)
-		printDeploymentInfo(client)
+			config, _ := deployers.NewWhiskConfig(wskpropsPath, utils.Flags.DeploymentPath, utils.Flags.ManifestPath, false)
+            client, _ := deployers.CreateNewClient(http.DefaultClient, config)
+            printDeploymentInfo(client)
+		} else {
+            //default to ~/.wskprops
+            userHome := utils.GetHomeDirectory()
+            propPath := path.Join(userHome, ".wskprops")
+            config, _ := deployers.NewWhiskConfig(propPath, utils.Flags.DeploymentPath, utils.Flags.ManifestPath, false)
+            client, _ := deployers.CreateNewClient(http.DefaultClient, config)
+            printDeploymentInfo(client)
+        }
 	},
 }
 
diff --git a/cmd/root.go b/cmd/root.go
index abe1533..5596096 100644
--- a/cmd/root.go
+++ b/cmd/root.go
@@ -31,6 +31,7 @@ import (
 	"strings"
 	"path"
 	"path/filepath"
+    "net/http"
 )
 
 var stderr = ""
@@ -198,8 +199,17 @@ func Deploy() error {
 		// master record of any dependency that has been downloaded
 		deployer.DependencyMaster = make(map[string]utils.DependencyRecord)
 
-		whiskClient, clientConfig := deployers.NewWhiskClient(utils.Flags.CfgFile, utils.Flags.DeploymentPath, utils.Flags.ManifestPath, deployer.IsInteractive)
-		deployer.Client = whiskClient
+        clientConfig, error := deployers.NewWhiskConfig(utils.Flags.CfgFile, utils.Flags.DeploymentPath, utils.Flags.ManifestPath, deployer.IsInteractive)
+        if error != nil {
+            return error
+        }
+
+        whiskClient, error := deployers.CreateNewClient(http.DefaultClient, clientConfig)
+        if error != nil {
+            return error
+        }
+
+        deployer.Client = whiskClient
 		deployer.ClientConfig = clientConfig
 
         // The auth, apihost and namespace have been chosen, so that we can check the supported runtimes here.
@@ -279,8 +289,17 @@ func Undeploy() error {
 		deployer.IsInteractive = utils.Flags.UseInteractive
 		deployer.IsDefault = utils.Flags.UseDefaults
 
-		whiskClient, clientConfig := deployers.NewWhiskClient(utils.Flags.CfgFile, utils.Flags.DeploymentPath, utils.Flags.ManifestPath, deployer.IsInteractive)
-		deployer.Client = whiskClient
+        clientConfig, error := deployers.NewWhiskConfig(utils.Flags.CfgFile, utils.Flags.DeploymentPath, utils.Flags.ManifestPath, deployer.IsInteractive)
+        if error != nil {
+            return error
+        }
+
+        whiskClient, error := deployers.CreateNewClient(http.DefaultClient, clientConfig)
+        if error != nil {
+            return error
+        }
+
+        deployer.Client = whiskClient
 		deployer.ClientConfig = clientConfig
 
         // The auth, apihost and namespace have been chosen, so that we can check the supported runtimes here.
diff --git a/deployers/manifestreader.go b/deployers/manifestreader.go
index f7c9b77..942af39 100644
--- a/deployers/manifestreader.go
+++ b/deployers/manifestreader.go
@@ -60,6 +60,7 @@ func (reader *ManifestReader) InitRootPackage(manifestParser *parsers.YAMLParser
 // Wrapper parser to handle yaml dir
 func (deployer *ManifestReader) HandleYaml(sdeployer *ServiceDeployer, manifestParser *parsers.YAMLParser, manifest *parsers.ManifestYAML) error {
 
+    var err error
 	deps, err := manifestParser.ComposeDependencies(manifest, deployer.serviceDeployer.ProjectPath)
 
 	actions, aubindings, err := manifestParser.ComposeActions(manifest, deployer.serviceDeployer.ManifestPath)
@@ -94,7 +95,7 @@ func (deployer *ManifestReader) HandleYaml(sdeployer *ServiceDeployer, manifestP
 		err = deployer.SetApis(sdeployer, aubindings)
 	}
 
-	return nil
+	return err
 }
 
 func (reader *ManifestReader) SetDependencies(deps map[string]utils.DependencyRecord) error {
diff --git a/deployers/servicedeployer.go b/deployers/servicedeployer.go
index 0caea7d..254311a 100644
--- a/deployers/servicedeployer.go
+++ b/deployers/servicedeployer.go
@@ -28,6 +28,7 @@ import (
 	"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 {
@@ -111,6 +112,7 @@ func (deployer *ServiceDeployer) ConstructDeploymentPlan() error {
 
 	var manifestReader = NewManfiestReader(deployer)
 	manifestReader.IsUndeploy = false
+    var err error
 	manifest, manifestParser, err := manifestReader.ParseManifest()
 	utils.Check(err)
 
@@ -138,13 +140,14 @@ func (deployer *ServiceDeployer) ConstructDeploymentPlan() error {
 		deploymentReader.BindAssets()
 	}
 
-	return nil
+	return err
 }
 
 func (deployer *ServiceDeployer) ConstructUnDeploymentPlan() (*DeploymentApplication, error) {
 
 	var manifestReader = NewManfiestReader(deployer)
 	manifestReader.IsUndeploy = true
+    var err error
 	manifest, manifestParser, err := manifestReader.ParseManifest()
 	utils.Check(err)
 
@@ -175,7 +178,7 @@ func (deployer *ServiceDeployer) ConstructUnDeploymentPlan() (*DeploymentApplica
 
 	verifiedPlan := deployer.Deployment
 
-	return verifiedPlan, nil
+	return verifiedPlan, err
 }
 
 // Use reflect util to deploy everything in this service deployer
@@ -197,7 +200,8 @@ func (deployer *ServiceDeployer) Deploy() error {
 		if strings.EqualFold(text, "y") || strings.EqualFold(text, "yes") {
 			deployer.InteractiveChoice = true
 			if err := deployer.deployAssets(); err != nil {
-				fmt.Println("\nDeployment did not complete sucessfully. Run `wskdeploy undeploy` to remove partially deployed assets")
+                errString := wski18n.T("Deployment did not complete sucessfully. Run `wskdeploy undeploy` to remove partially deployed assets.\n")
+                whisk.Debug(whisk.DbgError, errString)
 				return err
 			}
 
@@ -213,7 +217,8 @@ func (deployer *ServiceDeployer) Deploy() error {
 
 	// non-interactive
 	if err := deployer.deployAssets(); err != nil {
-		fmt.Println("\nDeployment did not complete sucessfully. Run `wskdeploy undeploy` to remove partially deployed assets")
+        errString := wski18n.T("Deployment did not complete sucessfully. Run `wskdeploy undeploy` to remove partially deployed assets.\n")
+        whisk.Debug(whisk.DbgError, errString)
 		return err
 	}
 
diff --git a/deployers/whiskclient.go b/deployers/whiskclient.go
index d5d9da4..87bf629 100644
--- a/deployers/whiskclient.go
+++ b/deployers/whiskclient.go
@@ -21,15 +21,14 @@ import (
 	"bufio"
 	"fmt"
 	"net/http"
-	"net/url"
 	"os"
 	"strings"
 
 	"github.com/apache/incubator-openwhisk-client-go/whisk"
 	"github.com/apache/incubator-openwhisk-wskdeploy/parsers"
+    "github.com/apache/incubator-openwhisk-wskdeploy/wski18n"
 	"github.com/apache/incubator-openwhisk-wskdeploy/utils"
     "path"
-    "errors"
 )
 
 const (
@@ -69,7 +68,7 @@ var CreateNewClient = func (httpClient *http.Client, config_input *whisk.Config)
     return whisk.NewClient(http.DefaultClient, clientConfig)
 }
 
-func NewWhiskClient(proppath string, deploymentPath string, manifestPath string, isInteractive bool) (*whisk.Client, *whisk.Config) {
+func NewWhiskConfig(proppath string, deploymentPath string, manifestPath string, isInteractive bool) (*whisk.Config, error) {
     credential := PropertyValue {}
     namespace := PropertyValue {}
     apiHost := PropertyValue {}
@@ -108,6 +107,7 @@ func NewWhiskClient(proppath string, deploymentPath string, manifestPath string,
         OsPackage: whisk.OSPackageImp{},
     }
 
+    // The error raised here can be neglected, because we will handle it in the end of this function.
     wskprops, _ := GetWskPropFromWskprops(pi, proppath)
     credential = GetPropertyValue(credential, wskprops.AuthKey, WSKPROPS)
     namespace = GetPropertyValue(namespace, wskprops.Namespace, WSKPROPS)
@@ -118,7 +118,10 @@ func NewWhiskClient(proppath string, deploymentPath string, manifestPath string,
         // No need to keep the default value for namespace, since both of auth and apihost are not set after .wskprops.
         // whisk.property will set the default value as well.
         apiHost.Value = ""
+        apiHost.Source = DEFAULTVALUE
     }
+
+    // The error raised here can be neglected, because we will handle it in the end of this function.
     whiskproperty, _ := GetWskPropFromWhiskProperty(pi)
     credential = GetPropertyValue(credential, whiskproperty.AuthKey, WHISKPROPERTY)
     namespace = GetPropertyValue(namespace, whiskproperty.Namespace, WHISKPROPERTY)
@@ -153,42 +156,50 @@ func NewWhiskClient(proppath string, deploymentPath string, manifestPath string,
                 ns = whisk.DEFAULT_NAMESPACE
                 source = DEFAULTVALUE
             }
-
             namespace.Value = ns
             namespace.Source = source
         }
     }
 
-    var baseURL *url.URL
-    baseURL, err := utils.GetURLBase(apiHost.Value)
-    if err != nil {
-        utils.Check(err)
-    }
-
-    if len(credential.Value) == 0 {
-        errStr := "Missing authentication key"
-        err = whisk.MakeWskError(errors.New(errStr), whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
-        utils.Check(err)
-    }
-
-    fmt.Println("The URL is " + baseURL.String() + ", selected from " + apiHost.Source)
-    fmt.Println("The auth key is set, selected from " + credential.Source)
-    fmt.Println("The namespace is " + namespace.Value + ", selected from " + namespace.Source)
     clientConfig = &whisk.Config{
         AuthToken: credential.Value, //Authtoken
         Namespace: namespace.Value,  //Namespace
-        BaseURL:   baseURL,
         Host: apiHost.Value,
         Version:   "v1",
         Insecure:  true, // true if you want to ignore certificate signing
+    }
+
+    if len(credential.Value) == 0 {
+        errStr := wski18n.T("The authentication key is not configured.\n")
+        whisk.Debug(whisk.DbgError, errStr)
+        return clientConfig, utils.NewInvalidWskpropsError(errStr)
+    }
 
+    if len(apiHost.Value) == 0 {
+        errStr := wski18n.T("The API host is not configured.\n")
+        whisk.Debug(whisk.DbgError, errStr)
+        return clientConfig, utils.NewInvalidWskpropsError(errStr)
     }
 
-    // Setup network client
-    client, err := CreateNewClient(http.DefaultClient, clientConfig)
-    utils.Check(err)
-    return client, clientConfig
+    if len(namespace.Value) == 0 {
+        errStr := wski18n.T("The namespace is not configured.\n")
+        whisk.Debug(whisk.DbgError, errStr)
+        return clientConfig, utils.NewInvalidWskpropsError(errStr)
+    }
+
+    stdout := wski18n.T("The API host is {{.apihost}}, from {{.apisource}}.\n",
+        map[string]interface{}{"apihost": apiHost.Value, "apisource": apiHost.Source})
+    whisk.Debug(whisk.DbgInfo, stdout)
+
+    stdout = wski18n.T("The auth key is set, from {{.authsource}}.\n",
+        map[string]interface{}{"authsource": credential.Source})
+    whisk.Debug(whisk.DbgInfo, stdout)
+
+    stdout = wski18n.T("The namespace is {{.namespace}}, from {{.namespacesource}}.\n",
+        map[string]interface{}{"namespace": namespace.Value, "namespacesource": namespace.Source})
+    whisk.Debug(whisk.DbgInfo, stdout)
 
+    return clientConfig, nil
 }
 
 var promptForValue = func (msg string) (string, error) {
diff --git a/parsers/manifest_parser.go b/parsers/manifest_parser.go
index 9abfe49..8330f09 100644
--- a/parsers/manifest_parser.go
+++ b/parsers/manifest_parser.go
@@ -513,7 +513,7 @@ func ResolveParamTypeFromValue(value interface{}) (string, error) {
 
 		} else {
 			// raise an error if param is not a known type
-			err = utils.NewParserErr("", -1, "Parameter value is not a known type. ["+actualType+"]")
+			err = utils.NewParserErr("Parameter value is not a known type. ["+actualType+"]")
 		}
 	} else {
 
@@ -556,7 +556,7 @@ func ResolveParameter(paramName string, param *Parameter) (interface{}, error) {
 
 		// if we do not have a value or default, but have a type, find its default and use it for the value
 		if param.Type != "" && !isValidParameterType(param.Type) {
-			return value, utils.NewParserErr("", -1, "Invalid Type for parameter. ["+param.Type+"]")
+			return value, utils.NewParserErr("Invalid Type for parameter. ["+param.Type+"]")
 		} else if param.Type == "" {
 			param.Type = tempType
 		}
diff --git a/parsers/manifest_parser_test.go b/parsers/manifest_parser_test.go
index f42d961..fb3f1c9 100644
--- a/parsers/manifest_parser_test.go
+++ b/parsers/manifest_parser_test.go
@@ -1,4 +1,4 @@
-// +build unit
+//// +build unit
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
@@ -876,8 +876,14 @@ func TestResolveParameterForMultiLineParams(t *testing.T) {
 	param5 := Parameter{Type: "invalid", multiline: true}
 	_, err := ResolveParameter(p, &param5)
 	assert.NotNil(t, err, "Expected error saying Invalid type for parameter")
-	expectedErr := utils.NewParserErr("", -1, "Invalid Type for parameter. [invalid]")
-	assert.Equal(t, err, expectedErr, "Expected error "+expectedErr.Error()+" but found "+err.Error())
+	expectedErr := utils.NewParserErr("Invalid Type for parameter. [invalid]")
+    switch errorType := err.(type) {
+        default:
+            assert.Fail(t, "Wrong error type received: We are expecting ParserErr.")
+        case *utils.ParserErr:
+            assert.Equal(t, expectedErr.Message, errorType.Message,
+                "Expected error " + expectedErr.Message + " but found " + errorType.Message)
+    }
 
 	// type none - param without type, without value, and without default value
 	param6 := Parameter{multiline: true}
diff --git a/utils/errorhandlers.go b/utils/errorhandlers.go
index 297e441..04ecd57 100644
--- a/utils/errorhandlers.go
+++ b/utils/errorhandlers.go
@@ -52,8 +52,7 @@ func PrintOpenWhiskError(err error) {
     fmt.Fprintf(outputStream, "%s%s\n", color.RedString(wski18n.T("Error: ")), err.Error())
 }
 
-func PrintOpenWhiskOutput(err error) {
-    outputStream := colorable.NewColorableStderr()
-    fmt.Fprintf(outputStream, "%s%s\n", color.RedString(wski18n.T("Error: ")), err.Error())
+func PrintOpenWhiskOutput(output string) {
+    fmt.Fprintf(os.Stdout, "%s\n", output)
 }
 
diff --git a/utils/misc.go b/utils/misc.go
index afb6dc4..11f1afa 100644
--- a/utils/misc.go
+++ b/utils/misc.go
@@ -319,23 +319,6 @@ func javaEntryError() error {
 	return errors.New(errMsg)
 }
 
-// ParserErr records errors from parsing YAML against the wskdeploy spec.
-type ParserErr struct {
-	filneame string
-	lineNum  int
-	message  string
-}
-
-// Implement the error interface.
-func (e ParserErr) Error() string {
-	return fmt.Sprintf("%s [%d]: %s", e.filneame, e.lineNum, e.message)
-}
-
-func NewParserErr(fname string, line int, msg string) error {
-	var err = &ParserErr{"", -1, msg}
-	return err
-}
-
 //for web action support, code from wsk cli with tiny adjustments
 const WEB_EXPORT_ANNOT = "web-export"
 const RAW_HTTP_ANNOT = "raw-http"
diff --git a/utils/wskdeployerror.go b/utils/wskdeployerror.go
index 3b23a92..8394d02 100644
--- a/utils/wskdeployerror.go
+++ b/utils/wskdeployerror.go
@@ -19,6 +19,7 @@ package utils
 
 import (
     "fmt"
+    "runtime"
     "github.com/apache/incubator-openwhisk-wskdeploy/wski18n"
 )
 
@@ -40,18 +41,70 @@ func (e *TestCaseError) Error() string {
     return e.errorMessage
 }
 
+type BaseErr struct {
+    FileName string
+    LineNum  int
+    Message  string
+}
+
+func (e *BaseErr) Error() string {
+    return fmt.Sprintf("%s [%d]: %s", e.FileName, e.LineNum, e.Message)
+}
+
+func (e *BaseErr) SetFileName(fileName string) {
+    e.FileName = fileName
+}
+
+func (e *BaseErr) SetLineNum(lineNum int) {
+    e.LineNum = lineNum
+}
+
+func (e *BaseErr) SetMessage(message string) {
+    e.Message = message
+}
+
 type InputYamlFileError struct {
-    errorMessage string
+    BaseErr
     errorType string
 }
 
-func NewInputYamlFileError(errorMessage string) *InputYamlFileError {
-    return &InputYamlFileError{
-        errorMessage: errorMessage,
+func NewInputYamlFileError(errMessage string) *InputYamlFileError {
+    _, fn, lineNum, _ := runtime.Caller(1)
+    var err = &InputYamlFileError{
         errorType: wski18n.T(INVALID_YAML_INPUT),
     }
+    err.SetFileName(fn)
+    err.SetLineNum(lineNum)
+    err.SetMessage(errMessage)
+    return err
 }
 
 func (e *InputYamlFileError) Error() string {
-    return fmt.Sprintf("%s =====> %s", e.errorType, e.errorMessage)
+    return fmt.Sprintf("%s [%d]: %s =====> %s", e.FileName, e.LineNum, e.errorType, e.Message)
+}
+
+type InvalidWskpropsError struct {
+    BaseErr
+}
+
+func NewInvalidWskpropsError(errMessage string) *InvalidWskpropsError {
+    _, fn, lineNum, _ := runtime.Caller(1)
+    var err = &InvalidWskpropsError{}
+    err.SetFileName(fn)
+    err.SetLineNum(lineNum)
+    err.SetMessage(errMessage)
+    return err
+}
+
+type ParserErr struct {
+    BaseErr
+}
+
+func NewParserErr(msg string) *ParserErr {
+    _, fn, line, _ := runtime.Caller(1)
+    var err = &ParserErr{}
+    err.SetFileName(fn)
+    err.SetLineNum(line)
+    err.SetMessage(msg)
+    return err
 }
diff --git a/wski18n/i18n_resources.go b/wski18n/i18n_resources.go
index 23da48f..e9caf8d 100644
--- a/wski18n/i18n_resources.go
+++ b/wski18n/i18n_resources.go
@@ -1,3 +1,20 @@
+/*
+ * 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.
+ */
+
 // Code generated by go-bindata.
 // sources:
 // wski18n/resources/de_DE.all.json
@@ -97,7 +114,7 @@ func wski18nResourcesDe_deAllJson() (*asset, error) {
     return a, nil
 }
 
-var _wski18nResourcesEn_usAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x92\xcd\x4e\xeb\x30\x14\x84\xf7\x79\x8a\x51\x36\xdd\x54\xb9\xfb\xbb\xeb\xa2\x52\x2b\x04\xad\x28\x20\x21\x40\x8a\x89\x1d\x62\x1a\xff\x28\x3e\x01\x95\x28\xef\x8e\xe2\xb6\x80\x8a\xd3\x14\xd8\x59\xf1\xcc\x37\x93\x73\x7c\x17\x01\x4d\x04\x00\xb1\xe4\xf1\x7f\xc4\x33\x51\x96\x26\x1e\x6f\x3f\x51\xc5\xb4\x2b\x19\x49\xa3\xbb\xbb\x89\xc6\x64\x39\x47\x61\x1c\x41\xd5\x8e\xf0\x28\x60\x2b\xf3\x22\xb9\xe0\x49\x1c\x01 [...]
+var _wski18nResourcesEn_usAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x94\xc1\x8e\xd3\x30\x10\x86\xef\x7e\x8a\x51\x2e\x7b\xa9\xc2\x9d\xdb\x1e\x56\xda\x15\x82\x5d\xb1\x0b\x12\x02\xa4\x9a\x78\xd2\x98\xc6\x76\x64\x8f\x41\xc5\xca\xbb\x23\xbb\x6d\xa8\x8a\xdd\xa6\xdd\x5b\x6c\xcf\x7c\xf3\x7b\x7e\x4f\xbe\x32\x80\xc0\x00\x00\x2a\x29\xaa\xb7\x50\xdd\x63\xdf\x9b\x6a\xb1\xdd\x22\xcb\xb5\xeb\x39\x49\xa3\xe3\xd9\xad\x86\xdb\xa7\x07\xe8\x8c\x23\x50\xde\x11\xfc\x40\x18\xac\xf9\x25\x05 [...]
 
 func wski18nResourcesEn_usAllJsonBytes() ([]byte, error) {
     return bindataRead(
@@ -112,7 +129,7 @@ func wski18nResourcesEn_usAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 1082, mode: os.FileMode(420), modTime: time.Unix(1504207585, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 1890, mode: os.FileMode(420), modTime: time.Unix(1504289235, 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 fccfc6f..45c3bdb 100644
--- a/wski18n/resources/en_US.all.json
+++ b/wski18n/resources/en_US.all.json
@@ -42,5 +42,33 @@
   {
     "id": "Using {{.manifestPath}} for undeployment.\n",
     "translation": "Using {{.manifestPath}} for undeployment.\n"
+  },
+
+
+
+  {
+    "id": "The authentication key is not configured.\n",
+    "translation": "The authentication key is not configured.\n"
+  },
+  {
+    "id": "The API host is not configured.\n",
+    "translation": "The API host is not configured.\n"
+  },
+  {
+    "id": "The namespace is not configured.\n",
+    "translation": "The namespace is not configured.\n"
+  },
+  {
+    "id": "The API host is {{.apihost}}, from {{.apisource}}.\n",
+    "translation": "The API host is {{.apihost}}, from {{.apisource}}.\n"
+  },
+  {
+    "id": "The auth key is set, from {{.authsource}}.\n",
+    "translation": "The auth key is set, from {{.authsource}}.\n"
+  },
+  {
+    "id": "The namespace is {{.namespace}}, from {{.namespacesource}}.\n",
+    "translation": "The namespace is {{.namespace}}, from {{.namespacesource}}.\n"
   }
+
 ]

-- 
To stop receiving notification emails like this one, please contact
['"commits@openwhisk.apache.org" <co...@openwhisk.apache.org>'].