blob: fd1fb8f6cc15fe9bf088a7e296859fa2ab5cedb5 [file] [log] [blame]
package main
//go:generate packr
import (
"context"
"flag"
"io/ioutil"
"code.hackerspace.pl/hscloud/go/mirko"
"github.com/digitalocean/go-netbox/netbox"
"github.com/digitalocean/go-netbox/netbox/client"
"github.com/golang/glog"
"github.com/golang/protobuf/proto"
"code.hackerspace.pl/hscloud/dc/topo/graph"
pb "code.hackerspace.pl/hscloud/dc/topo/proto"
"code.hackerspace.pl/hscloud/dc/topo/state"
)
var (
flagConfigPath string
flagNetboxHost string
flagNetboxAPIKey string
)
func init() {
flag.Set("logtostderr", "true")
}
func main() {
flag.StringVar(&flagConfigPath, "config_path", "./topo.pb.text", "Text proto configuration of Topo (per config.proto)")
flag.StringVar(&flagNetboxHost, "netbox_host", "netbox.bgp.wtf", "Netbox host")
flag.StringVar(&flagNetboxAPIKey, "netbox_api_key", "", "Netbox API key")
flag.Parse()
m := mirko.New()
if err := m.Listen(); err != nil {
glog.Exitf("Listen(): %v", err)
}
ctx := context.Background()
data, err := ioutil.ReadFile(flagConfigPath)
if err != nil {
glog.Exitf("Could not read config: %v", err)
}
config := pb.Config{}
proto.UnmarshalText(string(data), &config)
stm := state.NewManager()
err = stm.FetchState(ctx, &config)
if err != nil {
glog.Exitf("Initial state fetch failed: %v", err)
}
gr := graph.New()
err = gr.LoadConfig(&config)
if err != nil {
glog.Exitf("Initial config load failed: %v", err)
}
client.DefaultSchemes = []string{"https"}
nb := netbox.NewNetboxWithAPIKey(flagNetboxHost, flagNetboxAPIKey)
err = gr.FeedFromNetbox(ctx, nb)
if err != nil {
glog.Exitf("Initial netbox feed failed: %v", err)
}
s := NewService(gr, stm)
s.Setup(m)
if err := m.Serve(); err != nil {
glog.Exitf("Serve(): %v", err)
}
select {}
}