From: martyntaylor <[email protected]>

---
 src/app/services/data_service.rb                   |  249 +------------
 src/app/services/data_service_active_record.rb     |  265 ++++++++++++++
 .../services/data_service_active_record_spec.rb    |  369 ++++++++++++++++++++
 src/spec/services/data_service_spec.rb             |  369 --------------------
 4 files changed, 651 insertions(+), 601 deletions(-)
 create mode 100644 src/app/services/data_service_active_record.rb
 create mode 100644 src/spec/services/data_service_active_record_spec.rb
 delete mode 100644 src/spec/services/data_service_spec.rb

diff --git a/src/app/services/data_service.rb b/src/app/services/data_service.rb
index c57f6b8..65df454 100644
--- a/src/app/services/data_service.rb
+++ b/src/app/services/data_service.rb
@@ -1,265 +1,50 @@
 class DataService
 
-  # Structures for holding graph data
-  QoSDataPoint = Struct.new(:time, :average, :max, :min)
-
-  QuotaUsagePoint = Struct.new(:used, :max)
-
-  TotalQuotaUsagePoint = Struct.new(:name, :no_instances)
-
-  QoSFailureRatePoint = Struct.new(:time, :failure_rate)
+  def self.implementation()
+    return DataServiceActiveRecord
+  end
 
   def self.qos_task_submission_stats(parent, start_time, end_time, 
interval_length, action)
-    return qos_time_stats(parent, start_time, end_time, interval_length, 
{:action => action}, TASK_SUBMISSION_TIMES)
+    raise NotImplementedError
   end
 
   def self.qos_task_completion_stats(parent, start_time, end_time, 
interval_length, action)
-    return qos_time_stats(parent, start_time, end_time, interval_length, 
{:action => action}, TASK_COMPLETION_TIMES)
+    raise NotImplementedError
   end
 
   def self.qos_task_submission_mean_max_min(parent, start_time, end_time, 
action)
-    return qos_times_mean_max_min(parent, start_time, end_time, action, 
TASK_SUBMISSION_TIMES)
+    raise NotImplementedError
   end
 
   def self.qos_task_completion_mean_max_min(parent, start_time, end_time, 
action)
-    return qos_times_mean_max_min(parent, start_time, end_time, action, 
TASK_COMPLETION_TIMES)
+    raise NotImplementedError
   end
 
   def self.qos_instance_runtime_stats(parent, start_time, end_time, 
interval_length)
-    return qos_time_stats(parent, start_time, end_time, interval_length, nil, 
INSTANCE_RUN_TIMES)
+    raise NotImplementedError
   end
 
   def self.qos_instance_runtime_mean_max_min(parent, start_time, end_time)
-    return qos_times_mean_max_min(parent, start_time, end_time, nil, 
INSTANCE_RUN_TIMES)
+    raise NotImplementedError
   end
 
   def self.qos_failure_rate(parent, start_time, end_time, failure_code)
-    return failure_rate(parent, start_time, end_time, failure_code)
+    raise NotImplementedError
   end
 
   def self.qos_failure_rate_stats(parent, start_time, end_time, 
interval_length, failure_code)
-    qos_time_stats(parent, start_time, end_time, interval_length, 
{:failure_code => failure_code}, FAILURE_RATE)
-  end
-
-  # Returns the Used and Maximum Resource Usage
-  def self.quota_utilisation(parent, resource_name)
-    if parent
-      quota = parent.quota
-      if quota
-        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
-    end
-    return nil
-  end
-
-  def self.total_quota_utilisation(provider)
-    data_points = []
-    free_instances = 0
-
-    cloud_accounts = CloudAccount.find(:all, :conditions => {:provider_id => 
provider.id})
-    cloud_accounts.each do |cloud_account|
-      quota = cloud_account.quota
-      if quota
-        data_points << TotalQuotaUsagePoint.new(cloud_account.username, 
quota.total_instances)
-        free_instances += (quota.maximum_total_instances - 
quota.total_instances)
-      end
-    end
-    data_points << TotalQuotaUsagePoint.new("free", free_instances)
-    return data_points
-  end
-
-  #####################
-  ## PRIVATE METHODS ##
-  #####################
-  private
-
-  TASK_SUBMISSION_TIMES = "TASK_SUBMISSION_TIMES"
-
-  TASK_COMPLETION_TIMES = "TASK_COMPLETION_TIMES"
-
-  INSTANCE_RUN_TIMES = "INSTANCE_RUN_TIMES"
-
-  FAILURE_RATE = "FAILURE_RATE"
-
-  def self.qos_time_stats(parent, start_time, end_time, interval_length, 
params, compare_field)
-    data = []
-    until start_time > (end_time - interval_length) do
-      interval_time = start_time + interval_length
-
-      case compare_field
-        when FAILURE_RATE
-          data << failure_rate(parent, start_time, interval_time,  
params[:failure_code])
-        when INSTANCE_RUN_TIMES
-          data << qos_times_mean_max_min(parent, start_time, interval_time, 
nil, compare_field)
-        when TASK_COMPLETION_TIMES
-          data << qos_times_mean_max_min(parent, start_time, interval_time, 
params[:action], compare_field)
-        when TASK_SUBMISSION_TIMES
-          data << qos_times_mean_max_min(parent, start_time, interval_time, 
params[:action], compare_field)
-      end
-
-      start_time = interval_time
-    end
-    return data
-  end
-
-  # Calculates the mean, max and min times, for the tasks state time, e.g. 
submission, completion, etc...
-  def self.qos_times_mean_max_min(parent, start_time, end_time, action, 
compare_field)
-    first_pass = true
-
-    total_time = nil
-    maximum_time = nil
-    minimum_time = nil
-
-    case compare_field
-      when TASK_SUBMISSION_TIMES
-        list = get_compare_tasks(parent, compare_field, start_time, end_time, 
action)
-      when TASK_COMPLETION_TIMES
-        list = get_compare_tasks(parent, compare_field, start_time, end_time, 
action)
-      when INSTANCE_RUN_TIMES
-        list = get_compare_instances(parent, compare_field, start_time, 
end_time)
-      else
-        return nil
-    end
-
-    list.each do |l|
-      case compare_field
-        when TASK_SUBMISSION_TIMES
-          compare_time = l.submission_time
-        when TASK_COMPLETION_TIMES
-          compare_time = l.runtime
-        when INSTANCE_RUN_TIMES
-          compare_time = l.total_state_time(Instance::STATE_RUNNING)
-        else
-          return nil
-      end
-
-      if(first_pass == true)
-        total_time = compare_time
-        maximum_time = compare_time
-        minimum_time = compare_time
-        first_pass = false
-      else
-        total_time += compare_time
-
-        if compare_time > maximum_time
-          maximum_time = compare_time
-        end
-
-        if compare_time < minimum_time
-          minimum_time = compare_time
-        end
-      end
-    end
-
-    if total_time == nil
-      average_time = nil
-    elsif total_time == 0
-      average_time = 0
-    else
-      average_time = total_time / list.length
-    end
-
-    return QoSDataPoint.new(start_time, average_time, maximum_time, 
minimum_time)
+    raise NotImplementedError
   end
 
