diff mbox series

[ovs-dev,OVN,v6] ovn-nbctl.c: Add an optional way to delete QoS by uuid

Message ID 20200509071933.104194-1-taoyunxiang@cmss.chinamobile.com
State Superseded
Headers show
Series [ovs-dev,OVN,v6] ovn-nbctl.c: Add an optional way to delete QoS by uuid | expand

Commit Message

Tao YunXiang May 9, 2020, 7:19 a.m. UTC
We can delete qos by specify ls and more parameters.
If CMS want to delete it exactly, it must specify detailed "match" field.
It's not an easy way, also maybe deleted by mistake.
This change adds a way to specify ls and uuid, which is optional.
You can still use the previous method to delete.

usage:
ovn-nbctl qos-del ls0 [UUID0]

Author: Tao YunXiang <taoyunxiang@cmss.chinamobile.com>
Co-authored-by: Liu Chang <liuchang@cmss.chinamobile.com>
Co-authored-by: Rong Yin <rongyin@cmss.chinamobile.com>
Signed-off-by: Tao YunXiang <taoyunxiang@cmss.chinamobile.com>
Signed-off-by: Liu Chang <liuchang@cmss.chinamobile.com>
Signed-off-by: Rong Yin <rongyin@cmss.chinamobile.com>

---
v5: ovn-nbctl.c: Add an optional way to delete QoS by uuid
v4: Add a way to delete QoS by its name or uuid
v3: ovn-nbctl.c: Add a way to delete QoS by its name or uuid
---
 tests/ovn-nbctl.at        |  7 +++++--
 utilities/ovn-nbctl.8.xml | 19 +++++++++++++------
 utilities/ovn-nbctl.c     | 39 ++++++++++++++++++++++++++++-----------
 3 files changed, 46 insertions(+), 19 deletions(-)

Comments

Numan Siddique May 9, 2020, 7:34 a.m. UTC | #1
On Sat, May 9, 2020 at 12:57 PM Tao YunXiang <
taoyunxiang@cmss.chinamobile.com> wrote:

