Thanks, I made that change and pushed these tests.
On Mon, Sep 26, 2011 at 12:53:55PM -0700, Ethan Jackson wrote: > In MockXenAPI please use two newlines between top level definitions. > > Seems fine otherwise. > > Ethan > > > > On Fri, Sep 23, 2011 at 14:24, Ben Pfaff <[email protected]> wrote: > > --- > > ?tests/MockXenAPI.py ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? 82 > > ++++++++++++++++++++ > > ?tests/automake.mk ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?4 +- > > ?tests/ovs-xapi-sync.at ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? 74 > > ++++++++++++++++++ > > ?tests/testsuite.at ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? ?1 + > > ?.../usr_share_openvswitch_scripts_ovs-xapi-sync ? ?| ? 32 +++++--- > > ?5 files changed, 182 insertions(+), 11 deletions(-) > > ?create mode 100644 tests/MockXenAPI.py > > ?create mode 100644 tests/ovs-xapi-sync.at > > > > diff --git a/tests/MockXenAPI.py b/tests/MockXenAPI.py > > new file mode 100644 > > index 0000000..14af196 > > --- /dev/null > > +++ b/tests/MockXenAPI.py > > @@ -0,0 +1,82 @@ > > +# Copyright (c) 2011 Nicira Networks > > +# > > +# Licensed under the Apache License, Version 2.0 (the "License"); > > +# you may not use this file except in compliance with the License. > > +# You may obtain a copy of the License at: > > +# > > +# ? ? http://www.apache.org/licenses/LICENSE-2.0 > > +# > > +# Unless required by applicable law or agreed to in writing, software > > +# distributed under the License is distributed on an "AS IS" BASIS, > > +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > > +# See the License for the specific language governing permissions and > > +# limitations under the License. > > + > > +def xapi_local(): > > + ? ?return Session() > > + > > +class Session(object): > > + ? ?def __init__(self): > > + ? ? ? ?self.xenapi = XenAPI() > > + > > +class Failure(Exception): > > + ? ?pass > > + > > +class XenAPI(object): > > + ? ?def __init__(self): > > + ? ? ? ?self.network = Network() > > + ? ? ? ?self.pool = Pool() > > + ? ? ? ?self.VIF = VIF() > > + > > + ? ?def login_with_password(self, unused_username, unused_password): > > + ? ? ? ?pass > > + > > +class RecordRef(object): > > + ? ?def __init__(self, attrs): > > + ? ? ? ?self.attrs = attrs > > + > > +class Table(object): > > + ? ?def __init__(self, records): > > + ? ? ? ?self.records = records > > + > > + ? ?def get_all(self): > > + ? ? ? ?return [RecordRef(rec) for rec in self.records] > > + > > + ? ?def get_by_uuid(self, uuid): > > + ? ? ? ?recs = [rec for rec in self.records if rec["uuid"] == uuid] > > + ? ? ? ?if len(recs) != 1: > > + ? ? ? ? ? ?raise Failure("No record with UUID %s" % uuid) > > + ? ? ? ?return RecordRef(recs[0]) > > + > > + ? ?def get_record(self, record_ref): > > + ? ? ? ?return record_ref.attrs > > + > > +class Network(Table): > > + ? ?__records = ({"uuid": "9b66c68b-a74e-4d34-89a5-20a8ab352d1e", > > + ? ? ? ? ? ? ? ? ?"bridge": "xenbr0", > > + ? ? ? ? ? ? ? ? ?"other_config": > > + ? ? ? ? ? ? ? ? ? ? ?{"vswitch-controller-fail-mode": "secure", > > + ? ? ? ? ? ? ? ? ? ? ? "nicira-bridge-id": "custom bridge ID"}}, > > + ? ? ? ? ? ? ? ? {"uuid": "e1c9019d-375b-45ac-a441-0255dd2247de", > > + ? ? ? ? ? ? ? ? ?"bridge": "xenbr1", > > + ? ? ? ? ? ? ? ? ?"other_config": > > + ? ? ? ? ? ? ? ? ? ? ?{"vswitch-disable-in-band": "true"}}) > > + > > + ? ?def __init__(self): > > + ? ? ? ?Table.__init__(self, Network.__records) > > + > > +class Pool(Table): > > + ? ?__records = ({"uuid": "7a793edf-e5f4-4994-a0f9-cee784c0cda3", > > + ? ? ? ? ? ? ? ? ?"other_config": > > + ? ? ? ? ? ? ? ? ? ? ?{"vswitch-controller-fail-mode": "secure"}},) > > + > > + ? ?def __init__(self): > > + ? ? ? ?Table.__init__(self, Pool.__records) > > + > > +class VIF(Table): > > + ? ?__records = ({"uuid": "6ab1b260-398e-49ba-827b-c7696108964c", > > + ? ? ? ? ? ? ? ? ?"other_config": > > + ? ? ? ? ? ? ? ? ? ? ?{"nicira-iface-id": "custom iface ID"}},) > > + > > + ? ?def __init__(self): > > + ? ? ? ?Table.__init__(self, VIF.__records) > > diff --git a/tests/automake.mk b/tests/automake.mk > > index dcf6026..8d019e7 100644 > > --- a/tests/automake.mk > > +++ b/tests/automake.mk > > @@ -52,6 +52,7 @@ TESTSUITE_AT = \ > > ? ? ? ?tests/ovsdb-idl.at \ > > ? ? ? ?tests/ovs-vsctl.at \ > > ? ? ? ?tests/ovs-monitor-ipsec.at \ > > + ? ? ? tests/ovs-xapi-sync.at \ > > ? ? ? ?tests/interface-reconfigure.at > > ?TESTSUITE = $(srcdir)/tests/testsuite > > ?DISTCLEANFILES += tests/atconfig tests/atlocal > > @@ -335,7 +336,8 @@ EXTRA_DIST += \ > > ? ? ? ?tests/test-json.py \ > > ? ? ? ?tests/test-jsonrpc.py \ > > ? ? ? ?tests/test-ovsdb.py \ > > - ? ? ? tests/test-reconnect.py > > + ? ? ? tests/test-reconnect.py \ > > + ? ? ? tests/MockXenAPI.py > > > > ?if HAVE_OPENSSL > > ?TESTPKI_FILES = \ > > diff --git a/tests/ovs-xapi-sync.at b/tests/ovs-xapi-sync.at > > new file mode 100644 > > index 0000000..b2bfff5 > > --- /dev/null > > +++ b/tests/ovs-xapi-sync.at > > @@ -0,0 +1,74 @@ > > +AT_BANNER([ovs-xapi-sync]) > > + > > +AT_SETUP([ovs-xapi-sync]) > > +AT_SKIP_IF([test $HAVE_PYTHON = no]) > > + > > +# Mock up the XenAPI. > > +cp "$top_srcdir/tests/MockXenAPI.py" XenAPI.py > > +PYTHONPATH=`pwd`:$PYTHONPATH > > +export PYTHONPATH > > + > > +OVS_PKGDATADIR=`pwd`; export OVS_PKGDATADIR > > +cp "$top_srcdir/vswitchd/vswitch.ovsschema" . > > + > > +cp "$top_srcdir/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync" \ > > + ? ovs-xapi-sync > > + > > +trap 'kill `cat pid ovs-xapi-sync.pid`' 0 > > + > > +mkdir var var/run > > +touch var/run/xapi_init_complete.cookie > > + > > +ovs_vsctl () { > > + ? ?ovs-vsctl --timeout=5 --no-wait -vreconnect:ANY:emer --db=unix:socket > > "$@" > > +} > > + > > +# Start ovsdb-server. > > +OVS_VSCTL_SETUP > > + > > +# Start ovs-xapi-sync. > > +AT_CHECK([$PYTHON ./ovs-xapi-sync "--pidfile-name=`pwd`/ovs-xapi-sync.pid" > > \ > > + ? ? ? ? ? ? ? ? ?"--root-prefix=`pwd`" unix:socket >log 2>&1 &]) > > +AT_CAPTURE_FILE([log]) > > + > > +# Add bridges and check ovs-xapi-sync's work. > > +AT_CHECK([ovs_vsctl -- add-br xenbr0 -- add-br xenbr1]) > > +OVS_WAIT_UNTIL([test "X`ovs_vsctl get bridge xenbr0 fail-mode`" != > > "X[[]]"]) > > +AT_CHECK([ovs_vsctl \ > > + ? ? ? ? ? ? ? ?-- get bridge xenbr0 fail-mode other-config external-ids \ > > + ? ? ? ? ? ? ? ?-- get bridge xenbr1 fail-mode other-config external-ids], > > [0], > > + ? ? ? ? [[secure > > +{} > > +{bridge-id="custom bridge ID"} > > +secure > > +{disable-in-band="true"} > > +{} > > +]]) > > + > > +# Add vif and check daemon's work. > > +AT_CHECK([ovs_vsctl \ > > + ? ? ? ? ? ? ? ?-- add-port xenbr0 vif1.0 \ > > + ? ? ? ? ? ? ? ?-- set Interface vif1.0 > > 'external-ids={attached-mac="00:11:22:33:44:55", > > xs-network-uuid="9b66c68b-a74e-4d34-89a5-20a8ab352d1e", > > xs-vif-uuid="6ab1b260-398e-49ba-827b-c7696108964c", > > xs-vm-uuid="fcb8a3f6-dc04-41d2-8b8a-55afd2b755b8"'}]) > > +OVS_WAIT_UNTIL([ovs_vsctl get interface vif1.0 external-ids:iface-id > > >/dev/null 2>&1]) > > +AT_CHECK([ovs_vsctl get interface vif1.0 external-ids], [0], > > + ?[{attached-mac="00:11:22:33:44:55", iface-id="custom iface ID", > > iface-status=active, > > xs-network-uuid="9b66c68b-a74e-4d34-89a5-20a8ab352d1e", > > xs-vif-uuid="6ab1b260-398e-49ba-827b-c7696108964c", > > xs-vm-uuid="fcb8a3f6-dc04-41d2-8b8a-55afd2b755b8"} > > +]) > > + > > +# Add corresponding tap and check daemon's work. > > +AT_CHECK([ovs_vsctl add-port xenbr0 tap1.0]) > > +OVS_WAIT_UNTIL([ovs_vsctl get interface tap1.0 external-ids:iface-id > > >/dev/null 2>&1]) > > +AT_CHECK([ovs_vsctl \ > > + ? ? ? ? ? ? ? ?-- get interface vif1.0 external-ids \ > > + ? ? ? ? ? ? ? ?-- get interface tap1.0 external-ids], [0], > > + ?[{attached-mac="00:11:22:33:44:55", iface-id="custom iface ID", > > iface-status=inactive, > > xs-network-uuid="9b66c68b-a74e-4d34-89a5-20a8ab352d1e", > > xs-vif-uuid="6ab1b260-398e-49ba-827b-c7696108964c", > > xs-vm-uuid="fcb8a3f6-dc04-41d2-8b8a-55afd2b755b8"} > > +{attached-mac="00:11:22:33:44:55", iface-id="custom iface ID", > > iface-status=active, > > xs-network-uuid="9b66c68b-a74e-4d34-89a5-20a8ab352d1e", > > xs-vif-uuid="6ab1b260-398e-49ba-827b-c7696108964c", > > xs-vm-uuid="fcb8a3f6-dc04-41d2-8b8a-55afd2b755b8"} > > +]) > > + > > +# Remove corresponding tap and check daemon's work. > > +AT_CHECK([ovs_vsctl del-port tap1.0]) > > +OVS_WAIT_UNTIL([test `ovs_vsctl get interface vif1.0 > > external-ids:iface-status` = active]) > > +AT_CHECK([ovs_vsctl get interface vif1.0 external-ids], [0], > > + ?[{attached-mac="00:11:22:33:44:55", iface-id="custom iface ID", > > iface-status=active, > > xs-network-uuid="9b66c68b-a74e-4d34-89a5-20a8ab352d1e", > > xs-vif-uuid="6ab1b260-398e-49ba-827b-c7696108964c", > > xs-vm-uuid="fcb8a3f6-dc04-41d2-8b8a-55afd2b755b8"} > > +]) > > + > > +AT_CLEANUP > > diff --git a/tests/testsuite.at b/tests/testsuite.at > > index 19b7802..8608572 100644 > > --- a/tests/testsuite.at > > +++ b/tests/testsuite.at > > @@ -65,4 +65,5 @@ m4_include([tests/ofproto-dpif.at]) > > ?m4_include([tests/ovsdb.at]) > > ?m4_include([tests/ovs-vsctl.at]) > > ?m4_include([tests/ovs-monitor-ipsec.at]) > > +m4_include([tests/ovs-xapi-sync.at]) > > ?m4_include([tests/interface-reconfigure.at]) > > diff --git a/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync > > b/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync > > index 91ada47..ddc85e4 100755 > > --- a/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync > > +++ b/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync > > @@ -39,6 +39,7 @@ import ovs.util > > ?import ovs.daemon > > ?import ovs.db.idl > > > > +root_prefix = '' ? ? ? ? ? ? ? ?# Prefix for absolute file names, for > > testing. > > ?s_log = logging.getLogger("ovs-xapi-sync") > > ?vsctl="/usr/bin/ovs-vsctl" > > ?session = None > > @@ -57,9 +58,9 @@ def init_session(): > > ? ? try: > > ? ? ? ? session = XenAPI.xapi_local() > > ? ? ? ? session.xenapi.login_with_password("", "") > > - ? ?except: > > + ? ?except XenAPI.Failure, e: > > ? ? ? ? session = None > > - ? ? ? ?s_log.warning("Couldn't login to XAPI") > > + ? ? ? ?s_log.warning("Couldn't login to XAPI (%s)" % e) > > ? ? ? ? return False > > > > ? ? return True > > @@ -208,8 +209,10 @@ def usage(): > > ? ? print "usage: %s [OPTIONS] DATABASE" % sys.argv[0] > > ? ? print "where DATABASE is a socket on which ovsdb-server is listening." > > ? ? ovs.daemon.usage() > > - ? ?print "Other options:" > > - ? ?print " ?-h, --help ? ? ? ? ? ? ? display this help message" > > + ? ?print """\ > > +Other options: > > + ? ?--root-prefix=DIR ? Use DIR as alternate root directory (for testing). > > + ? ?-h, --help ? ? ? ? ? ? ? display this help message""" > > ? ? sys.exit(0) > > > > ?def handler(signum, _): > > @@ -220,16 +223,21 @@ def handler(signum, _): > > ?def main(argv): > > ? ? global force_run > > > > - ? ?l_handler = logging.handlers.RotatingFileHandler( > > + ? ?s_log.addHandler(logging.StreamHandler()) > > + ? ?try: > > + ? ? ? ?l_handler = logging.handlers.RotatingFileHandler( > > ? ? ? ? ? ? "/var/log/openvswitch/ovs-xapi-sync.log") > > - ? ?l_formatter = logging.Formatter('%(filename)s: %(levelname)s: > > %(message)s') > > - ? ?l_handler.setFormatter(l_formatter) > > - ? ?s_log.addHandler(l_handler) > > + ? ? ? ?l_formatter = logging.Formatter('%(filename)s: %(levelname)s: > > %(message)s') > > + ? ? ? ?l_handler.setFormatter(l_formatter) > > + ? ? ? ?s_log.addHandler(l_handler) > > + ? ?except IOError, e: > > + ? ? ? ?logging.basicConfig() > > + ? ? ? ?s_log.warn("failed to open logfile (%s)" % e) > > ? ? s_log.setLevel(logging.INFO) > > > > ? ? try: > > ? ? ? ? options, args = getopt.gnu_getopt( > > - ? ? ? ? ? ?argv[1:], 'h', ['help'] + ovs.daemon.LONG_OPTIONS) > > + ? ? ? ? ? ?argv[1:], 'h', ['help', 'root-prefix='] + > > ovs.daemon.LONG_OPTIONS) > > ? ? except getopt.GetoptError, geo: > > ? ? ? ? sys.stderr.write("%s: %s\n" % (ovs.util.PROGRAM_NAME, geo.msg)) > > ? ? ? ? sys.exit(1) > > @@ -237,6 +245,9 @@ def main(argv): > > ? ? for key, value in options: > > ? ? ? ? if key in ['-h', '--help']: > > ? ? ? ? ? ? usage() > > + ? ? ? ?elif key == '--root-prefix': > > + ? ? ? ? ? ?global root_prefix > > + ? ? ? ? ? ?root_prefix = value > > ? ? ? ? elif not ovs.daemon.parse_opt(key, value): > > ? ? ? ? ? ? sys.stderr.write("%s: unhandled option %s\n" > > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?% (ovs.util.PROGRAM_NAME, key)) > > @@ -257,7 +268,8 @@ def main(argv): > > > > ? ? # This daemon is usually started before XAPI, but to complete our > > ? ? # tasks, we need it. ?Wait here until it's up. > > - ? ?while not os.path.exists("/var/run/xapi_init_complete.cookie"): > > + ? ?cookie_file = root_prefix + "/var/run/xapi_init_complete.cookie" > > + ? ?while not os.path.exists(cookie_file): > > ? ? ? ? time.sleep(1) > > > > ? ? signal.signal(signal.SIGHUP, handler) > > -- > > 1.7.4.4 > > > > _______________________________________________ > > dev mailing list > > [email protected] > > http://openvswitch.org/mailman/listinfo/dev > > _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
