From: martyntaylor mtaylor@redhat.com
--- 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