Maint: routing interface composition

This commit is contained in:
Quentin McGaw (desktop)
2021-07-26 16:18:53 +00:00
parent 73c383fd65
commit d7a6caa2ac
5 changed files with 57 additions and 11 deletions

View File

@@ -449,7 +449,7 @@ func printVersions(ctx context.Context, logger logging.Logger,
func routeReadyEvents(ctx context.Context, done chan<- struct{}, buildInfo models.BuildInformation, func routeReadyEvents(ctx context.Context, done chan<- struct{}, buildInfo models.BuildInformation,
tunnelReadyCh <-chan struct{}, tunnelReadyCh <-chan struct{},
unboundLooper dns.Looper, updaterLooper updater.Looper, publicIPLooper publicip.Looper, unboundLooper dns.Looper, updaterLooper updater.Looper, publicIPLooper publicip.Looper,
routing routing.Routing, logger logging.Logger, httpClient *http.Client, routing routing.VPNGetter, logger logging.Logger, httpClient *http.Client,
versionInformation, portForwardingEnabled bool, startPortForward func(vpnGateway net.IP)) { versionInformation, portForwardingEnabled bool, startPortForward func(vpnGateway net.IP)) {
defer close(done) defer close(done)

View File

@@ -20,6 +20,10 @@ var (
ErrSubnetsOutboundSet = errors.New("cannot set outbound subnets routes") ErrSubnetsOutboundSet = errors.New("cannot set outbound subnets routes")
) )
type Setuper interface {
Setup() (err error)
}
func (r *routing) Setup() (err error) { func (r *routing) Setup() (err error) {
defaultIP, err := r.DefaultIP() defaultIP, err := r.DefaultIP()
if err != nil { if err != nil {
@@ -59,6 +63,10 @@ func (r *routing) Setup() (err error) {
return nil return nil
} }
type TearDowner interface {
TearDown() error
}
func (r *routing) TearDown() error { func (r *routing) TearDown() error {
defaultIP, err := r.DefaultIP() defaultIP, err := r.DefaultIP()
if err != nil { if err != nil {

View File

@@ -10,6 +10,10 @@ var (
ErrAddOutboundSubnet = errors.New("cannot add outbound subnet to routes") ErrAddOutboundSubnet = errors.New("cannot add outbound subnet to routes")
) )
type OutboundRoutesSetter interface {
SetOutboundRoutes(outboundSubnets []net.IPNet) error
}
func (r *routing) SetOutboundRoutes(outboundSubnets []net.IPNet) error { func (r *routing) SetOutboundRoutes(outboundSubnets []net.IPNet) error {
defaultInterface, defaultGateway, err := r.DefaultRoute() defaultInterface, defaultGateway, err := r.DefaultRoute()
if err != nil { if err != nil {

View File

@@ -34,6 +34,10 @@ var (
ErrVPNLocalGatewayIPNotFound = errors.New("VPN local gateway IP address not found") ErrVPNLocalGatewayIPNotFound = errors.New("VPN local gateway IP address not found")
) )
type DefaultRouteGetter interface {
DefaultRoute() (defaultInterface string, defaultGateway net.IP, err error)
}
func (r *routing) DefaultRoute() (defaultInterface string, defaultGateway net.IP, err error) { func (r *routing) DefaultRoute() (defaultInterface string, defaultGateway net.IP, err error) {
routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL) routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL)
if err != nil { if err != nil {
@@ -57,6 +61,10 @@ func (r *routing) DefaultRoute() (defaultInterface string, defaultGateway net.IP
return "", nil, fmt.Errorf("%w: in %d route(s)", ErrRouteDefaultNotFound, len(routes)) return "", nil, fmt.Errorf("%w: in %d route(s)", ErrRouteDefaultNotFound, len(routes))
} }
type DefaultIPGetter interface {
DefaultIP() (defaultIP net.IP, err error)
}
func (r *routing) DefaultIP() (ip net.IP, err error) { func (r *routing) DefaultIP() (ip net.IP, err error) {
routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL) routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL)
if err != nil { if err != nil {
@@ -81,6 +89,10 @@ func (r *routing) DefaultIP() (ip net.IP, err error) {
return r.assignedIP(defaultLinkName) return r.assignedIP(defaultLinkName)
} }
type LocalSubnetGetter interface {
LocalSubnet() (defaultSubnet net.IPNet, err error)
}
func (r *routing) LocalSubnet() (defaultSubnet net.IPNet, err error) { func (r *routing) LocalSubnet() (defaultSubnet net.IPNet, err error) {
routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL) routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL)
if err != nil { if err != nil {
@@ -110,6 +122,10 @@ func (r *routing) LocalSubnet() (defaultSubnet net.IPNet, err error) {
return defaultSubnet, fmt.Errorf("%w: in %d routes", ErrSubnetDefaultNotFound, len(routes)) return defaultSubnet, fmt.Errorf("%w: in %d routes", ErrSubnetDefaultNotFound, len(routes))
} }
type LocalNetworksGetter interface {
LocalNetworks() (localNetworks []LocalNetwork, err error)
}
func (r *routing) LocalNetworks() (localNetworks []LocalNetwork, err error) { func (r *routing) LocalNetworks() (localNetworks []LocalNetwork, err error) {
links, err := netlink.LinkList() links, err := netlink.LinkList()
if err != nil { if err != nil {
@@ -193,6 +209,10 @@ func (r *routing) assignedIP(interfaceName string) (ip net.IP, err error) {
ErrInterfaceIPNotFound, interfaceName, len(addresses)) ErrInterfaceIPNotFound, interfaceName, len(addresses))
} }
type VPNDestinationIPGetter interface {
VPNDestinationIP() (ip net.IP, err error)
}
func (r *routing) VPNDestinationIP() (ip net.IP, err error) { func (r *routing) VPNDestinationIP() (ip net.IP, err error) {
routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL) routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL)
if err != nil { if err != nil {
@@ -221,6 +241,10 @@ func (r *routing) VPNDestinationIP() (ip net.IP, err error) {
return nil, fmt.Errorf("%w: in %d routes", ErrVPNDestinationIPNotFound, len(routes)) return nil, fmt.Errorf("%w: in %d routes", ErrVPNDestinationIPNotFound, len(routes))
} }
type VPNLocalGatewayIPGetter interface {
VPNLocalGatewayIP() (ip net.IP, err error)
}
func (r *routing) VPNLocalGatewayIP() (ip net.IP, err error) { func (r *routing) VPNLocalGatewayIP() (ip net.IP, err error) {
routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL) routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL)
if err != nil { if err != nil {

View File

@@ -9,17 +9,27 @@ import (
) )
type Routing interface { type Routing interface {
// Mutations Reader
Setup() (err error) Writer
TearDown() error }
SetOutboundRoutes(outboundSubnets []net.IPNet) error
// Read only type Reader interface {
DefaultRoute() (defaultInterface string, defaultGateway net.IP, err error) DefaultRouteGetter
LocalNetworks() (localNetworks []LocalNetwork, err error) DefaultIPGetter
DefaultIP() (defaultIP net.IP, err error) LocalSubnetGetter
VPNDestinationIP() (ip net.IP, err error) LocalNetworksGetter
VPNLocalGatewayIP() (ip net.IP, err error) VPNGetter
}
type VPNGetter interface {
VPNDestinationIPGetter
VPNLocalGatewayIPGetter
}
type Writer interface {
Setuper
TearDowner
OutboundRoutesSetter
} }
type routing struct { type routing struct {