blob: 4efe87832e635aa9e1e393dce7460fe6d31bc7ae [file] [log] [blame]
Serge Bazanski8d7843c2018-10-04 10:37:36 +01001package main
2
Serge Bazanskic7be4a12018-10-06 13:18:05 +01003//go:generate packr
4
Serge Bazanski8d7843c2018-10-04 10:37:36 +01005import (
Serge Bazanski2c6c6d12018-10-06 11:55:04 +01006 "context"
Serge Bazanski8d7843c2018-10-04 10:37:36 +01007 "flag"
8 "io/ioutil"
9
Serge Bazanskiab55cca2018-10-25 12:35:55 +010010 "code.hackerspace.pl/hscloud/go/mirko"
Serge Bazanski2c6c6d12018-10-06 11:55:04 +010011 "github.com/digitalocean/go-netbox/netbox"
12 "github.com/digitalocean/go-netbox/netbox/client"
Serge Bazanski8d7843c2018-10-04 10:37:36 +010013 "github.com/golang/glog"
14 "github.com/golang/protobuf/proto"
15
Serge Bazanskiab55cca2018-10-25 12:35:55 +010016 "code.hackerspace.pl/hscloud/go/svc/topo/graph"
Sergiusz Bazanski838cf652019-07-16 23:31:25 +020017 pb "code.hackerspace.pl/hscloud/go/svc/topo/proto"
Serge Bazanskiab55cca2018-10-25 12:35:55 +010018 "code.hackerspace.pl/hscloud/go/svc/topo/state"
Serge Bazanski8d7843c2018-10-04 10:37:36 +010019)
20
21var (
Serge Bazanski88b572d2018-10-05 16:35:01 -070022 flagConfigPath string
23 flagNetboxHost string
24 flagNetboxAPIKey string
Serge Bazanski8d7843c2018-10-04 10:37:36 +010025)
26
27func init() {
28 flag.Set("logtostderr", "true")
29}
30
31func main() {
32 flag.StringVar(&flagConfigPath, "config_path", "./topo.pb.text", "Text proto configuration of Topo (per config.proto)")
Serge Bazanski2c6c6d12018-10-06 11:55:04 +010033 flag.StringVar(&flagNetboxHost, "netbox_host", "netbox.bgp.wtf", "Netbox host")
Serge Bazanski88b572d2018-10-05 16:35:01 -070034 flag.StringVar(&flagNetboxAPIKey, "netbox_api_key", "", "Netbox API key")
Serge Bazanski8d7843c2018-10-04 10:37:36 +010035 flag.Parse()
36
Serge Bazanskifa5d5562018-10-14 08:39:30 -070037 m := mirko.New()
38 if err := m.Listen(); err != nil {
39 glog.Exitf("Listen(): %v", err)
40 }
41
Serge Bazanski2c6c6d12018-10-06 11:55:04 +010042 ctx := context.Background()
43
Serge Bazanski8d7843c2018-10-04 10:37:36 +010044 data, err := ioutil.ReadFile(flagConfigPath)
45 if err != nil {
46 glog.Exitf("Could not read config: %v", err)
47 }
48
Serge Bazanski477ffe72018-10-25 05:36:18 -070049 config := pb.Config{}
Serge Bazanski8d7843c2018-10-04 10:37:36 +010050 proto.UnmarshalText(string(data), &config)
Serge Bazanski88b572d2018-10-05 16:35:01 -070051
Serge Bazanski16e4ba22018-10-07 00:22:52 +010052 stm := state.NewManager()
53 err = stm.FetchState(ctx, &config)
54 if err != nil {
55 glog.Exitf("Initial state fetch failed: %v", err)
56 }
57
Serge Bazanski28f49072018-10-06 11:31:18 +010058 gr := graph.New()
59 err = gr.LoadConfig(&config)
60 if err != nil {
61 glog.Exitf("Initial config load failed: %v", err)
Serge Bazanski88b572d2018-10-05 16:35:01 -070062 }
Serge Bazanski28f49072018-10-06 11:31:18 +010063
Serge Bazanski2c6c6d12018-10-06 11:55:04 +010064 client.DefaultSchemes = []string{"https"}
65 nb := netbox.NewNetboxWithAPIKey(flagNetboxHost, flagNetboxAPIKey)
66 err = gr.FeedFromNetbox(ctx, nb)
67 if err != nil {
68 glog.Exitf("Initial netbox feed failed: %v", err)
69 }
Serge Bazanski46765082018-10-06 12:32:01 +010070
Serge Bazanskifa5d5562018-10-14 08:39:30 -070071 s := NewService(gr, stm)
72 s.Setup(m)
73
74 if err := m.Serve(); err != nil {
75 glog.Exitf("Serve(): %v", err)
Serge Bazanski46765082018-10-06 12:32:01 +010076 }
Serge Bazanskifa5d5562018-10-14 08:39:30 -070077
78 select {}
Serge Bazanski8d7843c2018-10-04 10:37:36 +010079}