[virt-tools-list] [virt-manager PATCH v2]RFC: addhardware: Add controller options to addhw wizard

Chen Hanxiao chen_han_xiao at 126.com
Wed Apr 9 15:55:47 UTC 2014


On 04/09/2014 11:20 PM, Cole Robinson wrote:
> On 04/09/2014 05:46 AM, Chen Hanxiao wrote:
>> Add controller options to addhw wizard.
>>
>> https://bugzilla.redhat.com/show_bug.cgi?id=1076607
>>
>> Signed-off-by: Chen Hanxiao <chenhanxiao at cn.fujitsu.com>
>> ---
>> v2: move ui 'controller' after 'disk'
>>      hide model label and combo when controller doesn't have model option.
>>      use same controller models as details shows
>>      disable adding pci controller
>>
>>   ui/addhardware.ui          | 137 ++++++++++++++++++++++++++++++++++++---------
>>   virtManager/addhardware.py | 119 ++++++++++++++++++++++++++++++++++-----
>>   2 files changed, 214 insertions(+), 42 deletions(-)
>>
>> diff --git a/virtManager/addhardware.py b/virtManager/addhardware.py
>> index bd999cc..fb112da 100644
>> --- a/virtManager/addhardware.py
>> +++ b/virtManager/addhardware.py
>> @@ -44,20 +44,21 @@ from virtManager.addstorage import vmmAddStorage
>>   
>>   PAGE_ERROR = 0
>>   PAGE_DISK = 1
>> -PAGE_NETWORK = 2
>> -PAGE_INPUT = 3
>> -PAGE_GRAPHICS = 4
>> -PAGE_SOUND = 5
>> -PAGE_HOSTDEV = 6
>> -PAGE_CHAR = 7
>> -PAGE_VIDEO = 8
>> -PAGE_WATCHDOG = 9
>> -PAGE_FILESYSTEM = 10
>> -PAGE_SMARTCARD = 11
>> -PAGE_USBREDIR = 12
>> -PAGE_TPM = 13
>> -PAGE_RNG = 14
>> -PAGE_PANIC = 15
>> +PAGE_CONTROLLER = 2
>> +PAGE_NETWORK = 3
>> +PAGE_INPUT = 4
>> +PAGE_GRAPHICS = 5
>> +PAGE_SOUND = 6
>> +PAGE_HOSTDEV = 7
>> +PAGE_CHAR = 8
>> +PAGE_VIDEO = 9
>> +PAGE_WATCHDOG = 10
>> +PAGE_FILESYSTEM = 11
>> +PAGE_SMARTCARD = 12
>> +PAGE_USBREDIR = 13
>> +PAGE_TPM = 14
>> +PAGE_RNG = 15
>> +PAGE_PANIC = 16
>>   
> Can you change this to use the range() trick like we use in details.py for the
> EDIT_* bits?
>
Good idea!

