[virt-tools-list] [virt-manager PATCH v2 3/3] addhardware: enable setting model when adding controller

Cole Robinson crobinso at redhat.com
Thu Apr 24 15:26:22 UTC 2014


On 04/23/2014 06:23 AM, Chen Hanxiao wrote:
> If no USB controller, we could add a new one;
> if had, disable 'create-finish' button and
> add a tooltip beside type combo.
> 
> Signed-off-by: Chen Hanxiao <chenhanxiao at cn.fujitsu.com>
> ---
>  ui/addhardware.ui          | 22 ++++++++++++++++++---
>  virtManager/addhardware.py | 48 +++++++++++++++++++++++++++++++++++-----------
>  2 files changed, 56 insertions(+), 14 deletions(-)
> 
> diff --git a/ui/addhardware.ui b/ui/addhardware.ui
> index 97d03c0..7a5b30d 100644
> --- a/ui/addhardware.ui
> +++ b/ui/addhardware.ui
> @@ -1,7 +1,7 @@
>  <?xml version="1.0" encoding="UTF-8"?>
> -<!-- Generated with glade 3.16.1 -->
> +<!-- Generated with glade 3.16.0 on Wed Apr 23 16:58:20 2014 -->
>  <interface>
> -  <requires lib="gtk+" version="3.0"/>
> +  <!-- interface-requires gtk+ 3.0 -->
>    <object class="GtkAdjustment" id="adjustment1">
>      <property name="upper">67000</property>
>      <property name="step_increment">1</property>
> @@ -169,12 +169,12 @@
>                                      <property name="visible">True</property>
>                                      <property name="can_focus">False</property>
>                                      <property name="halign">start</property>
> -                                    <signal name="changed" handler="on_config_storage_devtype_changed" swapped="no"/>
>                                      <child internal-child="accessible">
>                                        <object class="AtkObject" id="config-storage-devtype-atkobject">
>                                          <property name="AtkObject::accessible-name" translatable="yes">Device Type Field</property>
>                                        </object>
>                                      </child>
> +                                    <signal name="changed" handler="on_config_storage_devtype_changed" swapped="no"/>
>                                    </object>
>                                    <packing>
>                                      <property name="left_attach">1</property>
> @@ -387,6 +387,22 @@
>                                  <property name="height">1</property>
>                                </packing>
>                              </child>
> +                            <child>
> +                              <object class="GtkImage" id="controller-tooltip">
> +                                <property name="visible">True</property>
> +                                <property name="can_focus">False</property>
> +                                <property name="stock">gtk-info</property>
> +                              </object>
> +                              <packing>
> +                                <property name="left_attach">2</property>
> +                                <property name="top_attach">0</property>
> +                                <property name="width">1</property>
> +                                <property name="height">1</property>
> +                              </packing>
> +                            </child>
> +                            <child>
> +                              <placeholder/>
> +                            </child>
>                            </object>
>                            <packing>
>                              <property name="position">2</property>
> diff --git a/virtManager/addhardware.py b/virtManager/addhardware.py
> index 78235bb..4fc5532 100644
> --- a/virtManager/addhardware.py
> +++ b/virtManager/addhardware.py
> @@ -325,9 +325,6 @@ class vmmAddHardware(vmmGObjectUI):
>          target_model = Gtk.ListStore(str, str)
>          combo.set_model(target_model)
>          uiutil.set_combo_text_column(combo, 1)
> -        # FIXME: we should deal with controller model
> -        combo.set_visible(False)
> -        self.widget("controller-model-label").set_visible(False)
>  
>          # Available HW options
>          is_local = not self.conn.is_remote()
> @@ -872,6 +869,22 @@ class vmmAddHardware(vmmGObjectUI):
>  
>          controller_type = self.get_config_controller_type()
>          modellist = self.widget("controller-model")
> +        model_tooltip = self.widget("controller-tooltip")
> +        model_tooltip.set_visible(False)
> +
> +        controllers = self.vm.get_controller_devices()
> +        if (controller_type == VirtualController.TYPE_USB and
> +                len([x for x in controllers if
> +                    (x.type == VirtualController.TYPE_USB)])):
> +            vmname = self.vm.get_name()
> +            tooltip = (_("%s already has a USB controller attached.\n"
> +            "Adding more than one USB controller is not supported.\nYou can change "
> +            "the USB controller type in the VM details screen.") % vmname)
> +            model_tooltip.set_visible(True)
> +            model_tooltip.set_tooltip_text(tooltip)
> +            self.widget("create-finish").set_sensitive(False)
> +        else:
> +            self.widget("create-finish").set_sensitive(True)
>          modellist.set_sensitive(True)
>          self.populate_controller_model_combo(modellist, controller_type, None, True)
>  
> @@ -1806,16 +1819,29 @@ class vmmAddHardware(vmmGObjectUI):
>      def validate_page_controller(self):
>          conn = self.conn.get_backend()
>          controller_type = self.get_config_controller_type()
> +        model = self.get_config_controller_model()
>          self._dev = VirtualController(conn)
>  
> -        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
> -            self._dev.index = index_new
> -
> -        self._dev.type = controller_type
> +        if model == "ich9-ehci1":
> +            for dev in VirtualController.get_usb2_controllers(conn):
> +                self._dev.type = dev.type
> +                self._dev.model = dev.model
> +                self._dev.master_startport = dev.master_startport
> +                if dev.model != "ich9-uhci3":
> +                    self.add_device()

Calling add_device during validation is not okay, since this will actually
attempt to alter the VM. We need to make self._dev a list in this case
containing all the devices we want to add, and only then do it during
add_device. We also need to avoid hotplug in that case since we can't hotplug
multiple devices at once.

Also, if a controller type doesn't support any 'model' values, we should hide
the model row (set_grid_row_visible) rather than de-sensitize it.

- Cole

> +        else:
> +            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
> +                self._dev.index = index_new
> +
> +            self._dev.type = controller_type
> +            if model != "none":
> +                if model == "default":
> +                    model = None
> +                self._dev.model = model
>  
>      def validate_page_rng(self):
>          conn = virtinst.VirtualRNGDevice.BACKEND_MODE_CONNECT in \
> 




More information about the virt-tools-list mailing list