-  def self.get_parent_instances(parent)
-    instances = []
-
-    if parent.class == Provider
-      cloud_accounts = CloudAccount.find(:all, :conditions => {:provider_id => 
parent.id})
-      cloud_accounts.each do |cloud_account|
-        instances.concat(cloud_account.instances)
-      end
-    elsif parent.class == Pool || parent.class == CloudAccount
-       instances = parent.instances
-    else
-      return nil
-    end
-
-    return instances
-  end
-
-  def self.get_compare_tasks(parent, compare_field, start_time, end_time, 
action)
-    instances = get_parent_instances(parent)
-    case compare_field
-      when TASK_SUBMISSION_TIMES
-        return Task.find(:all, :conditions => {:time_submitted => 
start_time...end_time,
-                                                :time_started => 
start_time..Time.now,
-                                                :failure_code => nil,
-                                                :action => action,
-                                                :task_target_id => instances })
-      when TASK_COMPLETION_TIMES
-        return Task.find(:all, :conditions => {:time_started => 
start_time...end_time,
-                                                :time_ended => 
start_time..Time.now,
-                                                :failure_code => nil,
-                                                :action => action,
-                                                :task_target_id => instances,
-                                                :state => Task::STATE_FINISHED 
})
-      else
-        return nil
-    end
-  end
-
-  # returns the failure rate of instance starts for instances associated with 
the parent, (pool/cloudaccount) given the failure code
-  def self.failure_rate(parent, start_time, end_time, failure_code)
-    tasks = Task.find(:all, :conditions => {  :created_at => 
start_time...end_time,
-                                              :task_target_id => 
parent.instances })
-
-    failed_tasks = tasks.find_all{ |task| task.failure_code == failure_code}
-    if tasks.length > 0
-      failure_rate = (100 / tasks.length) * failed_tasks.length
-      return QoSFailureRatePoint.new(start_time, failure_rate)
-    end
-    return 0
+  def self.qos_failure_rate_stats(parent, start_time, end_time, 
interval_length, failure_code)
+    raise NotImplementedError
   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 == Quota::NO_LIMIT
