Add ability to read controller nodeport IP from file 19/64519/3
authorearrage <eddie.arrage@huawei.com>
Mon, 5 Nov 2018 19:49:36 +0000 (11:49 -0800)
committerearrage <eddie.arrage@huawei.com>
Tue, 6 Nov 2018 00:24:29 +0000 (16:24 -0800)
- Formalize use of cloverctl config file using viper
- Default name of config file is '.cloverctl.yaml'
- Look for file in home directory or relative to
cloverctl executable
- Single value in config is for 'ControllerIP: <IP Address>'
- Still try and retrieve port value of clover-controller nodeport
automatically
- Still try and retrieve IP address of clover-controller LB if
GKE environment is being used and override config file value if found
in current kube context

- Improve error messaging if controller connect fails
- Clean up the CLI help output
- Modify jmeter 'get testresult' command to avoid the use
of flags and use arguments instead

Change-Id: Id95d1b3d1079ac84996681db62da1f9b6b8a88b5
Signed-off-by: earrage <eddie.arrage@huawei.com>
29 files changed:
clover/cloverctl/src/cloverctl/cmd/clear.go
clover/cloverctl/src/cloverctl/cmd/clear_visibility.go
clover/cloverctl/src/cloverctl/cmd/create.go
clover/cloverctl/src/cloverctl/cmd/create_docker_registry.go
clover/cloverctl/src/cloverctl/cmd/create_idsrules.go
clover/cloverctl/src/cloverctl/cmd/create_kubernetes.go
clover/cloverctl/src/cloverctl/cmd/create_testplan.go
clover/cloverctl/src/cloverctl/cmd/delete.go
clover/cloverctl/src/cloverctl/cmd/delete_docker_registry.go
clover/cloverctl/src/cloverctl/cmd/delete_kubernetes.go
clover/cloverctl/src/cloverctl/cmd/get.go
clover/cloverctl/src/cloverctl/cmd/get_docker_registry.go
clover/cloverctl/src/cloverctl/cmd/get_kubernetes.go
clover/cloverctl/src/cloverctl/cmd/get_services.go
clover/cloverctl/src/cloverctl/cmd/get_testresult.go
clover/cloverctl/src/cloverctl/cmd/get_visibility.go
clover/cloverctl/src/cloverctl/cmd/init.go
clover/cloverctl/src/cloverctl/cmd/init_visibility.go
clover/cloverctl/src/cloverctl/cmd/provider.go
clover/cloverctl/src/cloverctl/cmd/root.go
clover/cloverctl/src/cloverctl/cmd/set_nginx.go
clover/cloverctl/src/cloverctl/cmd/set_visibility.go
clover/cloverctl/src/cloverctl/cmd/start.go
clover/cloverctl/src/cloverctl/cmd/start_ids.go
clover/cloverctl/src/cloverctl/cmd/start_testplan.go
clover/cloverctl/src/cloverctl/cmd/start_visibility.go
clover/cloverctl/src/cloverctl/cmd/stop.go
clover/cloverctl/src/cloverctl/cmd/stop_ids.go
clover/cloverctl/src/cloverctl/cmd/stop_visibility.go

index 309df70..eab784a 100644 (file)
@@ -17,7 +17,7 @@ var clearCmd = &cobra.Command{
     Short: "Truncate visibility tables",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
-        fmt.Println("clear called")
+        fmt.Println("Uncomplete command")
     },
 }
 
index 2ad43f1..2e66637 100644 (file)
@@ -9,6 +9,7 @@ package cmd
 
 import (
     "fmt"
+    "os"
     "gopkg.in/resty.v1"
     "github.com/spf13/cobra"
 )
