From: martyntaylor <[email protected]>

---
 src/app/controllers/pool_controller.rb    |    1 -
 src/app/models/quota.rb                   |   32 +++++++++++++++++++++++++++++
 src/spec/factories/quota.rb               |    1 -
 src/spec/models/instance_observer_spec.rb |   16 +++++++-------
 src/spec/models/instance_spec.rb          |    4 ++-
 src/spec/models/quota_spec.rb             |   31 ++++++++++++++++++++++++++++
 6 files changed, 74 insertions(+), 11 deletions(-)
 create mode 100644 src/spec/models/quota_spec.rb

diff --git a/src/app/controllers/pool_controller.rb 
b/src/app/controllers/pool_controller.rb
index 204eb80..3bb43e2 100644
--- a/src/app/controllers/pool_controller.rb
+++ b/src/app/controllers/pool_controller.rb
@@ -185,7 +185,6 @@ class PoolController < ApplicationController
     @pool = Pool.find(params[:pool][:id])
     require_privilege(Privilege::QUOTA_MODIFY, @pool)
 
-    #TODO Should check to make sure that the new quota values greater than the 
current usage
     @quota = Quota.find(@pool.quota_id)
     if @quota.update_attributes(params[:quota])
       flash[:notice] = "Quota updated!"
diff --git a/src/app/models/quota.rb b/src/app/models/quota.rb
index c772c0b..5e16065 100644
--- a/src/app/models/quota.rb
+++ b/src/app/models/quota.rb
@@ -30,4 +30,36 @@ class Quota < ActiveRecord::Base
   validates_presence_of :maximum_total_storage
   validates_presence_of :maximum_total_instances
 
+  validates_numericality_of :maximum_running_instances
+  validates_numericality_of :maximum_running_memory
+  validates_numericality_of :maximum_running_cpus
+
+  validates_numericality_of :maximum_total_storage
+  validates_numericality_of :maximum_total_instances
+
+  def can_create_instance?(instance)
+    hwp = HardwareProfile.find(instance.hardware_profile_id)
+
+    if maximum_total_instances >= (total_instances + 1) && 
maximum_total_storage >= (total_storage + hwp.storage)
+      return true
+    end
+    return false
+  end
+
+  def can_start_instance?(instance)
+    hwp = HardwareProfile.find(instance.hardware_profile_id)
+    # TODO Add check for CPUs
+    if maximum_running_instances >= (running_instances + 1) && 
maximum_running_memory >= (running_memory + hwp.memory)
+      return true
+    end
+    return false
+  end
+
+  def validate
+    errors.add("maximum_running_instances", "cannot be less than the current 
running instances") if maximum_running_instances < running_instances
+    errors.add("maximum_running_memory", "cannot be less than the current 
running memory") if maximum_running_memory < running_memory
+    errors.add("maximum_running_cpus", "cannot be less than the current 
running CPUs") if maximum_running_cpus < running_cpus
+    errors.add("maximum_total_storage", "cannot be less than the current total 
storage") if maximum_total_storage < total_storage
+    errors.add("maximum_total_instances", "cannot be less than the current 
total instances") if maximum_total_instances < total_instances
+  end
 end
diff --git a/src/spec/factories/quota.rb b/src/spec/factories/quota.rb
index ce29b9f..a35f7ac 100644
--- a/src/spec/factories/quota.rb
+++ b/src/spec/factories/quota.rb
@@ -1,5 +1,4 @@
 Factory.define :quota do |f|
-  f.association :pool
   f.maximum_running_instances 10
   f.maximum_running_memory 10240
   f.maximum_running_cpus 20
diff --git a/src/spec/models/instance_observer_spec.rb 
b/src/spec/models/instance_observer_spec.rb
index 7051955..5b36377 100644
--- a/src/spec/models/instance_observer_spec.rb
+++ b/src/spec/models/instance_observer_spec.rb
@@ -5,8 +5,8 @@ describe InstanceObserver do
   before(:each) do
    @timestamp = Time.now
    @hwp = Factory :mock_hwp1
-   @pool = Factory :pool
-   @quota = Factory(:quota, :pool_id => @pool.id)
+   @quota = Factory :quota
+   @pool = Factory(:pool, :quota_id => @quota.id)
    @instance = Factory(:new_instance, :pool => @pool, :hardware_profile => 
@hwp)
   end
 
@@ -98,16 +98,16 @@ describe InstanceObserver do
   end
 
   it "should update quota when a pool instance goes into an inactive state" do
+    @instance.state = Instance::STATE_CREATE_FAILED
+    @instance.save!
+
     @quota = Quota.find(@quota)
 
-    @instance.state = Instance::STATE_CREATE_FAILED
     @quota.total_instances.should == 0
     @quota.total_storage.should == 0
   end
 
   it "should update a pools quota when an pool instance state goes to running" 
do
-    @quota = Quota.find(@quota)
-
     @instance.state = Instance::STATE_RUNNING
     @instance.save!
 
@@ -120,15 +120,15 @@ describe InstanceObserver do
     @quota.total_instances.should == 1
   end
 
-  it "should update a pools quota when an associated instance state goes from 
running another active state" do
-    @quota = Quota.find(@quota)
-
+  it "should update a pools quota when an associated 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!
 
+    @quota = Quota.find(@quota.id)
+
     #TODO test for cpus
     @quota.running_instances.should == 0
     @quota.running_memory.should == 0
diff --git a/src/spec/models/instance_spec.rb b/src/spec/models/instance_spec.rb
index 0eaf837..15355a2 100644
--- a/src/spec/models/instance_spec.rb
+++ b/src/spec/models/instance_spec.rb
@@ -2,7 +2,9 @@ require 'spec_helper'
 
 describe Instance do
   before(:each) do
-    @instance = Factory.build(:instance)
+    @quota = Factory :quota
+    @pool = Factory(:pool, :quota_id => @quota.id)
+    @instance = Factory.build(:instance, :pool_id => @pool.id)
     @actions = ['start', 'stop']
   end
 
diff --git a/src/spec/models/quota_spec.rb b/src/spec/models/quota_spec.rb
new file mode 100644
index 0000000..1596582
--- /dev/null
+++ b/src/spec/models/quota_spec.rb
@@ -0,0 +1,31 @@
+require 'spec_helper'
+
+describe Quota do
+  before(:each) do
+    @quota = Factory :quota
+  end
+
+  it "should not allow quota limits to be changed to lower than current usage" 
do
+    @quota.running_instances = @quota.maximum_running_instances
+    @quota.maximum_running_instances -= 1
+
+    @quota.running_memory = @quota.maximum_running_memory
+    @quota.maximum_running_memory -= 1
+
+    @quota.running_cpus = @quota.maximum_running_cpus
+    @quota.maximum_running_cpus -= 1
+
+    @quota.total_instances = @quota.maximum_total_instances
+    @quota.maximum_total_instances -= 1
+
+    @quota.total_storage = @quota.total_storage
+    @quota.maximum_total_storage -= 1
+
+    @quota.save.should be_false
+
+    @quota.errors.empty?.should be_false
+    @quota.errors.find_all {|attr,msg| ["maximum_running_instances", 
"maximum_running_memory", "maximum_running_cpus", "maximum_total_storage",
+                                          
"maximum_total_instances"].include?(attr).should be_true }
+  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