This is an automated email from the ASF dual-hosted git repository. rohit pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cloudstack-cloudmonkey.git
The following commit(s) were added to refs/heads/master by this push: new c515cbb cmd: handle errors well, throw non-zero exit code on error c515cbb is described below commit c515cbb131855e8981ec3c1bc9318c3ad747f1cb Author: Rohit Yadav <ro...@apache.org> AuthorDate: Mon Jun 25 16:18:06 2018 +0530 cmd: handle errors well, throw non-zero exit code on error Signed-off-by: Rohit Yadav <ro...@apache.org> --- Makefile | 4 ++-- cmd/api.go | 4 ++++ cmd/network.go | 13 ++++++++----- cmd/set.go | 3 +-- config/config.go | 36 ++++++++++++++++++++---------------- 5 files changed, 35 insertions(+), 25 deletions(-) diff --git a/Makefile b/Makefile index 235ec03..fbd28c0 100644 --- a/Makefile +++ b/Makefile @@ -49,8 +49,8 @@ $(BASE): ; $(info $(M) Setting GOPATH…) run: all ./bin/cloudmonkey -debug: all - $(GO) build -gcflags='-N -l' -o cmk cmk.go && dlv --listen=:2345 --headless=true --api-version=2 exec ./bin/cloudmonkey +debug: + $(GO) build -gcflags='-N -l' -o cmk cmk.go && dlv --listen=:2345 --headless=true --api-version=2 exec ./cmk dist: cd $(BASE) diff --git a/cmd/api.go b/cmd/api.go index 7e0621a..5c0a57c 100644 --- a/cmd/api.go +++ b/cmd/api.go @@ -107,7 +107,11 @@ func printResult(outputType string, response map[string]interface{}, filter []st } table.Render() case config.TEXT: + case config.DEFAULT: printText(response) + case config.CSV: + fmt.Println("FIXME: implement CSV output") + fmt.Println(response) default: jsonOutput, _ := json.MarshalIndent(response, "", " ") fmt.Println(string(jsonOutput)) diff --git a/cmd/network.go b/cmd/network.go index f31eda7..c3e5b9f 100644 --- a/cmd/network.go +++ b/cmd/network.go @@ -82,19 +82,19 @@ func Login(r *Request) (*http.Client, string, error) { client := &http.Client{ Jar: jar, Transport: &http.Transport{ - TLSClientConfig: &tls.Config{InsecureSkipVerify: !r.Config.ActiveProfile.VerifyCert}, + TLSClientConfig: &tls.Config{InsecureSkipVerify: !r.Config.Core.VerifyCert}, }, } sessionKey := "" resp, err := client.PostForm(r.Config.ActiveProfile.URL, params) if err != nil { - return client, sessionKey, errors.New("failed to connect to management server, please check the URL: " + r.Config.ActiveProfile.URL) + return client, sessionKey, errors.New("failed to authenticate with the CloudStack server, please check the settings: " + err.Error()) } if resp.StatusCode != http.StatusOK { - e := errors.New("failed to log in, please check the credentials") + e := errors.New("failed to authenticate, please check the credentials") if err != nil { - e = errors.New("failed to log in due to " + err.Error()) + e = errors.New("failed to authenticate due to " + err.Error()) } return client, sessionKey, e } @@ -175,7 +175,7 @@ func NewAPIRequest(r *Request, api string, args []string, isAsync bool) (map[str client = &http.Client{ Transport: &http.Transport{ - TLSClientConfig: &tls.Config{InsecureSkipVerify: !r.Config.ActiveProfile.VerifyCert}, + TLSClientConfig: &tls.Config{InsecureSkipVerify: !r.Config.Core.VerifyCert}, }, } encodedParams = encodeRequestParams(params) @@ -215,6 +215,9 @@ func NewAPIRequest(r *Request, api string, args []string, isAsync bool) (map[str } if apiResponse := getResponseData(data); apiResponse != nil { + if _, ok := apiResponse["errorcode"]; ok { + return nil, fmt.Errorf("(HTTP %v, error code %v) %v", apiResponse["errorcode"], apiResponse["cserrorcode"], apiResponse["errortext"]) + } return apiResponse, nil } diff --git a/cmd/set.go b/cmd/set.go index 70c7de9..a43c104 100644 --- a/cmd/set.go +++ b/cmd/set.go @@ -30,7 +30,7 @@ func init() { "prompt": {"🐵", "🐱", "random"}, "asyncblock": {"true", "false"}, "timeout": {"600", "1800", "3600"}, - "output": {"json", "text", "table", "xml"}, + "output": {"json", "text", "table", "csv", "xml"}, "profile": {}, "url": {}, "username": {}, @@ -55,7 +55,6 @@ func init() { fmt.Println("Username: ", r.Config.ActiveProfile.Username) fmt.Println("Domain: ", r.Config.ActiveProfile.Domain) fmt.Println("API Key: ", r.Config.ActiveProfile.APIKey) - fmt.Println("Verify Cert:", r.Config.ActiveProfile.VerifyCert) fmt.Println() r.Shell.SetPrompt(r.Config.GetPrompt()) diff --git a/config/config.go b/config/config.go index c210e8a..5d203c0 100644 --- a/config/config.go +++ b/config/config.go @@ -30,20 +30,22 @@ import ( const ( CSV = "csv" JSON = "json" - XML = "xml" TABLE = "table" TEXT = "text" + + // Old formats existing for some backward compatibilities + DEFAULT = "default" // This is same as 'text' + XML = "xml" ) // ServerProfile describes a management server type ServerProfile struct { - URL string `ini:"url"` - Username string `ini:"username"` - Password string `ini:"password"` - Domain string `ini:"domain"` - APIKey string `ini:"apikey"` - SecretKey string `ini:"secretkey"` - VerifyCert bool `ini:"verifycert"` + URL string `ini:"url"` + Username string `ini:"username"` + Password string `ini:"password"` + Domain string `ini:"domain"` + APIKey string `ini:"apikey"` + SecretKey string `ini:"secretkey"` } // Core block describes common options for the CLI @@ -52,6 +54,7 @@ type Core struct { AsyncBlock bool `ini:"asyncblock"` Timeout int `ini:"timeout"` Output string `ini:"output"` + VerifyCert bool `ini:"verifycert"` ProfileName string `ini:"profile"` } @@ -81,19 +84,19 @@ func defaultCoreConfig() Core { AsyncBlock: true, Timeout: 1800, Output: JSON, + VerifyCert: true, ProfileName: "localcloud", } } func defaultProfile() ServerProfile { return ServerProfile{ - URL: "http://localhost:8080/client/api", - Username: "admin", - Password: "password", - Domain: "/", - APIKey: "", - SecretKey: "", - VerifyCert: false, + URL: "http://localhost:8080/client/api", + Username: "admin", + Password: "password", + Domain: "/", + APIKey: "", + SecretKey: "", } } @@ -201,6 +204,7 @@ func (c *Config) UpdateConfig(key string, value string) { case "asyncblock": c.Core.AsyncBlock = value == "true" case "output": + case "display": c.Core.Output = value case "timeout": intValue, _ := strconv.Atoi(value) @@ -221,7 +225,7 @@ func (c *Config) UpdateConfig(key string, value string) { case "secretkey": c.ActiveProfile.SecretKey = value case "verifycert": - c.ActiveProfile.VerifyCert = value == "true" + c.Core.VerifyCert = value == "true" } reloadConfig(c)