---
server/Rakefile | 14 ++
server/drivers.rb | 14 ++-
.../lib/deltacloud/drivers/ec2/ec2_mock_driver.rb | 162 ++++++++++++++++++++
3 files changed, 188 insertions(+), 2 deletions(-)
create mode 100644 server/lib/deltacloud/drivers/ec2/ec2_mock_driver.rb
diff --git a/server/Rakefile b/server/Rakefile
index 247acc4..6a07ca2 100644
--- a/server/Rakefile
+++ b/server/Rakefile
@@ -19,7 +19,9 @@
# for example lib/tasks/capistrano.rake, and they will automatically be
available to Rake.
require 'rake'
+require 'cucumber'
require 'rake/testtask'
+require 'cucumber/rake/task'
desc "Run basic unit tests"
Rake::TestTask.new("test") { |t|
@@ -34,3 +36,15 @@ Rake::TestTask.new("test") { |t|
t.verbose = false
t.warning = false
}
+
+
+Cucumber::Rake::Task.new(:features) do |t|
+ t.cucumber_opts = "features --format html --out tmp/cucumber.html"
+ t.rcov = false
+end
+
+Cucumber::Rake::Task.new(:rcov) do |t|
+ t.cucumber_opts = "features --format pretty"
+ t.rcov = true
+ t.rcov_opts << %[-o "tmp/coverage"]
+end
diff --git a/server/drivers.rb b/server/drivers.rb
index b88bef4..d87c685 100644
--- a/server/drivers.rb
+++ b/server/drivers.rb
@@ -1,3 +1,4 @@
+
DRIVERS = {
:ec2 => { :name => "EC2" },
:rackspace => { :name => "Rackspace" },
@@ -18,12 +19,21 @@ def driver_class_name
end
def driver_source_name
- name = DRIVER.to_s
- "deltacloud/drivers/#{name}/#{name}_driver.rb"
+ "deltacloud/drivers/#{DRIVER}/#{DRIVER}_driver.rb"
+end
+
+def driver_mock_source_name
+ return "deltacloud/drivers/#{DRIVER}/#{DRIVER}_driver.rb" if
driver_name.eql? 'Mock'
+ "deltacloud/drivers/#{DRIVER}/#{DRIVER}_mock_driver.rb"
end
def driver
require driver_source_name
+
+ if Sinatra::Application.environment.eql? :test
+ require driver_mock_source_name
+ end
+
@driver ||= eval( driver_class_name ).new
end
diff --git a/server/lib/deltacloud/drivers/ec2/ec2_mock_driver.rb
b/server/lib/deltacloud/drivers/ec2/ec2_mock_driver.rb
new file mode 100644
index 0000000..8a8218f
--- /dev/null
+++ b/server/lib/deltacloud/drivers/ec2/ec2_mock_driver.rb
@@ -0,0 +1,162 @@
+module RightAws
+ class MockEc2
+
+ def initialize(opts={})
+ end
+
+ def describe_images(id)
+ images = load_fixtures_for(:images)
+ return images.select { |i| i[:aws_id].eql?(id) }
+ end
+
+ def describe_images_by_owner(id)
+ images = load_fixtures_for(:images)
+ return images.select { |i| i[:aws_owner].eql?(id) }
+ end
+
+ def describe_images(opts={})
+ images = load_fixtures_for(:images)
+ return images
+ end
+
+ def describe_availability_zones(opts={})
+ load_fixtures_for(:realms)
+ end
+
+ def describe_instances(opts={})
+ instances = load_fixtures_for(:instances)
+ instances.each_with_index do |instance, i|
+ t1 = DateTime.now - DateTime.parse(instance[:aws_launch_time])
+ hours, minutes, seconds, frac = Date.day_fraction_to_time(t1)
+ if (minutes>3 or hours>0) and instance[:aws_state].eql?('pending')
+ instance[:aws_state] = 'running'
+ instance[:aws_state_code] = '16'
+ instances[i] = instance
+ end
+ if (minutes>2 or hours>0) and instance[:aws_state].eql?('stopping')
+ instance[:aws_state] = 'stopped'
+ instance[:aws_state_code] = '80'
+ instances[i] = instance
+ end
+ if opts and opts[:id]
+ if instance[:aws_instance_id].eql?(opts[:id])
+ return [instance]
+ end
+ end
+ end
+ update_fixtures_for(:instances, instances)
+ instances
+ end
+
+ def run_instances(image_id, min_count, max_count, group_ids, key_name,
user_data='', addressing_type = nil, instance_type = nil, kernel_id = nil,
ramdisk_id = nil, availability_zone = nil, block_device_mappings = nil)
+
+ instances = load_fixtures_for(:instances)
+ image = load_fixtures_for(:images).select { |img|
img[:aws_id].eql?(image_id) }.first
+
+ if availability_zone
+ realm = load_fixtures_for(:realms).select { |realm|
realm[:zone_name].eql?(availability_zone) }.first
+ else
+ realm = load_fixtures_for(:realms).first
+ end
+
+ instance = { }
+ instance[:aws_image_id] = image[:aws_id]
+ instance[:aws_availability_zone] = realm[:zone_name]
+ instance[:aws_instance_type] = instance_type
+ instance[:aws_owner] = user_data
+ instance[:aws_state] = 'pending'
+ instance[:aws_launch_time] = DateTime.now.to_s.gsub(/\+(.+)$/, '.000Z')
+ instance[:aws_reason] = ''
+ instance[:dns_name] =
"domU-#{rand(100)+10}-#{rand(100)+10}-#{rand(100)+10}-#{rand(100)+10}-01-C9.usma2.compute.amazonaws.com"
+ instance[:private_dns_name] =
"domU-#{rand(100)+10}-#{rand(100)+10}-#{rand(100)+10}-#{rand(100)+10}-02-P9.usma2.compute.amazonaws.com"
+ instance[:aws_state_code] = "0"
+ instance[:aws_key_name] = "staging"
+ instance[:aws_kernel_id] = "aki-be3adfd7"
+ instance[:aws_groups] = ["default"]
+ instance[:aws_ramdisk_id] = "ari-ce34gad7"
+ id_1 = ("%.4s" % Time.now.to_i.to_s.reverse).reverse
+ id_2 = ("%.3s" % Time.now.to_i.to_s.reverse)
+ instance[:aws_instance_id] = "i-#{id_1}f#{id_2}"
+ instance[:aws_reservation_id] = "r-aabbccdd"
+
+ instances << instance
+ update_fixtures_for(:instances, instances)
+
+ return [instance]
+ end
+
+
+ def terminate_instances(id)
+ instances = load_fixtures_for(:instances)
+ ti = nil
+ instances.each_with_index do |instance, i|
+ if instance[:aws_instance_id].eql?(id)
+ instance[:aws_state] = 'stopping'
+ instance[:aws_state_code] = '64'
+ instance[:aws_launch_time] = DateTime.now.to_s.gsub(/\+(.+)$/,
'.000Z')
+ instances[i] = instance
+ ti = i
+ break
+ end
+ end
+ update_fixtures_for(:instances, instances)
+ return instances[ti]
+ end
+
+ alias :destroy_instance :terminate_instances
+
+ def reboot_instances(id)
+ instances = load_fixtures_for(:instances)
+ ti = nil
+ instances.each_with_index do |instance, i|
+ if instance[:aws_instance_id].eql?(id)
+ instance[:aws_state] = 'pending'
+ instance[:aws_state_code] = '0'
+ instance[:aws_launch_time] = DateTime.now.to_s.gsub(/\+(.+)$/,
'.000Z')
+ instances[i] = instance
+ ti = i
+ break
+ end
+ end
+ update_fixtures_for(:instances, instances)
+ return instances[ti]
+ end
+
+ def describe_snapshots(opts={})
+ load_fixtures_for(:storage_snapshot)
+ end
+
+ def describe_volumes(opts={})
+ load_fixtures_for(:storage_volume)
+ end
+
+ private
+
+ def driver_dir
+ File::expand_path(File::join(File::dirname(__FILE__),
'../../../../features/support/ec2'))
+ end
+
+ def load_fixtures_for(collection)
+ YAML.load_file(File::join(File::expand_path(File::join(driver_dir,
'fixtures')), "#{collection}.yaml"))
+ end
+
+ def update_fixtures_for(collection, new_data)
+ File.open(File::join(File::expand_path(File::join(driver_dir,
'fixtures')), "#{collection}.yaml"), 'w' ) do |out|
+ YAML.dump(new_data, out)
+ end
+ end
+
+ end
+end
+
+Deltacloud::Drivers::EC2::EC2Driver.class_eval do
+ alias_method :original_new_client, :new_client
+
+ def new_client(credentials, opts={})
+ if credentials.user != 'mockuser' and credentials.password !=
'mockpassword'
+ raise Deltacloud::AuthException.new
+ end
+ RightAws::MockEc2.new
+ end
+
+end
--
1.6.6.2
_______________________________________________
deltacloud-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/deltacloud-devel