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

Reply via email to