From: martyntaylor <mtaylor(a)redhat.com>
---
src/app/models/instance_observer.rb | 36 ++++++------
src/spec/models/instance_observer_spec.rb | 88 +++++++++++++++++++----------
2 files changed, 77 insertions(+), 47 deletions(-)
diff --git a/src/app/models/instance_observer.rb b/src/app/models/instance_observer.rb
index 610d742..ec13282 100644
--- a/src/app/models/instance_observer.rb
+++ b/src/app/models/instance_observer.rb
@@ -1,6 +1,7 @@
class InstanceObserver < ActiveRecord::Observer
ACTIVE_STATES = [ Instance::STATE_PENDING, Instance::STATE_RUNNING,
Instance::STATE_SHUTTING_DOWN, Instance::STATE_STOPPED ]
+ RUNNING_STATES = [ Instance::STATE_RUNNING, Instance::STATE_PENDING,
Instance::STATE_SHUTTING_DOWN ]
def before_save(an_instance)
if an_instance.changed?
@@ -41,24 +42,25 @@ class InstanceObserver < ActiveRecord::Observer
if parent
quota = parent.quota
if quota
- if state_to == Instance::STATE_RUNNING
- quota.running_instances += 1
- quota.running_memory = quota.running_memory.to_f + hwp.memory.value.to_f
- quota.running_cpus = quota.running_cpus.to_f + hwp.cpu.value.to_f
- elsif state_from == Instance::STATE_RUNNING
- quota.running_instances -= 1
- quota.running_memory = quota.running_memory.to_f - hwp.memory.value.to_f
- quota.running_cpus = quota.running_cpus.to_f - hwp.cpu.value.to_f
- end
+ quota.lock!
+ if RUNNING_STATES.include?(state_to) &&
!RUNNING_STATES.include?(state_from)
+ quota.running_instances += 1
+ quota.running_memory = quota.running_memory.to_f + hwp.memory.value.to_f
+ quota.running_cpus = quota.running_cpus.to_f + hwp.cpu.value.to_f
+ elsif !RUNNING_STATES.include?(state_to) &&
RUNNING_STATES.include?(state_from)
+ quota.running_instances -= 1
+ quota.running_memory = quota.running_memory.to_f - hwp.memory.value.to_f
+ quota.running_cpus = quota.running_cpus.to_f - hwp.cpu.value.to_f
+ end
- if state_from != nil
- if !ACTIVE_STATES.include?(state_from) && ACTIVE_STATES.include?(state_to)
- quota.total_storage = quota.total_storage.to_f + hwp.storage.value.to_f
- quota.total_instances += 1
+ if state_from != nil
+ if !ACTIVE_STATES.include?(state_from) &&
ACTIVE_STATES.include?(state_to)
+ quota.total_storage = quota.total_storage.to_f + hwp.storage.value.to_f
+ quota.total_instances += 1
elsif ACTIVE_STATES.include?(state_from) &&
!ACTIVE_STATES.include?(state_to)
- quota.total_storage = quota.total_storage.to_f - hwp.storage.value.to_f
- quota.total_instances -= 1
- end
+ quota.total_storage = quota.total_storage.to_f - hwp.storage.value.to_f
+ quota.total_instances -= 1
+ end
end
quota.save!
end
@@ -68,4 +70,4 @@ class InstanceObserver < ActiveRecord::Observer
end
-InstanceObserver.instance
+InstanceObserver.instance
\ No newline at end of file
diff --git a/src/spec/models/instance_observer_spec.rb
b/src/spec/models/instance_observer_spec.rb
index 6bcb4d0..828ebdb 100644
--- a/src/spec/models/instance_observer_spec.rb
+++ b/src/spec/models/instance_observer_spec.rb
@@ -104,7 +104,7 @@ describe InstanceObserver do
end
end
- it "should update quota on pool and cloud account when an instance fgoes to state
pending" do
+ it "should update quota on pool and cloud account when an instance goes to state
pending" do
[@cloud_account_quota, @pool_quota].each do |quota|
@instance.state = Instance::STATE_PENDING
@instance.save
@@ -128,38 +128,66 @@ describe InstanceObserver do
end
end
- it "should update pool and cloud account quota when an instance state goes to
running" do
- @instance.state = Instance::STATE_RUNNING
- @instance.save!
-
- [@cloud_account_quota, @pool_quota].each do |quota|
- quota = Quota.find(quota.id)
- quota.running_instances.should == 1
- quota.running_memory.to_f.should == @hwp.memory.value.to_f
- quota.running_cpus.to_f.should == @hwp.cpu.value.to_f
-
- quota.total_storage.to_f.should == @hwp.storage.value.to_f
- quota.total_instances.should == 1
+ it "should update pool and cloud account quota when an instance state goes to a
running state" do
+ [Instance::STATE_PENDING, Instance::STATE_RUNNING, Instance::STATE_SHUTTING_DOWN
].each do |state|
+ [@cloud_account_quota, @pool_quota].each do |quota|
+ # Reset Quota
+ quota = Quota.find(quota.id)
+ quota.running_instances = 0
+ quota.running_memory = 0
+ quota.running_cpus = 0
+
+ quota.total_storage= 0
+ quota.total_instances = 0
+ quota.save!
+
+ # Create Instance
+ @instance = Factory(:new_instance, :pool => @pool, :hardware_profile =>
@hwp, :cloud_account_id => @cloud_account.id)
+ @instance.state = state
+ @instance.save!
+
+ # Check Quota
+ quota = Quota.find(quota.id)
+ quota.running_instances.should == 1
+ quota.running_memory.to_f.should == @hwp.memory.value.to_f
+ quota.running_cpus.to_f.should == @hwp.cpu.value.to_f
+
+ quota.total_storage.to_f.should == @hwp.storage.value.to_f
+ quota.total_instances.should == 1
+ end
end
end
- it "should update a pool and cloud account quota when an instance state goes from
running to another active state" do
- @instance.state = Instance::STATE_RUNNING
- @instance.save!
-
- @instance.state = Instance::STATE_SHUTTING_DOWN
- @instance.save!
-
- [@cloud_account_quota, @pool_quota].each do |quota|
- quota = Quota.find(quota.id)
-
- #TODO test for cpus
- quota.running_instances.should == 0
- quota.running_memory.to_f.should == 0.to_f
-
- quota.total_storage.to_f.should == @hwp.storage.value.to_f
- quota.total_instances.should == 1
+ it "should update a pool and cloud account quota when an instance state goes from
a running state to a non running state" do
+ [Instance::STATE_PENDING, Instance::STATE_RUNNING, Instance::STATE_SHUTTING_DOWN
].each do |state|
+ [@cloud_account_quota, @pool_quota].each do |quota|
+ # Reset Quota
+ quota = Quota.find(quota.id)
+ quota.running_instances = 0
+ quota.running_memory = 0
+ quota.running_cpus = 0
+
+ quota.total_storage= 0
+ quota.total_instances = 0
+ quota.save!
+
+ # Create Instance
+ @instance = Factory(:new_instance, :pool => @pool, :hardware_profile =>
@hwp, :cloud_account_id => @cloud_account.id)
+ @instance.state = state
+ @instance.save!
+
+ @instance.state = Instance::STATE_STOPPED
+ @instance.save!
+
+ # Check Quota
+ quota = Quota.find(quota.id)
+ quota.running_cpus.to_f.should == 0
+ quota.running_instances.should == 0
+ quota.running_memory.to_f.should == 0.to_f
+
+ quota.total_storage.to_f.should == @hwp.storage.value.to_f
+ quota.total_instances.should == 1
+ end
end
end
-
end
\ No newline at end of file
--
1.6.6.1