Refactor connect dialog to support QEMU driver

This commit is contained in:
Daniel P. Berrange 2007-02-19 22:23:15 -05:00
parent 6c358ecf15
commit b5e91c23ef
3 changed files with 357 additions and 228 deletions

View File

@ -34,22 +34,23 @@ class vmmConnect(gobject.GObject):
self.engine = engine self.engine = engine
self.window.get_widget("vmm-open-connection").hide() self.window.get_widget("vmm-open-connection").hide()
self.change_active_type(self.window.get_widget("type-local-xen")) # Not securely implemented yet by XenD/QEMU yet so disable it
self.window.get_widget("type-remote-host").set_sensitive(False)
# Not securely implemented yet by XenD, so disable it
self.window.get_widget("type-remote-xen").set_sensitive(False)
self.window.get_widget("connect").grab_default() self.window.get_widget("connect").grab_default()
self.window.signal_autoconnect({ self.window.signal_autoconnect({
"on_type_local_xen_toggled": self.change_active_type, "on_type_local_host_toggled": self.update_widget_states,
"on_type_remote_xen_toggled": self.change_active_type, "on_type_remote_host_toggled": self.update_widget_states,
"on_type_other_hv_toggled": self.change_active_type, "on_type_other_hv_toggled": self.update_widget_states,
"on_type_hypervisor_changed": self.update_widget_states,
"on_cancel_clicked": self.cancel, "on_cancel_clicked": self.cancel,
"on_connect_clicked": self.open_connection, "on_connect_clicked": self.open_connection,
"on_vmm_open_connection_delete_event": self.cancel, "on_vmm_open_connection_delete_event": self.cancel,
}) })
self.window.get_widget("type-hypervisor").set_active(0)
def cancel(self,ignore1=None,ignore2=None): def cancel(self,ignore1=None,ignore2=None):
self.close() self.close()
self.emit("cancelled") self.emit("cancelled")
@ -63,19 +64,22 @@ class vmmConnect(gobject.GObject):
win.show_all() win.show_all()
win.present() win.present()
def change_active_type(self, src): def update_widget_states(self, ignore=None):
if src.get_active(): type = self.window.get_widget("type-hypervisor")
if src.get_name() == "type-local-xen": local = self.window.get_widget("type-local-host")
self.window.get_widget("remote-xen-options").set_sensitive(False) remote = self.window.get_widget("type-remote-host")
if local.get_active():
self.window.get_widget("remote-host-options").set_sensitive(False)
self.window.get_widget("other-hv-options").set_sensitive(False) self.window.get_widget("other-hv-options").set_sensitive(False)
elif src.get_name() == "type-remote-xen": elif remote.get_active():
self.window.get_widget("remote-xen-options").set_sensitive(True) self.window.get_widget("remote-host-options").set_sensitive(True)
self.window.get_widget("other-hv-options").set_sensitive(False) self.window.get_widget("other-hv-options").set_sensitive(False)
else: else:
self.window.get_widget("remote-xen-options").set_sensitive(False) self.window.get_widget("remote-host-options").set_sensitive(False)
self.window.get_widget("other-hv-options").set_sensitive(True) self.window.get_widget("other-hv-options").set_sensitive(True)
if src.get_name() == "type-local-xen" and os.getuid() != 0: if local.get_active() and os.getuid() != 0 and type.get_active() == 0:
self.window.get_widget("option-read-only").set_sensitive(False) self.window.get_widget("option-read-only").set_sensitive(False)
self.window.get_widget("option-read-only").set_active(True) self.window.get_widget("option-read-only").set_active(True)
else: else:
@ -84,18 +88,29 @@ class vmmConnect(gobject.GObject):
def open_connection(self, src): def open_connection(self, src):
type = self.window.get_widget("type-hypervisor")
local = self.window.get_widget("type-local-host")
remote = self.window.get_widget("type-remote-host")
uri = None uri = None
readOnly = self.window.get_widget("option-read-only").get_active() readOnly = self.window.get_widget("option-read-only").get_active()
if self.window.get_widget("type-local-xen").get_active():
if local.get_active():
if type.get_active() == 0:
uri = "xen" uri = "xen"
if os.getuid() != 0: if os.getuid() != 0:
readOnly = True readOnly = True
elif self.window.get_widget("type-remote-xen").get_active(): else:
protocol = "http" if os.getuid() == 0:
if self.window.get_widget("remote-xen-secure").get_active(): uri = "qemu///system"
protocol = "https" else:
uri = protocol + "://" + self.window.get_widget("remote-xen-host").get_text() + ":" + self.window.get_widget("remote-xen-port").get_text() uri = "qemu:///session"
elif remote.get_active():
if type.get_active() == 0:
# XXX fixme
uri = "http://" + self.window.get_widget("remote-host").get_text() + ":" + self.window.get_widget("remote-port").get_text()
else:
uri = "qemu://" + self.window.get_widget("remote-host").get_text() + ":" + self.window.get_widget("remote-port").get_text() + "/system"
else: else:
uri = self.window.get_widget("other-hv-uri").get_text() uri = self.window.get_widget("other-hv-uri").get_text()

View File