-          worst_case = usage_point
-        elsif usage_point.max == Quota::NO_LIMIT
-          # DO Nothing
-        elsif ((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
+  def self.quota_usage(parent, resource_name)
+    raise NotImplementedError
   end
 
-  def self.get_compare_instances(parent, compare_field, start_time, end_time)
-    instances = get_parent_instances(parent)
-    case compare_field
-      when INSTANCE_RUN_TIMES
-        return  instances.find(:all, :conditions => {:time_last_pending => 
start_time...end_time,
-                                                     :time_last_running => 
start_time..Time.now})
-      else
-        return nil
-    end
+  def self.provider_quota_usage(provider)
+    raise NotImplementedError
   end
-
 end
\ No newline at end of file
diff --git a/src/app/services/data_service_active_record.rb 
b/src/app/services/data_service_active_record.rb
new file mode 100644
index 0000000..7b74d13
--- /dev/null
+++ b/src/app/services/data_service_active_record.rb
@@ -0,0 +1,265 @@
+class DataServiceActiveRecord < DataService
+
+  # Structures for holding graph data
+  QoSDataPoint = Struct.new(:time, :average, :max, :min)
+
+  QuotaUsagePoint = Struct.new(:used, :max)
+
+  TotalQuotaUsagePoint = Struct.new(:name, :no_instances)
+
+  QoSFailureRatePoint = Struct.new(:time, :failure_rate)
+
+  def self.qos_task_submission_stats(parent, start_time, end_time, 
interval_length, action)
+    return qos_time_stats(parent, start_time, end_time, interval_length, 
{:action => action}, TASK_SUBMISSION_TIMES)
+  end
+
+  def self.qos_task_completion_stats(parent, start_time, end_time, 
interval_length, action)
+    return qos_time_stats(parent, start_time, end_time, interval_length, 
{:action => action}, TASK_COMPLETION_TIMES)
+  end
+
+  def self.qos_task_submission_mean_max_min(parent, start_time, end_time, 
action)
+    return qos_times_mean_max_min(parent, start_time, end_time, action, 
TASK_SUBMISSION_TIMES)
+  end
+
+  def self.qos_task_completion_mean_max_min(parent, start_time, end_time, 
action)
+    return qos_times_mean_max_min(parent, start_time, end_time, action, 
TASK_COMPLETION_TIMES)
+  end
+
+  def self.qos_instance_runtime_stats(parent, start_time, end_time, 
interval_length)
+    return qos_time_stats(parent, start_time, end_time, interval_length, nil, 
INSTANCE_RUN_TIMES)
+  end
+
+  def self.qos_instance_runtime_mean_max_min(parent, start_time, end_time)
+    return qos_times_mean_max_min(parent, start_time, end_time, nil, 
INSTANCE_RUN_TIMES)
+  end
+
+  def self.qos_failure_rate(parent, start_time, end_time, failure_code)
+    return failure_rate(parent, start_time, end_time, failure_code)
+  end
+
+  def self.qos_failure_rate_stats(parent, start_time, end_time, 
interval_length, failure_code)
+    qos_time_stats(parent, start_time, end_time, interval_length, 
{:failure_code => failure_code}, FAILURE_RATE)
+  end
+
+  # Returns the Used and Maximum Resource Usage
+  def self.quota_usage(parent, resource_name)
+    if parent
+      quota = parent.quota
+      if quota
+        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
+    end
+    return nil
+  end
+
+  def self.provider_quota_usage(provider)
+    data_points = []
+    free_instances = 0
+
+    cloud_accounts = CloudAccount.find(:all, :conditions => {:provider_id => 
provider.id})
+    cloud_accounts.each do |cloud_account|
+      quota = cloud_account.quota
+      if quota
+        data_points << TotalQuotaUsagePoint.new(cloud_account.username, 
quota.total_instances)
+        free_instances += (quota.maximum_total_instances - 
quota.total_instances)
+      end
+    end
+    data_points << TotalQuotaUsagePoint.new("free", free_instances)
+    return data_points
+  end
+
+  #####################
+  ## PRIVATE METHODS ##
+  #####################
+  private
+
+  TASK_SUBMISSION_TIMES = "TASK_SUBMISSION_TIMES"
+
+  TASK_COMPLETION_TIMES = "TASK_COMPLETION_TIMES"
+
+  INSTANCE_RUN_TIMES = "INSTANCE_RUN_TIMES"
+
+  FAILURE_RATE = "FAILURE_RATE"
+
+  def self.qos_time_stats(parent, start_time, end_time, interval_length, 
params, compare_field)
+    data = []
+    until start_time > (end_time - interval_length) do
+      interval_time = start_time + interval_length
+
+      case compare_field
+        when FAILURE_RATE
+          data << failure_rate(parent, start_time, interval_time,  
params[:failure_code])
+        when INSTANCE_RUN_TIMES
+          data << qos_times_mean_max_min(parent, start_time, interval_time, 
nil, compare_field)
+        when TASK_COMPLETION_TIMES
+          data << qos_times_mean_max_min(parent, start_time, interval_time, 
params[:action], compare_field)
+        when TASK_SUBMISSION_TIMES
+          data << qos_times_mean_max_min(parent, start_time, interval_time, 
params[:action], compare_field)
+      end
+
+      start_time = interval_time
+    end
+    return data
+  end
+
+  # Calculates the mean, max and min times, for the tasks state time, e.g. 
submission, completion, etc...
+  def self.qos_times_mean_max_min(parent, start_time, end_time, action, 
compare_field)
+    first_pass = true
+
+    total_time = nil
+    maximum_time = nil
+    minimum_time = nil
+
+    case compare_field
+      when TASK_SUBMISSION_TIMES
+        list = get_compare_tasks(parent, compare_field, start_time, end_time, 
action)
+      when TASK_COMPLETION_TIMES
+        list = get_compare_tasks(parent, compare_field, start_time, end_time, 
action)
+      when INSTANCE_RUN_TIMES
+        list = get_compare_instances(parent, compare_field, start_time, 
end_time)
+      else
+        return nil
+    end
+
+    list.each do |l|
+      case compare_field
+        when TASK_SUBMISSION_TIMES
+          compare_time = l.submission_time
+        when TASK_COMPLETION_TIMES
+          compare_time = l.runtime
+        when INSTANCE_RUN_TIMES
+          compare_time = l.total_state_time(Instance::STATE_RUNNING)
+        else
+          return nil
+      end
+
+      if(first_pass == true)
+        total_time = compare_time
+        maximum_time = compare_time
+        minimum_time = compare_time
+        first_pass = false
+      else
+        total_time += compare_time
+
+        if compare_time > maximum_time
+          maximum_time = compare_time
+        end
+
+        if compare_time < minimum_time
+          minimum_time = compare_time
+        end
+      end
+    end
+
+    if total_time == nil
+      average_time = nil
+    elsif total_time == 0
+      average_time = 0
+    else
+      average_time = total_time / list.length
+    end
+
+    return QoSDataPoint.new(start_time, average_time, maximum_time, 
minimum_time)
+  end
+
+  def self.get_parent_instances(parent)
+    instances = []
+
+    if parent.class == Provider
+      cloud_accounts = CloudAccount.find(:all, :conditions => {:provider_id => 
parent.id})
+      cloud_accounts.each do |cloud_account|
+        instances.concat(cloud_account.instances)
+      end
+    elsif parent.class == Pool || parent.class == CloudAccount
+       instances = parent.instances
+    else
+      return nil
+    end
+
+    return instances
+  end
+
+  def self.get_compare_tasks(parent, compare_field, start_time, end_time, 
action)
+    instances = get_parent_instances(parent)
+    case compare_field
+      when TASK_SUBMISSION_TIMES
+        return Task.find(:all, :conditions => {:time_submitted => 
start_time...end_time,
+                                                :time_started => 
start_time..Time.now,
+                                                :failure_code => nil,
+                                                :action => action,
+                                                :task_target_id => instances })
+      when TASK_COMPLETION_TIMES
+        return Task.find(:all, :conditions => {:time_started => 
start_time...end_time,
+                                                :time_ended => 
start_time..Time.now,
+                                                :failure_code => nil,
+                                                :action => action,
+                                                :task_target_id => instances,
+                                                :state => Task::STATE_FINISHED 
})
+      else
+        return nil
+    end
+  end
+
+  # returns the failure rate of instance starts for instances associated with 
the parent, (pool/cloudaccount) given the failure code
+  def self.failure_rate(parent, start_time, end_time, failure_code)
+    tasks = Task.find(:all, :conditions => {  :created_at => 
start_time...end_time,
+                                              :task_target_id => 
parent.instances })
+
+    failed_tasks = tasks.find_all{ |task| task.failure_code == failure_code}
+    if tasks.length > 0
+      failure_rate = (100 / tasks.length) * failed_tasks.length
+      return QoSFailureRatePoint.new(start_time, failure_rate)
+    end
+    return 0
+  end
+
+  def self.overall_usage(parent)
+    usage_points = []
+    Quota::RESOURCE_NAMES.each do |resource_name|
+      usage_points << quota_usage(parent, resource_name)
+    end
+
+    worst_case = nil
+    usage_points.each do |usage_point|
+      if worst_case
+        if worst_case.max == Quota::NO_LIMIT
+          worst_case = usage_point
+        elsif usage_point.max == Quota::NO_LIMIT
+          # DO Nothing
+        elsif ((100 / worst_case.max) * worst_case.used) < ((100 / 
usage_point.max) * usage_point.used)
+          worst_case = usage_point
+        end
+      else
+        worst_case = usage_point
+      end
+    end
+    return worst_case
+  end
+
+  def self.get_compare_instances(parent, compare_field, start_time, end_time)
+    instances = get_parent_instances(parent)
+    case compare_field
+      when INSTANCE_RUN_TIMES
+        return  instances.find(:all, :conditions => {:time_last_pending => 
start_time...end_time,
+                                                     :time_last_running => 
start_time..Time.now})
+      else
+        return nil
+    end
+  end
+
+end
diff --git a/src/spec/services/data_service_active_record_spec.rb 
b/src/spec/services/data_service_active_record_spec.rb
new file mode 100644
index 0000000..2aa8d48
--- /dev/null
+++ b/src/spec/services/data_service_active_record_spec.rb
@@ -0,0 +1,369 @@
+require 'spec_helper'
+
+describe DataServiceActiveRecord do
+
+  it "should calculate the total instance quota usage for a provider with a 
number of cloud accounts" do
+    client = mock('DeltaCloud', :null_object => true)
+    provider = Factory.build(:mock_provider)
+    provider.stub!(:connect).and_return(client)
+    provider.save!
+
+    data = [[25, 10], [40, 20], [20, 20]]
+    free = 0
+    for i in 0..2
+      cloud_account = Factory.build(:cloud_account, :provider => provider, 
:username => "username" + i.to_s)
+      cloud_account.stub!(:valid_credentials?).and_return(true)
+      cloud_account.save!
+
+      quota = Factory(:quota, :maximum_total_instances => data[i][0], 
:total_instances => data[i][1])
+      cloud_account.quota_id = quota.id
+      cloud_account.save!
+
+      free += (data[i][0] - data[i][1])
+    end
+
+    data_points = DataServiceActiveRecord.provider_quota_usage(provider)
+    data_points[0].should == 
DataServiceActiveRecord::TotalQuotaUsagePoint.new("username0", data[0][1])
+    data_points[1].should == 
DataServiceActiveRecord::TotalQuotaUsagePoint.new("username1", data[1][1])
+    data_points[2].should == 
DataServiceActiveRecord::TotalQuotaUsagePoint.new("username2", data[2][1])
+    data_points[3].should == 
DataServiceActiveRecord::TotalQuotaUsagePoint.new("free", free)
+
+  end
+
+  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)
+    provider.save!
+
+    cloud_account = Factory.build(:cloud_account, :provider => provider)
+    cloud_account.stub!(:valid_credentials?).and_return(true)
+    cloud_account.save!
+
+    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 = DataServiceActiveRecord.quota_usage(cloud_account, 
Quota::RESOURCE_RUNNING_INSTANCES)
+    data_point.should == DataServiceActiveRecord::QuotaUsagePoint.new(20, 40)
+
+    data_point = DataServiceActiveRecord.quota_usage(cloud_account, 
Quota::RESOURCE_RUNNING_MEMORY)
+    data_point.should == DataServiceActiveRecord::QuotaUsagePoint.new(4096, 
10240)
+
+    data_point = DataServiceActiveRecord.quota_usage(cloud_account, 
Quota::RESOURCE_RUNNING_CPUS)
+    data_point.should == DataServiceActiveRecord::QuotaUsagePoint.new(7, 10)
+
+    data_point = DataServiceActiveRecord.quota_usage(cloud_account, 
Quota::RESOURCE_TOTAL_INSTANCES)
+    data_point.should == DataServiceActiveRecord::QuotaUsagePoint.new(20, 50)
+
+    data_point = DataServiceActiveRecord.quota_usage(cloud_account, 
Quota::RESOURCE_TOTAL_STORAGE)
+    data_point.should == DataServiceActiveRecord::QuotaUsagePoint.new(499, 500)
+
+    data_point = DataServiceActiveRecord.quota_usage(cloud_account, 
Quota::RESOURCE_OVERALL)
+    data_point.should == DataServiceActiveRecord::QuotaUsagePoint.new(499, 500)
+  end
+
+  it "should calculate the average, max and min task submission times" do
+    user = Factory :user
+    pool = Factory(:pool, :owner => user)
+    instance = Factory(:instance, :pool_id => pool.id)
+
+    start_time = Time.utc(2010,"jan",1,20,15,1)
+    for i in 1..10 do
+      task = InstanceTask.new(:instance => instance,
+                              :state => Task::STATE_PENDING,
+                              :failure_code => nil,
+                              :task_target_id => instance.id,
+                              :type => "InstanceTask",
+                              :action => InstanceTask::ACTION_CREATE)
+      task.save!
+
+      task.created_at = start_time
+      task.time_submitted = start_time
+      task.time_started = start_time + i
+      task.save!
+    end
+
+    data_point = 
DataServiceActiveRecord.qos_task_submission_mean_max_min(pool, start_time, 
Time.now, InstanceTask::ACTION_CREATE)
+
+    data_point.average.should == 5.5
+    data_point.min.should == 1
+    data_point.max.should == 10
+  end
+
+  it "should create data points for the average, max and min task submission 
times between two times at given intervals" do
+    user = Factory :user
+    pool = Factory(:pool, :owner => user)
+    instance = Factory(:instance, :pool_id => pool.id)
+
+    expected_averages = [ 20, 40, 60, 80, 100]
+    no_intervals = expected_averages.length
+    interval_length = 30
+
+    end_time = Time.utc(2010,"jan",1,20,15,1)
+    start_time = end_time - (interval_length * no_intervals)
+
+    generate_tasks(start_time, interval_length, instance, expected_averages)
+
+    data_points = DataServiceActiveRecord.qos_task_submission_stats(pool, 
start_time, end_time, interval_length, InstanceTask::ACTION_CREATE)
+
+    for i in 0...data_points.length
+      average_time = expected_averages[i]
+      dp = data_points[i]
+
+      dp.average.should == average_time
+      # The multiplications could be set as static numbers but are left as 
calculations for easier understanding of code
+      dp.max.should == (average_time / 10) * 2 * 9
+      dp.min.should == (average_time / 10) * 2
+    end
+  end
+
+  it "should create data points for mean, max and min task submission times at 
given intervals for a provider with multiple accounts" do
+    pool = Factory :pool
+
+    expected_averages = []
+    expected_averages[0] = [ 20, 40, 60, 80, 100]
+    expected_averages[1] = [ 40, 60, 80, 100, 120]
+    expected_averages[2] = [ 60, 80, 100, 120, 140]
+
+    no_intervals = expected_averages.length
+    interval_length = 30
+    end_time = Time.utc(2010,"jan",1,20,15,1)
+    start_time = end_time - (interval_length * no_intervals)
+
+    client = mock('DeltaCloud', :null_object => true)
+    provider = Factory.build(:mock_provider)
+    provider.stub!(:connect).and_return(client)
+    provider.save!
+
+    cloud_accounts = []
+    expected_averages.each do |expected_average|
+      cloud_account = Factory.build(:cloud_account, :provider => provider, 
:username => "username" + expected_average[0].to_s)
+      cloud_account.stub!(:valid_credentials?).and_return(true)
+      cloud_account.save!
+
+      instance = Factory(:instance, :cloud_account_id => cloud_account.id, 
:pool_id => pool.id)
+      generate_tasks(start_time, interval_length, instance, expected_average)
+    end
+
+    data_points = DataServiceActiveRecord.qos_task_submission_stats(pool, 
start_time, end_time, interval_length, InstanceTask::ACTION_CREATE)
+
+    for i in 0...data_points.length
+      dp = data_points[i]
+      dp.average.should == expected_averages[1][i]
+      dp.max.should == (expected_averages[2][i] / 10) * 2 * 9
+      dp.min.should == (expected_averages[0][i] / 10) * 2
+    end
+  end
+
+  it "should create data points for mean, max, min instance runtimes" do
+    interval_length = 1000
+
+    start_time = Time.utc(2010,"jan",1,20,15,1)
+    start_time1 = start_time + interval_length
+    start_time2 = start_time1 + interval_length
+    start_times = [start_time, start_time1, start_time2]
+
+    end_time = start_time2 + interval_length
+
+    runtime1 = [5, 10, 15, 20, 25]
+    runtime2 = [10, 20, 30, 40, 50]
+    runtime3 = [100, 200, 300, 400, 500]
+    runtimes = [runtime1, runtime2, runtime3]
+
+    user = Factory :pool_user
+    pool = Factory(:pool, :owner => user)
+    cloud_account = Factory :mock_cloud_account
+
+    for i in 0..2 do
+       runtimes[i].each do |runtime|
+         instance = Factory(:instance, :pool => pool, :cloud_account => 
cloud_account, :state => Instance::STATE_STOPPED)
+         instance.save!
+
+         instance.time_last_pending = start_times[i] + (interval_length / 2)
+         instance.time_last_running = start_times[i] + (interval_length / 2)
+         instance.acc_running_time = runtime
+         instance.save!
+       end
+    end
+
+    stats = DataServiceActiveRecord.qos_instance_runtime_stats(cloud_account, 
start_time, end_time, interval_length)
+    stats[0].should == 
DataServiceActiveRecord::QoSDataPoint.new(start_times[0], 15, 25, 5)
+    stats[1].should == 
DataServiceActiveRecord::QoSDataPoint.new(start_times[1], 30, 50, 10)
+    stats[2].should == 
DataServiceActiveRecord::QoSDataPoint.new(start_times[2], 300, 500, 100)
+
+  end
+
+  it "should generate the mean max and min instance runtimes of instances for 
a given cloud account or pool" do
+    user = Factory :pool_user
+    pool = Factory(:pool, :owner => user)
+
+    cloud_account = Factory :mock_cloud_account
+
+    start_time = Time.utc(2010,"jan",1,20,15,1)
+    [50, 100, 150, 200, 250].each do |runtime|
+      instance = Factory(:new_instance, :pool => pool, :cloud_account => 
cloud_account)
+      instance.time_last_pending = start_time
+      instance.time_last_running = start_time
+      instance.acc_running_time = runtime
+      instance.save!
+    end
+
+    expected_results = DataServiceActiveRecord::QoSDataPoint.new(start_time, 
150, 250, 50)
+    results = DataServiceActiveRecord.qos_instance_runtime_mean_max_min(pool, 
start_time, Time.now)
+    results.should == expected_results
+  end
+
+  it "should calculate the average time it takes a provider to complete a task 
between two times" do
+    user = Factory :pool_user
+    pool = Factory(:pool, :owner => user)
+    cloud_account = Factory(:mock_cloud_account)
+    instance = Factory(:instance, :pool => pool, :cloud_account => 
cloud_account)
+
+    start_time = Time.utc(2010,"jan",1,20,15,1)
+    task_completion_times = [10, 20, 30, 40, 50]
+    total_time = 0
+
+    task_completion_times.each do |time|
+      task = InstanceTask.new(:instance => instance,
+                              :type => "InstanceTask",
+                              :state => Task::STATE_FINISHED,
+                              :failure_code => nil,
+                              :action => InstanceTask::ACTION_CREATE,
+                              :task_target_id => instance.id)
+      task.save!
+
+      task.created_at = start_time
+      task.time_started = start_time
+      task.time_ended = start_time + time
+      task.save!
+
+      total_time += time
+    end
+
+    expected_average_time = total_time / task_completion_times.length
+    average_time = 
DataServiceActiveRecord.qos_task_completion_mean_max_min(cloud_account.provider,
 start_time, Time.now, InstanceTask::ACTION_CREATE)
+
+    average_time[:average].should == expected_average_time
+    average_time[:min].should == 10
+    average_time[:max].should == 50
+  end
+
+  it "should calculate the correct failure rate of instances starts for a 
particular pool or cloud account" do
+    start_time = Time.utc(2010,"jan",1,20,15,1)
+    user = Factory :pool_user
+    pool = Factory(:pool, :owner => user)
+    cloud_account = Factory :mock_cloud_account
+    instance = Factory(:instance, :pool => pool, :cloud_account => 
cloud_account)
+
+    failures = 5
+    non_failures = 20
+
+    for i in 1..failures
+      task = InstanceTask.new(:instance => instance,
+                              :type => "InstanceTask",
+                              :state => Task::STATE_FAILED,
+                              :failure_code => Task::FAILURE_OVER_POOL_QUOTA,
+                              :action => InstanceTask::ACTION_CREATE,
+                              :task_target_id => instance.id)
+      task.created_at = Time.now
+      task.save!
+    end
+
+    for i in 1..non_failures
+      task = InstanceTask.new(:instance => instance,
+                              :type => "InstanceTask",
+                              :state => Task::STATE_FINISHED,
+                              :failure_code => nil,
+                              :action => InstanceTask::ACTION_CREATE,
+                              :task_target_id => instance.id)
+      task.created_at = Time.now
+      task.save!
+    end
+
+    date = DataServiceActiveRecord.failure_rate(pool, start_time, Time.now, 
Task::FAILURE_OVER_POOL_QUOTA)
+    date.failure_rate.should == (100 / (non_failures + failures)) * failures
+  end
+
+  it "should create data points for failure rates of instances between two 
times at given intervals" do
+    interval_length = 1000
+
+    start_time = Time.utc(2010,"jan",1,20,15,1)
+    start_time1 = start_time + interval_length
+    start_time2 = start_time1 + interval_length
+    start_times = [start_time, start_time1, start_time2]
+
+    end_time = start_time2 + interval_length
+
+    failures = [5, 10, 15]
+    number_of_instances = 20
+
+    user = Factory :pool_user
+    pool = Factory(:pool, :owner => user)
+    cloud_account = Factory :mock_cloud_account
+    instance = Factory(:instance, :pool => pool, :cloud_account => 
cloud_account)
+
+    for i in 0..2
+      for j in 1..failures[i]
+        task = InstanceTask.new(:instance => instance,
+                                :type => "InstanceTask",
+                                :state => Task::STATE_FAILED,
+                                :failure_code => Task::FAILURE_OVER_POOL_QUOTA,
+                                :action => InstanceTask::ACTION_CREATE,
+                                :task_target_id => instance.id)
+        task.created_at = start_times[i]
+        task.time_submitted = start_times[i]
+        task.save!
+      end
+
+      non_failures = number_of_instances - failures[i]
+      for j in 1..non_failures
+        task = InstanceTask.new(:instance => instance,
+                                :type => "InstanceTask",
+                                :state => Task::STATE_FINISHED,
+                                :failure_code => nil,
+                                :action => InstanceTask::ACTION_CREATE,
+                                :task_target_id => instance.id)
+        task.created_at = start_times[i]
+        task.time_submitted = start_times[i]
+        task.save!
+      end
+    end
+
+    data = DataServiceActiveRecord.qos_failure_rate_stats(pool, start_time, 
end_time, interval_length, Task::FAILURE_OVER_POOL_QUOTA)
+    data[0].should == 
DataServiceActiveRecord::QoSFailureRatePoint.new(start_time, 25)
+    data[1].should == 
DataServiceActiveRecord::QoSFailureRatePoint.new(start_time1, 50)
+    data[2].should == 
DataServiceActiveRecord::QoSFailureRatePoint.new(start_time2, 75)
+  end
+
+  def generate_tasks(start_time, interval_length, instance, expected_averages)
+    interval_time = start_time
+    expected_averages.each do |avg|
+      submission_time = interval_time + (interval_length / 2)
+      for i in 1..9 do
+        started_time = submission_time + ((avg / 10) * 2) * i
+
+        task = InstanceTask.new(:instance => instance,
+                                :type => "InstanceTask",
+                                :state => Task::STATE_QUEUED,
+                                :failure_code => nil,
+                                :action => InstanceTask::ACTION_CREATE,
+                                :task_target_id => instance.id)
+        task.created_at = submission_time
+        task.time_submitted = submission_time
+        task.time_started = started_time
+        task.save!
+      end
+      interval_time += interval_length
+    end
+  end
+end
\ No newline at end of file
diff --git a/src/spec/services/data_service_spec.rb 
b/src/spec/services/data_service_spec.rb
deleted file mode 100644
index d80f0b5..0000000
--- a/src/spec/services/data_service_spec.rb
+++ /dev/null
@@ -1,369 +0,0 @@
-require 'spec_helper'
-
-describe DataService do
-
-  it "should calculate the total instance quota usage for a provider with a 
number of cloud accounts" do
-    client = mock('DeltaCloud', :null_object => true)
-    provider = Factory.build(:mock_provider)
-    provider.stub!(:connect).and_return(client)
-    provider.save!
-
-    data = [[25, 10], [40, 20], [20, 20]]
-    free = 0
-    for i in 0..2
-      cloud_account = Factory.build(:cloud_account, :provider => provider, 
:username => "username" + i.to_s)
-      cloud_account.stub!(:valid_credentials?).and_return(true)
-      cloud_account.save!
-
-      quota = Factory(:quota, :maximum_total_instances => data[i][0], 
:total_instances => data[i][1])
-      cloud_account.quota_id = quota.id
-      cloud_account.save!
-
-      free += (data[i][0] - data[i][1])
-    end
-
-    data_points = DataService.total_quota_utilisation(provider)
-    data_points[0].should == 
DataService::TotalQuotaUsagePoint.new("username0", data[0][1])
-    data_points[1].should == 
DataService::TotalQuotaUsagePoint.new("username1", data[1][1])
-    data_points[2].should == 
DataService::TotalQuotaUsagePoint.new("username2", data[2][1])
-    data_points[3].should == DataService::TotalQuotaUsagePoint.new("free", 
free)
-
-  end
-
-  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)
-    provider.save!
-
-    cloud_account = Factory.build(:cloud_account, :provider => provider)
-    cloud_account.stub!(:valid_credentials?).and_return(true)
-    cloud_account.save!
-
-    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, 
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
-    user = Factory :user
-    pool = Factory(:pool, :owner => user)
-    instance = Factory(:instance, :pool_id => pool.id)
-
-    start_time = Time.utc(2010,"jan",1,20,15,1)
-    for i in 1..10 do
-      task = InstanceTask.new(:instance => instance,
-                              :state => Task::STATE_PENDING,
-                              :failure_code => nil,
-                              :task_target_id => instance.id,
-                              :type => "InstanceTask",
-                              :action => InstanceTask::ACTION_CREATE)
-      task.save!
-
-      task.created_at = start_time
-      task.time_submitted = start_time
-      task.time_started = start_time + i
-      task.save!
-    end
-
-    data_point = DataService.qos_task_submission_mean_max_min(pool, 
start_time, Time.now, InstanceTask::ACTION_CREATE)
-
-    data_point.average.should == 5.5
-    data_point.min.should == 1
-    data_point.max.should == 10
-  end
-
-  it "should create data points for the average, max and min task submission 
times between two times at given intervals" do
-    user = Factory :user
-    pool = Factory(:pool, :owner => user)
-    instance = Factory(:instance, :pool_id => pool.id)
-
-    expected_averages = [ 20, 40, 60, 80, 100]
-    no_intervals = expected_averages.length
-    interval_length = 30
-
-    end_time = Time.utc(2010,"jan",1,20,15,1)
-    start_time = end_time - (interval_length * no_intervals)
-
-    generate_tasks(start_time, interval_length, instance, expected_averages)
-
-    data_points = DataService.qos_task_submission_stats(pool, start_time, 
end_time, interval_length, InstanceTask::ACTION_CREATE)
-
-    for i in 0...data_points.length
-      average_time = expected_averages[i]
-      dp = data_points[i]
-
-      dp.average.should == average_time
-      # The multiplications could be set as static numbers but are left as 
calculations for easier understanding of code
-      dp.max.should == (average_time / 10) * 2 * 9
-      dp.min.should == (average_time / 10) * 2
-    end
-  end
-
-  it "should create data points for mean, max and min task submission times at 
given intervals for a provider with multiple accounts" do
-    pool = Factory :pool
-
-    expected_averages = []
-    expected_averages[0] = [ 20, 40, 60, 80, 100]
-    expected_averages[1] = [ 40, 60, 80, 100, 120]
-    expected_averages[2] = [ 60, 80, 100, 120, 140]
-
-    no_intervals = expected_averages.length
-    interval_length = 30
-    end_time = Time.utc(2010,"jan",1,20,15,1)
-    start_time = end_time - (interval_length * no_intervals)
-
-    client = mock('DeltaCloud', :null_object => true)
-    provider = Factory.build(:mock_provider)
-    provider.stub!(:connect).and_return(client)
-    provider.save!
-
-    cloud_accounts = []
-    expected_averages.each do |expected_average|
-      cloud_account = Factory.build(:cloud_account, :provider => provider, 
:username => "username" + expected_average[0].to_s)
-      cloud_account.stub!(:valid_credentials?).and_return(true)
-      cloud_account.save!
-
-      instance = Factory(:instance, :cloud_account_id => cloud_account.id, 
:pool_id => pool.id)
-      generate_tasks(start_time, interval_length, instance, expected_average)
-    end
-
-    data_points = DataService.qos_task_submission_stats(pool, start_time, 
end_time, interval_length, InstanceTask::ACTION_CREATE)
-
-    for i in 0...data_points.length
-      dp = data_points[i]
-      dp.average.should == expected_averages[1][i]
-      dp.max.should == (expected_averages[2][i] / 10) * 2 * 9
-      dp.min.should == (expected_averages[0][i] / 10) * 2
-    end
-  end
-
-  it "should create data points for mean, max, min instance runtimes" do
-    interval_length = 1000
-
-    start_time = Time.utc(2010,"jan",1,20,15,1)
-    start_time1 = start_time + interval_length
-    start_time2 = start_time1 + interval_length
-    start_times = [start_time, start_time1, start_time2]
-
-    end_time = start_time2 + interval_length
-
-    runtime1 = [5, 10, 15, 20, 25]
-    runtime2 = [10, 20, 30, 40, 50]
-    runtime3 = [100, 200, 300, 400, 500]
-    runtimes = [runtime1, runtime2, runtime3]
-
-    user = Factory :pool_user
-    pool = Factory(:pool, :owner => user)
-    cloud_account = Factory :mock_cloud_account
-
-    for i in 0..2 do
-       runtimes[i].each do |runtime|
-         instance = Factory(:instance, :pool => pool, :cloud_account => 
cloud_account, :state => Instance::STATE_STOPPED)
-         instance.save!
-
-         instance.time_last_pending = start_times[i] + (interval_length / 2)
-         instance.time_last_running = start_times[i] + (interval_length / 2)
-         instance.acc_running_time = runtime
-         instance.save!
-       end
-    end
-
-    stats = DataService.qos_instance_runtime_stats(cloud_account, start_time, 
end_time, interval_length)
-    stats[0].should == DataService::QoSDataPoint.new(start_times[0], 15, 25, 5)
-    stats[1].should == DataService::QoSDataPoint.new(start_times[1], 30, 50, 
10)
-    stats[2].should == DataService::QoSDataPoint.new(start_times[2], 300, 500, 
100)
-
-  end
-
-  it "should generate the mean max and min instance runtimes of instances for 
a given cloud account or pool" do
-    user = Factory :pool_user
-    pool = Factory(:pool, :owner => user)
-
-    cloud_account = Factory :mock_cloud_account
-
-    start_time = Time.utc(2010,"jan",1,20,15,1)
-    [50, 100, 150, 200, 250].each do |runtime|
-      instance = Factory(:new_instance, :pool => pool, :cloud_account => 
cloud_account)
-      instance.time_last_pending = start_time
-      instance.time_last_running = start_time
-      instance.acc_running_time = runtime
-      instance.save!
-    end
-
-    expected_results = DataService::QoSDataPoint.new(start_time, 150, 250, 50)
-    results = DataService.qos_instance_runtime_mean_max_min(pool, start_time, 
Time.now)
-    results.should == expected_results
-  end
-
-  it "should calculate the average time it takes a provider to complete a task 
between two times" do
-    user = Factory :pool_user
-    pool = Factory(:pool, :owner => user)
-    cloud_account = Factory(:mock_cloud_account)
-    instance = Factory(:instance, :pool => pool, :cloud_account => 
cloud_account)
-
-    start_time = Time.utc(2010,"jan",1,20,15,1)
-    task_completion_times = [10, 20, 30, 40, 50]
-    total_time = 0
-
-    task_completion_times.each do |time|
-      task = InstanceTask.new(:instance => instance,
-                              :type => "InstanceTask",
-                              :state => Task::STATE_FINISHED,
-                              :failure_code => nil,
-                              :action => InstanceTask::ACTION_CREATE,
-                              :task_target_id => instance.id)
-      task.save!
-
-      task.created_at = start_time
-      task.time_started = start_time
-      task.time_ended = start_time + time
-      task.save!
-
-      total_time += time
-    end
-
-    expected_average_time = total_time / task_completion_times.length
-    average_time = 
DataService.qos_task_completion_mean_max_min(cloud_account.provider, 
start_time, Time.now, InstanceTask::ACTION_CREATE)
-
-    average_time[:average].should == expected_average_time
-    average_time[:min].should == 10
-    average_time[:max].should == 50
-  end
-
-  it "should calculate the correct failure rate of instances starts for a 
particular pool or cloud account" do
-    start_time = Time.utc(2010,"jan",1,20,15,1)
-    user = Factory :pool_user
-    pool = Factory(:pool, :owner => user)
-    cloud_account = Factory :mock_cloud_account
-    instance = Factory(:instance, :pool => pool, :cloud_account => 
cloud_account)
-
-    failures = 5
-    non_failures = 20
-
-    for i in 1..failures
-      task = InstanceTask.new(:instance => instance,
-                              :type => "InstanceTask",
-                              :state => Task::STATE_FAILED,
-                              :failure_code => Task::FAILURE_OVER_POOL_QUOTA,
-                              :action => InstanceTask::ACTION_CREATE,
-                              :task_target_id => instance.id)
-      task.created_at = Time.now
-      task.save!
-    end
-
-    for i in 1..non_failures
-      task = InstanceTask.new(:instance => instance,
-                              :type => "InstanceTask",
-                              :state => Task::STATE_FINISHED,
-                              :failure_code => nil,
-                              :action => InstanceTask::ACTION_CREATE,
-                              :task_target_id => instance.id)
-      task.created_at = Time.now
-      task.save!
-    end
-
-    date = DataService.failure_rate(pool, start_time, Time.now, 
Task::FAILURE_OVER_POOL_QUOTA)
-    date.failure_rate.should == (100 / (non_failures + failures)) * failures
-  end
-
-  it "should create data points for failure rates of instances between two 
times at given intervals" do
-    interval_length = 1000
-
-    start_time = Time.utc(2010,"jan",1,20,15,1)
-    start_time1 = start_time + interval_length
-    start_time2 = start_time1 + interval_length
-    start_times = [start_time, start_time1, start_time2]
-
-    end_time = start_time2 + interval_length
-
-    failures = [5, 10, 15]
-    number_of_instances = 20
-
-    user = Factory :pool_user
-    pool = Factory(:pool, :owner => user)
-    cloud_account = Factory :mock_cloud_account
-    instance = Factory(:instance, :pool => pool, :cloud_account => 
cloud_account)
-
-    for i in 0..2
-      for j in 1..failures[i]
-        task = InstanceTask.new(:instance => instance,
-                                :type => "InstanceTask",
-                                :state => Task::STATE_FAILED,
-                                :failure_code => Task::FAILURE_OVER_POOL_QUOTA,
-                                :action => InstanceTask::ACTION_CREATE,
-                                :task_target_id => instance.id)
-        task.created_at = start_times[i]
-        task.time_submitted = start_times[i]
-        task.save!
-      end
-
-      non_failures = number_of_instances - failures[i]
-      for j in 1..non_failures
-        task = InstanceTask.new(:instance => instance,
-                                :type => "InstanceTask",
-                                :state => Task::STATE_FINISHED,
-                                :failure_code => nil,
-                                :action => InstanceTask::ACTION_CREATE,
-                                :task_target_id => instance.id)
-        task.created_at = start_times[i]
-        task.time_submitted = start_times[i]
-        task.save!
-      end
-    end
-
-    data = DataService.qos_failure_rate_stats(pool, start_time, end_time, 
interval_length, Task::FAILURE_OVER_POOL_QUOTA)
-    data[0].should == DataService::QoSFailureRatePoint.new(start_time, 25)
-    data[1].should == DataService::QoSFailureRatePoint.new(start_time1, 50)
-    data[2].should == DataService::QoSFailureRatePoint.new(start_time2, 75)
-  end
-
-  def generate_tasks(start_time, interval_length, instance, expected_averages)
-    interval_time = start_time
-    expected_averages.each do |avg|
-      submission_time = interval_time + (interval_length / 2)
-      for i in 1..9 do
-        started_time = submission_time + ((avg / 10) * 2) * i
-
-        task = InstanceTask.new(:instance => instance,
-                                :type => "InstanceTask",
-                                :state => Task::STATE_QUEUED,
-                                :failure_code => nil,
-                                :action => InstanceTask::ACTION_CREATE,
-                                :task_target_id => instance.id)
-        task.created_at = submission_time
-        task.time_submitted = submission_time
-        task.time_started = started_time
-        task.save!
-      end
-      interval_time += interval_length
-    end
-  end
-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