@@ -16,7 +17,7 @@ import (
 
 var visibilityclearCmd = &cobra.Command{
     Use:   "visibility",
-    Short: "Clear visibility tables",
+    Short: "Clear visibility data",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
         clearCollector()
@@ -28,12 +29,14 @@ func init() {
 }
 
 func clearCollector() {
+    checkControllerIP()
     url := controllerIP + "/visibility/clear"
 
     resp, err := resty.R().
     Get(url)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Cannot connect to controller: %v\n", err)
+        os.Exit(1)
     }
     fmt.Printf("\n%v\n", resp)
 }
index 3a09fa4..a66acf9 100644 (file)
@@ -14,10 +14,10 @@ import (
 
 var createCmd = &cobra.Command{
     Use:   "create",
-    Short: "Create resources including IDS rules, L7 testplans, etc.",
+    Short: "Create clover configurations and deployments",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
-        fmt.Println("create called")
+        fmt.Println("Incomplete command")
     },
 }
 
index 77045f6..37e8aeb 100644 (file)
@@ -10,7 +10,7 @@ package cmd
 import (
     "fmt"
     "io/ioutil"
-
+    "os"
     "gopkg.in/resty.v1"
     "github.com/ghodss/yaml"
     "github.com/spf13/cobra"
@@ -28,21 +28,24 @@ var dockerregistryCmd = &cobra.Command{
 
 func init() {
     providercreateCmd.AddCommand(dockerregistryCmd)
-    dockerregistryCmd.Flags().StringVarP(&cloverFile, "file", "f", "", "Input yaml file to add kubernetes provider")
+    dockerregistryCmd.Flags().StringVarP(&cloverFile, "file", "f", "",
+                                  "Input yaml file to add docker registry")
     dockerregistryCmd.MarkFlagRequired("file")
 
 }
 
 func createDockerRegistry() {
+    checkControllerIP()
     url := controllerIP + "/halyard/addregistry"
     in, err := ioutil.ReadFile(cloverFile)
     if err != nil {
-        fmt.Println("Please specify a valid rule definition yaml file")
-        return
+        fmt.Println("Please specify a valid yaml file")
+        os.Exit(1)
     }
     out_json, err := yaml.YAMLToJSON(in)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Invalid yaml: %v\n", err)
+        os.Exit(1)
     }
 
     resp, err := resty.R().
@@ -50,7 +53,8 @@ func createDockerRegistry() {
     SetBody(out_json).
     Post(url)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Cannot connect to controller: %v\n", err)
+        os.Exit(1)
     }
     fmt.Printf("\n%v\n", resp)
 
index bc0d8d5..6e59297 100644 (file)
@@ -9,6 +9,7 @@ package cmd
 
 import (
     "fmt"
+    "os"
     "io/ioutil"
     "gopkg.in/resty.v1"
     "github.com/ghodss/yaml"
@@ -18,7 +19,7 @@ import (
 
 var idsrulesCmd = &cobra.Command{
     Use:   "idsrules",
-    Short: "Create one or many IDS rules from yaml file",
+    Short: "Create one or many snort IDS rules from yaml file",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
         createIDSRules()
@@ -27,30 +28,32 @@ var idsrulesCmd = &cobra.Command{
 
 func init() {
     createCmd.AddCommand(idsrulesCmd)
-    idsrulesCmd.Flags().StringVarP(&cloverFile, "file", "f", "", "Input yaml file to add IDS rules")
+    idsrulesCmd.Flags().StringVarP(&cloverFile, "file", "f", "",
+                                   "Input yaml file to add IDS rules")
     idsrulesCmd.MarkFlagRequired("file")
 
 }
 
 func createIDSRules() {
+    checkControllerIP()
     url := controllerIP + "/snort/addrule"
     in, err := ioutil.ReadFile(cloverFile)
     if err != nil {
         fmt.Println("Please specify a valid rule definition yaml file")
-        return
+        os.Exit(1)
     }
     out_json, err := yaml.YAMLToJSON(in)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Invalid yaml: %v\n", err)
+        os.Exit(1)
     }
     resp, err := resty.R().
     SetHeader("Content-Type", "application/json").
     SetBody(out_json).
     Post(url)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Cannot connect to controller: %v\n", err)
+        os.Exit(1)
     }
     fmt.Printf("\n%v\n", resp)
-    //fmt.Println(string(out_json))
-
 }
index 7311090..8ff4394 100644 (file)
@@ -12,7 +12,7 @@ import (
     "time"
     "io/ioutil"
     "strings"
-
+    "os"
     "gopkg.in/resty.v1"
     "github.com/ghodss/yaml"
     "github.com/spf13/cobra"
@@ -33,7 +33,7 @@ type DockerRegistry struct {
 
 var kubeproviderCmd = &cobra.Command{
     Use:   "kubernetes",
-    Short: "Add one kubernete provider from yaml file to spinnaker",
+    Short: "Add one kubernetes provider from yaml file to spinnaker",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
         createProvider()
@@ -42,17 +42,19 @@ var kubeproviderCmd = &cobra.Command{
 
 func init() {
     providercreateCmd.AddCommand(kubeproviderCmd)
-    kubeproviderCmd.Flags().StringVarP(&cloverFile, "file", "f", "", "Input yaml file to add kubernetes provider")
+    kubeproviderCmd.Flags().StringVarP(&cloverFile, "file", "f", "",
+                                 "Input yaml file to add kubernetes provider")
     kubeproviderCmd.MarkFlagRequired("file")
 
 }
 
 func createProvider() {
+    checkControllerIP()
     url := controllerIP + "/halyard/addkube"
     in, err := ioutil.ReadFile(cloverFile)
     if err != nil {
-        fmt.Println("Please specify a valid rule definition yaml file")
-        return
+        fmt.Println("Please specify a valid yaml file")
+        os.Exit(1)
     }
 
     t := Kubernetes{}
@@ -73,14 +75,16 @@ func createProvider() {
     newconfig, _ := yaml.Marshal(&t)
     out_json, err := yaml.YAMLToJSON(newconfig)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Invalid yaml: %v\n", err)
+        os.Exit(1)
     }
     resp, err := resty.R().
     SetHeader("Content-Type", "application/json").
     SetBody(out_json).
     Post(url)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Cannot connect to controller: %v\n", err)
+        os.Exit(1)
     }
     fmt.Printf("\n%v\n", resp)
 
index 686d5ba..1d9d8b2 100644 (file)
@@ -9,49 +9,51 @@ package cmd
 
 import (
     "fmt"
+    "os"
     "gopkg.in/resty.v1"
     "io/ioutil"
     "github.com/ghodss/yaml"
     "github.com/spf13/cobra"
+
 )
 
 
 var testplanCmd = &cobra.Command{
     Use:   "testplan",
-    Short: "Create L7 client emulation test plans from yaml file",
+    Short: "Create jmeter L7 client emulation test plan from yaml file",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
         createTestPlan()
-        //fmt.Printf("%v\n", cmd.Parent().CommandPath())
     },
 }
 
 func init() {
     createCmd.AddCommand(testplanCmd)
-    testplanCmd.Flags().StringVarP(&cloverFile, "file", "f", "", "Input yaml file with test plan params")
+    testplanCmd.Flags().StringVarP(&cloverFile, "file", "f", "",
+                                   "Input test plan yaml file")
     testplanCmd.MarkFlagRequired("file")
 }
 
 func createTestPlan() {
+    checkControllerIP()
     url := controllerIP + "/jmeter/gen"
     in, err := ioutil.ReadFile(cloverFile)
     if err != nil {
-        fmt.Println("Please specify a valid test plan yaml file")
-        return
+        fmt.Println("Please specify a valid yaml file")
+        os.Exit(1)
     }
     out_json, err := yaml.YAMLToJSON(in)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Invalid yaml: %v\n", err)
+        os.Exit(1)
     }
     resp, err := resty.R().
     SetHeader("Content-Type", "application/json").
     SetBody(out_json).
     Post(url)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Cannot connect to controller: %v\n", err)
+        os.Exit(1)
     }
     fmt.Printf("\n%v\n", resp)
-    //fmt.Println(string(out_json))
-
 }
-
index 742d769..34070e7 100644 (file)
@@ -14,10 +14,10 @@ import (
 
 var deleteCmd = &cobra.Command{
     Use:   "delete",
-    Short: "Delete resources including clover-system services",
+    Short: "Delete configurations and clover services",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
-        fmt.Println("delete called")
+        fmt.Println("Incomplete command")
     },
 }
 
index d4403a5..3bb411a 100644 (file)
@@ -10,14 +10,14 @@ package cmd
 import (
     "fmt"
     "encoding/json"
-
+    "os"
     "gopkg.in/resty.v1"
     "github.com/spf13/cobra"
 )
 
 var deldockerproviderCmd = &cobra.Command{
     Use:   "docker-registry",
-    Short: "delete one docker registry provider by name from spinnaker",
+    Short: "Delete one docker registry provider by name from spinnaker",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
         deldockerProvider()
@@ -26,12 +26,14 @@ var deldockerproviderCmd = &cobra.Command{
 
 func init() {
     providerdelCmd.AddCommand(deldockerproviderCmd)
-    deldockerproviderCmd.Flags().StringVarP(&name, "name", "n", "", "Input docker-registry account name")
+    deldockerproviderCmd.Flags().StringVarP(&name, "name", "n", "",
+                                          "Input docker-registry account name")
     deldockerproviderCmd.MarkFlagRequired("name")
 
 }
 
 func deldockerProvider() {
+    checkControllerIP()
     url := controllerIP + "/halyard/delprovider"
 
     var in = map[string]string{"name": name, "provider":"dockerRegistry"}
@@ -45,7 +47,8 @@ func deldockerProvider() {
     SetBody(out_json).
     Post(url)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Cannot connect to controller: %v\n", err)
+        os.Exit(1)
     }
     fmt.Printf("\n%v\n", resp)
 
index 77b466a..a6f29f9 100644 (file)
@@ -10,7 +10,7 @@ package cmd
 import (
     "fmt"
     "encoding/json"
-
+    "os"
     "gopkg.in/resty.v1"
     "github.com/spf13/cobra"
 )
@@ -18,7 +18,7 @@ import (
 var name string
 var delkubeproviderCmd = &cobra.Command{
     Use:   "kubernetes",
-    Short: "delete one kubernete provider by name from spinnaker",
+    Short: "Delete one kubernetes provider by name from spinnaker",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
         delProvider()
@@ -27,12 +27,14 @@ var delkubeproviderCmd = &cobra.Command{
 
 func init() {
     providerdelCmd.AddCommand(delkubeproviderCmd)
-    delkubeproviderCmd.Flags().StringVarP(&name, "name", "n", "", "Input kubernetes account name")
+    delkubeproviderCmd.Flags().StringVarP(&name, "name", "n", "",
+                                          "Input kubernetes account name")
     delkubeproviderCmd.MarkFlagRequired("name")
 
 }
 
 func delProvider() {
+    checkControllerIP()
     url := controllerIP + "/halyard/delprovider"
 
     var in = map[string]string{"name": name, "provider":"kubernetes"}
@@ -46,7 +48,8 @@ func delProvider() {
     SetBody(out_json).
     Post(url)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Cannot connect to controller: %v\n", err)
+        os.Exit(1)
     }
     fmt.Printf("\n%v\n", resp)
 
index ae3d98e..c8493be 100644 (file)
@@ -14,10 +14,10 @@ import (
 
 var getCmd = &cobra.Command{
     Use:   "get",
-    Short: "Get information about a resource",
+    Short: "Get information about a configuration or deployment",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
-        fmt.Println("get called")
+        fmt.Println("Incomplete command")
     },
 }
 
index 93c1b3e..7ae94c9 100644 (file)
@@ -11,7 +11,7 @@ import (
     "fmt"
     "strings"
     "encoding/json"
-
+    "os"
     "gopkg.in/resty.v1"
     "github.com/spf13/cobra"
 )
@@ -31,6 +31,7 @@ func init() {
 }
 
 func getdocker() {
+    checkControllerIP()
     url := controllerIP + "/halyard/account"
 
     var provider = map[string]string{"name": "dockerRegistry"}
@@ -44,7 +45,8 @@ func getdocker() {
     SetBody(out_json).
     Get(url)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Cannot connect to controller: %v\n", err)
+        os.Exit(1)
     }
     if resp.StatusCode() != 200 {
        fmt.Printf("\n%v\n", resp)
index 16dcca1..bd5875c 100644 (file)
@@ -11,7 +11,7 @@ import (
     "fmt"
     "strings"
     "encoding/json"
-
+    "os"
     "gopkg.in/resty.v1"
     "github.com/spf13/cobra"
 )
@@ -31,6 +31,7 @@ func init() {
 }
 
 func getkube() {
+    checkControllerIP()
     url := controllerIP + "/halyard/account"
 
     var provider = map[string]string{"name": "kubernetes"}
@@ -44,7 +45,8 @@ func getkube() {
     SetBody(out_json).
     Get(url)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Cannot connect to controller: %v\n", err)
+        os.Exit(1)
     }
     if resp.StatusCode() != 200 {
        fmt.Printf("\n%v\n", resp)
index cfa56bd..bab13ce 100644 (file)
@@ -14,7 +14,7 @@ import (
 
 var servicesCmd = &cobra.Command{
     Use:   "services",
-    Short: "Get info on Kubernetes services",
+    Short: "Get listing of Kubernetes services",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
         cloverkube.GetServices()
index 12d47c3..f9d8e6d 100644 (file)
@@ -9,37 +9,54 @@ package cmd
 
 import (
     "fmt"
+    "os"
     "gopkg.in/resty.v1"
     "github.com/spf13/cobra"
 )
 
-var JmeterResult string
-
 var testresultCmd = &cobra.Command{
     Use:   "testresult",
-    Short: "Get test results from L7 client emulation",
+    Short: "Get test results from jmeter L7 client emulation",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
-        getResult()
+        getResult("log")
     },
 }
 
-func init() {
-    getCmd.AddCommand(testresultCmd)
-    testresultCmd.Flags().StringVarP(&JmeterResult, "r", "r", "", "Result to retrieve - use 'log' or 'results'")
-    testresultCmd.MarkFlagRequired("r")
+var log_testresultCmd = &cobra.Command{
+    Use:   "log",
+    Short: "Get jmeter summary log results",
+    Long: ``,
+    Run: func(cmd *cobra.Command, args []string) {
+        getResult("log")
+    },
+}
 
+var detail_testresultCmd = &cobra.Command{
+    Use:   "detail",
+    Short: "Get jmeter detailed results",
+    Long: ``,
+    Run: func(cmd *cobra.Command, args []string) {
+        getResult("detail")
+    },
 }
 
+func init() {
+    getCmd.AddCommand(testresultCmd)
+    testresultCmd.AddCommand(log_testresultCmd)
+    testresultCmd.AddCommand(detail_testresultCmd)
+}
 
-func getResult() {
-    switch JmeterResult {
-        case "results":
+func getResult(result_type string) {
+    checkControllerIP()
+    switch result_type {
+        case "detail":
             url := controllerIP + "/jmeter/results/results"
             resp, err := resty.R().
             Get(url)
             if err != nil {
-                panic(err.Error())
+                fmt.Printf("Cannot connect to controller: %v\n", err)
+                os.Exit(1)
             }
             fmt.Printf("\nResponse Body: %v\n", resp)
         case "log":
@@ -47,10 +64,12 @@ func getResult() {
             resp, err := resty.R().
             Get(url)
             if err != nil {
-                panic(err.Error())
+                fmt.Printf("Cannot connect to controller: %v\n", err)
+                os.Exit(1)
             }
             fmt.Printf("\nResponse Body: %v\n", resp)
         default:
-            fmt.Println("Unrecoginized jmeter result type - use 'log' or 'results'")
+            msg := "Unrecoginized jmeter result type"
+            fmt.Printf("%s - use 'log' or 'detail'", msg)
        }
 }
index 820b25a..a701164 100644 (file)
@@ -9,6 +9,7 @@ package cmd
 
 import (
     "fmt"
+    "os"
     "gopkg.in/resty.v1"
     "github.com/spf13/cobra"
 )
@@ -27,12 +28,15 @@ var visibilitygetCmd = &cobra.Command{
 
 func init() {
     getCmd.AddCommand(visibilitygetCmd)
-    visibilitygetCmd.PersistentFlags().StringVarP(&VisibilityStat, "stat", "s", "", "Visibility stats type to get")
-    visibilitygetCmd.PersistentFlags().StringVarP(&VisibilityConfig, "conf", "c", "", "Visibility config type to get")
+    visibilitygetCmd.PersistentFlags().StringVarP(&VisibilityStat, "stat", "s",
+                                            "", "Visibility stats type to get")
+    visibilitygetCmd.PersistentFlags().StringVarP(&VisibilityConfig, "conf",
+                                      "c", "", "Visibility config type to get")
 }
 
 func getVisibility() {
 
+    checkControllerIP()
     url_prefix := "/visibility/get/"
     get_data := "all"
     response_prefix := "Config"
@@ -50,7 +54,8 @@ func getVisibility() {
     SetHeader("Accept", "application/json").
     Get(url)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Cannot connect to controller: %v\n", err)
+        os.Exit(1)
     }
     fmt.Printf("\n%s %s: %v\n", response_prefix, get_data, resp)
 }
index 613b263..102c5ba 100644 (file)
@@ -17,7 +17,7 @@ var initCmd = &cobra.Command{
     Short: "Initialize visibility schemas",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
-        fmt.Println("init called")
+        fmt.Println("Incomplete command")
     },
 }
 
index ac9ec5c..004c300 100644 (file)
@@ -9,6 +9,7 @@ package cmd
 
 import (
     "fmt"
+    "os"
     "gopkg.in/resty.v1"
     "github.com/spf13/cobra"
 )
@@ -16,7 +17,7 @@ import (
 
 var visibilityinitCmd = &cobra.Command{
     Use:   "visibility",
-    Short: "Init visibility data schemas",
+    Short: "Initialize visibility data schemas in cassandra",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
         initCollector()
@@ -28,14 +29,15 @@ func init() {
 }
 
 func initCollector() {
+
+    checkControllerIP()
     url := controllerIP + "/collector/init"
 
     resp, err := resty.R().
     Get(url)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Cannot connect to controller: %v\n", err)
+        os.Exit(1)
     }
     fmt.Printf("\n%v\n", resp)
 }
-
-
index fc8e888..e6f1cc8 100644 (file)
@@ -17,7 +17,7 @@ var providercreateCmd = &cobra.Command{
     Short: "Add spinnaker provider",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
-        fmt.Println("provider called")
+        fmt.Println("Incomplete command")
     },
 }
 
@@ -26,7 +26,7 @@ var providerdelCmd = &cobra.Command{
     Short: "Delete spinnaker provider",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
-        fmt.Println("provider called")
+        fmt.Println("Incomplete command")
     },
 }
 
@@ -35,7 +35,7 @@ var providergetCmd = &cobra.Command{
     Short: "Get spinnaker provider",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
-        fmt.Println("provider called")
+        fmt.Println("Incomplete command")
     },
 }
 func init() {
index 6878077..d1d9405 100644 (file)
@@ -10,6 +10,7 @@ package cmd
 import (
     "fmt"
     "os"
+    "strings"
 
     homedir "github.com/mitchellh/go-homedir"
     "github.com/spf13/cobra"
@@ -18,7 +19,6 @@ import (
 )
 
 var cfgFile string
-
 var controllerIP string
 var cloverFile string
 
@@ -33,8 +33,9 @@ var rootCmd = &cobra.Command{
     //},
 }
 
-// Execute adds all child commands to the root command and sets flags appropriately.
-// This is called by main.main(). It only needs to happen once to the rootCmd.
+// Execute adds all child commands to the root command and sets flags
+// appropriately. This is called by main.main(). It only needs to happen
+// once to the rootCmd.
 func Execute() {
     if err := rootCmd.Execute(); err != nil {
         fmt.Println(err)
@@ -48,19 +49,12 @@ func init() {
     // Here you will define your flags and configuration settings.
     // Cobra supports persistent flags, which, if defined here,
     // will be global for your application.
-    rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cloverctl.yaml)")
+    rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "",
+                              "config file (default is $HOME/.cloverctl.yaml)")
 
     // Cobra also supports local flags, which will only run
     // when this action is called directly.
     rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
-
-    cPort, cIP := cloverkube.GetServicesPortIP("clover-controller")
-    if cIP == "" {
-        controllerIP = "http://10.244.0.1:" + fmt.Sprint(cPort)
-    } else {
-        controllerIP = "http://" + cIP
-    }
-    fmt.Printf("\nclover-controller: %s %s\n", fmt.Sprint(cPort), cIP)
 }
 
 // initConfig reads in config file and ENV variables if set.
@@ -76,15 +70,51 @@ func initConfig() {
             os.Exit(1)
         }
 
-        // Search config in home directory with name ".cloverctl" (without extension).
+        // Search config in home directory with name ".cloverctl"
         viper.AddConfigPath(home)
         viper.SetConfigName(".cloverctl")
     }
 
     viper.AutomaticEnv() // read in environment variables that match
 
-    // If a config file is found, read it in.
+    cip_file := ""
+    // If a config file is found in home, read it in.
     if err := viper.ReadInConfig(); err == nil {
         fmt.Println("Using config file:", viper.ConfigFileUsed())
+        cip_file = viper.GetString("ControllerIP")
+    } else {
+        // Check for file in path from cloverctl
+        ep, err := os.Executable()
+        if err == nil {
+            exe_path := strings.Replace(ep, "cloverctl", "", -1)
+            viper.AddConfigPath(exe_path)
+            if err := viper.ReadInConfig(); err == nil {
+                fmt.Println("Using config file:", viper.ConfigFileUsed())
+                cip_file = viper.GetString("ControllerIP")
+            }
+        }
+    }
+
+    cPort, cip_kube := cloverkube.GetServicesPortIP("clover-controller")
+    // If IP in file
+    if cip_file != "" {
+        // Nodeport
+        controllerIP = "http://" + cip_file + ":" + fmt.Sprint(cPort)
+    }
+    // Override IP, if LB IP found
+    if cip_kube != "" {
+        fmt.Printf("IP %v", cip_kube)
+        controllerIP = "http://" + cip_kube
+    }
+}
+
+func checkControllerIP() {
+    // controllerIP exists
+    service := "clover-controller"
+    if controllerIP == "" {
+        fmt.Printf("%s address unspecified or cannot be found\n", service)
+        os.Exit(1)
+    } else {
+        fmt.Printf("%s address: %s\n", service, controllerIP)
     }
 }
index e7e65c2..6b571bb 100644 (file)
@@ -9,6 +9,7 @@ package cmd
 
 import (
     "fmt"
+    "os"
     "io/ioutil"
     "gopkg.in/resty.v1"
     "github.com/spf13/cobra"
@@ -36,17 +37,19 @@ var setlbCmd = &cobra.Command{
 
 func init() {
     setCmd.AddCommand(setserverCmd)
-    setserverCmd.Flags().StringVarP(&cloverFile, "file", "f", "", "Input yaml file for server config")
+    setserverCmd.Flags().StringVarP(&cloverFile, "file", "f", "",
+                                    "Input yaml file for server config")
     setserverCmd.MarkFlagRequired("file")
 
     setCmd.AddCommand(setlbCmd)
-    setlbCmd.Flags().StringVarP(&cloverFile, "file", "f", "", "Input yaml file for lb config")
+    setlbCmd.Flags().StringVarP(&cloverFile, "file", "f", "",
+                                "Input yaml file for lb config")
     setlbCmd.MarkFlagRequired("file")
-
 }
 
 func setNginx(nginx_service string) {
 
+    checkControllerIP()
     url := ""
     if nginx_service == "server" {
         url = controllerIP + "/nginx/server"
@@ -57,20 +60,20 @@ func setNginx(nginx_service string) {
     in, err := ioutil.ReadFile(cloverFile)
     if err != nil {
         fmt.Println("Please specify a valid yaml file")
-        return
+        os.Exit(1)
     }
     out_json, err := yaml.YAMLToJSON(in)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Invalid yaml: %v\n", err)
+        os.Exit(1)
     }
     resp, err := resty.R().
     SetHeader("Content-Type", "application/json").
     SetBody(out_json).
     Post(url)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Cannot connect to controller: %v\n", err)
+        os.Exit(1)
     }
     fmt.Printf("\n%v\n", resp)
-
-
 }
index 685b250..ec28122 100644 (file)
@@ -9,6 +9,7 @@ package cmd
 
 import (
     "fmt"
+    "os"
     "io/ioutil"
     "gopkg.in/resty.v1"
     "github.com/spf13/cobra"
@@ -27,31 +28,32 @@ var setvisibilitystatsCmd = &cobra.Command{
 
 func init() {
     setCmd.AddCommand(setvisibilitystatsCmd)
-    setvisibilitystatsCmd.Flags().StringVarP(&cloverFile, "file", "f", "", "Input yaml file to set visibility config")
+    setvisibilitystatsCmd.Flags().StringVarP(&cloverFile, "file", "f", "",
+                                   "Input yaml file to set visibility config")
     setvisibilitystatsCmd.MarkFlagRequired("file")
-
 }
 
 func setCollector() {
+    checkControllerIP()
     url := controllerIP + "/visibility/set"
 
     in, err := ioutil.ReadFile(cloverFile)
     if err != nil {
         fmt.Println("Please specify a valid yaml file")
-        return
+        os.Exit(1)
     }
     out_json, err := yaml.YAMLToJSON(in)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Invalid yaml: %v\n", err)
+        os.Exit(1)
     }
     resp, err := resty.R().
     SetHeader("Content-Type", "application/json").
     SetBody(out_json).
     Post(url)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Cannot connect to controller: %v\n", err)
+        os.Exit(1)
     }
     fmt.Printf("\n%v\n", resp)
-
-
 }
index 741eacd..d2eb864 100644 (file)
@@ -14,10 +14,10 @@ import (
 
 var startCmd = &cobra.Command{
     Use:   "start",
-    Short: "Start processes including tests, visibility and ingress services",
+    Short: "Start processes and tests",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
-        fmt.Println("start called")
+        fmt.Println("Incomplete command")
     },
 }
 
index 0f495a7..be039fa 100644 (file)
@@ -9,6 +9,7 @@ package cmd
 
 import (
     "fmt"
+    "os"
     "gopkg.in/resty.v1"
     "github.com/spf13/cobra"
 )
@@ -16,8 +17,8 @@ import (
 
 var startidsCmd = &cobra.Command{
     Use:   "ids",
-    Short: "Start IDS process",
-    Long: `Restart IDS process when adding custom rules`,
+    Short: "Start snort IDS process",
+    Long: `Restart snort IDS process when adding custom rules`,
     Run: func(cmd *cobra.Command, args []string) {
         startIDS()
     },
@@ -29,14 +30,14 @@ func init() {
 
 func startIDS() {
 
+    checkControllerIP()
     url := controllerIP + "/snort/start"
 
     resp, err := resty.R().
     Get(url)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Cannot connect to controller: %v\n", err)
+        os.Exit(1)
     }
     fmt.Printf("\n%v\n", resp)
 }
-
-
index b516ad6..9e664c0 100644 (file)
@@ -9,6 +9,7 @@ package cmd
 
 import (
     "fmt"
+    "os"
     "strings"
     "gopkg.in/resty.v1"
     "github.com/spf13/cobra"
@@ -18,20 +19,21 @@ import (
 
 var testplanstartCmd = &cobra.Command{
     Use:   "testplan",
-    Short: "Start a test for a given test plan",
+    Short: "Start test for configured test plan",
     Long: `Specify number of slaves to use with '-s' flag. Default is 0 slaves,
-which runs tests only from jmeter-master.`,
+which runs tests from jmeter-master only.`,
     Run: func(cmd *cobra.Command, args []string) {
         startTest()
-        //fmt.Printf("%v\n", cmd.Parent().CommandPath())
     },
 }
 var num_slaves int
 
 func init() {
     startCmd.AddCommand(testplanstartCmd)
-    testplanstartCmd.PersistentFlags().StringVarP(&cloverFile, "file", "f", "", "Currently unused")
-    testplanstartCmd.PersistentFlags().IntVarP(&num_slaves, "slaves", "s", 0, "Number of slaves to use")
+    testplanstartCmd.PersistentFlags().StringVarP(&cloverFile, "file", "f", "",
+                                                  "Currently unused")
+    testplanstartCmd.PersistentFlags().IntVarP(&num_slaves, "slaves", "s", 0,
+                                               "Number of slaves to use")
 }
 
 func startTest() {
@@ -39,21 +41,24 @@ func startTest() {
     ips := cloverkube.GetPodsIP("clover-jmeter-slave", "default")
     fmt.Printf("\njmeter-slaves found: %s\n", ips)
     if num_slaves > len(ips) {
-        fmt.Printf("Number of slaves specified must be less than found: %d\n", len(ips))
+        fmt.Printf("Number of slaves specified must be less than found: %d\n",
+                   len(ips))
         return
     }
     ip_list := strings.Join(ips[0:num_slaves], ",")
 
+    checkControllerIP()
     url := controllerIP + "/jmeter/start"
     resp, err := resty.R().
     SetHeader("Content-Type", "application/json").
-    SetBody(fmt.Sprintf(`{"num_slaves":"%d", "slave_list":"%s"}`, num_slaves, ip_list)).
+    SetBody(fmt.Sprintf(`{"num_slaves":"%d", "slave_list":"%s"}`, num_slaves,
+                        ip_list)).
     Post(url)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Cannot connect to controller: %v\n", err)
+        os.Exit(1)
     }
     fmt.Printf("\n%v\n", resp)
-
 }
 
 
index 18f8aac..bbc25d8 100644 (file)
@@ -9,6 +9,7 @@ package cmd
 
 import (
     "fmt"
+    "os"
     "io/ioutil"
     "gopkg.in/resty.v1"
     "github.com/ghodss/yaml"
@@ -18,7 +19,7 @@ import (
 
 var visibilitystartCmd = &cobra.Command{
     Use:   "visibility",
-    Short: "Start visibility data collection",
+    Short: "Start visibility collector process",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
         startCollector()
@@ -36,23 +37,27 @@ func startCollector() {
     if cloverFile != "" {
         in, err := ioutil.ReadFile(cloverFile)
         if err != nil {
-            panic(err.Error())
+            fmt.Printf("Cannot read file: %v\n", err)
+            os.Exit(1)
         }
         out_json, err := yaml.YAMLToJSON(in)
         message_body = string(out_json)
         if err != nil {
-            panic(err.Error())
+            fmt.Printf("Invalid yaml: %v\n", err)
+            os.Exit(1)
         }
     } else {
         message_body = `{"sample_interval":"10", "t_port":"80", "t_host":"jaeger-query.istio-system"}`
     }
+    checkControllerIP()
     url := controllerIP + "/collector/start"
     resp, err := resty.R().
     SetHeader("Content-Type", "application/json").
     SetBody(message_body).
     Post(url)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Cannot connect to controller: %v\n", err)
+        os.Exit(1)
     }
     fmt.Printf("\n%v\n", resp)
 }
index cfb7245..e77a36b 100644 (file)
@@ -14,10 +14,10 @@ import (
 
 var stopCmd = &cobra.Command{
     Use:   "stop",
-    Short: "Stop processes including visibility and ingress services",
+    Short: "Stop processes including visibility and sample services",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
-        fmt.Println("stop called")
+        fmt.Println("Incomplete command")
     },
 }
 
index b39b1e9..c810d9d 100644 (file)
@@ -9,6 +9,7 @@ package cmd
 
 import (
     "fmt"
+    "os"
     "gopkg.in/resty.v1"
     "github.com/spf13/cobra"
 )
@@ -16,8 +17,8 @@ import (
 
 var stopidsCmd = &cobra.Command{
     Use:   "ids",
-    Short: "Stop IDS process",
-    Long: `Restart IDS process when adding custom rules`,
+    Short: "Stop snort IDS process",
+    Long: `Restart snort IDS process when adding custom rules`,
     Run: func(cmd *cobra.Command, args []string) {
         stopIDS()
     },
@@ -29,12 +30,14 @@ func init() {
 
 func stopIDS() {
 
+    checkControllerIP()
     url := controllerIP + "/snort/stop"
 
     resp, err := resty.R().
     Get(url)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Cannot connect to controller: %v\n", err)
+        os.Exit(1)
     }
     fmt.Printf("\n%v\n", resp)
 }
index 4233157..fda226e 100644 (file)
@@ -9,6 +9,7 @@ package cmd
 
 import (
     "fmt"
+    "os"
     "gopkg.in/resty.v1"
     "github.com/spf13/cobra"
 )
@@ -16,7 +17,7 @@ import (
 
 var visibilitystopCmd = &cobra.Command{
     Use:   "visibility",
-    Short: "Stop visibility data collection",
+    Short: "Stop visibility collector process",
     Long: ``,
     Run: func(cmd *cobra.Command, args []string) {
         stopCollector()
@@ -29,12 +30,14 @@ func init() {
 
 func stopCollector() {
 
+    checkControllerIP()
     url := controllerIP + "/collector/stop"
 
     resp, err := resty.R().
     Get(url)
     if err != nil {
-        panic(err.Error())
+        fmt.Printf("Cannot connect to controller: %v\n", err)
+        os.Exit(1)
     }
     fmt.Printf("\n%v\n", resp)
 }