diff mbox series

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

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

Commit Message

Tao YunXiang May 9, 2020, 8:44 a.m. UTC
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>

---
v6: ovn-nbctl.c: Add an optional way to delete QoS by uuid
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

0-day Robot May 9, 2020, 9 a.m. UTC | #1
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
#83 FILE: utilities/ovn-nbctl.c:607:
  qos-del SWITCH [{DIRECTION | UUID} [PRIORITY MATCH]]\n\

Lines checked: 147, 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
Numan Siddique May 11, 2020, 6:25 a.m. UTC | #2
On Sat, May 9, 2020 at 2:15 PM Tao YunXiang <
taoyunxiang@cmss.chinamobile.com> wrote:

> 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>
>
> ---
> v6: ovn-nbctl.c: Add an optional way to delete QoS by uuid
> 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
>
>
Thanks for adding the test case.

I see a small issue.  When I run "ovn-nbctl qos-del <some_uuid>, the
commands doesn't
print any error if the qos with the given <some_uuid> doesn't exist.

Can you please address this.
I think the same would go for logical router policy too. Can you please
address that also.

Thanks
Numa

---
>  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..14de1a8bf 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
> qos)])
> +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
>
>
Tao YunXiang May 12, 2020, 9:30 a.m. UTC | #3
Hi Numa,
     I have add codes to check if the uuid is exist. If not, it will print "uuid is not found".  Please help to check , if this way is ok , I will summit another patch to fix the same problem in logical router policy.


Regards,
Yun
--------------
taoyunxiang@cmss.chinamobile.com
>On Sat, May 9, 2020 at 2:15 PM Tao YunXiang <
>taoyunxiang@cmss.chinamobile.com> wrote:
>
>> 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>
>>
>> ---
>> v6: ovn-nbctl.c: Add an optional way to delete QoS by uuid
>> 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
>>
>>
>Thanks for adding the test case.
>
>I see a small issue.  When I run "ovn-nbctl qos-del <some_uuid>, the
>commands doesn't
>print any error if the qos with the given <some_uuid> doesn't exist.
>
>Can you please address this.
>I think the same would go for logical router policy too. Can you please
>address that also.
>
>Thanks
>Numa
>
>---
>>  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..14de1a8bf 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
>> qos)])
>> +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..14de1a8bf 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 qos)])
+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 },