[virt-tools-list] [PATCH virt-manager 2/2] virt-manager: use libosinfo media detection
Cole Robinson
crobinso at redhat.com
Tue Mar 25 21:35:30 UTC 2014
On 03/25/2014 09:45 AM, Giuseppe Scrivano wrote:
> Enhance the media detection with the data provided by libosinfo, now
> the installation media detection is enabled for CD/ISO images too.
>
> Signed-off-by: Giuseppe Scrivano <gscrivan at redhat.com>
> ---
> virtManager/create.py | 55 ++++++++++++++++++++++++++++++++++++---------------
> 1 file changed, 39 insertions(+), 16 deletions(-)
>
> diff --git a/virtManager/create.py b/virtManager/create.py
> index a368eff..1b97187 100644
> --- a/virtManager/create.py
> +++ b/virtManager/create.py
> @@ -132,7 +132,7 @@ class vmmCreate(vmmGObjectUI):
> "on_install_url_box_changed": self.url_box_changed,
> "on_install_local_cdrom_toggled": self.toggle_local_cdrom,
> "on_install_local_cdrom_combo_changed": self.detect_media_os,
> - "on_install_local_box_changed": self.detect_media_os,
> + "on_install_local_box_changed": self.local_box_changed,
> "on_install_local_browse_clicked": self.browse_iso,
> "on_install_import_browse_clicked": self.browse_import,
> "on_install_app_browse_clicked": self.browse_app,
> @@ -551,6 +551,11 @@ class vmmCreate(vmmGObjectUI):
>
> self.mediacombo = vmmMediaCombo(self.conn, self.builder, self.topwin,
> MEDIA_CDROM)
> + def mediacombo_changed(src):
> + ignore = src
> + self.mediaDetected = False
> + self.detect_media_os(only_local=True)
> + self.mediacombo.combo.connect("changed", mediacombo_changed)
> self.mediacombo.reset_state()
> self.widget("install-local-cdrom-align").add(
> self.mediacombo.top_box)
> @@ -1117,25 +1122,31 @@ class vmmCreate(vmmGObjectUI):
>
> self.change_caps(self.capsguest.os_type, arch)
>
> - def url_box_changed(self, ignore):
> + def media_box_changed(self, widget, only_local):
> self.mediaDetected = False
>
> - # If the url_entry has focus, don't fire detect_media_os, it means
> + # If the widget has focus, don't fire detect_media_os, it means
> # the user is probably typing
> - if self.widget("install-url-box").get_child().has_focus():
> + if self.widget(widget).get_child().has_focus():
> return
>
> - self.detect_media_os()
> + self.detect_media_os(only_local=only_local)
> +
> + def url_box_changed(self, ignore):
> + self.media_box_changed("install-url-box", False)
> +
> + def local_box_changed(self, ignore):
> + self.media_box_changed("install-local-box", True)
>
> def should_detect_media(self):
> return (self.is_detect_active() and not self.mediaDetected)
>
> - def detect_media_os(self, ignore1=None, forward=False):
> + def detect_media_os(self, ignore1=None, forward=False, only_local=False):
> if not self.should_detect_media():
> return
> if not self.is_install_page():
> return
> - self.start_detection(forward=forward)
> + self.start_detection(forward=forward, only_local=only_local)
>
> def toggle_detect_os(self, src):
> dodetect = src.get_active()
> @@ -1190,7 +1201,8 @@ class vmmCreate(vmmGObjectUI):
> is_active = src.get_active()
> if is_active and self.mediacombo.get_path():
> # Local CDROM was selected with media preset, detect distro
> - self.detect_media_os()
> + self.mediaDetected = False
> + self.detect_media_os(only_local=True)
>
> self.widget("install-local-cdrom-align").set_sensitive(is_active)
>
> @@ -1198,6 +1210,8 @@ class vmmCreate(vmmGObjectUI):
> uselocal = src.get_active()
> self.widget("install-local-box").set_sensitive(uselocal)
> self.widget("install-local-browse").set_sensitive(uselocal)
> + self.mediaDetected = False
> + self.detect_media_os(only_local=True)
>
> def detect_visibility_changed(self, src, ignore=None):
> is_visible = src.get_visible()
> @@ -1249,11 +1263,7 @@ class vmmCreate(vmmGObjectUI):
> INSTALL_PAGE_CONTAINER_OS]
> osbox.set_visible(iscontainer)
>
> - # Detection only works/ is valid for URL,
> - # FIXME: Also works for CDROM if running as root (since we need to
> - # mount the iso/cdrom), but we should probably make this work for
> - # more distros (like windows) before we enable it
> - if (instpage == INSTALL_PAGE_URL):
> + if instpage in (INSTALL_PAGE_ISO, INSTALL_PAGE_URL):
> detectbox.show()
> else:
> detectbox.hide()
> @@ -1968,7 +1978,7 @@ class vmmCreate(vmmGObjectUI):
> if forward:
> self.idle_add(self.forward, ())
>
> - def start_detection(self, forward):
> + def start_detection(self, forward, only_local):
> if self.detectedDistro == DETECT_INPROGRESS:
> return
>
> @@ -1983,13 +1993,26 @@ class vmmCreate(vmmGObjectUI):
>
> detectThread = threading.Thread(target=self.actually_detect,
> name="Actual media detection",
> - args=(media,))
> + args=(media, only_local,))
> detectThread.setDaemon(True)
> detectThread.start()
>
> self.check_detection(0, forward)
>
> - def actually_detect(self, media):
> + def actually_detect(self, media, only_local):
> + # First try with libosinfo detection
> + try:
> + os = virtinst.osdict.lookup_os_by_media(media)
> + if os:
> + self.detectedDistro = os
> + return
> + except:
> + pass
> +
> + if only_local:
> + self.detectedDistro = DETECT_FAILED
> + return
> +
> try:
> installer = virtinst.DistroInstaller(self.conn.get_backend())
> installer.location = media
>
I think we should try and move this into DistroInstaller, since we will want
to do basically the same thing from virt-install eventually.
- Cole
More information about the virt-tools-list
mailing list