diff mbox series

[ovs-dev,branch-23.03,3/5] if-status: track interfaces for additional chassis

Message ID 20230531200451.3541416-3-ihrachys@redhat.com
State Accepted
Headers show
Series [ovs-dev,branch-23.03,1/5] Track ip version of tunnel in chassis_tunnel struct | expand

Checks

Context Check Description
ovsrobot/apply-robot warning apply and check: warning
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/github-robot-_ovn-kubernetes fail github build: failed

Commit Message

Ihar Hrachyshka May 31, 2023, 8:04 p.m. UTC
This will allow all chassis hosting a port to extract interface MTU from
if-status-mgr. This will be used in a later patch to calculate the
effective path MTU for each port.

In addition, it's the right thing to do to claim and mark an interface
on all chassis as ovn-installed, even if the chassis is "additional".

Fixes: fa8c591fa2a7 ("Support LSP:options:requested-chassis as a list")
Signed-off-by: Ihar Hrachyshka <ihrachys@redhat.com>
Acked-by: Dumitru Ceara <dceara@redhat.com>
Signed-off-by: Mark Michelson <mmichels@redhat.com>
(cherry picked from commit 23ffec7e22de97b67984acc6703d44f169dafb27)
---
 controller/binding.c   | 46 ++++++++++++++++++++++++++----------------
 controller/binding.h   |  4 ++++
 controller/if-status.c |  8 ++++++--
 controller/if-status.h |  3 ++-
 tests/ovn.at           | 10 +++++----
 5 files changed, 47 insertions(+), 24 deletions(-)

Comments

0-day Robot May 31, 2023, 8:15 p.m. UTC | #1
Bleep bloop.  Greetings Ihar Hrachyshka, I am a robot and I have tried out your patch.
Thanks for your contribution.

I encountered some error that I wasn't expecting.  See the details below.


checkpatch:
WARNING: Unexpected sign-offs from developers who are not authors or co-authors or committers: Mark Michelson <mmichels@redhat.com>
Lines checked: 203, Warnings: 1, Errors: 0


Please check this out.  If you feel there has been an error, please email aconole@redhat.com

Thanks,
0-day Robot
diff mbox series

Patch

diff --git a/controller/binding.c b/controller/binding.c
index 11e99911c..8fce6fc3f 100644
--- a/controller/binding.c
+++ b/controller/binding.c
@@ -57,6 +57,10 @@  struct claimed_port {
 static struct shash _claimed_ports = SHASH_INITIALIZER(&_claimed_ports);
 static struct sset _postponed_ports = SSET_INITIALIZER(&_postponed_ports);
 
+static void
+remove_additional_chassis(const struct sbrec_port_binding *pb,
+                          const struct sbrec_chassis *chassis_rec);
+
 struct sset *
 get_postponed_ports(void)
 {
@@ -1073,6 +1077,26 @@  set_pb_chassis_in_sbrec(const struct sbrec_port_binding *pb,
     }
 }
 
+void
+set_pb_additional_chassis_in_sbrec(const struct sbrec_port_binding *pb,
+                                   const struct sbrec_chassis *chassis_rec,
+                                   bool is_set)
+{
+    if (!is_additional_chassis(pb, chassis_rec)) {
+        VLOG_INFO("Claiming lport %s for this additional chassis.",
+                  pb->logical_port);
+        for (size_t i = 0; i < pb->n_mac; i++) {
+            VLOG_INFO("%s: Claiming %s", pb->logical_port, pb->mac[i]);
+        }
+        sbrec_port_binding_update_additional_chassis_addvalue(pb, chassis_rec);
+        if (pb->chassis == chassis_rec) {
+            sbrec_port_binding_set_chassis(pb, NULL);
+        }
+    } else if (!is_set) {
+        remove_additional_chassis(pb, chassis_rec);
+    }
+}
+
 bool
 local_bindings_pb_chassis_is_set(struct shash *local_bindings,
                                  const char *pb_name,
@@ -1274,7 +1298,7 @@  claim_lport(const struct sbrec_port_binding *pb,
                 set_pb_chassis_in_sbrec(pb, chassis_rec, true);
             } else {
                 if_status_mgr_claim_iface(if_mgr, pb, chassis_rec, iface_rec,
-                                          sb_readonly);
+                                          sb_readonly, can_bind);
             }
             register_claim_timestamp(pb->logical_port, now);
             sset_find_and_delete(postponed_ports, pb->logical_port);
@@ -1288,27 +1312,15 @@  claim_lport(const struct sbrec_port_binding *pb,
                     !smap_get_bool(&iface_rec->external_ids,
                                    OVN_INSTALLED_EXT_ID, false)) {
                     if_status_mgr_claim_iface(if_mgr, pb, chassis_rec,
-                                              iface_rec, sb_readonly);
+                                              iface_rec, sb_readonly,
+                                              can_bind);
                 }
             }
         }
     } else if (can_bind == CAN_BIND_AS_ADDITIONAL) {
         if (!is_additional_chassis(pb, chassis_rec)) {
-            if (sb_readonly) {
-                return false;
-            }
-
-            VLOG_INFO("Claiming lport %s for this additional chassis.",
-                      pb->logical_port);
-            for (size_t i = 0; i < pb->n_mac; i++) {
-                VLOG_INFO("%s: Claiming %s", pb->logical_port, pb->mac[i]);
-            }
-
-            sbrec_port_binding_update_additional_chassis_addvalue(pb,
-                                                                  chassis_rec);
-            if (pb->chassis == chassis_rec) {
-                sbrec_port_binding_set_chassis(pb, NULL);
-            }
+            if_status_mgr_claim_iface(if_mgr, pb, chassis_rec, iface_rec,
+                                      sb_readonly, can_bind);
             update_tracked = true;
         }
     }
