diff mbox series

[ovs-dev,v2,3/3] ovn-northd: Propagate dynamic addresses to port group address sets.

Message ID 20180730143749.8173-4-jkbs@redhat.com
State Accepted
Headers show
Series Port Group fixes | expand

Commit Message

Jakub Sitnicki July 30, 2018, 2:37 p.m. UTC
If a logical switch port belongs to a port group and has dynamic
addresses assigned, propagate the addresses to the auto-generated
address sets for the port group.

Signed-off-by: Jakub Sitnicki <jkbs@redhat.com>
Acked-by: Han Zhou <hzhou8@ebay.com>
---
 ovn/northd/ovn-northd.c | 34 ++++++++++++++++++++--------
 tests/ovn.at            | 59 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 84 insertions(+), 9 deletions(-)

Comments

Simon Horman Aug. 1, 2018, 9:23 a.m. UTC | #1
Hi Jakub,

On Mon, Jul 30, 2018 at 04:37:49PM +0200, Jakub Sitnicki wrote:
> If a logical switch port belongs to a port group and has dynamic
> addresses assigned, propagate the addresses to the auto-generated
> address sets for the port group.
> 
> Signed-off-by: Jakub Sitnicki <jkbs@redhat.com>
> Acked-by: Han Zhou <hzhou8@ebay.com>
> ---
>  ovn/northd/ovn-northd.c | 34 ++++++++++++++++++++--------
>  tests/ovn.at            | 59 +++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 84 insertions(+), 9 deletions(-)

The test added by this patch, which is now present in the master branch,
seems to fail.

https://travis-ci.org/openvswitch/ovs/jobs/410550769

...

