From: martyntaylor <[email protected]>

---
 src/app/models/task.rb       |    2 +-
 src/lib/tasks/demo_data.rake |  171 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 172 insertions(+), 1 deletions(-)
 create mode 100644 src/lib/tasks/demo_data.rake

diff --git a/src/app/models/task.rb b/src/app/models/task.rb
index f3aaa63..8fa3fd2 100644
--- a/src/app/models/task.rb
+++ b/src/app/models/task.rb
@@ -115,7 +115,7 @@ 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?
-    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_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
 end
diff --git a/src/lib/tasks/demo_data.rake b/src/lib/tasks/demo_data.rake
new file mode 100644
index 0000000..61312c1
--- /dev/null
+++ b/src/lib/tasks/demo_data.rake
@@ -0,0 +1,171 @@
+namespace :db do
+  desc "Populate Database with Demo Data"
+
+  USERNAME = "admin"
+  PASSWORD = "redhat"
+
+  PROVIDER_URL = "http://localhost:3001/api";
+
+  TASK_ACTIONS = [ "create", "start", "stop" ]
+
+  PROB_LONG_RESPONSE = 8
+  PROB_MEDIUM_RESPONSE = 70
+  PROB_SHORT_REPONSE = 20
+  PROB_FAILURE = 2
+
+  LONG_RESPONSE_MIN = 7
+  LONG_RESPONSE_MAX = 15
+
+  MEDIUM_RESPONSE_MIN = 2
+  MEDIUM_RESPONSE_MAX = 5
+
+  SHORT_RESPONSE_MIN = 1
+  SHORT_RESPONSE_MAX = 2
+
+  REQUESTS_PER_MINUTE = 1
+
+  TIME_SCALE = 24 * 60 * 60
+  END_TIME = Time.now
+
+  TOTAL_REQUESTS = REQUESTS_PER_MINUTE * TIME_SCALE / 60
+
+  SHORT_ACC = PROB_SHORT_REPONSE + PROB_FAILURE
+  MEDIUM_ACC = PROB_MEDIUM_RESPONSE + PROB_SHORT_REPONSE + PROB_FAILURE
+
+  task :demo_data => :environment do
+    clear_existing_data
+
+    user = create_user
+    provider = create_provider
+    cloud_account = create_cloud_account(provider)
+    pool = create_pool(cloud_account)
+    instance = create_instance(provider, pool)
+
+    started_at = Time.now
+    create_tasks(instance, user)
+    ended_at = Time.now
+
+    print_stats(started_at, ended_at)
+  end
+
+  def clear_existing_data
+    [CloudAccount, Image, Instance, Pool, Provider, Quota, Realm, Task, User, 
HardwareProfile].each(&:delete_all)
+  end
+
+  def print_stats(started_at, ended_at)
+    run_time = ended_at - started_at
+    tasks_create_time = run_time / TOTAL_REQUESTS
+    tasks_per_minute = 60 / tasks_create_time
+
+    puts "Total Run Time (s): " + run_time.to_s()
+    puts "Average Create Time (s): " + tasks_create_time.to_s()
+    puts "Task Created Per Minute: " + tasks_per_minute.to_s()
+  end
+
+  def create_user
+    user = User.new({ :login => USERNAME,
+                      :first_name => "Admin",
+                      :last_name => "McAdminson",
+                      :email => "[email protected]",
+                      :password => PASSWORD,
+                      :password_confirmation => PASSWORD
+                    })
+    user.save!
+
+    registration = RegistrationService.new(user)
+    registration.save
+
+    user.permissions << Permission.new(:role => 
Role.find_by_name('Administrator'),
+                                       :permission_object => 
BasePermissionObject.general_permission_scope
+                                      )
+    return user
+  end
+
+  def create_provider
+    provider = Provider.new({ :name => "Provider",
+                   :cloud_type => "mock",
+                   :url => PROVIDER_URL,
+                              })
+    provider.populate_hardware_profiles
+    provider.save!
+
+    return provider
+  end
+
+  def create_cloud_account(provider)
+    cloud_account = CloudAccount.new({:username => "mockuser",
+                                      :password => "mockpassword",
+                                      :provider_id => provider.id,
+                                      })
+    cloud_account.populate_realms_and_images
+    cloud_account.save!
+
+    return cloud_account
+  end
+
+  def create_pool(cloud_account)
+    pool = Pool.find_by_name(USERNAME)
+    pool.cloud_accounts << cloud_account
+    pool.save!
+
+    return pool
+  end
+
+  def create_instance(provider, pool)
+    instance = Instance.new({ :name => "instance",
+                              :hardware_profile_id => 
HardwareProfile.find(:first, :conditions => {:provider_id => provider.id}),
+                              :image_id => provider.images[0].id,
+                              :state => Instance::STATE_NEW,
+                              :pool_id => pool.id
+                              })
+    return instance
+  end
+
+  def create_task(instance, user)
+    task = Task.new({})
+    task.user = user
+    task.type = "InstanceTask"
+    task.action = TASK_ACTIONS[rand(TASK_ACTIONS.length)]
+    task.task_target_id = instance.id
+    task.created_at = END_TIME - TIME_SCALE
+    return task
+  end
+
+  def create_tasks(instance, user)
+    for i in 1..TOTAL_REQUESTS do
+      task = create_task(instance, user)
+
+      random = 1 + rand(100)
+      if random <= PROB_FAILURE
+        task.state = Task::STATE_FAILED
+        task.failure_code = 
Task::FAILURE_CODES[rand(Task::FAILURE_CODES.length)]
+      else
+        task.state = Task::STATE_FINISHED
+
+        time_submitted = END_TIME - rand(1 + TIME_SCALE)
+        task.time_submitted = time_submitted
+
+        task.time_started = calculate_time_started(time_submitted, random)
+
+        time_ended = task.time_started + rand(20)
+        task.time_ended = time_ended
+      end
+      task.save!
+    end
+  end
+
+  def calculate_time_started(time_submitted, random)
+    time_started = nil
+
+    if random <= SHORT_ACC
+      time_started = time_submitted + (SHORT_RESPONSE_MIN + 
rand(SHORT_RESPONSE_MAX - SHORT_RESPONSE_MIN + 1))
+    elsif random <= MEDIUM_ACC
+      time_started = time_submitted + (MEDIUM_RESPONSE_MIN + 
rand(MEDIUM_RESPONSE_MAX - MEDIUM_RESPONSE_MIN + 1))
+    else
+      time_started = time_submitted + (LONG_RESPONSE_MIN + 
rand(LONG_RESPONSE_MAX - LONG_RESPONSE_MIN + 1))
+    end
+
+    return time_started
+  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