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 0eb9c6b  lint: introduce lint and fix lint issues
0eb9c6b is described below

commit 0eb9c6b87a56bb16efdadf6aac8376c8f1a8b19e
Author: Rohit Yadav <[email protected]>
AuthorDate: Sat Apr 14 04:13:20 2018 +0530

    lint: introduce lint and fix lint issues
    
    Signed-off-by: Rohit Yadav <[email protected]>
---
 .travis.yml      |  1 +
 cli/completer.go | 55 +++++++++++++++++++++++--------------------------------
 cli/exec.go      |  1 +
 cli/selector.go  | 34 +++++++++++++++++-----------------
 cli/shell.go     | 10 +++++++---
 cmd/api.go       |  1 +
 cmd/command.go   |  5 +++++
 cmd/network.go   |  9 +++++----
 cmd/request.go   |  2 ++
 cmd/set.go       |  2 +-
 config/about.go  |  3 +++
 config/cache.go  | 33 ++++++++++++++++++++-------------
 config/config.go | 34 ++++++++++++++++++----------------
 config/prompt.go |  1 +
 14 files changed, 105 insertions(+), 86 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 5acfcd3..412ca24 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -24,3 +24,4 @@ go:
 
 script:
   - make all
+  - make lint
diff --git a/cli/completer.go b/cli/completer.go
index 58ff60b..271faa1 100644
--- a/cli/completer.go
+++ b/cli/completer.go
@@ -29,29 +29,27 @@ import (
        "github.com/chzyer/readline/runes"
 )
 
