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..4ea8a96 --- /dev/null +++ b/cmd/system-events.go @@ -0,0 +1,42 @@ +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) + } +} + +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..c9c4480 100644 --- a/main.go +++ b/main.go @@ -18,7 +18,15 @@ func main() { c.Commands = map[string]cli.CommandFactory{ "daemon": func() (cli.Command, error) { - return &cmd.DaemonCmd{eventChannel}, nil + return &cmd.DaemonCmd{ + EventChannel: eventChannel, + }, nil + }, + "autoscaler ls": func() (cli.Command, error) { + return &cmd.AutoscalerListCmd{}, nil + }, + "system events": func() (cli.Command, error) { + return &cmd.SystemEventsCmd{}, nil }, } 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)