On Thu, Oct 23, 2025 at 12:18 PM Mairtin O'Loingsigh <[email protected]> wrote:
> On Thu, Oct 23, 2025 at 11:44:10AM +0200, Ales Musil wrote: > > On Wed, Oct 22, 2025 at 5:11 PM Mairtin O'Loingsigh via dev < > > [email protected]> wrote: > > > > > This series extends ovn-ic to include support for transit routers. > > > The changes include new ovn-ic-nb commands to add and manipulate > transit > > > routers and ports, schema updates and new tests. > > > Transit routers added using these new commands will have to same > > > tunnel-key across AZs. > > > > > > In the future I also want to create a new ovn-fake-multinode tests > suite > > > similar to make check-multinode, but with ovn-ic enabled on the worker > > > chassis. > > > > > > v7: > > > - Use int64_t for tunnel_key. > > > - Don't free tunnel ID. > > > - Remove unnecessary shash_deletes. > > > - Move addition of port command to correct patch. > > > - Delay creation of Logical Router Port until ICSB port binding > > > transaction has completed successfully. > > > - Simplify Logical Router Port requested-tnl-key validation. > > > > > > v6: > > > - Revert transit switch changes releated to using nb_ic_uuid and type. > > > - Use SHASH_FOR_EACH instead of SHASH_FOR_EACH_SAFE. > > > - Use check instead of AT_CHECK. > > > - Remove unnecessary variable creation in nb-ic-ctl tests. > > > - Remove unnecessary OVS_UNUSED. > > > - Move config of datapath tunnel key to correct patch. > > > - Split create_isb_pb function due to reliance on sb_pb. > > > - Replace wait_row_count with check_row_count where possible. > > > > > > v5: > > > - Fix sync issues in tests. > > > > > > v4: > > > - Seperate collection of datapath tunnel ids from ts_run function. > > > - Remove ability to set requested-tnl-key manually. > > > - Split move of network parsing code into seperate patch. > > > - Add transit router port to transit router table in schema. > > > - Remove ic_trp_data struct and use shash instead. > > > - Remove ic_pb_info struct and use shash instead. > > > - Only support ports bound to a chassis. > > > - Add test for port network collision. > > > - Use wait_row_count instead of grep in tests. > > > > > > v3: > > > - Remove unrelated changes > > > - Fix coding standard violation > > > - Create a ICSB entry for every port > > > - Update schema versions. > > > - Set min number of types and nb_ic_uuid to zero. > > > - Remove changes releated to routes. > > > - Update ic-nbctl trp-add network parsing to match nbctl_lrp_add. > > > - Split patches > > > - Add ovn-ic-nbctl tests for transit router port. > > > > > > v2: > > > - Combine patches into a single patch > > > > > > Mairtin O'Loingsigh (4): > > > ic: Update schema to add Transit Router. > > > ic: Add Transit router support. > > > ovn-util: Add network and prefix parsing to utils. > > > ic: Add Transit Router port support. > > > > > > NEWS | 7 + > > > TODO.rst | 2 + > > > ic/ovn-ic.c | 563 ++++++++++++++++++++++++++++++++------- > > > lib/ovn-util.c | 101 +++++++ > > > lib/ovn-util.h | 14 + > > > ovn-architecture.7.xml | 10 +- > > > ovn-ic-nb.ovsschema | 36 ++- > > > ovn-ic-nb.xml | 70 +++++ > > > ovn-ic-sb.ovsschema | 23 +- > > > ovn-ic-sb.xml | 18 ++ > > > tests/ovn-ic-nbctl.at | 65 +++++ > > > tests/ovn-ic.at | 255 ++++++++++++++++++ > > > utilities/ovn-ic-nbctl.c | 326 ++++++++++++++++++++++- > > > utilities/ovn-nbctl.c | 98 ------- > > > 14 files changed, 1377 insertions(+), 211 deletions(-) > > > > > > -- > > > 2.51.0 > > > > > > _______________________________________________ > > > dev mailing list > > > [email protected] > > > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > > > > > > > > Hi Mairtin, > > > > I would merge this into main with the following diff and your permission: > > > > diff --git a/NEWS b/NEWS > > index 4648d9d87..a17a61b41 100644 > > --- a/NEWS > > +++ b/NEWS > > @@ -44,7 +44,6 @@ Post v25.09.0 > > function and the chassis hosting the port where the ACL is being > > enforced). Proper MTU needs to be configured to accomodate this > > encapsulation. > > - > > - Added Transit Router support: > > * Support the creation of Transit Routers. > > * Added new ovn-ic-nbctl 'tr-add','tr-del','tr-list' commands to > manage > > @@ -52,6 +51,7 @@ Post v25.09.0 > > * Support the creation of Transit Router Ports. > > * Added new ovn-ic-nbctl 'trp-add' and 'tpr-del' commands to manage > > Transit Router Ports. > > + > > OVN v25.09.0 - xxx xx xxxx > > -------------------------- > > - STT tunnels are no longer supported in ovn-encap-type. > > diff --git a/ic/ovn-ic.c b/ic/ovn-ic.c > > index 43aca7ea7..16fb962f1 100644 > > --- a/ic/ovn-ic.c > > +++ b/ic/ovn-ic.c > > @@ -76,10 +76,8 @@ struct ic_context { > > struct ovsdb_idl_index > > *sbrec_service_monitor_by_remote_type_logical_port; > > struct ovsdb_idl_index *icnbrec_transit_switch_by_name; > > struct ovsdb_idl_index *icsbrec_port_binding_by_az; > > - struct ovsdb_idl_index *icsbrec_port_binding_by_tr; > > + struct ovsdb_idl_index *icsbrec_port_binding_by_ts; > > struct ovsdb_idl_index *icsbrec_port_binding_by_ts_az; > > - struct ovsdb_idl_index *icsbrec_port_binding_by_nb_ic_uuid; > > - struct ovsdb_idl_index *icsbrec_port_binding_by_nb_ic_uuid_type; > > struct ovsdb_idl_index *icsbrec_route_by_az; > > struct ovsdb_idl_index *icsbrec_route_by_ts; > > struct ovsdb_idl_index *icsbrec_route_by_ts_az; > > @@ -349,21 +347,6 @@ ts_run(struct ic_context *ctx, struct hmap > *dp_tnlids, > > isb_dp = > icsbrec_datapath_binding_insert(ctx->ovnisb_txn); > > icsbrec_datapath_binding_set_transit_switch(isb_dp, > > ts->name); > > icsbrec_datapath_binding_set_tunnel_key(isb_dp, dp_key); > > - icsbrec_datapath_binding_set_nb_ic_uuid(isb_dp, > > - > &ts->header_.uuid, > > 1); > > - icsbrec_datapath_binding_set_type(isb_dp, > > "transit-switch"); > > - if (!isb_dp->type) { > > - icsbrec_datapath_binding_set_type(isb_dp, > > - "transit-switch"); > > - } > > - > > - if (!isb_dp->nb_ic_uuid) { > > - icsbrec_datapath_binding_set_nb_ic_uuid( > > - isb_dp, &ts->header_.uuid, 1); > > - } > > - > > - ovn_add_tnlid(dp_tnlids, isb_dp->tunnel_key); > > - > > } else if (dp_key_refresh) { > > /* Refresh tunnel key since encap mode has changed. */ > > int64_t dp_key = allocate_dp_key(dp_tnlids, vxlan_mode, > > @@ -372,11 +355,20 @@ ts_run(struct ic_context *ctx, struct hmap > *dp_tnlids, > > icsbrec_datapath_binding_set_tunnel_key(isb_dp, > > dp_key); > > } > > } > > + > > + if (!isb_dp->type) { > > + icsbrec_datapath_binding_set_type(isb_dp, > > "transit-switch"); > > + } > > + > > + if (!isb_dp->nb_ic_uuid) { > > + icsbrec_datapath_binding_set_nb_ic_uuid(isb_dp, > > + > &ts->header_.uuid, > > 1); > > + } > > } > > + > > struct shash_node *node; > > SHASH_FOR_EACH (node, isb_ts_dps) { > > - const struct icsbrec_datapath_binding *isb_dp = node->data; > > - icsbrec_datapath_binding_delete(isb_dp); > > + icsbrec_datapath_binding_delete(node->data); > > } > > } > > } > > @@ -436,6 +428,7 @@ tr_run(struct ic_context *ctx, struct hmap > *dp_tnlids, > > struct icsbrec_datapath_binding *isb_dp = > > shash_find_and_delete(isb_tr_dps, uuid_str); > > free(uuid_str); > > + > > if (!isb_dp) { > > int dp_key = allocate_dp_key(dp_tnlids, false, > > "transit router datapath"); > > @@ -452,7 +445,7 @@ tr_run(struct ic_context *ctx, struct hmap > *dp_tnlids, > > } > > > > struct shash_node *node; > > - SHASH_FOR_EACH_SAFE (node, isb_tr_dps) { > > + SHASH_FOR_EACH (node, isb_tr_dps) { > > icsbrec_datapath_binding_delete(node->data); > > } > > } > > @@ -777,7 +770,7 @@ sync_lrp_tnl_key(const struct > nbrec_logical_router_port > > *lrp, > > if (tnl_key != isb_tnl_key) { > > VLOG_DBG("Set options:requested-tnl-key %" PRId64 " for lrp %s > in > > NB.", > > isb_tnl_key, lrp->name); > > - char *tnl_key_str = xasprintf("%" PRId64, isb_tnl_key); > > + char *tnl_key_str = xasprintf("%"PRId64, isb_tnl_key); > > nbrec_logical_router_port_update_options_setkey( > > lrp, "requested-tnl-key", tnl_key_str); > > free(tnl_key_str); > > @@ -988,12 +981,6 @@ create_nb_lsp(struct ic_context *ctx, > > nbrec_logical_switch_update_ports_addvalue(ls, lsp); > > } > > > > -static const struct sbrec_port_binding * > > -find_lp_in_sb(struct ic_context *ctx, const char *name) > > -{ > > - return find_sb_pb_by_name(ctx->sbrec_port_binding_by_name, name); > > -} > > - > > static uint32_t > > allocate_port_key(struct hmap *pb_tnlids) > > { > > @@ -1009,7 +996,7 @@ create_isb_pb(struct ic_context *ctx, const char > > *logical_port, > > struct hmap *pb_tnlids) > > { > > uint32_t pb_tnl_key = allocate_port_key(pb_tnlids); > > - if (pb_tnl_key == 0) { > > + if (!pb_tnl_key) { > > return NULL; > > } > > > > @@ -1039,7 +1026,7 @@ get_lrp_by_lrp_name(struct ic_context *ctx, const > > char *lrp_name) > > } > > > > static bool > > -trp_port_is_remote(struct ic_context *ctx, const char *chassis_name) > > +trp_is_remote(struct ic_context *ctx, const char *chassis_name) > > { > > if (chassis_name) { > > const struct sbrec_chassis *chassis = > > @@ -1055,8 +1042,8 @@ trp_port_is_remote(struct ic_context *ctx, const > char > > *chassis_name) > > } > > > > static struct nbrec_logical_router_port * > > -trp_port_create(struct ic_context *ctx, const struct > nbrec_logical_router > > *lr, > > - const struct icnbrec_transit_router_port *trp) > > +lrp_create(struct ic_context *ctx, const struct nbrec_logical_router > *lr, > > + const struct icnbrec_transit_router_port *trp) > > { > > struct nbrec_logical_router_port *lrp = > > nbrec_logical_router_port_insert(ctx->ovnnb_txn); > > @@ -1079,11 +1066,24 @@ sync_ts_isb_pb(struct ic_context *ctx, const > struct > > sbrec_port_binding *sb_pb, > > > > const struct sbrec_port_binding *crp = find_crp_for_sb_pb(ctx, > sb_pb); > > if (crp && crp->chassis) { > > - icsbrec_port_binding_set_gateway(isb_pb, > > - crp->chassis->name); > > + icsbrec_port_binding_set_gateway(isb_pb, crp->chassis->name); > > } > > > > update_isb_pb_external_ids(ctx, sb_pb, isb_pb); > > + > > + /* XXX: Sync encap so that multiple encaps can be used for the same > > + * gateway. However, it is not needed for now, since we don't yet > > + * support specifying encap type/ip for gateway chassis or > ha-chassis > > + * for logical router port in NB DB, and now encap should always be > > + * empty. The sync can be added if we add such support for gateway > > + * chassis/ha-chassis in NB DB. */ > > +} > > + > > +static const struct sbrec_port_binding * > > +find_lsp_in_sb(struct ic_context *ctx, > > + const struct nbrec_logical_switch_port *lsp) > > +{ > > + return find_sb_pb_by_name(ctx->sbrec_port_binding_by_name, > lsp->name); > > } > > > > static void > > @@ -1098,12 +1098,14 @@ port_binding_run(struct ic_context *ctx) > > struct shash router_all_local_pbs = > > SHASH_INITIALIZER(&router_all_local_pbs); > > struct hmap pb_tnlids = HMAP_INITIALIZER(&pb_tnlids); > > + struct shash_node *node; > > > > const struct icsbrec_port_binding *isb_pb; > > const struct icsbrec_port_binding *isb_pb_key = > > > > icsbrec_port_binding_index_init_row(ctx->icsbrec_port_binding_by_az); > > icsbrec_port_binding_index_set_availability_zone(isb_pb_key, > > ctx->runned_az); > > + > > ICSBREC_PORT_BINDING_FOR_EACH_EQUAL (isb_pb, isb_pb_key, > > > ctx->icsbrec_port_binding_by_az) { > > ic_pb_get_type(isb_pb) != IC_ROUTER_PORT > > @@ -1126,20 +1128,17 @@ port_binding_run(struct ic_context *ctx) > > struct shash remote_pbs = SHASH_INITIALIZER(&remote_pbs); > > > > isb_pb_key = icsbrec_port_binding_index_init_row( > > - ctx->icsbrec_port_binding_by_nb_ic_uuid_type); > > - icsbrec_port_binding_index_set_nb_ic_uuid(isb_pb_key, > > - &ts->header_.uuid, 1); > > - icsbrec_port_binding_index_set_type(isb_pb_key, > > "transit-switch-port"); > > - ICSBREC_PORT_BINDING_FOR_EACH_EQUAL ( > > - isb_pb, isb_pb_key, > > ctx->icsbrec_port_binding_by_nb_ic_uuid_type) { > > + ctx->icsbrec_port_binding_by_ts); > > + icsbrec_port_binding_index_set_transit_switch(isb_pb_key, > > ts->name); > > + > > + ICSBREC_PORT_BINDING_FOR_EACH_EQUAL (isb_pb, isb_pb_key, > > + > > ctx->icsbrec_port_binding_by_ts) { > > if (isb_pb->availability_zone == ctx->runned_az) { > > + shash_add(&local_pbs, isb_pb->logical_port, isb_pb); > > shash_find_and_delete(&switch_all_local_pbs, > > isb_pb->logical_port); > > - shash_add(&local_pbs, isb_pb->logical_port, isb_pb); > > } else { > > - if (!shash_find_data(&remote_pbs, > isb_pb->logical_port)) { > > - shash_add(&remote_pbs, isb_pb->logical_port, > isb_pb); > > - } > > + shash_add(&remote_pbs, isb_pb->logical_port, isb_pb); > > } > > } > > icsbrec_port_binding_index_destroy_row(isb_pb_key); > > @@ -1151,11 +1150,10 @@ port_binding_run(struct ic_context *ctx) > > if (!strcmp(lsp->type, "router") > > || !strcmp(lsp->type, "switch")) { > > /* The port is local. */ > > - sb_pb = find_lp_in_sb(ctx, lsp->name); > > + sb_pb = find_lsp_in_sb(ctx, lsp); > > if (!sb_pb) { > > continue; > > } > > - > > isb_pb = shash_find_and_delete(&local_pbs, lsp->name); > > if (!isb_pb) { > > isb_pb = create_isb_pb( > > @@ -1165,13 +1163,23 @@ port_binding_run(struct ic_context *ctx) > > } else { > > sync_local_port(ctx, isb_pb, sb_pb, lsp); > > } > > + > > + if (isb_pb->type) { > > + icsbrec_port_binding_set_type(isb_pb, > > + > "transit-switch-port"); > > + } > > + > > + if (isb_pb->nb_ic_uuid) { > > + icsbrec_port_binding_set_nb_ic_uuid(isb_pb, > > + > &ts->header_.uuid, > > 1); > > + } > > } else if (!strcmp(lsp->type, "remote")) { > > /* The port is remote. */ > > isb_pb = shash_find_and_delete(&remote_pbs, lsp->name); > > if (!isb_pb) { > > nbrec_logical_switch_update_ports_delvalue(ls, lsp); > > } else { > > - sb_pb = find_lp_in_sb(ctx, lsp->name); > > + sb_pb = find_lsp_in_sb(ctx, lsp); > > if (!sb_pb) { > > continue; > > } > > @@ -1183,96 +1191,103 @@ port_binding_run(struct ic_context *ctx) > > } > > } > > > > - struct shash_node *node; > > - SHASH_FOR_EACH_SAFE (node, &local_pbs) { > > - isb_pb = node->data; > > - icsbrec_port_binding_delete(isb_pb); > > + /* Delete extra port-binding from ISB */ > > + SHASH_FOR_EACH (node, &local_pbs) { > > + icsbrec_port_binding_delete(node->data); > > } > > > > /* Create lsp in NB for remote ports */ > > - SHASH_FOR_EACH_SAFE (node, &remote_pbs) { > > - isb_pb = node->data; > > - create_nb_lsp(ctx, isb_pb, ls); > > + SHASH_FOR_EACH (node, &remote_pbs) { > > + create_nb_lsp(ctx, node->data, ls); > > } > > > > shash_destroy(&local_pbs); > > shash_destroy(&remote_pbs); > > } > > > > - struct shash_node *node; > > - SHASH_FOR_EACH_SAFE (node, &switch_all_local_pbs) { > > - isb_pb = node->data; > > - icsbrec_port_binding_delete(isb_pb); > > + SHASH_FOR_EACH (node, &switch_all_local_pbs) { > > + icsbrec_port_binding_delete(node->data); > > } > > shash_destroy(&switch_all_local_pbs); > > > > const struct icnbrec_transit_router *tr; > > ICNBREC_TRANSIT_ROUTER_FOR_EACH (tr, ctx->ovninb_idl) { > > - struct shash nb_ports = SHASH_INITIALIZER(&nb_ports); > > const struct nbrec_logical_router *lr = find_tr_in_nb(ctx, > > tr->name); > > if (!lr) { > > VLOG_DBG("Transit router %s not found in NB.", tr->name); > > continue; > > } > > > > + struct shash nb_ports = SHASH_INITIALIZER(&nb_ports); > > + struct shash local_pbs = SHASH_INITIALIZER(&local_pbs); > > + struct shash remote_pbs = SHASH_INITIALIZER(&remote_pbs); > > + > > + for (size_t i = 0; i < lr->n_ports; i++) { > > + const struct nbrec_logical_router_port *lrp = lr->ports[i]; > > + shash_add(&nb_ports, lrp->name, lrp); > > + } > > + > > + isb_pb_key = icsbrec_port_binding_index_init_row( > > + ctx->icsbrec_port_binding_by_ts); > > + icsbrec_port_binding_index_set_transit_switch(isb_pb_key, > > tr->name); > > + > > + ICSBREC_PORT_BINDING_FOR_EACH_EQUAL (isb_pb, isb_pb_key, > > + > > ctx->icsbrec_port_binding_by_ts) { > > + if (isb_pb->availability_zone == ctx->runned_az) { > > + shash_add(&local_pbs, isb_pb->logical_port, isb_pb); > > + shash_find_and_delete(&router_all_local_pbs, > > + isb_pb->logical_port); > > + } else { > > + shash_add(&remote_pbs, isb_pb->logical_port, isb_pb); > > + } > > + } > > + icsbrec_port_binding_index_destroy_row(isb_pb_key); > > + > > for (size_t i = 0; i < tr->n_ports; i++) { > > const struct icnbrec_transit_router_port *trp = > tr->ports[i]; > > - shash_add(&nb_ports, trp->name, trp); > > - isb_pb = shash_find_and_delete(&router_all_local_pbs, > > trp->name); > > - if (!isb_pb) { > > - if (!trp_port_is_remote(ctx, trp->chassis)) { > > + > > + if (trp_is_remote(ctx, trp->chassis)) { > > + isb_pb = shash_find_and_delete(&remote_pbs, trp->name); > > + } else { > > + isb_pb = shash_find_and_delete(&local_pbs, trp->name); > > + if (!isb_pb) { > > isb_pb = create_isb_pb(ctx, trp->name, > ctx->runned_az, > > tr->name, &tr->header_.uuid, > > "transit-router-port", > > &pb_tnlids); > > icsbrec_port_binding_set_address(isb_pb, trp->mac); > > - continue; > > - } else { > > - isb_pb_key = icsbrec_port_binding_index_init_row( > > - ctx->icsbrec_port_binding_by_tr); > > - > > icsbrec_port_binding_index_set_transit_switch(isb_pb_key, > > - > > tr->name); > > - ICSBREC_PORT_BINDING_FOR_EACH_EQUAL ( > > - isb_pb, isb_pb_key, > > ctx->icsbrec_port_binding_by_tr) { > > - if (!strcmp(trp->name, isb_pb->logical_port)) { > > - break; > > - } > > - } > > - icsbrec_port_binding_index_destroy_row(isb_pb_key); > > } > > } > > + > > /* Don't allow remote ports to create NB LRP until ICSB > entry > > is > > * created in the appropriate AZ. */ > > if (isb_pb) { > > const struct nbrec_logical_router_port *lrp = > > - get_lrp_by_lrp_name(ctx, trp->name); > > - > > + shash_find_and_delete(&nb_ports, trp->name); > > if (!lrp) { > > - lrp = trp_port_create(ctx, lr, trp); > > + lrp = lrp_create(ctx, lr, trp); > > } > > > > sync_router_port(isb_pb, trp, lrp); > > } > > } > > > > - for (size_t i = 0; i < lr->n_ports; i++) { > > - const struct nbrec_logical_router_port *lrp = lr->ports[i]; > > - if (!shash_find_and_delete(&nb_ports, lrp->name) && > > - smap_get(&lrp->options, "interconn-tr")) { > > - nbrec_logical_router_port_delete(lrp); > > - nbrec_logical_router_update_ports_delvalue(lr, lrp); > > - } > > + SHASH_FOR_EACH(node, &nb_ports) { > > + nbrec_logical_router_port_delete(node->data); > > + nbrec_logical_router_update_ports_delvalue(lr, node->data); > > } > > > > shash_destroy(&nb_ports); > > + shash_destroy(&local_pbs); > > + shash_destroy(&remote_pbs); > > } > > - ovn_destroy_tnlids(&pb_tnlids); > > > > - SHASH_FOR_EACH_SAFE (node, &router_all_local_pbs) { > > - isb_pb = node->data; > > - icsbrec_port_binding_delete(isb_pb); > > - shash_delete(&router_all_local_pbs, node); > > + SHASH_FOR_EACH (node, &router_all_local_pbs) { > > + icsbrec_port_binding_delete(node->data); > > } > > > > + ovn_destroy_tnlids(&pb_tnlids); > > shash_destroy(&router_all_local_pbs); > > } > > > > @@ -3091,16 +3106,7 @@ ovn_db_run(struct ic_context *ctx) > > sync_service_monitor(ctx); > > > > ovn_destroy_tnlids(&dp_tnlids); > > - > > - struct shash_node *node; > > - SHASH_FOR_EACH_SAFE (node, &isb_ts_dps) { > > - shash_delete(&isb_ts_dps, node); > > - } > > shash_destroy(&isb_ts_dps); > > - > > - SHASH_FOR_EACH_SAFE (node, &isb_tr_dps) { > > - shash_delete(&isb_tr_dps, node); > > - } > > shash_destroy(&isb_tr_dps); > > } > > > > > > @@ -3507,18 +3513,14 @@ main(int argc, char *argv[]) > > = ovsdb_idl_index_create1(ovnisb_idl_loop.idl, > > > > &icsbrec_port_binding_col_availability_zone); > > > > - struct ovsdb_idl_index *icsbrec_port_binding_by_tr > > + struct ovsdb_idl_index *icsbrec_port_binding_by_ts > > = ovsdb_idl_index_create1(ovnisb_idl_loop.idl, > > > > &icsbrec_port_binding_col_transit_switch); > > > > - struct ovsdb_idl_index *icsbrec_port_binding_by_nb_ic_uuid = > > - ovsdb_idl_index_create1(ovnisb_idl_loop.idl, > > - &icsbrec_port_binding_col_nb_ic_uuid); > > - > > - struct ovsdb_idl_index *icsbrec_port_binding_by_nb_ic_uuid_type = > > - ovsdb_idl_index_create2(ovnisb_idl_loop.idl, > > - &icsbrec_port_binding_col_nb_ic_uuid, > > - &icsbrec_port_binding_col_type); > > + struct ovsdb_idl_index *icsbrec_port_binding_by_ts_az > > + = ovsdb_idl_index_create2(ovnisb_idl_loop.idl, > > + > &icsbrec_port_binding_col_transit_switch, > > + > > &icsbrec_port_binding_col_availability_zone); > > > > struct ovsdb_idl_index *icsbrec_route_by_az > > = ovsdb_idl_index_create1(ovnisb_idl_loop.idl, > > @@ -3607,11 +3609,8 @@ main(int argc, char *argv[]) > > .icnbrec_transit_switch_by_name = > > icnbrec_transit_switch_by_name, > > .icsbrec_port_binding_by_az = > icsbrec_port_binding_by_az, > > - .icsbrec_port_binding_by_tr = > icsbrec_port_binding_by_tr, > > - .icsbrec_port_binding_by_nb_ic_uuid = > > - icsbrec_port_binding_by_nb_ic_uuid, > > - .icsbrec_port_binding_by_nb_ic_uuid_type = > > - icsbrec_port_binding_by_nb_ic_uuid_type, > > + .icsbrec_port_binding_by_ts = > icsbrec_port_binding_by_ts, > > + .icsbrec_port_binding_by_ts_az = > > icsbrec_port_binding_by_ts_az, > > .icsbrec_route_by_az = icsbrec_route_by_az, > > .icsbrec_route_by_ts = icsbrec_route_by_ts, > > .icsbrec_route_by_ts_az = icsbrec_route_by_ts_az, > > diff --git a/ovn-ic-sb.ovsschema b/ovn-ic-sb.ovsschema > > index a11c9a333..8981a4eef 100644 > > --- a/ovn-ic-sb.ovsschema > > +++ b/ovn-ic-sb.ovsschema > > @@ -1,7 +1,7 @@ > > { > > "name": "OVN_IC_Southbound", > > - "version": "2.3.0", > > - "cksum": "3834405974 9713", > > + "version": "2.4.0", > > + "cksum": "859073048 9662", > > "tables": { > > "IC_SB_Global": { > > "columns": { > > @@ -73,7 +73,7 @@ > > "external_ids": { > > "type": {"key": "string", "value": "string", > > "min": 0, "max": "unlimited"}}}, > > - "indexes": [["nb_ic_uuid","tunnel_key"]], > > + "indexes": [["nb_ic_uuid", "tunnel_key"]], > > "isRoot": true}, > > "Port_Binding": { > > "columns": { > > @@ -103,8 +103,7 @@ > > "value": "string", > > "min": 0, > > "max": "unlimited"}}}, > > - "indexes": [["transit_switch", "nb_ic_uuid", "tunnel_key"], > > - ["nb_ic_uuid", "logical_port"]], > > + "indexes": [["transit_switch", "tunnel_key"], > > ["logical_port"]], > > "isRoot": true}, > > "Route": { > > "columns": { > > diff --git a/ovn-ic-sb.xml b/ovn-ic-sb.xml > > index a2a7d13d8..b59fe1d03 100644 > > --- a/ovn-ic-sb.xml > > +++ b/ovn-ic-sb.xml > > @@ -208,9 +208,13 @@ > > </p> > > > > <column name="transit_switch"> > > - The name of the transit logical switch that is configured in the > OVN > > - Interconnection Northbound database's <ref table="Transit_Switch" > > + The name of the transit logical switch or router that is > configured > > in > > + the OVN Interconnection Northbound database's <ref > > table="Transit_Switch" > > + db="OVN_IC_Northbound"/> or <ref table="Transit_Router" > > db="OVN_IC_Northbound"/> table. > > + > > + Note: The name of transit router is stored in the same column due > to > > + the backward compatibility. > > </column> > > > > <column name="type"> > > diff --git a/utilities/ovn-ic-nbctl.c b/utilities/ovn-ic-nbctl.c > > index 24d376559..94d63bd2f 100644 > > --- a/utilities/ovn-ic-nbctl.c > > +++ b/utilities/ovn-ic-nbctl.c > > @@ -494,8 +494,9 @@ ic_nbctl_ts_del(struct ctl_context *ctx) > > const char *id = ctx->argv[1]; > > const struct icnbrec_transit_switch *ts = NULL; > > > > - ctx->error = ts_by_name_or_uuid(ctx, id, must_exist, &ts); > > - if (ctx->error) { > > + char *error = ts_by_name_or_uuid(ctx, id, must_exist, &ts); > > + if (error) { > > + ctx->error = error; > > return; > > } > > if (!ts) { > > > > > > Regards, > > Ales > > Yea, looks good to me. > > Regards, > Mairtin > > Thank you Mairtin, I went ahead and applied the series with the diff above. Regards, Ales _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
