The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/7989

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
- Adds support for multiple upstream DNS servers in OVN networks using the `dns.nameservers` setting that will be supported in `physical` and `sriov` uplink network types.
- Adds detection of `ipv4.gateway` and `ipv6.gateway` OVN uplink network settings that will be supported in `physical` and `sriov` uplink network types.
From efffd128341001511c5b3bbeb82af6178c71fd3d Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Tue, 6 Oct 2020 16:31:37 +0100
Subject: [PATCH 1/5] shares/validate: Whitespace

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 shared/validate/validate.go | 1 +
 1 file changed, 1 insertion(+)

diff --git a/shared/validate/validate.go b/shared/validate/validate.go
index 356a7d8744..4217ecf89f 100644
--- a/shared/validate/validate.go
+++ b/shared/validate/validate.go
@@ -226,6 +226,7 @@ func IsNetworkAddressV4List(value string) error {
                        return err
                }
        }
+
        return nil
 }
 

From 896679be6effa830345a836920db173bd3935210 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Tue, 6 Oct 2020 16:33:00 +0100
Subject: [PATCH 2/5] lxd/network/openvswitch/ovn: Updates RecursiveDNSServer
 to be list of IPs

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/network/openvswitch/ovn.go | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/lxd/network/openvswitch/ovn.go b/lxd/network/openvswitch/ovn.go
index ef181d8706..e0a0d0dc44 100644
--- a/lxd/network/openvswitch/ovn.go
+++ b/lxd/network/openvswitch/ovn.go
@@ -66,7 +66,7 @@ type OVNDHCPv4Opts struct {
        ServerID           net.IP
        ServerMAC          net.HardwareAddr
        Router             net.IP
-       RecursiveDNSServer net.IP
+       RecursiveDNSServer []net.IP
        DomainName         string
        LeaseTime          time.Duration
        MTU                uint32
@@ -75,7 +75,7 @@ type OVNDHCPv4Opts struct {
 // OVNDHCPv6Opts IPv6 DHCP option set that can be created (and then applied to 
a switch port by resulting ID).
 type OVNDHCPv6Opts struct {
        ServerID           net.HardwareAddr
-       RecursiveDNSServer net.IP
+       RecursiveDNSServer []net.IP
        DNSSearchList      []string
 }
 
@@ -358,7 +358,16 @@ func (o *OVN) LogicalSwitchDHCPv4OptionsSet(switchName 
OVNSwitch, uuid string, s
        }
 
        if opts.RecursiveDNSServer != nil {
-               args = append(args, fmt.Sprintf("dns_server=%s", 
opts.RecursiveDNSServer.String()))
+               nsIPs := make([]string, 0, len(opts.RecursiveDNSServer))
+               for _, nsIP := range opts.RecursiveDNSServer {
+                       if nsIP.To4() == nil {
+                               continue // Only include IPv4 addresses.
+                       }
+
+                       nsIPs = append(nsIPs, nsIP.String())
+               }
+
+               args = append(args, fmt.Sprintf("dns_server={%s}", 
strings.Join(nsIPs, ",")))
        }
 
        if opts.DomainName != "" {
@@ -416,7 +425,16 @@ func (o *OVN) LogicalSwitchDHCPv6OptionsSet(switchName 
OVNSwitch, uuid string, s
        }
 
        if opts.RecursiveDNSServer != nil {
-               args = append(args, fmt.Sprintf("dns_server=%s", 
opts.RecursiveDNSServer.String()))
+               nsIPs := make([]string, 0, len(opts.RecursiveDNSServer))
+               for _, nsIP := range opts.RecursiveDNSServer {
+                       if nsIP.To4() != nil {
+                               continue // Only include IPv6 addresses.
+                       }
+
+                       nsIPs = append(nsIPs, nsIP.String())
+               }
+
+               args = append(args, fmt.Sprintf("dns_server={%s}", 
strings.Join(nsIPs, ",")))
        }
 
        _, err = o.nbctl(args...)

From c775eceac72df08927c5f6799e9b88244b19ea9f Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Tue, 6 Oct 2020 16:35:07 +0100
Subject: [PATCH 3/5] lxd/network/driver/ovn: Updates allocateParentPortIPs to
 detect the parent network IP address and DNS settings

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/network/driver_ovn.go | 46 +++++++++++++++++++++++++++++++++------
 1 file changed, 39 insertions(+), 7 deletions(-)

diff --git a/lxd/network/driver_ovn.go b/lxd/network/driver_ovn.go
index 99423d4b3c..3080c9da3f 100644
--- a/lxd/network/driver_ovn.go
+++ b/lxd/network/driver_ovn.go
@@ -44,8 +44,8 @@ type ovnParentVars struct {
        extSwitchProviderName string
 
        // DNS.
-       dnsIPv6 net.IP
-       dnsIPv4 net.IP
+       dnsIPv6 []net.IP
+       dnsIPv4 []net.IP
 }
 
 // ovnParentPortBridgeVars parent bridge port variables used for start/stop.
@@ -391,7 +391,7 @@ func (n *ovn) setupParentPortBridge(parentNet Network, 
routerMAC net.HardwareAdd
 
 // allocateParentPortIPs attempts to find a free IP in the parent network's 
OVN ranges and then stores it in
 // ovnVolatileParentIPv4 and ovnVolatileParentIPv6 config keys on this 
network. Returns ovnParentVars settings.
-func (n *ovn) allocateParentPortIPs(parentNet Network, v4CIDRKey string, 
v6CIDRKey string, routerMAC net.HardwareAddr) (*ovnParentVars, error) {
+func (n *ovn) allocateParentPortIPs(parentNet Network, routerMAC 
net.HardwareAddr) (*ovnParentVars, error) {
        v := &ovnParentVars{}
 
        parentNetConf := parentNet.Config()
@@ -399,19 +399,51 @@ func (n *ovn) allocateParentPortIPs(parentNet Network, 
v4CIDRKey string, v6CIDRK
        // Parent derived settings.
        v.extSwitchProviderName = parentNet.Name()
 
+       // Detect parent gateway setting.
+       parentIPv4CIDR := parentNetConf["ipv4.address"]
+       if parentIPv4CIDR == "" {
+               parentIPv4CIDR = parentNetConf["ipv4.gateway"]
+       }
+
+       parentIPv6CIDR := parentNetConf["ipv6.address"]
+       if parentIPv6CIDR == "" {
+               parentIPv6CIDR = parentNetConf["ipv6.gateway"]
+       }
+
        // Optional parent values.
-       parentIPv4, parentIPv4Net, err := 
net.ParseCIDR(parentNetConf[v4CIDRKey])
+       parentIPv4, parentIPv4Net, err := net.ParseCIDR(parentIPv4CIDR)
        if err == nil {
-               v.dnsIPv4 = parentIPv4
+               v.dnsIPv4 = []net.IP{parentIPv4}
                v.routerExtGwIPv4 = parentIPv4
        }
 
-       parentIPv6, parentIPv6Net, err := 
net.ParseCIDR(parentNetConf[v6CIDRKey])
+       parentIPv6, parentIPv6Net, err := net.ParseCIDR(parentIPv6CIDR)
        if err == nil {
-               v.dnsIPv6 = parentIPv6
+               v.dnsIPv6 = []net.IP{parentIPv6}
                v.routerExtGwIPv6 = parentIPv6
        }
 
+       // Detect optional DNS server list.
+       if parentNetConf["dns.nameservers"] != "" {
+               // Reset nameservers.
+               v.dnsIPv4 = nil
+               v.dnsIPv6 = nil
+
+               nsList := strings.Split(parentNetConf["dns.nameservers"], ",")
+               for _, ns := range nsList {
+                       nsIP := net.ParseIP(strings.TrimSpace(ns))
+                       if nsIP == nil {
+                               return nil, fmt.Errorf("Invalid parent 
nameserver")
+                       }
+
+                       if nsIP.To4() == nil {
+                               v.dnsIPv6 = append(v.dnsIPv6, nsIP)
+                       } else {
+                               v.dnsIPv4 = append(v.dnsIPv4, nsIP)
+                       }
+               }
+       }
+
        // Parse existing allocated IPs for this network on the parent network 
(if not set yet, will be nil).
        routerExtPortIPv4 := net.ParseIP(n.config[ovnVolatileParentIPv4])
        routerExtPortIPv6 := net.ParseIP(n.config[ovnVolatileParentIPv6])

From 6c99bdfd32f4cce8b6cb3032eda69113ee8b0b92 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Tue, 6 Oct 2020 16:36:54 +0100
Subject: [PATCH 4/5] lxd/network/driver/ovn: Updates n.allocateParentPortIPs
 usage

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/network/driver_ovn.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/network/driver_ovn.go b/lxd/network/driver_ovn.go
index 3080c9da3f..4af51c3092 100644
--- a/lxd/network/driver_ovn.go
+++ b/lxd/network/driver_ovn.go
@@ -381,7 +381,7 @@ func (n *ovn) setupParentPortBridge(parentNet Network, 
routerMAC net.HardwareAdd
                return nil, errors.Wrapf(err, "Network %q is not suitable for 
use as OVN parent", bridgeNet.name)
        }
 
-       v, err := n.allocateParentPortIPs(parentNet, "ipv4.address", 
"ipv6.address", routerMAC)
+       v, err := n.allocateParentPortIPs(parentNet, routerMAC)
        if err != nil {
                return nil, errors.Wrapf(err, "Failed allocating parent port 
IPs on network %q", parentNet.Name())
        }

From 11a0289883dbeb856344a803535cafb169e8edb3 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Tue, 6 Oct 2020 16:37:32 +0100
Subject: [PATCH 5/5] lxd/network/driver/ovn: Updates setup IPv6 RDNSS setting

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/network/driver_ovn.go | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/lxd/network/driver_ovn.go b/lxd/network/driver_ovn.go
index 4af51c3092..445e555433 100644
--- a/lxd/network/driver_ovn.go
+++ b/lxd/network/driver_ovn.go
@@ -1257,11 +1257,16 @@ func (n *ovn) setup(update bool) error {
                        adressMode = openvswitch.OVNIPv6AddressModeDHCPStateful
                }
 
+               var recursiveDNSServer net.IP
+               if len(parent.dnsIPv6) > 0 {
+                       recursiveDNSServer = parent.dnsIPv6[0] // OVN only 
supports 1 RA DNS server.
+               }
+
                err = 
client.LogicalRouterPortSetIPv6Advertisements(n.getRouterIntPortName(), 
&openvswitch.OVNIPv6RAOpts{
                        AddressMode:        adressMode,
                        SendPeriodic:       true,
                        DNSSearchList:      n.getDNSSearchList(),
-                       RecursiveDNSServer: parent.dnsIPv6,
+                       RecursiveDNSServer: recursiveDNSServer,
                        MTU:                bridgeMTU,
 
                        // Keep these low until we support DNS search domains 
via DHCPv4, as otherwise RA DNSSL
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to