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.window.get_widget("vmm-open-connection").hide()
self.change_active_type(self.window.get_widget("type-local-xen"))
# Not securely implemented yet by XenD, so disable it
self.window.get_widget("type-remote-xen").set_sensitive(False)
# Not securely implemented yet by XenD/QEMU yet so disable it
self.window.get_widget("type-remote-host").set_sensitive(False)
self.window.get_widget("connect").grab_default()
self.window.signal_autoconnect({
"on_type_local_xen_toggled": self.change_active_type,
"on_type_remote_xen_toggled": self.change_active_type,
"on_type_other_hv_toggled": self.change_active_type,
"on_type_local_host_toggled": self.update_widget_states,
"on_type_remote_host_toggled": self.update_widget_states,
"on_type_other_hv_toggled": self.update_widget_states,
"on_type_hypervisor_changed": self.update_widget_states,
"on_cancel_clicked": self.cancel,
"on_connect_clicked": self.open_connection,
"on_vmm_open_connection_delete_event": self.cancel,
})
self.window.get_widget("type-hypervisor").set_active(0)
def cancel(self,ignore1=None,ignore2=None):
self.close()
self.emit("cancelled")
@ -63,39 +64,53 @@ class vmmConnect(gobject.GObject):
win.show_all()
win.present()
def change_active_type(self, src):
if src.get_active():
if src.get_name() == "type-local-xen":
self.window.get_widget("remote-xen-options").set_sensitive(False)
self.window.get_widget("other-hv-options").set_sensitive(False)
elif src.get_name() == "type-remote-xen":
self.window.get_widget("remote-xen-options").set_sensitive(True)
self.window.get_widget("other-hv-options").set_sensitive(False)
else:
self.window.get_widget("remote-xen-options").set_sensitive(False)
self.window.get_widget("other-hv-options").set_sensitive(True)
def update_widget_states(self, ignore=None):
type = self.window.get_widget("type-hypervisor")
local = self.window.get_widget("type-local-host")
remote = self.window.get_widget("type-remote-host")
if src.get_name() == "type-local-xen" and os.getuid() != 0:
self.window.get_widget("option-read-only").set_sensitive(False)
self.window.get_widget("option-read-only").set_active(True)
else:
self.window.get_widget("option-read-only").set_active(False)
self.window.get_widget("option-read-only").set_sensitive(True)
if local.get_active():
self.window.get_widget("remote-host-options").set_sensitive(False)
self.window.get_widget("other-hv-options").set_sensitive(False)
elif remote.get_active():
self.window.get_widget("remote-host-options").set_sensitive(True)
self.window.get_widget("other-hv-options").set_sensitive(False)
else:
self.window.get_widget("remote-host-options").set_sensitive(False)
self.window.get_widget("other-hv-options").set_sensitive(True)
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_active(True)
else:
self.window.get_widget("option-read-only").set_active(False)
self.window.get_widget("option-read-only").set_sensitive(True)
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
readOnly = self.window.get_widget("option-read-only").get_active()
if self.window.get_widget("type-local-xen").get_active():
uri = "xen"
if os.getuid() != 0:
readOnly = True
elif self.window.get_widget("type-remote-xen").get_active():
protocol = "http"
if self.window.get_widget("remote-xen-secure").get_active():
protocol = "https"
uri = protocol + "://" + self.window.get_widget("remote-xen-host").get_text() + ":" + self.window.get_widget("remote-xen-port").get_text()
if local.get_active():
if type.get_active() == 0:
uri = "xen"
if os.getuid() != 0:
readOnly = True
else:
if os.getuid() == 0:
uri = "qemu///system"
else:
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:
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):
return self.readOnly
def get_type(self):
return self.vmm.getType()
def get_name(self):
if self.uri == "xen" or self.uri == "Xen" or (self.uri is None):
hostname = "localhost"
try:
(host, aliases, ipaddrs) = gethostbyaddr(gethostname())
hostname = host
except:
logging.warning("Unable to resolve local hostname for machine")
return "Xen: " + hostname
hostname = "localhost"
try:
(host, aliases, ipaddrs) = gethostbyaddr(gethostname())
hostname = host
except:
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
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:
return self.uri

View File

