ack, ok, from that point of view, current name makes more sense IMO.

Thank you.

On Thu, Jul 20, 2017 at 6:22 PM, Anil Venkata <anilvenk...@redhat.com>
wrote:

> Thanks Miguel.
> lrp-set-gateway-chassis is also used for updating the priority.
> User can initially set priority to some value and later can update with
> another value.
> For example, user can add chassis with priority 5, later can update it to
> 10
> ovn-nbctl lrp-set-gateway-chassis lrp0 chassis1 5
> ovn-nbctl lrp-set-gateway-chassis lrp0 chassis1 10
>
> Thanks
> Anil
>
> On Thu, Jul 20, 2017 at 9:14 PM, Miguel Angel Ajo Pelayo <
> majop...@redhat.com> wrote:
>
>> One last comment, sorry to come late with more comments:
>>
>> if lrp-set-gateway-chassis  is additive, shouldn't we rename it to:
>>
>> lrp-add-gateway-chassis ?
>>
>> Thanks, and best regards
>>
>> On Tue, Jul 18, 2017 at 8:05 AM, Venkata Anil Kommaddi <
>> vkomm...@redhat.com> wrote:
>>
>>> From: Venkata Anil <vkomm...@redhat.com>
>>>
>>> This change adds commands to set, get and delete gateway chassis
>>> for logical router port.
>>>
>>> Signed-off-by: Venkata Anil Kommaddi <vkomm...@redhat.com>
>>> ---
>>>  ovn/utilities/ovn-nbctl.8.xml |  21 +++++
>>>  ovn/utilities/ovn-nbctl.c     | 178 ++++++++++++++++++++++++++++++
>>> ++++++++++++
>>>  tests/ovn-nbctl.at            |  52 ++++++++++++
>>>  3 files changed, 251 insertions(+)
>>>
>>> diff --git a/ovn/utilities/ovn-nbctl.8.xml
>>> b/ovn/utilities/ovn-nbctl.8.xml
>>> index 15012af..ea4c5bb 100644
>>> --- a/ovn/utilities/ovn-nbctl.8.xml
>>> +++ b/ovn/utilities/ovn-nbctl.8.xml
>>> @@ -389,6 +389,27 @@
>>>          Prints the administrative state of <var>port</var>, either
>>>          <code>enabled</code> or <code>disabled</code>.
>>>        </dd>
>>> +
>>> +      <dt><code>lrp-set-gateway-chassis</code> <var>port</var>
>>> <var>chassis</var> [<var>priority</var>]</dt>
>>> +      <dd>
>>> +       Set gateway chassis for <var>port</var>. <var>chassis</var>
>>> +       is the name of the chassis. This creates a gateway chassis entry
>>> +       in Gateway_Chassis table. It won't check if chassis really exists
>>> +       in OVN_Southbound database. Priority will be set to 0
>>> +       if <var>priority</var> is not provided by user.
>>> <var>priority</var>
>>> +       must be between <code>0</code> and <code>32767</code>, inclusive.
>>> +      </dd>
>>> +      <dt><code>lrp-del-gateway-chassis</code> <var>port</var>
>>> <var>chassis</var></dt>
>>> +      <dd>
>>> +       Deletes gateway chassis from <var>port</var>.  It is an error if
>>> +       gateway chassis with <var>chassis</var> for <var>port</var> does
>>> +        not exist.
>>> +      </dd>
>>> +      <dt><code>lrp-get-gateway-chassis</code> <var>port</var></dt>
>>> +      <dd>
>>> +        Lists all the gateway chassis with priority within
>>> <var>port</var> on
>>> +        standard output, one per line, ordered based on priority.
>>> +      </dd>
>>>      </dl>
>>>
>>>      <h1>Logical Router Static Route Commands</h1>
>>> diff --git a/ovn/utilities/ovn-nbctl.c b/ovn/utilities/ovn-nbctl.c
>>> index 0488318..0b48949 100644
>>> --- a/ovn/utilities/ovn-nbctl.c
>>> +++ b/ovn/utilities/ovn-nbctl.c
>>> @@ -376,6 +376,13 @@ Logical router commands:\n\
>>>  Logical router port commands:\n\
>>>    lrp-add ROUTER PORT MAC NETWORK... [peer=PEER]\n\
>>>                              add logical port PORT on ROUTER\n\
>>> +  lrp-set-gateway-chassis PORT CHASSIS [PRIORITY]\n\
>>> +                            set gateway chassis for port PORT\n\
>>> +  lrp-del-gateway-chassis PORT CHASSIS\n\
>>> +                            delete gateway chassis from port PORT\n\
>>> +  lrp-get-gateway-chassis PORT\n\
>>> +                            print the names of all gateway chassis on
>>> PORT\n\
>>> +                            with PRIORITY\n\
>>>    lrp-del PORT              delete PORT from its attached router\n\
>>>    lrp-list ROUTER           print the names of all ports on ROUTER\n\
>>>    lrp-set-enabled PORT STATE\n\
>>> @@ -2528,6 +2535,170 @@ lr_get_name(const struct nbrec_logical_router
>>> *lr, char uuid_s[UUID_LEN + 1],
>>>      return uuid_s;
>>>  }
>>>
>>> +static const struct nbrec_gateway_chassis*
>>> +gc_by_name_or_uuid(struct ctl_context *ctx, const char *id, bool
>>> must_exist)
>>> +{
>>> +    const struct nbrec_gateway_chassis *gc = NULL;
>>> +
>>> +    struct uuid gc_uuid;
>>> +    bool is_uuid = uuid_from_string(&gc_uuid, id);
>>> +    if (is_uuid) {
>>> +        gc = nbrec_gateway_chassis_get_for_uuid(ctx->idl, &gc_uuid);
>>> +    }
>>> +
>>> +    if (!gc) {
>>> +        NBREC_GATEWAY_CHASSIS_FOR_EACH (gc, ctx->idl) {
>>> +            if (!strcmp(gc->name, id)) {
>>> +                break;
>>> +            }
>>> +        }
>>> +    }
>>> +
>>> +    if (!gc && must_exist) {
>>> +        ctl_fatal("%s: gateway chassis %s not found", id,
>>> +                  is_uuid ? "UUID" : "name");
>>> +    }
>>> +
>>> +    return gc;
>>> +}
>>> +
>>> +static void
>>> +nbctl_lrp_set_gateway_chassis(struct ctl_context *ctx)
>>> +{
>>> +    const char *gc_name;
>>> +    int64_t priority = 0;
>>> +    const char *lrp_name = ctx->argv[1];
>>> +    const struct nbrec_logical_router_port *lrp;
>>> +    lrp = lrp_by_name_or_uuid(ctx, lrp_name, true);
>>> +    if (!lrp) {
>>> +        ctl_fatal("router port %s is required", lrp_name);
>>> +        return;
>>> +    }
>>> +
>>> +    const char *chassis_name = ctx->argv[2];
>>> +    if (ctx->argv[3]) {
>>> +        priority = parse_priority(ctx->argv[3]);
>>> +    }
>>> +
>>> +    gc_name = xasprintf("%s-%s", lrp_name, chassis_name);
>>> +    const struct nbrec_gateway_chassis *gc;
>>> +    gc = gc_by_name_or_uuid(ctx, gc_name, false);
>>> +    if (gc) {
>>> +        nbrec_gateway_chassis_set_priority(gc, priority);
>>> +        return;
>>> +    }
>>> +
>>> +    /* Create the logical gateway chassis. */
>>> +    gc = nbrec_gateway_chassis_insert(ctx->txn);
>>> +    nbrec_gateway_chassis_set_name(gc, gc_name);
>>> +    nbrec_gateway_chassis_set_chassis_name(gc, chassis_name);
>>> +    nbrec_gateway_chassis_set_priority(gc, priority);
>>> +
>>> +    /* Insert the logical gateway chassis into the logical router port.
>>> */
>>> +    nbrec_logical_router_port_verify_gateway_chassis(lrp);
>>> +    struct nbrec_gateway_chassis **new_gc = xmalloc(
>>> +        sizeof *new_gc * (lrp->n_gateway_chassis + 1));
>>> +    nullable_memcpy(new_gc, lrp->gateway_chassis,
>>> +                    sizeof *new_gc * lrp->n_gateway_chassis);
>>> +    new_gc[lrp->n_gateway_chassis] = CONST_CAST(
>>> +        struct nbrec_gateway_chassis *, gc);
>>> +    nbrec_logical_router_port_set_gateway_chassis(
>>> +        lrp, new_gc, lrp->n_gateway_chassis + 1);
>>> +    free(new_gc);
>>> +}
>>> +
>>> +/* Removes logical router port 'lrp->gateway_chassis[idx]'. */
>>> +static void
>>> +remove_gc(const struct nbrec_logical_router_port *lrp, size_t idx)
>>> +{
>>> +    const struct nbrec_gateway_chassis *gc = lrp->gateway_chassis[idx];
>>> +    /* First remove 'gc' from the array of gateway_chassis.  This is
>>> what will
>>> +     * actually cause the gateway chassis to be deleted when the
>>> transaction is
>>> +     * sent to the database server (due to garbage collection). */
>>> +    struct nbrec_gateway_chassis **new_gc
>>> +        = xmemdup(lrp->gateway_chassis,
>>> +                  sizeof *new_gc * lrp->n_gateway_chassis);
>>> +    new_gc[idx] = new_gc[lrp->n_gateway_chassis - 1];
>>> +    nbrec_logical_router_port_verify_gateway_chassis(lrp);
>>> +    nbrec_logical_router_port_set_gateway_chassis(
>>> +        lrp, new_gc, lrp->n_gateway_chassis - 1);
>>> +    free(new_gc);
>>> +
>>> +    /* Delete 'gc' from the IDL.  This won't have a real effect on
>>> +     * the database server (the IDL will suppress it in fact) but it
>>> +     * means that it won't show up when we iterate with
>>> +     * NBREC_GATEWAY_CHASSIS_FOR_EACH later. */
>>> +    nbrec_gateway_chassis_delete(gc);
>>> +}
>>> +
>>> +static void
>>> +nbctl_lrp_del_gateway_chassis(struct ctl_context *ctx)
>>> +{
>>> +    const struct nbrec_logical_router_port *lrp;
>>> +    lrp = lrp_by_name_or_uuid(ctx, ctx->argv[1], true);
>>> +    if (!lrp) {
>>> +        return;
>>> +    }
>>> +    /* Find the lrp that contains 'gc', then delete it. */
>>> +    const char *chassis_name = ctx->argv[2];
>>> +    for (size_t i = 0; i < lrp->n_gateway_chassis; i++) {
>>> +        if (!strncmp(lrp->gateway_chassis[i]->chassis_name,
>>> +                    chassis_name,
>>> +                    strlen(lrp->gateway_chassis[i]->chassis_name))) {
>>> +            remove_gc(lrp, i);
>>> +            return;
>>> +        }
>>> +    }
>>> +
>>> +    /* Can't happen because of the database schema. */
>>> +    ctl_fatal("chassis %s is not added to logical port %s",
>>> +              chassis_name, ctx->argv[1]);
>>> +}
>>> +
>>> +/* gateway_chassis ordering
>>> + *  */
>>> +static int
>>> +compare_chassis_prio_(const void *gc1_, const void *gc2_)
>>> +{
>>> +    const struct nbrec_gateway_chassis *const *gc1p = gc1_;
>>> +    const struct nbrec_gateway_chassis *const *gc2p = gc2_;
>>> +    const struct nbrec_gateway_chassis *gc1 = *gc1p;
>>> +    const struct nbrec_gateway_chassis *gc2 = *gc2p;
>>> +
>>> +    int prio_diff = gc2->priority - gc1->priority;
>>> +    if (!prio_diff) {
>>> +        return strcmp(gc2->name, gc1->name);
>>> +    }
>>> +    return prio_diff;
>>> +}
>>> +
>>> +/* Print a list of gateway chassis. */
>>> +static void
>>> +nbctl_lrp_get_gateway_chassis(struct ctl_context *ctx)
>>> +{
>>> +    const char *id = ctx->argv[1];
>>> +    const struct nbrec_logical_router_port *lrp;
>>> +    const struct nbrec_gateway_chassis **gcs;
>>> +    size_t i;
>>> +
>>> +    lrp = lrp_by_name_or_uuid(ctx, id, true);
>>> +
>>> +    gcs = xmalloc(sizeof *gcs * lrp->n_gateway_chassis);
>>> +    for (i = 0; i < lrp->n_gateway_chassis; i++) {
>>> +        gcs[i] = lrp->gateway_chassis[i];
>>> +    }
>>> +
>>> +    qsort(gcs, lrp->n_gateway_chassis, sizeof *gcs,
>>> compare_chassis_prio_);
>>> +
>>> +    for (i = 0; i < lrp->n_gateway_chassis; i++) {
>>> +        const struct nbrec_gateway_chassis *gc = gcs[i];
>>> +        ds_put_format(&ctx->output, "%s %5"PRId64"\n",
>>> +                      gc->name, gc->priority);
>>> +    }
>>> +
>>> +    free(gcs);
>>> +}
>>> +
>>>  static void
>>>  nbctl_lrp_add(struct ctl_context *ctx)
>>>  {
>>> @@ -3413,6 +3584,13 @@ static const struct ctl_command_syntax
>>> nbctl_commands[] = {
>>>      { "lrp-add", 4, INT_MAX,
>>>        "ROUTER PORT MAC NETWORK... [COLUMN[:KEY]=VALUE]...",
>>>        NULL, nbctl_lrp_add, NULL, "--may-exist", RW },
>>> +    { "lrp-set-gateway-chassis", 2, 3,
>>> +      "PORT CHASSIS [PRIORITY]",
>>> +      NULL, nbctl_lrp_set_gateway_chassis, NULL, "--may-exist", RW },
>>> +    { "lrp-del-gateway-chassis", 2, 2, "PORT CHASSIS", NULL,
>>> +      nbctl_lrp_del_gateway_chassis, NULL, "", RW },
>>> +    { "lrp-get-gateway-chassis", 1, 1, "PORT", NULL,
>>> +      nbctl_lrp_get_gateway_chassis, NULL, "", RO },
>>>      { "lrp-del", 1, 1, "PORT", NULL, nbctl_lrp_del, NULL,
>>> "--if-exists", RW },
>>>      { "lrp-list", 1, 1, "ROUTER", NULL, nbctl_lrp_list, NULL, "", RO },
>>>      { "lrp-set-enabled", 2, 2, "PORT STATE", NULL,
>>> nbctl_lrp_set_enabled,
>>> diff --git a/tests/ovn-nbctl.at b/tests/ovn-nbctl.at
>>> index 975d702..ded21fc 100644
>>> --- a/tests/ovn-nbctl.at
>>> +++ b/tests/ovn-nbctl.at
>>> @@ -756,6 +756,58 @@ AT_CLEANUP
>>>
>>>  dnl ------------------------------------------------------------
>>> ---------
>>>
>>> +AT_SETUP([ovn-nbctl - logical router port gateway chassis])
>>> +OVN_NBCTL_TEST_START
>>> +AT_CHECK([ovn-nbctl lr-add lr0])
>>> +AT_CHECK([ovn-nbctl lrp-add lr0 lrp0 00:00:00:01:02:03 192.168.1.1/24])
>>> +AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lrp0], [0], [])
>>> +
>>> +AT_CHECK([ovn-nbctl lrp-set-gateway-chassis lp0 chassis1], [1], [],
>>> +[ovn-nbctl: lp0: port name not found
>>> +])
>>> +
>>> +AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lp0], [1], [],
>>> +[ovn-nbctl: lp0: port name not found
>>> +])
>>> +
>>> +AT_CHECK([ovn-nbctl lrp-del-gateway-chassis lp0 chassis1], [1], [],
>>> +[ovn-nbctl: lp0: port name not found
>>> +])
>>> +
>>> +AT_CHECK([ovn-nbctl lrp-del-gateway-chassis lrp0 chassis1], [1], [],
>>> +[ovn-nbctl: chassis chassis1 is not added to logical port lrp0
>>> +])
>>> +AT_CHECK([ovn-nbctl lrp-set-gateway-chassis lrp0 chassis1])
>>> +
>>> +AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lrp0], [0], [dnl
>>> +lrp0-chassis1     0
>>> +])
>>> +AT_CHECK([ovn-nbctl lrp-set-gateway-chassis lrp0 chassis1 10])
>>> +
>>> +AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lrp0], [0], [dnl
>>> +lrp0-chassis1    10
>>> +])
>>> +AT_CHECK([ovn-nbctl lrp-set-gateway-chassis lrp0 chassis1 20])
>>> +
>>> +AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lrp0], [0], [dnl
>>> +lrp0-chassis1    20
>>> +])
>>> +AT_CHECK([ovn-nbctl lrp-set-gateway-chassis lrp0 chassis2 5])
>>> +AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lrp0], [0], [dnl
>>> +lrp0-chassis1    20
>>> +lrp0-chassis2     5
>>> +])
>>> +
>>> +AT_CHECK([ovn-nbctl lrp-del-gateway-chassis lrp0 chassis1])
>>> +AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lrp0], [0], [dnl
>>> +lrp0-chassis2     5
>>> +])
>>> +
>>> +OVN_NBCTL_TEST_STOP
>>> +AT_CLEANUP
>>> +
>>> +dnl ------------------------------------------------------------
>>> ---------
>>> +
>>>  AT_SETUP([ovn-nbctl - logical router port enable and disable])
>>>  OVN_NBCTL_TEST_START
>>>
>>> --
>>> 2.9.4
>>>
>>> _______________________________________________
>>> dev mailing list
>>> d...@openvswitch.org
>>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>>>
>>
>>
>
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to