From: martyntaylor <[email protected]>

---
 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

_______________________________________________
deltacloud-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/deltacloud-devel

Reply via email to