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
