On Tue, Mar 11, 2025 at 11:39 AM Dumitru Ceara <dce...@redhat.com> wrote:
>
> On 3/11/25 4:35 PM, Numan Siddique wrote:
> > On Mon, Mar 10, 2025 at 12:22 PM Dumitru Ceara <dce...@redhat.com> wrote:
> >>
> >> On 2/28/25 10:40 PM, num...@ovn.org wrote:
> >>> From: Numan Siddique <num...@ovn.org>
> >>>
> >>> This flag is added to the external_ids column of SB Datapath_binding
> >>> table only if a logical switch meets the following
> >>> criteria:
> >>>   -  has one or more localnet ports.
> >>>   -  has one or more router ports and all its peers are distributed
> >>>      gateway ports.
> >>>
> >>> ovn-controller in the following patch makes use of this flag.
> >>>
> >>> Signed-off-by: Numan Siddique <num...@ovn.org>
> >>> ---
> >>
> >> Hi Numan,
> >>
> >>>  northd/northd.c     | 31 +++++++++++++++++++++---
> >>>  northd/northd.h     |  4 +++
> >>>  tests/ovn-northd.at | 59 +++++++++++++++++++++++++++++++++++++++++++++
> >>
> >> I think we should document this new external_id in ovn-sb.xml in the
> >> "OVN_Northbound Relationship" section.  It's not that obvious what it
> >> does just from the name, in my opinion.
> >
> > Ack.
> >
> >
> >>
> >>>  3 files changed, 90 insertions(+), 4 deletions(-)
> >>>
> >>> diff --git a/northd/northd.c b/northd/northd.c
> >>> index 488bfdf697..821a653b71 100644
> >>> --- a/northd/northd.c
> >>> +++ b/northd/northd.c
> >>> @@ -781,6 +781,15 @@ ovn_datapath_update_external_ids(struct ovn_datapath 
> >>> *od)
> >>>              smap_add_format(&ids, "fdb_age_threshold",
> >>>                              "%u", age_threshold);
> >>>          }
> >>> +
> >>> +        /* Add the flag 'only_dgp_peer_ports=true' to the SB datapath's
> >>> +         * external_ids if
> >>> +         *   - It has (a) localnet port(s) and
> >>> +         *   - All its logical router ports' peers are DGPs. */
> >>> +        if (od->n_router_ports && od->n_router_ports == 
> >>> od->n_peer_dgw_ports
> >>> +            && od->n_localnet_ports) {
> >>> +            smap_add(&ids, "only_dgp_peer_ports", "true");
> >>
> >> Nit: this feels a bit inaccurate.  As the comment itself says the switch
> >> has N+M non-VIF ports out of which N are peers of DGPs and M are
> >> localnet.  I don't have a better suggestion however.  I was thinking of
> >> "needs_peer_datapaths" but that's also a bit ugly.  If we can't find a
> >> better name we can leave it as "only_dgp_peer_ports"
> >>
> >
> > Yeah,  I couldn't find a better name.  Initially I thought of using
> > "pure_provider_switch" to
> > indicate this logical switch has only dgp ports and localnet ports.
> > But I didn't like the name :)
> >
>
> I think I like that one more but OK. :)

If "pure_provider_switch" is fine with you,  then I'm fine with it.
I'll change it in the next version.
I initially liked it.  But I was not sure if others would be fine with
it or not :)

Numan


