[Ovirt-devel] [PATCH] initial support for "clear this VM" UI.

Scott Seago sseago at redhat.com
Mon Jun 23 16:02:04 UTC 2008


taskomatic bits are not in, so for now taskomatic should just fail these tasks as 'unknown task type'

Another bit to work out -- what should the logic be for when to show the 'clear this VM' task? Do we need to hide the link when:
1) there's already a pending clear VM task for this host
2) vm is disabled and there are no VMs running
3) vm is unavailable

Signed-off-by: Scott Seago <sseago at redhat.com>
---
 wui/src/app/controllers/application.rb     |    6 ++-
 wui/src/app/controllers/host_controller.rb |   62 +++++++++++++++++++++-------
 wui/src/app/views/host/show.rhtml          |   14 ++++---
 3 files changed, 60 insertions(+), 22 deletions(-)

diff --git a/wui/src/app/controllers/application.rb b/wui/src/app/controllers/application.rb
index a3a99a0..aa8fd7c 100644
--- a/wui/src/app/controllers/application.rb
+++ b/wui/src/app/controllers/application.rb
@@ -74,7 +74,11 @@ class ApplicationController < ActionController::Base
       unless (is_modify_action ? @can_modify : @can_control_vms)
         @redir_obj = @perm_obj unless @redir_obj
         flash[:notice] = 'You do not have permission to create or modify this item '
-        if @redir_controller
+        if @json_hash
+          @json_hash[:success] = false
+          @json_hash[:alert] = flash[:notice]
+          render :json => @json_hash
+        elsif @redir_controller
           redirect_to :controller => @redir_controller, :action => 'show', :id => @redir_obj
         else
           redirect_to :action => 'show', :id => @redir_obj
diff --git a/wui/src/app/controllers/host_controller.rb b/wui/src/app/controllers/host_controller.rb
index 8eb26b9..9e60b1f 100644
--- a/wui/src/app/controllers/host_controller.rb
+++ b/wui/src/app/controllers/host_controller.rb
@@ -23,6 +23,8 @@ class HostController < ApplicationController
     render :action => 'list'
   end
 
+  before_filter :pre_action, :only => [:host_action, :enable, :disable, :clear_vms]
+
   # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
   verify :method => :post, :only => [ :destroy, :create, :update ],
          :redirect_to => { :action => :list }
@@ -61,6 +63,17 @@ class HostController < ApplicationController
   def destroy
   end
 
+  def host_action
+    action = params[:action_type]
+    if["disable", "enable", "clear_vms"].include?(action)
+      self.send(action)
+    else
+      @json_hash[:alert]="invalid operation #{action}"
+      @json_hash[:success]=false
+      render :json => @json_hash
+    end
+  end
+
   def disable
     set_disabled(1)
   end
@@ -70,23 +83,36 @@ class HostController < ApplicationController
 
   def set_disabled(value)
     operation = value == 1 ? "diabled" : "enabled"
-    @host = Host.find(params[:id])
-    set_perms(@host.hardware_pool)
-    unless @can_modify
-      alert= 'You do not have permission to edit this host'
-      success=false
-    else
-      begin
-        @host.is_disabled = value
-        @host.save
-        alert="Host was successfully #{operation}"
-        success=true
-      rescue
-        alert="Error setting host to #{operation}"
-        success=false
+    begin
+      @host.is_disabled = value
+      @host.save!
+      @json_hash[:alert]="Host was successfully #{operation}"
+      @json_hash[:success]=true
+    rescue
+      @json_hash[:alert]="Error setting host to #{operation}"
+      @json_hash[:success]=false
+    end
+    render :json => @json_hash
+  end
+
+  def clear_vms
+    begin
+      Host.transaction do
+        task = HostTask.new({ :user    => get_login_user,
+                              :host_id   => @host.id,
+                              :action  => HostTask::ACTION_CLEAR_VMS,
+                              :state   => Task::STATE_QUEUED})
+        task.save!
+        @host.is_disabled = true
+        @host.save!
       end
+      @json_hash[:alert]="Clear VMs action was successfully queued."
+      @json_hash[:success]=true
+    rescue
+      @json_hash[:alert]="Error in queueing Clear VMs action."
+      @json_hash[:success]=false
     end
-    render :json => { :object => "host", :success => success, :alert => alert }
+    render :json => @json_hash
   end
 
 
@@ -105,6 +131,12 @@ class HostController < ApplicationController
     flash[:notice] = 'Hosts may not be edited via the web UI'
     redirect_to :action=> 'show', :id => @host
   end
+  def pre_action
+    @host = Host.find(params[:id])
+    @perm_obj = @host.hardware_pool
+    @json_hash = { :object => :host }
+    authorize_admin
+  end
   def pre_show
     @host = Host.find(params[:id])
     @perm_obj = @host.hardware_pool
diff --git a/wui/src/app/views/host/show.rhtml b/wui/src/app/views/host/show.rhtml
index 0903ac0..619a126 100644
--- a/wui/src/app/views/host/show.rhtml
+++ b/wui/src/app/views/host/show.rhtml
@@ -4,22 +4,24 @@
 <%- content_for :action_links do -%>
   <%if @can_modify -%>
     <%if @host.is_disabled.nil? or @host.is_disabled == 0  -%>
-      <a href="#" onClick="toggle_host(false)">
+      <a href="#" onClick="host_action('disable')">
         <%= image_tag "icon_suspend.png" %> Disable Host
       </a> 
     <% else -%>
-      <a href="#" onClick="toggle_host(true)">
+      <a href="#" onClick="host_action('enable')">
         <%= image_tag "icon_start.png" %> Enable Host
       </a> 
     <% end -%>
+    <a href="#" onClick="host_action('clear_vms')">
+      <%= image_tag "icon_x.png" %> Clear VMs
+    </a> 
   <%- end -%>
 <%- end -%>
 <script type="text/javascript">
-  function toggle_host(enable)
+  function host_action(action)
   {
-    enable_url = '<%= url_for :controller => "host", :action => "enable", :id => @host %>'
-    disable_url = '<%= url_for :controller => "host", :action => "disable", :id => @host %>'
-      $.post(enable ? enable_url : disable_url,
+      $.post('<%= url_for :controller => "host", :action => 'host_action', :id => @host%>',
+             { action_type: action },
               function(data,status){
                 refresh_summary('hosts_selection', 
                             '<%= url_for :controller => "host", 
-- 
1.5.4.1




More information about the ovirt-devel mailing list