diff --git a/controller/binding.h b/controller/binding.h
index 5b73c6a4b..46e618b97 100644
--- a/controller/binding.h
+++ b/controller/binding.h
@@ -202,6 +202,10 @@  bool is_additional_chassis(const struct sbrec_port_binding *pb,
 void set_pb_chassis_in_sbrec(const struct sbrec_port_binding *pb,
                              const struct sbrec_chassis *chassis_rec,
                              bool is_set);
+void
+set_pb_additional_chassis_in_sbrec(const struct sbrec_port_binding *pb,
+                                   const struct sbrec_chassis *chassis_rec,
+                                   bool is_set);
 
 void remove_ovn_installed_for_uuid(const struct ovsrec_interface_table *,
                                    const struct uuid *);
diff --git a/controller/if-status.c b/controller/if-status.c
index 2bff284d6..2b2eb1679 100644
--- a/controller/if-status.c
+++ b/controller/if-status.c
@@ -277,7 +277,7 @@  if_status_mgr_claim_iface(struct if_status_mgr *mgr,
                           const struct sbrec_port_binding *pb,
                           const struct sbrec_chassis *chassis_rec,
                           const struct ovsrec_interface *iface_rec,
-                          bool sb_readonly)
+                          bool sb_readonly, enum can_bind bind_type)
 {
     const char *iface_id = pb->logical_port;
     struct ovs_iface *iface = shash_find_data(&mgr->ifaces, iface_id);
@@ -288,7 +288,11 @@  if_status_mgr_claim_iface(struct if_status_mgr *mgr,
 
     memcpy(&iface->pb_uuid, &pb->header_.uuid, sizeof(iface->pb_uuid));
     if (!sb_readonly) {
-        set_pb_chassis_in_sbrec(pb, chassis_rec, true);
+        if (bind_type == CAN_BIND_AS_MAIN) {
+            set_pb_chassis_in_sbrec(pb, chassis_rec, true);
+        } else if (bind_type == CAN_BIND_AS_ADDITIONAL) {
+            set_pb_additional_chassis_in_sbrec(pb, chassis_rec, true);
+        }
     }
 
     switch (iface->state) {
diff --git a/controller/if-status.h b/controller/if-status.h
index 55979ece4..15624bcfa 100644
--- a/controller/if-status.h
+++ b/controller/if-status.h
@@ -20,6 +20,7 @@ 
 #include "lib/vswitch-idl.h"
 
 #include "binding.h"
+#include "lport.h"
 
 struct if_status_mgr;
 struct simap;
@@ -31,7 +32,7 @@  void if_status_mgr_claim_iface(struct if_status_mgr *,
                                const struct sbrec_port_binding *pb,
                                const struct sbrec_chassis *chassis_rec,
                                const struct ovsrec_interface *iface_rec,
-                               bool sb_readonly);
+                               bool sb_readonly, enum can_bind bind_type);
 void if_status_mgr_release_iface(struct if_status_mgr *, const char *iface_id);
 void if_status_mgr_delete_iface(struct if_status_mgr *, const char *iface_id);
 
diff --git a/tests/ovn.at b/tests/ovn.at
index fcfc6f2e4..a925992d4 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -14224,10 +14224,12 @@  wait_column "$hv1_uuid" Port_Binding requested_chassis logical_port=lsp0
 wait_column "$hv2_uuid" Port_Binding additional_chassis logical_port=lsp0
 wait_column "$hv2_uuid" Port_Binding requested_additional_chassis logical_port=lsp0
 
-# Check ovn-installed updated for main chassis
+# Check ovn-installed updated for both chassis
 wait_for_ports_up
-OVS_WAIT_UNTIL([test `as hv1 ovs-vsctl get Interface lsp0 external_ids:ovn-installed` = '"true"'])
-OVS_WAIT_UNTIL([test x`as hv2 ovs-vsctl get Interface lsp0 external_ids:ovn-installed` = x])
+
+for hv in hv1 hv2; do
+    OVS_WAIT_UNTIL([test `as $hv ovs-vsctl get Interface lsp0 external_ids:ovn-installed` = '"true"'])
+done
 
 # Check that setting iface:encap-ip populates Port_Binding:additional_encap
 wait_row_count Encap 2 chassis_name=hv1
@@ -14254,7 +14256,7 @@  wait_column "$hv2_uuid" Port_Binding requested_chassis logical_port=lsp0
 wait_column "" Port_Binding additional_chassis logical_port=lsp0
 wait_column "" Port_Binding requested_additional_chassis logical_port=lsp0
 
-# Check ovn-installed updated for main chassis and not for other chassis
+# Check ovn-installed updated for main chassis and removed from additional chassis
 wait_for_ports_up
 OVS_WAIT_UNTIL([test `as hv2 ovs-vsctl get Interface lsp0 external_ids:ovn-installed` = '"true"'])
 OVS_WAIT_UNTIL([test x`as hv1 ovs-vsctl get Interface lsp0 external_ids:ovn-installed` = x])