Scott Seago
2008-Jun-30 13:32 UTC
[Ovirt-devel] [PATCH](resend) added logic around when to show the 'clear host' link:
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 -- 1.5.5.1
Jason Guiditta
2008-Jun-30 20:15 UTC
[Ovirt-devel] [PATCH](resend) added logic around when to show the 'clear host' link:
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