diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2008-07-31 13:31:15 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2008-07-31 13:31:15 +0100 |
commit | f1b5be9017b8601c9b6e70c3565e0a3867267798 (patch) | |
tree | 8af6b4dcbb0ab42419aca7392b309d87c520cee5 /tools | |
parent | fc57b9025f90edc1a5587e6a26682005b7ec14e9 (diff) | |
download | xen-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.py | 53 |
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() |