@@ -58,6 +58,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)
{
@@ -1107,6 +1111,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,
@@ -1308,7 +1332,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);
@@ -1322,27 +1346,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;
}
}
@@ -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 *);
@@ -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) {
@@ -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);
@@ -14308,10 +14308,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
@@ -14338,7 +14340,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])