From 6b7b7e42793fb1455d602df02e60d107fe874794 Mon Sep 17 00:00:00 2001 From: Marin Atanasov Nikolov Date: Thu, 16 Apr 2015 14:56:27 +0300 Subject: [PATCH] Issue #8: Commit widget for adding CD/DVD drives --- src/pvc/widget/device.py | 112 ++++++++++++++++++++++++++++++- src/pvc/widget/virtualmachine.py | 5 +- 2 files changed, 115 insertions(+), 2 deletions(-) diff --git a/src/pvc/widget/device.py b/src/pvc/widget/device.py index 968d011..32c0327 100644 --- a/src/pvc/widget/device.py +++ b/src/pvc/widget/device.py @@ -33,7 +33,7 @@ import pvc.widget.menu import pvc.widget.radiolist -__all__ = ['BaseDeviceWidget'] +__all__ = ['BaseDeviceWidget', 'AddCdromDeviceWidget',] class BaseDeviceWidget(object): @@ -117,3 +117,113 @@ def next_unit_number(self, controller): next_unit_number = max(used) + 1 if used else 0 return next_unit_number + + +class AddCdromDeviceWidget(BaseDeviceWidget): + """ + Widget for adding new CD/DVD drives + + Extends: + BaseDeviceWidget class + + Overrides: + display() method + + """ + def display(self): + controller = self.choose_controller( + controller=pyVmomi.vim.VirtualIDEController + ) + + if not controller: + return + + unit_number = self.next_unit_number( + controller=controller + ) + + backing_info = self.select_backing( + name='cdrom-{}-{}'.format(controller.key, unit_number) + ) + + if not backing_info: + return + + connect_info = pyVmomi.vim.VirtualDeviceConnectInfo( + allowGuestControl=True, + connected=False, + startConnected=False + ) + + device = pyVmomi.vim.VirtualCdrom( + backing=backing_info, + connectable=connect_info, + controllerKey=controller.key, + key=-1, + unitNumber=unit_number + ) + + device_change = pyVmomi.vim.VirtualDeviceConfigSpec( + device=device, + operation=pyVmomi.vim.VirtualDeviceConfigSpecOperation.add + ) + + spec = pyVmomi.vim.VirtualMachineConfigSpec( + deviceChange=[device_change] + ) + + task = self.obj.ReconfigVM_Task(spec=spec) + gauge = pvc.widget.gauge.TaskGauge( + dialog=self.dialog, + task=task, + title=self.title, + text='Adding CD/DVD drive ...' + ) + + gauge.display() + + def select_backing(self, name): + """ + Prompts the user to select device backing + + Args: + name (str): Device name to set + + Returns: + A vim.VirtualDeviceDeviceBackingInfo instance on success, + None otherwise + + """ + items = [ + pvc.widget.radiolist.RadioListItem(tag='Pass through'), + pvc.widget.radiolist.RadioListItem(tag='ATAPI emulation'), + ] + + radiolist = pvc.widget.radiolist.RadioList( + items=items, + dialog=self.dialog, + title=self.title, + text='Select device backing' + ) + + code, tag = radiolist.display() + if code in (self.dialog.CANCEL, self.dialog.ESC) or not tag: + self.dialog.msgbox( + title=self.title, + text='Invalid device backing selected' + ) + return + + if tag == 'Pass through': + backing_info = pyVmomi.vim.VirtualCdromRemotePassthroughBackingInfo( + deviceName=name, + useAutoDetect=False, + exclusive=False + ) + elif tag == 'ATAPI emulation': + backing_info = pyVmomi.vim.VirtualCdromRemoteAtapiBackingInfo( + deviceName=name, + useAutoDetect=False + ) + + return backing_info diff --git a/src/pvc/widget/virtualmachine.py b/src/pvc/widget/virtualmachine.py index 349660e..d1a3d22 100644 --- a/src/pvc/widget/virtualmachine.py +++ b/src/pvc/widget/virtualmachine.py @@ -37,6 +37,7 @@ import pvc.widget.alarm import pvc.widget.common +import pvc.widget.device import pvc.widget.debug import pvc.widget.event import pvc.widget.menu @@ -1353,7 +1354,9 @@ def display(self): ), pvc.widget.menu.MenuItem( tag='CD/DVD Drive', - description='Add CD/DVD drive' + description='Add CD/DVD drive', + on_select=pvc.widget.device.AddCdromDeviceWidget, + on_select_args=(self.agent, self.dialog, self.obj) ), pvc.widget.menu.MenuItem( tag='Hard Disk',