X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=xenserver%2Fusr_share_openvswitch_scripts_ovs-xapi-sync;h=ac56d371cd51ae1be7ee2278c83e91949c520081;hb=ede1aa66eca16c812a4349a5aad4131b291f7293;hp=7c78251e2443f8cece635f0a0ffcd050f2eef6cc;hpb=bf42f674e77a4cb01863b3f975d3258b3c89dd58;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 7c78251e2..ac56d371c 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 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,6 +35,7 @@ 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 @@ -81,13 +82,41 @@ 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 whose PIF does not have a +# VLAN associated with it. +def get_single_bridge_id(bridge_ids, default=None): + if not init_session(): + vlog.warn("Failed to get single bridge id from %s because" + "XAPI session could not be initialized" % bridge_ids) + return default + + for bridge_id in bridge_ids: + try: + recs = session.xenapi.network.get_all_records_where(\ + 'field "uuid"="%s"' % bridge_id) + if recs: + pifs = recs.values()[0]['PIFs'] + for pif in pifs: + try: + rec = session.xenapi.PIF.get_record(pif) + if rec['VLAN'] == '-1': + return bridge_id + except XenAPI.Failure: + vlog.warn("Could not find XAPI entry for PIF %s" % pif) + continue + + except XenAPI.Failure: + vlog.warn("Could not find XAPI entry for bridge_id %s" % bridge_id) + continue + + 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 @@ -162,6 +191,7 @@ def set_or_delete(d, key, value): def set_external_id(row, key, value): + row.verify("external_ids") external_ids = row.external_ids if set_or_delete(external_ids, key, value): row.external_ids = external_ids @@ -186,6 +216,7 @@ def update_fail_mode(row): if fail_mode not in ['standalone', 'secure']: fail_mode = 'standalone' + row.verify("fail_mode") if row.fail_mode != fail_mode: row.fail_mode = fail_mode @@ -197,6 +228,7 @@ def update_in_band_mgmt(row): dib = rec['other_config'].get('vswitch-disable-in-band') + row.verify("other_config") other_config = row.other_config if dib and dib not in ['true', 'false']: vlog.warn('"%s" isn\'t a valid setting for ' @@ -233,7 +265,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) @@ -283,6 +315,9 @@ def main(): bridge_id = nbd if bridge_id is None: bridge_id = row.external_ids.get("xs-network-uuids") + if bridge_id and len(bridge_id.split(";")) > 1: + bridge_ids = bridge_id.split(";") + bridge_id = get_single_bridge_id(bridge_ids, bridge_ids[0]) if bridge_id is not None: set_external_id(row, "bridge-id", bridge_id.split(";")[0]) @@ -358,6 +393,7 @@ def main(): iface_ids = new_iface_ids vm_ids = new_vm_ids + txn.add_comment("ovs-xapi-sync: Updating records from XAPI") txn.commit_block() unixctl_server.close()