blob: 5cc73b4108d28db57aee832245470a5b36e2326f [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 confpb "code.hackerspace.pl/hscloud/go/svc/topo/proto/config"
Serge Bazanskia758ef52018-10-06 17:54:25 +010017
Serge Bazanskiab55cca2018-10-25 12:35:55 +010018 "code.hackerspace.pl/hscloud/go/svc/topo/graph"
19 "code.hackerspace.pl/hscloud/go/svc/topo/state"
Serge Bazanski8d7843c2018-10-04 10:37:36 +010020)
21
22var (
Serge Bazanski88b572d2018-10-05 16:35:01 -070023 flagConfigPath string
24 flagNetboxHost string
25 flagNetboxAPIKey string
Serge Bazanski8d7843c2018-10-04 10:37:36 +010026)
27
28func init() {
29 flag.Set("logtostderr", "true")
30}
31
32func main() {
33 flag.StringVar(&flagConfigPath, "config_path", "./topo.pb.text", "Text proto configuration of Topo (per config.proto)")
Serge Bazanski2c6c6d12018-10-06 11:55:04 +010034 flag.StringVar(&flagNetboxHost, "netbox_host", "netbox.bgp.wtf", "Netbox host")
Serge Bazanski88b572d2018-10-05 16:35:01 -070035 flag.StringVar(&flagNetboxAPIKey, "netbox_api_key", "", "Netbox API key")
Serge Bazanski8d7843c2018-10-04 10:37:36 +010036 flag.Parse()
37
Serge Bazanskifa5d5562018-10-14 08:39:30 -070038 m := mirko.New()
39 if err := m.Listen(); err != nil {
40 glog.Exitf("Listen(): %v", err)
41 }
42
Serge Bazanski2c6c6d12018-10-06 11:55:04 +010043 ctx := context.Background()
44
Serge Bazanski8d7843c2018-10-04 10:37:36 +010045 data, err := ioutil.ReadFile(flagConfigPath)
46 if err != nil {
47 glog.Exitf("Could not read config: %v", err)
48 }
49
50 config := confpb.Config{}
51 proto.UnmarshalText(string(data), &config)
Serge Bazanski88b572d2018-10-05 16:35:01 -070052
Serge Bazanski16e4ba22018-10-07 00:22:52 +010053 stm := state.NewManager()
54 err = stm.FetchState(ctx, &config)
55 if err != nil {
56 glog.Exitf("Initial state fetch failed: %v", err)
57 }
58
Serge Bazanski28f49072018-10-06 11:31:18 +010059 gr := graph.New()
60 err = gr.LoadConfig(&config)
61 if err != nil {
62 glog.Exitf("Initial config load failed: %v", err)
Serge Bazanski88b572d2018-10-05 16:35:01 -070063 }
Serge Bazanski28f49072018-10-06 11:31:18 +010064
Serge Bazanski2c6c6d12018-10-06 11:55:04 +010065 client.DefaultSchemes = []string{"https"}
66 nb := netbox.NewNetboxWithAPIKey(flagNetboxHost, flagNetboxAPIKey)
67 err = gr.FeedFromNetbox(ctx, nb)
68 if err != nil {
69 glog.Exitf("Initial netbox feed failed: %v", err)
70 }
Serge Bazanski46765082018-10-06 12:32:01 +010071
Serge Bazanskifa5d5562018-10-14 08:39:30 -070072 s := NewService(gr, stm)
73 s.Setup(m)
74
75 if err := m.Serve(); err != nil {
76 glog.Exitf("Serve(): %v", err)
Serge Bazanski46765082018-10-06 12:32:01 +010077 }
Serge Bazanskifa5d5562018-10-14 08:39:30 -070078
79 select {}
Serge Bazanski8d7843c2018-10-04 10:37:36 +010080}