[ovs-dev] [PATCH 3/8] ovn-nbctl: Update logical router port commands.
Justin Pettit
jpettit at ovn.org
Sat Jun 11 23:57:29 UTC 2016
> On Jun 10, 2016, at 7:07 PM, Ben Pfaff <blp at ovn.org> wrote:
>
> On Fri, Jun 10, 2016 at 05:03:31PM -0700, Justin Pettit wrote:
>>
>>> On Jun 9, 2016, at 5:09 PM, Ben Pfaff <blp at ovn.org> wrote:
>>>
>>> I think that lrp-add with --may-exist should report an error if the MAC
>>> or NETWORK or [PEER] differ from the existing port's configuration.
>>
>> Currently, adding the port fails if the port belongs to a different
>> router. I assume you are suggesting that we report an error if those
>> fields are changing when re-adding to the same router, correct?
>
> Yes.
>
> The idea of --may-exist is to make the command idempotent: if the same
> command has already been executed, then it turns it into a no-op. But
> if a different command has been executed (with different MAC or NETWORK
> or PEER), it's not what the user has asked for.
>
> This follows the precedent set by the add-port command in ovs-vsctl,
> which with --may-exist complains if, for example, the interfaces
> specified for a bond are different from the ones that actually exist.
>
> I think there is at least one other precedent, but that's the one that
> comes to mind.
Got it. I've added that check and a couple of checks to the unit tests. I've attached a diff below.
--Justin
-=-=-=-=-=-=-=-
diff --git a/ovn/utilities/ovn-nbctl.c b/ovn/utilities/ovn-nbctl.c
index 493f1e8..ac4f941 100644
--- a/ovn/utilities/ovn-nbctl.c
+++ b/ovn/utilities/ovn-nbctl.c
@@ -1334,6 +1334,10 @@ nbctl_lrp_add(struct ctl_context *ctx)
lr = lr_by_name_or_uuid(ctx, ctx->argv[1], true);
const char *lrp_name = ctx->argv[2];
+ const char *mac = ctx->argv[3];
+ const char *network = ctx->argv[4];
+ const char *peer = (ctx->argc == 6) ? ctx->argv[5] : NULL;
+
const struct nbrec_logical_router_port *lrp;
lrp = lrp_by_name_or_uuid(ctx, lrp_name, false);
if (lrp) {
@@ -1350,34 +1354,50 @@ nbctl_lrp_add(struct ctl_context *ctx)
lr_get_name(bound_lr, uuid_s, sizeof uuid_s));
}
+ if (strcmp(mac, lrp->mac)) {
+ ctl_fatal("%s: port already exists with mac %s", lrp_name,
+ lrp->mac);
+ }
+
+ if (strcmp(network, lrp->network)) {
+ ctl_fatal("%s: port already exists with network %s", lrp_name,
+ lrp->network);
+ }
+
+ if ((!peer != !lrp->peer) ||
+ (lrp->peer && strcmp(peer, lrp->peer))) {
+ ctl_fatal("%s: port already exists with mismatching peer",
+ lrp_name);
+ }
+
return;
}
struct eth_addr ea;
- if (!ovs_scan(ctx->argv[3], ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(ea))) {
- ctl_fatal("%s: invalid mac address.", ctx->argv[3]);
+ if (!ovs_scan(mac, ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(ea))) {
+ ctl_fatal("%s: invalid mac address.", mac);
}
ovs_be32 ip;
unsigned int plen;
- char *error = ip_parse_cidr(ctx->argv[4], &ip, &plen);
+ char *error = ip_parse_cidr(network, &ip, &plen);
if (error) {
free(error);
struct in6_addr ipv6;
- error = ipv6_parse_cidr(ctx->argv[4], &ipv6, &plen);
+ error = ipv6_parse_cidr(network, &ipv6, &plen);
if (error) {
free(error);
- ctl_fatal("%s: invalid network address.", ctx->argv[4]);
+ ctl_fatal("%s: invalid network address.", network);
}
}
/* Create the logical port. */
lrp = nbrec_logical_router_port_insert(ctx->txn);
nbrec_logical_router_port_set_name(lrp, lrp_name);
- nbrec_logical_router_port_set_mac(lrp, ctx->argv[3]);
- nbrec_logical_router_port_set_network(lrp, ctx->argv[4]);
- if (ctx->argc == 6) {
- nbrec_logical_router_port_set_peer(lrp, ctx->argv[5]);
+ nbrec_logical_router_port_set_mac(lrp, mac);
+ nbrec_logical_router_port_set_network(lrp, network);
+ if (peer) {
+ nbrec_logical_router_port_set_peer(lrp, peer);
}
/* Insert the logical port into the logical router. */
diff --git a/tests/ovn-nbctl.at b/tests/ovn-nbctl.at
index 2e8fc17..db40abf 100644
--- a/tests/ovn-nbctl.at
+++ b/tests/ovn-nbctl.at
@@ -305,7 +305,7 @@ AT_CHECK([ovn-nbctl lrp-list lr0 | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl
<0> (lrp0)
])
-AT_CHECK([ovn-nbctl lrp-add lr0 lrp1 00:00:00:01:02:03 192.168.1.1/24])
+AT_CHECK([ovn-nbctl lrp-add lr0 lrp1 00:00:00:01:02:03 192.168.1.1/24 lrp1-peer])
AT_CHECK([ovn-nbctl lrp-list lr0 | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl
<0> (lrp0)
<1> (lrp1)
@@ -315,10 +315,21 @@ AT_CHECK([ovn-nbctl lr-add lr1])
AT_CHECK([ovn-nbctl lrp-add lr0 lrp1 00:00:00:01:02:03 192.168.1.1/24], [1], [],
[ovn-nbctl: lrp1: a port with this name already exists
])
+
AT_CHECK([ovn-nbctl --may-exist lrp-add lr1 lrp1 00:00:00:01:02:03 192.168.1.1/24], [1], [],
[ovn-nbctl: lrp1: port already exists but in router lr0
])
+AT_CHECK([ovn-nbctl --may-exist lrp-add lr0 lrp1 00:00:00:04:05:06 192.168.1.1/24], [1], [],
+ [ovn-nbctl: lrp1: port already exists with mac 00:00:00:01:02:03
+])
+
+AT_CHECK([ovn-nbctl --may-exist lrp-add lr0 lrp1 00:00:00:01:02:03 192.168.1.1/24], [1], [],
+ [ovn-nbctl: lrp1: port already exists with mismatching peer
+])
+
+AT_CHECK([ovn-nbctl --may-exist lrp-add lr0 lrp1 00:00:00:01:02:03 192.168.1.1/24 lrp1-peer])
+
AT_CHECK([ovn-nbctl lrp-del lrp1])
AT_CHECK([ovn-nbctl lrp-list lr0 | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl
<0> (lrp0)
More information about the dev
mailing list