From: martyntaylor <[email protected]>

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

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

Reply via email to