Started to hook up the toolbar. Added a vm console window

This commit is contained in:
berrange@roquette.boston.redhat.com 2006-04-03 06:11:25 -04:00
parent 864cbdfe9c
commit a4c3da8429
2 changed files with 390 additions and 19 deletions

View File

@ -427,6 +427,7 @@ Inactive virtual machines</property>
<property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<signal name="clicked" handler="on_vm_open_clicked" last_modification_time="Mon, 03 Apr 2006 09:52:21 GMT"/>
</widget>
</child>
</widget>
@ -542,7 +543,7 @@ Inactive virtual machines</property>
<property name="spacing">0</property>
<child>
<widget class="GtkToolbar" id="toolbar1">
<widget class="GtkToolbar" id="toolbar4">
<property name="visible">True</property>
<property name="orientation">GTK_ORIENTATION_HORIZONTAL</property>
<property name="toolbar_style">GTK_TOOLBAR_BOTH</property>
@ -557,6 +558,7 @@ Inactive virtual machines</property>
<property name="visible_horizontal">True</property>
<property name="visible_vertical">True</property>
<property name="is_important">False</property>
<signal name="clicked" handler="on_control_run_clicked" last_modification_time="Mon, 03 Apr 2006 08:15:12 GMT"/>
</widget>
<packing>
<property name="expand">False</property>
@ -565,13 +567,15 @@ Inactive virtual machines</property>
</child>
<child>
<widget class="GtkToolButton" id="control-pause">
<widget class="GtkToggleToolButton" id="control-pause">
<property name="visible">True</property>
<property name="label" translatable="yes">Pause</property>
<property name="use_underline">True</property>
<property name="visible_horizontal">True</property>
<property name="visible_vertical">True</property>
<property name="is_important">False</property>
<property name="active">False</property>
<signal name="toggled" handler="on_control_pause_toggled" last_modification_time="Mon, 03 Apr 2006 08:17:10 GMT"/>
</widget>
<packing>
<property name="expand">False</property>
@ -587,6 +591,7 @@ Inactive virtual machines</property>
<property name="visible_horizontal">True</property>
<property name="visible_vertical">True</property>
<property name="is_important">False</property>
<signal name="clicked" handler="on_control_shutdown_clicked" last_modification_time="Mon, 03 Apr 2006 08:15:00 GMT"/>
</widget>
<packing>
<property name="expand">False</property>
@ -595,7 +600,7 @@ Inactive virtual machines</property>
</child>
<child>
<widget class="GtkSeparatorToolItem" id="separatortoolitem1">
<widget class="GtkSeparatorToolItem" id="separatortoolitem3">
<property name="visible">True</property>
<property name="draw">True</property>
<property name="visible_horizontal">True</property>
@ -608,13 +613,14 @@ Inactive virtual machines</property>
</child>
<child>
<widget class="GtkToolButton" id="launch-term">
<widget class="GtkToolButton" id="control-console">
<property name="visible">True</property>
<property name="label" translatable="yes">Launch terminal</property>
<property name="label" translatable="yes">Open console</property>
<property name="use_underline">True</property>
<property name="visible_horizontal">True</property>
<property name="visible_vertical">True</property>
<property name="is_important">False</property>
<signal name="clicked" handler="on_control_console_clicked" last_modification_time="Mon, 03 Apr 2006 09:31:46 GMT"/>
</widget>
<packing>
<property name="expand">False</property>
@ -623,13 +629,14 @@ Inactive virtual machines</property>
</child>
<child>
<widget class="GtkToolButton" id="take-snapshot">
<widget class="GtkToolButton" id="control-snapshot">
<property name="visible">True</property>
<property name="label" translatable="yes">Take snapshot</property>
<property name="use_underline">True</property>
<property name="visible_horizontal">True</property>
<property name="visible_vertical">True</property>
<property name="is_important">False</property>
<signal name="clicked" handler="on_control_snapshot_clicked" last_modification_time="Mon, 03 Apr 2006 09:31:41 GMT"/>
</widget>
<packing>
<property name="expand">False</property>
@ -640,7 +647,7 @@ Inactive virtual machines</property>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="fill">False</property>
</packing>
</child>
@ -1727,4 +1734,184 @@ Inactive virtual machines</property>
</child>
</widget>
<widget class="GtkWindow" id="vmm-console">
<property name="visible">True</property>
<property name="title" translatable="yes">window1</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_NONE</property>
<property name="modal">False</property>
<property name="default_width">650</property>
<property name="default_height">500</property>
<property name="resizable">True</property>
<property name="destroy_with_parent">False</property>
<property name="icon">icon_cpu.png</property>
<property name="decorated">True</property>
<property name="skip_taskbar_hint">False</property>
<property name="skip_pager_hint">False</property>
<property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
<property name="focus_on_map">True</property>
<property name="urgency_hint">False</property>
<child>
<widget class="GtkVBox" id="vbox6">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkToolbar" id="toolbar3">
<property name="visible">True</property>
<property name="orientation">GTK_ORIENTATION_HORIZONTAL</property>
<property name="toolbar_style">GTK_TOOLBAR_BOTH</property>
<property name="tooltips">True</property>
<property name="show_arrow">False</property>
<child>
<widget class="GtkToolButton" id="control-run">
<property name="visible">True</property>
<property name="label" translatable="yes">Run</property>
<property name="use_underline">True</property>
<property name="visible_horizontal">True</property>
<property name="visible_vertical">True</property>
<property name="is_important">False</property>
<signal name="clicked" handler="on_control_run_clicked" last_modification_time="Mon, 03 Apr 2006 08:15:12 GMT"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<widget class="GtkToggleToolButton" id="control-pause">
<property name="visible">True</property>
<property name="label" translatable="yes">Pause</property>
<property name="use_underline">True</property>
<property name="visible_horizontal">True</property>
<property name="visible_vertical">True</property>
<property name="is_important">False</property>
<property name="active">False</property>
<signal name="toggled" handler="on_control_pause_toggled" last_modification_time="Mon, 03 Apr 2006 08:17:10 GMT"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<widget class="GtkToolButton" id="control-shutdown">
<property name="visible">True</property>
<property name="label" translatable="yes">Shutdown</property>
<property name="use_underline">True</property>
<property name="visible_horizontal">True</property>
<property name="visible_vertical">True</property>
<property name="is_important">False</property>
<signal name="clicked" handler="on_control_shutdown_clicked" last_modification_time="Mon, 03 Apr 2006 08:15:00 GMT"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<widget class="GtkSeparatorToolItem" id="separatortoolitem2">
<property name="visible">True</property>
<property name="draw">True</property>
<property name="visible_horizontal">True</property>
<property name="visible_vertical">True</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
<widget class="GtkToolButton" id="control-terminal">
<property name="visible">True</property>
<property name="label" translatable="yes">Open terminal</property>
<property name="use_underline">True</property>
<property name="visible_horizontal">True</property>
<property name="visible_vertical">True</property>
<property name="is_important">False</property>
<signal name="clicked" handler="on_control_terminal_clicked" last_modification_time="Mon, 03 Apr 2006 09:54:01 GMT"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<widget class="GtkToolButton" id="control-snapshot">
<property name="visible">True</property>
<property name="label" translatable="yes">Take snapshot</property>
<property name="use_underline">True</property>
<property name="visible_horizontal">True</property>
<property name="visible_vertical">True</property>
<property name="is_important">False</property>
<signal name="clicked" handler="on_control_snapshot_clicked" last_modification_time="Mon, 03 Apr 2006 09:53:54 GMT"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkScrolledWindow" id="console-pane">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property>
<property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
<child>
<widget class="GtkViewport" id="viewport2">
<property name="visible">True</property>
<property name="shadow_type">GTK_SHADOW_IN</property>
<child>
<widget class="GtkLabel" id="label52">
<property name="visible">True</property>
<property name="label" translatable="yes">&lt;b&gt;The console is currently unavailable&lt;/b&gt;</property>
<property name="use_underline">False</property>
<property name="use_markup">True</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="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
</child>
</widget>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</widget>
</child>
</widget>
</glade-interface>

