[Ovirt-devel] [PATCH](resend) added logic around when to show the 'clear host' link:
Jason Guiditta
jguiditt at redhat.com
Mon Jun 30 20:15:24 UTC 2008
On Mon, 2008-06-30 at 09:32 -0400, Scott Seago wrote:
> Resending after rebase:
>
> 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 bcb7d60..691e4ed 100755
> --- a/wui/src/host-browser/host-browser.rb
> +++ b/wui/src/host-browser/host-browser.rb
> @@ -124,7 +124,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}" unless defined?(TESTING)
> 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
>
ACK, on testing, this appears to work as desired.
-j
More information about the ovirt-devel
mailing list