aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-07-31 13:31:15 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-07-31 13:31:15 +0100
commitf1b5be9017b8601c9b6e70c3565e0a3867267798 (patch)
tree8af6b4dcbb0ab42419aca7392b309d87c520cee5 /tools
parentfc57b9025f90edc1a5587e6a26682005b7ec14e9 (diff)
downloadxen-f1b5be9017b8601c9b6e70c3565e0a3867267798.tar.gz
xen-f1b5be9017b8601c9b6e70c3565e0a3867267798.tar.bz2
xen-f1b5be9017b8601c9b6e70c3565e0a3867267798.zip
xm on xenapi: Enable 'xm pci-{att,det}ach' commands to be executed via xen-api.
Signed-off-by: Yosuke Iwamatsu <y-iwamatsu@ab.jp.nec.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/python/xen/xm/main.py53
1 files changed, 51 insertions, 2 deletions
diff --git a/tools/python/xen/xm/main.py b/tools/python/xen/xm/main.py
index 36268d66a2..93d75b2ec9 100644
--- a/tools/python/xen/xm/main.py
+++ b/tools/python/xen/xm/main.py
@@ -2418,7 +2418,34 @@ def parse_pci_configuration(args, state):
def xm_pci_attach(args):
arg_check(args, 'pci-attach', 2, 3)
(dom, pci) = parse_pci_configuration(args, 'Initialising')
- server.xend.domain.device_configure(dom, pci)
+
+ if serverType == SERVER_XEN_API:
+
+ pci_dev = sxp.children(pci, 'dev')[0]
+ domain = int(sxp.child_value(pci_dev, 'domain'), 16)
+ bus = int(sxp.child_value(pci_dev, 'bus'), 16)
+ slot = int(sxp.child_value(pci_dev, 'slot'), 16)
+ func = int(sxp.child_value(pci_dev, 'func'), 16)
+ vslt = int(sxp.child_value(pci_dev, 'vslt'), 16)
+ name = "%04x:%02x:%02x.%01x" % (domain, bus, slot, func)
+
+ target_ref = None
+ for ppci_ref in server.xenapi.PPCI.get_all():
+ if name == server.xenapi.PPCI.get_name(ppci_ref):
+ target_ref = ppci_ref
+ break
+ if target_ref is None:
+ raise OptionError("Device %s not found" % name)
+
+ dpci_record = {
+ "VM": get_single_vm(dom),
+ "PPCI": target_ref,
+ "hotplug_slot": vslt
+ }
+ server.xenapi.DPCI.create(dpci_record)
+
+ else:
+ server.xend.domain.device_configure(dom, pci)
def xm_scsi_attach(args):
xenapi_unsupported()
@@ -2518,7 +2545,29 @@ def xm_network_detach(args):
def xm_pci_detach(args):
arg_check(args, 'pci-detach', 2)
(dom, pci) = parse_pci_configuration(args, 'Closing')
- server.xend.domain.device_configure(dom, pci)
+
+ if serverType == SERVER_XEN_API:
+
+ pci_dev = sxp.children(pci, 'dev')[0]
+ domain = int(sxp.child_value(pci_dev, 'domain'), 16)
+ bus = int(sxp.child_value(pci_dev, 'bus'), 16)
+ slot = int(sxp.child_value(pci_dev, 'slot'), 16)
+ func = int(sxp.child_value(pci_dev, 'func'), 16)
+ vslt = int(sxp.child_value(pci_dev, 'vslt'), 16)
+ name = "%04x:%02x:%02x.%01x" % (domain, bus, slot, func)
+
+ target_ref = None
+ for dpci_ref in server.xenapi.VM.get_DPCIs(get_single_vm(dom)):
+ ppci_ref = server.xenapi.DPCI.get_PPCI(dpci_ref)
+ if name == server.xenapi.PPCI.get_name(ppci_ref):
+ target_ref = ppci_ref
+ server.xenapi.DPCI.destroy(dpci_ref)
+ break
+ if target_ref is None:
+ raise OptionError("Device %s not assigned" % name)
+
+ else:
+ server.xend.domain.device_configure(dom, pci)
def xm_scsi_detach(args):
xenapi_unsupported()