View File

@ -53,6 +53,119 @@ class vmmAbout:
self.window.get_widget("vmm-about").hide()
return 1
class vmmConsole:
def __init__(self, vmm, stats, conf, vmname):
self.window = gtk.glade.XML(asset_dir + "/" + appname + ".glade", "vmm-console")
self.vmm = vmm
self.stats = stats
self.conf = conf
self.vmname = vmname
self.lastStatus = None
topwin = self.window.get_widget("vmm-console")
topwin.hide()
topwin.set_title(vmname + " " + topwin.get_title())
self.window.get_widget("control-run").set_icon_widget(gtk.Image())
self.window.get_widget("control-run").get_icon_widget().set_from_file(asset_dir + "/pixmaps/icon_run.png")
self.window.get_widget("control-pause").set_icon_widget(gtk.Image())
self.window.get_widget("control-pause").get_icon_widget().set_from_file(asset_dir + "/pixmaps/icon_pause.png")
self.window.get_widget("control-shutdown").set_icon_widget(gtk.Image())
#self.window.get_widget("control-shutdown").get_icon_widget().set_from_file(asset_dir + "/pixmaps/icon_run.png")
self.window.get_widget("control-terminal").set_icon_widget(gtk.Image())
self.window.get_widget("control-terminal").get_icon_widget().set_from_file(asset_dir + "/pixmaps/icon_launch_term.png")
self.window.get_widget("control-snapshot").set_icon_widget(gtk.Image())
self.window.get_widget("control-snapshot").get_icon_widget().set_from_file(asset_dir + "/pixmaps/icon_snapshot.png")
self.window.signal_autoconnect({
"on_vmm_console_delete_event": self.close,
"on_control_run_clicked": self.control_vm_run,
"on_control_shutdown_clicked": self.control_vm_shutdown,
"on_control_pause_toggled": self.control_vm_pause,
"on_control_terminal_clicked": self.control_vm_terminal,
"on_control_snapshot_clicked": self.control_vm_snapshot,
})
self.stats.connect_to_signal("vm_updated", self.refresh_status)
self.refresh_status(vmname)
def show(self):
dialog = self.window.get_widget("vmm-console")
dialog.show_all()
def close(self,ignore1=None,ignore2=None):
self.window.get_widget("vmm-console").hide()
return 1
def control_vm_run(self, src):
return 0
def control_vm_shutdown(self, src):
if not(self.stats.run_status(self.vmname) in [ "shutdown", "shutoff" ]):
self.vmm.shutdown()
else:
print "Shutdown requested, but machine is already shutting down / shutoff"
def control_vm_pause(self, src):
if self.stats.run_status(self.vmname) in [ "shutdown", "shutoff" ]:
print "Pause/resume requested, but machine is shutdown / shutoff"
else:
if self.stats.run_status(self.vmname) in [ "paused" ]:
if not src.get_active():
self.vmm.resume()
else:
print "Pause requested, but machine is already paused"
else:
if src.get_active():
self.vmm.suspend()
else:
print "Resume requested, but machine is already running"
def control_vm_terminal(self, src):
return 0
def control_vm_snapshot(self, src):
return 0
def refresh_status(self, vmname):
if not(vmname == self.vmname):
return
status = self.stats.run_status(vmname)
if self.lastStatus == status:
return
if status == "shutoff":
self.window.get_widget("control-run").set_sensitive(True)
else:
self.window.get_widget("control-run").set_sensitive(False)
if status in [ "shutoff", "shutdown" ]:
self.window.get_widget("control-pause").set_sensitive(False)
self.window.get_widget("control-shutdown").set_sensitive(False)
self.window.get_widget("control-terminal").set_sensitive(False)
self.window.get_widget("control-snapshot").set_sensitive(False)
else:
self.window.get_widget("control-pause").set_sensitive(True)
self.window.get_widget("control-shutdown").set_sensitive(True)
self.window.get_widget("control-terminal").set_sensitive(True)
self.window.get_widget("control-snapshot").set_sensitive(True)
if status == "paused":
self.window.get_widget("control-pause").set_active(True)
else:
self.window.get_widget("control-pause").set_active(False)
self.lastStatus = status
class vmmDetails:
def __init__(self, vmm, stats, conf, vmname):
@ -61,6 +174,7 @@ class vmmDetails:
self.stats = stats
self.conf = conf
self.vmname = vmname
self.lastStatus = None
topwin = self.window.get_widget("vmm-details")
topwin.hide()
@ -68,25 +182,20 @@ class vmmDetails:
self.window.get_widget("overview-name").set_text(vmname)
self.window.get_widget("control-run").set_sensitive(False)
self.window.get_widget("control-run").set_icon_widget(gtk.Image())
self.window.get_widget("control-run").get_icon_widget().set_from_file(asset_dir + "/pixmaps/icon_run.png")
self.window.get_widget("control-pause").set_sensitive(False)
self.window.get_widget("control-pause").set_icon_widget(gtk.Image())
self.window.get_widget("control-pause").get_icon_widget().set_from_file(asset_dir + "/pixmaps/icon_pause.png")
self.window.get_widget("control-shutdown").set_sensitive(False)
self.window.get_widget("control-shutdown").set_icon_widget(gtk.Image())
#self.window.get_widget("control-shutdown").get_icon_widget().set_from_file(asset_dir + "/pixmaps/icon_run.png")
self.window.get_widget("launch-term").set_sensitive(False)
self.window.get_widget("launch-term").set_icon_widget(gtk.Image())
self.window.get_widget("launch-term").get_icon_widget().set_from_file(asset_dir + "/pixmaps/icon_launch_term.png")
self.window.get_widget("control-console").set_icon_widget(gtk.Image())
self.window.get_widget("control-console").get_icon_widget().set_from_file(asset_dir + "/pixmaps/icon_launch_term.png")
self.window.get_widget("take-snapshot").set_sensitive(False)
self.window.get_widget("take-snapshot").set_icon_widget(gtk.Image())
self.window.get_widget("take-snapshot").get_icon_widget().set_from_file(asset_dir + "/pixmaps/icon_snapshot.png")
self.window.get_widget("control-snapshot").set_icon_widget(gtk.Image())
self.window.get_widget("control-snapshot").get_icon_widget().set_from_file(asset_dir + "/pixmaps/icon_snapshot.png")
@ -132,6 +241,13 @@ class vmmDetails:
self.window.signal_autoconnect({
"on_close_details_clicked": self.close,
"on_vmm_details_delete_event": self.close,
"on_control_run_clicked": self.control_vm_run,
"on_control_shutdown_clicked": self.control_vm_shutdown,
"on_control_pause_toggled": self.control_vm_pause,
"on_control_console_clicked": self.control_vm_console,
"on_control_snapshot_clicked": self.control_vm_snapshot,
})
self.stats.connect_to_signal("vm_updated", self.refresh_overview)
@ -146,6 +262,37 @@ class vmmDetails:
self.window.get_widget("vmm-details").hide()
return 1
def control_vm_run(self, src):
return 0
def control_vm_shutdown(self, src):
if not(self.stats.run_status(self.vmname) in [ "shutdown", "shutoff" ]):
self.vmm.shutdown()
else:
print "Shutdown requested, but machine is already shutting down / shutoff"
def control_vm_pause(self, src):
if self.stats.run_status(self.vmname) in [ "shutdown", "shutoff" ]:
print "Pause/resume requested, but machine is shutdown / shutoff"
else:
if self.stats.run_status(self.vmname) in [ "paused" ]:
if not src.get_active():
self.vmm.resume()
else:
print "Pause requested, but machine is already paused"
else:
if src.get_active():
self.vmm.suspend()
else:
print "Resume requested, but machine is already running"
def control_vm_console(self, src):
return 0
def control_vm_snapshot(self, src):
return 0
def change_graph_ranges(self, ignore1=None,ignore2=None,ignore3=None,ignore4=None):
self.cpu_usage_graph.clear()
#self.cpu_usage_graph.set_xlabel('History')
@ -165,11 +312,40 @@ class vmmDetails:
self.network_traffic_graph.grid(True)
self.network_traffic_line = None
def update_widget_states(self, status):
if self.lastStatus == status:
return
if status == "shutoff":
self.window.get_widget("control-run").set_sensitive(True)
else:
self.window.get_widget("control-run").set_sensitive(False)
if status in [ "shutoff", "shutdown" ]:
self.window.get_widget("control-pause").set_sensitive(False)
self.window.get_widget("control-shutdown").set_sensitive(False)
self.window.get_widget("control-console").set_sensitive(False)
self.window.get_widget("control-snapshot").set_sensitive(False)
else:
self.window.get_widget("control-pause").set_sensitive(True)
self.window.get_widget("control-shutdown").set_sensitive(True)
self.window.get_widget("control-console").set_sensitive(True)
self.window.get_widget("control-snapshot").set_sensitive(True)
if status == "paused":
self.window.get_widget("control-pause").set_active(True)
else:
self.window.get_widget("control-pause").set_active(False)
self.lastStatus = status
def refresh_overview(self, vmname):
if not(vmname == self.vmname):
return
self.window.get_widget("overview-status-text").set_text(self.stats.run_status(vmname))
status = self.stats.run_status(vmname)
self.update_widget_states(status)
self.window.get_widget("overview-status-text").set_text(status)
self.window.get_widget("overview-status-icon").set_from_pixbuf(self.stats.run_status_icon(vmname))
self.window.get_widget("overview-cpu-usage-text").set_text("%d %%" % self.stats.cpu_time_percentage(vmname))
self.window.get_widget("overview-memory-usage-text").set_text("%d MB of %d MB" % (self.stats.current_memory(vmname)/1024, self.stats.host_memory_size()/1024))
@ -271,6 +447,7 @@ class vmmManager:
self.about = None
self.preferences = None
self.details = {}
self.consoles = {}
# Setup update timers
self.conf.on_stats_update_interval_changed(self.change_timer_interval)
@ -306,6 +483,7 @@ class vmmManager:
"on_menu_file_quit_activate": self.exit_app,
"on_vmm_close_clicked": self.exit_app,
"on_vm_details_clicked": self.show_vm_details,
"on_vm_open_clicked": self.open_vm_console,
"on_menu_edit_details_activate": self.show_vm_details,
"on_menu_edit_preferences_activate": self.show_preferences,
@ -371,6 +549,13 @@ class vmmManager:
self.details[vmname].show()
def open_vm_console(self,ignore):
vmname = self.current_vm()
if not(self.consoles.has_key(vmname)):
self.consoles[vmname] = vmmConsole(self.vmm, self.stats, self.conf, vmname)
self.consoles[vmname].show()
def change_timer_interval(self,ignore1,ignore2,ignore3,ignore4):
print "Removing timer"
gobject.source_remove(self.timer)
@ -388,8 +573,7 @@ class vmmManager:
#self.window.get_widget("vm-delete").set_sensitive(True)
self.window.get_widget("vm-delete").set_sensitive(False)
self.window.get_widget("vm-details").set_sensitive(True)
#self.window.get_widget("vm-open").set_sensitive(True)
self.window.get_widget("vm-open").set_sensitive(False)
self.window.get_widget("vm-open").set_sensitive(True)
#self.window.get_widget("menu_edit_delete").set_sensitive(True)
self.window.get_widget("menu_edit_delete").set_sensitive(False)
self.window.get_widget("menu_edit_details").set_sensitive(True)