[virt-tools-list] [PATCH v2 6/6] details: show TPM device model and allow updating it

Stefan Berger stefanb at linux.vnet.ibm.com
Fri Jun 8 21:42:44 UTC 2018


Show the TPM device model and allow updating it. If a TPM 1.2 has been
chosen, we only allow the TIS interface to be selected. In case of a
TPM 2.0 we also enable the choice of the CRB interface.

Signed-off-by: Stefan Berger <stefanb at linux.vnet.ibm.com>
---
 ui/details.ui              | 33 +++++++++++++++++++++++++++++++++
 virtManager/addhardware.py | 25 +++++++++++++++++++++++++
 virtManager/details.py     | 26 +++++++++++++++++++++++++-
 virtManager/domain.py      | 11 +++++++++++
 4 files changed, 94 insertions(+), 1 deletion(-)

diff --git a/ui/details.ui b/ui/details.ui
index efc2748f..3018354b 100644
--- a/ui/details.ui
+++ b/ui/details.ui
@@ -5469,6 +5469,39 @@
                                             <property name="top_attach">2</property>
                                           </packing>
                                         </child>
+                                        <child>
+                                          <object class="GtkLabel" id="tpm-model-label">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="halign">end</property>
+                                            <property name="label" translatable="yes">Device mode_l:</property>
+                                            <property name="use_underline">True</property>
+                                            <property name="mnemonic_widget">tpm-model-combobox</property>
+                                          </object>
+                                          <packing>
+                                            <property name="left_attach">0</property>
+                                            <property name="top_attach">3</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkComboBox" id="tpm-model">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="halign">start</property>
+                                            <property name="hexpand">False</property>
+                                            <property name="has_entry">True</property>
+                                            <signal name="changed" handler="on_tpm_model_combo_changed" swapped="no"/>
+                                            <child internal-child="entry">
+                                              <object class="GtkEntry" id="tpm-model-combobox">
+                                                <property name="can_focus">True</property>
+                                              </object>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="left_attach">1</property>
+                                            <property name="top_attach">3</property>
+                                          </packing>
+                                        </child>
                                       </object>
                                     </child>
                                   </object>
diff --git a/virtManager/addhardware.py b/virtManager/addhardware.py
index 6fd6a5eb..e6619d66 100644
--- a/virtManager/addhardware.py
+++ b/virtManager/addhardware.py
@@ -689,6 +689,31 @@ class vmmAddHardware(vmmGObjectUI):
             values.append([t, t])
         _build_combo(self.widget("tpm-version"), values)
 
+    @staticmethod
+    def _get_tpm_model_list(vm, tpmversion):
+        mod_list = []
+        if vm.is_hvm():
+            mod_list.append("tpm-tis")
+            if tpmversion != '1.2':
+                mod_list.append("tpm-crb")
+            mod_list.sort()
+        return mod_list
+
+    @staticmethod
+    def populate_tpm_model_combo(vm, combo, tpmversion):
+        model = combo.get_model()
+        model.clear()
+
+        mod_list = vmmAddHardware._get_tpm_model_list(vm, tpmversion)
+        for m in mod_list:
+            model.append([m, DeviceTpm.get_pretty_model(m)])
+        combo.set_active(0)
+
+    @staticmethod
+    def build_tpm_model_combo(vm, combo, tpmversion):
+        _build_combo(combo, [])
+        vmmAddHardware.populate_tpm_model_combo(vm, combo, tpmversion)
+
 
     def _build_panic_model_combo(self):
         values = []
diff --git a/virtManager/details.py b/virtManager/details.py
index d2996bd1..c2e4ecda 100644
--- a/virtManager/details.py
+++ b/virtManager/details.py
@@ -89,10 +89,11 @@ from .graphwidgets import Sparkline
  EDIT_CONTROLLER_MODEL,
 
  EDIT_TPM_TYPE,
+ EDIT_TPM_MODEL,
 
  EDIT_FS,
 
- EDIT_HOSTDEV_ROMBAR) = range(1, 49)
+ EDIT_HOSTDEV_ROMBAR) = range(1, 50)
 
 
 # Columns in hw list model
@@ -573,6 +574,8 @@ class vmmDetails(vmmGObjectUI):
 
             "on_hw_list_button_press_event": self.popup_addhw_menu,
 
+            "on_tpm_model_combo_changed": lambda *x: self.enable_apply(x, EDIT_TPM_MODEL),
+
             # Listeners stored in vmmConsolePages
             "on_details_menu_view_fullscreen_activate": (
                 self.console.details_toggle_fullscreen),
@@ -1046,6 +1049,10 @@ class vmmDetails(vmmGObjectUI):
         sc_mode = self.widget("smartcard-mode")
         vmmAddHardware.build_smartcard_mode_combo(self.vm, sc_mode)
 
+        # TPM model
+        tpm_model = self.widget("tpm-model")
+        vmmAddHardware.build_tpm_model_combo(self.vm, tpm_model, None)
+
         # Controller model
         combo = self.widget("controller-model")
         model = Gtk.ListStore(str, str)
@@ -1905,6 +1912,8 @@ class vmmDetails(vmmGObjectUI):
                 ret = self.config_filesystem_apply(key)
             elif pagetype is HW_LIST_TYPE_HOSTDEV:
                 ret = self.config_hostdev_apply(key)
+            elif pagetype is HW_LIST_TYPE_TPM:
+                ret = self.config_tpm_apply(key)
             else:
                 ret = False
         except Exception as e:
@@ -2263,6 +2272,17 @@ class vmmDetails(vmmGObjectUI):
                                           kwargs, self.vm, self.err,
                                           devobj=devobj)
 
+    def config_tpm_apply(self, devobj):
+        kwargs = {}
+
+        if self.edited(EDIT_TPM_MODEL):
+            model = uiutil.get_list_selection(self.widget("tpm-model"))
+            kwargs["model"] = model
+
+        return vmmAddHardware.change_config_helper(self.vm.define_tpm,
+                                          kwargs, self.vm, self.err,
+                                          devobj=devobj)
+
 
     # Device removal
     def remove_device(self, devobj):
@@ -2781,6 +2801,10 @@ class vmmDetails(vmmGObjectUI):
         self.widget("tpm-dev-type").set_text(
                 virtinst.DeviceTpm.get_pretty_type(dev_type))
 
+        vmmAddHardware.populate_tpm_model_combo(
+            self.vm, self.widget("tpm-model"), tpmdev.version)
+        uiutil.set_list_selection(self.widget("tpm-model"), tpmdev.model)
+
         # Device type specific properties, only show if apply to the cur dev
         show_ui("device_path")
         show_ui("version")
diff --git a/virtManager/domain.py b/virtManager/domain.py
index 1cc03682..f48cfa18 100644
--- a/virtManager/domain.py
+++ b/virtManager/domain.py
@@ -982,6 +982,17 @@ class vmmDomain(vmmLibvirtObject):
         else:
             self._redefine_xmlobj(xmlobj)
 
+    def define_tpm(self, devobj, do_hotplug, model=_SENTINEL):
+        xmlobj = self._make_xmlobj_to_define()
+        editdev = self._lookup_device_to_define(xmlobj, devobj, do_hotplug)
+        if not editdev:
+            return
+
+        if model != _SENTINEL:
+            editdev.model = model
+
+        self._redefine_xmlobj(xmlobj)
+
 
     ####################
     # Hotplug routines #
-- 
2.14.4




More information about the virt-tools-list mailing list