From: martyntaylor mtaylor@redhat.com
--- src/app/controllers/pool_controller.rb | 2 +- src/app/models/task.rb | 4 +++- src/app/util/taskomatic.rb | 28 ++++++++++++++++++++++++++-- src/app/views/pool/new_quota.html.erb | 1 + src/spec/factories/quota.rb | 8 ++++++++ 5 files changed, 39 insertions(+), 4 deletions(-)
diff --git a/src/app/controllers/pool_controller.rb b/src/app/controllers/pool_controller.rb index 3bb43e2..7ff39b7 100644 --- a/src/app/controllers/pool_controller.rb +++ b/src/app/controllers/pool_controller.rb @@ -164,7 +164,7 @@ class PoolController < ApplicationController @quota = Quota.new(params[:quota]) @quota.save!
- @pool.quota_id = @quota + @pool.quota_id = @quota.id @pool.save!
flash[:notice] = "Quota Created!" diff --git a/src/app/models/task.rb b/src/app/models/task.rb index f3aaa63..ebbde40 100644 --- a/src/app/models/task.rb +++ b/src/app/models/task.rb @@ -43,7 +43,9 @@ class Task < ActiveRecord::Base FAILURE_PROVIDER_CONTACT_FAILED = "provider_contact_failed" FAILURE_PROVIDER_RETURNED_FAILED = "provider_returned_failed"
- FAILURE_CODES = [FAILURE_PROVIDER_NOT_FOUND, FAILURE_PROVIDER_CONTACT_FAILED, FAILURE_PROVIDER_RETURNED_FAILED] + FAILURE_OVER_POOL_QUOTA = "exceeded_pool_quota" + + FAILURE_CODES = [FAILURE_PROVIDER_NOT_FOUND, FAILURE_PROVIDER_CONTACT_FAILED, FAILURE_PROVIDER_RETURNED_FAILED, FAILURE_OVER_POOL_QUOTA]
validates_inclusion_of :failure_code, :in => FAILURE_CODES + [nil] diff --git a/src/app/util/taskomatic.rb b/src/app/util/taskomatic.rb index 74e069c..ccef5c7 100644 --- a/src/app/util/taskomatic.rb +++ b/src/app/util/taskomatic.rb @@ -45,6 +45,20 @@ class Taskomatic
def instance_create
+ pool = Pool.find(@task.instance.pool_id) + if Quota.exists?(pool.quota_id) + if !Quota.find(pool.quota_id).can_create_instance?(@task.instance) + @task.state = Task::STATE_FAILED + @task.failure_code = Task::FAILURE_OVER_POOL_QUOTA + @task.instance.state = Instance::STATE_CREATE_FAILED + + @task.save! + @task.instance.save! + + return nil + end + end + begin client = @task.instance.cloud_account.connect realm = @task.instance.realm.external_key rescue nil @@ -112,7 +126,16 @@ class Taskomatic end
def instance_start - do_action(:start!) + pool = Pool.find(@task.instance.pool_id) + if Quota.exists?(pool.quota_id) + if !Quota.find(pool.quota_id).can_create_instance?(@task.instance) + do_action(:start!) + return nil + end + end + + @task.state = Task::STATE_FAILED + @task.failure_code = Task::FAILURE_OVER_POOL_QUOTA end
def instance_stop @@ -163,4 +186,5 @@ class Taskomatic end end end -end \ No newline at end of file + +end diff --git a/src/app/views/pool/new_quota.html.erb b/src/app/views/pool/new_quota.html.erb index 4290862..87dc02d 100644 --- a/src/app/views/pool/new_quota.html.erb +++ b/src/app/views/pool/new_quota.html.erb @@ -1,5 +1,6 @@ <div class="dcloud_form"> <%= error_messages_for 'pool' %> + <%= error_messages_for 'quota' %>
<h2>Create Quota for Pool: <%= @pool.name %></legend></h2><br />
diff --git a/src/spec/factories/quota.rb b/src/spec/factories/quota.rb index a35f7ac..4a7ead8 100644 --- a/src/spec/factories/quota.rb +++ b/src/spec/factories/quota.rb @@ -4,4 +4,12 @@ Factory.define :quota do |f| f.maximum_running_cpus 20 f.maximum_total_instances 15 f.maximum_total_storage 8500 +end + +Factory.define :full_quota, :parent => :quota do |f| + f.running_instances 10 + f.running_memory 10240 + f.running_cpus 20 + f.total_instances 15 + f.total_storage 8500 end \ No newline at end of file