@ -137,17 +137,65 @@
<property name="spacing">0</property>
<child>
<widget class="GtkRadioButton" id="type-local-xen">
<widget class="GtkAlignment" id="alignment12">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">_Local Xen 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_xen_toggled" last_modification_time="Mon, 12 Jun 2006 19:46:14 GMT"/>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xscale">0.5</property>
<property name="yscale">1</property>
<property name="top_padding">3</property>
<property name="bottom_padding">0</property>
<property name="left_padding">0</property>
<property name="right_padding">0</property>
<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>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkComboBox" id="type-hypervisor">
<property name="visible">True</property>
<property name="items" translatable="yes">Xen
QEMU</property>
<property name="add_tearoffs">False</property>
<property name="focus_on_click">True</property>
<signal name="changed" handler="on_type_hypervisor_changed" last_modification_time="Mon, 19 Feb 2007 22:04:06 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
</child>
</widget>
<packing>
<property name="padding">0</property>
@ -157,135 +205,8 @@
</child>
<child>
<widget class="GtkRadioButton" id="type-remote-xen">
<widget class="GtkHSeparator" id="hseparator3">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">_Remote Xen 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-xen</property>
<signal name="toggled" handler="on_type_remote_xen_toggled" last_modification_time="Mon, 12 Jun 2006 19:46:23 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-xen-options">
<property name="border_width">3</property>
<property name="visible">True</property>
<property name="n_rows">1</property>
<property name="n_columns">4</property>
<property name="homogeneous">False</property>
<property name="row_spacing">3</property>
<property name="column_spacing">3</property>
<child>
<widget class="GtkEntry" id="remote-xen-port">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
</widget>
<packing>
<property name="left_attach">3</property>
<property name="right_attach">4</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="remote-xen-host">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label84">
<property name="visible">True</property>
<property name="label" translatable="yes">_Port:</property>
<property name="use_underline">True</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">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="mnemonic_widget">remote-xen-port</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>
<packing>
<property name="left_attach">2</property>
<property name="right_attach">3</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label85">
<property name="visible">True</property>
<property name="label" translatable="yes">_Host:</property>
<property name="use_underline">True</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">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="mnemonic_widget">remote-xen-host</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>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
@ -295,51 +216,23 @@
</child>
<child>
<widget class="GtkRadioButton" id="type-other-hv">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">_Other hypervisor</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-xen</property>
<signal name="toggled" handler="on_type_other_hv_toggled" last_modification_time="Mon, 12 Jun 2006 19:46:32 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="other-hv-options">
<property name="border_width">3</property>
<widget class="GtkVBox" id="vbox12">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">3</property>
<property name="spacing">0</property>
<child>
<widget class="GtkLabel" id="label82">
<widget class="GtkRadioButton" id="type-local-host">
<property name="visible">True</property>
<property name="label" translatable="yes">_URI:</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">_Local host</property>
<property name="use_underline">True</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">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="mnemonic_widget">other-hv-uri</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>
<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>
@ -349,16 +242,215 @@
</child>
<child>
<widget class="GtkEntry" id="other-hv-uri">
<widget class="GtkRadioButton" id="type-remote-host">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</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="visible">True</property>
<property name="n_rows">1</property>
<property name="n_columns">4</property>
<property name="homogeneous">False</property>
<property name="row_spacing">3</property>
<property name="column_spacing">3</property>
<child>
<widget class="GtkEntry" id="remote-xen-port">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
</widget>
<packing>
<property name="left_attach">3</property>
<property name="right_attach">4</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="remote-xen-host">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label84">
<property name="visible">True</property>
<property name="label" translatable="yes">_Port:</property>
<property name="use_underline">True</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">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="mnemonic_widget">remote-xen-port</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>
<packing>
<property name="left_attach">2</property>
<property name="right_attach">3</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label85">
<property name="visible">True</property>
<property name="label" translatable="yes">_Host:</property>
<property name="use_underline">True</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">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="mnemonic_widget">remote-xen-host</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>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkRadioButton" id="type-other-hv">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">_Other hypervisor</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_other_hv_toggled" last_modification_time="Mon, 12 Jun 2006 19:46:32 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="other-hv-options">
<property name="border_width">3</property>
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">3</property>
<child>
<widget class="GtkLabel" id="label82">
<property name="visible">True</property>
<property name="label" translatable="yes">_URI:</property>
<property name="use_underline">True</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">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="mnemonic_widget">other-hv-uri</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>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="other-hv-uri">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
@ -375,7 +467,7 @@
</child>
<child>
<widget class="GtkHSeparator" id="hseparator2">
<widget class="GtkHSeparator" id="hseparator4">
<property name="visible">True</property>
</widget>
<packing>
@ -400,7 +492,7 @@
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="fill">False</property>
</packing>
</child>
</widget>