On Tue, Jan 30, 2024 at 10:08 PM Mark Michelson <mmich...@redhat.com> wrote:

> Service monitors already had the restriction that chassis could not
> insert or delete records. However, there was nothing restricting chassis
> from updating records for service monitors that are relevant to other
> chassis.
>
> This change adds a new "chassis_name" column to the Service_Monitor
> table. ovn-northd will set this column to the chassis on which the
> relevant logical port is bound. This way, only that particular chassis
> can update the status of the service monitor.
>
> Signed-off-by: Mark Michelson <mmich...@redhat.com>
> ---
> v1 -> v2:
>     * Rebased on top of currrent main
> ---
>  northd/northd.c     | 19 +++++++++++++++++--
>  northd/ovn-northd.c |  2 +-
>  ovn-sb.ovsschema    |  5 +++--
>  ovn-sb.xml          |  4 ++++
>  4 files changed, 25 insertions(+), 5 deletions(-)
>
> diff --git a/northd/northd.c b/northd/northd.c
> index d2091d4bc..2a2fab231 100644
> --- a/northd/northd.c
> +++ b/northd/northd.c
> @@ -3799,13 +3799,19 @@ static struct service_monitor_info *
>  create_or_get_service_mon(struct ovsdb_idl_txn *ovnsb_txn,
>                            struct hmap *monitor_map,
>                            const char *ip, const char *logical_port,
> -                          uint16_t service_port, const char *protocol)
> +                          uint16_t service_port, const char *protocol,
> +                          const char *chassis_name)
>  {
>      struct service_monitor_info *mon_info =
>          get_service_mon(monitor_map, ip, logical_port, service_port,
>                          protocol);
>
>      if (mon_info) {
> +        if (chassis_name && strcmp(mon_info->sbrec_mon->chassis_name,
> +                                   chassis_name)) {
> +            sbrec_service_monitor_set_chassis_name(mon_info->sbrec_mon,
> +                                                   chassis_name);
> +        }
>          return mon_info;
>      }
>
> @@ -3820,6 +3826,9 @@ create_or_get_service_mon(struct ovsdb_idl_txn
> *ovnsb_txn,
>      sbrec_service_monitor_set_port(sbrec_mon, service_port);
>      sbrec_service_monitor_set_logical_port(sbrec_mon, logical_port);
>      sbrec_service_monitor_set_protocol(sbrec_mon, protocol);
> +    if (chassis_name) {
> +        sbrec_service_monitor_set_chassis_name(sbrec_mon, chassis_name);
> +    }
>      mon_info = xzalloc(sizeof *mon_info);
>      mon_info->sbrec_mon = sbrec_mon;
>      hmap_insert(monitor_map, &mon_info->hmap_node, hash);
> @@ -3862,12 +3871,18 @@ ovn_lb_svc_create(struct ovsdb_idl_txn *ovnsb_txn,
>                  protocol = "tcp";
>              }
>
> +            const char *chassis_name = NULL;
> +            if (op->sb && op->sb->chassis) {
> +                chassis_name = op->sb->chassis->name;
> +            }
> +
>              struct service_monitor_info *mon_info =
>                  create_or_get_service_mon(ovnsb_txn, monitor_map,
>                                            backend->ip_str,
>                                            backend_nb->logical_port,
>                                            backend->port,
> -                                          protocol);
> +                                          protocol,
> +                                          chassis_name);
>              ovs_assert(mon_info);
>              sbrec_service_monitor_set_options(
>                  mon_info->sbrec_mon,
> &lb_vip_nb->lb_health_check->options);
> diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c
> index dadc1af38..c32a11cbd 100644
> --- a/northd/ovn-northd.c
> +++ b/northd/ovn-northd.c
> @@ -114,7 +114,7 @@ static const char *rbac_mac_binding_update[] =
>      {"logical_port", "ip", "mac", "datapath", "timestamp"};
>
>  static const char *rbac_svc_monitor_auth[] =
> -    {""};
> +    {"chassis_name"};
>  static const char *rbac_svc_monitor_auth_update[] =
>      {"status"};
>  static const char *rbac_igmp_group_auth[] =
> diff --git a/ovn-sb.ovsschema b/ovn-sb.ovsschema
> index 72e230b75..1d2b3028d 100644
> --- a/ovn-sb.ovsschema
> +++ b/ovn-sb.ovsschema
> @@ -1,7 +1,7 @@
>  {
>      "name": "OVN_Southbound",
> -    "version": "20.30.0",
> -    "cksum": "2972392849 31172",
> +    "version": "20.31.0",
> +    "cksum": "2473562445 31224",
>      "tables": {
>          "SB_Global": {
>              "columns": {
> @@ -509,6 +509,7 @@
>                  "logical_port": {"type": "string"},
>                  "src_mac": {"type": "string"},
>                  "src_ip": {"type": "string"},
> +                "chassis_name": {"type": "string"},
>                  "status": {
>                      "type": {"key": {"type": "string",
>                               "enum": ["set", ["online", "offline",
> "error"]]},
> diff --git a/ovn-sb.xml b/ovn-sb.xml
> index e393f92b3..1f3b318e0 100644
> --- a/ovn-sb.xml
> +++ b/ovn-sb.xml
> @@ -4815,6 +4815,10 @@ tcp.flags = RST;
>          Source IPv4 address to use in the service monitor packet.
>        </column>
>
> +      <column name="chassis_name">
> +        The name of the chassis where the logical port is bound.
> +      </column>
> +
>        <column name="options" key="interval" type='{"type": "integer"}'>
>          The interval, in seconds, between service monitor checks.
>        </column>
> --
> 2.43.0
>
> _______________________________________________
> dev mailing list
> d...@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
>
Looks good to me, thanks.

Acked-by: Ales Musil <amu...@redhat.com>

-- 

Ales Musil

Senior Software Engineer - OVN Core

Red Hat EMEA <https://www.redhat.com>

amu...@redhat.com
<https://red.ht/sig>
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to