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