>>   
>>   class vmmAddHardware(vmmGObjectUI):
>> @@ -111,6 +112,8 @@ class vmmAddHardware(vmmGObjectUI):
>>               "on_rng_type_changed": self.change_rng,
>>               "on_rng_backend_mode_changed": self.change_rng,
>>               "on_rng_backend_type_changed": self.change_rng,
>> +
>> +            "on_controller_type_changed": self.populate_controller_model,
>>           })
>>           self.bind_escape_key_close()
>>   
>> @@ -312,6 +315,16 @@ class vmmAddHardware(vmmGObjectUI):
>>           combo = self.widget("panic-type")
>>           self.build_panic_address_type(combo)
>>   
>> +        # Controller widgets
>> +        combo = self.widget("controller-type")
>> +        target_model = Gtk.ListStore(str, str)
>> +        combo.set_model(target_model)
>> +        uiutil.set_combo_text_column(combo, 1)
>> +        combo = self.widget("controller-model")
>> +        target_model = Gtk.ListStore(str, str)
>> +        combo.set_model(target_model)
>> +        uiutil.set_combo_text_column(combo, 1)
>> +
>>           # Available HW options
>>           is_local = not self.conn.is_remote()
>>           is_storage_capable = self.conn.is_storage_capable()
>> @@ -331,6 +344,7 @@ class vmmAddHardware(vmmGObjectUI):
>>   
>>           add_hw_option("Storage", "drive-harddisk", PAGE_DISK, have_storage,
>>                         have_storage and storage_tooltip or None)
>> +        add_hw_option("Controller", "device_pci", PAGE_CONTROLLER, True, None)
>>           add_hw_option("Network", "network-idle", PAGE_NETWORK, True, None)
>>           add_hw_option("Input", "input-mouse", PAGE_INPUT, self.vm.is_hvm(),
>>                         _("Not supported for this guest type."))
>> @@ -454,6 +468,9 @@ class vmmAddHardware(vmmGObjectUI):
>>           # Panic device params
>>           self.widget("panic-iobase").set_text("0x505")
>>   
>> +        # Controller device params
>> +        self.populate_controller_type()
>> +
>>           self.set_hw_selection(0)
>>   
>>   
>> @@ -812,6 +829,44 @@ class vmmAddHardware(vmmGObjectUI):
>>           if not create:
>>               format_list.get_child().set_text("")
>>   
>> +    def populate_controller_type(self):
>> +        widget = self.widget("controller-type")
>> +        model = widget.get_model()
>> +        model.clear()
>> +
>> +        for t in VirtualController.TYPES:
>> +            if t == VirtualController.TYPE_PCI:
>> +                continue
>> +            model.append([t, VirtualController.pretty_type(t)])
>> +
>> +        if len(model) > 0:
>> +            widget.set_active(0)
>> +
>> +    def populate_controller_model(self, src):
>> +        ignore = src
>> +
>> +        controller_type = self.get_config_controller_type()
>> +        modellist = self.widget("controller-model")
>> +        modellabel = self.widget("controller-model-label")
>> +        modellist.set_visible(True)
>> +        modellabel.set_visible(True)
>> +        model = modellist.get_model()
>> +        model.clear()
>> +
>> +        if controller_type == "scsi":
>> +            model.append([None, "Default"])
>> +            model.append(["virtio-scsi", "VirtIO SCSI"])
>> +        elif controller_type == "usb":
>> +            model.append([None, "Default"])
>> +            model.append(["ich9-ehci1", "USB 2"])
>> +            model.append(["nec-xhci", "USB 3"])
>> +        else:
>> +            model.append([None, "None"])
>> +            modellist.set_visible(False)
>> +            modellabel.set_visible(False)
>> +
>> +        if len(model) > 0:
>> +            modellist.set_active(0)
>>   
> We should share this with details.py. Make this into a staticmethod like
> populate_network_model_combo. The actual hiding of the 'model' row will
> probably need to be moved to the callers.
>
>>       ########################
>>       # get_config_* methods #
>> @@ -879,6 +934,13 @@ class vmmAddHardware(vmmGObjectUI):
>>           self.build_combo_with_values(combo, types,
>>                   virtinst.VirtualPanicDevice.ADDRESS_TYPE_ISA)
>>   
>> +    def build_controller_type(self, combo):
>> +        types = []
>> +        for t in VirtualController.TYPES:
>> +            types.append([t, VirtualController.pretty_type(t)])
>> +        self.build_combo_with_values(combo, types)
>> +
>> +
>>       def get_config_hardware_type(self):
>>           row = self.get_hw_selection()
>>           if not row:
>> @@ -1007,6 +1069,13 @@ class vmmAddHardware(vmmGObjectUI):
>>       def get_config_rng_backend_mode(self):
>>           return uiutil.get_list_selection(self.widget("rng-backend-mode"), 0)
>>   
>> +    # CONTROLLER getters
>> +    def get_config_controller_type(self):
>> +        return uiutil.get_list_selection(self.widget("controller-type"), 0)
>> +
>> +    def get_config_controller_model(self):
>> +        return uiutil.get_list_selection(self.widget("controller-model"), 0)
>> +
>>       ################
>>       # UI listeners #
>>       ################
>> @@ -1112,6 +1181,8 @@ class vmmAddHardware(vmmGObjectUI):
>>               return _("Error")
>>           if page == PAGE_DISK:
>>               return _("Storage")
>> +        if page == PAGE_CONTROLLER:
>> +            return _("Controller")
>>           if page == PAGE_NETWORK:
>>               return _("Network")
>>           if page == PAGE_INPUT:
>> @@ -1369,6 +1440,8 @@ class vmmAddHardware(vmmGObjectUI):
>>               return True
>>           elif page_num == PAGE_DISK:
>>               return self.validate_page_storage()
>> +        elif page_num == PAGE_CONTROLLER:
>> +            return self.validate_page_controller()
>>           elif page_num == PAGE_NETWORK:
>>               return self.validate_page_network()
>>           elif page_num == PAGE_INPUT:
>> @@ -1724,6 +1797,24 @@ class vmmAddHardware(vmmGObjectUI):
>>           except Exception, e:
>>               return self.err.val_err(_("Panic device parameter error"), e)
>>   
>> +    def validate_page_controller(self):
>> +        conn = self.conn.get_backend()
>> +        self._dev = VirtualController(conn)
>> +
>> +        controller_type = self.get_config_controller_type()
>> +        model = self.get_config_controller_model()
>> +
>> +        controllers = self.vm.get_controller_devices()
>> +        controller_num = [x for x in controllers if
>> +                (x.type == controller_type)]
>> +        if len(controller_num) > 0:
>> +            index_new = max([x.index for x in controller_num]) + 1
>> +            setattr(self._dev, "index", index_new)
>> +
>> +        setattr(self._dev, "type", controller_type)
>> +        if model != "none":
>> +            setattr(self._dev, "model", model)
>> +
> This actually won't do the correct thing for the USB 2 controller at least,
> since USB 2 maps to multiple devices. This patch is already getting quite long
> though. Can you split things up a bit?

I've noticed that devicecontroller.py do some maps, but take 
refresh_controller_page
as reference, sorry for my fault.

>
> patch 1) The range() fix I suggested
> patch 2) Just the controller 'type' UI and code. Remove the 'model' handling
> bits (well, you can keep the UI, just unconditionally hide it)
> patch 3) Add the populate_controller_model function and use it in details.py
> patch 4) Add the 'model' UI to addhardware, and handle the multi device USB issue.
>
> patch 1 + 2 can be applied first while we figure out the details for patch 3 + 4.
>
> - Cole

Thanks for your suggestion, I'll try to do something tomorrow.

- Chen
>
> _______________________________________________
> virt-tools-list mailing list
> virt-tools-list at redhat.com
> https://www.redhat.com/mailman/listinfo/virt-tools-list
>





More information about the virt-tools-list mailing list