#!/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.
import ovs.daemon
import ovs.db.idl
import ovs.unixctl
+import ovs.unixctl.server
vlog = ovs.vlog.Vlog("ovs-xapi-sync")
session = None
" 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:
+ recs = session.xenapi.network.get_all_records_where('field "uuid"="%s"' % bridge_id)
+ if recs:
+ pifs = recs.values()[0]['PIFs']
+ for pif in pifs:
+ rec = session.xenapi.PIF.get_record(pif)
+ if rec['VLAN'] == '-1':
+ return bridge_id
+
+ 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
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
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
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 '
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)
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])
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()