diff options
Diffstat (limited to 'utils/ipam/ipam.go')
-rw-r--r-- | utils/ipam/ipam.go | 77 |
1 files changed, 70 insertions, 7 deletions
diff --git a/utils/ipam/ipam.go b/utils/ipam/ipam.go index faec6e7..d61fa3e 100644 --- a/utils/ipam/ipam.go +++ b/utils/ipam/ipam.go @@ -5,6 +5,7 @@ import ( "fmt" "log" "net/netip" + "slices" "utils/ipam/yaml_model" ) @@ -14,18 +15,25 @@ func LoadIpam(bs []byte) (*Ipam, error) { return nil, err } - ipam_, err := processNetworks(parsed.Ipam6.Networks) + ipam := Ipam{} + err = processNetworks(parsed.Ipam6.Networks, &ipam) if err != nil { return nil, err } - ipam_.ResolveParents() + err = processRouters(parsed.Routers, &ipam) + if err != nil { + return nil, err + } + + ipam.ResolveParents() - return ipam_, nil + return &ipam, nil } type Ipam struct { Networks []*Network + Routers []*Router } func contains(a, b netip.Prefix) bool { @@ -89,14 +97,14 @@ type networkHost struct { address netip.Addr } -func processNetworks(networks map[string]yaml_model.Network6Yaml) (*Ipam, error) { +func processNetworks(networks map[string]yaml_model.Network6Yaml, ipam *Ipam) error { var ns []*Network for name, net := range networks { log.Printf("Processing net %v\n", name) prefix, err := netip.ParsePrefix(net.Range) if err != nil { - return nil, fmt.Errorf("error parsing net range: %v", err) + return fmt.Errorf("error parsing net range: %v", err) } log.Printf("prefix: %s", prefix.String()) @@ -104,7 +112,7 @@ func processNetworks(networks map[string]yaml_model.Network6Yaml) (*Ipam, error) for hostname, a := range net.Hosts { addr, err := netip.ParseAddr(a) if err != nil { - return nil, fmt.Errorf("network: %s, unable to parse host address %s", n.Name, a) + return fmt.Errorf("network: %s, unable to parse host address %s", n.Name, a) } n.hosts = append(n.hosts, networkHost{ @@ -116,5 +124,60 @@ func processNetworks(networks map[string]yaml_model.Network6Yaml) (*Ipam, error) ns = append(ns, &n) } - return &Ipam{Networks: ns}, nil + ipam.Networks = ns + return nil +} + +type Router struct { + Name string + As string + Peers []Peer +} + +func (r *Router) Compare(other *Router) int { + return cmp.Compare(r.Name, other.Name) +} + +type Peer struct { + Name string + /// Router is set if this is a known peer + Router *Router + + As string +} + +func processRouters(routers map[string]yaml_model.Router, ipam *Ipam) error { + var rs []*Router + rsIndex := make(map[string]*Router) + for name, router := range routers { + r := &Router{ + Name: name, + As: router.As, + } + + rs = append(rs, r) + rsIndex[name] = r + } + + for _, r := range rs { + router := routers[r.Name] + + for name, peer := range router.Peers { + remote := rsIndex[name] + + r.Peers = append(r.Peers, Peer{ + Name: name, + Router: remote, + As: peer.As, + }) + } + } + + compare := func(a *Router, b *Router) int { + return a.Compare(b) + } + + ipam.Routers = slices.SortedStableFunc(slices.Values(rs), compare) + + return nil } |