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