> diff --git a/tests/ovn.at b/tests/ovn.at
> index e7bdfe250..32e6c1738 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -10267,6 +10267,65 @@ AT_CHECK([ovn-sbctl get Address_Set pg1_ip6 addresses],
>  
>  AT_CLEANUP
>  
> +AT_SETUP([ovn -- Address Set generation from Port Groups (dynamic addressing)])
> +ovn_start
> +
> +ovn-nbctl ls-add ls1
> +ovn-nbctl ls-add ls2
> +ovn-nbctl ls-add ls3
> +
> +ovn-nbctl set Logical_Switch ls1 \
> +    other_config:subnet=10.1.0.0/24 other_config:ipv6_prefix="2001:db8:1::"
> +ovn-nbctl set Logical_Switch ls2 \
> +    other_config:subnet=10.2.0.0/24 other_config:ipv6_prefix="2001:db8:2::"
> +ovn-nbctl set Logical_Switch ls3 \
> +    other_config:subnet=10.3.0.0/24 other_config:ipv6_prefix="2001:db8:3::"
> +
> +ovn-nbctl lsp-add ls1 lp1
> +ovn-nbctl lsp-add ls2 lp2
> +ovn-nbctl lsp-add ls3 lp3
> +
> +ovn-nbctl lsp-set-addresses lp1 "02:00:00:00:00:01 dynamic"
> +ovn-nbctl lsp-set-addresses lp2 "02:00:00:00:00:02 dynamic"
> +ovn-nbctl lsp-set-addresses lp3 "02:00:00:00:00:03 dynamic"
> +
> +ovn-nbctl create Port_Group name=pg1
> +ovn-nbctl create Port_Group name=pg2
> +
> +ovn-nbctl --id=@p get Logical_Switch_Port lp1 -- add Port_Group pg1 ports @p
> +ovn-nbctl --id=@p get Logical_Switch_Port lp2 -- add Port_Group pg1 ports @p
> +ovn-nbctl --id=@p get Logical_Switch_Port lp2 -- add Port_Group pg2 ports @p
> +ovn-nbctl --id=@p get Logical_Switch_Port lp3 -- add Port_Group pg2 ports @p
> +
> +ovn-nbctl --wait=sb sync
> +
> +dnl Check if port group address sets were populated with ports' addresses
> +AT_CHECK([ovn-sbctl get Address_Set pg1_ip4 addresses],
> +         [0], [[["10.1.0.2", "10.2.0.2"]]
> +])
> +AT_CHECK([ovn-sbctl get Address_Set pg2_ip4 addresses],
> +         [0], [[["10.2.0.2", "10.3.0.2"]]
> +])
> +AT_CHECK([ovn-sbctl get Address_Set pg1_ip6 addresses],
> +         [0], [[["2001:db8:1::ff:fe00:1", "2001:db8:2::ff:fe00:2"]]
> +])
> +AT_CHECK([ovn-sbctl get Address_Set pg2_ip6 addresses],
> +         [0], [[["2001:db8:2::ff:fe00:2", "2001:db8:3::ff:fe00:3"]]
> +])
> +
> +ovn-nbctl set Logical_Switch ls1 \
> +    other_config:subnet=10.11.0.0/24 other_config:ipv6_prefix="2001:db8:11::"
> +

Empirically the following allows the test to pass in my local environment:

> +dnl Check if updated address got propagated to the port group address sets
> +AT_CHECK([ovn-sbctl get Address_Set pg1_ip4 addresses],
> +         [0], [[["10.11.0.2", "10.2.0.2"]]

- s/10.11.0.2/10.1.0.2/

> +])
> +AT_CHECK([ovn-sbctl get Address_Set pg1_ip6 addresses],
> +         [0], [[["2001:db8:11::ff:fe00:1", "2001:db8:2::ff:fe00:2"]]

- s/2001:db8:11::ff:fe00:1/2001:db8:1::ff:fe00:1/

> +])
> +
> +AT_CLEANUP
> +
>  AT_SETUP([ovn -- ACL conjunction])
>  ovn_start
>  
> -- 
> 2.14.4
> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
Jakub Sitnicki Aug. 1, 2018, 9:44 a.m. UTC | #2
Hi Simon,

On Wed, 1 Aug 2018 11:23:30 +0200
Simon Horman <simon.horman@netronome.com> wrote:

> Hi Jakub,
> 
> On Mon, Jul 30, 2018 at 04:37:49PM +0200, Jakub Sitnicki wrote:
> > If a logical switch port belongs to a port group and has dynamic
> > addresses assigned, propagate the addresses to the auto-generated
> > address sets for the port group.
> > 
> > Signed-off-by: Jakub Sitnicki <jkbs@redhat.com>
> > Acked-by: Han Zhou <hzhou8@ebay.com>
> > ---
> >  ovn/northd/ovn-northd.c | 34 ++++++++++++++++++++--------
> >  tests/ovn.at            | 59 +++++++++++++++++++++++++++++++++++++++++++++++++
> >  2 files changed, 84 insertions(+), 9 deletions(-)  
> 
> The test added by this patch, which is now present in the master branch,
> seems to fail.
> 
> https://travis-ci.org/openvswitch/ovs/jobs/410550769

Thanks for the heads-up. These patches depend on another patch that is
still under review. Hence the failure. I've already notified Ben, who
he has proposed a fix-up similar to yours:

https://mail.openvswitch.org/pipermail/ovs-dev/2018-August/350390.html

-Jakub
Simon Horman Aug. 1, 2018, 9:59 a.m. UTC | #3
On Wed, Aug 01, 2018 at 11:44:58AM +0200, Jakub Sitnicki wrote:
> Hi Simon,
> 
> On Wed, 1 Aug 2018 11:23:30 +0200
> Simon Horman <simon.horman@netronome.com> wrote:
> 
> > Hi Jakub,
> > 
> > On Mon, Jul 30, 2018 at 04:37:49PM +0200, Jakub Sitnicki wrote:
> > > If a logical switch port belongs to a port group and has dynamic
> > > addresses assigned, propagate the addresses to the auto-generated
> > > address sets for the port group.
> > > 
> > > Signed-off-by: Jakub Sitnicki <jkbs@redhat.com>
> > > Acked-by: Han Zhou <hzhou8@ebay.com>
> > > ---
> > >  ovn/northd/ovn-northd.c | 34 ++++++++++++++++++++--------
> > >  tests/ovn.at            | 59 +++++++++++++++++++++++++++++++++++++++++++++++++
> > >  2 files changed, 84 insertions(+), 9 deletions(-)  
> > 
> > The test added by this patch, which is now present in the master branch,
> > seems to fail.
> > 
> > https://travis-ci.org/openvswitch/ovs/jobs/410550769
> 
> Thanks for the heads-up. These patches depend on another patch that is
> still under review. Hence the failure. I've already notified Ben, who
> he has proposed a fix-up similar to yours:
> 
> https://mail.openvswitch.org/pipermail/ovs-dev/2018-August/350390.html

Thanks Jakub,

I see that now. The fix looks good :)
diff mbox series

Patch

diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c
index 52f47c5ed..d744836d3 100644
--- a/ovn/northd/ovn-northd.c
+++ b/ovn/northd/ovn-northd.c
@@ -6653,6 +6653,24 @@  sync_address_set(struct northd_context *ctx, const char *name,
                                     addrs, n_addrs);
 }
 
