On Mon, Jun 14, 2010 at 03:46:04PM +0100, [email protected] wrote:
> From: martyntaylor <[email protected]>
> 
> ---
>  src/app/models/quota.rb                |   10 +++++++
>  src/app/services/data_service.rb       |   41 ++++++++++++++++++++++++++++---
>  src/spec/services/data_service_spec.rb |   33 ++++++++++++++++++++++---
>  3 files changed, 76 insertions(+), 8 deletions(-)
> 
> diff --git a/src/app/models/quota.rb b/src/app/models/quota.rb
> index 324a384..acced11 100644
> --- a/src/app/models/quota.rb
> +++ b/src/app/models/quota.rb
> @@ -25,6 +25,16 @@ class Quota < ActiveRecord::Base
>  
>    NO_LIMIT = nil
>  
> +  RESOURCE_RUNNING_INSTANCES = "running_instances"
> +  RESOURCE_RUNNING_MEMORY = "running_memory"
> +  RESOURCE_RUNNING_CPUS = "running_cpus"
> +  RESOURCE_TOTAL_INSTANCES = "total_instances"
> +  RESOURCE_TOTAL_STORAGE = "total_storage"
> +  RESOURCE_OVERALL = "total_storage"
> +
> +  RESOURCE_NAMES = [ RESOURCE_RUNNING_INSTANCES, RESOURCE_RUNNING_MEMORY, 
> RESOURCE_RUNNING_CPUS,
> +                RESOURCE_TOTAL_INSTANCES, RESOURCE_TOTAL_STORAGE ]
> +
>    has_one :pool
>    has_one :cloud_account
>  
> diff --git a/src/app/services/data_service.rb 
> b/src/app/services/data_service.rb
> index 6465f2e..776fef7 100644
> --- a/src/app/services/data_service.rb
> +++ b/src/app/services/data_service.rb
> @@ -60,12 +60,45 @@ class DataService
>      return QoSDataPoint.new(time, average_time, maximum_time, minimum_time)
>    end
>  
> -  # Returns the Used and Maximum Number of Instances in Quota
> -  def self.quota_utilisation(parent)
> +  # Returns the Used and Maximum Resource Usage
> +  def self.quota_utilisation(parent, resource_name)
>      quota = parent.quota
> -    if quota
> -      return QuotaUsagePoint.new(quota.total_instances, 
> quota.maximum_total_instances)
> +
> +    case resource_name
> +      when Quota::RESOURCE_RUNNING_INSTANCES
> +        return QuotaUsagePoint.new(quota.running_instances, 
> quota.maximum_running_instances)
> +      when Quota::RESOURCE_RUNNING_MEMORY
> +        return QuotaUsagePoint.new(quota.running_memory.to_f, 
> quota.maximum_running_memory.to_f)
> +      when Quota::RESOURCE_RUNNING_CPUS
> +        return QuotaUsagePoint.new(quota.running_cpus.to_f, 
> quota.maximum_running_cpus.to_f)
> +      when Quota::RESOURCE_TOTAL_INSTANCES
> +        return QuotaUsagePoint.new(quota.total_instances, 
> quota.maximum_total_instances)
> +      when Quota::RESOURCE_TOTAL_STORAGE
> +        return QuotaUsagePoint.new(quota.total_storage.to_f, 
> quota.maximum_total_storage.to_f)
> +      when Quota::RESOURCE_OVERALL
> +        return self.overall_usage(parent)
> +      else
> +        return nil
> +    end
> +  end
> +
> +  def self.overall_usage(parent)
> +    usage_points = []
> +    Quota::RESOURCE_NAMES.each do |resource_name|
> +      usage_points << quota_utilisation(parent, resource_name)
> +    end
> +
> +    worst_case = nil
> +    usage_points.each do |usage_point|
> +      if worst_case
> +        if ((worst_case.max / 100) * worst_case.used) < ((usage_point.max / 
> 100) * usage_point.used)
> +          worst_case = usage_point
> +        end
> +      else
> +        worst_case = usage_point
> +      end
>      end
> +    return worst_case
>    end
>  
>    def self.total_quota_utilisation(provider)
> diff --git a/src/spec/services/data_service_spec.rb 
> b/src/spec/services/data_service_spec.rb
> index f69f8e8..56bbc41 100644
> --- a/src/spec/services/data_service_spec.rb
> +++ b/src/spec/services/data_service_spec.rb
> @@ -2,7 +2,7 @@ require 'spec_helper'
>  
>  describe DataService do
>  
> -  it "should calculate the quota usage for a provider with a numbner of 
> cloud accounts" do
> +  it "should calculate the total instance quota usage for a provider with a 
> numbner of cloud accounts" do
>      client = mock('DeltaCloud', :null_object => true)
>      provider = Factory.build(:mock_provider)
>      provider.stub!(:connect).and_return(client)
> @@ -30,7 +30,7 @@ describe DataService do
>  
>    end
>  
> -  it "should calculate the total number of instances and maximum numbder of 
> instances of a cloud account" do
> +  it "should calculate the total number of instances and maximum number of 
> instances of a cloud account" do
>      client = mock('DeltaCloud', :null_object => true)
>      provider = Factory.build(:mock_provider)
>      provider.stub!(:connect).and_return(client)
> @@ -40,11 +40,36 @@ describe DataService do
>      cloud_account.stub!(:valid_credentials?).and_return(true)
>      cloud_account.save!
>  
> -    quota = Factory(:quota, :maximum_total_instances => 50, :total_instances 
> => 20)
> +    quota = Factory(:quota,
> +                    :maximum_running_instances => 40,
> +                    :maximum_running_memory => 10240,
> +                    :maximum_running_cpus => 10,
> +                    :maximum_total_instances => 50,
> +                    :maximum_total_storage => 500,
> +                    :running_instances => 20,
> +                    :running_memory => 4096,
> +                    :running_cpus => 7,
> +                    :total_instances => 20,
> +                    :total_storage => 499)
>      cloud_account.quota_id = quota.id
>  
> -    data_point = DataService.quota_utilisation(cloud_account)
> +    data_point = DataService.quota_utilisation(cloud_account, 
> Quota::RESOURCE_RUNNING_INSTANCES)
> +    data_point.should == DataService::QuotaUsagePoint.new(20, 40)
> +
> +    data_point = DataService.quota_utilisation(cloud_account, 
> Quota::RESOURCE_RUNNING_MEMORY)
> +    data_point.should == DataService::QuotaUsagePoint.new(4096, 10240)
> +
> +    data_point = DataService.quota_utilisation(cloud_account, 
> Quota::RESOURCE_RUNNING_CPUS)
> +    data_point.should == DataService::QuotaUsagePoint.new(7, 10)
> +
> +    data_point = DataService.quota_utilisation(cloud_account, 
> Quota::RESOURCE_TOTAL_INSTANCES)
>      data_point.should == DataService::QuotaUsagePoint.new(20, 50)
> +
> +    data_point = DataService.quota_utilisation(cloud_account, 
> Quota::RESOURCE_TOTAL_STORAGE)
> +    data_point.should == DataService::QuotaUsagePoint.new(499, 500)
> +
> +    data_point = DataService.quota_utilisation(cloud_account, 
> Quota::RESOURCE_OVERALL)
> +    data_point.should == DataService::QuotaUsagePoint.new(499, 500)
>    end
>  
>    it "should calculate the average, max and min task submission times" do
> -- 
> 1.6.6.1
> 
> _______________________________________________
> deltacloud-devel mailing list
> [email protected]
> https://fedorahosted.org/mailman/listinfo/deltacloud-devel

ACK. Works for me.

Although I think we need to rework the 
DataService.calculate_qos_task_submission_stats method so it's not doing a 
separate query for each interval (which I acked in a previous patch).

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

Reply via email to