+#!/usr/bin/python
+#
+# Script to retrieve extended information about VIFs that are
+# needed by the controller. This is called by the "vif" script,
+# which is run when virtual interfaces are added and removed.
+
+# Copyright (C) 2009 Nicira Networks, Inc.
+#
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved. This file is offered as-is,
+# without warranty of any kind.
+
+import sys
+import XenAPI
+import xen.lowlevel.xs
+
+# Query XenStore for the opaque reference of this vif
+def get_vif_ref(domid, devid):
+ xenstore = xen.lowlevel.xs.xs()
+ t = xenstore.transaction_start()
+ vif_ref = xenstore.read(t, '/xapi/%s/private/vif/%s/ref' % (domid, devid))
+ xenstore.transaction_end(t)
+ return vif_ref
+
+# Query XAPI for the information we need using the vif's opaque reference
+def dump_vif_info(domid, devid, vif_ref):
+ try:
+ session = XenAPI.xapi_local()
+ session.xenapi.login_with_password("root", "")
+ vif_rec = session.xenapi.VIF.get_record(vif_ref)
+ net_rec = session.xenapi.network.get_record(vif_rec["network"])
+ vm_rec = session.xenapi.VM.get_record(vif_rec["VM"])
+
+ sys.stdout.write('--add=port.vif%s.%s.network-uuid=%s '
+ % (domid, devid, net_rec["uuid"]))
+ sys.stdout.write('--add=port.vif%s.%s.vif-mac=%s '
+ % (domid, devid, vif_rec["MAC"]))
+ sys.stdout.write('--add=port.vif%s.%s.vif-uuid=%s '
+ % (domid, devid, vif_rec["uuid"]))
+ sys.stdout.write('--add=port.vif%s.%s.vm-uuid=%s '
+ % (domid, devid, vm_rec["uuid"]))
+ finally:
+ session.xenapi.session.logout()
+
+if __name__ == '__main__':
+ if (len(sys.argv) != 3):
+ sys.stderr.write("ERROR: %s <domid> <devid>\n")
+ sys.exit(1)
+
+ domid = sys.argv[1]
+ devid = sys.argv[2]
+
+ vif_ref = get_vif_ref(domid, devid)
+ if not vif_ref:
+ sys.stderr.write("ERROR: Could not find interface vif%s.%s\n"
+ % (domid, devid))
+ sys.exit(1)
+
+ dump_vif_info(domid, devid, vif_ref)
+ sys.exit(0)