If one has a UDP load balancer with backend IP which is located under
disabled LSP, such backend would be threated as alive and marked as
'online' on Service_Monitor table and added to load balancing as well.
Though such LSP can't receive any traffic, this load balancer will be
broken by mentioned behaviour.

This patch resolves this issue for Load Balancers with enabled health
check: if LSP is disabled, it wont be added to Service_Monitor and to
Load Balancing flow.

Signed-off-by: Vladislav Odintsov <[email protected]>
---
 northd/northd.c     | 10 ++++++----
 tests/ovn-northd.at | 19 +++++++++++++++++++
 2 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/northd/northd.c b/northd/northd.c
index 1eb190dc1..76007bd4d 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -3713,7 +3713,8 @@ ovn_lb_svc_create(struct ovsdb_idl_txn *ovnsb_txn, struct 
ovn_northd_lb *lb,
             backend_nb->op = op;
             backend_nb->svc_mon_src_ip = svc_mon_src_ip;
 
-            if (!lb_vip_nb->lb_health_check || !op || !svc_mon_src_ip) {
+            if (!lb_vip_nb->lb_health_check || !op || !svc_mon_src_ip ||
+                !lsp_is_enabled(op->nbsp)) {
                 continue;
             }
 
@@ -3777,9 +3778,10 @@ build_lb_vip_actions(struct ovn_lb_vip *lb_vip,
             struct ovn_lb_backend *backend = &lb_vip->backends[i];
             struct ovn_northd_lb_backend *backend_nb =
                 &lb_vip_nb->backends_nb[i];
-            if (backend_nb->health_check && backend_nb->sbrec_monitor &&
-                backend_nb->sbrec_monitor->status &&
-                strcmp(backend_nb->sbrec_monitor->status, "online")) {
+            if (!backend_nb->health_check ||
+                (backend_nb->health_check && backend_nb->sbrec_monitor &&
+                 backend_nb->sbrec_monitor->status &&
+                 strcmp(backend_nb->sbrec_monitor->status, "online"))) {
                 continue;
             }
 
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
index da83bce7c..7c3c84007 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -1230,6 +1230,25 @@ OVS_WAIT_FOR_OUTPUT(
   (ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 
&& tcp.dst == 80), action=(reg0[[1]] = 0; 
ct_lb(backends=10.0.0.3:80,20.0.0.3:80);)
 ])
 
+# disabled LSPs should not be a backend of Load Balancer
+check ovn-nbctl lsp-set-enabled sw0-p1 disabled
+
+AT_CAPTURE_FILE([sbflows])
+OVS_WAIT_FOR_OUTPUT(
+  [ovn-sbctl dump-flows sw0 | tee sbflows | grep 'priority=120.*backends' | 
sed 's/table=..//'], 0, [dnl
+  (ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 
&& tcp.dst == 80), action=(reg0[[1]] = 0; ct_lb(backends=20.0.0.3:80);)
+])
+wait_row_count Service_Monitor 1
+
+check ovn-nbctl lsp-set-enabled sw0-p1 enabled
+
+AT_CAPTURE_FILE([sbflows])
+OVS_WAIT_FOR_OUTPUT(
+  [ovn-sbctl dump-flows sw0 | tee sbflows | grep 'priority=120.*backends' | 
sed 's/table=..//'], 0, [dnl
+  (ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 
&& tcp.dst == 80), action=(reg0[[1]] = 0; 
ct_lb(backends=10.0.0.3:80,20.0.0.3:80);)
+])
+wait_row_count Service_Monitor 2
+
 AS_BOX([Delete the Load_Balancer_Health_Check])
 ovn-nbctl --wait=sb clear load_balancer . health_check
 wait_row_count Service_Monitor 0
-- 
2.36.1

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

Reply via email to