From: Ben Pfaff Date: Mon, 8 Jul 2013 17:47:37 +0000 (-0700) Subject: ovs-vsctl: Fix behavioral regression for "--if-exists del-port ". X-Git-Tag: sliver-openvswitch-2.0.90-1~36^2~61 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=25a27ba07c1acbda03c3ff08bf78e2921b48c90b;p=sliver-openvswitch.git ovs-vsctl: Fix behavioral regression for "--if-exists del-port ". Commit 89f3c258fe (ovs-vsctl: Improve error message for "ovs-vsctl del-port ".) changed the behavior of ovs-vsctl --if-exists del-port from a silent no-op to a hard failure. This commit fixes this regression. This caused problems on XenServer, for which the Open vSwitch integration runs commands like: /usr/bin/ovs-vsctl --timeout=20 \ -- --with-iface --if-exists del-port xapi103 \ -- --if-exists del-br xapi103 Bug #18276. Reported-by: Michael Hu Signed-off-by: Ben Pfaff --- diff --git a/tests/ovs-vsctl.at b/tests/ovs-vsctl.at index fa2c3ff14..4449f7a2e 100644 --- a/tests/ovs-vsctl.at +++ b/tests/ovs-vsctl.at @@ -327,6 +327,8 @@ AT_CHECK([RUN_OVS_VSCTL([del-port a])], [1], [], [ovs-vsctl: cannot delete port a because it is the local port for bridge a (deleting this port requires deleting the entire bridge) ], [OVS_VSCTL_CLEANUP]) +AT_CHECK([RUN_OVS_VSCTL([--if-exists del-port a])], [0], [], [], + [OVS_VSCTL_CLEANUP]) AT_CHECK([RUN_OVS_VSCTL([--may-exist add-port a b1])], [1], [], [ovs-vsctl: "--may-exist add-port a b1" but b1 is actually attached to bridge b ], diff --git a/utilities/ovs-vsctl.c b/utilities/ovs-vsctl.c index 2d8c7c76f..e679e0d8d 100644 --- a/utilities/ovs-vsctl.c +++ b/utilities/ovs-vsctl.c @@ -2021,9 +2021,12 @@ cmd_del_port(struct vsctl_context *ctx) vsctl_context_populate_cache(ctx); if (find_bridge(ctx, target, false)) { - vsctl_fatal("cannot delete port %s because it is the local port " - "for bridge %s (deleting this port requires deleting " - "the entire bridge)", target, target); + if (must_exist) { + vsctl_fatal("cannot delete port %s because it is the local port " + "for bridge %s (deleting this port requires deleting " + "the entire bridge)", target, target); + } + port = NULL; } else if (!with_iface) { port = find_port(ctx, target, must_exist); } else {