>
> >
> > I'll keep thinking for a better name.
> >>> +        }
> >>>      }
> >>>
> >>>      /* Set snat-ct-zone */
> >>> @@ -867,6 +876,20 @@ parse_dynamic_routing_redistribute(
> >>>      return out;
> >>>  }
> >>>
> >>> +static void
> >>> +update_datapaths_external_ids(struct ovn_datapaths *ls_datapaths,
> >>> +                              struct ovn_datapaths *lr_datapaths)
> >>> +{
> >>> +    struct ovn_datapath *od;
> >>> +    HMAP_FOR_EACH (od, key_node, &ls_datapaths->datapaths) {
> >>> +        ovn_datapath_update_external_ids(od);
> >>> +    }
> >>> +
> >>> +    HMAP_FOR_EACH (od, key_node, &lr_datapaths->datapaths) {
> >>> +        ovn_datapath_update_external_ids(od);
> >>> +    }
> >>> +}
> >>> +
> >>>  static void
> >>>  join_datapaths(const struct nbrec_logical_switch_table *nbrec_ls_table,
> >>>                 const struct nbrec_logical_router_table *nbrec_lr_table,
> >>> @@ -919,7 +942,6 @@ join_datapaths(const struct 
> >>> nbrec_logical_switch_table *nbrec_ls_table,
> >>>              od->nbs = nbs;
> >>>              ovs_list_remove(&od->list);
> >>>              ovs_list_push_back(both, &od->list);
> >>> -            ovn_datapath_update_external_ids(od);
> >>>          } else {
> >>>              od = ovn_datapath_create(datapaths, &nbs->header_.uuid,
> >>>                                       nbs, NULL, NULL);
> >>> @@ -947,7 +969,6 @@ join_datapaths(const struct 
> >>> nbrec_logical_switch_table *nbrec_ls_table,
> >>>                  od->nbr = nbr;
> >>>                  ovs_list_remove(&od->list);
> >>>                  ovs_list_push_back(both, &od->list);
> >>> -                ovn_datapath_update_external_ids(od);
> >>>              } else {
> >>>                  /* Can't happen! */
> >>>                  static struct vlog_rate_limit rl = 
> >>> VLOG_RATE_LIMIT_INIT(5, 1);
> >>> @@ -1121,11 +1142,9 @@ build_datapaths(struct ovsdb_idl_txn *ovnsb_txn,
> >>>          if (od->sb->tunnel_key != od->tunnel_key) {
> >>>              sbrec_datapath_binding_set_tunnel_key(od->sb, 
> >>> od->tunnel_key);
> >>>          }
> >>> -        ovn_datapath_update_external_ids(od);
> >>>      }
> >>>      LIST_FOR_EACH (od, list, &nb_only) {
> >>>          od->sb = sbrec_datapath_binding_insert(ovnsb_txn);
> >>> -        ovn_datapath_update_external_ids(od);
> >>>          sbrec_datapath_binding_set_tunnel_key(od->sb, od->tunnel_key);
> >>>      }
> >>>      ovn_destroy_tnlids(&dp_tnlids);
> >>> @@ -2580,6 +2599,8 @@ join_logical_ports(const struct 
> >>> sbrec_port_binding_table *sbrec_pb_table,
> >>>              /* Only used for the router type LSP whose peer is 
> >>> l3dgw_port */
> >>>              op->peer->enable_router_port_acl = smap_get_bool(
> >>>                      &op->peer->nbsp->options, "enable_router_port_acl", 
> >>> false);
> >>> +
> >>> +            op->peer->od->n_peer_dgw_ports++;
> >>>          }
> >>>      }
> >>>
> >>> @@ -18832,6 +18853,8 @@ ovnnb_db_run(struct northd_input *input_data,
> >>>                  input_data->sbrec_ha_chassis_grp_by_name,
> >>>                  &data->ls_datapaths.datapaths, 
> >>> &data->lr_datapaths.datapaths,
> >>>                  &data->ls_ports, &data->lr_ports);
> >>> +    update_datapaths_external_ids(&data->ls_datapaths,
> >>> +                                  &data->lr_datapaths);
> >>>      build_lb_port_related_data(ovnsb_txn,
> >>>                                 input_data->sbrec_service_monitor_table,
> >>>                                 input_data->svc_monitor_mac,
> >>> diff --git a/northd/northd.h b/northd/northd.h
> >>> index 1a7afe9027..0f7d4c3432 100644
> >>> --- a/northd/northd.h
> >>> +++ b/northd/northd.h
> >>> @@ -373,6 +373,10 @@ struct ovn_datapath {
> >>>      size_t n_router_ports;
> >>>      size_t n_allocated_router_ports;
> >>>
> >>> +    /* Indicates the number of router port's peers which are distributed
> >>> +     * gateway ports (DGPs). */
> >>> +    size_t n_peer_dgw_ports;
> >>> +
> >>>      struct hmap port_tnlids;
> >>>      uint32_t port_key_hint;
> >>>
> >>> diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
> >>> index ee3103d44a..3ec2afa588 100644
> >>> --- a/tests/ovn-northd.at
> >>> +++ b/tests/ovn-northd.at
> >>> @@ -14656,6 +14656,65 @@ check rbr_match_custom
> >>>
> >>>  AT_CLEANUP
> >>>
> >>> +OVN_FOR_EACH_NORTHD_NO_HV([
> >>> +AT_SETUP([ovn-northd -- only_dgp_peer_ports flag in SB datapath_binding])
> >>> +ovn_start
> >>> +
> >>> +check ovn-nbctl ls-add sw0
> >>> +check ovn-nbctl --wait=sb sync
> >>> +
> >>> +# Check that there is no option "only_dgp_peer_ports" in the
> >>> +# SB.datapath_binding's external_ids.
> >>> +AT_CHECK([ovn-sbctl get datapath_binding sw0 
> >>> external_ids:only_dgp_peer_ports], [1], [ignore], [ignore])
> >>> +
> >>> +# only_dgp_peer_ports flag will be set in the SB:datapath_binding's 
> >>> external_ids
> >>> +# only if the logical switch has
> >>> +#  -  one or more localnet ports.
> >>> +#  -  All its router ports' peeers are DGPs if one or more router
> >>> +#     ports are present.
> >>> +
> >>> +check ovn-nbctl --wait=sb lsp-add sw0 ln-sw0 -- lsp-set-type ln-sw0 
> >>> localnet
> >>> +
> >>> +AT_CHECK([ovn-sbctl get datapath_binding sw0 
> >>> external_ids:only_dgp_peer_ports], [1], [ignore], [ignore])
> >>> +
> >>> +check ovn-nbctl lsp-add sw0 sw0-lr0 -- lsp-set-type sw0-lr0 router
> >>> +check ovn-nbctl --wait=sb lsp-set-options sw0-lr0 router-port=lr0-sw0
> >>> +
> >>> +AT_CHECK([ovn-sbctl get datapath_binding sw0 
> >>> external_ids:only_dgp_peer_ports], [1], [ignore], [ignore])
> >>> +
> >>> +check ovn-nbctl lr-add lr0
> >>> +check ovn-nbctl --wait=sb lrp-add lr0 lr0-sw0 00:00:02:01:02:03 
> >>> 172.16.1.1/24
> >>> +
> >>> +AT_CHECK([ovn-sbctl get datapath_binding sw0 
> >>> external_ids:only_dgp_peer_ports], [1], [ignore], [ignore])
> >>> +
> >>> +check ovn-nbctl --wait=sb lrp-set-gateway-chassis lr0-sw0 ovn-gw-1
> >>> +AT_CHECK([ovn-sbctl get datapath_binding sw0 
> >>> external_ids:only_dgp_peer_ports], [0], [dnl
> >>> +"true"
> >>> +])
> >>
> >> Nit: we could use fetch_column.
> > I tried fetch_column,  but it didn't seem to work for external_ids:<key> .
> > I'll see if I can use it.  Maybe I was doing something wrong.
> >
>
> Maybe it's easier with check_row_count?  We do the following in some tests:
>
> check_row_count nb:NAT 1 options:stateless=true
>
> > Thanks
> > Numan
> >
> >>
> >>> +
> >>> +check ovn-nbctl lsp-add sw0 sw0-lr1 -- lsp-set-type sw0-lr1 router
> >>> +check ovn-nbctl --wait=sb lsp-set-options sw0-lr1 router-port=lr1-sw0
> >>> +check ovn-nbctl lr-add lr1
> >>> +check ovn-nbctl --wait=sb lrp-add lr1 lr1-sw0 00:00:02:01:02:03 
> >>> 172.16.1.1/24
> >>> +
> >>> +AT_CHECK([ovn-sbctl get datapath_binding sw0 
> >>> external_ids:only_dgp_peer_ports], [1], [ignore], [ignore])
> >>> +
> >>> +check ovn-nbctl --wait=sb lrp-set-gateway-chassis lr1-sw0 ovn-gw-1
> >>> +AT_CHECK([ovn-sbctl get datapath_binding sw0 
> >>> external_ids:only_dgp_peer_ports], [0], [dnl
> >>> +"true"
> >>> +])
> >>
> >> Nit: we could use fetch_column.
> >>
> >>> +
> >>> +# Just add a normal port.
> >>> +check ovn-nbctl --wait=sb lsp-add sw0 sw0p1
> >>> +
> >>> +check ovn-nbctl --wait=sb lrp-set-gateway-chassis lr1-sw0 ovn-gw-1
> >>> +AT_CHECK([ovn-sbctl get datapath_binding sw0 
> >>> external_ids:only_dgp_peer_ports], [0], [dnl
> >>> +"true"
> >>> +])
> >>
> >> Nit: we could use fetch_column.
> >>
> >>> +
> >>> +AT_CLEANUP
> >>> +])
> >>> +
> >>>  OVN_FOR_EACH_NORTHD_NO_HV([
> >>>  AT_SETUP([ACL mismatched tiers])
> >>>  ovn_start
> >>
> >> Regards,
> >> Dumitru
> >>
> >>
> >
>
> Regards,
> Dumitru
>
>
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to