X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=xenserver%2Fusr_share_openvswitch_scripts_ovs-xapi-sync;h=1c8ad51a4b18b665a536effb87b8274615308478;hb=5ea1eab089607de8f87189fe4463364e26576070;hp=77c07bcd6e356266e3159a2fdede125c7d81f9ff;hpb=932f36ebdb5be9decb8e95befb3acd986c811185;p=sliver-openvswitch.git diff --git a/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync b/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync index 77c07bcd6..1c8ad51a4 100755 --- a/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync +++ b/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync @@ -1,5 +1,5 @@ #!/usr/bin/python -# Copyright (c) 2009, 2010, 2011, 2012 Nicira Networks +# Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -35,11 +35,13 @@ from ovs.db import types import ovs.daemon import ovs.db.idl import ovs.unixctl +import ovs.unixctl.server vlog = ovs.vlog.Vlog("ovs-xapi-sync") session = None flush_cache = False exiting = False +xapi_down = False def unixctl_exit(conn, unused_argv, unused_aux): @@ -81,13 +83,25 @@ def get_network_by_bridge(br_name): " XAPI session could not be initialized" % br_name) return None - for n in session.xenapi.network.get_all(): - rec = session.xenapi.network.get_record(n) - if rec['bridge'] == br_name: - return rec + recs = session.xenapi.network.get_all_records_where('field "bridge"="%s"' % br_name) + if len(recs) > 0: + return recs.values()[0] return None +# There are possibilities when multiple xs-network-uuids are set for a bridge. +# In cases like that, we should choose the bridge-id associated with the bridge +# name. +def get_single_bridge_id(bridge_ids, br_name, default=None): + global xapi_down + + rec = get_network_by_bridge(br_name) + if rec and rec['uuid'] in bridge_ids: + return rec['uuid'] + + vlog.warn("Failed to get a single bridge id from Xapi.") + xapi_down = True + return default # By default, the "bridge-id" external id in the Bridge table is the # same as "xs-network-uuids". This may be overridden by defining a @@ -209,7 +223,7 @@ def update_in_band_mgmt(row): def main(): - global flush_cache + global flush_cache, xapi_down parser = argparse.ArgumentParser() parser.add_argument("database", metavar="DATABASE", @@ -236,7 +250,7 @@ def main(): ovs.unixctl.command_register("exit", "", 0, 0, unixctl_exit, None) ovs.unixctl.command_register("flush-cache", "", 0, 0, unixctl_flush_cache, None) - error, unixctl_server = ovs.unixctl.UnixctlServer.create(None) + error, unixctl_server = ovs.unixctl.server.UnixctlServer.create(None) if error: ovs.util.ovs_fatal(error, "could not create unixctl server", vlog) @@ -256,13 +270,18 @@ def main(): break; idl.run() - if not flush_cache and seqno == idl.change_seqno: + if not xapi_down and not flush_cache and seqno == idl.change_seqno: poller = ovs.poller.Poller() unixctl_server.wait(poller) idl.wait(poller) poller.block() continue + if xapi_down: + vlog.warn("Xapi is probably down. Retry again after a second.") + time.sleep(1) + xapi_down = False + if flush_cache: vlog.info("Flushing cache as the result of unixctl.") bridges = {} @@ -275,22 +294,27 @@ def main(): new_bridges = {} for row in idl.tables["Bridge"].rows.itervalues(): - if row.name in bridges: - nbd = bridges[row.name] - else: - # New bridge. + bridge_id = bridges.get(row.name) + if bridge_id is None: + # Configure the new bridge. update_fail_mode(row) update_in_band_mgmt(row) - nbd = get_bridge_id(row.name) - bridge_id = nbd - if bridge_id is None: - bridge_id = row.external_ids.get("xs-network-uuids") + # Get the correct bridge_id, if we can. + bridge_id = get_bridge_id(row.name) + if bridge_id is None: + xs_network_uuids = row.external_ids.get("xs-network-uuids") + if xs_network_uuids: + bridge_ids = xs_network_uuids.split(";") + if len(bridge_ids) == 1: + bridge_id = bridge_ids[0] + else: + bridge_id = get_single_bridge_id(bridge_ids, + row.name) + set_external_id(row, "bridge-id", bridge_id) if bridge_id is not None: - set_external_id(row, "bridge-id", bridge_id.split(";")[0]) - - new_bridges[row.name] = nbd + new_bridges[row.name] = bridge_id bridges = new_bridges iface_by_name = {}