Attached is an updated version of the redesigned 'New VM' wizard. Changes since the first posting: - Connection list shows a human readable string, rather than the full connection URI. Ex: http://fedorapeople.org/~crobinso/virt-manager/newvm3/vmm-newvm-3-connlist.png We explicitly show QEMU/KVM if the connection supports KVM. This helps clear up the confusion that a 'qemu' connection is needed for kvm usage. - Sparse vs. Non-sparse option added for storage. Ex: http://fedorapeople.org/~crobinso/virt-manager/newvm3/vmm-newvm-3-sparse.png - Distro Type/Variant detection implemented for URL installs (only fully works for RH distros at the moment). Ex: http://fedorapeople.org/~crobinso/virt-manager/newvm3/vmm-newvm-3-detect.png If the user selects a previously entered distro from the drop down, or press activates (presses 'enter' in) the text entry, it kicks of detection. Questions or comments appreciated. Thanks, Cole
# HG changeset patch # User Cole Robinson <crobinso@xxxxxxxxxx> # Node ID e232a860b40982b124adcf6fd6451b7e182e6aae # Parent 35f1db8a045df0136c9765ca3e254e92b394ae65 New 'Create VM' wizard. diff -r 35f1db8a045d -r e232a860b409 src/virtManager/connection.py --- a/src/virtManager/connection.py Sat Feb 28 19:27:20 2009 -0500 +++ b/src/virtManager/connection.py Fri Mar 06 12:14:50 2009 -0500 @@ -247,6 +247,9 @@ def is_read_only(self): return self.readOnly + def is_active(self): + return self.state == self.STATE_ACTIVE + def get_type(self): if self.vmm is None: return None @@ -271,16 +274,53 @@ def get_capabilities(self): return virtinst.CapabilitiesParser.parse(self.vmm.getCapabilities()) + def is_kvm_supported(self): + caps = self.get_capabilities() + for guest in caps.guests: + for dom in guest.domains: + if dom.hypervisor_type == "kvm": + return True + return False + def is_remote(self): return virtinst.util.is_uri_remote(self.uri) + def is_storage_capable(self): + return virtinst.util.is_storage_capable(self.vmm) + def is_qemu_session(self): - (scheme, ignore, ignore, \ + (scheme, ignore, ignore, path, ignore, ignore) = virtinst.util.uri_split(self.uri) if path == "/session" and scheme.startswith("qemu"): return True return False + def is_test_conn(self): + (scheme, ignore, ignore, + ignore, ignore, ignore) = virtinst.util.uri_split(self.uri) + if scheme.startswith("test"): + return True + return False + + def get_pretty_desc(self): + (scheme, ignore, hostname, + path, ignore, ignore) = virtinst.util.uri_split(self.uri) + + scheme = scheme.split("+")[0] + + if scheme == "qemu": + desc = "QEMU" + if self.is_kvm_supported(): + desc += "/KVM" + else: + desc = scheme.capitalize() + + if path == "/session": + desc += " Usermode" + if hostname: + desc += " (%s)" % hostname + return desc + def get_uri(self): return self.uri @@ -296,6 +336,12 @@ def get_pool(self, uuid): return self.pools[uuid] + def get_pool_by_path(self, path): + for pool in self.pools.values(): + if pool.get_target_path() == path: + return pool + return None + def open(self): if self.state != self.STATE_DISCONNECTED: return diff -r 35f1db8a045d -r e232a860b409 src/virtManager/create.py --- a/src/virtManager/create.py Sat Feb 28 19:27:20 2009 -0500 +++ b/src/virtManager/create.py Fri Mar 06 12:14:50 2009 -0500 @@ -1,6 +1,6 @@ # -# Copyright (C) 2006, 2008 Red Hat, Inc. -# Copyright (C) 2006 Hugh O. Brock <hbrock@xxxxxxxxxx> +# Copyright (C) 2008 Red Hat, Inc. +# Copyright (C) 2008 Cole Robinson <crobinso@xxxxxxxxxx> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -20,119 +20,193 @@ import gobject import gtk -import gtk.gdk import gtk.glade + +import os, sys, statvfs +import time +import traceback +import threading +import logging + +import virtinst +from virtinst import VirtualNetworkInterface import libvirt -import virtinst -import os, sys -import logging -import traceback -import virtManager.util as vmmutil +import virtManager.util as util +from virtManager.error import vmmErrorDialog from virtManager.asyncjob import vmmAsyncJob -from virtManager.error import vmmErrorDialog from virtManager.createmeter import vmmCreateMeter from virtManager.opticalhelper import vmmOpticalDriveHelper +from virtManager.storagebrowse import vmmStorageBrowser -VM_PARA_VIRT = 1 -VM_FULLY_VIRT = 2 +OS_GENERIC = "generic" -VM_INSTALL_FROM_ISO = 1 -VM_INSTALL_FROM_CD = 2 +# Number of seconds to wait for media detection +DETECT_TIMEOUT = 10 -VM_STORAGE_PARTITION = 1 -VM_STORAGE_FILE = 2 +PAGE_NAME = 0 +PAGE_INSTALL = 1 +PAGE_MEM = 2 +PAGE_STORAGE = 3 +PAGE_FINISH = 4 -VM_INST_LOCAL = 1 -VM_INST_TREE = 2 -VM_INST_PXE = 3 - -DEFAULT_STORAGE_FILE_SIZE = 500 - -PAGE_INTRO = 0 -PAGE_NAME = 1 -PAGE_TYPE = 2 -PAGE_INST = 3 -PAGE_INST_LOCAL = 4 -PAGE_INST_TREE = 5 -PAGE_DISK = 6 -PAGE_NETWORK = 7 -PAGE_CPUMEM = 8 -PAGE_SUMMARY = 9 +INSTALL_PAGE_ISO = 0 +INSTALL_PAGE_URL = 1 +INSTALL_PAGE_PXE = 2 class vmmCreate(gobject.GObject): __gsignals__ = { "action-show-console": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (str,str)), "action-show-terminal": (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, (str,str)), + gobject.TYPE_NONE, (str,str)), "action-show-help": (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, [str]), - } - def __init__(self, config, connection): + gobject.TYPE_NONE, [str]), + } + + def __init__(self, config, engine): self.__gobject_init__() + self.window = gtk.glade.XML(config.get_glade_dir() + \ + "/vmm-create.glade", + "vmm-create", domain="virt-manager") self.config = config - self.connection = connection - self.window = gtk.glade.XML(config.get_glade_dir() + "/vmm-create.glade", "vmm-create", domain="virt-manager") + self.engine = engine + + self.conn = None + self.caps = None + self.capsguest = None + self.capsdomain = None + self.guest = None + self.usepool = False + self.storage_browser = None + self.topwin = self.window.get_widget("vmm-create") self.err = vmmErrorDialog(self.topwin, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, _("Unexpected Error"), _("An unexpected error occurred")) - self.install_error = "" - self.install_details = "" - self.non_sparse = True - self.topwin.hide() + # Distro detection state variables + self.detectThread = None + self.detectedDistro = None + self.detectThreadLock = threading.Lock() + + # Async install state + self.install_error = None + self.install_details = None + self.window.signal_autoconnect({ - "on_create_pages_switch_page" : self.page_changed, - "on_create_cancel_clicked" : self.close, - "on_vmm_create_delete_event" : self.close, + "on_vmm_newcreate_delete_event" : self.close, + + "on_create_cancel_clicked": self.close, "on_create_back_clicked" : self.back, "on_create_forward_clicked" : self.forward, "on_create_finish_clicked" : self.finish, - "on_fv_iso_location_browse_clicked" : self.browse_iso_location, - "on_create_memory_max_value_changed": self.set_max_memory, - "on_storage_partition_address_browse_clicked" : self.browse_storage_partition_address, - "on_storage_file_address_browse_clicked" : self.browse_storage_file_address, - "on_storage_file_address_changed": self.toggle_storage_size, - "on_storage_toggled" : self.change_storage_type, - "on_network_toggled" : self.change_network_type, - "on_mac_address_clicked" : self.change_macaddr_use, - "on_media_toggled" : self.change_media_type, - "on_os_type_changed" : self.change_os_type, - "on_cpu_architecture_changed": self.change_cpu_arch, - "on_virt_method_toggled": self.change_virt_method, "on_create_help_clicked": self.show_help, - }) + "on_create_pages_switch_page": self.page_changed, - self.caps = self.connection.get_capabilities() + "on_create_conn_changed": self.conn_changed, + + "on_install_url_entry_activate": self.detect_media_os, + "on_install_url_box_changed": self.url_box_changed, + "on_install_local_cdrom_toggled": self.local_cdrom_toggled, + "on_install_local_cdrom_combo_changed": self.detect_media_os, + "on_install_local_entry_activate": self.detect_media_os, + "on_install_local_browse_clicked": self.browse_iso, + + "on_install_detect_os_toggled": self.toggle_detect_os, + "on_install_os_type_changed": self.change_os_type, + "on_install_local_iso_toggled": self.toggle_local_iso, + "on_install_detect_os_box_show": self.detect_visibility_changed, + "on_install_detect_os_box_hide": self.detect_visibility_changed, + + "on_enable_storage_toggled": self.toggle_enable_storage, + "on_config_storage_browse_clicked": self.browse_storage, + "on_config_storage_select_toggled": self.toggle_storage_select, + + "on_config_set_macaddr_toggled": self.toggle_macaddr, + + "on_config_hv_changed": self.hv_changed, + "on_config_arch_changed": self.arch_changed, + }) + self.set_initial_state() - # Guest to fill in with values along the way - self._guest = virtinst.Guest(type=self.get_domain_type(), - connection=self.connection.vmm) - self._disk = None - self._net = None - - def show(self): + def show(self, uri=None): + self.reset_state(uri) self.topwin.show() - self.reset_state() self.topwin.present() + def close(self, ignore1=None, ignore2=None): + self.topwin.hide() + return 1 + + def set_conn(self, newconn): + if self.conn == newconn: + return + + self.conn = newconn + if self.conn: + self.set_conn_state() + + + # State init methods + def startup_error(self, error): + self.window.get_widget("create-forward").set_sensitive(False) + self.window.get_widget("install-box").set_sensitive(False) + util.tooltip_wrapper(self.window.get_widget("install-box"), + error) + return False + def set_initial_state(self): - notebook = self.window.get_widget("create-pages") - notebook.set_show_tabs(False) - #XXX I don't think I should have to go through and set a bunch of background colors - # in code, but apparently I do... - black = gtk.gdk.color_parse("#000") - for num in range(PAGE_SUMMARY+1): - name = "page" + str(num) + "-title" - self.window.get_widget(name).modify_bg(gtk.STATE_NORMAL,black) + self.window.get_widget("create-pages").set_show_tabs(False) + self.window.get_widget("install-method-pages").set_show_tabs(False) - # set up the list for the cd-path widget - cd_list = self.window.get_widget("cd-path") + # FIXME: Unhide this when we make some documentation + self.window.get_widget("create-help").hide() + + blue = gtk.gdk.color_parse("#0072A8") + self.window.get_widget("create-header").modify_bg(gtk.STATE_NORMAL, + blue) + + # Connection list + conn_list = self.window.get_widget("create-conn") + conn_model = gtk.ListStore(str, str) + conn_list.set_model(conn_model) + text = gtk.CellRendererText() + conn_list.pack_start(text, True) + conn_list.add_attribute(text, 'text', 1) + + # Lists for the install urls + media_url_list = self.window.get_widget("install-url-box") + media_url_model = gtk.ListStore(str) + media_url_list.set_model(media_url_model) + media_url_list.set_text_column(0) + + ks_url_list = self.window.get_widget("install-ks-box") + ks_url_model = gtk.ListStore(str) + ks_url_list.set_model(ks_url_model) + ks_url_list.set_text_column(0) + + # Lists for distro type + variant + os_type_list = self.window.get_widget("install-os-type") + os_type_model = gtk.ListStore(str, str) + os_type_list.set_model(os_type_model) + text = gtk.CellRendererText() + os_type_list.pack_start(text, True) + os_type_list.add_attribute(text, 'text', 1) + + os_variant_list = self.window.get_widget("install-os-version") + os_variant_model = gtk.ListStore(str, str) + os_variant_list.set_model(os_variant_model) + text = gtk.CellRendererText() + os_variant_list.pack_start(text, True) + os_variant_list.add_attribute(text, 'text', 1) + + # Physical CD-ROM model + cd_list = self.window.get_widget("install-local-cdrom-combo") + cd_radio = self.window.get_widget("install-local-cdrom") # Fields are raw device path, volume label, flag indicating # whether volume is present or not, and HAL path cd_model = gtk.ListStore(str, str, bool, str) @@ -141,495 +215,1167 @@ cd_list.pack_start(text, True) cd_list.add_attribute(text, 'text', 1) cd_list.add_attribute(text, 'sensitive', 2) + # FIXME: We should disable all this if on a remote connection try: - vmmOpticalDriveHelper(self.window.get_widget("cd-path")) - self.window.get_widget("media-physical").set_sensitive(True) + vmmOpticalDriveHelper(cd_list) except Exception, e: logging.error("Unable to create optical-helper widget: '%s'", e) - self.window.get_widget("media-physical").set_sensitive(False) + cd_radio.set_sensitive(False) + cd_list.set_sensitive(False) + util.tooltip_wrapper(self.window.get_widget("install-local-cdrom-box"), _("Error listing CD-ROM devices.")) - self.window.get_widget("media-physical").set_sensitive(True) - self.window.get_widget("storage-partition").set_sensitive(True) + # Networking + # [ interface type, device name, label, sensitive ] + net_list = self.window.get_widget("config-netdev") + net_model = gtk.ListStore(str, str, str, bool) + net_list.set_model(net_model) + text = gtk.CellRendererText() + net_list.pack_start(text, True) + net_list.add_attribute(text, 'text', 2) + net_list.add_attribute(text, 'sensitive', 3) - # set up the lists for the url widgets - media_url_list = self.window.get_widget("pv-media-url") - media_url_model = gtk.ListStore(str) - media_url_list.set_model(media_url_model) - media_url_list.set_text_column(0) - - ks_url_list = self.window.get_widget("pv-ks-url") - ks_url_model = gtk.ListStore(str) - ks_url_list.set_model(ks_url_model) - ks_url_list.set_text_column(0) - - # set up the lists for the networks - network_list = self.window.get_widget("net-network") - network_model = gtk.ListStore(str, str) - network_list.set_model(network_model) + # Archtecture + archModel = gtk.ListStore(str) + archList = self.window.get_widget("config-arch") text = gtk.CellRendererText() - network_list.pack_start(text, True) - network_list.add_attribute(text, 'text', 1) - - device_list = self.window.get_widget("net-device") - device_model = gtk.ListStore(str, str, bool) - device_list.set_model(device_model) - text = gtk.CellRendererText() - device_list.pack_start(text, True) - device_list.add_attribute(text, 'text', 1) - device_list.add_attribute(text, 'sensitive', 2) - - # set up the lists for the os-type/os-variant widgets - os_type_list = self.window.get_widget("os-type") - os_type_model = gtk.ListStore(str, str) - os_type_list.set_model(os_type_model) - text = gtk.CellRendererText() - os_type_list.pack_start(text, True) - os_type_list.add_attribute(text, 'text', 1) - - os_variant_list = self.window.get_widget("os-variant") - os_variant_model = gtk.ListStore(str, str) - os_variant_list.set_model(os_variant_model) - text = gtk.CellRendererText() - os_variant_list.pack_start(text, True) - os_variant_list.add_attribute(text, 'text', 1) - - self.window.get_widget("create-cpus-physical").set_text(str(self.connection.host_maximum_processor_count())) - memory = int(self.connection.host_memory_size()) - self.window.get_widget("create-host-memory").set_text(self.pretty_memory(memory)) - self.window.get_widget("create-memory-max").set_range(50, memory/1024) - - archModel = gtk.ListStore(str) - archList = self.window.get_widget("cpu-architecture") + archList.pack_start(text, True) + archList.add_attribute(text, 'text', 0) archList.set_model(archModel) - hyperModel = gtk.ListStore(str) - hyperList = self.window.get_widget("hypervisor") + hyperModel = gtk.ListStore(str, str, str, bool) + hyperList = self.window.get_widget("config-hv") + text = gtk.CellRendererText() + hyperList.pack_start(text, True) + hyperList.add_attribute(text, 'text', 0) + hyperList.add_attribute(text, 'sensitive', 3) hyperList.set_model(hyperModel) - def reset_state(self): - notebook = self.window.get_widget("create-pages") - notebook.set_current_page(0) - # Hide the "finish" button until the appropriate time - self.window.get_widget("create-finish").hide() - self.window.get_widget("create-forward").show() - self.window.get_widget("create-back").set_sensitive(False) - self.window.get_widget("storage-file-size").set_sensitive(False) + sparse_info = self.window.get_widget("config-storage-sparse-info") + sparse_str = _("Fully allocating storage will take longer now, " + "but the OS install phase will be quicker. \n\n" + "Skipping allocation can also cause space issues on " + "the host machine, if the maximum image size exceeds " + "available storage space.") + util.tooltip_wrapper(sparse_info, sparse_str) - # If we don't have full-virt support disable the choice, and - # display a message telling the user why it is not working - has_pv = False - has_fv = False - use_pv = False + def reset_state(self, urihint=None): + self.window.get_widget("create-pages").set_current_page(PAGE_NAME) + self.page_changed(None, None, PAGE_NAME) + + # Name page state + self.window.get_widget("create-vm-name").set_text("") + self.window.get_widget("method-local").set_active(True) + self.window.get_widget("create-conn").set_active(-1) + activeconn = self.populate_conn_list(urihint) + self.set_conn(activeconn) + if not activeconn: + return self.startup_error(_("No active connection to install on.")) + + # Everything from this point forward should be connection independent + + # Distro/Variant + self.toggle_detect_os(self.window.get_widget("install-detect-os")) + self.populate_os_type_model() + self.window.get_widget("install-os-type").set_active(0) + + # Install local/iso + self.window.get_widget("install-local-entry").set_text("") + + # Install URL + self.window.get_widget("install-urlopts-entry").set_text("") + self.window.get_widget("install-ks-entry").set_text("") + self.window.get_widget("install-url-entry").set_text("") + urlmodel = self.window.get_widget("install-url-box").get_model() + ksmodel = self.window.get_widget("install-ks-box").get_model() + self.populate_url_model(urlmodel, self.config.get_media_urls()) + self.populate_url_model(ksmodel, self.config.get_kickstart_urls()) + + # Mem / CPUs + self.window.get_widget("config-mem").set_value(512) + self.window.get_widget("config-cpus").set_value(1) + + # Storage + self.window.get_widget("enable-storage").set_active(True) + self.window.get_widget("config-storage-create").set_active(True) + # FIXME: Make sure this doesn't exceed host? + self.window.get_widget("config-storage-size").set_value(8) + self.window.get_widget("config-storage-entry").set_text("") + + # Final page + self.window.get_widget("config-advanced-expander").set_expanded(False) + + def set_conn_state(self): + # Update all state that has some dependency on the current connection + + self.window.get_widget("create-forward").set_sensitive(True) + self.window.get_widget("install-box").set_sensitive(True) + + # A bit out of order, but populate arch + hv lists so we can + # determine a default + self.caps = self.conn.get_capabilities() + + try: + self.change_caps() + except Exception, e: + logging.exception("Error determining default hypervisor") + return self.startup_error(_("No guests are supported for this" + " connection.")) + self.populate_hv() + + is_local = not self.conn.is_remote() + is_storage_capable = self.conn.is_storage_capable() + is_pv = (self.capsguest.os_type == "xen") + + # Install Options + method_tree = self.window.get_widget("method-tree") + method_pxe = self.window.get_widget("method-pxe") + method_local = self.window.get_widget("method-local") + + method_tree.set_sensitive(is_local) + method_local.set_sensitive(not is_pv) + method_pxe.set_sensitive(not is_pv) + + pxe_tt = None + local_tt = None + tree_tt = None + + if is_pv: + base = _("%s installs not available for paravirt guests.") + pxe_tt = base % "PXE" + local_tt = base % "CDROM/ISO" + if not is_local: + tree_tt = _("URL installs not available for remote connections.") + if not is_storage_capable and not local_tt: + local_tt = _("Connection does not support storage management.") + + if not is_local and not is_storage_capable: + method_local.set_sensitive(False) + if method_tree.get_active() and not is_local: + method_local.set_active(True) + elif is_pv: + method_tree.set_active(True) + + if not (method_tree.get_property("sensitive") or + method_local.get_property("sensitive") or + method_pxe.get_property("sensitive")): + self.startup_error(_("No install options available for this " + "connection.")) + + util.tooltip_wrapper(method_tree, tree_tt) + util.tooltip_wrapper(method_local, local_tt) + util.tooltip_wrapper(method_pxe, pxe_tt) + + # Attempt to create the default pool + self.usepool = False + try: + if is_storage_capable: + # FIXME: Emit 'pool-added' or something? + util.build_default_pool(self.conn.vmm) + self.usepool = True + except Exception, e: + logging.debug("Building default pool failed: %s" % str(e)) + + + # Install local + self.window.get_widget("install-local-cdrom-box").set_sensitive(is_local) + self.window.get_widget("install-local-browse").set_sensitive(is_local) + if not is_local: + self.window.get_widget("install-local-iso").set_active(True) + + # Don't select physical CDROM if no valid media is present + use_cd = (self.window.get_widget("install-local-cdrom-combo").get_active() >= 0) + if use_cd: + self.window.get_widget("install-local-cdrom").set_active(True) + else: + self.window.get_widget("install-local-iso").set_active(True) + + + # Memory + memory = int(self.conn.host_memory_size()) + mem_label = _("Up to %(maxmem)s available on the host") % {'maxmem': \ + self.pretty_memory(memory) } + mem_label = ("<span size='small' color='#484848'>%s</span>" % + mem_label) + self.window.get_widget("config-mem").set_range(50, memory/1024) + self.window.get_widget("phys-mem-label").set_markup(mem_label) + + # CPU + phys_cpus = self.conn.host_active_processor_count() + + max_v = self.conn.get_max_vcpus(_type=self.capsdomain.hypervisor_type) + cmax = phys_cpus + if int(max_v) < int(phys_cpus): + cmax = max_v + cpu_tooltip = (_("Hypervisor only supports %d virtual CPUs.") % + max_v) + else: + cpu_tooltip = None + util.tooltip_wrapper(self.window.get_widget("config-cpus"), + cpu_tooltip) + + cpu_label = _("Up to %(numcpus)d available") % { 'numcpus': \ + int(phys_cpus)} + cpu_label = ("<span size='small' color='#484848'>%s</span>" % + cpu_label) + self.window.get_widget("config-cpus").set_range(.1, int(cmax) or 1) + self.window.get_widget("phys-cpu-label").set_markup(cpu_label) + + # Storage + have_storage = (is_local or is_storage_capable) + storage_tooltip = None + max_storage = self.host_disk_space() + hd_label = "%s available on the host" % self.pretty_storage(max_storage) + hd_label = ("<span color='#484848'>%s</span>" % hd_label) + self.window.get_widget("phys-hd-label").set_markup(hd_label) + self.window.get_widget("config-storage-size").set_range(1, max_storage) + + use_storage = self.window.get_widget("config-storage-select") + storage_area = self.window.get_widget("config-storage-area") + self.window.get_widget("config-storage-browse").set_sensitive(is_local) + + storage_area.set_sensitive(have_storage) + if not have_storage: + storage_tooltip = _("Connection does not support storage" + " management.") + use_storage.set_sensitive(True) + util.tooltip_wrapper(storage_area, storage_tooltip) + + # Networking + # This function will take care of all the remote stuff for us + self.populate_network_model() + self.window.get_widget("config-set-macaddr").set_active(True) + newmac = "" + try: + net = VirtualNetworkInterface(conn=self.conn.vmm) + net.setup(self.conn.vmm) + newmac = net.macaddr + except Exception, e: + logging.exception("Generating macaddr failed: %s" % str(e)) + self.window.get_widget("config-macaddr").set_text(newmac) + + def populate_hv(self): + hv_list = self.window.get_widget("config-hv") + model = hv_list.get_model() + model.clear() + + default = 0 + tooltip = None + instmethod = self.get_config_install_page() for guest in self.caps.guests: - if guest.os_type in ["xen", "linux"]: - has_pv = True - for d in guest.domains: - if d.hypervisor_type in ["xen", "linux"]: - use_pv = True - elif guest.os_type == "hvm": - has_fv = True + gtype = guest.os_type + for dom in guest.domains: + domtype = dom.hypervisor_type + label = domtype - self.window.get_widget("virt-method-pv").set_sensitive(has_pv) - self.window.get_widget("virt-method-fv").set_sensitive(has_fv) + if domtype == "kvm": + if gtype == "xen": + label = "xenner" + elif domtype == "xen": + if gtype == "xen": + label = "xen (paravirt)" + elif gtype == "hvm": + label = "xen (fullvirt)" + elif domtype == "test": + if gtype == "xen": + label = "test (xen)" + elif gtype == "hvm": + label = "test (hvm)" - # prioritize xen pv, but not xenner pv - self.window.get_widget("virt-method-fv").set_active(has_fv) - self.window.get_widget("virt-method-pv").set_active(not has_fv or - has_pv and use_pv) - self.change_virt_method() # repopulate arch and hypervisor lists + # Determine if this is the default given by guest_lookup + if (gtype == self.capsguest.os_type and + self.capsdomain.hypervisor_type == domtype): + default = len(model) - if has_fv: - self.window.get_widget("virt-method-fv-unsupported").hide() - self.window.get_widget("virt-method-fv-disabled").hide() + # Don't add multiple rows for each arch + for m in model: + if m[0] == label: + label = None + break + if label == None: + continue + + if gtype == "xen": + if (instmethod == INSTALL_PAGE_PXE or + instmethod == INSTALL_PAGE_ISO): + tooltip = _("Only URL installs are supported for " + "paravirt.") + + model.append([label, gtype, domtype, not bool(tooltip)]) + + hv_info = self.window.get_widget("config-hv-info") + if tooltip: + hv_info.show() + util.tooltip_wrapper(hv_info, tooltip) else: - self.window.get_widget("virt-method-fv-unsupported").show() - flags = self.caps.host.features.names() - if "vmx" in flags or "svm" in flags: - self.window.get_widget("virt-method-fv-disabled").show() - else: - self.window.get_widget("virt-method-fv-disabled").hide() + hv_info.hide() + hv_list.set_active(default) - self.change_media_type() - self.change_storage_type() - self.change_network_type() - self.change_macaddr_use() - self.window.get_widget("create-vm-name").set_text("") - self.window.get_widget("media-iso-image").set_active(True) - self.window.get_widget("fv-iso-location").set_text("") - self.window.get_widget("storage-file-backed").set_active(True) - self.window.get_widget("storage-partition-address").set_text("") - self.window.get_widget("storage-file-address").set_text("") - self.window.get_widget("storage-file-size").set_value(4000) - self.window.get_widget("create-memory-max").set_value(512) - self.window.get_widget("create-memory-startup").set_value(512) - self.window.get_widget("create-vcpus").set_value(1) - self.window.get_widget("create-vcpus").get_adjustment().upper = self.connection.get_max_vcpus() - self.window.get_widget("non-sparse").set_active(True) - model = self.window.get_widget("pv-media-url").get_model() - self.populate_url_model(model, self.config.get_media_urls()) - model = self.window.get_widget("pv-ks-url").get_model() - self.populate_url_model(model, self.config.get_kickstart_urls()) + def populate_arch(self): + arch_list = self.window.get_widget("config-arch") + model = arch_list.get_model() + model.clear() - # Fill list of OS types - self.populate_os_type_model() - self.window.get_widget("os-type").set_active(0) + default = 0 + for guest in self.caps.guests: + for dom in guest.domains: + if (guest.os_type == self.capsguest.os_type and + dom.hypervisor_type == self.capsdomain.hypervisor_type): - self.window.get_widget("net-type-network").set_active(True) - self.window.get_widget("net-type-device").set_active(False) - self.window.get_widget("mac-address").set_active(False) - self.window.get_widget("create-mac-address").set_text("") + arch = guest.arch + if arch == self.capsguest.arch: + default = len(model) + model.append([guest.arch]) - net_box = self.window.get_widget("net-network") - self.populate_network_model(net_box.get_model()) - net_box.set_active(0) + arch_list.set_active(default) - dev_box = self.window.get_widget("net-device") - res = self.populate_device_model(dev_box.get_model()) - if res[0]: - dev_box.set_active(res[1]) + def populate_conn_list(self, urihint = None): + conn_list = self.window.get_widget("create-conn") + model = conn_list.get_model() + model.clear() + + default = -1 + for c in self.engine.connections.values(): + connobj = c["connection"] + if not connobj.is_active(): + continue + + if connobj.get_uri() == urihint: + default = len(model) + elif default < 0 and not connobj.is_remote(): + # Favor local connections over remote connections + default = len(model) + + model.append([connobj.get_uri(), connobj.get_pretty_desc()]) + + no_conns = (len(model) == 0) + + if default < 0 and not no_conns: + default = 0 + + activeuri = "" + activeconn = None + if not no_conns: + conn_list.set_active(default) + activeuri = model[default][0] + activeconn = self.engine.connections[activeuri]["connection"] + + self.window.get_widget("create-conn-label").set_text(activeuri) + if len(model) <= 1: + self.window.get_widget("create-conn").hide() + self.window.get_widget("create-conn-label").show() else: - dev_box.set_active(-1) + self.window.get_widget("create-conn").show() + self.window.get_widget("create-conn-label").hide() - self.install_error = None + return activeconn + def populate_os_type_model(self): + model = self.window.get_widget("install-os-type").get_model() + model.clear() + model.append([OS_GENERIC, _("Generic")]) + types = virtinst.FullVirtGuest.list_os_types() + for t in types: + model.append([t, virtinst.FullVirtGuest.get_os_type_label(t)]) - def forward(self, ignore=None): - notebook = self.window.get_widget("create-pages") - try: - if(self.validate(notebook.get_current_page()) != True): - return - except Exception, e: - self.err.show_err(_("Uncaught error validating input: %s") % str(e), - "".join(traceback.format_exc())) + def populate_os_variant_model(self, _type): + model = self.window.get_widget("install-os-version").get_model() + model.clear() + if _type == OS_GENERIC: + model.append([OS_GENERIC, _("Generic")]) return - if notebook.get_current_page() == PAGE_INST: - if self.get_config_install_method() == VM_INST_LOCAL: - notebook.set_current_page(PAGE_INST_LOCAL) - elif self.get_config_install_method() == VM_INST_TREE: - notebook.set_current_page(PAGE_INST_TREE) + variants = virtinst.FullVirtGuest.list_os_variants(_type) + for variant in variants: + model.append([variant, + virtinst.FullVirtGuest.get_os_variant_label(_type, + variant)]) + def populate_url_model(self, model, urls): + model.clear() + for url in urls: + model.append([url]) + + def populate_network_model(self): + net_list = self.window.get_widget("config-netdev") + model = net_list.get_model() + model.clear() + + # For qemu:///session + if self.conn.is_qemu_session(): + model.append([VirtualNetworkInterface.TYPE_USER, None, + _("Usermode Networking")]) + return + + hasNet = False + netIdx = 0 + # Virtual Networks + for uuid in self.conn.list_net_uuids(): + net = self.conn.get_net(uuid) + + # FIXME: Should we use 'default' even if it's inactive? + label = _("Virtual network") + " '%s'" % net.get_name() + if not net.is_active(): + label += " (%s)" % _("Inactive") + + use_nat, host_dev = net.get_ipv4_forward() + if not use_nat: + desc = _("Isolated network") + elif host_dev: + desc = _("NAT to %s") % host_dev else: - # No config for PXE needed (yet) - notebook.set_current_page(PAGE_DISK) - elif notebook.get_current_page() in [PAGE_INST_TREE, PAGE_INST_LOCAL]: - notebook.set_current_page(PAGE_DISK) - elif notebook.get_current_page() == PAGE_DISK and self.connection.is_qemu_session(): - # Skip network for non-root - notebook.set_current_page(PAGE_CPUMEM) + desc = _("NAT to any device") + label += ": %s" % desc + + model.append([ VirtualNetworkInterface.TYPE_VIRTUAL, + net.get_name(), label, True]) + hasNet = True + # FIXME: This preference should be configurable + if net.get_name() == "default": + netIdx = len(model) - 1 + + if not hasNet: + model.append([None, None, _("No virtual networks available"), + False]) + + # Physical devices + hasShared = False + brIndex = -1 + if not self.conn.is_remote(): + for name in self.conn.list_net_device_paths(): + br = self.conn.get_net_device(name) + + if br.is_shared(): + hasShared = True + if brIndex < 0: + brIndex = len(model) + + brlabel = "(%s %s)" % (_("Bridge"), br.get_bridge()) + sensitive = True + else: + brlabel = "(%s)" % _("Not bridged") + sensitive = False + + model.append([VirtualNetworkInterface.TYPE_BRIDGE, + br.get_bridge(), + _("Host device %s %s") % (br.get_name(), brlabel), + sensitive]) + + # If there is a bridge device, default to that + # If not, use 'default' network + # If not present, use first list entry + # If list empty, use no network devices + if hasShared: + default = brIndex + elif hasNet: + default = netIdx else: - notebook.next_page() + model.insert(0, [None, None, _("No networking."), True]) + default = 0 - def back(self, ignore=None): - notebook = self.window.get_widget("create-pages") - # do this always, since there's no "leaving a notebook page" event. - self.window.get_widget("create-finish").hide() - self.window.get_widget("create-forward").show() - if notebook.get_current_page() in [PAGE_INST_TREE, PAGE_INST_LOCAL]: - notebook.set_current_page(PAGE_INST) - elif notebook.get_current_page() == PAGE_DISK: - if self.get_config_install_method() == VM_INST_LOCAL: - notebook.set_current_page(PAGE_INST_LOCAL) - elif self.get_config_install_method() == VM_INST_TREE: - notebook.set_current_page(PAGE_INST_TREE) - else: - # No config for PXE needed (yet) - notebook.set_current_page(PAGE_INST) - elif notebook.get_current_page() == PAGE_CPUMEM and self.connection.is_qemu_session(): - # Skip network for non-root - notebook.set_current_page(PAGE_DISK) + net_list.set_active(default) + + def change_caps(self, gtype=None, dtype=None, accel=True): + (newg, + newdom) = virtinst.CapabilitiesParser.guest_lookup(conn=self.conn.vmm, + caps=self.caps, + os_type = gtype, + type = dtype, + accelerated=accel) + + if (self.capsguest and self.capsdomain and + (newg.arch == self.capsguest.arch and + newg.os_type == self.capsguest.os_type and + newdom.hypervisor_type == self.capsdomain.hypervisor_type)): + # No change + return + + self.capsguest = newg + self.capsdomain = newdom + logging.debug("Guest type set to os_type=%s, arch=%s, dom_type=%s" % + (self.capsguest.os_type, self.capsguest.arch, + self.capsdomain.hypervisor_type)) + + def populate_summary(self): + ignore, ignore, dlabel, vlabel = self.get_config_os_info() + mem = self.pretty_memory(int(self.guest.memory) * 1024) + cpu = str(int(self.guest.vcpus)) + + instmethod = self.get_config_install_page() + install = "" + if instmethod == INSTALL_PAGE_ISO: + install = _("Local CDROM/ISO") + elif instmethod == INSTALL_PAGE_URL: + install = _("URL Install Tree") + elif instmethod == INSTALL_PAGE_PXE: + install = _("PXE Install") + + if len(self.guest.disks) == 0: + storage = _("None") else: - notebook.prev_page() + disk = self.guest.disks[0] + storage = "%s" % self.pretty_storage(disk.size) + storage += (" <span size='small' color='#484848'>%s</span>" % + disk.path) + osstr = "" + if not dlabel: + osstr = _("Generic") + elif not vlabel: + osstr = _("Generic") + " " + dlabel + else: + osstr = vlabel + + title = "Ready to begin installation of <b>%s</b>" % self.guest.name + + self.window.get_widget("summary-title").set_markup(title) + self.window.get_widget("summary-os").set_text(osstr) + self.window.get_widget("summary-install").set_text(install) + self.window.get_widget("summary-mem").set_text(mem) + self.window.get_widget("summary-cpu").set_text(cpu) + self.window.get_widget("summary-storage").set_markup(storage) + + + # get_* methods def get_config_name(self): return self.window.get_widget("create-vm-name").get_text() - def get_config_method(self): - if self.window.get_widget("virt-method-pv").get_active(): - return VM_PARA_VIRT - elif self.window.get_widget("virt-method-fv").get_active(): - return VM_FULLY_VIRT + def get_config_install_page(self): + if self.window.get_widget("method-local").get_active(): + return INSTALL_PAGE_ISO + elif self.window.get_widget("method-tree").get_active(): + return INSTALL_PAGE_URL + elif self.window.get_widget("method-pxe").get_active(): + return INSTALL_PAGE_PXE + + def get_config_os_info(self): + d_list = self.window.get_widget("install-os-type") + d_idx = d_list.get_active() + v_list = self.window.get_widget("install-os-version") + v_idx = v_list.get_active() + distro = None + dlabel = None + variant = None + vlabel = None + + if d_idx >= 0: + distro, dlabel = d_list.get_model()[d_idx] + if v_idx >= 0: + variant, vlabel = v_list.get_model()[v_idx] + + return (distro, variant, dlabel, vlabel) + + def get_config_local_media(self): + if self.window.get_widget("install-local-cdrom").get_active(): + return self.window.get_widget("install-local-cdrom-combo").get_active_text() else: - return VM_PARA_VIRT + return self.window.get_widget("install-local-entry").get_text() - def get_config_install_source(self): - if self.get_config_install_method() == VM_INST_TREE: - widget = self.window.get_widget("pv-media-url") - url= widget.child.get_text().strip() - # Add the URL to the list, if it's different - self.config.add_media_url(url) - self.populate_url_model(widget.get_model(), self.config.get_media_urls()) - return url - elif self.get_config_install_method() == VM_INST_LOCAL: - if self.window.get_widget("media-iso-image").get_active(): - return self.window.get_widget("fv-iso-location").get_text() - else: - return self.window.get_widget("cd-path").get_active_text() + def get_config_detectable_media(self): + instpage = self.get_config_install_page() + media = "" + + if instpage == INSTALL_PAGE_ISO: + media = self.get_config_local_media() + elif instpage == INSTALL_PAGE_URL: + media = self.window.get_widget("install-url-entry").get_text() + + return media + + def get_config_url_info(self): + media = self.window.get_widget("install-url-entry").get_text().strip() + extra = self.window.get_widget("install-urlopts-entry").get_text().strip() + ks = self.window.get_widget("install-ks-entry").get_text().strip() + + if media: + self.config.add_media_url(media) + if ks: + self.config.add_kickstart_url(ks) + + return (media.strip(), extra.strip(), ks.strip()) + + def get_storage_info(self): + path = None + size = self.window.get_widget("config-storage-size").get_value() + sparse = self.window.get_widget("config-storage-sparse").get_active() + if self.window.get_widget("config-storage-create").get_active(): + path = self.get_default_path(self.guest.name) + logging.debug("Default storage path is: %s" % path) else: - return "PXE" + path = self.window.get_widget("config-storage-entry").get_text() - def get_config_installer(self, _type, os_type): - if self.get_config_install_method() == VM_INST_PXE: - return virtinst.PXEInstaller(type=_type, os_type=os_type, - conn=self._guest.conn) + return (path, size, not sparse) + + def get_default_path(self, name): + path = "" + + # Don't generate a new path if the install failed + if self.install_error: + if self.guest and len(self.guest.disks) > 0: + return self.guest.disks[0].path + + if not self.usepool: + + # Use old generating method + d = self.config.get_default_image_dir(self.conn) + origf = os.path.join(d, name + ".img") + f = origf + + n = 1 + while os.path.exists(f) and n < 100: + f = os.path.join(d, self.get_config_name() + + "-" + str(n) + ".img") + n += 1 + if os.path.exists(f): + f = origf + + path = f else: - return virtinst.DistroInstaller(type=_type, os_type=os_type, - conn=self._guest.conn) + pool = self.conn.vmm.storagePoolLookupByName(util.DEFAULT_POOL_NAME) + path = virtinst.Storage.StorageVolume.find_free_name(name, + pool_object=pool, suffix=".img") - def get_config_kickstart_source(self): - if self.get_config_install_method() == VM_INST_TREE: - widget = self.window.get_widget("pv-ks-url") - url = widget.child.get_text().strip() - self.config.add_kickstart_url(url) - self.populate_url_model(widget.get_model(), self.config.get_kickstart_urls()) - return url - else: - return "" + path = os.path.join(util.DEFAULT_POOL_PATH, path) - def get_config_disk_image(self): - if self.window.get_widget("storage-partition").get_active(): - return self.window.get_widget("storage-partition-address").get_text() - else: - return self.window.get_widget("storage-file-address").get_text() + return path - def get_config_partition_size(self): - try: - partition_address = self.get_config_disk_image() - fd = open(partition_address,"rb") - fd.seek(0,2) - block_size = fd.tell() / 1024 / 1024 - return block_size - except Exception: - details = "Unable to verify partition size: '%s'" % \ - "".join(traceback.format_exc()) - logging.error(details) - return None - - def get_config_disk_size(self): - if self.window.get_widget("storage-partition").get_active(): - return self.get_config_partition_size() - if not self.window.get_widget("storage-file-backed").get_active(): - return None - if not self.window.get_widget("storage-file-size").get_editable(): - return None - else: - return self.window.get_widget("storage-file-size").get_value() - - def get_config_kernel_params(self): - return self.window.get_widget("kernel-params").get_text() + def host_disk_space(self, path=None): + if not path: + path = util.DEFAULT_POOL_PATH - def get_config_network(self): - if self.connection.is_qemu_session(): - return ["user"] + avail = 0 + if self.usepool: + # FIXME: make sure not inactive? + # FIXME: use a conn specific function after we send pool-added + pool = virtinst.util.lookup_pool_by_path(self.conn.vmm, path) + if pool: + avail = int(virtinst.util.get_xml_path(pool.XMLDesc(0), + "/pool/available")) - if self.window.get_widget("net-type-network").get_active(): - net = self.window.get_widget("net-network") - model = net.get_model() - return ["network", model.get_value(net.get_active_iter(), 0)] - else: - dev = self.window.get_widget("net-device") - model = dev.get_model() - return ["bridge", model.get_value(dev.get_active_iter(), 0)] + if not avail and not self.conn.is_remote(): + vfs = os.statvfs(os.path.dirname(path)) + avail = vfs[statvfs.F_FRSIZE] * vfs[statvfs.F_BAVAIL] - def get_config_macaddr(self): - macaddr = None - if self.window.get_widget("mac-address").get_active(): - macaddr = self.window.get_widget("create-mac-address").get_text() - return macaddr + return int(avail / 1024.0 / 1024.0 / 1024.0) - def get_config_maximum_memory(self): - return self.window.get_widget("create-memory-max").get_value() + def get_config_network_info(self): + netidx = self.window.get_widget("config-netdev").get_active() + netinfo = self.window.get_widget("config-netdev").get_model()[netidx] + macaddr = self.window.get_widget("config-macaddr").get_text() - def get_config_initial_memory(self): - return self.window.get_widget("create-memory-startup").get_value() - - def get_config_virtual_cpus(self): - return self.window.get_widget("create-vcpus").get_value() - - def get_config_install_method(self): - if self.window.get_widget("method-local").get_active(): - return VM_INST_LOCAL - elif self.window.get_widget("method-tree").get_active(): - return VM_INST_TREE - else: - return VM_INST_PXE - - def get_config_os_type(self): - _type = self.window.get_widget("os-type") - if _type.get_active_iter() != None: - return _type.get_model().get_value(_type.get_active_iter(), 0) - return None - - def get_config_os_variant(self): - variant = self.window.get_widget("os-variant") - if variant.get_active_iter() != None: - return variant.get_model().get_value(variant.get_active_iter(), 0) - return None - - def get_config_os_label(self): - variant = self.window.get_widget("os-variant") - if variant.get_active_iter() != None: - return variant.get_model().get_value(variant.get_active_iter(), 1) - - _type = self.window.get_widget("os-type") - if _type.get_active_iter() != None: - return _type.get_model().get_value(_type.get_active_iter(), 1) - return "N/A" + return netinfo[0], netinfo[1], macaddr.strip() def get_config_sound(self): - if self.connection.is_remote(): + if self.conn.is_remote(): return self.config.get_remote_sound() return self.config.get_local_sound() - def page_changed(self, notebook, page, page_number): - # would you like some spaghetti with your salad, sir? + def is_detect_active(self): + return self.window.get_widget("install-detect-os").get_active() - if page_number == PAGE_INTRO: + + # Listeners + def conn_changed(self, src): + idx = src.get_active() + model = src.get_model() + + if idx < 0: + self.set_conn(None) + return + + uri = model[idx][0] + conn = self.engine.connections[uri]["connection"] + self.set_conn(conn) + + def hv_changed(self, src): + idx = src.get_active() + if idx < 0: + return + + row = src.get_model()[idx] + + self.change_caps(row[1], row[2]) + self.populate_arch() + + def arch_changed(self, src): + idx = src.get_active() + if idx < 0: + return + + def url_box_changed(self, ignore): + # If the url_entry has focus, don't fire detect_media_os, it means + # the user is probably typing + if self.window.get_widget("install-url-entry").flags() & gtk.HAS_FOCUS: + return + self.detect_media_os() + + def detect_media_os(self, ignore1=None): + curpage = self.window.get_widget("create-pages").get_current_page() + if self.is_detect_active() and curpage == PAGE_INSTALL: + self.detect_os_distro() + + def toggle_detect_os(self, src): + dodetect = src.get_active() + + if dodetect: + self.window.get_widget("install-os-type-label").show() + self.window.get_widget("install-os-version-label").show() + self.window.get_widget("install-os-type").hide() + self.window.get_widget("install-os-version").hide() + self.detect_media_os() # Run detection + else: + self.window.get_widget("install-os-type-label").hide() + self.window.get_widget("install-os-version-label").hide() + self.window.get_widget("install-os-type").show() + self.window.get_widget("install-os-version").show() + + def change_os_type(self, box): + model = box.get_model() + if box.get_active_iter() != None: + _type = model.get_value(box.get_active_iter(), 0) + self.populate_os_variant_model(_type) + + variant = self.window.get_widget("install-os-version") + variant.set_active(0) + + def local_cdrom_toggled(self, src): + combo = self.window.get_widget("install-local-cdrom-combo") + is_active = src.get_active() + if is_active: + if combo.get_active() != -1: + # Local CDROM was selected with media preset, detect distro + self.detect_media_os() + + self.window.get_widget("install-local-cdrom-combo").set_sensitive(is_active) + + def toggle_local_iso(self, src): + uselocal = src.get_active() + self.window.get_widget("install-local-entry").set_sensitive(uselocal) + self.window.get_widget("install-local-browse").set_sensitive(uselocal) + + def detect_visibility_changed(self, src, ignore=None): + is_visible = src.get_property("visible") + detect_chkbox = self.window.get_widget("install-detect-os") + nodetect_label = self.window.get_widget("install-nodetect-label") + + detect_chkbox.set_active(is_visible) + detect_chkbox.toggled() + + if is_visible: + nodetect_label.hide() + else: + nodetect_label.show() + + def browse_iso(self, ignore1=None, ignore2=None): + f = self._browse_file(_("Locate ISO Image")) + if f != None: + self.window.get_widget("install-local-entry").set_text(f) + self.window.get_widget("install-local-entry").activate() + + def toggle_enable_storage(self, src): + self.window.get_widget("config-storage-box").set_sensitive(src.get_active()) + + def browse_storage(self, ignore1): + f = self._browse_file(_("Locate existing storage.")) + if f != None: + self.window.get_widget("config-storage-entry").set_text(f) + + def toggle_storage_select(self, src): + act = src.get_active() + self.window.get_widget("config-storage-browse-box").set_sensitive(act) + + def toggle_macaddr(self, src): + self.window.get_widget("config-macaddr").set_sensitive(src.get_active()) + + def set_storage_path(self, src, path): + self.window.get_widget("config-storage-entry").set_text(path) + + # Navigation methods + def set_install_page(self): + instnotebook = self.window.get_widget("install-method-pages") + detectbox = self.window.get_widget("install-detect-os-box") + instpage = self.get_config_install_page() + + # 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): + detectbox.show() + else: + detectbox.hide() + + if instpage == INSTALL_PAGE_PXE: + # Hide the install notebook for pxe, since there isn't anything + # to ask for + instnotebook.hide() + else: + instnotebook.show() + + instnotebook.set_current_page(instpage) + + def back(self, src): + notebook = self.window.get_widget("create-pages") + curpage = notebook.get_current_page() + + if curpage == PAGE_INSTALL: + self.reset_guest_type() + + notebook.set_current_page(curpage - 1) + + def forward(self, src): + notebook = self.window.get_widget("create-pages") + curpage = notebook.get_current_page() + + if self.validate(notebook.get_current_page()) != True: + return + + if curpage == PAGE_NAME: + self.set_install_page() + # See if we need to alter our default HV based on install method + # FIXME: URL installs also come into play with whether we want + # PV or FV + self.guest_from_install_type() + + + notebook.set_current_page(curpage + 1) + + def page_changed(self, ignore1, ignore2, pagenum): + + # Update page number + page_lbl = ("<span color='#59B0E2'>%s</span>" % + _("Step %(current_page)d of %(max_page)d") % + {'current_page': pagenum+1, 'max_page': PAGE_FINISH+1}) + + self.window.get_widget("config-pagenum").set_markup(page_lbl) + + if pagenum == PAGE_NAME: self.window.get_widget("create-back").set_sensitive(False) - elif page_number == PAGE_NAME: - name_widget = self.window.get_widget("create-vm-name") - name_widget.grab_focus() - elif page_number == PAGE_TYPE: - pass - elif page_number == PAGE_INST: - if self.get_config_method() == VM_PARA_VIRT: - # Xen PV can't PXE or CDROM install :-( - self.window.get_widget("method-local").set_sensitive(False) - self.window.get_widget("method-pxe").set_sensitive(False) - self.window.get_widget("method-tree").set_active(True) - else: - self.window.get_widget("method-local").set_sensitive(True) - self.window.get_widget("method-pxe").set_sensitive(True) + else: + self.window.get_widget("create-back").set_sensitive(True) - if self.connection.is_remote(): - self.window.get_widget("method-tree").set_sensitive(False) - else: - self.window.get_widget("method-tree").set_sensitive(True) - elif page_number == PAGE_INST_TREE: - url_widget = self.window.get_widget("pv-media-url") - url_widget.grab_focus() - elif page_number == PAGE_INST_LOCAL: - self.change_media_type() - url_widget = self.window.get_widget("fv-iso-location") - url_widget.grab_focus() + if pagenum == PAGE_INSTALL: + self.detect_media_os() - if self.connection.is_remote(): - self.window.get_widget("fv-iso-location-browse").set_sensitive(False) - self.window.get_widget("media-physical").set_sensitive(False) - else: - self.window.get_widget("fv-iso-location-browse").set_sensitive(True) - self.window.get_widget("media-physical").set_sensitive(True) - - elif page_number == PAGE_DISK: - self.change_storage_type() - if self.connection.is_remote(): - self.window.get_widget("storage-partition-address-browse").set_sensitive(False) - self.window.get_widget("storage-file-address-browse").set_sensitive(False) - else: - self.window.get_widget("storage-partition-address-browse").set_sensitive(True) - self.window.get_widget("storage-file-address-browse").set_sensitive(True) - - elif page_number == PAGE_NETWORK: - if self.connection.is_remote(): - self.window.get_widget("net-type-network").set_active(True) - self.window.get_widget("net-type-device").set_active(False) - self.window.get_widget("net-type-device").set_sensitive(False) - self.window.get_widget("net-device").set_active(-1) - else: - self.window.get_widget("net-type-device").set_sensitive(True) - self.change_network_type() - elif page_number == PAGE_CPUMEM: - pass - elif page_number == PAGE_SUMMARY: - self.window.get_widget("summary-name").set_text(self.get_config_name()) - if self.get_config_method() == VM_PARA_VIRT: - self.window.get_widget("summary-method").set_text(_("Paravirtualized")) - self.window.get_widget("summary-os-label").hide() - self.window.get_widget("summary-os").hide() - else: - self.window.get_widget("summary-method").set_text(_("Fully virtualized")) - self.window.get_widget("summary-os-label").show() - self.window.get_widget("summary-os").set_text(self.get_config_os_label()) - self.window.get_widget("summary-os").show() - self.window.get_widget("summary-install-source").set_text(self.get_config_install_source()) - self.window.get_widget("summary-kickstart-source").set_text(self.get_config_kickstart_source()) - if self._guest.extraargs is None: - self.window.get_widget("summary-kernel-args-label").hide() - self.window.get_widget("summary-kernel-args").hide() - else: - self.window.get_widget("summary-kernel-args-label").show() - self.window.get_widget("summary-kernel-args").show() - self.window.get_widget("summary-kernel-args").set_text(self._guest.extraargs) - self.window.get_widget("summary-disk-image").set_text(self.get_config_disk_image()) - disksize = self.get_config_disk_size() - if disksize != None: - self.window.get_widget("summary-disk-size").set_text(str(int(disksize)) + " MB") - else: - self.window.get_widget("summary-disk-size").set_text("-") - self.window.get_widget("summary-max-memory").set_text(str(int(self.get_config_maximum_memory())) + " MB") - self.window.get_widget("summary-initial-memory").set_text(str(int(self.get_config_initial_memory())) + " MB") - self.window.get_widget("summary-virtual-cpus").set_text(str(int(self.get_config_virtual_cpus()))) - net = self.get_config_network() - if net[0] == "bridge": - self.window.get_widget("summary-net-type").set_text(_("Shared physical device")) - self.window.get_widget("summary-net-target").set_text(net[1]) - elif net[0] == "network": - self.window.get_widget("summary-net-type").set_text(_("Virtual network")) - self.window.get_widget("summary-net-target").set_text(net[1]) - elif net[0] == "user": - self.window.get_widget("summary-net-type").set_text(_("Usermode networking")) - self.window.get_widget("summary-net-target").set_text("-") - else: - raise ValueError, "Unknown networking type " + net[0] - macaddr = self.get_config_macaddr() - if macaddr != None: - self.window.get_widget("summary-mac-address").set_text(macaddr) - else: - self.window.get_widget("summary-mac-address").set_text("-") - self.window.get_widget("summary-audio").set_text(str(self.get_config_sound())) - + if pagenum == PAGE_FINISH: self.window.get_widget("create-forward").hide() self.window.get_widget("create-finish").show() + self.populate_summary() - def close(self, ignore1=None,ignore2=None): - self.topwin.hide() - return 1 + # Repopulate the HV list, so we can make install method relevant + # changes + self.populate_hv() + else: + self.window.get_widget("create-forward").show() + self.window.get_widget("create-finish").hide() - def is_visible(self): - if self.topwin.flags() & gtk.VISIBLE: - return 1 - return 0 + def validate(self, pagenum): + try: + if pagenum == PAGE_NAME: + return self.validate_name_page() + elif pagenum == PAGE_INSTALL: + return self.validate_install_page() + elif pagenum == PAGE_MEM: + return self.validate_mem_page() + elif pagenum == PAGE_STORAGE: + # If the user selects 'no storage' and they used cd/iso install + # media, we want to go back and change the installer to + # LiveCDInstaller, which means re-validate everything + if not self.validate_name_page(): + return False + elif not self.validate_install_page(): + return False + elif not self.validate_mem_page(): + return False + return self.validate_storage_page() - def finish(self, ignore=None): - # Validation should have mostly set up out guest. We just need - # to take care of a few pieces we didn't touch + elif pagenum == PAGE_FINISH: + # Since we allow the user to change to change HV type + arch + # on the last page, we need to revalidate everything + if not self.validate_name_page(): + return False + elif not self.validate_install_page(): + return False + elif not self.validate_mem_page(): + return False + elif not self.validate_storage_page(): + return False + return self.validate_final_page() - guest = self._guest - guest.hypervisorURI = self.connection.get_uri() + except Exception, e: + self.err.show_err(_("Uncaught error validating install " + "parameters: %s") % str(e), + "".join(traceback.format_exc())) + return - # UUID, append disk and nic + def validate_name_page(self): + name = self.get_config_name() + + self.guest = None + + try: + g = virtinst.Guest(connection=self.conn.vmm) + g.name = name + except Exception, e: + return self.verr(_("Invalid System Name"), str(e)) + + return True + + def validate_install_page(self): + instmethod = self.get_config_install_page() + installer = None + location = None + extra = None + ks = None + cdrom = False + distro, variant, ignore1, ignore2 = self.get_config_os_info() + + + if instmethod == INSTALL_PAGE_ISO: + if self.window.get_widget("enable-storage").get_active(): + instclass = virtinst.DistroInstaller + else: + # CD/ISO install and no disks implies LiveCD + instclass = virtinst.LiveCDInstaller + + media = self.get_config_local_media() + + if not media: + return self.verr(_("An install media selection is required.")) + + location = media + cdrom = True + + elif instmethod == INSTALL_PAGE_URL: + instclass = virtinst.DistroInstaller + media, extra, ks = self.get_config_url_info() + + if not media: + return self.verr(_("An install tree is required.")) + + location = media + + elif instmethod == INSTALL_PAGE_PXE: + instclass = virtinst.PXEInstaller + + + # Build the installer and Guest instance + try: + installer = self.build_installer(instclass) + + self.guest = installer.guest_from_installer() + self.guest.name = self.get_config_name() + except Exception, e: + return self.verr(_("Error setting installer parameters."), str(e)) + + # Validate media location + try: + if location is not None: + self.guest.installer.location = location + if cdrom: + self.guest.installer.cdrom = True + + extraargs = "" + if extra: + extraargs += extra + if ks: + extraargs += " ks=%s" % ks + + if extraargs: + self.guest.installer.extraargs = extraargs + except Exception, e: + return self.verr(_("Error setting install media location."), + str(e)) + + # OS distro/variant validation + try: + if distro and distro != OS_GENERIC: + self.guest.os_type = distro + if variant and variant != OS_GENERIC: + self.guest.os_variant = variant + except ValueError, e: + return self.err.val_err(_("Error setting OS information."), + str(e)) + return True + + def validate_mem_page(self): + cpus = self.window.get_widget("config-cpus").get_value() + mem = self.window.get_widget("config-mem").get_value() + + # VCPUS + try: + self.guest.vcpus = int(cpus) + except Exception, e: + return self.verr(_("Error setting CPUs."), str(e)) + + # Memory + try: + self.guest.memory = int(mem) + self.guest.maxmemory = int(mem) + except Exception, e: + return self.verr(_("Error setting guest memory."), str(e)) + + return True + + def validate_storage_page(self): + use_storage = self.window.get_widget("enable-storage").get_active() + + self.guest.disks = [] + + # Validate storage + if not use_storage: + return True + + try: + # This can error out + diskpath, disksize, sparse = self.get_storage_info() + + if not diskpath: + return self.verr(_("A storage path must be specified.")) + + disk = virtinst.VirtualDisk(conn = self.conn.vmm, + path = diskpath, + size = disksize, + sparse = sparse) + + if (disk.type == virtinst.VirtualDisk.TYPE_FILE and + self.guest.type == "xen" and + virtinst.util.is_blktap_capable()): + disk.driver_name = virtinst.VirtualDisk.DRIVER_TAP + + self.guest.disks.append(disk) + except Exception, e: + return self.verr(_("Storage parameter error."), str(e)) + + isfatal, errmsg = disk.is_size_conflict() + if not isfatal and errmsg: + # Fatal errors are reported when setting 'size' + res = self.err.ok_cancel(_("Not Enough Free Space"), errmsg) + if not res: + return False + + # Disk collision + if disk.is_conflict_disk(self.guest.conn): + return self.err.yes_no(_('Disk "%s" is already in use by another ' + 'guest!' % disk.path), + _("Do you really want to use the disk?")) + else: + return True + + def validate_final_page(self): + nettype, devname, macaddr = self.get_config_network_info() + + self.guest.nics = [] + + # Make sure VirtualNetwork is running + if (nettype == VirtualNetworkInterface.TYPE_VIRTUAL and + devname not in self.conn.vmm.listNetworks()): + + res = self.err.yes_no(_("Virtual Network is not active."), + _("Virtual Network '%s' is not active. " + "Would you like to start the network " + "now?") % devname) + if not res: + return False + + # Try to start the network + try: + net = self.conn.vmm.networkLookupByName(devname) + net.create() + logging.info("Started network '%s'." % devname) + except Exception, e: + return self.err.show_err(_("Could not start virtual network " + "'%s': %s") % (devname, str(e)), + "".join(traceback.format_exc())) + + if nettype is None: + # No network device available + instmethod = self.get_config_install_page() + methname = None + if instmethod == INSTALL_PAGE_PXE: + methname = "PXE" + elif instmethod == INSTALL_PAGE_URL: + methname = "URL" + + if methname: + return self.verr(_("Network device required for %s install.") % + methname) + return True + + # Create network device + try: + bridge = None + netname = None + if nettype == VirtualNetworkInterface.TYPE_VIRTUAL: + netname = devname + elif nettype == VirtualNetworkInterface.TYPE_BRIDGE: + bridge = devname + elif nettype == VirtualNetworkInterface.TYPE_USER: + pass + + net = VirtualNetworkInterface(type = nettype, + bridge = bridge, + network = netname, + macaddr = macaddr) + + self.guest.nics.append(net) + except Exception, e: + return self.verr(_("Error with network parameters."), str(e)) + + # Make sure there is no mac address collision + isfatal, errmsg = net.is_conflict_net(self.guest.conn) + if isfatal: + return self.err.val_err(_("Mac address collision."), errmsg) + elif errmsg is not None: + return self.err.yes_no(_("Mac address collision."), + _("%s Are you sure you want to use this " + "address?") % errmsg) + return True + + + # Interesting methods + def build_installer(self, instclass): + installer = instclass(conn = self.conn.vmm, + type = self.capsdomain.hypervisor_type, + os_type = self.capsguest.os_type) + installer.arch = self.capsguest.arch + + return installer + + def guest_from_install_type(self): + instmeth = self.get_config_install_page() + + conntype = self.conn.get_type().lower() + if conntype not in ["xen", "test"]: + return + + # FIXME: some things are dependent on domain type (vcpu max) + if instmeth == INSTALL_PAGE_URL: + self.change_caps(gtype = "xen", dtype = conntype) + else: + self.change_caps(gtype = "hvm", dtype = conntype) + + def reset_guest_type(self): + self.change_caps() + + def finish(self, src): + + # Validate the final page + if self.validate(self.window.get_widget("create-pages").get_current_page()) != True: + return False + + guest = self.guest + disk = len(guest.disks) and guest.disks[0] + + # Generate UUID try: guest.uuid = virtinst.util.uuidToString(virtinst.util.randomUUID()) - except ValueError, e: - return self.err.val_err(_("UUID Error"), str(e)) + except Exception, e: + self.err.show_err(_("Error setting UUID: %s") % str(e), + "".join(traceback.format_exc())) + return False - # HACK: If usermode, and no nic is setup, use usermode networking - if self.connection.is_qemu_session(): - try: - self._net = virtinst.VirtualNetworkInterface(type="user") - except ValueError, e: - return self.err.val_err(_("Failed to set up usermode networking"), str(e)) - - if self._disk is not None: - guest.disks = [self._disk] - else: - logging.debug('No guest disks found in install phase.') - if self._net is not None: - guest.nics = [self._net] - else: - logging.debug('No guest nics found in install phase.') - + # Set up graphics device try: guest._graphics_dev = virtinst.VirtualGraphics(type=virtinst.VirtualGraphics.TYPE_VNC) except Exception, e: @@ -637,6 +1383,7 @@ "".join(traceback.format_exc())) return False + # Set up sound device (if present) guest.sound_devs = [] try: if self.get_config_sound(): @@ -646,36 +1393,33 @@ "".join(traceback.format_exc())) return False - logging.debug("Creating a VM " + guest.name + \ - "\n Type: " + guest.type + \ - "\n UUID: " + guest.uuid + \ - "\n Source: " + self.get_config_install_source() + \ - "\n OS: " + str(self.get_config_os_label()) + \ - "\n Kickstart: " + self.get_config_kickstart_source() + \ - "\n Memory: " + str(guest.memory) + \ - "\n Max Memory: " + str(guest.maxmemory) + \ - "\n # VCPUs: " + str(guest.vcpus) + \ - "\n Filesize: " + str(self._disk.size) + \ - "\n Disk image: " + str(self.get_config_disk_image()) +\ - "\n Non-sparse file: " + str(self.non_sparse) + \ - "\n Audio?: " + str(self.get_config_sound())) + logging.debug("Creating a VM %s" % guest.name + + "\n Type: %s,%s" % (guest.type, + guest.installer.os_type) + + "\n UUID: %s" % guest.uuid + + "\n Install Source: %s" % guest.location + + "\n OS: %s:%s" % (guest.os_type, guest.os_variant) + + "\n Kernel args: %s" % guest.extraargs + + "\n Memory: %s" % guest.memory + + "\n Max Memory: %s" % guest.maxmemory + + "\n # VCPUs: %s" % str(guest.vcpus) + + "\n Filesize: %s" % (disk and disk.size) or "None" + + "\n Disk image: %s" % (disk and disk.path) or "None" + + "\n Audio?: %s" % str(self.get_config_sound())) - #let's go + # Start the install self.install_error = None self.topwin.set_sensitive(False) self.topwin.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) - if not self.non_sparse: - logging.debug("Sparse file or partition selected") - else: - logging.debug("Non-sparse file selected") progWin = vmmAsyncJob(self.config, self.do_install, [guest], title=_("Creating Virtual Machine"), - text=_("The virtual machine is now being created. " + \ - "Allocation of disk storage and retrieval of " + \ - "the installation images may take a few minutes " + \ - "to complete.")) + text=_("The virtual machine is now being " + "created. Allocation of disk storage " + "and retrieval of the installation " + "images may take a few minutes to " + "complete.")) progWin.run() if self.install_error != None: @@ -684,33 +1428,38 @@ self.topwin.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.TOP_LEFT_ARROW)) # Don't close becase we allow user to go back in wizard & correct # their mistakes - #self.close() return self.topwin.set_sensitive(True) self.topwin.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.TOP_LEFT_ARROW)) # Ensure new VM is loaded - self.connection.tick(noStatsUpdate=True) + # FIXME: Hmm, shouldn't we emit a signal here rather than do this? + self.conn.tick(noStatsUpdate=True) if self.config.get_console_popup() == 1: # user has requested console on new created vms only - vm = self.connection.get_vm(guest.uuid) + vm = self.conn.get_vm(guest.uuid) (gtype, ignore, ignore, ignore, ignore) = vm.get_graphics_console() if gtype == "vnc": - self.emit("action-show-console", self.connection.get_uri(), guest.uuid) + self.emit("action-show-console", self.conn.get_uri(), + guest.uuid) else: - self.emit("action-show-terminal", self.connection.get_uri(), guest.uuid) + self.emit("action-show-terminal", self.conn.get_uri(), + guest.uuid) self.close() + def do_install(self, guest, asyncjob): meter = vmmCreateMeter(asyncjob) + try: logging.debug("Starting background install process") - # Stop using virt-manager's connection and open a new one for - # the async install. - logging.debug("Opening separate connection for the install.") - guest.conn = libvirt.open(self.connection.get_uri()) + guest.conn = self.dup_conn(self.conn) + # FIXME: This is why we need a more unified virtinst device API: so + # we can do things like swap out the connection on all + # devices for a forked one. At least we should get a helper + # method in the Guest API. for disk in guest.disks: disk.conn = guest.conn @@ -725,24 +1474,189 @@ (_type, value, stacktrace) = sys.exc_info () # Detailed error message, in English so it can be Googled. - details = \ - "Unable to complete install '%s'" % \ - (str(_type) + " " + str(value) + "\n" + \ - traceback.format_exc (stacktrace)) + details = ("Unable to complete install '%s'" % + (str(_type) + " " + str(value) + "\n" + + traceback.format_exc (stacktrace))) - self.install_error = _("Unable to complete install: '%s'") % str(value) + self.install_error = (_("Unable to complete install: '%s'") % + str(value)) self.install_details = details logging.error(details) - def browse_iso_location(self, ignore1=None, ignore2=None): - f = self._browse_file(_("Locate ISO Image")) - if f != None: - self.window.get_widget("fv-iso-location").set_text(f) + def dup_conn(self, conn): + if conn.is_test_conn(): + # Skip duplicating a test conn, since it doesn't maintain state + # between instances + return conn.vmm + + logging.debug("Duplicating connection for async operation.") + # FIXME: Seems like we should use this commented out code, since + # it will use openAuth. Stick with existing behavior though + # (libvirt.open) until there has been sufficient testing + #newconn = vmmConnection(self.config, self.conn.get_uri(), + # self.conn.is_read_only()) + #newconn.open() + #newconn.connectThreadEvent.wait() + + return libvirt.open(conn.get_uri()) + + def pretty_storage(self, size): + return "%.1f Gb" % float(size) + + def pretty_memory(self, mem): + return "%d MB" % (mem/1024.0) + + # Distro detection methods + + # Clear global detection thread state + def _clear_detect_thread(self): + self.detectThreadLock.acquire() + self.detectThread = None + self.detectThreadLock.release() + + # Create and launch a detection thread (if no detection already running) + def detect_os_distro(self): + self.detectThreadLock.acquire() + if self.detectThread is not None: + # We are already checking (some) media, so let that continue + self.detectThreadLock.release() + return + + self.detectThread = threading.Thread(target=self.do_detect, + name="Detect OS") + self.detectThread.setDaemon(True) + self.detectThreadLock.release() + + self.detectThread.start() + + def set_distro_labels(self, distro, ver): + # Helper to set auto detect result labels + if not self.is_detect_active(): + return + + self.window.get_widget("install-os-type-label").set_text(distro) + self.window.get_widget("install-os-version-label").set_text(ver) + + def set_os_val(self, os_widget, value): + # Helper method to set the OS Type/Variant selections to the passed + # values, or -1 if not present. + model = os_widget.get_model() + idx = 0 + + for idx in range(0, len(model)): + row = model[idx] + if row[0] == value: + break + + if idx == len(os_widget.get_model()) - 1: + idx = -1 + + os_widget.set_active(idx) + + if idx >= 0: + return row[1] + else: + return value + + def set_distro_selection(self, distro, ver): + # Wrapper to change OS Type/Variant values, and update the distro + # detection labels + if not self.is_detect_active(): + return + + if not distro: + distro = _("Unknown") + ver = _("Unknown") + elif not ver: + ver = _("Unknown") + + dl = self.set_os_val(self.window.get_widget("install-os-type"), + distro) + vl = self.set_os_val(self.window.get_widget("install-os-version"), + ver) + self.set_distro_labels(dl, vl) + + def _safe_wrapper(self, func, args): + gtk.gdk.threads_enter() + try: + return func(*args) + finally: + gtk.gdk.threads_leave() + + def _set_forward_sensitive(self, val): + self.window.get_widget("create-forward").set_sensitive(val) + + # The actual detection routine + def do_detect(self): + try: + media = self._safe_wrapper(self.get_config_detectable_media, ()) + if not media: + return + + self.detectedDistro = None + + logging.debug("Starting OS detection thread for media=%s" % media) + self._safe_wrapper(self._set_forward_sensitive, (False,)) + + detectThread = threading.Thread(target=self.actually_detect, + name="Actual media detection", + args=(media,)) + detectThread.setDaemon(True) + detectThread.start() + + base = _("Detecting") + for i in range(1, DETECT_TIMEOUT * 2): + if self.detectedDistro != None: + break + detect_str = base + ("." * (((i + 2) % 3) + 1)) + self._safe_wrapper(self.set_distro_labels, + (detect_str, detect_str)) + time.sleep(.5) + + results = self.detectedDistro + if results == None: + results = (None, None) + + self._safe_wrapper(self.set_distro_selection, results) + finally: + self.detectDistro = None + self._clear_detect_thread() + self._safe_wrapper(self._set_forward_sensitive, (True,)) + logging.debug("Leaving OS detection thread.") + + return + + def actually_detect(self, media): + try: + installer = self.build_installer(virtinst.DistroInstaller) + installer.location = media + + self.detectedDistro = installer.detect_distro() + except: + logging.exception("Error detecting distro.") + self.detectedDistro = (None, None) def _browse_file(self, dialog_name, folder=None, _type=None): + + if self.conn.is_remote() or True: + #if self.storage_browser == None: + # # FIXME: Storage button sensitivity + # self.storage_browser = vmmStorageBrowser(self.config, + # self.conn) + # self.storage_browser.connect("storage-browse-finish", + # self.set_storage_path) + #self.storage_browser.show(self.conn) + #return None + # FIXME: This will eventually call a special storage browser + pass + + # FIXME: Pass local browse fun to storage_browser + self._browse_local(dialog_name, folder, _type) + + def _browse_local(self, dialog_name, folder=None, _type=None): + # user wants to browse for an ISO - fcdialog = gtk.FileChooserDialog(dialog_name, - self.window.get_widget("vmm-create"), + fcdialog = gtk.FileChooserDialog(dialog_name, self.topwin, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_ACCEPT), @@ -764,505 +1678,11 @@ fcdialog.destroy() return None - def browse_storage_partition_address(self, src, ignore=None): - part = self._browse_file(_("Locate Storage Partition"), "/dev") - if part != None: - self.window.get_widget("storage-partition-address").set_text(part) + def show_help(self, ignore): + # No help available yet. + pass - def browse_storage_file_address(self, src, ignore=None): - fcdialog = gtk.FileChooserDialog(_("Locate or Create New Storage File"), - self.window.get_widget("vmm-create"), - gtk.FILE_CHOOSER_ACTION_SAVE, - (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_OPEN, gtk.RESPONSE_ACCEPT), - None) - fcdialog.set_default_response(gtk.RESPONSE_ACCEPT) - fcdialog.set_current_folder(self.config.get_default_image_dir(self.connection)) - fcdialog.set_do_overwrite_confirmation(True) - fcdialog.connect("confirm-overwrite", self.confirm_overwrite_callback) - response = fcdialog.run() - fcdialog.hide() - f = None - if(response == gtk.RESPONSE_ACCEPT): - f = fcdialog.get_filename() - if f != None: - self.window.get_widget("storage-file-address").set_text(f) - - def toggle_storage_size(self, ignore1=None, ignore2=None): - f = self.get_config_disk_image() - if f != None and len(f) > 0 and \ - (self.connection.is_remote() or not os.path.exists(f)): - self.window.get_widget("storage-file-size").set_sensitive(True) - self.window.get_widget("non-sparse").set_sensitive(True) - size = self.get_config_disk_size() - if size == None: - size = 4000 - self.window.get_widget("storage-file-size").set_value(size) - else: - self.window.get_widget("storage-file-size").set_sensitive(False) - self.window.get_widget("non-sparse").set_sensitive(False) - if os.path.isfile(f): - size = os.path.getsize(f)/(1024*1024) - self.window.get_widget("storage-file-size").set_value(size) - else: - self.window.get_widget("storage-file-size").set_value(0) - - def confirm_overwrite_callback(self, chooser): - # Only called when the user has chosen an existing file - self.window.get_widget("storage-file-size").set_sensitive(False) - return gtk.FILE_CHOOSER_CONFIRMATION_ACCEPT_FILENAME - - def change_media_type(self, ignore=None): - if self.window.get_widget("media-iso-image").get_active(): - self.window.get_widget("fv-iso-location-box").set_sensitive(True) - self.window.get_widget("cd-path").set_sensitive(False) - elif self.window.get_widget("media-physical").get_active(): - self.window.get_widget("fv-iso-location-box").set_sensitive(False) - self.window.get_widget("cd-path").set_sensitive(True) - self.window.get_widget("cd-path").set_active(-1) - else: - self.window.get_widget("fv-iso-location-box").set_sensitive(False) - self.window.get_widget("cd-path").set_sensitive(False) - - def change_storage_type(self, ignore=None): - if self.window.get_widget("storage-partition").get_active(): - self.window.get_widget("storage-partition-box").set_sensitive(True) - self.window.get_widget("storage-file-box").set_sensitive(False) - self.window.get_widget("storage-file-size").set_sensitive(False) - self.window.get_widget("non-sparse").set_sensitive(False) - else: - self.window.get_widget("storage-partition-box").set_sensitive(False) - self.window.get_widget("storage-file-box").set_sensitive(True) - _file = self.window.get_widget("storage-file-address").get_text() - if _file is None or _file == "": - _dir = self.config.get_default_image_dir(self.connection) - _file = os.path.join(_dir, self.get_config_name() + ".img") - if not self.connection.is_remote(): - n = 1 - while os.path.exists(_file) and n < 100: - _file = os.path.join(_dir, self.get_config_name() + \ - "-" + str(n) + ".img") - n = n + 1 - if os.path.exists(_file): - _file = "" - self.window.get_widget("storage-file-address").set_text(_file) - self.toggle_storage_size() - - def change_network_type(self, ignore=None): - if self.window.get_widget("net-type-network").get_active(): - self.window.get_widget("net-network").set_sensitive(True) - self.window.get_widget("net-device").set_sensitive(False) - else: - self.window.get_widget("net-network").set_sensitive(False) - self.window.get_widget("net-device").set_sensitive(True) - - def change_macaddr_use(self, ignore=None): - if self.window.get_widget("mac-address").get_active(): - self.window.get_widget("create-mac-address").set_sensitive(True) - else: - self.window.get_widget("create-mac-address").set_sensitive(False) - - def set_max_memory(self, src): - max_memory = src.get_adjustment().value - startup_mem_adjustment = self.window.get_widget("create-memory-startup").get_adjustment() - if startup_mem_adjustment.value > max_memory: - startup_mem_adjustment.value = max_memory - startup_mem_adjustment.upper = max_memory - - def set_max_vcpus(self, _type): - self.window.get_widget("create-vcpus").get_adjustment().upper = self.connection.get_max_vcpus(_type) - self.window.get_widget("config-max-vcpus").set_text(str(self.connection.get_max_vcpus(_type))) - - def validate(self, page_num): - - # Setting the values in the Guest/Disk/Network virtinst objects - # provides a lot of error checking for free, we just have to catch - # the messages - - if page_num == PAGE_NAME: - name = self.window.get_widget("create-vm-name").get_text() - try: - self._guest.name = name - except ValueError, e: - return self.err.val_err(_("Invalid System Name"), str(e)) - elif page_num == PAGE_TYPE: - - # Set up appropriate guest object dependent on selected type - name = self._guest.name - if self.get_config_method() == VM_PARA_VIRT: - self._guest = virtinst.ParaVirtGuest(type=self.get_domain_type(), - connection=self.connection.vmm) - else: - self._guest = virtinst.FullVirtGuest(type=self.get_domain_type(), - arch=self.get_domain_arch(), - connection=self.connection.vmm) - - self._guest.name = name # Transfer name over - - # Set vcpu limits based on guest type - try: - self.set_max_vcpus(self.get_domain_type()) - except Exception, e: - logging.exception(e) - - elif page_num == PAGE_INST: - if self.get_config_method() == VM_PARA_VIRT: - os_type = "xen" - else: - os_type = "hvm" - self._guest.installer = self.get_config_installer(self.get_domain_type(), os_type) - - try: - if self.get_config_os_type() is not None \ - and self.get_config_os_type() != "generic": - logging.debug("OS Type: %s" % self.get_config_os_type()) - self._guest.os_type = self.get_config_os_type() - except ValueError, e: - return self.err.val_err(_("Invalid FV OS Type"), str(e)) - try: - if self.get_config_os_variant() is not None \ - and self.get_config_os_type() != "generic": - logging.debug("OS Variant: %s" % self.get_config_os_variant()) - self._guest.os_variant = self.get_config_os_variant() - except ValueError, e: - return self.err.val_err(_("Invalid FV OS Variant"), str(e)) - elif page_num == PAGE_INST_LOCAL: - if self.get_config_method() == VM_PARA_VIRT: - os_type = "xen" - else: - os_type = "hvm" - self._guest.installer = self.get_config_installer(self.get_domain_type(), os_type) - - src = self.get_config_install_source() - if not src: - return self.err.val_err(_("An install media path is required.")) - - if self.window.get_widget("media-iso-image").get_active(): - try: - self._guest.installer.location = src - self._guest.installer.cdrom = True - except ValueError, e: - return self.err.val_err(_("ISO Path Not Found"), str(e)) - else: - try: - self._guest.installer.location = src - self._guest.installer.cdrom = True - except ValueError, e: - return self.err.val_err(_("CD-ROM Path Error"), str(e)) - elif page_num == PAGE_INST_TREE: - - src = self.get_config_install_source() - if not src: - return self.err.val_err(_("An install url is required.")) - try: - self._guest.location = src - except ValueError, e: - return self.err.val_err(_("Invalid Install URL"), str(e)) - - ks = self.get_config_kickstart_source() - if ks is not None and len(ks) != 0: - if not (ks.startswith("http://") or ks.startswith("ftp://") \ - or ks.startswith("nfs:")): - return self.err.val_err(_("Kickstart URL Error"), \ - _("Kickstart location must be an NFS, HTTP or FTP source")) - else: - self._guest.extraargs = "ks=%s" % (ks,) - - kernel_params = self.get_config_kernel_params() - if kernel_params != "": - if self._guest.extraargs is None: - self._guest.extraargs = kernel_params - else: - self._guest.extraargs = "%s %s" % (self._guest.extraargs, kernel_params) - self._guest.extraargs = self._guest.extraargs.strip() - - elif page_num == PAGE_DISK: - path = self.get_config_disk_image() - if path == None or len(path) == 0: - return self.err.val_err(_("Storage Address Required"), \ - _("You must specify a partition or a file for storage for the guest install.")) - - # Attempt to set disk - filesize = None - if self.get_config_disk_size() != None: - filesize = self.get_config_disk_size() / 1024.0 - try: - if self.window.get_widget("storage-partition").get_active(): - _type = virtinst.VirtualDisk.TYPE_BLOCK - else: - _type = virtinst.VirtualDisk.TYPE_FILE - - if (os.path.dirname(os.path.abspath(path)) == \ - vmmutil.DEFAULT_POOL_PATH): - vmmutil.build_default_pool(self._guest.conn) - - self._disk = virtinst.VirtualDisk(path, - filesize, - sparse = self.is_sparse_file(), - device = virtinst.VirtualDisk.DEVICE_DISK, - type = _type, - conn=self._guest.conn) - - if self._disk.type == virtinst.VirtualDisk.TYPE_FILE and \ - self.get_config_method() == VM_PARA_VIRT and \ - virtinst.util.is_blktap_capable(): - self._disk.driver_name = virtinst.VirtualDisk.DRIVER_TAP - - if self._disk.type == virtinst.VirtualDisk.TYPE_FILE and not \ - self.is_sparse_file(): - self.non_sparse = True - else: - self.non_sparse = False - except ValueError, e: - return self.err.val_err(_("Invalid Storage Address"), str(e)) - - ret = self._disk.is_size_conflict() - if not ret[0] and ret[1]: - res = self.err.ok_cancel(_("Not Enough Free Space"), ret[1]) - if not res: - return False - - if self._disk.is_conflict_disk(self._guest.conn) is True: - res = self.err.yes_no(_('Disk "%s" is already in use by another guest!' % self._disk.path), _("Do you really want to use the disk?")) - return res - - elif page_num == PAGE_NETWORK: - - if self.window.get_widget("net-type-network").get_active(): - if self.window.get_widget("net-network").get_active() == -1: - return self.err.val_err(_("Virtual Network Required"), - _("You must select one of the virtual networks.")) - else: - if self.window.get_widget("net-device").get_active() == -1: - return self.err.val_err(_("Physical Device Required"), - _("You must select a physical device.")) - - net = self.get_config_network() - if self.window.get_widget("mac-address").get_active(): - mac = self.window.get_widget("create-mac-address").get_text() - if mac is None or len(mac) == 0: - return self.err.val_err(_("Invalid MAC address"), \ - _("No MAC address was entered. Please enter a valid MAC address.")) - - else: - mac = None - try: - if net[0] == "bridge": - self._net = virtinst.VirtualNetworkInterface(macaddr=mac, \ - type=net[0], \ - bridge=net[1]) - elif net[0] == "network": - self._net = virtinst.VirtualNetworkInterface(macaddr=mac, \ - type=net[0], \ - network=net[1]) - elif net[0] == "user": - self._net = virtinst.VirtualNetworkInterface(macaddr=mac, \ - type=net[0]) - except ValueError, e: - return self.err.val_err(_("Network Parameter Error"), str(e)) - - if self._net.type == "network": - if self._net.network not in self.connection.vmm.listNetworks(): - res = self.err.yes_no(_("Virtual Network is Inactive"), - _("Virtual Network '%s' is not active. Would you like to start the network now?") % - self._net.network) - if res: - net = self.connection.vmm.networkLookupByName(self._net.network) - net.create() - logging.info("Started network '%s'." % self._net.network) - else: - return False - - conflict = self._net.is_conflict_net(self._guest.conn) - if conflict[0]: - return self.err.val_err(_("Mac address collision"), conflict[1]) - elif conflict[1] is not None: - return self.err.yes_no(_("Mac address collision"),\ - conflict[1] + " " + _("Are you sure you want to use this address?")) - - elif page_num == PAGE_CPUMEM: - - # Set vcpus - try: - self._guest.vcpus = int(self.get_config_virtual_cpus()) - except ValueError, e: - return self.err.val_err(_("VCPU Count Error"), str(e)) - # Set Memory - try: - self._guest.memory = int(self.get_config_initial_memory()) - except ValueError, e: - return self.err.val_err(_("Memory Amount Error"), str(e)) - # Set Max Memory - try: - self._guest.maxmemory = int(self.get_config_maximum_memory()) - except ValueError, e: - return self.err.val_err(_("Max Memory Amount Error"), str(e)) - - # do this always, since there's no "leaving a notebook page" event. - self.window.get_widget("create-back").set_sensitive(True) - return True - - def populate_url_model(self, model, urls): - model.clear() - for url in urls: - model.append([url]) - - def populate_os_type_model(self): - model = self.window.get_widget("os-type").get_model() - model.clear() - model.append(["generic", "Generic"]) - types = virtinst.FullVirtGuest.list_os_types() - for _type in types: - model.append([_type, - virtinst.FullVirtGuest.get_os_type_label(_type)]) - - def populate_os_variant_model(self, _type): - model = self.window.get_widget("os-variant").get_model() - model.clear() - if _type == "generic": - model.append(["generic", "Generic"]) - return - variants = virtinst.FullVirtGuest.list_os_variants(_type) - for variant in variants: - model.append([variant, - virtinst.FullVirtGuest.get_os_variant_label(_type, - variant)]) - - def populate_network_model(self, model): - model.clear() - for uuid in self.connection.list_net_uuids(): - net = self.connection.get_net(uuid) - if net.get_name() in self.connection.vmm.listNetworks(): - model.append([net.get_label(), net.get_name()]) - else: - model.append([net.get_label(), "%s (%s)" % (net.get_name(), _("Inactive"))]) - - def populate_device_model(self, model): - model.clear() - hasShared = False - brIndex = -1 - for name in self.connection.list_net_device_paths(): - net = self.connection.get_net_device(name) - if net.is_shared(): - hasShared = True - if brIndex < 0: - brIndex = len(model) - model.append([net.get_bridge(), "%s (%s %s)" % (net.get_name(), _("Bridge"), net.get_bridge()), True]) - else: - model.append([net.get_bridge(), "%s (%s)" % (net.get_name(), _("Not bridged")), False]) - return (hasShared, brIndex) - - def change_os_type(self, box): - model = box.get_model() - if box.get_active_iter() != None: - _type = model.get_value(box.get_active_iter(), 0) - self.populate_os_variant_model(_type) - variant = self.window.get_widget("os-variant") - variant.set_active(0) - - def change_virt_method(self, ignore=None): - arch = self.window.get_widget("cpu-architecture") - - if self.get_config_method() == VM_PARA_VIRT: - nativeArch = self.repopulate_cpu_arch(arch.get_model(), ["xen", "linux"]) - else: - nativeArch = self.repopulate_cpu_arch(arch.get_model(), ["hvm"]) - arch.set_active(nativeArch) - self.change_cpu_arch() - - def change_cpu_arch(self, ignore=None): - hypervisor = self.window.get_widget("hypervisor") - arch = self.get_domain_arch() - - if arch is None: - hypervisor.set_active(-1) - hypervisor.set_sensitive(False) - return - - hypervisor.set_sensitive(True) - if self.get_config_method() == VM_PARA_VIRT: - bestHyper = self.repopulate_hypervisor(hypervisor.get_model(), ["xen", "linux"], arch) - else: - bestHyper = self.repopulate_hypervisor(hypervisor.get_model(), ["hvm"], arch) - hypervisor.set_active(bestHyper) - - def get_domain_arch(self): - arch = self.window.get_widget("cpu-architecture") - if arch.get_active() == -1: - return None - return arch.get_model()[arch.get_active()][0] - - def pretty_memory(self, mem): - if mem > (1024*1024): - return "%2.2f GB" % (mem/(1024.0*1024.0)) - else: - return "%2.2f MB" % (mem/1024.0) - - def is_sparse_file(self): - if self.window.get_widget("non-sparse").get_active(): - return False - else: - return True - - def get_domain_type(self): - hypervisor = self.window.get_widget("hypervisor") - - if hypervisor.get_active() == -1: - return None - - return hypervisor.get_model()[hypervisor.get_active()][0] - - def repopulate_cpu_arch(self, model, ostype): - model.clear() - i = 0 - native = -1 - for guest in self.caps.guests: - if guest.os_type not in ostype: - continue - - model.append([guest.arch]) - if guest.arch == self.caps.host.arch: - native = i - i = i + 1 - - return native - - - def repopulate_hypervisor(self, model, ostype, arch): - model.clear() - i = -1 - for guest in self.caps.guests: - if guest.os_type not in ostype or guest.arch != arch: - continue - - for domain in guest.domains: - model.append([domain.hypervisor_type]) - i = i + 1 - - return i - - def show_help(self, src): - # help to show depends on the notebook page, yahoo - page = self.window.get_widget("create-pages").get_current_page() - if page == PAGE_INTRO: - self.emit("action-show-help", "virt-manager-create-wizard") - elif page == PAGE_NAME: - self.emit("action-show-help", "virt-manager-system-name") - elif page == PAGE_TYPE: - self.emit("action-show-help", "virt-manager-virt-method") - elif page == PAGE_INST: - self.emit("action-show-help", "virt-manager-installation-media") - elif page == PAGE_INST_LOCAL: - self.emit("action-show-help", "virt-manager-installation-media-local") - elif page == PAGE_INST_TREE: - self.emit("action-show-help", "virt-manager-installation-media-tree") - elif page == PAGE_DISK: - self.emit("action-show-help", "virt-manager-storage-space") - elif page == PAGE_NETWORK: - self.emit("action-show-help", "virt-manager-network") - elif page == PAGE_CPUMEM: - self.emit("action-show-help", "virt-manager-memory-and-cpu") - elif page == PAGE_SUMMARY: - self.emit("action-show-help", "virt-manager-validation") + def verr(self, msg, extra=None): + return self.err.val_err(msg, extra) gobject.type_register(vmmCreate) diff -r 35f1db8a045d -r e232a860b409 src/virtManager/engine.py --- a/src/virtManager/engine.py Sat Feb 28 19:27:20 2009 -0500 +++ b/src/virtManager/engine.py Fri Mar 06 12:14:50 2009 -0500 @@ -125,9 +125,9 @@ if self.connections[hvuri]["windowHost"] is not None: self.connections[hvuri]["windowHost"].close() self.connections[hvuri]["windowHost"] = None - if self.connections[hvuri]["windowCreate"] is not None: - self.connections[hvuri]["windowCreate"].close() - self.connections[hvuri]["windowCreate"] = None + if (self.windowCreate and self.windowCreate.conn and + self.windowCreate.conn.get_uri() == hvuri): + self.windowCreate.close() def reschedule_timer(self, ignore1,ignore2,ignore3,ignore4): self.schedule_timer() @@ -342,21 +342,18 @@ return True def show_create(self, uri): - con = self.get_connection(uri) - - if self.connections[uri]["windowCreate"] == None: - create = vmmCreate(self.get_config(), con) + if self.windowCreate == None: + create = vmmCreate(self.get_config(), self) create.connect("action-show-console", self._do_show_console) create.connect("action-show-help", self._do_show_help) - self.connections[uri]["windowCreate"] = create - self.connections[uri]["windowCreate"].show() + self.windowCreate = create + self.windowCreate.show(uri) def add_connection(self, uri, readOnly=None, autoconnect=False): conn = vmmConnection(self.get_config(), uri, readOnly) self.connections[uri] = { "connection": conn, "windowHost": None, - "windowCreate": None, "windowDetails": {}, "windowConsole": {}, } diff -r 35f1db8a045d -r e232a860b409 src/virtManager/manager.py --- a/src/virtManager/manager.py Sat Feb 28 19:27:20 2009 -0500 +++ b/src/virtManager/manager.py Fri Mar 06 12:14:50 2009 -0500 @@ -705,7 +705,6 @@ # Nothing is selected self.window.get_widget("vm-open").set_sensitive(False) self.window.get_widget("vm-delete").set_sensitive(False) - self.window.get_widget("vm-new").set_sensitive(False) self.window.get_widget("menu_edit_details").set_sensitive(False) self.window.get_widget("menu_edit_delete").set_sensitive(False) self.window.get_widget("menu_host_details").set_sensitive(False) @@ -720,7 +719,6 @@ self.window.get_widget("vm-delete").set_sensitive(True) else: self.window.get_widget("vm-delete").set_sensitive(False) - self.window.get_widget("vm-new").set_sensitive(False) self.window.get_widget("menu_edit_details").set_sensitive(True) self.window.get_widget("menu_edit_delete").set_sensitive(True) self.window.get_widget("menu_host_details").set_sensitive(True) @@ -733,10 +731,8 @@ else: self.window.get_widget("vm-delete").set_sensitive(False) if conn.get_state() == vmmConnection.STATE_ACTIVE: - self.window.get_widget("vm-new").set_sensitive(True) self.window.get_widget("menu_file_restore_saved").set_sensitive(True) else: - self.window.get_widget("vm-new").set_sensitive(False) self.window.get_widget("menu_file_restore_saved").set_sensitive(False) self.window.get_widget("menu_edit_details").set_sensitive(False) self.window.get_widget("menu_edit_delete").set_sensitive(False) @@ -804,8 +800,7 @@ return False def new_vm(self, ignore=None): - conn = self.current_connection() - self.emit("action-show-create", conn.get_uri()) + self.emit("action-show-create", self.current_connection_uri()) def delete_vm(self, ignore=None): conn = self.current_connection() diff -r 35f1db8a045d -r e232a860b409 src/vmm-create.glade --- a/src/vmm-create.glade Sat Feb 28 19:27:20 2009 -0500 +++ b/src/vmm-create.glade Fri Mar 06 12:14:50 2009 -0500 @@ -1,240 +1,62 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd"> -<!--*- mode: xml -*--> +<!--Generated with glade3 3.4.5 on Fri Mar 6 10:49:03 2009 --> <glade-interface> <widget class="GtkWindow" id="vmm-create"> - <property name="visible">True</property> - <property name="border_width">6</property> - <property name="title" translatable="yes">Create a new virtual machine</property> - <signal name="delete_event" handler="on_vmm_create_delete_event"/> + <property name="title" translatable="yes">New VM</property> + <signal name="delete_event" handler="on_vmm_newcreate_delete_event"/> <child> - <widget class="GtkVBox" id="vbox23"> + <widget class="GtkVBox" id="vbox1"> <property name="visible">True</property> - <property name="spacing">6</property> <child> - <widget class="GtkNotebook" id="create-pages"> + <widget class="GtkViewport" id="create-header"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="border_width">2</property> - <signal name="switch_page" handler="on_create_pages_switch_page"/> + <property name="resize_mode">GTK_RESIZE_QUEUE</property> <child> - <widget class="GtkVBox" id="vbox22"> + <widget class="GtkHBox" id="hbox1"> <property name="visible">True</property> + <property name="border_width">6</property> + <property name="spacing">10</property> <child> - <widget class="GtkAlignment" id="alignment45"> + <widget class="GtkImage" id="create-vm-icon"> <property name="visible">True</property> - <child> - <widget class="GtkEventBox" id="page0-title"> - <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="intro-title-label"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xpad">5</property> - <property name="ypad">6</property> - <property name="label" translatable="yes"><span weight="heavy" size="xx-large" foreground="#FFF">Virtual Machine Creation </span></property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_FILL</property> - </widget> - </child> - </widget> - </child> + <property name="icon_size">6</property> + <property name="icon_name">computer</property> </widget> <packing> <property name="expand">False</property> + <property name="fill">False</property> </packing> </child> <child> - <widget class="GtkVBox" id="vbox23"> + <widget class="GtkHBox" id="hbox2"> <property name="visible">True</property> <child> - <widget class="GtkLabel" id="label148"> + <widget class="GtkVBox" id="vbox3"> <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">20</property> - <property name="ypad">10</property> - <property name="label" translatable="yes">This assistant will guide you through creating a new virtual machine. You will be asked for some information about the virtual machine you'd like to create, such as:</property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment46"> - <property name="visible">True</property> - <property name="left_padding">25</property> <child> - <widget class="GtkTable" id="table12"> + <widget class="GtkLabel" id="label2"> <property name="visible">True</property> - <property name="n_rows">5</property> - <property name="n_columns">2</property> - <property name="column_spacing">8</property> - <property name="row_spacing">13</property> - <child> - <widget class="GtkLabel" id="label165"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label"><small>â??</small></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label164"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label"><small>â??</small></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label163"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label"><small>â??</small></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label162"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label"><small>â??</small></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label161"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label"><small>â??</small></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label160"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">6</property> - <property name="label" translatable="yes">Whether the virtual machine will be <b>fully virtualized</b> or <b>para-virtualized</b></property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label158"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">6</property> - <property name="label" translatable="yes"><b>Memory</b> and <b>CPU</b> allocation</property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label157"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">6</property> - <property name="label" translatable="yes"><b>Storage</b> details - which disk partitions or files the virtual machine should use</property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label156"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">6</property> - <property name="label" translatable="yes">The <b>location</b> of the files necessary for installing an operating system on the virtual machine</property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label154"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">6</property> - <property name="label" translatable="yes">A <b>name</b> for your new virtual machine</property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="y_options"></property> - </packing> - </child> + <property name="xalign">0</property> + <property name="label" translatable="yes"><span size='large' color='white'>Create a new virtual machine</span></property> + <property name="use_markup">True</property> </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="config-pagenum"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label"><span color='#59B0E2'>Step foo of bar</span></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="position">1</property> + </packing> </child> </widget> - <packing> - <property name="position">1</property> - </packing> </child> </widget> <packing> @@ -243,361 +65,364 @@ </child> </widget> </child> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkVBox" id="vbox2"> + <property name="visible">True</property> + <property name="border_width">12</property> + <property name="spacing">15</property> <child> - <widget class="GtkLabel" id="label141"> + <widget class="GtkAlignment" id="alignment1"> <property name="visible">True</property> - <property name="label" translatable="no">Intro</property> - </widget> - <packing> - <property name="type">tab</property> - <property name="tab_fill">False</property> - </packing> - </child> - <child> - <widget class="GtkVBox" id="vbox24"> - <property name="visible">True</property> - <property name="border_width">1</property> + <property name="top_padding">3</property> + <property name="left_padding">3</property> <child> - <widget class="GtkAlignment" id="alignment47"> + <widget class="GtkNotebook" id="create-pages"> <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="show_border">False</property> + <signal name="switch_page" handler="on_create_pages_switch_page"/> <child> - <widget class="GtkEventBox" id="page1-title"> + <widget class="GtkVBox" id="vbox4"> <property name="visible">True</property> + <property name="spacing">40</property> <child> - <widget class="GtkLabel" id="page1-title-label"> + <widget class="GtkVBox" id="vbox5"> <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xpad">5</property> - <property name="ypad">6</property> - <property name="label" translatable="yes"><span weight="heavy" size="xx-large" foreground="#FFF">Virtual Machine Name </span></property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_FILL</property> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkVBox" id="vbox25"> - <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label167"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">20</property> - <property name="ypad">10</property> - <property name="label" translatable="yes">Please choose a name for your virtual machine:</property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment48"> - <property name="visible">True</property> - <property name="left_padding">25</property> - <child> - <widget class="GtkTable" id="table13"> - <property name="visible">True</property> - <property name="border_width">6</property> - <property name="n_rows">2</property> - <property name="n_columns">2</property> - <property name="column_spacing">3</property> - <property name="row_spacing">3</property> + <property name="spacing">6</property> <child> - <placeholder/> - </child> - <child> - <widget class="GtkEntry" id="create-vm-name"> + <widget class="GtkLabel" id="label10"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="max_length">50</property> - <accessibility> - <atkproperty name="AtkObject::accessible_name" translatable="yes">Name Field</atkproperty> - </accessibility> + <property name="xalign">0</property> + <property name="label" translatable="yes">Enter your virtual machine details</property> </widget> <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="y_options"></property> + <property name="expand">False</property> </packing> </child> <child> - <widget class="GtkHBox" id="hbox26"> + <widget class="GtkAlignment" id="alignment7"> <property name="visible">True</property> + <property name="left_padding">15</property> <child> - <widget class="GtkImage" id="image78"> + <widget class="GtkTable" id="table5"> <property name="visible">True</property> - <property name="icon_name">gtk-info</property> - </widget> - <packing> - <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label174"> - <property name="visible">True</property> - <property name="xpad">7</property> - <property name="label" translatable="yes"><b>Example:</b> system1</property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label173"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">_Name:</property> - <property name="use_markup">True</property> - <property name="use_underline">True</property> - <property name="justify">GTK_JUSTIFY_RIGHT</property> - <property name="mnemonic_widget">create-vm-name</property> - </widget> - <packing> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - </child> - </widget> - <packing> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="position">1</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label142"> - <property name="visible">True</property> - <property name="label" translatable="no">Name</property> - </widget> - <packing> - <property name="type">tab</property> - <property name="position">1</property> - <property name="tab_fill">False</property> - </packing> - </child> - <child> - <widget class="GtkVBox" id="vbox26"> - <property name="visible">True</property> - <property name="border_width">1</property> - <child> - <widget class="GtkAlignment" id="alignment49"> - <property name="visible">True</property> - <child> - <widget class="GtkEventBox" id="page2-title"> - <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label175"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xpad">5</property> - <property name="ypad">6</property> - <property name="label" translatable="yes"><span weight="heavy" size="xx-large" foreground="#FFF">Virtualization Method</span></property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_FILL</property> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkVBox" id="vbox27"> - <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label176"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">20</property> - <property name="ypad">10</property> - <property name="label" translatable="yes">You will need to choose a virtualization method for your new virtual machine:</property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment50"> - <property name="visible">True</property> - <property name="left_padding">25</property> - <child> - <widget class="GtkVBox" id="vbox49"> - <property name="visible">True</property> - <child> - <widget class="GtkAlignment" id="alignment113"> - <property name="visible">True</property> - <property name="yalign">0</property> - <property name="yscale">0</property> - <child> - <widget class="GtkRadioButton" id="virt-method-pv"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">_Paravirtualized:</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="active">True</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_virt_method_toggled"/> - </widget> - </child> - </widget> - </child> - <child> - <widget class="GtkLabel" id="label296"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">21</property> - <property name="label" translatable="yes">Lightweight method of virtualizing machines. Limits operating system choices because the OS must be specially modified to support paravirtualization, but performs better than fully virtualized.</property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment114"> - <property name="visible">True</property> - <property name="yalign">0</property> - <property name="yscale">0</property> - <property name="top_padding">5</property> - <child> - <widget class="GtkRadioButton" id="virt-method-fv"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">F_ully virtualized:</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="draw_indicator">True</property> - <property name="group">virt-method-pv</property> - <signal name="toggled" handler="on_virt_method_toggled"/> + <property name="n_rows">2</property> + <property name="n_columns">3</property> + <property name="column_spacing">6</property> + <property name="row_spacing">4</property> + <child> + <placeholder/> + </child> + <child> + <widget class="GtkEntry" id="create-vm-name"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="x_options">GTK_FILL</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label77"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="label" translatable="yes">Connection:</property> + </widget> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label11"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="label" translatable="yes">Name:</property> + </widget> + <packing> + <property name="x_options">GTK_FILL</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox3"> + <property name="visible">True</property> + <child> + <widget class="GtkComboBox" id="create-conn"> + <property name="visible">True</property> + <signal name="changed" handler="on_create_conn_changed"/> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="create-conn-label"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label">conn label</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">3</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> </widget> </child> </widget> <packing> - <property name="position">2</property> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkVBox" id="install-box"> + <property name="visible">True</property> + <property name="spacing">8</property> + <child> + <widget class="GtkLabel" id="label12"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Choose how you would like to install the opertaing system</property> + </widget> + <packing> + <property name="expand">False</property> </packing> </child> <child> - <widget class="GtkAlignment" id="alignment133"> + <widget class="GtkAlignment" id="alignment13"> <property name="visible">True</property> - <property name="left_padding">21</property> + <property name="left_padding">15</property> <child> - <widget class="GtkVBox" id="vbox51"> + <widget class="GtkVBox" id="vbox6"> <property name="visible">True</property> + <property name="spacing">3</property> <child> - <widget class="GtkLabel" id="label297"> + <widget class="GtkRadioButton" id="method-local"> <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Involves hardware simulation, allowing for a greater range of virtual devices and operating systems (does not require OS modification).</property> - <property name="use_markup">True</property> - <property name="wrap">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Local install media (ISO image or CDROM)</property> + <property name="response_id">0</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> </widget> <packing> <property name="expand">False</property> - <property name="fill">False</property> </packing> </child> <child> - <widget class="GtkAlignment" id="alignment154"> + <widget class="GtkRadioButton" id="method-tree"> <property name="visible">True</property> - <property name="top_padding">6</property> - <property name="bottom_padding">6</property> - <property name="left_padding">30</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Network Install (HTTP, FTP, or NFS)</property> + <property name="response_id">0</property> + <property name="draw_indicator">True</property> + <property name="group">method-local</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkRadioButton" id="method-pxe"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Network Boot (PXE)</property> + <property name="response_id">0</property> + <property name="draw_indicator">True</property> + <property name="group">method-local</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">2</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + </child> + <child> + <widget class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="label" translatable="yes">Name</property> + </widget> + <packing> + <property name="type">tab</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <widget class="GtkVBox" id="vbox7"> + <property name="visible">True</property> + <property name="spacing">10</property> + <child> + <widget class="GtkNotebook" id="install-method-pages"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="show_border">False</property> + <child> + <widget class="GtkAlignment" id="alignment2"> + <property name="visible">True</property> + <property name="bottom_padding">10</property> + <child> + <widget class="GtkVBox" id="vbox9"> + <property name="visible">True</property> + <property name="spacing">6</property> + <child> + <widget class="GtkLabel" id="label21"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Locate your install media</property> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkAlignment" id="alignment6"> + <property name="visible">True</property> + <property name="left_padding">15</property> <child> - <widget class="GtkTable" id="table32"> + <widget class="GtkVBox" id="vbox13"> <property name="visible">True</property> - <property name="n_rows">2</property> - <property name="n_columns">2</property> + <property name="spacing">4</property> <child> - <widget class="GtkComboBox" id="cpu-architecture"> + <widget class="GtkVBox" id="install-local-cdrom-box"> <property name="visible">True</property> - <property name="items" translatable="yes"></property> - <signal name="changed" handler="on_cpu_architecture_changed"/> + <property name="spacing">4</property> + <child> + <widget class="GtkRadioButton" id="install-local-cdrom"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Use CDROM or DVD</property> + <property name="response_id">0</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_install_local_cdrom_toggled"/> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkAlignment" id="alignment12"> + <property name="visible">True</property> + <property name="left_padding">20</property> + <child> + <widget class="GtkHBox" id="hbox10"> + <property name="visible">True</property> + <child> + <widget class="GtkComboBox" id="install-local-cdrom-combo"> + <property name="visible">True</property> + <signal name="changed" handler="on_install_local_cdrom_combo_changed"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> </widget> <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="x_options">GTK_FILL</property> + <property name="expand">False</property> + <property name="fill">False</property> </packing> </child> <child> - <widget class="GtkComboBox" id="hypervisor"> + <widget class="GtkRadioButton" id="install-local-iso"> <property name="visible">True</property> - <property name="items" translatable="yes"></property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Use ISO image:</property> + <property name="response_id">0</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <property name="group">install-local-cdrom</property> + <signal name="toggled" handler="on_install_local_iso_toggled"/> </widget> <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> + <property name="expand">False</property> + <property name="position">1</property> </packing> </child> <child> - <widget class="GtkLabel" id="label398"> + <widget class="GtkHBox" id="hbox4"> <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Hypervisor:</property> + <property name="spacing">5</property> + <child> + <widget class="GtkAlignment" id="alignment8"> + <property name="visible">True</property> + <property name="left_padding">20</property> + <child> + <widget class="GtkEntry" id="install-local-entry"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <signal name="activate" handler="on_install_local_entry_activate"/> + </widget> + </child> + </widget> + </child> + <child> + <widget class="GtkButton" id="install-local-browse"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="label" translatable="yes">Browse...</property> + <property name="response_id">0</property> + <signal name="clicked" handler="on_install_local_browse_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> </widget> <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label397"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">CPU architecture:</property> - </widget> - <packing> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="expand">False</property> + <property name="position">2</property> </packing> </child> </widget> @@ -607,39 +432,982 @@ <property name="position">1</property> </packing> </child> + </widget> + </child> + </widget> + </child> + <child> + <widget class="GtkLabel" id="label18"> + <property name="visible">True</property> + <property name="label" translatable="yes">ISO</property> + </widget> + <packing> + <property name="type">tab</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <widget class="GtkVBox" id="vbox10"> + <property name="visible">True</property> + <property name="spacing">6</property> + <child> + <widget class="GtkLabel" id="label23"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Provide the operating system URL</property> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkAlignment" id="alignment10"> + <property name="visible">True</property> + <property name="left_padding">15</property> <child> - <widget class="GtkHBox" id="virt-method-fv-unsupported"> + <widget class="GtkTable" id="table2"> <property name="visible">True</property> + <property name="n_rows">3</property> + <property name="n_columns">2</property> + <property name="column_spacing">6</property> + <property name="row_spacing">4</property> <child> - <widget class="GtkAlignment" id="alignment128"> + <widget class="GtkLabel" id="label24"> <property name="visible">True</property> - <property name="yalign">0.10000000149011612</property> - <property name="yscale">0.10000000149011612</property> - <property name="left_padding">5</property> + <property name="xalign">1</property> + <property name="label" translatable="yes">URL:</property> + </widget> + <packing> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label25"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="label" translatable="yes">Kickstart URL:</property> + </widget> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label26"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="label" translatable="yes">Kernel Options:</property> + </widget> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkEntry" id="install-urlopts-entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkComboBoxEntry" id="install-ks-box"> + <property name="visible">True</property> + <child internal-child="entry"> + <widget class="GtkEntry" id="install-ks-entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </widget> + </child> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkComboBoxEntry" id="install-url-box"> + <property name="visible">True</property> + <signal name="changed" handler="on_install_url_box_changed"/> + <child internal-child="entry"> + <widget class="GtkEntry" id="install-url-entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <signal name="activate" handler="on_install_url_entry_activate"/> + </widget> + </child> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label19"> + <property name="visible">True</property> + <property name="label" translatable="yes">URL</property> + </widget> + <packing> + <property name="type">tab</property> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox5"> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label9"> + <property name="label">No input needed for pxe. +User shouldn't see this.</property> + </widget> + </child> + </widget> + <packing> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label20"> + <property name="visible">True</property> + <property name="label" translatable="yes">PXE</property> + </widget> + <packing> + <property name="type">tab</property> + <property name="position">2</property> + <property name="tab_fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <widget class="GtkVBox" id="vbox8"> + <property name="visible">True</property> + <property name="spacing">6</property> + <child> + <widget class="GtkVBox" id="install-detect-os-box"> + <property name="visible">True</property> + <signal name="hide" handler="on_install_detect_os_box_hide"/> + <signal name="show" handler="on_install_detect_os_box_show"/> + <child> + <widget class="GtkCheckButton" id="install-detect-os"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Automatically detect operating system based on install media</property> + <property name="response_id">0</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_install_detect_os_toggled"/> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="install-nodetect-label"> + <property name="xalign">0</property> + <property name="label" translatable="yes">Choose an operating systen type and version</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkAlignment" id="alignment9"> + <property name="visible">True</property> + <property name="left_padding">15</property> + <child> + <widget class="GtkTable" id="table1"> + <property name="visible">True</property> + <property name="n_rows">2</property> + <property name="n_columns">3</property> + <property name="column_spacing">6</property> + <property name="row_spacing">4</property> + <child> + <widget class="GtkLabel" id="install-os-version-label"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label">-</property> + </widget> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="install-os-type-label"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label">-</property> + </widget> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkComboBox" id="install-os-version"> + <property name="visible">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkComboBox" id="install-os-type"> + <property name="visible">True</property> + <signal name="changed" handler="on_install_os_type_changed"/> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label17"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="label" translatable="yes">Version:</property> + </widget> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label16"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="label" translatable="yes">OS Type:</property> + </widget> + <packing> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="position">2</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="label" translatable="yes">Install</property> + </widget> + <packing> + <property name="type">tab</property> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <widget class="GtkVBox" id="vbox11"> + <property name="visible">True</property> + <property name="spacing">40</property> + <child> + <widget class="GtkVBox" id="vbox12"> + <property name="visible">True</property> + <property name="extension_events">GDK_EXTENSION_EVENTS_CURSOR</property> + <property name="spacing">6</property> + <child> + <widget class="GtkLabel" id="label15"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Choose Memory and CPU settings</property> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkAlignment" id="alignment11"> + <property name="visible">True</property> + <property name="left_padding">15</property> + <child> + <widget class="GtkHBox" id="hbox11"> + <property name="visible">True</property> + <property name="spacing">6</property> + <child> + <widget class="GtkTable" id="table3"> + <property name="visible">True</property> + <property name="n_rows">4</property> + <property name="n_columns">3</property> + <property name="column_spacing">6</property> + <property name="row_spacing">4</property> + <child> + <widget class="GtkLabel" id="label27"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="label" translatable="yes">CPUs:</property> + </widget> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label22"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="label" translatable="yes">Memory (RAM):</property> + </widget> + <packing> + <property name="x_options">GTK_FILL</property> + </packing> + </child> + <child> + <widget class="GtkSpinButton" id="config-mem"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="xalign">1</property> + <property name="adjustment">0 0 8096 1 10 10</property> + <property name="climb_rate">1</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <widget class="GtkSpinButton" id="config-cpus"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="xalign">1</property> + <property name="adjustment">0 0 128 1 10 10</property> + <property name="climb_rate">1</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="phys-cpu-label"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label">Insert Phys cpu count</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">3</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label1"> + <property name="visible">True</property> + </widget> + <packing> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label3"> + <property name="visible">True</property> + </widget> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label13"> + <property name="visible">True</property> + </widget> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label29"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">MB</property> + </widget> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox12"> + <property name="visible">True</property> + <property name="spacing">6</property> <child> - <widget class="GtkImage" id="image96"> + <widget class="GtkLabel" id="phys-mem-label"> <property name="visible">True</property> - <property name="stock">gtk-dialog-info</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">(Insert host mem)</property> </widget> </child> </widget> <packing> + <property name="left_attach">1</property> + <property name="right_attach">3</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> + </widget> + </child> + </widget> + </child> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + </widget> + <packing> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="label" translatable="yes">Memory</property> + </widget> + <packing> + <property name="type">tab</property> + <property name="position">2</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <widget class="GtkVBox" id="config-storage-area"> + <property name="visible">True</property> + <property name="spacing">6</property> + <child> + <widget class="GtkCheckButton" id="enable-storage"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Enable storage for this virtual machine</property> + <property name="response_id">0</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_enable_storage_toggled"/> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkAlignment" id="alignment3"> + <property name="visible">True</property> + <property name="left_padding">15</property> + <child> + <widget class="GtkVBox" id="config-storage-box"> + <property name="visible">True</property> + <property name="spacing">4</property> + <child> + <widget class="GtkHBox" id="hbox6"> + <property name="visible">True</property> + <property name="spacing">6</property> + <child> + <widget class="GtkRadioButton" id="config-storage-create"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="response_id">0</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <child> + <widget class="GtkLabel" id="label123"> + <property name="visible">True</property> + <property name="label" translatable="yes">Create a disk image on the computer's hard drive</property> + <property name="use_markup">True</property> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + </widget> + </child> + <child> + <widget class="GtkAlignment" id="alignment3"> + <property name="visible">True</property> + <property name="bottom_padding">6</property> + <property name="left_padding">22</property> + <child> + <widget class="GtkVBox" id="vbox18"> + <property name="visible">True</property> + <property name="spacing">4</property> + <child> + <widget class="GtkHBox" id="hbox7"> + <property name="visible">True</property> + <property name="spacing">6</property> + <child> + <widget class="GtkSpinButton" id="config-storage-size"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="xalign">1</property> + <property name="adjustment">2 0 1000000 0.10000000000000001 10 10</property> + <property name="climb_rate">1</property> + <property name="digits">1</property> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label31"> + <property name="visible">True</property> + <property name="label" translatable="yes">GB</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + </child> + <child> + <widget class="GtkLabel" id="phys-hd-label"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label"><span color='#484848'>Free Space</span></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox14"> + <property name="visible">True</property> + <property name="spacing">6</property> + <child> + <widget class="GtkCheckButton" id="config-storage-sparse"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Allocate entire disk now</property> + <property name="response_id">0</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkImage" id="config-storage-sparse-info"> + <property name="visible">True</property> + <property name="stock">gtk-info</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="position">2</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox9"> + <property name="visible">True</property> + <child> + <widget class="GtkRadioButton" id="config-storage-select"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="response_id">0</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <property name="group">config-storage-create</property> + <signal name="toggled" handler="on_config_storage_select_toggled"/> + <child> + <widget class="GtkLabel" id="label124"> + <property name="visible">True</property> + <property name="label" translatable="yes">Select managed or other existing storage</property> + <property name="use_markup">True</property> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + </widget> + <packing> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="config-storage-browse-box"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="spacing">6</property> + <child> + <widget class="GtkButton" id="config-storage-browse"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="label" translatable="yes">Browse...</property> + <property name="response_id">0</property> + <signal name="clicked" handler="on_config_storage_browse_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkEntry" id="config-storage-entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="position">3</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="position">3</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label32"> + <property name="visible">True</property> + <property name="label" translatable="yes">Storage</property> + </widget> + <packing> + <property name="type">tab</property> + <property name="position">3</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <widget class="GtkVBox" id="vbox15"> + <property name="visible">True</property> + <property name="spacing">30</property> + <child> + <widget class="GtkVBox" id="vbox16"> + <property name="visible">True</property> + <property name="spacing">6</property> + <child> + <widget class="GtkLabel" id="summary-title"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label">Ready to begin installation of <b>foobar</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkAlignment" id="alignment4"> + <property name="visible">True</property> + <property name="left_padding">15</property> + <child> + <widget class="GtkTable" id="table4"> + <property name="visible">True</property> + <property name="n_rows">5</property> + <property name="n_columns">2</property> + <property name="column_spacing">6</property> + <property name="row_spacing">6</property> + <child> + <widget class="GtkLabel" id="label33"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="label" translatable="yes"><span color='#484848'>OS:</span></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label34"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="label" translatable="yes"><span color='#484848'>Install:</span></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label35"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="label" translatable="yes"><span color='#484848'>Memory:</span></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label36"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="label" translatable="yes"><span color='#484848'>CPUs:</span></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label37"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="label" translatable="yes"><span color='#484848'>Storage:</span></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="summary-os"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label">label</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="summary-install"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label">label</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="summary-mem"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label">label</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="summary-cpu"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label">label</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="summary-storage"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label">label</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkExpander" id="config-advanced-expander"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="spacing">6</property> + <child> + <widget class="GtkAlignment" id="alignment5"> + <property name="visible">True</property> + <property name="left_padding">20</property> + <child> + <widget class="GtkVBox" id="vbox14"> + <property name="visible">True</property> + <property name="spacing">6</property> + <child> + <widget class="GtkVBox" id="vbox17"> + <property name="visible">True</property> + <property name="spacing">6</property> + <child> + <widget class="GtkHBox" id="hbox8"> + <property name="visible">True</property> + <child> + <widget class="GtkComboBox" id="config-netdev"> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> <property name="expand">False</property> <property name="fill">False</property> </packing> </child> <child> - <widget class="GtkAlignment" id="alignment129"> + <widget class="GtkCheckButton" id="config-set-macaddr"> <property name="visible">True</property> - <property name="left_padding">3</property> - <child> - <widget class="GtkLabel" id="label343"> - <property name="visible">True</property> - <property name="label" translatable="yes"><small><b>Note:</b> The host CPU(s) in this machine do not have support for full virtualization.</small></property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - </child> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Set a fixed mac address</property> + <property name="response_id">0</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_config_set_macaddr_toggled"/> </widget> <packing> <property name="expand">False</property> @@ -647,118 +1415,168 @@ <property name="position">1</property> </packing> </child> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">2</property> - </packing> - </child> - <child> - <widget class="GtkHBox" id="virt-method-fv-disabled"> - <property name="visible">True</property> <child> - <widget class="GtkAlignment" id="alignment130"> + <widget class="GtkHBox" id="hbox13"> <property name="visible">True</property> - <property name="yalign">0.10000000149011612</property> - <property name="yscale">0.10000000149011612</property> - <property name="left_padding">5</property> <child> - <widget class="GtkImage" id="image97"> + <widget class="GtkEntry" id="config-macaddr"> <property name="visible">True</property> - <property name="stock">gtk-dialog-warning</property> + <property name="can_focus">True</property> </widget> </child> + <child> + <placeholder/> + </child> </widget> <packing> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment131"> - <property name="visible">True</property> - <property name="left_padding">3</property> - <child> - <widget class="GtkLabel" id="label344"> - <property name="visible">True</property> - <property name="label" translatable="yes"><small><b>Note:</b> The host CPU(s) in this machine support full virtualization, but it is not enabled by the BIOS.</small></property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> + <property name="position">2</property> </packing> </child> </widget> <packing> - <property name="position">3</property> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkTable" id="table6"> + <property name="visible">True</property> + <property name="n_rows">2</property> + <property name="n_columns">3</property> + <property name="column_spacing">6</property> + <property name="row_spacing">6</property> + <child> + <widget class="GtkImage" id="config-hv-info"> + <property name="visible">True</property> + <property name="stock">gtk-info</property> + </widget> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label38"> + <property name="visible">True</property> + </widget> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options"></property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkComboBox" id="config-arch"> + <property name="visible">True</property> + <signal name="changed" handler="on_config_arch_changed"/> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkComboBox" id="config-hv"> + <property name="visible">True</property> + <signal name="changed" handler="on_config_hv_changed"/> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label30"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="label" translatable="yes">Architecture:</property> + </widget> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label28"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="label" translatable="yes">Virt Type:</property> + </widget> + <packing> + <property name="x_options">GTK_FILL</property> + </packing> + </child> + </widget> + <packing> + <property name="position">1</property> </packing> </child> </widget> </child> </widget> + </child> + <child> + <widget class="GtkLabel" id="label8"> + <property name="visible">True</property> + <property name="label" translatable="yes">Advanced options</property> + </widget> <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">3</property> + <property name="type">label_item</property> </packing> </child> </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> </child> </widget> <packing> - <property name="expand">False</property> - <property name="position">1</property> + <property name="position">4</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label7"> + <property name="visible">True</property> + <property name="label" translatable="yes">Finish</property> + </widget> + <packing> + <property name="type">tab</property> + <property name="position">4</property> + <property name="tab_fill">False</property> </packing> </child> </widget> - <packing> - <property name="position">1</property> - </packing> </child> </widget> - <packing> - <property name="position">2</property> - </packing> </child> <child> - <widget class="GtkLabel" id="label143"> + <widget class="GtkHBox" id="hbox51"> <property name="visible">True</property> - <property name="label" translatable="yes">Method</property> - </widget> - <packing> - <property name="type">tab</property> - <property name="position">2</property> - <property name="tab_fill">False</property> - </packing> - </child> - <child> - <widget class="GtkVBox" id="vbox55"> - <property name="visible">True</property> - <property name="border_width">1</property> <child> - <widget class="GtkAlignment" id="alignment148"> + <widget class="GtkAlignment" id="alignment135"> <property name="visible">True</property> + <property name="xalign">0</property> <child> - <widget class="GtkEventBox" id="page3-title"> + <widget class="GtkButton" id="create-help"> <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label395"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xpad">5</property> - <property name="ypad">6</property> - <property name="label" translatable="yes"><span weight="heavy" size="xx-large" foreground="#FFF">Installation Method</span></property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_FILL</property> - </widget> - </child> + <property name="can_focus">True</property> + <property name="label">gtk-help</property> + <property name="use_stock">True</property> + <property name="response_id">0</property> + <signal name="clicked" handler="on_create_help_clicked"/> </widget> </child> </widget> @@ -767,1603 +1585,87 @@ </packing> </child> <child> - <widget class="GtkVBox" id="vbox56"> + <widget class="GtkAlignment" id="alignment134"> <property name="visible">True</property> + <property name="xalign">1</property> <child> - <widget class="GtkLabel" id="label396"> + <widget class="GtkHBox" id="hbox25"> <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">20</property> - <property name="ypad">10</property> - <property name="label" translatable="yes">Please indicate where installation media is available for the operating system you would like to install on this virtual machine:</property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment153"> - <property name="visible">True</property> - <property name="border_width">6</property> - <property name="left_padding">30</property> + <property name="spacing">10</property> <child> - <widget class="GtkVBox" id="vbox57"> + <widget class="GtkButton" id="create-cancel"> <property name="visible">True</property> - <property name="spacing">6</property> + <property name="can_focus">True</property> + <property name="label">gtk-cancel</property> + <property name="use_stock">True</property> + <property name="response_id">0</property> + <signal name="clicked" handler="on_create_cancel_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="create-back"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="label">gtk-go-back</property> + <property name="use_stock">True</property> + <property name="response_id">0</property> + <signal name="clicked" handler="on_create_back_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="create-forward"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-go-forward</property> + <property name="use_stock">True</property> + <property name="response_id">0</property> + <signal name="clicked" handler="on_create_forward_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="create-finish"> + <property name="can_focus">True</property> + <property name="response_id">0</property> + <signal name="clicked" handler="on_create_finish_clicked"/> <child> - <widget class="GtkRadioButton" id="method-local"> + <widget class="GtkAlignment" id="alignment119"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">_Local install media (ISO image or CDROM)</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_media_toggled"/> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child> - <widget class="GtkRadioButton" id="method-tree"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Network install t_ree (HTTP, FTP, or NFS)</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="draw_indicator">True</property> - <property name="group">method-local</property> - <signal name="toggled" handler="on_media_toggled"/> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <widget class="GtkRadioButton" id="method-pxe"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">_Network boot (PXE)</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="draw_indicator">True</property> - <property name="group">method-local</property> - <signal name="toggled" handler="on_media_toggled"/> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">2</property> - </packing> - </child> - </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment132"> - <property name="visible">True</property> - <property name="top_padding">15</property> - <property name="bottom_padding">15</property> - <property name="left_padding">15</property> - <property name="right_padding">5</property> - <child> - <widget class="GtkTable" id="table30"> - <property name="visible">True</property> - <property name="n_rows">3</property> - <property name="n_columns">3</property> - <property name="row_spacing">10</property> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <widget class="GtkLabel" id="label353"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label"> </property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label351"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="yalign">1</property> - <property name="label" translatable="yes">OS _Type:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">os-type</property> - </widget> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkComboBox" id="os-variant"> - <property name="visible">True</property> - <signal name="changed" handler="on_os_variant_changed"/> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkComboBox" id="os-type"> - <property name="visible">True</property> - <signal name="changed" handler="on_os_type_changed"/> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label352"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">OS _Variant:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">os-variant</property> - </widget> - <packing> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options"></property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label350"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Please choose the operating system you will be installing on the virtual machine:</property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="right_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - </child> - </widget> - <packing> - <property name="position">2</property> - </packing> - </child> - </widget> - <packing> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="position">3</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label394"> - <property name="visible">True</property> - <property name="label" translatable="no">Install</property> - </widget> - <packing> - <property name="type">tab</property> - <property name="position">3</property> - <property name="tab_fill">False</property> - </packing> - </child> - <child> - <widget class="GtkVBox" id="vbox28"> - <property name="visible">True</property> - <property name="border_width">1</property> - <child> - <widget class="GtkAlignment" id="alignment53"> - <property name="visible">True</property> - <child> - <widget class="GtkEventBox" id="page4-title"> - <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label185"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xpad">5</property> - <property name="ypad">6</property> - <property name="label" translatable="yes"><span weight="heavy" size="xx-large" foreground="#FFF">Installation Media</span></property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_FILL</property> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkVBox" id="vbox29"> - <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label186"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">20</property> - <property name="ypad">10</property> - <property name="label" translatable="yes">Please indicate where installation media is available for the operating system you would like to install on this virtual machine:</property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment54"> - <property name="visible">True</property> - <property name="left_padding">25</property> - <child> - <widget class="GtkTable" id="table15"> - <property name="visible">True</property> - <property name="n_rows">6</property> - <property name="n_columns">3</property> - <property name="row_spacing">2</property> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <widget class="GtkHBox" id="hbox44"> - <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label304"> - <property name="visible">True</property> - <property name="xpad">5</property> - <property name="label" translatable="yes">_Path to install media:</property> - <property name="use_underline">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child> - <widget class="GtkComboBox" id="cd-path"> - <property name="visible">True</property> - <accessibility> - <atkproperty name="AtkObject::accessible_name" translatable="yes">Media Path Select</atkproperty> - </accessibility> - <signal name="changed" handler="on_cd_path_changed"/> - </widget> - <packing> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">3</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label299"> - <property name="visible">True</property> - <property name="xalign">0</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label189"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">ISO _location:</property> - <property name="use_underline">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - <property name="x_padding">3</property> - </packing> - </child> - <child> - <widget class="GtkHBox" id="fv-iso-location-box"> - <property name="visible">True</property> - <child> - <widget class="GtkEntry" id="fv-iso-location"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <accessibility> - <atkproperty name="AtkObject::accessible_name" translatable="yes">ISO Location Field</atkproperty> - </accessibility> - </widget> - </child> - <child> - <widget class="GtkButton" id="fv-iso-location-browse"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">_Browse...</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <signal name="clicked" handler="on_fv_iso_location_browse_clicked"/> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment57"> - <property name="visible">True</property> - <property name="yalign">0</property> + <property name="xscale">0</property> <property name="yscale">0</property> <child> - <widget class="GtkRadioButton" id="media-physical"> + <widget class="GtkHBox" id="hbox45"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">_CD-ROM or DVD:</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="draw_indicator">True</property> - <property name="group">media-iso-image</property> - <signal name="toggled" handler="on_media_toggled"/> - </widget> - </child> - </widget> - <packing> - <property name="right_attach">3</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment55"> - <property name="visible">True</property> - <property name="yalign">0</property> - <property name="yscale">0</property> - <child> - <widget class="GtkRadioButton" id="media-iso-image"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">_ISO image location:</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="active">True</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_media_toggled"/> - </widget> - </child> - </widget> - <packing> - <property name="right_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment56"> - <property name="visible">True</property> - <property name="yalign">0</property> - <property name="yscale">0</property> - <child> - <placeholder/> - </child> - </widget> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="position">4</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label144"> - <property name="visible">True</property> - <property name="label" translatable="no">Media</property> - </widget> - <packing> - <property name="type">tab</property> - <property name="position">4</property> - <property name="tab_fill">False</property> - </packing> - </child> - <child> - <widget class="GtkVBox" id="vbox32"> - <property name="visible">True</property> - <property name="border_width">1</property> - <child> - <widget class="GtkAlignment" id="alignment69"> - <property name="visible">True</property> - <child> - <widget class="GtkEventBox" id="page5-title"> - <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label203"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xpad">5</property> - <property name="ypad">6</property> - <property name="label" translatable="yes"><span weight="heavy" size="xx-large" foreground="#FFF">Installation Source</span></property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_FILL</property> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkVBox" id="vbox33"> - <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label205"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">20</property> - <property name="ypad">10</property> - <property name="label" translatable="yes">Please indicate where installation media is available for the operating system you would like to install on this virtual machine. Optionally you can provide the URL for a kickstart file:</property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment71"> - <property name="visible">True</property> - <property name="left_padding">25</property> - <property name="right_padding">15</property> - <child> - <widget class="GtkTable" id="table21"> - <property name="visible">True</property> - <property name="n_rows">8</property> - <property name="n_columns">3</property> - <property name="row_spacing">2</property> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <widget class="GtkHBox" id="hbox65"> - <property name="visible">True</property> - <child> - <widget class="GtkImage" id="image105"> - <property name="visible">True</property> - <property name="icon_name">gtk-info</property> - </widget> - <packing> - <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label389"> - <property name="visible">True</property> - <property name="xpad">7</property> - <property name="label" translatable="yes"><small><b>Example:</b> updates=http://hostname.example.com/updates.img</small></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">7</property> - <property name="bottom_attach">8</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkEntry" id="kernel-params"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <accessibility> - <atkproperty name="AtkObject::accessible_name">kernel-params</atkproperty> - </accessibility> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label388"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">4</property> - <property name="label" translatable="yes">_Kernel parameters:</property> - <property name="use_markup">True</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">pv-media-url</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment116"> - <property name="visible">True</property> - <property name="xalign">0</property> - <child> - <widget class="GtkComboBoxEntry" id="pv-ks-url"> - <property name="visible">True</property> - <accessibility> - <atkproperty name="AtkObject::accessible_name" translatable="yes">Kickstart Field</atkproperty> - </accessibility> - <child internal-child="entry"> - <widget class="GtkEntry" id="comboboxentry-entry2"> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment115"> - <property name="visible">True</property> - <property name="xalign">0</property> - <child> - <widget class="GtkComboBoxEntry" id="pv-media-url"> - <property name="visible">True</property> - <accessibility> - <atkproperty name="AtkObject::accessible_name" translatable="yes">Install URL Field</atkproperty> - </accessibility> - <child internal-child="entry"> - <widget class="GtkEntry" id="comboboxentry-entry1"> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment74"> - <property name="visible">True</property> - <property name="yalign">0</property> - <property name="yscale">0</property> - <child> - <placeholder/> - </child> - </widget> - <packing> - <property name="right_attach">3</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkHBox" id="hbox32"> - <property name="visible">True</property> - <child> - <widget class="GtkImage" id="image83"> - <property name="visible">True</property> - <property name="icon_name">gtk-info</property> - </widget> - <packing> - <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label215"> - <property name="visible">True</property> - <property name="xpad">7</property> - <property name="label" translatable="yes"><small><b>Example:</b> ftp://hostname.example.com/ks/ks.cfg</small></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label214"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="xpad">4</property> - <property name="label" translatable="yes">Kickstart U_RL:</property> - <property name="use_markup">True</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">pv-ks-url</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkHBox" id="hbox31"> - <property name="visible">True</property> - <child> - <widget class="GtkImage" id="image82"> - <property name="visible">True</property> - <property name="icon_name">gtk-info</property> - </widget> - <packing> - <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label213"> - <property name="visible">True</property> - <property name="xpad">7</property> - <property name="label" translatable="yes"><small><b>Example:</b> http://servername.example.com/distro/i386/tree</small></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label212"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="xpad">4</property> - <property name="label" translatable="yes">Installation media _URL:</property> - <property name="use_markup">True</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">pv-media-url</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment73"> - <property name="visible">True</property> - <property name="yalign">0</property> - <property name="yscale">0</property> - <child> - <placeholder/> - </child> - </widget> - <packing> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="position">5</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="step3a"> - <property name="visible">True</property> - <property name="label" translatable="no">Netinst</property> - </widget> - <packing> - <property name="type">tab</property> - <property name="position">5</property> - <property name="tab_fill">False</property> - </packing> - </child> - <child> - <widget class="GtkVBox" id="vbox34"> - <property name="visible">True</property> - <property name="border_width">1</property> - <child> - <widget class="GtkEventBox" id="page6-title"> - <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label216"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xpad">5</property> - <property name="ypad">6</property> - <property name="label" translatable="yes"><span weight="heavy" size="xx-large" foreground="#FFF">Storage</span></property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_FILL</property> - </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkVBox" id="vbox35"> - <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label217"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">20</property> - <property name="ypad">10</property> - <property name="label" translatable="yes">Please indicate how you'd like to assign space from the host for your new virtual machine. This space will be used to install the virtual machine's operating system.</property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment77"> - <property name="visible">True</property> - <property name="left_padding">25</property> - <property name="right_padding">15</property> - <child> - <widget class="GtkTable" id="table23"> - <property name="visible">True</property> - <property name="n_rows">9</property> - <property name="n_columns">5</property> - <property name="row_spacing">2</property> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <widget class="GtkCheckButton" id="non-sparse"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Allocate entire virtual disk now</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="active">True</property> - <property name="draw_indicator">True</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">7</property> - <property name="bottom_attach">8</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkHBox" id="hbox49"> - <property name="visible">True</property> - <child> - <widget class="GtkImage" id="image98"> - <property name="visible">True</property> - <property name="yalign">0</property> - <property name="icon_name">gtk-dialog-warning</property> - </widget> - <packing> - <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label349"> - <property name="visible">True</property> - <property name="xpad">7</property> - <property name="label" translatable="yes"><small><b>Warning:</b> If you do not allocate the entire disk now, space will be allocated as needed while the virtual machine is running. If sufficient free space is not available on the host, this may result in data corruption on the virtual machine.</small></property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">5</property> - <property name="top_attach">8</property> - <property name="bottom_attach">9</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkHBox" id="hbox41"> - <property name="visible">True</property> - <child> - <widget class="GtkAlignment" id="alignment117"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xscale">0</property> + <property name="spacing">2</property> <child> - <widget class="GtkSpinButton" id="storage-file-size"> + <widget class="GtkImage" id="image95"> <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="can_focus">True</property> - <property name="adjustment">500 0 4000000 100 500 0</property> - <property name="climb_rate">1</property> - <property name="snap_to_ticks">True</property> - <property name="numeric">True</property> - <accessibility> - <atkproperty name="AtkObject::accessible_name" translatable="yes">File Size Select</atkproperty> - </accessibility> - <signal name="changed" handler="on_storage_file_size_changed"/> - </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label301"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">3</property> - <property name="label" translatable="yes">MB</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <placeholder/> - </child> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label300"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="xpad">4</property> - <property name="label" translatable="yes">_Size:</property> - <property name="use_markup">True</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">storage-file-size</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkHBox" id="storage-file-box"> - <property name="visible">True</property> - <child> - <widget class="GtkEntry" id="storage-file-address"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <accessibility> - <atkproperty name="AtkObject::accessible_name" translatable="yes">File Location Field</atkproperty> - </accessibility> - <signal name="changed" handler="on_storage_file_address_changed"/> - </widget> - </child> - <child> - <widget class="GtkButton" id="storage-file-address-browse"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Browse...</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <signal name="clicked" handler="on_storage_file_address_browse_clicked"/> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">5</property> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkHBox" id="storage-partition-box"> - <property name="visible">True</property> - <child> - <widget class="GtkEntry" id="storage-partition-address"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <accessibility> - <atkproperty name="AtkObject::accessible_name" translatable="yes">Partition Field</atkproperty> - </accessibility> - </widget> - </child> - <child> - <widget class="GtkButton" id="storage-partition-address-browse"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Browse...</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <signal name="clicked" handler="on_storage_partition_address_browse_clicked"/> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">5</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment80"> - <property name="visible">True</property> - <property name="yalign">0</property> - <property name="yscale">0</property> - <child> - <widget class="GtkRadioButton" id="storage-file-backed"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">F_ile (disk image):</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="draw_indicator">True</property> - <property name="group">storage-partition</property> - <signal name="toggled" handler="on_storage_toggled"/> - </widget> - </child> - </widget> - <packing> - <property name="right_attach">5</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment78"> - <property name="visible">True</property> - <property name="yalign">0</property> - <property name="yscale">0</property> - <child> - <widget class="GtkRadioButton" id="storage-partition"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">_Block device (partition):</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="active">True</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_storage_toggled"/> - </widget> - </child> - </widget> - <packing> - <property name="right_attach">5</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label282"> - <property name="visible">True</property> - <property name="xalign">0</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label222"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="xpad">4</property> - <property name="label" translatable="yes">_Location:</property> - <property name="use_markup">True</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">storage-file-address</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkHBox" id="hbox33"> - <property name="visible">True</property> - <child> - <widget class="GtkImage" id="image84"> - <property name="visible">True</property> - <property name="icon_name">gtk-info</property> - </widget> - <packing> - <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label221"> - <property name="visible">True</property> - <property name="xpad">7</property> - <property name="label" translatable="yes"><small><b>Example:</b> /dev/hdc2</small></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label219"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="xpad">4</property> - <property name="label" translatable="yes">Loc_ation:</property> - <property name="use_markup">True</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">storage-partition-address</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment79"> - <property name="visible">True</property> - <property name="yalign">0</property> - <property name="yscale">0</property> - <child> - <placeholder/> - </child> - </widget> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment81"> - <property name="visible">True</property> - <property name="top_padding">7</property> - <property name="bottom_padding">10</property> - <property name="left_padding">20</property> - <child> - <widget class="GtkHBox" id="hbox34"> - <property name="visible">True</property> - <child> - <widget class="GtkImage" id="image85"> - <property name="visible">True</property> - <property name="yalign">0</property> - <property name="icon_name">gtk-info</property> - </widget> - <packing> - <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label223"> - <property name="visible">True</property> - <property name="xpad">7</property> - <property name="label" translatable="yes"><small><b>Tip:</b> You may add additional storage, including network-mounted storage, to your virtual machine after it has been created using the same tools you would on a physical system.</small></property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - <property name="position">2</property> - </packing> - </child> - </widget> - <packing> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="position">6</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label146"> - <property name="visible">True</property> - <property name="label" translatable="yes">Storage</property> - </widget> - <packing> - <property name="type">tab</property> - <property name="position">6</property> - <property name="tab_fill">False</property> - </packing> - </child> - <child> - <widget class="GtkVBox" id="vbox52"> - <property name="visible">True</property> - <property name="border_width">1</property> - <child> - <widget class="GtkEventBox" id="page7-title"> - <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label384"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xpad">5</property> - <property name="ypad">6</property> - <property name="label" translatable="yes"><span weight="heavy" size="xx-large" foreground="#FFF">Network</span></property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_FILL</property> - </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkVBox" id="vbox53"> - <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label365"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">20</property> - <property name="ypad">10</property> - <property name="label" translatable="yes">Please indicate how you'd like to connect your new virtual machine to the host network.</property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment141"> - <property name="visible">True</property> - <property name="left_padding">25</property> - <property name="right_padding">15</property> - <child> - <widget class="GtkTable" id="table31"> - <property name="visible">True</property> - <property name="n_rows">8</property> - <property name="n_columns">2</property> - <property name="row_spacing">6</property> - <child> - <widget class="GtkEntry" id="create-mac-address"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="max_length">17</property> - <accessibility> - <atkproperty name="AtkObject::accessible_name" translatable="yes">MAC Field</atkproperty> - </accessibility> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">7</property> - <property name="bottom_attach">8</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkCheckButton" id="mac-address"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Set fixed MAC _address for your virtual machine?</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="draw_indicator">True</property> - <signal name="clicked" handler="on_mac_address_clicked"/> - </widget> - <packing> - <property name="right_attach">2</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label385"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">_MAC address:</property> - <property name="use_markup">True</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">create-mac-address</property> - </widget> - <packing> - <property name="top_attach">7</property> - <property name="bottom_attach">8</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment147"> - <property name="visible">True</property> - <property name="left_padding">40</property> - <child> - <widget class="GtkEventBox" id="eventbox2"> - <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label368"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="xpad">4</property> - <property name="label" translatable="yes">_Device:</property> - <property name="use_markup">True</property> - <property name="use_underline">True</property> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment146"> - <property name="visible">True</property> - <property name="left_padding">40</property> - <child> - <widget class="GtkEventBox" id="eventbox1"> - <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label366"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="xpad">4</property> - <property name="label" translatable="yes">_Network:</property> - <property name="use_markup">True</property> - <property name="use_underline">True</property> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkComboBox" id="net-network"> - <property name="visible">True</property> - <accessibility> - <atkproperty name="AtkObject::accessible_name" translatable="yes">Network Select</atkproperty> - </accessibility> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment145"> - <property name="visible">True</property> - <property name="left_padding">40</property> - <child> - <widget class="GtkHBox" id="hbox61"> - <property name="visible">True</property> - <child> - <widget class="GtkImage" id="image102"> - <property name="visible">True</property> - <property name="yalign">0</property> - <property name="icon_name">gtk-dialog-info</property> + <property name="stock">gtk-quit</property> </widget> <packing> <property name="expand">False</property> + <property name="fill">False</property> </packing> </child> <child> - <widget class="GtkLabel" id="label372"> + <widget class="GtkLabel" id="label305"> <property name="visible">True</property> - <property name="xpad">7</property> - <property name="label" translatable="yes"><small><b>Tip:</b> Choose this option if your host is statically connected to wired ethernet, to gain the ability to migrate the virtual system. (To share a physical device, configure it as a bridge.)</small></property> - <property name="use_markup">True</property> - <property name="wrap">True</property> + <property name="label" translatable="yes">_Finish</property> + <property name="use_underline">True</property> </widget> <packing> <property name="expand">False</property> @@ -2374,1415 +1676,33 @@ </widget> </child> </widget> - <packing> - <property name="right_attach">2</property> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment144"> - <property name="visible">True</property> - <property name="left_padding">40</property> - <child> - <widget class="GtkHBox" id="hbox63"> - <property name="visible">True</property> - <child> - <widget class="GtkImage" id="image104"> - <property name="visible">True</property> - <property name="yalign">0</property> - <property name="icon_name">gtk-dialog-info</property> - </widget> - <packing> - <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label374"> - <property name="visible">True</property> - <property name="xpad">7</property> - <property name="label" translatable="yes"><small><b>Tip:</b> Choose this option if your host is disconnected, connected via wireless, or dynamically configured with NetworkManager.</small></property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </widget> - </child> - </widget> - <packing> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkRadioButton" id="net-type-device"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">_Shared physical device</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="draw_indicator">True</property> - <property name="group">net-type-network</property> - <signal name="toggled" handler="on_network_toggled"/> - </widget> - <packing> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkRadioButton" id="net-type-network"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">_Virtual network</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="active">True</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_network_toggled"/> - </widget> - <packing> - <property name="right_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkComboBox" id="net-device"> - <property name="visible">True</property> - <accessibility> - <atkproperty name="AtkObject::accessible_name" translatable="yes">Network Device Select</atkproperty> - </accessibility> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> - </packing> </child> </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="position">7</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label355"> - <property name="visible">True</property> - <property name="label" translatable="yes">Network</property> - </widget> - <packing> - <property name="type">tab</property> - <property name="position">7</property> - <property name="tab_fill">False</property> - </packing> - </child> - <child> - <widget class="GtkVBox" id="vbox45"> - <property name="visible">True</property> - <property name="border_width">1</property> - <child> - <widget class="GtkAlignment" id="alignment101"> - <property name="visible">True</property> - <child> - <widget class="GtkEventBox" id="page8-title"> - <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label260"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xpad">5</property> - <property name="ypad">6</property> - <property name="label" translatable="yes"><span weight="heavy" size="xx-large" foreground="#FFF">Memory and CPU Allocation</span></property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_FILL</property> - </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">3</property> + </packing> </child> </widget> </child> </widget> <packing> <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkTable" id="table28"> - <property name="visible">True</property> - <property name="border_width">6</property> - <property name="n_rows">12</property> - <property name="n_columns">3</property> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <widget class="GtkLabel" id="config-max-vcpus"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">4</property> - <property name="label" translatable="no">32</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">9</property> - <property name="bottom_attach">10</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label400"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="xpad">3</property> - <property name="ypad">2</property> - <property name="label" translatable="yes">Maximum virtual CPUs:</property> - <property name="justify">GTK_JUSTIFY_RIGHT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">9</property> - <property name="bottom_attach">10</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label339"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">_Virtual CPUs:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">create-vcpus</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">10</property> - <property name="bottom_attach">11</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - <property name="x_padding">3</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment126"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xscale">0</property> - <property name="left_padding">3</property> - <child> - <widget class="GtkSpinButton" id="create-vcpus"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="adjustment">1 1 32 1 2 0</property> - <property name="climb_rate">1</property> - <property name="snap_to_ticks">True</property> - <property name="numeric">True</property> - <property name="update_policy">GTK_UPDATE_IF_VALID</property> - <accessibility> - <atkproperty name="AtkObject::accessible_name" translatable="yes">Virtual CPU Select</atkproperty> - </accessibility> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">10</property> - <property name="bottom_attach">11</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkHBox" id="hbox37"> - <property name="visible">True</property> - <child> - <widget class="GtkAlignment" id="alignment106"> - <property name="visible">True</property> - <property name="yalign">0.10000000149011612</property> - <property name="yscale">0.10000000149011612</property> - <property name="left_padding">5</property> - <child> - <widget class="GtkImage" id="image88"> - <property name="visible">True</property> - <property name="stock">gtk-info</property> - </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment107"> - <property name="visible">True</property> - <property name="left_padding">3</property> - <child> - <widget class="GtkLabel" id="label280"> - <property name="visible">True</property> - <property name="label" translatable="yes"><small><b>Tip:</b> For best performance, the number of virtual CPUs should be less than (or equal to) the number of physical CPUs on the host system.</small></property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">3</property> - <property name="top_attach">11</property> - <property name="bottom_attach">12</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment125"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xscale">0</property> - <property name="left_padding">3</property> - <child> - <widget class="GtkSpinButton" id="create-memory-startup"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="adjustment">244 50 32000 5 10 0</property> - <property name="climb_rate">1</property> - <property name="numeric">True</property> - <accessibility> - <atkproperty name="AtkObject::accessible_name" translatable="yes">Startup Mem Select</atkproperty> - </accessibility> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment124"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xscale">0</property> - <property name="left_padding">3</property> - <child> - <widget class="GtkSpinButton" id="create-memory-max"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="adjustment">249 50 32000 5 10 0</property> - <property name="climb_rate">1</property> - <property name="numeric">True</property> - <accessibility> - <atkproperty name="AtkObject::accessible_name" translatable="yes">Max Mem Select</atkproperty> - </accessibility> - <signal name="value_changed" handler="on_create_memory_max_value_changed"/> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="create-host-memory"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">3</property> - <property name="label">2 GB</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label340"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">10</property> - <property name="label"> </property> - </widget> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label278"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">1</property> - <property name="xpad">5</property> - <property name="label" translatable="yes">Please enter the number of virtual CPUs this virtual machine should start up with.</property> - <property name="use_markup">True</property> - <property name="use_underline">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">3</property> - <property name="top_attach">7</property> - <property name="bottom_attach">8</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label274"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="xpad">3</property> - <property name="label" translatable="yes">Total memory on host machine:</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - <property name="y_padding">4</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label272"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Please enter the memory configuration for this virtual machine. You can specify the maximum amount of memory the virtual machine should be able to use, and optionally a lower amount to grab on startup. Warning: setting virtual machine memory too high will cause out-of-memory errors in your host domain!</property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - <property name="y_padding">4</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="create-cpus-physical"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">4</property> - <property name="label">256 </property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">8</property> - <property name="bottom_attach">9</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label279"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="xpad">3</property> - <property name="ypad">4</property> - <property name="label" translatable="yes">Logical host CPUs:</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_RIGHT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">8</property> - <property name="bottom_attach">9</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label337"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="xpad">3</property> - <property name="label" translatable="yes">_Max memory (MB):</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">create-memory-max</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label338"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="xpad">3</property> - <property name="label" translatable="yes">_Startup memory (MB):</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">create-memory-startup</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label277"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">1</property> - <property name="xpad">10</property> - <property name="label" translatable="yes"><b>CPUs:</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="right_attach">2</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label271"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">10</property> - <property name="label" translatable="yes"><b>Memory:</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="right_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label289"> - <property name="visible">True</property> - <property name="xalign">0</property> - </widget> - <packing> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - <packing> + <property name="fill">False</property> + <property name="pack_type">GTK_PACK_END</property> <property name="position">1</property> </packing> </child> </widget> <packing> - <property name="position">8</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label259"> - <property name="visible">True</property> - <property name="label" translatable="no">Mem/CPU</property> - </widget> - <packing> - <property name="type">tab</property> - <property name="position">8</property> - <property name="tab_fill">False</property> - </packing> - </child> - <child> - <widget class="GtkVBox" id="vbox41"> - <property name="visible">True</property> - <property name="border_width">1</property> - <child> - <widget class="GtkAlignment" id="alignment95"> - <property name="visible">True</property> - <child> - <widget class="GtkEventBox" id="page9-title"> - <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label247"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xpad">5</property> - <property name="ypad">6</property> - <property name="label" translatable="yes"><span weight="heavy" size="xx-large" foreground="#FFF">Finish Virtual Machine Creation</span></property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_FILL</property> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment100"> - <property name="visible">True</property> - <property name="xalign">0.10000000149011612</property> - <property name="yalign">0.10000000149011612</property> - <property name="yscale">0</property> - <property name="top_padding">6</property> - <property name="bottom_padding">6</property> - <property name="left_padding">24</property> - <property name="right_padding">6</property> - <child> - <widget class="GtkTable" id="table29"> - <property name="visible">True</property> - <property name="border_width">6</property> - <property name="n_rows">20</property> - <property name="n_columns">3</property> - <property name="column_spacing">3</property> - <property name="row_spacing">3</property> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <widget class="GtkLabel" id="summary-audio"> - <property name="visible">True</property> - <property name="xalign">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">19</property> - <property name="bottom_attach">20</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label402"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">Enable audio:</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">19</property> - <property name="bottom_attach">20</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label401"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><b>Sound</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="right_attach">3</property> - <property name="top_attach">18</property> - <property name="bottom_attach">19</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="summary-kernel-args"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label">ip=192.168.1.1</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">10</property> - <property name="bottom_attach">11</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="summary-kernel-args-label"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">Kernel arguments:</property> - <property name="justify">GTK_JUSTIFY_RIGHT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">10</property> - <property name="bottom_attach">11</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="summary-mac-address"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label">-</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">17</property> - <property name="bottom_attach">18</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label386"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">MAC address:</property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">17</property> - <property name="bottom_attach">18</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label316"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">Maximum memory:</property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label317"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">Initial memory:</property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="summary-initial-memory"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label">400 MB</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="summary-max-memory"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label">512 MB</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="summary-net-target"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label">eth0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">16</property> - <property name="bottom_attach">17</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="summary-net-type"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Shared Physical Device</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">15</property> - <property name="bottom_attach">16</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label381"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">Target:</property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">16</property> - <property name="bottom_attach">17</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label380"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">Connection type:</property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">15</property> - <property name="bottom_attach">16</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="summary-virtual-cpus"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label">5 </property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label318"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">Virtual CPUs:</property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label379"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label"> </property> - </widget> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label376"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="ypad">5</property> - <property name="label" translatable="yes"><b>Install media</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="right_attach">3</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label377"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="ypad">5</property> - <property name="label" translatable="yes"><b>Storage</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="right_attach">3</property> - <property name="top_attach">11</property> - <property name="bottom_attach">12</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label378"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="ypad">5</property> - <property name="label" translatable="yes"><b>Network</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="right_attach">3</property> - <property name="top_attach">14</property> - <property name="bottom_attach">15</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label315"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">Disk size:</property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">13</property> - <property name="bottom_attach">14</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label314"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">Disk image:</property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">12</property> - <property name="bottom_attach">13</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label313"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">Kickstart source:</property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">9</property> - <property name="bottom_attach">10</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label312"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">Installation source:</property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">8</property> - <property name="bottom_attach">9</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="summary-os-label"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">Operating system:</property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">7</property> - <property name="bottom_attach">8</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label311"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Virtualization method:</property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label310"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">Machine name:</property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="summary-disk-image"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label">/xen/demo.img</property> - <property name="ellipsize">PANGO_ELLIPSIZE_MIDDLE</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">12</property> - <property name="bottom_attach">13</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="summary-kickstart-source"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label">http://</property> - <property name="ellipsize">PANGO_ELLIPSIZE_MIDDLE</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">9</property> - <property name="bottom_attach">10</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="summary-install-source"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label">http://</property> - <property name="ellipsize">PANGO_ELLIPSIZE_MIDDLE</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">8</property> - <property name="bottom_attach">9</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="summary-disk-size"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label">5 GB</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">13</property> - <property name="bottom_attach">14</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="summary-os"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="no">VMS</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">7</property> - <property name="bottom_attach">8</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="summary-method"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label">para</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="summary-name"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label">demo</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label375"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="ypad">5</property> - <property name="label" translatable="yes"><b>Summary</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="right_attach">3</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - </child> - </widget> - <packing> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="position">9</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="step6"> - <property name="visible">True</property> - <property name="label" translatable="no">Finish</property> - </widget> - <packing> - <property name="type">tab</property> - <property name="position">9</property> - <property name="tab_fill">False</property> - </packing> - </child> - </widget> - </child> - <child> - <widget class="GtkHBox" id="hbox51"> - <property name="visible">True</property> - <child> - <widget class="GtkAlignment" id="alignment135"> - <property name="visible">True</property> - <property name="xalign">0</property> - <child> - <widget class="GtkButton" id="create-help"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-help</property> - <property name="use_stock">True</property> - <property name="response_id">0</property> - <signal name="clicked" handler="on_create_help_clicked"/> - </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkAlignment" id="alignment134"> - <property name="visible">True</property> - <property name="xalign">1</property> - <child> - <widget class="GtkHBox" id="hbox25"> - <property name="visible">True</property> - <property name="spacing">10</property> - <child> - <widget class="GtkButton" id="create-cancel"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-cancel</property> - <property name="use_stock">True</property> - <property name="response_id">0</property> - <signal name="clicked" handler="on_create_cancel_clicked"/> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child> - <widget class="GtkButton" id="create-back"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-go-back</property> - <property name="use_stock">True</property> - <property name="response_id">0</property> - <signal name="clicked" handler="on_create_back_clicked"/> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <widget class="GtkButton" id="create-forward"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-go-forward</property> - <property name="use_stock">True</property> - <property name="response_id">0</property> - <signal name="clicked" handler="on_create_forward_clicked"/> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">2</property> - </packing> - </child> - <child> - <widget class="GtkButton" id="create-finish"> - <property name="can_focus">True</property> - <property name="response_id">0</property> - <signal name="clicked" handler="on_create_finish_clicked"/> - <child> - <widget class="GtkAlignment" id="alignment119"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <widget class="GtkHBox" id="hbox45"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <widget class="GtkImage" id="image95"> - <property name="visible">True</property> - <property name="stock">gtk-quit</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label305"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Finish</property> - <property name="use_underline">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">3</property> - </packing> - </child> - </widget> - </child> - </widget> - <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="pack_type">GTK_PACK_END</property> <property name="position">1</property> </packing> </child> </widget> <packing> - <property name="expand">False</property> - <property name="fill">False</property> <property name="position">1</property> </packing> </child> diff -r 35f1db8a045d -r e232a860b409 src/vmm-manager.glade --- a/src/vmm-manager.glade Sat Feb 28 19:27:20 2009 -0500 +++ b/src/vmm-manager.glade Fri Mar 06 12:14:50 2009 -0500 @@ -344,7 +344,6 @@ <child> <widget class="GtkButton" id="vm-new"> <property name="visible">True</property> - <property name="sensitive">False</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="label">gtk-new</property>
_______________________________________________ et-mgmt-tools mailing list et-mgmt-tools@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/et-mgmt-tools