@ -55,15 +55,37 @@ class vmmConnection(gobject.GObject):
def is_read_only(self): def is_read_only(self):
return self.readOnly return self.readOnly
def get_type(self):
return self.vmm.getType()
def get_name(self): def get_name(self):
if self.uri == "xen" or self.uri == "Xen" or (self.uri is None):
hostname = "localhost" hostname = "localhost"
try: try:
(host, aliases, ipaddrs) = gethostbyaddr(gethostname()) (host, aliases, ipaddrs) = gethostbyaddr(gethostname())
hostname = host hostname = host
except: except:
logging.warning("Unable to resolve local hostname for machine") logging.warning("Unable to resolve local hostname for machine")
if self.get_type()[0:3] == "Xen":
if self.uri == "xen" or self.uri == "Xen" or self.uri is None:
return "Xen: " + hostname return "Xen: " + hostname
else:
try:
urlbits = urlparse(self.uri)
return "Xen: " + urlbits.netloc
except:
return self.uri
elif self.get_type() == "QEMU":
if self.uri == "qemu:///session":
return "QEMU session: " + hostname
elif self.uri == "qemu:///system":
return "QEMU system: " + hostname
else:
try:
urlbits = urlparse(self.uri)
return "QEMU system: " + urlbits.netloc
except:
return self.uri
else: else:
return self.uri return self.uri

View File

@ -137,17 +137,40 @@
<property name="spacing">0</property> <property name="spacing">0</property>
<child> <child>
<widget class="GtkRadioButton" id="type-local-xen"> <widget class="GtkAlignment" id="alignment12">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="xalign">0.5</property>
<property name="label" translatable="yes">_Local Xen host</property> <property name="yalign">0.5</property>
<property name="use_underline">True</property> <property name="xscale">0.5</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="yscale">1</property>
<property name="focus_on_click">True</property> <property name="top_padding">3</property>
<property name="active">False</property> <property name="bottom_padding">0</property>
<property name="inconsistent">False</property> <property name="left_padding">0</property>
<property name="draw_indicator">True</property> <property name="right_padding">0</property>
<signal name="toggled" handler="on_type_local_xen_toggled" last_modification_time="Mon, 12 Jun 2006 19:46:14 GMT"/>
<child>
<widget class="GtkHBox" id="hbox13">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkLabel" id="label87">
<property name="visible">True</property>
<property name="label" translatable="yes">Hypervisor:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">1</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget> </widget>
<packing> <packing>
<property name="padding">0</property> <property name="padding">0</property>
@ -157,18 +180,22 @@
</child> </child>
<child> <child>
<widget class="GtkRadioButton" id="type-remote-xen"> <widget class="GtkComboBox" id="type-hypervisor">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="items" translatable="yes">Xen
<property name="label" translatable="yes">_Remote Xen host</property> QEMU</property>
<property name="use_underline">True</property> <property name="add_tearoffs">False</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property> <property name="focus_on_click">True</property>
<property name="active">False</property> <signal name="changed" handler="on_type_hypervisor_changed" last_modification_time="Mon, 19 Feb 2007 22:04:06 GMT"/>
<property name="inconsistent">False</property> </widget>
<property name="draw_indicator">True</property> <packing>
<property name="group">type-local-xen</property> <property name="padding">0</property>
<signal name="toggled" handler="on_type_remote_xen_toggled" last_modification_time="Mon, 12 Jun 2006 19:46:23 GMT"/> <property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
</child>
</widget> </widget>
<packing> <packing>
<property name="padding">0</property> <property name="padding">0</property>
@ -178,7 +205,65 @@
</child> </child>
<child> <child>
<widget class="GtkTable" id="remote-xen-options"> <widget class="GtkHSeparator" id="hseparator3">
<property name="visible">True</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkVBox" id="vbox12">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkRadioButton" id="type-local-host">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">_Local host</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_type_local_host_toggled" last_modification_time="Mon, 19 Feb 2007 22:04:15 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkRadioButton" id="type-remote-host">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">_Remote host</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
<property name="group">type-local-host</property>
<signal name="toggled" handler="on_type_remote_host_toggled" last_modification_time="Mon, 19 Feb 2007 22:04:21 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkTable" id="remote-host-options">
<property name="border_width">3</property> <property name="border_width">3</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="n_rows">1</property> <property name="n_rows">1</property>
@ -305,7 +390,7 @@
<property name="active">False</property> <property name="active">False</property>
<property name="inconsistent">False</property> <property name="inconsistent">False</property>
<property name="draw_indicator">True</property> <property name="draw_indicator">True</property>
<property name="group">type-local-xen</property> <property name="group">type-local-host</property>
<signal name="toggled" handler="on_type_other_hv_toggled" last_modification_time="Mon, 12 Jun 2006 19:46:32 GMT"/> <signal name="toggled" handler="on_type_other_hv_toggled" last_modification_time="Mon, 12 Jun 2006 19:46:32 GMT"/>
</widget> </widget>
<packing> <packing>
@ -373,9 +458,16 @@
<property name="fill">True</property> <property name="fill">True</property>
</packing> </packing>
</child> </child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child> <child>
<widget class="GtkHSeparator" id="hseparator2"> <widget class="GtkHSeparator" id="hseparator4">
<property name="visible">True</property> <property name="visible">True</property>
</widget> </widget>
<packing> <packing>
@ -400,7 +492,7 @@
<packing> <packing>
<property name="padding">0</property> <property name="padding">0</property>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">False</property>
</packing> </packing>
</child> </child>
</widget> </widget>