+/* Go through 'addresses' and add found IPv4 addresses to 'ipv4_addrs' and IPv6
+ * addresses to 'ipv6_addrs'.
+ */
+static void
+split_addresses(const char *addresses, struct svec *ipv4_addrs,
+                struct svec *ipv6_addrs)
+{
+    struct lport_addresses laddrs;
+    extract_lsp_addresses(addresses, &laddrs);
+    for (size_t k = 0; k < laddrs.n_ipv4_addrs; k++) {
+        svec_add(ipv4_addrs, laddrs.ipv4_addrs[k].addr_s);
+    }
+    for (size_t k = 0; k < laddrs.n_ipv6_addrs; k++) {
+        svec_add(ipv6_addrs, laddrs.ipv6_addrs[k].addr_s);
+    }
+    destroy_lport_addresses(&laddrs);
+}
+
 /* OVN_Southbound Address_Set table contains same records as in north
  * bound, plus the records generated from Port_Group table in north bound.
  *
@@ -6680,16 +6698,14 @@  sync_address_sets(struct northd_context *ctx)
         struct svec ipv6_addrs = SVEC_EMPTY_INITIALIZER;
         for (size_t i = 0; i < nb_port_group->n_ports; i++) {
             for (size_t j = 0; j < nb_port_group->ports[i]->n_addresses; j++) {
-                struct lport_addresses laddrs;
-                extract_lsp_addresses(nb_port_group->ports[i]->addresses[j],
-                                     &laddrs);
-                for (size_t k = 0; k < laddrs.n_ipv4_addrs; k++) {
-                    svec_add(&ipv4_addrs, laddrs.ipv4_addrs[k].addr_s);
-                }
-                for (size_t k = 0; k < laddrs.n_ipv6_addrs; k++) {
-                    svec_add(&ipv6_addrs, laddrs.ipv6_addrs[k].addr_s);
+                const char *addrs = nb_port_group->ports[i]->addresses[j];
+                if (!is_dynamic_lsp_address(addrs)) {
+                    split_addresses(addrs, &ipv4_addrs, &ipv6_addrs);
                 }
-                destroy_lport_addresses(&laddrs);
+            }
+            if (nb_port_group->ports[i]->dynamic_addresses) {
+                split_addresses(nb_port_group->ports[i]->dynamic_addresses,
+                                &ipv4_addrs, &ipv6_addrs);
             }
         }
         char *ipv4_addrs_name = xasprintf("%s_ip4", nb_port_group->name);
diff --git a/tests/ovn.at b/tests/ovn.at
index e7bdfe250..32e6c1738 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -10267,6 +10267,65 @@  AT_CHECK([ovn-sbctl get Address_Set pg1_ip6 addresses],
 
 AT_CLEANUP
 
+AT_SETUP([ovn -- Address Set generation from Port Groups (dynamic addressing)])
+ovn_start
+
+ovn-nbctl ls-add ls1
+ovn-nbctl ls-add ls2
+ovn-nbctl ls-add ls3
+
+ovn-nbctl set Logical_Switch ls1 \
+    other_config:subnet=10.1.0.0/24 other_config:ipv6_prefix="2001:db8:1::"
+ovn-nbctl set Logical_Switch ls2 \
+    other_config:subnet=10.2.0.0/24 other_config:ipv6_prefix="2001:db8:2::"
+ovn-nbctl set Logical_Switch ls3 \
+    other_config:subnet=10.3.0.0/24 other_config:ipv6_prefix="2001:db8:3::"
+
+ovn-nbctl lsp-add ls1 lp1
+ovn-nbctl lsp-add ls2 lp2
+ovn-nbctl lsp-add ls3 lp3
+
+ovn-nbctl lsp-set-addresses lp1 "02:00:00:00:00:01 dynamic"
+ovn-nbctl lsp-set-addresses lp2 "02:00:00:00:00:02 dynamic"
+ovn-nbctl lsp-set-addresses lp3 "02:00:00:00:00:03 dynamic"
+
+ovn-nbctl create Port_Group name=pg1
+ovn-nbctl create Port_Group name=pg2
+
+ovn-nbctl --id=@p get Logical_Switch_Port lp1 -- add Port_Group pg1 ports @p
+ovn-nbctl --id=@p get Logical_Switch_Port lp2 -- add Port_Group pg1 ports @p
+ovn-nbctl --id=@p get Logical_Switch_Port lp2 -- add Port_Group pg2 ports @p
+ovn-nbctl --id=@p get Logical_Switch_Port lp3 -- add Port_Group pg2 ports @p
+
+ovn-nbctl --wait=sb sync
+
+dnl Check if port group address sets were populated with ports' addresses
+AT_CHECK([ovn-sbctl get Address_Set pg1_ip4 addresses],
+         [0], [[["10.1.0.2", "10.2.0.2"]]
+])
+AT_CHECK([ovn-sbctl get Address_Set pg2_ip4 addresses],
+         [0], [[["10.2.0.2", "10.3.0.2"]]
+])
+AT_CHECK([ovn-sbctl get Address_Set pg1_ip6 addresses],
+         [0], [[["2001:db8:1::ff:fe00:1", "2001:db8:2::ff:fe00:2"]]
+])
+AT_CHECK([ovn-sbctl get Address_Set pg2_ip6 addresses],
+         [0], [[["2001:db8:2::ff:fe00:2", "2001:db8:3::ff:fe00:3"]]
+])
+
+ovn-nbctl set Logical_Switch ls1 \
+    other_config:subnet=10.11.0.0/24 other_config:ipv6_prefix="2001:db8:11::"
+
+dnl Check if updated address got propagated to the port group address sets
+AT_CHECK([ovn-sbctl get Address_Set pg1_ip4 addresses],
+         [0], [[["10.11.0.2", "10.2.0.2"]]
+])
+AT_CHECK([ovn-sbctl get Address_Set pg1_ip6 addresses],
+         [0], [[["2001:db8:11::ff:fe00:1", "2001:db8:2::ff:fe00:2"]]
+])
+
+AT_CLEANUP
+
 AT_SETUP([ovn -- ACL conjunction])
 ovn_start