> We can delete qos by specify ls and more parameters.
> If CMS want to delete it exactly, it must specify detailed "match" field.
> It's not an easy way, also maybe deleted by mistake.
> This change adds a way to specify ls and uuid, which is optional.
> You can still use the previous method to delete.
>
> usage:
> ovn-nbctl qos-del ls0 [UUID0]
>
> Author: Tao YunXiang <taoyunxiang@cmss.chinamobile.com>
> Co-authored-by: Liu Chang <liuchang@cmss.chinamobile.com>
> Co-authored-by: Rong Yin <rongyin@cmss.chinamobile.com>
> Signed-off-by: Tao YunXiang <taoyunxiang@cmss.chinamobile.com>
> Signed-off-by: Liu Chang <liuchang@cmss.chinamobile.com>
> Signed-off-by: Rong Yin <rongyin@cmss.chinamobile.com>
>
> ---
> v5: ovn-nbctl.c: Add an optional way to delete QoS by uuid
> v4: Add a way to delete QoS by its name or uuid
> v3: ovn-nbctl.c: Add a way to delete QoS by its name or uuid
> ---
>  tests/ovn-nbctl.at        |  7 +++++--
>  utilities/ovn-nbctl.8.xml | 19 +++++++++++++------
>  utilities/ovn-nbctl.c     | 39 ++++++++++++++++++++++++++++-----------
>  3 files changed, 46 insertions(+), 19 deletions(-)
>
> diff --git a/tests/ovn-nbctl.at b/tests/ovn-nbctl.at
> index 1187fe3e1..12c4daca6 100644
> --- a/tests/ovn-nbctl.at
> +++ b/tests/ovn-nbctl.at
> @@ -308,13 +308,16 @@ AT_CHECK([ovn-nbctl qos-list ls0], [0], [dnl
>
>  AT_CHECK([ovn-nbctl qos-add ls0 from-lport 600 ip rate=1000101])
>  AT_CHECK([ovn-nbctl qos-add ls0 from-lport 400 tcp dscp=44])
> -AT_CHECK([ovn-nbctl qos-add ls0 from-lport 200 ip burst=1000102 rate=301
> dscp=19])
>
>  dnl Delete a single flow.
>  AT_CHECK([ovn-nbctl qos-del ls0 from-lport 400 tcp])
>  AT_CHECK([ovn-nbctl qos-list ls0], [0], [dnl
>  from-lport   600 (ip) rate=1000101
> -from-lport   200 (ip) rate=301 burst=1000102 dscp=19
> +])
> +
> +dnl Delete QoS rule by specified uuid
> +AT_CHECK([ovn-nbctl qos-del ls0 $(ovn-nbctl --bare --column _uuid list
> logical_router_policy)])
>

Looks like there is a typo here ? It should be -  "$(ovn-nbctl --bare
--column _uuid list qos)" right ?

Thanks
Numan

 +AT_CHECK([ovn-nbctl list qos], [0], [dnl
>  ])
>
>  AT_CHECK([ovn-nbctl qos-add ls0 from-lport 600 ip rate=100010111111],
> [1], [],
> diff --git a/utilities/ovn-nbctl.8.xml b/utilities/ovn-nbctl.8.xml
> index 9c624d40c..d265c7fcc 100644
> --- a/utilities/ovn-nbctl.8.xml
> +++ b/utilities/ovn-nbctl.8.xml
> @@ -160,12 +160,19 @@
>
>        <dt><code>qos-del</code> <var>switch</var> [<var>direction</var>
> [<var>priority</var> <var>match</var>]]</dt>
>        <dd>
> -        Deletes QoS rules from <var>switch</var>.  If only
> -        <var>switch</var> is supplied, all the QoS rules from the logical
> -        switch are deleted.  If <var>direction</var> is also specified,
> -        then all the flows in that direction will be deleted from the
> -        logical switch.  If all the fields are supplied, then a single
> -        flow that matches the given fields will be deleted.
> +        <p>
> +          Deletes QoS rules from <var>switch</var>.  If only
> +          <var>switch</var> is supplied, all the QoS rules from the
> logical
> +          switch are deleted.  If <var>direction</var> is also specified,
> +          then all the flows in that direction will be deleted from the
> +          logical switch.  If all the fields are supplied, then a single
> +          flow that matches the given fields will be deleted.
> +        </p>
> +
> +        <p>
> +          If <var>switch</var> and <var>uuid</var> are supplied, then the
> +          QoS rule with sepcified uuid is deleted.
> +        </p>
>        </dd>
>
>        <dt><code>qos-list</code> <var>switch</var></dt>
> diff --git a/utilities/ovn-nbctl.c b/utilities/ovn-nbctl.c
> index 02fc10c9e..07ed85251 100644
> --- a/utilities/ovn-nbctl.c
> +++ b/utilities/ovn-nbctl.c
> @@ -604,7 +604,7 @@ ACL commands:\n\
>  QoS commands:\n\
>    qos-add SWITCH DIRECTION PRIORITY MATCH [rate=RATE [burst=BURST]]
> [dscp=DSCP]\n\
>                              add an QoS rule to SWITCH\n\
> -  qos-del SWITCH [DIRECTION [PRIORITY MATCH]]\n\
> +  qos-del SWITCH [{DIRECTION | UUID} [PRIORITY MATCH]]\n\
>                              remove QoS rules from SWITCH\n\
>    qos-list SWITCH           print QoS rules for SWITCH\n\
>  \n\
> @@ -2526,22 +2526,39 @@ nbctl_qos_del(struct ctl_context *ctx)
>      }
>
>      const char *direction;
> -    error = parse_direction(ctx->argv[2], &direction);
> -    if (error) {
> -        ctx->error = error;
> -        return;
> +    const struct uuid *qos_rule_uuid = NULL;
> +    struct uuid uuid_from_cmd;
> +    if (uuid_from_string(&uuid_from_cmd, ctx->argv[2])) {
> +        qos_rule_uuid = &uuid_from_cmd;
> +    } else {
> +        error = parse_direction(ctx->argv[2], &direction);
> +        if (error) {
> +            ctx->error = error;
> +            return;
> +        }
>      }
>
> -    /* If priority and match are not specified, delete all qos_rules with
> the
> -     * specified direction. */
> +    /* If uuid was specified, delete qos_rule with the
> +     * specified uuid. */
>      if (ctx->argc == 3) {
>          struct nbrec_qos **new_qos_rules
>              = xmalloc(sizeof *new_qos_rules * ls->n_qos_rules);
>
>          int n_qos_rules = 0;
> -        for (size_t i = 0; i < ls->n_qos_rules; i++) {
> -            if (strcmp(direction, ls->qos_rules[i]->direction)) {
> -                new_qos_rules[n_qos_rules++] = ls->qos_rules[i];
> +        if (qos_rule_uuid) {
> +            for (size_t i = 0; i < ls->n_qos_rules; i++) {
> +                if (!uuid_equals(qos_rule_uuid,
> +                                 &(ls->qos_rules[i]->header_.uuid))) {
> +                    new_qos_rules[n_qos_rules++] = ls->qos_rules[i];
> +                }
> +            }
> +        /* If priority and match are not specified, delete all qos_rules
> +         * with the specified direction. */
> +        } else {
> +            for (size_t i = 0; i < ls->n_qos_rules; i++) {
> +                if (strcmp(direction, ls->qos_rules[i]->direction)) {
> +                    new_qos_rules[n_qos_rules++] = ls->qos_rules[i];
> +                }
>              }
>          }
>
> @@ -6149,7 +6166,7 @@ static const struct ctl_command_syntax
> nbctl_commands[] = {
>      { "qos-add", 5, 7,
>        "SWITCH DIRECTION PRIORITY MATCH [rate=RATE [burst=BURST]]
> [dscp=DSCP]",
>        NULL, nbctl_qos_add, NULL, "--may-exist", RW },
> -    { "qos-del", 1, 4, "SWITCH [DIRECTION [PRIORITY MATCH]]", NULL,
> +    { "qos-del", 1, 4, "SWITCH [{DIRECTION | UUID} [PRIORITY MATCH]]",
> NULL,
>        nbctl_qos_del, NULL, "", RW },
>      { "qos-list", 1, 1, "SWITCH", NULL, nbctl_qos_list, NULL, "", RO },
>
> --
> 2.17.1
>
>
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
>
0-day Robot May 9, 2020, 7:59 a.m. UTC | #2
Bleep bloop.  Greetings taoyunxiang@cmss.chinamobile.com, I am a robot and I have tried out your patch.
Thanks for your contribution.

I encountered some error that I wasn't expecting.  See the details below.


checkpatch:
WARNING: Line lacks whitespace around operator
#89 FILE: utilities/ovn-nbctl.c:607:
  qos-del SWITCH [{DIRECTION | UUID} [PRIORITY MATCH]]\n\

Lines checked: 153, Warnings: 1, Errors: 0


Please check this out.  If you feel there has been an error, please email aconole@redhat.com

Thanks,
0-day Robot
Tao YunXiang May 9, 2020, 8:46 a.m. UTC | #3
Yes, you are right.  I have summited v7. Thanks  for your review.

Thanks,
Yun
--------------
taoyunxiang@cmss.chinamobile.com
>On Sat, May 9, 2020 at 12:57 PM Tao YunXiang <
>taoyunxiang@cmss.chinamobile.com> wrote:
>
>> We can delete qos by specify ls and more parameters.
>> If CMS want to delete it exactly, it must specify detailed "match" field.
>> It's not an easy way, also maybe deleted by mistake.
>> This change adds a way to specify ls and uuid, which is optional.
>> You can still use the previous method to delete.
>>
>> usage:
>> ovn-nbctl qos-del ls0 [UUID0]
>>
>> Author: Tao YunXiang <taoyunxiang@cmss.chinamobile.com>
>> Co-authored-by: Liu Chang <liuchang@cmss.chinamobile.com>
>> Co-authored-by: Rong Yin <rongyin@cmss.chinamobile.com>
>> Signed-off-by: Tao YunXiang <taoyunxiang@cmss.chinamobile.com>
>> Signed-off-by: Liu Chang <liuchang@cmss.chinamobile.com>
>> Signed-off-by: Rong Yin <rongyin@cmss.chinamobile.com>
>>
>> ---
>> v5: ovn-nbctl.c: Add an optional way to delete QoS by uuid
>> v4: Add a way to delete QoS by its name or uuid
>> v3: ovn-nbctl.c: Add a way to delete QoS by its name or uuid
>> ---
>>  tests/ovn-nbctl.at        |  7 +++++--
>>  utilities/ovn-nbctl.8.xml | 19 +++++++++++++------
>>  utilities/ovn-nbctl.c     | 39 ++++++++++++++++++++++++++++-----------
>>  3 files changed, 46 insertions(+), 19 deletions(-)
>>
>> diff --git a/tests/ovn-nbctl.at b/tests/ovn-nbctl.at
>> index 1187fe3e1..12c4daca6 100644
>> --- a/tests/ovn-nbctl.at
>> +++ b/tests/ovn-nbctl.at
>> @@ -308,13 +308,16 @@ AT_CHECK([ovn-nbctl qos-list ls0], [0], [dnl
>>
>>  AT_CHECK([ovn-nbctl qos-add ls0 from-lport 600 ip rate=1000101])
>>  AT_CHECK([ovn-nbctl qos-add ls0 from-lport 400 tcp dscp=44])
>> -AT_CHECK([ovn-nbctl qos-add ls0 from-lport 200 ip burst=1000102 rate=301
>> dscp=19])
>>
>>  dnl Delete a single flow.
>>  AT_CHECK([ovn-nbctl qos-del ls0 from-lport 400 tcp])
>>  AT_CHECK([ovn-nbctl qos-list ls0], [0], [dnl
>>  from-lport   600 (ip) rate=1000101
>> -from-lport   200 (ip) rate=301 burst=1000102 dscp=19
>> +])
>> +
>> +dnl Delete QoS rule by specified uuid
>> +AT_CHECK([ovn-nbctl qos-del ls0 $(ovn-nbctl --bare --column _uuid list
>> logical_router_policy)])
>>
>
>Looks like there is a typo here ? It should be -  "$(ovn-nbctl --bare
>--column _uuid list qos)" right ?
>
>Thanks
>Numan
>
> +AT_CHECK([ovn-nbctl list qos], [0], [dnl
>>  ])
>>
>>  AT_CHECK([ovn-nbctl qos-add ls0 from-lport 600 ip rate=100010111111],
>> [1], [],
>> diff --git a/utilities/ovn-nbctl.8.xml b/utilities/ovn-nbctl.8.xml
>> index 9c624d40c..d265c7fcc 100644
>> --- a/utilities/ovn-nbctl.8.xml
>> +++ b/utilities/ovn-nbctl.8.xml
>> @@ -160,12 +160,19 @@
>>
>>        <dt><code>qos-del</code> <var>switch</var> [<var>direction</var>
>> [<var>priority</var> <var>match</var>]]</dt>
>>        <dd>
>> -        Deletes QoS rules from <var>switch</var>.  If only
>> -        <var>switch</var> is supplied, all the QoS rules from the logical
>> -        switch are deleted.  If <var>direction</var> is also specified,
>> -        then all the flows in that direction will be deleted from the
>> -        logical switch.  If all the fields are supplied, then a single
>> -        flow that matches the given fields will be deleted.
>> +        <p>
>> +          Deletes QoS rules from <var>switch</var>.  If only
>> +          <var>switch</var> is supplied, all the QoS rules from the
>> logical
>> +          switch are deleted.  If <var>direction</var> is also specified,
>> +          then all the flows in that direction will be deleted from the
>> +          logical switch.  If all the fields are supplied, then a single
>> +          flow that matches the given fields will be deleted.
>> +        </p>
>> +
>> +        <p>
>> +          If <var>switch</var> and <var>uuid</var> are supplied, then the
>> +          QoS rule with sepcified uuid is deleted.
>> +        </p>
>>        </dd>
>>
>>        <dt><code>qos-list</code> <var>switch</var></dt>
>> diff --git a/utilities/ovn-nbctl.c b/utilities/ovn-nbctl.c
>> index 02fc10c9e..07ed85251 100644
>> --- a/utilities/ovn-nbctl.c
>> +++ b/utilities/ovn-nbctl.c
>> @@ -604,7 +604,7 @@ ACL commands:\n\
>>  QoS commands:\n\
>>    qos-add SWITCH DIRECTION PRIORITY MATCH [rate=RATE [burst=BURST]]
>> [dscp=DSCP]\n\
>>                              add an QoS rule to SWITCH\n\
>> -  qos-del SWITCH [DIRECTION [PRIORITY MATCH]]\n\
>> +  qos-del SWITCH [{DIRECTION | UUID} [PRIORITY MATCH]]\n\
>>                              remove QoS rules from SWITCH\n\
>>    qos-list SWITCH           print QoS rules for SWITCH\n\
>>  \n\
>> @@ -2526,22 +2526,39 @@ nbctl_qos_del(struct ctl_context *ctx)
>>      }
>>
>>      const char *direction;
>> -    error = parse_direction(ctx->argv[2], &direction);
>> -    if (error) {
>> -        ctx->error = error;
>> -        return;
>> +    const struct uuid *qos_rule_uuid = NULL;
>> +    struct uuid uuid_from_cmd;
>> +    if (uuid_from_string(&uuid_from_cmd, ctx->argv[2])) {
>> +        qos_rule_uuid = &uuid_from_cmd;
>> +    } else {
>> +        error = parse_direction(ctx->argv[2], &direction);
>> +        if (error) {
>> +            ctx->error = error;
>> +            return;
>> +        }
>>      }
>>
>> -    /* If priority and match are not specified, delete all qos_rules with
>> the
>> -     * specified direction. */
>> +    /* If uuid was specified, delete qos_rule with the
>> +     * specified uuid. */
>>      if (ctx->argc == 3) {
>>          struct nbrec_qos **new_qos_rules
>>              = xmalloc(sizeof *new_qos_rules * ls->n_qos_rules);
>>
>>          int n_qos_rules = 0;
>> -        for (size_t i = 0; i < ls->n_qos_rules; i++) {
>> -            if (strcmp(direction, ls->qos_rules[i]->direction)) {
>> -                new_qos_rules[n_qos_rules++] = ls->qos_rules[i];
>> +        if (qos_rule_uuid) {
>> +            for (size_t i = 0; i < ls->n_qos_rules; i++) {
>> +                if (!uuid_equals(qos_rule_uuid,
>> +                                 &(ls->qos_rules[i]->header_.uuid))) {
>> +                    new_qos_rules[n_qos_rules++] = ls->qos_rules[i];
>> +                }
>> +            }
>> +        /* If priority and match are not specified, delete all qos_rules
>> +         * with the specified direction. */
>> +        } else {
>> +            for (size_t i = 0; i < ls->n_qos_rules; i++) {
>> +                if (strcmp(direction, ls->qos_rules[i]->direction)) {
>> +                    new_qos_rules[n_qos_rules++] = ls->qos_rules[i];
>> +                }
>>              }
>>          }
>>
>> @@ -6149,7 +6166,7 @@ static const struct ctl_command_syntax
>> nbctl_commands[] = {
>>      { "qos-add", 5, 7,
>>        "SWITCH DIRECTION PRIORITY MATCH [rate=RATE [burst=BURST]]
>> [dscp=DSCP]",
>>        NULL, nbctl_qos_add, NULL, "--may-exist", RW },
>> -    { "qos-del", 1, 4, "SWITCH [DIRECTION [PRIORITY MATCH]]", NULL,
>> +    { "qos-del", 1, 4, "SWITCH [{DIRECTION | UUID} [PRIORITY MATCH]]",
>> NULL,
>>        nbctl_qos_del, NULL, "", RW },
>>      { "qos-list", 1, 1, "SWITCH", NULL, nbctl_qos_list, NULL, "", RO },
>>
>> --
>> 2.17.1
>>
>>
>>
>> _______________________________________________
>> dev mailing list
>> dev@openvswitch.org
>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>>
>>
diff mbox series

Patch

diff --git a/tests/ovn-nbctl.at b/tests/ovn-nbctl.at
index 1187fe3e1..12c4daca6 100644
--- a/tests/ovn-nbctl.at
+++ b/tests/ovn-nbctl.at
@@ -308,13 +308,16 @@  AT_CHECK([ovn-nbctl qos-list ls0], [0], [dnl
 
 AT_CHECK([ovn-nbctl qos-add ls0 from-lport 600 ip rate=1000101])
 AT_CHECK([ovn-nbctl qos-add ls0 from-lport 400 tcp dscp=44])
-AT_CHECK([ovn-nbctl qos-add ls0 from-lport 200 ip burst=1000102 rate=301 dscp=19])
 
 dnl Delete a single flow.
 AT_CHECK([ovn-nbctl qos-del ls0 from-lport 400 tcp])
 AT_CHECK([ovn-nbctl qos-list ls0], [0], [dnl
 from-lport   600 (ip) rate=1000101
-from-lport   200 (ip) rate=301 burst=1000102 dscp=19
+])
+
+dnl Delete QoS rule by specified uuid
+AT_CHECK([ovn-nbctl qos-del ls0 $(ovn-nbctl --bare --column _uuid list logical_router_policy)])
+AT_CHECK([ovn-nbctl list qos], [0], [dnl
 ])
 
 AT_CHECK([ovn-nbctl qos-add ls0 from-lport 600 ip rate=100010111111], [1], [],
diff --git a/utilities/ovn-nbctl.8.xml b/utilities/ovn-nbctl.8.xml
index 9c624d40c..d265c7fcc 100644
--- a/utilities/ovn-nbctl.8.xml
+++ b/utilities/ovn-nbctl.8.xml
@@ -160,12 +160,19 @@ 
 
       <dt><code>qos-del</code> <var>switch</var> [<var>direction</var> [<var>priority</var> <var>match</var>]]</dt>
       <dd>
-        Deletes QoS rules from <var>switch</var>.  If only
-        <var>switch</var> is supplied, all the QoS rules from the logical
-        switch are deleted.  If <var>direction</var> is also specified,
-        then all the flows in that direction will be deleted from the
-        logical switch.  If all the fields are supplied, then a single
-        flow that matches the given fields will be deleted.
+        <p>
+          Deletes QoS rules from <var>switch</var>.  If only
+          <var>switch</var> is supplied, all the QoS rules from the logical
+          switch are deleted.  If <var>direction</var> is also specified,
+          then all the flows in that direction will be deleted from the
+          logical switch.  If all the fields are supplied, then a single
+          flow that matches the given fields will be deleted.
+        </p>
+
+        <p>
+          If <var>switch</var> and <var>uuid</var> are supplied, then the
+          QoS rule with sepcified uuid is deleted.
+        </p>
       </dd>
 
       <dt><code>qos-list</code> <var>switch</var></dt>
diff --git a/utilities/ovn-nbctl.c b/utilities/ovn-nbctl.c
index 02fc10c9e..07ed85251 100644
--- a/utilities/ovn-nbctl.c
+++ b/utilities/ovn-nbctl.c
@@ -604,7 +604,7 @@  ACL commands:\n\
 QoS commands:\n\
   qos-add SWITCH DIRECTION PRIORITY MATCH [rate=RATE [burst=BURST]] [dscp=DSCP]\n\
                             add an QoS rule to SWITCH\n\
-  qos-del SWITCH [DIRECTION [PRIORITY MATCH]]\n\
+  qos-del SWITCH [{DIRECTION | UUID} [PRIORITY MATCH]]\n\
                             remove QoS rules from SWITCH\n\
   qos-list SWITCH           print QoS rules for SWITCH\n\
 \n\
@@ -2526,22 +2526,39 @@  nbctl_qos_del(struct ctl_context *ctx)
     }
 
     const char *direction;
-    error = parse_direction(ctx->argv[2], &direction);
-    if (error) {
-        ctx->error = error;
-        return;
+    const struct uuid *qos_rule_uuid = NULL;
+    struct uuid uuid_from_cmd;
+    if (uuid_from_string(&uuid_from_cmd, ctx->argv[2])) {
+        qos_rule_uuid = &uuid_from_cmd;
+    } else {
+        error = parse_direction(ctx->argv[2], &direction);
+        if (error) {
+            ctx->error = error;
+            return;
+        }
     }
 
-    /* If priority and match are not specified, delete all qos_rules with the
-     * specified direction. */
+    /* If uuid was specified, delete qos_rule with the
+     * specified uuid. */
     if (ctx->argc == 3) {
         struct nbrec_qos **new_qos_rules
             = xmalloc(sizeof *new_qos_rules * ls->n_qos_rules);
 
         int n_qos_rules = 0;
-        for (size_t i = 0; i < ls->n_qos_rules; i++) {
-            if (strcmp(direction, ls->qos_rules[i]->direction)) {
-                new_qos_rules[n_qos_rules++] = ls->qos_rules[i];
+        if (qos_rule_uuid) {
+            for (size_t i = 0; i < ls->n_qos_rules; i++) {
+                if (!uuid_equals(qos_rule_uuid,
+                                 &(ls->qos_rules[i]->header_.uuid))) {
+                    new_qos_rules[n_qos_rules++] = ls->qos_rules[i];
+                }
+            }
+        /* If priority and match are not specified, delete all qos_rules
+         * with the specified direction. */
+        } else {
+            for (size_t i = 0; i < ls->n_qos_rules; i++) {
+                if (strcmp(direction, ls->qos_rules[i]->direction)) {
+                    new_qos_rules[n_qos_rules++] = ls->qos_rules[i];
+                }
             }
         }
 
@@ -6149,7 +6166,7 @@  static const struct ctl_command_syntax nbctl_commands[] = {
     { "qos-add", 5, 7,
       "SWITCH DIRECTION PRIORITY MATCH [rate=RATE [burst=BURST]] [dscp=DSCP]",
       NULL, nbctl_qos_add, NULL, "--may-exist", RW },
-    { "qos-del", 1, 4, "SWITCH [DIRECTION [PRIORITY MATCH]]", NULL,
+    { "qos-del", 1, 4, "SWITCH [{DIRECTION | UUID} [PRIORITY MATCH]]", NULL,
       nbctl_qos_del, NULL, "", RW },
     { "qos-list", 1, 1, "SWITCH", NULL, nbctl_qos_list, NULL, "", RO },