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,
tunnelReadyCh <-chan struct{},
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)) {
defer close(done)

View File

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

View File

@@ -10,6 +10,10 @@ var (
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 {
defaultInterface, defaultGateway, err := r.DefaultRoute()
if err != nil {

View File

@@ -34,6 +34,10 @@ var (
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) {
routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL)
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))
}
type DefaultIPGetter interface {
DefaultIP() (defaultIP net.IP, err error)
}
func (r *routing) DefaultIP() (ip net.IP, err error) {
routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL)
if err != nil {
@@ -81,6 +89,10 @@ func (r *routing) DefaultIP() (ip net.IP, err error) {
return r.assignedIP(defaultLinkName)
}
type LocalSubnetGetter interface {
LocalSubnet() (defaultSubnet net.IPNet, err error)
}
func (r *routing) LocalSubnet() (defaultSubnet net.IPNet, err error) {
routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL)
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))
}
type LocalNetworksGetter interface {
LocalNetworks() (localNetworks []LocalNetwork, err error)
}
func (r *routing) LocalNetworks() (localNetworks []LocalNetwork, err error) {
links, err := netlink.LinkList()
if err != nil {
@@ -193,6 +209,10 @@ func (r *routing) assignedIP(interfaceName string) (ip net.IP, err error) {
ErrInterfaceIPNotFound, interfaceName, len(addresses))
}
type VPNDestinationIPGetter interface {
VPNDestinationIP() (ip net.IP, err error)
}
func (r *routing) VPNDestinationIP() (ip net.IP, err error) {
routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL)
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))
}
type VPNLocalGatewayIPGetter interface {
VPNLocalGatewayIP() (ip net.IP, err error)
}
func (r *routing) VPNLocalGatewayIP() (ip net.IP, err error) {
routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL)
if err != nil {

View File

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