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