[Ovirt-devel] [PATCH] Added Tasks tab/pane to HW and VM pools pages
Scott Seago
sseago at redhat.com
Tue Aug 26 15:24:45 UTC 2008
A tasks pane is now available on both VM and HW pools page. In both cases, the tasks show up as a flexigrid panel showing tasks for the pool. By default, tasks are filtered for 'pending' state, but they may be filtered on any state (or to show all). For the VM page, all tasks for all VMs in the VM pool are available. For the HW pool page, there are 3 types of tasks available:
1) VM tasks: tasks for all VMs contained in VM pools within this HW pool
2) Host tasks: tasks for all hosts in this pool
3) storage tasks: tasks for all storage pools in this HW pool.
By default all task types are shown, but the pulldown menu lets the user filter on task type as well.
Signed-off-by: Scott Seago <sseago at redhat.com>
---
wui/src/app/controllers/application.rb | 8 ++-
wui/src/app/controllers/hardware_controller.rb | 61 +++++++++++++----
wui/src/app/controllers/resources_controller.rb | 54 +++++++++++----
wui/src/app/models/hardware_pool.rb | 3 +-
wui/src/app/models/host_task.rb | 6 ++-
wui/src/app/models/storage_task.rb | 5 +-
wui/src/app/models/task.rb | 14 ++++
wui/src/app/models/vm_resource_pool.rb | 2 +-
wui/src/app/models/vm_task.rb | 5 +-
wui/src/app/views/hardware/show_tasks.rhtml | 77 ++++++++++++++++++++++
wui/src/app/views/layouts/_navigation_tabs.rhtml | 2 +
wui/src/app/views/resources/show_tasks.rhtml | 61 +++++++++++++++++
wui/src/app/views/task/_grid.rhtml | 50 ++++++++++++++
13 files changed, 313 insertions(+), 35 deletions(-)
create mode 100644 wui/src/app/views/hardware/show_tasks.rhtml
create mode 100644 wui/src/app/views/resources/show_tasks.rhtml
create mode 100644 wui/src/app/views/task/_grid.rhtml
diff --git a/wui/src/app/controllers/application.rb b/wui/src/app/controllers/application.rb
index b27ddbe..b95577a 100644
--- a/wui/src/app/controllers/application.rb
+++ b/wui/src/app/controllers/application.rb
@@ -90,7 +90,7 @@ class ApplicationController < ActionController::Base
end
# don't define find_opts for array inputs
- def json_list(full_items, attributes, arg_list=[], find_opts={})
+ def json_hash(full_items, attributes, arg_list=[], find_opts={})
page = params[:page].to_i
paginate_opts = {:page => page,
:order => "#{params[:sortname]} #{params[:sortorder]}",
@@ -114,7 +114,11 @@ class ApplicationController < ActionController::Base
end
item_hash
end
- render :json => json_hash.to_json
+ json_hash
+ end
+ # don't define find_opts for array inputs
+ def json_list(full_items, attributes, arg_list=[], find_opts={})
+ render :json => json_hash(full_items, attributes, arg_list, find_opts).to_json
end
diff --git a/wui/src/app/controllers/hardware_controller.rb b/wui/src/app/controllers/hardware_controller.rb
index 019fdd8..00fe06b 100644
--- a/wui/src/app/controllers/hardware_controller.rb
+++ b/wui/src/app/controllers/hardware_controller.rb
@@ -24,19 +24,13 @@ class HardwareController < ApplicationController
:redirect_to => { :action => :list }
before_filter :pre_json, :only => [:vm_pools_json, :users_json,
- :storage_volumes_json]
+ :storage_volumes_json, :show_tasks, :tasks]
before_filter :pre_modify, :only => [:add_hosts, :move_hosts,
:add_storage, :move_storage,
:create_storage, :delete_storage]
def show
- set_perms(@perm_obj)
- unless @can_view
- flash[:notice] = 'You do not have permission to view this hardware pool: redirecting to top level'
- redirect_to :controller => "dashboard"
- return
- end
if params[:ajax]
render :layout => 'tabs-and-content'
end
@@ -104,14 +98,47 @@ class HardwareController < ApplicationController
@hardware_pools = HardwarePool.find :all
end
+ def show_tasks
+ @task_types = [["VM Task", "VmTask"],
+ ["Host Task", "HostTask"],
+ ["Storage Task", "StorageTask", "break"],
+ ["Show All", ""]]
+ @task_states = [["Queued", Task::STATE_QUEUED],
+ ["Running", Task::STATE_RUNNING],
+ ["Paused", Task::STATE_PAUSED],
+ ["Finished", Task::STATE_FINISHED],
+ ["Failed", Task::STATE_FAILED],
+ ["Canceled", Task::STATE_CANCELED, "break"],
+ ["Show All", ""]]
+ params[:page]=1
+ params[:sortname]="tasks.created_at"
+ params[:sortorder]="desc"
+ @tasks = tasks_internal
+ show
+ end
+
+ def tasks
+ render :json => tasks_internal.to_json
+ end
+
+ def tasks_internal
+ @task_type = params[:task_type]
+ @task_type ||=""
+ @task_state = params[:task_state]
+ @task_state ||=Task::STATE_QUEUED
+ conditions = {}
+ conditions[:type] = @task_type unless @task_type.empty?
+ conditions[:state] = @task_state unless @task_state.empty?
+ find_opts = {:include => [:storage_pool, :host, :vm]}
+ find_opts[:conditions] = conditions unless conditions.empty?
+ attr_list = []
+ attr_list << :id if params[:checkboxes]
+ attr_list += [:type_label, :task_obj, :action, :state, :user, :created_at, :args, :message]
+ json_hash(@pool.tasks, attr_list, [:all], find_opts)
+ end
+
def quick_summary
pre_show
- set_perms(@perm_obj)
- unless @can_view
- flash[:notice] = 'You do not have permission to view this Hardware Pool: redirecting to top level'
- redirect_to :action => 'list'
- return
- end
render :layout => 'selection'
end
@@ -352,10 +379,16 @@ class HardwareController < ApplicationController
@pool = HardwarePool.find(params[:id])
@perm_obj = @pool
@current_pool_id=@pool.id
+ set_perms(@perm_obj)
+ unless @can_view
+ flash[:notice] = 'You do not have permission to view this Hardware Pool: redirecting to top level'
+ # FIXME: figure out the return type and render appropriately
+ redirect_to :action => 'list'
+ return
+ end
end
def pre_json
pre_show
- show
end
def pre_modify
pre_edit
diff --git a/wui/src/app/controllers/resources_controller.rb b/wui/src/app/controllers/resources_controller.rb
index 20defca..5a8276c 100644
--- a/wui/src/app/controllers/resources_controller.rb
+++ b/wui/src/app/controllers/resources_controller.rb
@@ -23,7 +23,8 @@ class ResourcesController < ApplicationController
render :action => 'list'
end
- before_filter :pre_json, :only => [:vms_json, :users_json]
+ before_filter :pre_json, :only => [:vms_json, :users_json,
+ :show_tasks, :tasks]
before_filter :pre_vm_actions, :only => [:vm_actions]
# GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
@@ -44,16 +45,10 @@ class ResourcesController < ApplicationController
# resource's summary page
def show
- set_perms(@perm_obj)
- @is_hwpool_admin = @vm_resource_pool.parent.can_modify(@user)
@action_values = [["Suspend", VmTask::ACTION_SUSPEND_VM],
["Resume", VmTask::ACTION_RESUME_VM],
["Save", VmTask::ACTION_SAVE_VM],
["Restore", VmTask::ACTION_RESTORE_VM]]
- unless @can_view
- flash[:notice] = 'You do not have permission to view this VM Resource Pool: redirecting to top level'
- redirect_to :action => 'list'
- end
if params[:ajax]
render :layout => 'tabs-and-content'
end
@@ -64,12 +59,6 @@ class ResourcesController < ApplicationController
def quick_summary
pre_show
- set_perms(@perm_obj)
- @is_hwpool_admin = @vm_resource_pool.parent.can_modify(@user)
- unless @can_view
- flash[:notice] = 'You do not have permission to view this VM Resource Pool: redirecting to top level'
- redirect_to :action => 'list'
- end
render :layout => 'selection'
end
@@ -90,6 +79,38 @@ class ResourcesController < ApplicationController
show
end
+ def show_tasks
+ @task_states = [["Queued", Task::STATE_QUEUED],
+ ["Running", Task::STATE_RUNNING],
+ ["Paused", Task::STATE_PAUSED],
+ ["Finished", Task::STATE_FINISHED],
+ ["Failed", Task::STATE_FAILED],
+ ["Canceled", Task::STATE_CANCELED, "break"],
+ ["Show All", ""]]
+ params[:page]=1
+ params[:sortname]="tasks.created_at"
+ params[:sortorder]="desc"
+ @tasks = tasks_internal
+ show
+ end
+
+ def tasks
+ render :json => tasks_internal.to_json
+ end
+
+ def tasks_internal
+ @task_state = params[:task_state]
+ @task_state ||=Task::STATE_QUEUED
+ conditions = {}
+ conditions[:state] = @task_state unless @task_state.empty?
+ find_opts = {:include => [:storage_pool, :host, :vm]}
+ find_opts[:conditions] = conditions unless conditions.empty?
+ attr_list = []
+ attr_list << :id if params[:checkboxes]
+ attr_list += [:type_label, :task_obj, :action, :state, :user, :created_at, :args, :message]
+ json_hash(@vm_resource_pool.tasks, attr_list, [:all], find_opts)
+ end
+
def vms_json
json_list(@vm_resource_pool.vms,
[:id, :description, :uuid, :num_vcpus_allocated, :memory_allocated_in_mb, :vnic_mac_addr, :state, :id])
@@ -208,6 +229,12 @@ class ResourcesController < ApplicationController
@vm_resource_pool = VmResourcePool.find(params[:id])
@perm_obj = @vm_resource_pool
@current_pool_id=@vm_resource_pool.id
+ set_perms(@perm_obj)
+ @is_hwpool_admin = @vm_resource_pool.parent.can_modify(@user)
+ unless @can_view
+ flash[:notice] = 'You do not have permission to view this VM Resource Pool: redirecting to top level'
+ redirect_to :action => 'dashboard'
+ end
end
def pre_edit
@vm_resource_pool = VmResourcePool.find(params[:id])
@@ -218,7 +245,6 @@ class ResourcesController < ApplicationController
end
def pre_json
pre_show
- show
end
def pre_vm_actions
@vm_resource_pool = VmResourcePool.find(params[:id])
diff --git a/wui/src/app/models/hardware_pool.rb b/wui/src/app/models/hardware_pool.rb
index 3678420..a4c921b 100644
--- a/wui/src/app/models/hardware_pool.rb
+++ b/wui/src/app/models/hardware_pool.rb
@@ -19,7 +19,7 @@
class HardwarePool < Pool
- has_many :tasks, :dependent => :nullify, :order => "id ASC"
+ has_many :tasks, :dependent => :nullify
def all_storage_volumes
StorageVolume.find(:all, :include => {:storage_pool => :hardware_pool}, :conditions => "pools.id = #{id}")
end
@@ -98,4 +98,5 @@ class HardwarePool < Pool
return {:total => total, :labels => labels}
end
+
end
diff --git a/wui/src/app/models/host_task.rb b/wui/src/app/models/host_task.rb
index ae597b0..0aea41b 100644
--- a/wui/src/app/models/host_task.rb
+++ b/wui/src/app/models/host_task.rb
@@ -18,11 +18,15 @@
# also available at http://www.gnu.org/copyleft/gpl.html.
class HostTask < Task
- belongs_to :host
ACTION_CLEAR_VMS = "clear_vms"
def after_initialize
self.hardware_pool = host.hardware_pool if self.host
end
+
+ def task_obj
+ "Host;;;#{self.host.id};;;#{self.host.hostname}"
+ end
+
end
diff --git a/wui/src/app/models/storage_task.rb b/wui/src/app/models/storage_task.rb
index e57b6de..db604d5 100644
--- a/wui/src/app/models/storage_task.rb
+++ b/wui/src/app/models/storage_task.rb
@@ -18,11 +18,14 @@
# also available at http://www.gnu.org/copyleft/gpl.html.
class StorageTask < Task
- belongs_to :storage_pool
ACTION_REFRESH_POOL = "refresh_pool"
def after_initialize
self.hardware_pool = storage_pool.hardware_pool if self.storage_pool
end
+
+ def task_obj
+ "StoragePool;;;#{self.storage_pool.id};;;#{self.storage_pool.display_name}"
+ end
end
diff --git a/wui/src/app/models/task.rb b/wui/src/app/models/task.rb
index a7faaf0..efbed64 100644
--- a/wui/src/app/models/task.rb
+++ b/wui/src/app/models/task.rb
@@ -20,6 +20,13 @@
class Task < ActiveRecord::Base
belongs_to :hardware_pool
belongs_to :vm_resource_pool
+ # moved associations here so that nested set :include directives work
+ # StorageTask association
+ belongs_to :storage_pool
+ # HostTask association
+ belongs_to :host
+ # VmTask association
+ belongs_to :vm
STATE_QUEUED = "queued"
STATE_RUNNING = "running"
@@ -50,4 +57,11 @@ class Task < ActiveRecord::Base
Task.find(:all, :conditions => conditions)
end
+ def type_label
+ self.class.name[0..-5]
+ end
+ def task_obj
+ ""
+ end
+
end
diff --git a/wui/src/app/models/vm_resource_pool.rb b/wui/src/app/models/vm_resource_pool.rb
index fff6dac..d6acf80 100644
--- a/wui/src/app/models/vm_resource_pool.rb
+++ b/wui/src/app/models/vm_resource_pool.rb
@@ -19,7 +19,7 @@
class VmResourcePool < Pool
- has_many :tasks, :dependent => :nullify, :order => "id ASC"
+ has_many :tasks, :dependent => :nullify
def get_type_label
"Virtual Machine Pool"
end
diff --git a/wui/src/app/models/vm_task.rb b/wui/src/app/models/vm_task.rb
index ab96e6f..31c4ac8 100644
--- a/wui/src/app/models/vm_task.rb
+++ b/wui/src/app/models/vm_task.rb
@@ -18,7 +18,6 @@
# also available at http://www.gnu.org/copyleft/gpl.html.
class VmTask < Task
- belongs_to :vm
ACTION_CREATE_VM = "create_vm"
@@ -114,6 +113,10 @@ class VmTask < Task
end
end
+ def task_obj
+ "Vm;;;#{self.vm.id};;;#{self.vm.description}"
+ end
+
def self.valid_actions_for_vm_state(state, vm=nil, user=nil)
actions = []
ACTIONS.each do |action, hash|
diff --git a/wui/src/app/views/hardware/show_tasks.rhtml b/wui/src/app/views/hardware/show_tasks.rhtml
new file mode 100644
index 0000000..e49086c
--- /dev/null
+++ b/wui/src/app/views/hardware/show_tasks.rhtml
@@ -0,0 +1,77 @@
+<div id="toolbar_nav">
+ <ul>
+ <li>
+ <%= image_tag "icon_move.png", :style => "vertical-align:middle;" %> Type <%= image_tag "icon_toolbar_arrow.gif", :style => "vertical-align:middle;" %>
+ <ul>
+ <% @task_types.each_index { |index| %>
+ <li onclick="apply_task_filter('<%=@task_types[index][1]%>','<%=@task_state%>');";"
+ <% if (index == @task_types.length - 1) or @task_types[index].length == 3 %>
+ style="border-bottom: 1px solid #CCCCCC;"
+ <% end %>
+ >
+<!-- < % = image_tag ... -->
+ <%= @task_type == @task_types[index][1] ? "X" : " " %>
+ <%=@task_types[index][0]%>
+ </li>
+ <% } %>
+ </ul>
+ </li>
+ <li>
+ <%= image_tag "icon_move.png", :style => "vertical-align:middle;" %> State <%= image_tag "icon_toolbar_arrow.gif", :style => "vertical-align:middle;" %>
+ <ul>
+ <% @task_states.each_index { |index| %>
+ <li onclick="apply_task_filter('<%=@task_type%>','<%=@task_states[index][1]%>');";"
+ <% if (index == @task_states.length - 1) or @task_states[index].length == 3 %>
+ style="border-bottom: 1px solid #CCCCCC;"
+ <% end %>
+ >
+<!-- < % = image_tag ... -->
+ <%= @task_state == @task_states[index][1] ? "X" : " " %>
+ <%=@task_states[index][0]%>
+ </li>
+ <% } %>
+ </ul>
+ </li>
+ </ul>
+</div>
+
+<script type="text/javascript">
+ var $tabs
+ function apply_task_filter(task_type, task_state)
+ {
+ $tabs.tabs("url", $tabs.data("selected.tabs"),
+ "<%= url_for :action => 'show_tasks', :id => @pool.id,
+ :nolayout => :true %>" +
+ "&task_type=" + task_type + "&task_state=" + task_state);
+ $tabs.tabs("load", $tabs.data("selected.tabs"));
+ }
+</script>
+
+<div class="panel_header"></div>
+<% if @tasks[:rows].size != 0 %>
+ <div class="data_section">
+ <%= render :partial => "/task/grid", :locals => { :table_id => "tasks_grid",
+ :task_type => @task_type,
+ :task_state => @task_state,
+ :pool => @pool,
+ :checkboxes => false,
+ :on_select => "tasks_grid_select" } %>
+ </div>
+<!-- do we have a selection here?
+ <div class="selection_detail" id="hosts_selection">
+ <div class="selection_left">
+ <div>Select a host above.</div>
+ </div>
+ </div> -->
+<% else %>
+ <div class="data_section">
+ <div class="no-grid-items">
+ <%= image_tag 'no-grid-items.png', :style => 'float: left;' %>
+
+ <div class="no-grid-items-text">
+ No tasks found. <br/><br/>
+ <%= image_tag "icon_addhost.png", :style=>"vertical-align:middle;" %>
+ </div>
+ </div>
+ </div>
+<% end %>
diff --git a/wui/src/app/views/layouts/_navigation_tabs.rhtml b/wui/src/app/views/layouts/_navigation_tabs.rhtml
index 771958c..629ab93 100644
--- a/wui/src/app/views/layouts/_navigation_tabs.rhtml
+++ b/wui/src/app/views/layouts/_navigation_tabs.rhtml
@@ -13,6 +13,7 @@
<li id="nav_storage"><%= link_to "Storage", {:action => 'show_storage', :id => @pool.id, :nolayout => :true}, :title => "content area" %></li>
<li id="nav_vmpool"> <%= link_to "Virtual Machine Pools", {:action => 'show_vms', :id => @pool.id, :nolayout => :true}, :title => "content area" %></li>
<li id="nav_access"> <%= link_to "User Access", {:action => 'show_users', :id => @pool.id, :nolayout => :true}, :title => "content area" %></li>
+ <li id="nav_tasks"> <%= link_to "Tasks", {:action => 'show_tasks', :id => @pool.id, :nolayout => :true}, :title => "content area" %></li>
</ul>
<% elsif controller.controller_name == "resources" and @vm_resource_pool != nil %>
<script>
@@ -27,6 +28,7 @@
<li id="nav_summary" class="ui-tabs-selected"><%= link_to "Summary", {:action => 'show', :id => @vm_resource_pool.id, :nolayout => :true}, :title => "content area" %></li>
<li id="nav_vmpool"> <%= link_to "Virtual Machines", {:action => 'show_vms', :id => @vm_resource_pool.id, :nolayout => :true}, :title => "content area" %></li>
<li id="nav_access"> <%= link_to "User Access", {:action => 'show_users', :id => @vm_resource_pool.id, :nolayout => :true}, :title => "content area" %></li>
+ <li id="nav_tasks"> <%= link_to "Tasks", {:action => 'show_tasks', :id => @vm_resource_pool.id, :nolayout => :true}, :title => "content area" %></li>
</ul>
<% elsif controller.controller_name == "search" %>
<ul id="resources_nav_tabs" class="ui-tabs-nav">
diff --git a/wui/src/app/views/resources/show_tasks.rhtml b/wui/src/app/views/resources/show_tasks.rhtml
new file mode 100644
index 0000000..493264b
--- /dev/null
+++ b/wui/src/app/views/resources/show_tasks.rhtml
@@ -0,0 +1,61 @@
+<div id="toolbar_nav">
+ <ul>
+ <li>
+ <%= image_tag "icon_move.png", :style => "vertical-align:middle;" %> State <%= image_tag "icon_toolbar_arrow.gif", :style => "vertical-align:middle;" %>
+ <ul>
+ <% @task_states.each_index { |index| %>
+ <li onclick="apply_task_state_filter('<%=@task_states[index][1]%>');";"
+ <% if (index == @task_states.length - 1) or @task_states[index].length == 3 %>
+ style="border-bottom: 1px solid #CCCCCC;"
+ <% end %>
+ >
+<!-- < % = image_tag ... -->
+ <%= @task_state == @task_states[index][1] ? "X" : " " %>
+ <%=@task_states[index][0]%>
+ </li>
+ <% } %>
+ </ul>
+ </li>
+ </ul>
+</div>
+
+<script type="text/javascript">
+ var $tabs
+ function apply_task_state_filter(task_state)
+ {
+ $tabs.tabs("url", $tabs.data("selected.tabs"),
+ "<%= url_for :action => 'show_tasks', :id => @vm_resource_pool.id,
+ :nolayout => :true %>" +
+ "&task_state=" + task_state);
+ $tabs.tabs("load", $tabs.data("selected.tabs"));
+ }
+</script>
+
+<div class="panel_header"></div>
+<% if @tasks[:rows].size != 0 %>
+ <div class="data_section">
+ <%= render :partial => "/task/grid", :locals => { :table_id => "vm_tasks_grid",
+ :task_type => nil,
+ :task_state => @task_state,
+ :pool => @vm_resource_pool,
+ :checkboxes => false,
+ :on_select => "vm_tasks_grid_select" } %>
+ </div>
+<!-- do we have a selection here?
+ <div class="selection_detail" id="hosts_selection">
+ <div class="selection_left">
+ <div>Select a host above.</div>
+ </div>
+ </div> -->
+<% else %>
+ <div class="data_section">
+ <div class="no-grid-items">
+ <%= image_tag 'no-grid-items.png', :style => 'float: left;' %>
+
+ <div class="no-grid-items-text">
+ No tasks found. <br/><br/>
+ <%= image_tag "icon_addhost.png", :style=>"vertical-align:middle;" %>
+ </div>
+ </div>
+ </div>
+<% end %>
diff --git a/wui/src/app/views/task/_grid.rhtml b/wui/src/app/views/task/_grid.rhtml
new file mode 100644
index 0000000..cab99e5
--- /dev/null
+++ b/wui/src/app/views/task/_grid.rhtml
@@ -0,0 +1,50 @@
+<% tasks_per_page = 40 %>
+<div id="<%= table_id %>_div">
+<%= "<form id=\"#{table_id}_form\">" if checkboxes %>
+<table id="<%= table_id %>" style="display:none"></table>
+<%= '</form>' if checkboxes %>
+</div>
+<script type="text/javascript">
+ $("#<%= table_id %>").flexigrid
+ (
+ {
+ url: '<%= url_for :action => "tasks",
+ :id => pool.id %>',
+ params: [{name: "task_type", value: '<%=task_type%>'},
+ {name: "task_state", value: '<%=task_state%>'}
+ <%=", {name: 'checkboxes', value: #{checkboxes}}" if checkboxes%>],
+ dataType: 'json',
+ colModel : [
+ <%= "{display: '', width : 20, align: 'left', process: #{table_id}checkbox}," if checkboxes %>
+ {display: 'Type', width : 80, align: 'left'},
+ {display: 'Item', width : 120, align: 'right', process: <%= table_id%>item},
+ {display: 'Action', name : 'action', width : 80, align: 'left'},
+ {display: 'State', name : 'state', width : 60, align: 'left'},
+ {display: 'User', name : 'user', width : 60, align: 'right'},
+ {display: 'Created', name : 'tasks.created_at', width : 140, align: 'right'},
+ {display: 'Args', name : 'args', width : 180, align: 'left'},
+ {display: 'Message', name : 'message', width : 180, align: 'left'}
+ ],
+ sortname: "tasks.created_at",
+ sortorder: "desc",
+ usepager: true,
+ useRp: true,
+ rp: <%= tasks_per_page %>,
+ showTableToggleBtn: true,
+ onSelect: <%= on_select %>
+ }
+ );
+ function <%= table_id %>checkbox(celDiv)
+ {
+ $(celDiv).html('<input class="grid_checkbox" type="checkbox" name="grid_checkbox'+$(celDiv).html()+'" value="'+$(celDiv).html()+'"/>');
+ }
+ function <%= table_id %>item(celDiv)
+ {
+ $(celDiv).html($(celDiv).html().split(";;;")[2]);
+ }
+ function <%= table_id %>_select(celDiv)
+ {
+ //nothing now
+ };
+
+</script>
--
1.5.5.1
More information about the ovirt-devel
mailing list