Scott Seago
2008-Jun-24 17:36 UTC
[Ovirt-devel] [PATCH] added logic around when to show the 'clear host' link:
link will show unless: 1) there's already a pending clear VM task for this host or 2) host is disabled and there are no VMs running or 3) host is unavailable Signed-off-by: Scott Seago <sseago at redhat.com> --- wui/src/app/controllers/vm_controller.rb | 2 +- wui/src/app/models/host.rb | 30 ++++++++++++++++++++++++++++-- wui/src/app/models/storage_pool.rb | 10 +++++----- wui/src/app/models/vm.rb | 24 ++++++------------------ wui/src/app/views/host/show.rhtml | 16 +++++++++------- wui/src/host-browser/host-browser.rb | 2 +- wui/src/host-status/host-status.rb | 8 ++++---- 7 files changed, 54 insertions(+), 38 deletions(-) diff --git a/wui/src/app/controllers/vm_controller.rb b/wui/src/app/controllers/vm_controller.rb index c12686a..b9156d2 100644 --- a/wui/src/app/controllers/vm_controller.rb +++ b/wui/src/app/controllers/vm_controller.rb @@ -163,7 +163,7 @@ class VmController < ApplicationController def cancel_queued_tasks begin Task.transaction do - @vm.get_queued_tasks.each { |task| task.cancel} + @vm.tasks.queued.each { |task| task.cancel} end render :json => { :object => "vm", :success => true, :alert => "queued tasks were canceled." } rescue diff --git a/wui/src/app/models/host.rb b/wui/src/app/models/host.rb index efee14a..6917226 100644 --- a/wui/src/app/models/host.rb +++ b/wui/src/app/models/host.rb @@ -22,10 +22,26 @@ require 'util/ovirt' class Host < ActiveRecord::Base belongs_to :hardware_pool has_many :nics, :dependent => :destroy - has_many :vms, :dependent => :nullify + has_many :vms, :dependent => :nullify do + def consuming_resources + find(:all, :conditions=>{:state=>Vm::RUNNING_STATES}) + end + end + has_many :tasks, :class_name => "HostTask", :dependent => :destroy, :order => "id DESC" do + def queued + find(:all, :conditions=>{:state=>Task::STATE_QUEUED}) + end + def pending_clear_tasks + find(:all, :conditions=>{:state=>Task::WORKING_STATES, + :action=>HostTask::ACTION_CLEAR_VMS}) + end + end KVM_HYPERVISOR_TYPE = "KVM" HYPERVISOR_TYPES = [KVM_HYPERVISOR_TYPE] + STATE_UNAVAILABLE = "unavailable" + STATE_AVAILABLE = "available" + STATES = [STATE_UNAVAILABLE, STATE_AVAILABLE] def memory_in_mb kb_to_mb(memory) end @@ -33,6 +49,16 @@ class Host < ActiveRecord::Base self[:memory]=(mb_to_kb(mem)) end def status_str - "#{state} (#{(is_disabled.nil? or is_disabled==0) ? 'enabled':'disabled'})" + "#{state} (#{disabled? ? 'disabled':'enabled'})" + end + + def disabled? + not(is_disabled.nil? or is_disabled==0) + end + + def is_clear_task_valid? + state==STATE_AVAILABLE and + not(disabled? and vms.consuming_resources.empty?) and + tasks.pending_clear_tasks.empty? end end diff --git a/wui/src/app/models/storage_pool.rb b/wui/src/app/models/storage_pool.rb index 27479ee..a135047 100644 --- a/wui/src/app/models/storage_pool.rb +++ b/wui/src/app/models/storage_pool.rb @@ -19,7 +19,11 @@ class StoragePool < ActiveRecord::Base belongs_to :hardware_pool - has_many :storage_tasks, :dependent => :destroy, :order => "id DESC" + has_many :tasks, :class_name => "StorageTask", :dependent => :destroy, :order => "id DESC" do + def queued + find(:all, :conditions=>{:state=>Task::STATE_QUEUED}) + end + end has_many :storage_volumes, :dependent => :destroy, :include => :storage_pool do def total_size_in_gb find(:all).inject(0){ |sum, sv| sum + sv.size_in_gb } @@ -51,8 +55,4 @@ class StoragePool < ActiveRecord::Base def get_type_label STORAGE_TYPES.invert[self.class.name.gsub("StoragePool", "")] end - - def tasks - storage_tasks - end end diff --git a/wui/src/app/models/vm.rb b/wui/src/app/models/vm.rb index ae4e8ff..617512e 100644 --- a/wui/src/app/models/vm.rb +++ b/wui/src/app/models/vm.rb @@ -22,7 +22,11 @@ require 'util/ovirt' class Vm < ActiveRecord::Base belongs_to :vm_resource_pool belongs_to :host - has_many :vm_tasks, :dependent => :destroy, :order => "id DESC" + has_many :tasks, :class_name => "VmTask", :dependent => :destroy, :order => "id DESC" do + def queued + find(:all, :conditions=>{:state=>Task::STATE_QUEUED}) + end + end has_and_belongs_to_many :storage_volumes validates_presence_of :uuid, :description, :num_vcpus_allocated, :memory_allocated_in_mb, :memory_allocated, :vnic_mac_addr @@ -107,7 +111,7 @@ class Vm < ActiveRecord::Base def get_pending_state pending_state = state pending_state = EFFECTIVE_STATE[state] if pending_state - get_queued_tasks.each do |task| + tasks.queued.each do |task| return STATE_INVALID unless VmTask::ACTIONS[task.action][:start] == pending_state pending_state = VmTask::ACTIONS[task.action][:success] end @@ -122,18 +126,6 @@ class Vm < ActiveRecord::Base RUNNING_STATES.include?(get_pending_state) end - def get_queued_tasks(state=nil) - get_tasks(Task::STATE_QUEUED) - end - - def get_tasks(state=nil) - conditions = "vm_id = '#{id}'" - conditions += " AND state = '#{Task::STATE_QUEUED}'" if state - VmTask.find(:all, - :conditions => conditions, - :order => "id") - end - def get_action_list # return empty list rather than nil return_val = VmTask::VALID_ACTIONS_PER_VM_STATE[get_pending_state] || [] @@ -166,10 +158,6 @@ class Vm < ActiveRecord::Base return return_val end - def tasks - vm_tasks - end - def queue_action(user, action) return false unless get_action_list.include?(action) task = VmTask.new({ :user => user, diff --git a/wui/src/app/views/host/show.rhtml b/wui/src/app/views/host/show.rhtml index 619a126..e1bafac 100644 --- a/wui/src/app/views/host/show.rhtml +++ b/wui/src/app/views/host/show.rhtml @@ -3,18 +3,20 @@ <%- end -%> <%- content_for :action_links do -%> <%if @can_modify -%> - <%if @host.is_disabled.nil? or @host.is_disabled == 0 -%> + <%if @host.disabled? -%> + <a href="#" onClick="host_action('enable')"> + <%= image_tag "icon_start.png" %> Enable Host + </a> + <% else -%> <a href="#" onClick="host_action('disable')"> <%= image_tag "icon_suspend.png" %> Disable Host </a> - <% else -%> - <a href="#" onClick="host_action('enable')"> - <%= image_tag "icon_start.png" %> Enable Host + <% end -%> + <%if @host.is_clear_task_valid? -%> + <a href="#" onClick="host_action('clear_vms')"> + <%= image_tag "icon_x.png" %> Clear VMs </a> <% end -%> - <a href="#" onClick="host_action('clear_vms')"> - <%= image_tag "icon_x.png" %> Clear VMs - </a> <%- end -%> <%- end -%> <script type="text/javascript"> diff --git a/wui/src/host-browser/host-browser.rb b/wui/src/host-browser/host-browser.rb index e127ddb..6d576fd 100755 --- a/wui/src/host-browser/host-browser.rb +++ b/wui/src/host-browser/host-browser.rb @@ -113,7 +113,7 @@ class HostBrowser "hardware_pool" => HardwarePool.get_default_pool, # Let host-status mark it available when it # successfully connects to it via libvirt. - "state" => "unavailable").save + "state" => Host::STATE_UNAVAILABLE).save rescue Exception => error puts "Error while creating record: #{error.message}" end diff --git a/wui/src/host-status/host-status.rb b/wui/src/host-status/host-status.rb index fcfd586..7908da7 100755 --- a/wui/src/host-status/host-status.rb +++ b/wui/src/host-status/host-status.rb @@ -110,9 +110,9 @@ def check_status(host) # we couldn't contact the host for whatever reason. Since we can't get # to this host, we have to mark all vms on it as disconnected or stopped # or such. - if host.state != "unavailable" + if host.state != Host::STATE_UNAVAILABLE puts "Updating host state to unavailable: " + host.hostname - host.state = "unavailable" + host.state = Host::STATE_UNAVAILABLE host.save end @@ -135,9 +135,9 @@ def check_status(host) return end - if host.state != "available" + if host.state != Host::STATE_AVAILABLE puts "Updating host state to available: " + host.hostname - host.state = "available" + host.state = Host::STATE_AVAILABLE host.save end -- 1.5.4.1
Jason Guiditta
2008-Jun-27 20:53 UTC
[Ovirt-devel] [PATCH] added logic around when to show the 'clear host' link:
On Tue, 2008-06-24 at 13:36 -0400, Scott Seago wrote:> link will show unless: > 1) there's already a pending clear VM task for this host or > 2) host is disabled and there are no VMs running or > 3) host is unavailableOk, surely I just did something dumb, but I can't get this patch to apply. I applied the previous one (working on a branch from 'next') w/o problem. I committed my changes locally, then tried to apply this patch. I then get: $ git apply sseago-3.patch sseago-3.patch:44: trailing whitespace. find(:all, :conditions=>{:state=>Task::WORKING_STATES, sseago-3.patch:169: trailing whitespace. </a> error: patch failed: wui/src/host-browser/host-browser.rb:113 error: wui/src/host-browser/host-browser.rb: patch does not apply Any ideas what I might be doing wrong? More info needed? -j