Add --may-exist support to meter-add command in order to update
meter parameters if it has been already created

Signed-off-by: Lorenzo Bianconi <[email protected]>
---
 tests/ovn-nbctl.at    |  6 +++--
 tests/ovn-northd.at   | 11 +++++++++-
 utilities/ovn-nbctl.c | 51 ++++++++++++++++++++++++-------------------
 3 files changed, 43 insertions(+), 25 deletions(-)

diff --git a/tests/ovn-nbctl.at b/tests/ovn-nbctl.at
index 9b80ae410..a8946fef8 100644
--- a/tests/ovn-nbctl.at
+++ b/tests/ovn-nbctl.at
@@ -371,6 +371,8 @@ dnl Add duplicate meter name
 AT_CHECK([ovn-nbctl meter-add meter1 drop 10 kbps], [1], [], [stderr])
 AT_CHECK([grep 'already exists' stderr], [0], [ignore])
 
+AT_CHECK([ovn-nbctl --may-exist meter-add meter1 drop 11 kbps])
+
 dnl Add reserved meter name
 AT_CHECK([ovn-nbctl meter-add __meter1 drop 10 kbps], [1], [], [stderr])
 AT_CHECK([grep 'reserved' stderr], [0], [ignore])
@@ -396,7 +398,7 @@ AT_CHECK([ovn-nbctl meter-add meter5 drop 10 100010111111 
kbps], [1], [],
 
 AT_CHECK([ovn-nbctl meter-list], [0], [dnl
 meter1: bands:
-  drop: 10 kbps
+  drop: 11 kbps
 meter2: bands:
   drop: 3 kbps, 2 kb burst
 meter3: bands:
@@ -409,7 +411,7 @@ dnl Delete a single meter.
 AT_CHECK([ovn-nbctl meter-del meter2])
 AT_CHECK([ovn-nbctl meter-list], [0], [dnl
 meter1: bands:
-  drop: 10 kbps
+  drop: 11 kbps
 meter3: bands:
   drop: 100 kbps, 200 kb burst
 meter4: (fair) bands:
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
index e2b9924b6..ca1b8a117 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -3235,7 +3235,16 @@ event-elb: meter0
 
 AT_CHECK([ovn-sbctl list logical_flow | grep trigger_event -A 2 | grep -q 
meter0])
 
-check ovn-nbctl --wait=hv meter-add meter1 drop 200 pktps 10
+check ovn-nbctl --wait=hv meter-add meter1 drop 300 pktps 10
+AT_CHECK([ovn-nbctl meter-list |grep meter1 -A 1], [0], [dnl
+meter1: bands:
+  drop: 300 pktps, 10 packet burst
+])
+check ovn-nbctl --wait=hv --may-exist meter-add meter1 drop 200 pktps 10
+AT_CHECK([ovn-nbctl meter-list |grep meter1 -A 1], [0], [dnl
+meter1: bands:
+  drop: 200 pktps, 10 packet burst
+])
 check ovn-nbctl --wait=hv lr-copp-add r0 arp meter1
 AT_CHECK([ovn-nbctl lr-copp-list r0], [0], [dnl
 arp: meter1
diff --git a/utilities/ovn-nbctl.c b/utilities/ovn-nbctl.c
index b04b24d4b..1f71cae46 100644
--- a/utilities/ovn-nbctl.c
+++ b/utilities/ovn-nbctl.c
@@ -2585,19 +2585,6 @@ meter_cmp(const void *meter1_, const void *meter2_)
     return strcmp(meter1->name, meter2->name);
 }
 
-static void
-nbctl_pre_meter_list(struct ctl_context *ctx)
-{
-    ovsdb_idl_add_column(ctx->idl, &nbrec_meter_col_name);
-    ovsdb_idl_add_column(ctx->idl, &nbrec_meter_col_fair);
-    ovsdb_idl_add_column(ctx->idl, &nbrec_meter_col_bands);
-    ovsdb_idl_add_column(ctx->idl, &nbrec_meter_col_unit);
-
-    ovsdb_idl_add_column(ctx->idl, &nbrec_meter_band_col_action);
-    ovsdb_idl_add_column(ctx->idl, &nbrec_meter_band_col_rate);
-    ovsdb_idl_add_column(ctx->idl, &nbrec_meter_band_col_burst_size);
-}
-
 static void
 nbctl_meter_list(struct ctl_context *ctx)
 {
@@ -2650,18 +2637,34 @@ static void
 nbctl_pre_meter_add(struct ctl_context *ctx)
 {
     ovsdb_idl_add_column(ctx->idl, &nbrec_meter_col_name);
+    ovsdb_idl_add_column(ctx->idl, &nbrec_meter_col_fair);
+    ovsdb_idl_add_column(ctx->idl, &nbrec_meter_col_bands);
+    ovsdb_idl_add_column(ctx->idl, &nbrec_meter_col_unit);
+
+    ovsdb_idl_add_column(ctx->idl, &nbrec_meter_band_col_action);
+    ovsdb_idl_add_column(ctx->idl, &nbrec_meter_band_col_rate);
+    ovsdb_idl_add_column(ctx->idl, &nbrec_meter_band_col_burst_size);
 }
 
 static void
 nbctl_meter_add(struct ctl_context *ctx)
 {
-    const struct nbrec_meter *meter;
+    const struct nbrec_meter *meter = NULL, *iter;
+    struct nbrec_meter_band *band = NULL;
 
     const char *name = ctx->argv[1];
-    NBREC_METER_FOR_EACH (meter, ctx->idl) {
-        if (!strcmp(meter->name, name)) {
-            ctl_error(ctx, "meter with name \"%s\" already exists", name);
-            return;
+    NBREC_METER_FOR_EACH (iter, ctx->idl) {
+        if (!strcmp(iter->name, name)) {
+            if (!shash_find(&ctx->options, "--may-exist")) {
+                ctl_error(ctx, "meter with name \"%s\" already exists", name);
+                return;
+            } else {
+                meter = iter;
+                if (meter->n_bands) {
+                    band = meter->bands[0];
+                }
+                break;
+            }
         }
     }
 
@@ -2699,13 +2702,17 @@ nbctl_meter_add(struct ctl_context *ctx)
     }
 
     /* Create the band.  We only support adding a single band. */
-    struct nbrec_meter_band *band = nbrec_meter_band_insert(ctx->txn);
+    if (!band) {
+        band = nbrec_meter_band_insert(ctx->txn);
+    }
     nbrec_meter_band_set_action(band, action);
     nbrec_meter_band_set_rate(band, rate);
     nbrec_meter_band_set_burst_size(band, burst);
 
     /* Create the meter. */
-    meter = nbrec_meter_insert(ctx->txn);
+    if (!meter) {
+        meter = nbrec_meter_insert(ctx->txn);
+    }
     nbrec_meter_set_name(meter, name);
     nbrec_meter_set_unit(meter, unit);
     nbrec_meter_set_bands(meter, &band, 1);
@@ -6853,10 +6860,10 @@ static const struct ctl_command_syntax nbctl_commands[] 
= {
 
     /* meter commands. */
     { "meter-add", 4, 5, "NAME ACTION RATE UNIT [BURST]", nbctl_pre_meter_add,
-      nbctl_meter_add, NULL, "--fair", RW },
+      nbctl_meter_add, NULL, "--fair,--may-exist", RW },
     { "meter-del", 0, 1, "[NAME]", nbctl_pre_meter_del, nbctl_meter_del,
       NULL, "", RW },
-    { "meter-list", 0, 0, "", nbctl_pre_meter_list, nbctl_meter_list,
+    { "meter-list", 0, 0, "", nbctl_pre_meter_add, nbctl_meter_list,
       NULL, "", RO },
 
     /* logical switch port commands. */
-- 
2.31.1

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to