ovn supports creating remote logical ports. An user can set requested-chassis option for a logical switch port to the remote chassis and ovn-northd can bind it to that chassis. This is required for OVN IC in ovn-k8s. Right now ovn-k8s ovnkube-controller after creating a remote logical port, sets the chassis column of the corresponding port binding in SB DB to the remote chassis. This process can be authomized in ovn-northd.
Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=2217930 Signed-off-by: Lorenzo Bianconi <lorenzo.bianc...@redhat.com> --- ic/ovn-ic.c | 42 +++--------------------------------------- northd/northd.c | 21 ++++++++++++++++++++- tests/ovn-ic.at | 2 ++ tests/ovn-northd.at | 20 ++++++++++++++++++++ tests/ovn.at | 27 +++++++++++++++++++++++++++ 5 files changed, 72 insertions(+), 40 deletions(-) diff --git a/ic/ovn-ic.c b/ic/ovn-ic.c index 6f31037ec..c12e345ed 100644 --- a/ic/ovn-ic.c +++ b/ic/ovn-ic.c @@ -506,20 +506,6 @@ get_lrp_address_for_sb_pb(struct ic_context *ctx, return peer->n_mac ? *peer->mac : NULL; } -static const struct sbrec_chassis * -find_sb_chassis(struct ic_context *ctx, const char *name) -{ - const struct sbrec_chassis *key = - sbrec_chassis_index_init_row(ctx->sbrec_chassis_by_name); - sbrec_chassis_index_set_name(key, name); - - const struct sbrec_chassis *chassis = - sbrec_chassis_index_find(ctx->sbrec_chassis_by_name, key); - sbrec_chassis_index_destroy_row(key); - - return chassis; -} - static void sync_lsp_tnl_key(const struct nbrec_logical_switch_port *lsp, int64_t isb_tnl_key) @@ -622,13 +608,10 @@ sync_local_port(struct ic_context *ctx, /* For each remote port: * - Sync from ISB to NB - * - Sync gateway from ISB to SB */ static void -sync_remote_port(struct ic_context *ctx, - const struct icsbrec_port_binding *isb_pb, - const struct nbrec_logical_switch_port *lsp, - const struct sbrec_port_binding *sb_pb) +sync_remote_port(const struct icsbrec_port_binding *isb_pb, + const struct nbrec_logical_switch_port *lsp) { /* Sync address from ISB to NB */ if (isb_pb->address[0]) { @@ -645,25 +628,6 @@ sync_remote_port(struct ic_context *ctx, /* Sync tunnel key from ISB to NB */ sync_lsp_tnl_key(lsp, isb_pb->tunnel_key); - - /* Sync gateway from ISB to SB */ - if (isb_pb->gateway[0]) { - if (!sb_pb->chassis || strcmp(sb_pb->chassis->name, isb_pb->gateway)) { - const struct sbrec_chassis *chassis = - find_sb_chassis(ctx, isb_pb->gateway); - if (!chassis) { - VLOG_DBG("Chassis %s is not found in SB, syncing from ISB " - "to SB skipped for logical port %s.", - isb_pb->gateway, lsp->name); - return; - } - sbrec_port_binding_set_chassis(sb_pb, chassis); - } - } else { - if (sb_pb->chassis) { - sbrec_port_binding_set_chassis(sb_pb, NULL); - } - } } static void @@ -813,7 +777,7 @@ port_binding_run(struct ic_context *ctx, if (!sb_pb) { continue; } - sync_remote_port(ctx, isb_pb, lsp, sb_pb); + sync_remote_port(isb_pb, lsp); } } else { VLOG_DBG("Ignore lsp %s on ts %s with type %s.", diff --git a/northd/northd.c b/northd/northd.c index b9605862e..618c79c61 100644 --- a/northd/northd.c +++ b/northd/northd.c @@ -3773,11 +3773,30 @@ ovn_port_update_sbrec(struct ovsdb_idl_txn *ovnsb_txn, sbrec_port_binding_set_tunnel_key(op->sb, op->tunnel_key); } + bool up = false; + /* ovn-northd is supposed to set port_binding for remote ports + * if requested chassis is marked as remote + */ + if (op->nbsp && lsp_is_remote(op->nbsp)) { + const struct sbrec_chassis *chassis_sb = NULL; + const char *requested_chassis = smap_get( + &op->nbsp->options, "requested-chassis"); + if (requested_chassis) { + chassis_sb = chassis_lookup( + sbrec_chassis_by_name, sbrec_chassis_by_hostname, + requested_chassis); + if (chassis_sb) { + up = smap_get_bool(&chassis_sb->other_config, + "is-remote", false); + } + } + sbrec_port_binding_set_chassis(op->sb, chassis_sb); + } + /* ovn-controller will update 'Port_Binding.up' only if it was explicitly * set to 'false'. */ if (!op->sb->n_up) { - bool up = false; sbrec_port_binding_set_up(op->sb, &up, 1); } } diff --git a/tests/ovn-ic.at b/tests/ovn-ic.at index ceee45092..05c9b2825 100644 --- a/tests/ovn-ic.at +++ b/tests/ovn-ic.at @@ -337,6 +337,7 @@ ovn-nbctl lsp-set-addresses lsp-ts1-lr1 router ovn-nbctl lsp-set-type lsp-ts1-lr1 router ovn-nbctl --wait=hv lsp-set-options lsp-ts1-lr1 router-port=lrp-lr1-ts1 +ovn_as az2 ovn-nbctl lsp-set-options lsp-ts1-lr1 requested-chassis=gw1 AT_CHECK([ovn_as az2 ovn-nbctl show | uuidfilt], [0], [dnl switch <0> (ts1) port lsp-ts1-lr1 @@ -351,6 +352,7 @@ lsp-ts1-lr1,remote ovn-nbctl lrp-set-gateway-chassis lrp-lr1-ts1 gw1 OVS_WAIT_UNTIL([ovn_as az2 ovn-sbctl show | grep lsp-ts1-lr1]) +ovn_as az2 ovn-nbctl lsp-set-options lsp-ts1-lr1 requested-chassis="" ovn-nbctl lrp-del-gateway-chassis lrp-lr1-ts1 gw1 OVS_WAIT_WHILE([ovn_as az2 ovn-sbctl show | grep lsp-ts1-lr1]) diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at index 3e06f14c9..69569f3a7 100644 --- a/tests/ovn-northd.at +++ b/tests/ovn-northd.at @@ -9688,3 +9688,23 @@ AT_CHECK([grep "lr_in_gw_redirect" R1flows |sed s'/table=../table=??/' |sort], [ AT_CLEANUP ]) + +OVN_FOR_EACH_NORTHD_NO_HV([ +AT_SETUP([Remote port binding]) +AT_KEYWORDS([remote-port-binding]) +ovn_start + +check ovn-sbctl chassis-add remote-ch0 geneve 127.0.0.1 +check ovn-sbctl set chassis remote-ch0 other_config:is-remote=true +wait_row_count Chassis 1 + +check ovn-nbctl ls-add sw0 +check ovn-nbctl lsp-add sw0 sw0-r1 -- lsp-set-type sw0-r1 remote +check ovn-nbctl lsp-set-options sw0-r1 requested-chassis=remote-ch0 +wait_for_ports_up sw0-r1 + +check ovn-nbctl remove logical_switch_port sw0-r1 options requested-chassis +wait_row_count nb:Logical_Switch_Port 1 up=false name=sw0-r1 + +AT_CLEANUP +]) diff --git a/tests/ovn.at b/tests/ovn.at index 882a548db..8334b3ad4 100644 --- a/tests/ovn.at +++ b/tests/ovn.at @@ -26106,6 +26106,19 @@ done # XXX This should be more systematic. sleep 2 +# Populate requested-chassis options for remote lsps +for az in $(seq 1 $n_az); do + ovn_as az${az} + for ts in $(seq 1 $n_ts); do + for i in $(seq 1 $n_ts); do + if [[ $i -eq ${az} ]]; then + continue + fi + check ovn-nbctl lsp-set-options lsp-ts${ts}-lr${i}-${ts} requested-chassis=gw$i + done + done +done + ovn-ic-nbctl show > ic-nbctl.dump AT_CAPTURE_FILE([ic-nbctl.dump]) @@ -26329,6 +26342,13 @@ check ovn-nbctl lsp-add ts ts-lr3 \ wait_for_ports_up +ovn_as az1 +check ovn-nbctl lsp-set-options ts-lr2 requested-chassis=hv2 +check ovn-nbctl lsp-set-options ts-lr3 requested-chassis=hv2 + +ovn_as az2 +check ovn-nbctl lsp-set-options ts-lr1 requested-chassis=hv1 + dnl Enable unregistered IP multicast flooding and IP multicast relay. ovn_as az1 check ovn-nbctl set logical_switch ls1 other_config:mcast_snoop="true" \ @@ -26534,6 +26554,13 @@ check ovn-nbctl lsp-add ts ts-lr3 \ wait_for_ports_up +ovn_as az1 +check ovn-nbctl lsp-set-options ts-lr2 requested-chassis=hv2 +check ovn-nbctl lsp-set-options ts-lr3 requested-chassis=hv2 + +ovn_as az2 +check ovn-nbctl lsp-set-options ts-lr1 requested-chassis=hv1 + dnl Enable IP multicast snooping and IP multicast relay. Reports are dnl forwarded statically. ovn_as az1 -- 2.41.0 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev