mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 02:30:03 +01:00
The attached patch implements more of the Xen-API functionality related
to the vTPM. Signed-off-by: Stefan Berger <stefanb@us.ibm.com>
This commit is contained in:
1 parent
c2739fc6af
commit
e5c3d644cd
5 files changed
+95
-23
No files matched your search
@@ -20,8 +20,6 @@ actions_after_shutdown = 'destroy'
|
||||
actions_after_reboot = 'restart'
|
||||
actions_after_suspend = 'destroy'
|
||||
actions_after_crash = 'restart'
|
||||
TPM_instance = ''
|
||||
TPM_backend = ''
|
||||
bios_boot = ''
|
||||
platform_std_VGA = False
|
||||
platform_serial = ''
|
||||
|
||||
@@ -42,6 +42,7 @@ COMMANDS = {
|
||||
'vdi-rename': ('<vdi_uuid> <new_name>', 'Rename VDI'),
|
||||
'vdi-delete': ('<vdi_uuid>', 'Delete VDI'),
|
||||
'vif-create': ('<domname> <pycfg>', 'Create VIF attached to domname'),
|
||||
'vtpm-create' : ('<domname> <pycfg>', 'Create VTPM attached to domname'),
|
||||
|
||||
'vm-create': ('<pycfg>', 'Create VM with python config'),
|
||||
'vm-destroy': ('<domname>', 'Delete VM'),
|
||||
@@ -208,16 +209,22 @@ def xapi_vm_list(*args):
|
||||
if is_long:
|
||||
vbds = vm_info['vbds']
|
||||
vifs = vm_info['vifs']
|
||||
vtpms = vm_info['vtpms']
|
||||
vif_infos = []
|
||||
vbd_infos = []
|
||||
vtpm_infos = []
|
||||
for vbd in vbds:
|
||||
vbd_info = execute(server.VBD.get_record, session, vbd)
|
||||
vbd_infos.append(vbd_info)
|
||||
for vif in vifs:
|
||||
vif_info = execute(server.VIF.get_record, session, vif)
|
||||
vif_infos.append(vif_info)
|
||||
for vtpm in vtpms:
|
||||
vtpm_info = execute(server.VTPM.get_record, session, vtpm)
|
||||
vtpm_infos.append(vtpm_info)
|
||||
vm_info['vbds'] = vbd_infos
|
||||
vm_info['vifs'] = vif_infos
|
||||
vm_info['vtpms'] = vtpm_infos
|
||||
pprint(vm_info)
|
||||
else:
|
||||
print VM_LIST_FORMAT % _stringify(vm_info)
|
||||
@@ -377,8 +384,30 @@ def xapi_vdi_rename(*args):
|
||||
print 'Renaming VDI %s to %s' % (vdi_uuid, vdi_name)
|
||||
result = execute(server.VDI.set_name_label, session, vdi_uuid, vdi_name)
|
||||
print 'Done.'
|
||||
|
||||
|
||||
|
||||
|
||||
def xapi_vtpm_create(*args):
|
||||
server, session = _connect()
|
||||
domname = args[0]
|
||||
cfg = _read_python_cfg(args[1])
|
||||
|
||||
vm_uuid = resolve_vm(server, session, domname)
|
||||
cfg['VM'] = vm_uuid
|
||||
print "Creating vTPM with cfg = %s" % cfg
|
||||
vtpm_uuid = execute(server.VTPM.create, session, cfg)
|
||||
print "Done. (%s)" % vtpm_uuid
|
||||
vtpm_id = execute(server.VTPM.get_instance, session, vtpm_uuid)
|
||||
print "Has instance number '%s'" % vtpm_id
|
||||
vtpm_be = execute(server.VTPM.get_backend, session, vtpm_uuid)
|
||||
print "Has backend in '%s'" % vtpm_be
|
||||
driver = execute(server.VTPM.get_driver, session, vtpm_uuid)
|
||||
print "Has driver type '%s'" % driver
|
||||
vtpm_rec = execute(server.VTPM.get_record, session, vtpm_uuid)
|
||||
print "Has vtpm record '%s'" % vtpm_rec
|
||||
vm = execute(server.VTPM.get_VM, session, vtpm_uuid)
|
||||
print "Has VM '%s'" % vm
|
||||
|
||||
|
||||
#
|
||||
# Command Line Utils
|
||||
#
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
type = 'paravirtualised'
|
||||
backend = 'Domain-0'
|
||||
instance = 1
|
||||
@@ -1282,11 +1282,11 @@ class XendAPI:
|
||||
# Xen API: Class VTPM
|
||||
# ----------------------------------------------------------------
|
||||
|
||||
VTPM_attr_ro = [ ]
|
||||
VTPM_attr_rw = ['type',
|
||||
'VM',
|
||||
VTPM_attr_rw = [ ]
|
||||
VTPM_attr_ro = ['VM',
|
||||
'backend',
|
||||
'instance']
|
||||
'instance',
|
||||
'driver']
|
||||
|
||||
VTPM_attr_inst = VTPM_attr_rw
|
||||
|
||||
@@ -1307,17 +1307,61 @@ class XendAPI:
|
||||
|
||||
return xen_api_success(cfg)
|
||||
|
||||
# Class Functions
|
||||
def vtpm_get_instance(self, session, vtpm_ref):
|
||||
xendom = XendDomain.instance()
|
||||
vm = xendom.get_vm_with_dev_uuid('vtpm', vtpm_ref)
|
||||
if not vm:
|
||||
return xen_api_error(XEND_ERROR_VTPM_INVALID)
|
||||
cfg = vm.get_dev_xenapi_config('vtpm', vtpm_ref)
|
||||
if not cfg:
|
||||
return xen_api_error(XEND_ERROR_VTPM_INVALID)
|
||||
if cfg.has_key('instance'):
|
||||
instance = cfg['instance']
|
||||
else:
|
||||
instance = -1
|
||||
return xen_api_success(instance)
|
||||
|
||||
def vtpm_get_driver(self, session, vtpm_ref):
|
||||
xendom = XendDomain.instance()
|
||||
vm = xendom.get_vm_with_dev_uuid('vtpm', vtpm_ref)
|
||||
if not vm:
|
||||
return xen_api_error(XEND_ERROR_VTPM_INVALID)
|
||||
cfg = vm.get_dev_xenapi_config('vtpm', vtpm_ref)
|
||||
if not cfg:
|
||||
return xen_api_error(XEND_ERROR_VTPM_INVALID)
|
||||
if cfg.has_key('type'):
|
||||
driver = cfg['type']
|
||||
else:
|
||||
driver = "Unknown"
|
||||
return xen_api_success(driver)
|
||||
|
||||
def vtpm_get_backend(self, session, vtpm_ref):
|
||||
xendom = XendDomain.instance()
|
||||
vm = xendom.get_vm_with_dev_uuid('vtpm', vtpm_ref)
|
||||
if not vm:
|
||||
return xen_api_error(XEND_ERROR_VTPM_INVALID)
|
||||
cfg = vm.get_dev_xenapi_config('vtpm', vtpm_ref)
|
||||
if not cfg:
|
||||
return xen_api_error(XEND_ERROR_VTPM_INVALID)
|
||||
if cfg.has_key('backend'):
|
||||
backend = cfg['backend']
|
||||
else:
|
||||
backend = "Domain-0"
|
||||
return xen_api_success(backend)
|
||||
|
||||
def vtpm_get_vm(self, session, vtpm_ref):
|
||||
xendom = XendDomain.instance()
|
||||
return xen_api_success(xendom.get_dev_property('vtpm', vtpm_ref, 'VM'))
|
||||
|
||||
# class methods
|
||||
def vtpm_create(self, session, vtpm_struct):
|
||||
xendom = XendDomain.instance()
|
||||
if xendom.is_valid_vm(vtpm_struct['VM']):
|
||||
dom = xendom.get_vm_by_uuid(vtpm_struct['VM'])
|
||||
try:
|
||||
vtpm_ref = dom.create_vtpm(vtpm_struct)
|
||||
xendom.managed_config_save(dom)
|
||||
return xen_api_success(vtpm_ref)
|
||||
except XendError:
|
||||
return xen_api_error(XEND_ERROR_TODO)
|
||||
vtpm_ref = dom.create_vtpm(vtpm_struct)
|
||||
xendom.managed_config_save(dom)
|
||||
return xen_api_success(vtpm_ref)
|
||||
else:
|
||||
return xen_api_error(XEND_ERROR_DOMAIN_INVALID)
|
||||
|
||||
|
||||
@@ -1689,10 +1689,6 @@ class XendDomainInfo:
|
||||
return '' # TODO
|
||||
def get_power_state(self):
|
||||
return XEN_API_VM_POWER_STATE[self.state]
|
||||
def get_tpm_instance(self):
|
||||
return '' # TODO
|
||||
def get_tpm_backend(self):
|
||||
return '' # TODO
|
||||
def get_bios_boot(self):
|
||||
return '' # TODO
|
||||
def get_platform_std_vga(self):
|
||||
@@ -1833,6 +1829,9 @@ class XendDomainInfo:
|
||||
else:
|
||||
config['mode'] = 'RW'
|
||||
|
||||
if dev_class == 'vtpm':
|
||||
config['driver'] = 'paravirtualised' # TODO
|
||||
|
||||
return config
|
||||
|
||||
def get_dev_property(self, dev_class, dev_uuid, field):
|
||||
@@ -1927,15 +1926,14 @@ class XendDomainInfo:
|
||||
@rtype: string
|
||||
"""
|
||||
|
||||
if self.state not in (DOM_STATE_HALTED,):
|
||||
raise VmError("Can only add vTPM to a halted domain.")
|
||||
if self.get_vtpms() != []:
|
||||
raise VmError('Domain already has a vTPM.')
|
||||
dev_uuid = self.info.device_add('vtpm', cfg_xenapi = xenapi_vtpm)
|
||||
if not dev_uuid:
|
||||
raise XendError('Failed to create device')
|
||||
|
||||
if self.state in (DOM_STATE_HALTED,):
|
||||
sxpr = self.info.device_sxpr(dev_uuid)
|
||||
devid = self.getDeviceController('vtpm').createDevice(sxpr)
|
||||
raise XendError("Device creation failed")
|
||||
|
||||
return dev_uuid
|
||||
|
||||
def has_device(self, dev_class, dev_uuid):
|
||||
|
||||