From be8f301328fab447da314c072a37bf4020229f7b Mon Sep 17 00:00:00 2001 From: Gianluca Arbezzano Date: Sat, 18 Mar 2017 19:44:24 +0000 Subject: [PATCH] Add basic commands to help with debugging Add new API call to get all the autoscalers currently managed by orbiter: ``` curl http://localhost:8000/autoscaler ``` Add command into the CLI to get this list ``` export ORBITER_HOST=http://localhost:8000 orbiter autoscler ls ``` Add command into the CLI to print all the events fired by the daemon: ``` export ORBITER_HOST=http://localhost:8000 orbiter system events ``` --- api/autoscaler-ls.go | 29 +++++++++++++++++++++++++++ api/common.go | 5 +++++ api/router.go | 1 + autoscaler/autoscaler.go | 1 + cmd/autoscaler-ls.go | 40 +++++++++++++++++++++++++++++++++++++ cmd/system-events.go | 43 ++++++++++++++++++++++++++++++++++++++++ main.go | 6 ++++++ provider/digitalocean.go | 4 ++++ provider/fake.go | 4 ++++ provider/swarm.go | 4 ++++ 10 files changed, 137 insertions(+) create mode 100644 api/autoscaler-ls.go create mode 100644 api/common.go create mode 100644 cmd/autoscaler-ls.go create mode 100644 cmd/system-events.go diff --git a/api/autoscaler-ls.go b/api/autoscaler-ls.go new file mode 100644 index 0000000..a9f343d --- /dev/null +++ b/api/autoscaler-ls.go @@ -0,0 +1,29 @@ +package api + +import ( + "encoding/json" + "net/http" + + "github.com/gianarb/orbiter/autoscaler" +) + +type AutoscalerResponse struct { + Name string `json:"name"` +} + +func AutoscalerList(scalers autoscaler.Autoscalers) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + l := []AutoscalerResponse{} + for n, _ := range scalers { + c := AutoscalerResponse{ + Name: n, + } + l = append(l, c) + } + cc := &CollectionResponse{ + Data: l, + } + b, _ := json.Marshal(cc) + w.Write(b) + } +} diff --git a/api/common.go b/api/common.go new file mode 100644 index 0000000..9570d2d --- /dev/null +++ b/api/common.go @@ -0,0 +1,5 @@ +package api + +type CollectionResponse struct { + Data interface{} `json:"data"` +} diff --git a/api/router.go b/api/router.go index 94c789f..e754256 100644 --- a/api/router.go +++ b/api/router.go @@ -9,6 +9,7 @@ import ( func GetRouter(core core.Core, eventChannel chan *logrus.Entry) *mux.Router { r := mux.NewRouter() r.HandleFunc("/handle/{autoscaler_name}/{service_name}", Handle(core.Autoscalers)).Methods("POST") + r.HandleFunc("/autoscaler", AutoscalerList(core.Autoscalers)).Methods("GET") r.HandleFunc("/health", Health()).Methods("GET") r.HandleFunc("/events", Events(eventChannel)).Methods("GET") return r diff --git a/autoscaler/autoscaler.go b/autoscaler/autoscaler.go index b7570e7..f8b5167 100644 --- a/autoscaler/autoscaler.go +++ b/autoscaler/autoscaler.go @@ -4,6 +4,7 @@ import "github.com/Sirupsen/logrus" type Provider interface { Scale(string, int, bool) error + Name() string } type Autoscalers map[string]Autoscaler diff --git a/cmd/autoscaler-ls.go b/cmd/autoscaler-ls.go new file mode 100644 index 0000000..c4aa9a4 --- /dev/null +++ b/cmd/autoscaler-ls.go @@ -0,0 +1,40 @@ +package cmd + +import ( + "fmt" + "io/ioutil" + "net/http" + "os" + "strings" + + "github.com/Sirupsen/logrus" +) + +type AutoscalerListCmd struct { +} + +func (c *AutoscalerListCmd) Run(args []string) int { + r, err := http.Get(fmt.Sprintf("%s/autoscaler", os.Getenv("ORBITER_HOST"))) + if err != nil { + logrus.Fatal(err) + return 1 + } + defer r.Body.Close() + body, err := ioutil.ReadAll(r.Body) + if err != nil { + logrus.Fatal(err) + return 1 + } + fmt.Printf("%s\n\r", body) + return 0 +} + +func (c *AutoscalerListCmd) Help() string { + helpText := ` +Usage: List of autoscalers currently enabled. ` + return strings.TrimSpace(helpText) +} + +func (r *AutoscalerListCmd) Synopsis() string { + return "List all autoscalers currently managed by orbiter." +} diff --git a/cmd/system-events.go b/cmd/system-events.go new file mode 100644 index 0000000..5508f6a --- /dev/null +++ b/cmd/system-events.go @@ -0,0 +1,43 @@ +package cmd + +import ( + "bufio" + "fmt" + "net/http" + "os" + "strings" + + "github.com/Sirupsen/logrus" +) + +type SystemEventsCmd struct { +} + +func (c *SystemEventsCmd) Run(args []string) int { + r, err := http.Get(fmt.Sprintf("%s/events", os.Getenv("ORBITER_HOST"))) + if err != nil { + logrus.Fatal(err) + return 1 + } + defer r.Body.Close() + reader := bufio.NewReader(r.Body) + for { + line, err := reader.ReadBytes('\n') + if err != nil { + logrus.Fatal(err) + return 1 + } + fmt.Printf("%s", line) + } + return 0 +} + +func (c *SystemEventsCmd) Help() string { + helpText := ` +Usage: Listen to all the events fired by the daemon` + return strings.TrimSpace(helpText) +} + +func (r *SystemEventsCmd) Synopsis() string { + return "Listen to all the events fired by the daemon." +} diff --git a/main.go b/main.go index 6731bd1..5f2c69c 100644 --- a/main.go +++ b/main.go @@ -20,6 +20,12 @@ func main() { "daemon": func() (cli.Command, error) { return &cmd.DaemonCmd{eventChannel}, nil }, + "autoscaler ls": func() (cli.Command, error) { + return &cmd.AutoscalerListCmd{}, nil + }, + "system events": func() (cli.Command, error) { + return &cmd.SystemEventsCmd{}, nil + }, } exitStatus, _ := c.Run() diff --git a/provider/digitalocean.go b/provider/digitalocean.go index 02a93c7..b45dcac 100644 --- a/provider/digitalocean.go +++ b/provider/digitalocean.go @@ -34,6 +34,10 @@ func NewDigitalOceanProvider(c map[string]string) (autoscaler.Provider, error) { return p, nil } +func (p DigitalOceanProvider) Name() string { + return "digitalocean" +} + func (p DigitalOceanProvider) Scale(serviceId string, target int, direction bool) error { var wg sync.WaitGroup responseChannel := make(chan response, target) diff --git a/provider/fake.go b/provider/fake.go index 3f0bb04..cf77441 100644 --- a/provider/fake.go +++ b/provider/fake.go @@ -3,6 +3,10 @@ package provider type FakeProvider struct { } +func (f FakeProvider) Name() string { + return "fake" +} + func (f FakeProvider) Scale(serviceId string, target int, direction bool) error { return nil } diff --git a/provider/swarm.go b/provider/swarm.go index 4314afc..1e726d1 100644 --- a/provider/swarm.go +++ b/provider/swarm.go @@ -33,6 +33,10 @@ func NewSwarmProvider(c map[string]string) (autoscaler.Provider, error) { } +func (p SwarmProvider) Name() string { + return "swarm" +} + func (p SwarmProvider) Scale(serviceId string, target int, direction bool) error { ctx := context.Background() service, _, err := p.dockerClient.ServiceInspectWithRaw(ctx, serviceId)