[ovs-dev] [PATCH] tests: Allow unit tests to run as root.
Ethan Jackson
ethan at nicira.com
Fri Nov 18 03:46:00 UTC 2011
Please review this version of the patch.
On Thu, Nov 17, 2011 at 19:45, Ethan Jackson <ethan at nicira.com> wrote:
> The unit tests did not allow users to run them as root because
> ovs-vswitchd would destroy all of the existing 'system' datapaths.
> This patch prevents ovs-vswitchd from registering 'system'
> datapaths when running unit tests preventing the issue.
> ---
> lib/dpif.c | 15 +++++++++++++++
> lib/dpif.h | 1 +
> tests/ofproto-macros.at | 8 ++------
> vswitchd/ovs-vswitchd.c | 7 +++++++
> 4 files changed, 25 insertions(+), 6 deletions(-)
>
> diff --git a/lib/dpif.c b/lib/dpif.c
> index cc6e805..5f5417b 100644
> --- a/lib/dpif.c
> +++ b/lib/dpif.c
> @@ -68,6 +68,7 @@ struct registered_dpif_class {
> int refcount;
> };
> static struct shash dpif_classes = SHASH_INITIALIZER(&dpif_classes);
> +static struct sset dpif_blacklist = SSET_INITIALIZER(&dpif_blacklist);
>
> /* Rate limit for individual messages going to or from the datapath, output at
> * DBG level. This is very high because, if these are enabled, it is because
> @@ -108,6 +109,12 @@ dp_register_provider(const struct dpif_class *new_class)
> {
> struct registered_dpif_class *registered_class;
>
> + if (sset_contains(&dpif_blacklist, new_class->type)) {
> + VLOG_DBG("attempted to register blacklisted provider: %s",
> + new_class->type);
> + return EINVAL;
> + }
> +
> if (shash_find(&dpif_classes, new_class->type)) {
> VLOG_WARN("attempted to register duplicate datapath provider: %s",
> new_class->type);
> @@ -151,6 +158,14 @@ dp_unregister_provider(const char *type)
> return 0;
> }
>
> +/* Blacklists a provider. Causes future calls of dp_register_provider() with
> + * a dpif_class which implements 'type' to fail. */
> +void
> +dp_blacklist_provider(const char *type)
> +{
> + sset_add(&dpif_blacklist, type);
> +}
> +
> /* Clears 'types' and enumerates the types of all currently registered datapath
> * providers into it. The caller must first initialize the sset. */
> void
> diff --git a/lib/dpif.h b/lib/dpif.h
> index 223f990..0ff2389 100644
> --- a/lib/dpif.h
> +++ b/lib/dpif.h
> @@ -40,6 +40,7 @@ struct dpif_class;
>
> int dp_register_provider(const struct dpif_class *);
> int dp_unregister_provider(const char *type);
> +void dp_blacklist_provider(const char *type);
> void dp_enumerate_types(struct sset *types);
> const char *dpif_normalize_type(const char *);
>
> diff --git a/tests/ofproto-macros.at b/tests/ofproto-macros.at
> index 5bc431c..fc5bba1 100644
> --- a/tests/ofproto-macros.at
> +++ b/tests/ofproto-macros.at
> @@ -3,11 +3,7 @@ m4_define([STRIP_DURATION], [[sed 's/\bduration=[0-9.]*s/duration=?s/']])
> m4_define([TESTABLE_LOG], [-vPATTERN:ANY:'%c|%p|%m'])
>
> m4_define([OVS_VSWITCHD_START],
> - [dnl Skip this test if running as root. Otherwise ovs-vswitchd will tear
> - dnl down any existing datapaths if the kernel module is loaded.
> - AT_SKIP_IF([test "`id -u`" = 0])
> -
> - OVS_RUNDIR=$PWD; export OVS_RUNDIR
> + [OVS_RUNDIR=$PWD; export OVS_RUNDIR
> OVS_LOGDIR=$PWD; export OVS_LOGDIR
> OVS_SYSCONFDIR=$PWD; export OVS_SYSCONFDIR
> trap 'kill `cat ovsdb-server.pid ovs-vswitchd.pid`' 0
> @@ -26,7 +22,7 @@ m4_define([OVS_VSWITCHD_START],
> AT_CHECK([ovs-vsctl --no-wait init])
>
> dnl Start ovs-vswitchd.
> - AT_CHECK([ovs-vswitchd --detach --pidfile --enable-dummy --log-file], [0], [], [stderr])
> + AT_CHECK([ovs-vswitchd --detach --pidfile --enable-dummy --disable-system --log-file], [0], [], [stderr])
> AT_CAPTURE_FILE([ovs-vswitchd.log])
> AT_CHECK([[sed < stderr '
> /vlog|INFO|opened log file/d
> diff --git a/vswitchd/ovs-vswitchd.c b/vswitchd/ovs-vswitchd.c
> index 359e3ab..bdc3533 100644
> --- a/vswitchd/ovs-vswitchd.c
> +++ b/vswitchd/ovs-vswitchd.c
> @@ -31,6 +31,7 @@
> #include "compiler.h"
> #include "daemon.h"
> #include "dirs.h"
> +#include "dpif.h"
> #include "dummy.h"
> #include "leak-checker.h"
> #include "netdev.h"
> @@ -121,6 +122,7 @@ parse_options(int argc, char *argv[])
> LEAK_CHECKER_OPTION_ENUMS,
> OPT_BOOTSTRAP_CA_CERT,
> OPT_ENABLE_DUMMY,
> + OPT_DISABLE_SYSTEM,
> DAEMON_OPTION_ENUMS
> };
> static struct option long_options[] = {
> @@ -134,6 +136,7 @@ parse_options(int argc, char *argv[])
> {"peer-ca-cert", required_argument, NULL, OPT_PEER_CA_CERT},
> {"bootstrap-ca-cert", required_argument, NULL, OPT_BOOTSTRAP_CA_CERT},
> {"enable-dummy", no_argument, NULL, OPT_ENABLE_DUMMY},
> + {"disable-system", no_argument, NULL, OPT_DISABLE_SYSTEM},
> {NULL, 0, NULL, 0},
> };
> char *short_options = long_options_to_short_options(long_options);
> @@ -181,6 +184,10 @@ parse_options(int argc, char *argv[])
> dummy_enable();
> break;
>
> + case OPT_DISABLE_SYSTEM:
> + dp_blacklist_provider("system");
> + break;
> +
> case '?':
> exit(EXIT_FAILURE);
>
> --
> 1.7.7.1
>
>
More information about the dev
mailing list