From: martyntaylor <[email protected]>

---
 src/app/controllers/pool_controller.rb |   30 +++++++++++---
 src/app/models/instance_observer.rb    |    4 +-
 src/app/models/quota.rb                |    1 +
 src/app/models/task.rb                 |    3 +-
 src/app/util/taskomatic.rb             |   67 ++++++++++++++++----------------
 src/spec/models/task_spec.rb           |    5 --
 6 files changed, 62 insertions(+), 48 deletions(-)

diff --git a/src/app/controllers/pool_controller.rb 
b/src/app/controllers/pool_controller.rb
index 7ff39b7..75e2bcd 100644
--- a/src/app/controllers/pool_controller.rb
+++ b/src/app/controllers/pool_controller.rb
@@ -160,15 +160,31 @@ class PoolController < ApplicationController
 
     if !Quota.exists?(@pool.quota_id)
       require_privilege(Privilege::QUOTA_MODIFY, @pool)
-
       @quota = Quota.new(params[:quota])
-      @quota.save!
-
-      @pool.quota_id = @quota.id
-      @pool.save!
 
-      flash[:notice] = "Quota Created!"
-      redirect_to :action => 'quota', :id => @pool
+      # Populate Current Pool totals to Quota
+      @pool.instances.each do |instance|
+        hwp = HardwareProfile.find(instance.hardware_profile_id)
+        if instance.state == Instance::STATE_RUNNING
+          @quota.running_instances += 1
+          @quota.running_memory += hwp.memory
+          #TODO Add CPUs
+        end
+
+        if InstanceObserver::ACTIVE_STATES.include?(instance.state)
+          @quota.total_instances += 1
+          @quota.total_storage += hwp.storage
+        end
+      end
+
+      if @quota.save
+        flash[:notice] = "Quota Created!"
+        @pool.quota_id = @quota.id
+        @pool.save!
+        redirect_to :action => 'quota', :id => @pool
+      else
+        render :action => :new_quota
+      end
     else
       errors.add("quota_id", "There already exists a quota for this pool")
       render :action => :new_quota
diff --git a/src/app/models/instance_observer.rb 
b/src/app/models/instance_observer.rb
index 9b0461a..725a3a7 100644
--- a/src/app/models/instance_observer.rb
+++ b/src/app/models/instance_observer.rb
@@ -35,9 +35,9 @@ class InstanceObserver < ActiveRecord::Observer
 
     hwp = HardwareProfile.find(an_instance.hardware_profile_id)
     pool = Pool.find(an_instance.pool_id)
-    quota = Quota.find(pool.quota_id)
 
-    if(quota)
+    if(Quota.exists?(pool.quota_id))
+      quota = Quota.find(pool.quota_id)
       if state_to == Instance::STATE_RUNNING
         #TODO update running cpus
         quota.running_instances += 1
diff --git a/src/app/models/quota.rb b/src/app/models/quota.rb
index 5e16065..57662a7 100644
--- a/src/app/models/quota.rb
+++ b/src/app/models/quota.rb
@@ -37,6 +37,7 @@ class Quota < ActiveRecord::Base
   validates_numericality_of :maximum_total_storage
   validates_numericality_of :maximum_total_instances
 
+
   def can_create_instance?(instance)
     hwp = HardwareProfile.find(instance.hardware_profile_id)
 
diff --git a/src/app/models/task.rb b/src/app/models/task.rb
index ebbde40..feec26a 100644
--- a/src/app/models/task.rb
+++ b/src/app/models/task.rb
@@ -116,7 +116,8 @@ class Task < ActiveRecord::Base
 
   def validate
     errors.add("created_at", "Task started but does not have the creation time 
set") if time_started and created_at.nil?
-    errors.add("time_started", "Task ends but does not have the start time 
set") if time_ended and time_started.nil?
+    # Removed check on time_started exisiting. if time_ended does.  This can 
now occur, when the task fails before is starts.  e.g. When Over Qutoa
+    #errors.add("time_started", "Task ends but does not have the start time 
set") if time_ended and time_started.nil?
     errors.add("time_ended", "Tasks ends before it's started") unless 
time_ended.nil? or time_started.nil? or time_ended > time_started
     errors.add("time_started", "Tasks starts before it's created") unless 
time_started.nil? or created_at.nil? or time_started > created_at
   end
diff --git a/src/app/util/taskomatic.rb b/src/app/util/taskomatic.rb
index d852fea..11baadf 100644
--- a/src/app/util/taskomatic.rb
+++ b/src/app/util/taskomatic.rb
@@ -45,45 +45,46 @@ class Taskomatic
 
   def instance_create
 
-    pool = Pool.find(@task.instance.pool_id)
-    quota = Quota.find(pool.quota_id)
+    if Quota.exists?(Pool.find(@task.instance.pool_id).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
 
-    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.save!
+        @task.instance.save!
 
-      @task.save!
-      @task.instance.save!
-    else
-      begin
-        client = @task.instance.cloud_account.connect
-        realm = @task.instance.realm.external_key rescue nil
+        return
+      end
+    end
 
-        # 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
+    begin
+      client = @task.instance.cloud_account.connect
+      realm = @task.instance.realm.external_key rescue nil
 
-        unless @task.instance.hardware_profile.provider_hardware_profile?
-         @task.instance.hardware_profile = 
@task.instance.hardware_profile.provider_hardware_profiles[0]
-        end
+      # 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.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!
-        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!
diff --git a/src/spec/models/task_spec.rb b/src/spec/models/task_spec.rb
index d392cb2..c5e7188 100644
--- a/src/spec/models/task_spec.rb
+++ b/src/spec/models/task_spec.rb
@@ -43,11 +43,6 @@ describe Task do
     @task.should_not be_valid
   end
 
-  it "should have 'started' time set if it ended" do
-    @task.attributes = @valid_attributes.except :time_started
-    @task.should_not be_valid
-  end
-
   it "should not be valid if it started before it was created" do
     @task.attributes = @valid_attributes
     @task.time_started = @task.created_at - 1.minute
-- 
1.6.6.1

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

Reply via email to