From: martyntaylor <[email protected]>

---
 src/app/controllers/pool_controller.rb |    2 +-
 src/app/models/task.rb                 |    4 +-
 src/app/util/taskomatic.rb             |   81 ++++++++++++++++++--------------
 src/app/views/pool/new_quota.html.erb  |    1 +
 src/spec/factories/quota.rb            |    8 +++
 5 files changed, 58 insertions(+), 38 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..d852fea 100644
--- a/src/app/util/taskomatic.rb
+++ b/src/app/util/taskomatic.rb
@@ -45,46 +45,47 @@ class Taskomatic
 
   def instance_create
 
-    begin
-      client = @task.instance.cloud_account.connect
-      realm = @task.instance.realm.external_key rescue nil
-
-      # Map aggregator HWP/image to back-end provider HWP/image in instance
-      unless @task.instance.image.provider_image?
-        @task.instance.image = @task.instance.image.provider_images[0]
-      end
+    pool = Pool.find(@task.instance.pool_id)
+    quota = Quota.find(pool.quota_id)
 
-      unless @task.instance.hardware_profile.provider_hardware_profile?
-        @task.instance.hardware_profile = 
@task.instance.hardware_profile.provider_hardware_profiles[0]
-      end
+    if !quota.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.state = Task::STATE_PENDING
       @task.save!
-      dcloud_instance = 
client.create_instance(@task.instance.image.external_key,
-                                               :flavor => 
@task.instance.hardware_profile.external_key,
-                                               :realm => realm,
-                                               :name => @task.instance.name)
-      if dcloud_instance.class == Net::HTTPInternalServerError
-        @task.instance.state = Instance::STATE_CREATE_FAILED
-        raise "Error creating dcloud instance, returned internal server error."
-        @task.state = TASK::STATE_FAILED
-        @task.failure_code = Task::FAILURE_PROVIDER_CONTACT_FAILED
-      else
-        @task.state = Task::STATE_RUNNING
-        @task.save!
-      end
-
-      @logger.info "Task instance create completed with key 
#{dcloud_instance.id} and state #{dcloud_instance.state}"
-      @task.instance.external_key = dcloud_instance.id
-      @task.instance.state = dcloud_to_instance_state(dcloud_instance.state)
       @task.instance.save!
-    rescue Exception => ex
-      @task.state = Task::STATE_FAILED
-      @task.message = ex.message
     else
-      @task.state = Task::STATE_FINISHED
-    end
+      begin
+        client = @task.instance.cloud_account.connect
+        realm = @task.instance.realm.external_key rescue nil
+
+        # Map aggregator HWP/image to back-end provider HWP/image in instance
+        unless @task.instance.image.provider_image?
+         @task.instance.image = @task.instance.image.provider_images[0]
+        end
+
+        unless @task.instance.hardware_profile.provider_hardware_profile?
+         @task.instance.hardware_profile = 
@task.instance.hardware_profile.provider_hardware_profiles[0]
+        end
 
+        @task.state = Task::STATE_PENDING
+        @task.save!
+        dcloud_instance = 
client.create_instance(@task.instance.image.external_key,
+                                                :flavor => 
@task.instance.hardware_profile.external_key,
+                                                :realm => realm,
+                                                :name => @task.instance.name)
+        if dcloud_instance.class == Net::HTTPInternalServerError
+         @task.instance.state = Instance::STATE_CREATE_FAILED
+         raise "Error creating dcloud instance, returned internal server 
error."
+         @task.state = TASK::STATE_FAILED
+         @task.failure_code = Task::FAILURE_PROVIDER_CONTACT_FAILED
+        else
+         @task.state = Task::STATE_RUNNING
+         @task.save!
+        end
+      end
+    end
     @task.save!
   end
 
@@ -112,7 +113,15 @@ class Taskomatic
   end
 
   def instance_start
-    do_action(:start!)
+    pool = Pool.find(@task.instance.pool_id)
+    quota = Quota.find(pool.quota_id)
+
+    if quota.can_start_instance?(@task.instance)
+      do_action(:start!)
+    else
+      @task.state = Task::STATE_FAILED
+      @task.failure_code = Task::FAILURE_OVER_POOL_QUOTA
+    end
   end
 
   def instance_stop
@@ -163,4 +172,4 @@ 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