-type CliCompleter struct {
+type autoCompleter struct {
        Config *config.Config
 }
 
-var completer *CliCompleter
-
-func buildApiCacheMap(apiMap map[string][]*config.Api) 
map[string][]*config.Api {
+func buildAPICacheMap(apiMap map[string][]*config.API) 
map[string][]*config.API {
        for _, cmd := range cmd.AllCommands() {
                verb := cmd.Name
                if cmd.SubCommands != nil && len(cmd.SubCommands) > 0 {
                        for _, scmd := range cmd.SubCommands {
-                               dummyApi := &config.Api{
+                               dummyAPI := &config.API{
                                        Name: scmd,
                                        Verb: verb,
                                }
-                               apiMap[verb] = append(apiMap[verb], dummyApi)
+                               apiMap[verb] = append(apiMap[verb], dummyAPI)
                        }
                } else {
-                       dummyApi := &config.Api{
+                       dummyAPI := &config.API{
                                Name: "",
                                Verb: verb,
                        }
-                       apiMap[verb] = append(apiMap[verb], dummyApi)
+                       apiMap[verb] = append(apiMap[verb], dummyAPI)
                }
        }
        return apiMap
@@ -87,9 +85,9 @@ func doInternal(line []rune, pos int, lineLen int, argName 
[]rune) (newLine [][]
        return
 }
 
-func (t *CliCompleter) Do(line []rune, pos int) (options [][]rune, offset int) 
{
+func (t *autoCompleter) Do(line []rune, pos int) (options [][]rune, offset 
int) {
 
-       apiMap := buildApiCacheMap(t.Config.GetApiVerbMap())
+       apiMap := buildAPICacheMap(t.Config.GetAPIVerbMap())
 
        var verbs []string
        for verb := range apiMap {
@@ -138,7 +136,7 @@ func (t *CliCompleter) Do(line []rune, pos int) (options 
[][]rune, offset int) {
        }
 
        // Find API
-       var apiFound *config.Api
+       var apiFound *config.API
        for _, api := range apiMap[verbFound] {
                if api.Noun == nounFound {
                        apiFound = api
@@ -165,7 +163,7 @@ func (t *CliCompleter) Do(line []rune, pos int) (options 
[][]rune, offset int) {
                                return
                        }
 
-                       var autocompleteApi *config.Api
+                       var autocompleteAPI *config.API
                        var relatedNoun string
                        if arg.Name == "id" || arg.Name == "ids" {
                                relatedNoun = apiFound.Noun
@@ -179,23 +177,23 @@ func (t *CliCompleter) Do(line []rune, pos int) (options 
[][]rune, offset int) {
                        }
                        for _, related := range apiMap["list"] {
                                if relatedNoun == related.Noun {
-                                       autocompleteApi = related
+                                       autocompleteAPI = related
                                        break
                                }
                        }
 
-                       if autocompleteApi == nil {
+                       if autocompleteAPI == nil {
                                return nil, 0
                        }
 
-                       r := cmd.NewRequest(nil, shellConfig, nil, nil)
-                       autocompleteApiArgs := []string{"listall=true"}
-                       if autocompleteApi.Noun == "templates" {
-                               autocompleteApiArgs = 
append(autocompleteApiArgs, "templatefilter=all")
+                       r := cmd.NewRequest(nil, completer.Config, nil, nil)
+                       autocompleteAPIArgs := []string{"listall=true"}
+                       if autocompleteAPI.Noun == "templates" {
+                               autocompleteAPIArgs = 
append(autocompleteAPIArgs, "templatefilter=all")
                        }
-                       response, _ := cmd.NewAPIRequest(r, 
autocompleteApi.Name, autocompleteApiArgs)
+                       response, _ := cmd.NewAPIRequest(r, 
autocompleteAPI.Name, autocompleteAPIArgs)
 
-                       var autocompleteOptions []SelectOption
+                       var autocompleteOptions []selectOption
                        for _, v := range response {
                                switch obj := v.(type) {
                                case []interface{}:
@@ -207,9 +205,9 @@ func (t *CliCompleter) Do(line []rune, pos int) (options 
[][]rune, offset int) {
                                                if !ok {
                                                        continue
                                                }
-                                               opt := SelectOption{}
+                                               opt := selectOption{}
                                                if resource["id"] != nil {
-                                                       opt.Id = 
resource["id"].(string)
+                                                       opt.ID = 
resource["id"].(string)
                                                }
                                                if resource["name"] != nil {
                                                        opt.Name = 
resource["name"].(string)
@@ -232,15 +230,15 @@ func (t *CliCompleter) Do(line []rune, pos int) (options 
[][]rune, offset int) {
                                        return autocompleteOptions[i].Name < 
autocompleteOptions[j].Name
                                })
                                fmt.Println()
-                               selectedOption := 
ShowSelector(autocompleteOptions)
+                               selectedOption := 
showSelector(autocompleteOptions)
                                if strings.HasSuffix(arg.Name, "id") || 
strings.HasSuffix(arg.Name, "ids") {
-                                       selected = selectedOption.Id
+                                       selected = selectedOption.ID
                                } else {
                                        selected = selectedOption.Name
                                }
                        } else {
                                if len(autocompleteOptions) == 1 {
-                                       selected = autocompleteOptions[0].Id
+                                       selected = autocompleteOptions[0].ID
                                }
                        }
                        options = [][]rune{[]rune(selected + " ")}
@@ -250,10 +248,3 @@ func (t *CliCompleter) Do(line []rune, pos int) (options 
[][]rune, offset int) {
 
        return options, offset
 }
-
-func NewCompleter(cfg *config.Config) *CliCompleter {
-       completer = &CliCompleter{
-               Config: cfg,
-       }
-       return completer
-}
diff --git a/cli/exec.go b/cli/exec.go
index f118768..d64daa1 100644
--- a/cli/exec.go
+++ b/cli/exec.go
@@ -23,6 +23,7 @@ import (
        "github.com/chzyer/readline"
 )
 
+// ExecCmd executes a single provided command
 func ExecCmd(cfg *config.Config, args []string, shell *readline.Instance) 
error {
        if len(args) < 1 {
                return nil
diff --git a/cli/selector.go b/cli/selector.go
index 27e03b2..104e16e 100644
--- a/cli/selector.go
+++ b/cli/selector.go
@@ -25,47 +25,47 @@ import (
        "github.com/manifoldco/promptui"
 )
 
-type SelectOption struct {
-       Id     string
+type selectOption struct {
+       ID     string
        Name   string
        Detail string
 }
 
-type Selector struct {
+type selector struct {
        InUse bool
 }
 
-var selector Selector
+var optionSelector selector
 
 func init() {
-       selector = Selector{
+       optionSelector = selector{
                InUse: false,
        }
 }
 
-func (s Selector) lock() {
+func (s selector) lock() {
        s.InUse = true
 }
 
-func (s Selector) unlock() {
+func (s selector) unlock() {
        s.InUse = false
 }
 
-func ShowSelector(options []SelectOption) SelectOption {
-       if selector.InUse {
-               return SelectOption{}
+func showSelector(options []selectOption) selectOption {
+       if optionSelector.InUse {
+               return selectOption{}
        }
-       selector.lock()
-       defer selector.unlock()
+       optionSelector.lock()
+       defer optionSelector.unlock()
 
        templates := &promptui.SelectTemplates{
                Label:    "{{ . }}",
-               Active:   "▶ {{ .Name | cyan }} ({{ .Id | red }})",
-               Inactive: "  {{ .Name | cyan }} ({{ .Id | red }})",
-               Selected: "👊Selected: {{ .Name | cyan }} ({{ .Id | red }})",
+               Active:   "▶ {{ .Name | cyan }} ({{ .ID | red }})",
+               Inactive: "  {{ .Name | cyan }} ({{ .ID | red }})",
+               Selected: "👊Selected: {{ .Name | cyan }} ({{ .ID | red }})",
                Details: `
 --------- Current Selection ----------
-{{ "Id:" | faint }}  {{ .Id }}
+{{ "ID:" | faint }}  {{ .ID }}
 {{ "Name:" | faint }} {{ .Name }}
 {{ "Info:" | faint }}  {{ .Detail }}`,
        }
@@ -98,7 +98,7 @@ func ShowSelector(options []SelectOption) SelectOption {
 
        if err != nil {
                fmt.Printf("Prompt failed %v\n", err)
-               return SelectOption{}
+               return selectOption{}
        }
 
        return options[i]
diff --git a/cli/shell.go b/cli/shell.go
index 903a607..26ab8d9 100644
--- a/cli/shell.go
+++ b/cli/shell.go
@@ -28,14 +28,18 @@ import (
        "github.com/chzyer/readline"
 )
 
-var shellConfig *config.Config
+var completer *autoCompleter
 
+// ExecShell starts a shell
 func ExecShell(cfg *config.Config) {
-       shellConfig = cfg
+       completer = &autoCompleter{
+               Config: cfg,
+       }
+
        shell, err := readline.NewEx(&readline.Config{
                Prompt:            cfg.GetPrompt(),
                HistoryFile:       cfg.HistoryFile,
-               AutoComplete:      NewCompleter(cfg),
+               AutoComplete:      completer,
                InterruptPrompt:   "^C",
                EOFPrompt:         "exit",
                VimMode:           false,
diff --git a/cmd/api.go b/cmd/api.go
index ad51753..e185a74 100644
--- a/cmd/api.go
+++ b/cmd/api.go
@@ -26,6 +26,7 @@ import (
 
 var apiCommand *Command
 
+// GetAPIHandler returns a catchall command handler
 func GetAPIHandler() *Command {
        return apiCommand
 }
diff --git a/cmd/command.go b/cmd/command.go
index b631d6c..4f90387 100644
--- a/cmd/command.go
+++ b/cmd/command.go
@@ -21,6 +21,7 @@ import (
        "fmt"
 )
 
+// Command describes a CLI command
 type Command struct {
        Name            string
        Help            string
@@ -32,14 +33,17 @@ type Command struct {
 var commands []*Command
 var commandMap map[string]*Command
 
+// FindCommand finds command handler for a command string
 func FindCommand(name string) *Command {
        return commandMap[name]
 }
 
+// AllCommands returns all available commands
 func AllCommands() []*Command {
        return commands
 }
 
+// AddCommand adds a command to internal list
 func AddCommand(cmd *Command) {
        commands = append(commands, cmd)
        if commandMap == nil {
@@ -48,6 +52,7 @@ func AddCommand(cmd *Command) {
        commandMap[cmd.Name] = cmd
 }
 
+// PrintUsage prints help usage for a command
 func PrintUsage() {
        commandHelp := ""
        for _, cmd := range commands {
diff --git a/cmd/network.go b/cmd/network.go
index 94f67ad..0eb973d 100644
--- a/cmd/network.go
+++ b/cmd/network.go
@@ -56,6 +56,7 @@ func encodeRequestParams(params url.Values) string {
        return buf.String()
 }
 
+// NewAPIRequest makes an API request to configured management server
 func NewAPIRequest(r *Request, api string, args []string) 
(map[string]interface{}, error) {
        params := make(url.Values)
        params.Add("command", api)
@@ -66,7 +67,7 @@ func NewAPIRequest(r *Request, api string, args []string) 
(map[string]interface{
                }
        }
 
-       apiKey := r.Config.Core.ActiveProfile.ApiKey
+       apiKey := r.Config.Core.ActiveProfile.APIKey
        secretKey := r.Config.Core.ActiveProfile.SecretKey
 
        if len(apiKey) > 0 {
@@ -81,10 +82,10 @@ func NewAPIRequest(r *Request, api string, args []string) 
(map[string]interface{
        signature := base64.StdEncoding.EncodeToString(mac.Sum(nil))
        encodedParams = encodedParams + fmt.Sprintf("&signature=%s", 
url.QueryEscape(signature))
 
-       apiUrl := fmt.Sprintf("%s?%s", r.Config.Core.ActiveProfile.Url, 
encodedParams)
+       apiURL := fmt.Sprintf("%s?%s", r.Config.Core.ActiveProfile.URL, 
encodedParams)
 
-       //fmt.Println("[debug] Requesting: ", apiUrl)
-       response, err := http.Get(apiUrl)
+       //fmt.Println("[debug] Requesting: ", apiURL)
+       response, err := http.Get(apiURL)
        if err != nil {
                fmt.Println("Error:", err)
                return nil, err
diff --git a/cmd/request.go b/cmd/request.go
index 66d7a48..45b006a 100644
--- a/cmd/request.go
+++ b/cmd/request.go
@@ -22,6 +22,7 @@ import (
        "github.com/chzyer/readline"
 )
 
+// Request describes a command request
 type Request struct {
        Command *Command
        Config  *config.Config
@@ -29,6 +30,7 @@ type Request struct {
        Args    []string
 }
 
+// NewRequest creates a new request from a command
 func NewRequest(cmd *Command, cfg *config.Config, shell *readline.Instance, 
args []string) *Request {
        return &Request{
                Command: cmd,
diff --git a/cmd/set.go b/cmd/set.go
index 2e716e9..a40e5ba 100644
--- a/cmd/set.go
+++ b/cmd/set.go
@@ -34,7 +34,7 @@ func init() {
                        }
                        subCommand := r.Args[0]
                        value := strings.Join(r.Args[1:], " ")
-                       r.Config.UpdateGlobalConfig(subCommand, value)
+                       r.Config.UpdateConfig(subCommand, value)
 
                        if subCommand == "profile" && r.Shell != nil {
                                r.Shell.SetPrompt(r.Config.GetPrompt())
diff --git a/config/about.go b/config/about.go
index 0d59518..c47c029 100644
--- a/config/about.go
+++ b/config/about.go
@@ -19,14 +19,17 @@ package config
 
 import "fmt"
 
+// Name of the CLI
 func (c *Config) Name() string {
        return "Apache CloudStack 🐵 cloudmonkey"
 }
 
+// Version of the CLI
 func (c *Config) Version() string {
        return "6.0.0-alpha1"
 }
 
+// PrintHeader prints startup message in CLI mode
 func (c *Config) PrintHeader() {
        fmt.Println(c.Name(), c.Version())
        fmt.Println("Type \"help\" for details, \"sync\" to update API cache or 
press tab to list commands")
diff --git a/config/cache.go b/config/cache.go
index e908cea..8a4501a 100644
--- a/config/cache.go
+++ b/config/cache.go
@@ -26,7 +26,8 @@ import (
        "unicode"
 )
 
-type ApiArg struct {
+// APIArg are the args passable to an API
+type APIArg struct {
        Name        string
        Type        string
        Related     []string
@@ -35,11 +36,12 @@ type ApiArg struct {
        Length      int
 }
 
-type Api struct {
+// API describes a CloudStack API
+type API struct {
        Name         string
        Verb         string
        Noun         string
-       Args         []*ApiArg
+       Args         []*APIArg
        RequiredArgs []string
        Related      []string
        Async        bool
@@ -47,14 +49,15 @@ type Api struct {
        ResponseName string
 }
 
-var apiCache map[string]*Api
-var apiVerbMap map[string][]*Api
+var apiCache map[string]*API
+var apiVerbMap map[string][]*API
 
-func (c *Config) GetApiVerbMap() map[string][]*Api {
+// GetAPIVerbMap returns API cache by verb
+func (c *Config) GetAPIVerbMap() map[string][]*API {
        if apiVerbMap != nil {
                return apiVerbMap
        }
-       apiSplitMap := make(map[string][]*Api)
+       apiSplitMap := make(map[string][]*API)
        for api := range apiCache {
                verb := apiCache[api].Verb
                apiSplitMap[verb] = append(apiSplitMap[verb], apiCache[api])
@@ -62,14 +65,16 @@ func (c *Config) GetApiVerbMap() map[string][]*Api {
        return apiSplitMap
 }
 
-func (c *Config) GetCache() map[string]*Api {
+// GetCache returns API cache by full API name
+func (c *Config) GetCache() map[string]*API {
        if apiCache == nil {
                // read from disk?
-               return make(map[string]*Api)
+               return make(map[string]*API)
        }
        return apiCache
 }
 
+// LoadCache loads cache using the default cache file
 func LoadCache(c *Config) {
        cache, err := ioutil.ReadFile(c.CacheFile)
        if err != nil {
@@ -81,13 +86,15 @@ func LoadCache(c *Config) {
        c.UpdateCache(data)
 }
 
+// SaveCache saves received auto-discovery data to cache file
 func (c *Config) SaveCache(response map[string]interface{}) {
        output, _ := json.Marshal(response)
        ioutil.WriteFile(c.CacheFile, output, 0600)
 }
 
+// UpdateCache uses auto-discovery data to update internal API cache
 func (c *Config) UpdateCache(response map[string]interface{}) interface{} {
-       apiCache = make(map[string]*Api)
+       apiCache = make(map[string]*API)
        apiVerbMap = nil
 
        count := response["count"]
@@ -114,7 +121,7 @@ func (c *Config) UpdateCache(response 
map[string]interface{}) interface{} {
                verb := apiName[:idx]
                noun := strings.ToLower(apiName[idx:])
 
-               var apiArgs []*ApiArg
+               var apiArgs []*APIArg
                for _, argNode := range api["params"].([]interface{}) {
                        apiArg, _ := argNode.(map[string]interface{})
                        related := []string{}
@@ -122,7 +129,7 @@ func (c *Config) UpdateCache(response 
map[string]interface{}) interface{} {
                                related = 
strings.Split(apiArg["related"].(string), ",")
                                sort.Strings(related)
                        }
-                       apiArgs = append(apiArgs, &ApiArg{
+                       apiArgs = append(apiArgs, &APIArg{
                                Name:        apiArg["name"].(string),
                                Type:        apiArg["type"].(string),
                                Required:    apiArg["required"].(bool),
@@ -142,7 +149,7 @@ func (c *Config) UpdateCache(response 
map[string]interface{}) interface{} {
                        }
                }
 
-               apiCache[strings.ToLower(apiName)] = &Api{
+               apiCache[strings.ToLower(apiName)] = &API{
                        Name:         apiName,
                        Verb:         verb,
                        Noun:         noun,
diff --git a/config/config.go b/config/config.go
index e5336e5..df6d4c1 100644
--- a/config/config.go
+++ b/config/config.go
@@ -26,23 +26,26 @@ import (
        "strconv"
 )
 
+// Output formats
 const (
-       Json  = "json"
-       Xml   = "xml"
-       Table = "table"
-       Text  = "text"
+       JSON  = "json"
+       XML   = "xml"
+       TABLE = "table"
+       TEXT  = "text"
 )
 
+// ServerProfile describes a management server
 type ServerProfile struct {
-       Url        string `ini:"url"`
+       URL        string `ini:"url"`
        Username   string `ini:"username"`
        Password   string `ini:"password"`
        Domain     string `ini:"domain"`
-       ApiKey     string `ini:"apikey"`
+       APIKey     string `ini:"apikey"`
        SecretKey  string `ini:"secretkey"`
        VerifyCert bool   `ini:"verifycert"`
 }
 
+// Core block describes common options for the CLI
 type Core struct {
        AsyncBlock    bool           `ini:"asyncblock"`
        Timeout       int            `ini:"timeout"`
@@ -51,6 +54,7 @@ type Core struct {
        ActiveProfile *ServerProfile `ini:"-"`
 }
 
+// Config describes CLI config file and default options
 type Config struct {
        Dir         string
        ConfigFile  string
@@ -80,14 +84,14 @@ func defaultConfig() *Config {
                Core: &Core{
                        AsyncBlock:  false,
                        Timeout:     1800,
-                       Output:      Json,
+                       Output:      JSON,
                        ProfileName: "local",
                        ActiveProfile: &ServerProfile{
-                               Url:        "http://localhost:8080/client/api";,
+                               URL:        "http://localhost:8080/client/api";,
                                Username:   "admin",
                                Password:   "password",
                                Domain:     "/",
-                               ApiKey:     "",
+                               APIKey:     "",
                                SecretKey:  "",
                                VerifyCert: false,
                        },
@@ -154,11 +158,8 @@ func reloadConfig(cfg *Config) *Config {
        return cfg
 }
 
-func (c *Config) UpdateGlobalConfig(key string, value string) {
-       c.UpdateConfig("", key, value)
-}
-
-func (c *Config) UpdateConfig(namespace string, key string, value string) {
+// UpdateConfig updates and saves config
+func (c *Config) UpdateConfig(key string, value string) {
        switch key {
        case "asyncblock":
                c.Core.AsyncBlock = value == "true"
@@ -171,7 +172,7 @@ func (c *Config) UpdateConfig(namespace string, key string, 
value string) {
                c.Core.ProfileName = value
                c.Core.ActiveProfile = nil
        case "url":
-               c.Core.ActiveProfile.Url = value
+               c.Core.ActiveProfile.URL = value
        case "username":
                c.Core.ActiveProfile.Username = value
        case "password":
@@ -179,7 +180,7 @@ func (c *Config) UpdateConfig(namespace string, key string, 
value string) {
        case "domain":
                c.Core.ActiveProfile.Domain = value
        case "apikey":
-               c.Core.ActiveProfile.ApiKey = value
+               c.Core.ActiveProfile.APIKey = value
        case "secretkey":
                c.Core.ActiveProfile.SecretKey = value
        case "verifycert":
@@ -191,6 +192,7 @@ func (c *Config) UpdateConfig(namespace string, key string, 
value string) {
        reloadConfig(c)
 }
 
+// NewConfig creates or reload config and loads API cache
 func NewConfig() *Config {
        defaultConf := defaultConfig()
        defaultConf.Core = nil
diff --git a/config/prompt.go b/config/prompt.go
index ea8dd82..83b04b1 100644
--- a/config/prompt.go
+++ b/config/prompt.go
@@ -43,6 +43,7 @@ func promptMoji() string {
        return emoji() // 🐒
 }
 
+// GetPrompt returns prompt that the CLI should use
 func (c *Config) GetPrompt() string {
        return fmt.Sprintf("(%s) %s > ", c.Core.ProfileName, promptMoji())
 }

-- 
To stop receiving notification emails like this one, please contact
[email protected].

Reply via email to