On Mon, Jun 6, 2022 at 6:44 PM Lorenzo Bianconi <[email protected]> wrote: > > Add the capability to automatically deploy a load-balancer on each > logical-switch connected to a logical router where the load-balancer > has been installed by the CMS. This patch allow to overcome the > distributed gw router scenario limitation where a load-balancer must be > installed on each datapath to properly reach the load-balancer. > > Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=2043543 > Signed-off-by: Lorenzo Bianconi <[email protected]>
Thanks for the rebase. Acked-by: Numan Siddique <[email protected]> Numan > --- > Changes since v2: > - rebase on top of ovn master > > Changes since v1: > - rebase on top of ovn master > - add NEWS entry > - improve selftests > --- > NEWS | 5 +++ > northd/northd.c | 56 +++++++++++++++++++++++++++++ > northd/ovn-northd.8.xml | 8 +++++ > tests/ovn-northd.at | 80 +++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 149 insertions(+) > > diff --git a/NEWS b/NEWS > index e015ae8e7..8b4f91553 100644 > --- a/NEWS > +++ b/NEWS > @@ -4,6 +4,11 @@ Post v22.06.0 > "ovn-encap-df_default" to enable or disable tunnel DF flag. > - Add option "localnet_learn_fdb" to LSP that will allow localnet > ports to learn MAC addresses and store them in FDB table. > + - northd: introduce the capability to automatically deploy a load-balancer > + on each logical-switch connected to a logical router where the > + load-balancer has been installed by the CMS. In order to enable the > + feature the CMS has to set install_ls_lb_from_router to true in option > + column of NB_Global table. > > OVN v22.06.0 - XX XXX XXXX > -------------------------- > diff --git a/northd/northd.c b/northd/northd.c > index 0207f6ce1..a95a5148e 100644 > --- a/northd/northd.c > +++ b/northd/northd.c > @@ -63,6 +63,8 @@ static bool lflow_hash_lock_initialized = false; > > static bool check_lsp_is_up; > > +static bool install_ls_lb_from_router; > + > /* MAC allocated for service monitor usage. Just one mac is allocated > * for this purpose and ovn-controller's on each chassis will make use > * of this mac when sending out the packets to monitor the services > @@ -4140,6 +4142,55 @@ build_lrouter_lbs_reachable_ips(struct hmap > *datapaths, struct hmap *lbs) > } > } > > +static void > +build_lswitch_lbs_from_lrouter(struct hmap *datapaths, struct hmap *lbs) > +{ > + if (!install_ls_lb_from_router) { > + return; > + } > + > + struct ovn_datapath *od; > + HMAP_FOR_EACH (od, key_node, datapaths) { > + if (!od->nbs) { > + continue; > + } > + > + struct ovn_port *op; > + LIST_FOR_EACH (op, dp_node, &od->port_list) { > + if (!lsp_is_router(op->nbsp)) { > + continue; > + } > + if (!op->peer) { > + continue; > + } > + > + struct ovn_datapath *peer_od = op->peer->od; > + for (size_t i = 0; i < peer_od->nbr->n_load_balancer; i++) { > + bool installed = false; > + const struct uuid *lb_uuid = > + &peer_od->nbr->load_balancer[i]->header_.uuid; > + struct ovn_northd_lb *lb = ovn_northd_lb_find(lbs, lb_uuid); > + if (!lb) { > + continue; > + } > + > + for (size_t j = 0; j < lb->n_nb_ls; j++) { > + if (lb->nb_ls[j] == od) { > + installed = true; > + break; > + } > + } > + if (!installed) { > + ovn_northd_lb_add_ls(lb, od); > + } > + if (lb->nlb) { > + od->has_lb_vip |= lb_has_vip(lb->nlb); > + } > + } > + } > + } > +} > + > /* This must be called after all ports have been processed, i.e., after > * build_ports() because the reachability check requires the router ports > * networks to have been parsed. > @@ -4152,6 +4203,7 @@ build_lb_port_related_data(struct hmap *datapaths, > struct hmap *ports, > build_lrouter_lbs_check(datapaths); > build_lrouter_lbs_reachable_ips(datapaths, lbs); > build_lb_svcs(input_data, ovnsb_txn, ports, lbs); > + build_lswitch_lbs_from_lrouter(datapaths, lbs); > } > > /* Syncs relevant load balancers (applied to logical switches) to the > @@ -15378,6 +15430,10 @@ ovnnb_db_run(struct northd_input *input_data, > "ignore_lsp_down", true); > default_acl_drop = smap_get_bool(&nb->options, "default_acl_drop", > false); > > + install_ls_lb_from_router = smap_get_bool(&nb->options, > + "install_ls_lb_from_router", > + false); > + > build_chassis_features(input_data, &data->features); > build_datapaths(input_data, ovnsb_txn, &data->datapaths, &data->lr_list); > build_lbs(input_data, &data->datapaths, &data->lbs); > diff --git a/northd/ovn-northd.8.xml b/northd/ovn-northd.8.xml > index 1f7022490..2a2b33051 100644 > --- a/northd/ovn-northd.8.xml > +++ b/northd/ovn-northd.8.xml > @@ -882,6 +882,10 @@ > <code>reg2</code>. For IPv6 traffic the flow also loads the original > destination IP and transport port in registers <code>xxreg1</code> > and > <code>reg2</code>. > + The above flow is created even if the load balancer is attached to a > + logical router connected to the current logical switch and > + the <code>install_ls_lb_from_router</code> variable in > + <ref table="NB_Global" column="options"/> is set to true. > </li> > <li> > For all the configured load balancing rules for a switch in > @@ -898,6 +902,10 @@ > <code>reg2</code>. For IPv6 traffic the flow also loads the original > destination IP and transport port in registers <code>xxreg1</code> > and > <code>reg2</code>. > + The above flow is created even if the load balancer is attached to a > + logical router connected to the current logical switch and > + the <code>install_ls_lb_from_router</code> variable in > + <ref table="NB_Global" column="options"/> is set to true. > </li> > > <li> > diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at > index a94a7d441..c1ec9e04a 100644 > --- a/tests/ovn-northd.at > +++ b/tests/ovn-northd.at > @@ -7613,3 +7613,83 @@ AT_CHECK([ovn-sbctl dump-flows ls0 | grep -e > 'ls_in_\(put\|lookup\)_fdb' | sort > > AT_CLEANUP > ]) > + > +AT_SETUP([check install_ls_lb_from_router option]) > +AT_KEYWORDS([lb-ls-install-from-lrouter]) > +ovn_start > + > +ovn-nbctl lr-add R1 > +ovn-nbctl set logical_router R1 options:chassis=hv1 > +ovn-nbctl lrp-add R1 R1-S0 02:ac:10:01:00:01 10.0.0.1/24 > +ovn-nbctl lrp-add R1 R1-S1 02:ac:10:01:01:01 20.0.0.1/24 > +ovn-nbctl lrp-add R1 R1-PUB 02:ac:20:01:01:01 172.16.0.1/24 > + > +ovn-nbctl ls-add S0 > +ovn-nbctl lsp-add S0 S0-R1 > +ovn-nbctl lsp-set-type S0-R1 router > +ovn-nbctl lsp-set-addresses S0-R1 02:ac:10:01:00:01 > +ovn-nbctl lsp-set-options S0-R1 router-port=R1-S0 > + > +ovn-nbctl ls-add S1 > +ovn-nbctl lsp-add S1 S1-R1 > +ovn-nbctl lsp-set-type S1-R1 router > +ovn-nbctl lsp-set-addresses S1-R1 02:ac:10:01:01:01 > +ovn-nbctl lsp-set-options S1-R1 router-port=R1-S1 > + > +# Add load balancers on the logical router R1 > +ovn-nbctl lb-add lb0 172.16.0.10:80 10.0.0.2:80 > +ovn-nbctl lr-lb-add R1 lb0 > + > +ovn-sbctl dump-flows S0 > S0flows > +ovn-sbctl dump-flows S1 > S1flows > + > +AT_CAPTURE_FILE([S0flows]) > +AT_CAPTURE_FILE([S1flows]) > + > +AT_CHECK([grep "ls_in_lb" S0flows | sort], [0], [dnl > + table=11(ls_in_lb ), priority=0 , match=(1), action=(next;) > +]) > +AT_CHECK([grep "ls_in_lb" S1flows | sort], [0], [dnl > + table=11(ls_in_lb ), priority=0 , match=(1), action=(next;) > +]) > + > +ovn-nbctl --wait=sb set NB_Global . options:install_ls_lb_from_router=true > + > +ovn-sbctl dump-flows S0 > S0flows > +ovn-sbctl dump-flows S1 > S1flows > + > +AT_CAPTURE_FILE([S0flows]) > +AT_CAPTURE_FILE([S1flows]) > + > +AT_CHECK([grep "ls_in_lb" S0flows | sort], [0], [dnl > + table=11(ls_in_lb ), priority=0 , match=(1), action=(next;) > + table=11(ls_in_lb ), priority=120 , match=(ct.new && ip4.dst == > 172.16.0.10 && tcp.dst == 80), action=(reg0[[1]] = 0; reg1 = 172.16.0.10; > reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);) > +]) > +AT_CHECK([grep "ls_in_lb" S1flows | sort], [0], [dnl > + table=11(ls_in_lb ), priority=0 , match=(1), action=(next;) > + table=11(ls_in_lb ), priority=120 , match=(ct.new && ip4.dst == > 172.16.0.10 && tcp.dst == 80), action=(reg0[[1]] = 0; reg1 = 172.16.0.10; > reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);) > +]) > + > +s0_uuid=$(ovn-sbctl get datapath S0 _uuid) > +s1_uuid=$(ovn-sbctl get datapath S1 _uuid) > +check_column "$s0_uuid $s1_uuid" sb:load_balancer datapaths name=lb0 > + > +ovn-nbctl --wait=sb set NB_Global . options:install_ls_lb_from_router=false > + > +ovn-sbctl dump-flows S0 > S0flows > +ovn-sbctl dump-flows S1 > S1flows > + > +AT_CAPTURE_FILE([S0flows]) > +AT_CAPTURE_FILE([S1flows]) > + > +AT_CHECK([grep "ls_in_lb" S0flows | sort], [0], [dnl > + table=11(ls_in_lb ), priority=0 , match=(1), action=(next;) > +]) > +AT_CHECK([grep "ls_in_lb" S1flows | sort], [0], [dnl > + table=11(ls_in_lb ), priority=0 , match=(1), action=(next;) > +]) > + > +check_column "" sb:load_balancer datapaths name=lb0 > + > +AT_CLEANUP > +]) > -- > 2.35.3 > > _______________________________________________ > dev mailing list > [email protected] > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
