Similar to single load balancers, add the capability to automatically
deploy a load-balancer group on each logical-switch connected to a
logical router where the load-balancer group has been installed by the
CMS.

Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=2125310
Signed-off-by: Lorenzo Bianconi <[email protected]>
---
 lib/lb.c            |  5 +++++
 lib/lb.h            |  3 +++
 northd/northd.c     | 41 +++++++++++++++++++++++++----------------
 tests/ovn-northd.at |  8 ++++++++
 4 files changed, 41 insertions(+), 16 deletions(-)

diff --git a/lib/lb.c b/lib/lb.c
index fa1a66d82..895828a09 100644
--- a/lib/lb.c
+++ b/lib/lb.c
@@ -182,6 +182,7 @@ ovn_northd_lb_create(const struct nbrec_load_balancer 
*nbrec_lb)
                                          : LB_NEIGH_RESPOND_ALL;
     sset_init(&lb->ips_v4);
     sset_init(&lb->ips_v6);
+    sset_init(&lb->ods);
     struct smap_node *node;
     size_t n_vips = 0;
 
@@ -280,6 +281,7 @@ ovn_northd_lb_destroy(struct ovn_northd_lb *lb)
     free(lb->vips_nb);
     sset_destroy(&lb->ips_v4);
     sset_destroy(&lb->ips_v6);
+    sset_destroy(&lb->ods);
     free(lb->selection_fields);
     free(lb->nb_lr);
     free(lb->nb_ls);
@@ -304,6 +306,8 @@ ovn_lb_group_create(const struct nbrec_load_balancer_group 
*nbrec_lb_group,
     lb_group->ls = xmalloc(max_datapaths * sizeof *lb_group->ls);
     lb_group->lr = xmalloc(max_datapaths * sizeof *lb_group->lr);
 
+    sset_init(&lb_group->ods);
+
     for (size_t i = 0; i < nbrec_lb_group->n_load_balancer; i++) {
         const struct uuid *lb_uuid =
             &nbrec_lb_group->load_balancer[i]->header_.uuid;
@@ -320,6 +324,7 @@ ovn_lb_group_destroy(struct ovn_lb_group *lb_group)
         return;
     }
 
+    sset_destroy(&lb_group->ods);
     free(lb_group->lbs);
     free(lb_group->ls);
     free(lb_group->lr);
diff --git a/lib/lb.h b/lib/lb.h
index e0b153fb3..58530e222 100644
--- a/lib/lb.h
+++ b/lib/lb.h
@@ -55,6 +55,7 @@ struct ovn_northd_lb {
 
     struct sset ips_v4;
     struct sset ips_v6;
+    struct sset ods;
 
     size_t n_nb_ls;
     size_t n_allocated_nb_ls;
@@ -118,6 +119,8 @@ struct ovn_lb_group {
     struct ovn_datapath **ls;
     size_t n_lr;
     struct ovn_datapath **lr;
+
+    struct sset ods;
 };
 
 struct ovn_lb_group *ovn_lb_group_create(
diff --git a/northd/northd.c b/northd/northd.c
index 346c0c7c8..830a6fa48 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -4068,7 +4068,8 @@ build_lrouter_lbs_reachable_ips(struct hmap *datapaths, 
struct hmap *lbs,
 }
 
 static void
-build_lswitch_lbs_from_lrouter(struct hmap *datapaths, struct hmap *lbs)
+build_lswitch_lbs_from_lrouter(struct hmap *datapaths, struct hmap *lbs,
+                               struct hmap *lb_groups)
 {
     if (!install_ls_lb_from_router) {
         return;
@@ -4082,16 +4083,12 @@ build_lswitch_lbs_from_lrouter(struct hmap *datapaths, 
struct hmap *lbs)
 
         struct ovn_port *op;
         LIST_FOR_EACH (op, dp_node, &od->port_list) {
-            if (!lsp_is_router(op->nbsp)) {
-                continue;
-            }
-            if (!op->peer) {
+            if (!lsp_is_router(op->nbsp) || !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);
@@ -4099,19 +4096,31 @@ build_lswitch_lbs_from_lrouter(struct hmap *datapaths, 
struct hmap *lbs)
                     continue;
                 }
 
-                for (size_t j = 0; j < lb->n_nb_ls; j++) {
-                   if (lb->nb_ls[j] == od) {
-                       installed = true;
-                       break;
-                   }
-                }
-                if (!installed) {
+                if (sset_add(&lb->ods, od->nbs->name)) {
                     ovn_northd_lb_add_ls(lb, 1, &od);
                 }
-                if (lb->nlb) {
-                    od->has_lb_vip |= lb_has_vip(lb->nlb);
+            }
+
+            for (size_t i = 0; i < peer_od->nbr->n_load_balancer_group; i++) {
+                const struct nbrec_load_balancer_group *nbrec_lb_group;
+                struct ovn_lb_group *lb_group;
+
+                nbrec_lb_group = peer_od->nbr->load_balancer_group[i];
+                lb_group = ovn_lb_group_find(lb_groups,
+                                             &nbrec_lb_group->header_.uuid);
+                if (!lb_group) {
+                    continue;
+                }
+
+                if (sset_add(&lb_group->ods, od->nbs->name)) {
+                    ovn_lb_group_add_ls(lb_group, od);
+                    for (size_t j = 0; j < lb_group->n_lbs; j++) {
+                        ovn_northd_lb_add_ls(lb_group->lbs[j], 1, &od);
+                    }
                 }
             }
+
+            od->has_lb_vip = ls_has_lb_vip(od);
         }
     }
 }
@@ -4129,7 +4138,7 @@ build_lb_port_related_data(struct hmap *datapaths, struct 
hmap *ports,
     build_lrouter_lbs_check(datapaths);
     build_lrouter_lbs_reachable_ips(datapaths, lbs, lb_groups);
     build_lb_svcs(input_data, ovnsb_txn, ports, lbs);
-    build_lswitch_lbs_from_lrouter(datapaths, lbs);
+    build_lswitch_lbs_from_lrouter(datapaths, lbs, lb_groups);
 }
 
 
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
index d5136ac6d..e9bb22d9e 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -7730,6 +7730,12 @@ ovn-nbctl lsp-set-options S1-R1 router-port=R1-S1
 ovn-nbctl lb-add lb0 172.16.0.10:80 10.0.0.2:80
 ovn-nbctl lr-lb-add R1 lb0
 
+ovn-nbctl lb-add lb1 172.16.0.11:8080 10.0.0.2:8080
+lb1_uuid=$(fetch_column nb:load_balancer _uuid name=lb1)
+lbg=$(ovn-nbctl create load_balancer_group name=lbg -- \
+    add load_balancer_group lbg load_balancer $lb1_uuid)
+ovn-nbctl add logical_router R1 load_balancer_group $lbg
+
 ovn-sbctl dump-flows S0 > S0flows
 ovn-sbctl dump-flows S1 > S1flows
 
@@ -7754,10 +7760,12 @@ 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; 
ct_lb_mark(backends=10.0.0.2:80);)
+  table=11(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 
172.16.0.11 && tcp.dst == 8080), action=(reg0[[1]] = 0; 
ct_lb_mark(backends=10.0.0.2:8080);)
 ])
 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; 
ct_lb_mark(backends=10.0.0.2:80);)
+  table=11(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 
172.16.0.11 && tcp.dst == 8080), action=(reg0[[1]] = 0; 
ct_lb_mark(backends=10.0.0.2:8080);)
 ])
 
 ovn-sbctl get datapath S0 _uuid > dp_uuids
-- 
2.37.3

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to