From: Michal Fojtik <[email protected]>
Signed-off-by: Michal fojtik <[email protected]> --- server/Rakefile | 8 +++ server/lib/ec2/actions_test.rb | 12 ++++ server/tests/ec2/actions_test.rb | 52 ++++++++++++++ server/tests/ec2/common.rb | 73 ++++++++++++++++++++ server/tests/ec2/entrypoint_test.rb | 41 +++++++++++ server/tests/ec2/fixtures/create_key_pair.xml | 6 ++ .../ec2/fixtures/describe_availability_zones.xml | 15 ++++ server/tests/ec2/fixtures/describe_images.xml | 32 +++++++++ server/tests/ec2/fixtures/describe_instances.xml | 57 +++++++++++++++ server/tests/ec2/fixtures/describe_key_pairs.xml | 9 +++ server/tests/ec2/fixtures/run_instances.xml | 33 +++++++++ server/tests/ec2/fixtures/terminate_instances.xml | 16 +++++ 12 files changed, 354 insertions(+) create mode 100644 server/lib/ec2/actions_test.rb create mode 100644 server/tests/ec2/actions_test.rb create mode 100644 server/tests/ec2/common.rb create mode 100644 server/tests/ec2/entrypoint_test.rb create mode 100644 server/tests/ec2/fixtures/create_key_pair.xml create mode 100644 server/tests/ec2/fixtures/describe_availability_zones.xml create mode 100644 server/tests/ec2/fixtures/describe_images.xml create mode 100644 server/tests/ec2/fixtures/describe_instances.xml create mode 100644 server/tests/ec2/fixtures/describe_key_pairs.xml create mode 100644 server/tests/ec2/fixtures/run_instances.xml create mode 100644 server/tests/ec2/fixtures/terminate_instances.xml diff --git a/server/Rakefile b/server/Rakefile index ded7d8b..2481d30 100644 --- a/server/Rakefile +++ b/server/Rakefile @@ -226,6 +226,14 @@ end namespace :test do + desc 'Run AWS EC2 frontend tests' + Rake::TestTask.new('aws') { |t| + t.test_files = FileList.new("tests/ec2/*_test.rb") + t.verbose = true + t.warning = false + } + + %w(mock rackspace rhevm openstack google fgcp ec2).each do |driver| desc "Run #{driver} unit tests" Rake::TestTask.new(driver) { |t| diff --git a/server/lib/ec2/actions_test.rb b/server/lib/ec2/actions_test.rb new file mode 100644 index 0000000..b2a4a13 --- /dev/null +++ b/server/lib/ec2/actions_test.rb @@ -0,0 +1,12 @@ +$:.unshift File.join(File.dirname(__FILE__), '..', '..', '..') +require 'tests/ec2/common' + +describe 'Deltacloud EC2 frontend actions' do + include Deltacloud::Test + + it 'should return list of realms as AvailabilityZones' do + authenticate + get Deltacloud[:root_url], 'Action' => 'DescribeAvailabilityZones' + end + +end diff --git a/server/tests/ec2/actions_test.rb b/server/tests/ec2/actions_test.rb new file mode 100644 index 0000000..d0e1b92 --- /dev/null +++ b/server/tests/ec2/actions_test.rb @@ -0,0 +1,52 @@ +$:.unshift File.join(File.dirname(__FILE__), '..', '..', '..') +require 'tests/ec2/common' + +FREEZED_TIME = DateTime.parse("2012-6-6 15:15:14 +0200") +Timecop.freeze(FREEZED_TIME) + +describe 'Deltacloud EC2 frontend actions' do + include Deltacloud::Test + + it 'should return list of realms as AvailabilityZonesResponse' do + authenticate + get Deltacloud[:root_url], 'Action' => 'DescribeAvailabilityZones' + xml_differencies?(fixture(:describe_availability_zones), xml_response).must_be_empty + end + + it 'should return list of images as ImagesResponse' do + authenticate + get Deltacloud[:root_url], 'Action' => 'DescribeImages' + xml_differencies?(fixture(:describe_images), xml_response).must_be_empty + end + + it 'should return list of keys as keySetResponse' do + authenticate + get Deltacloud[:root_url], 'Action' => 'DescribeKeyPairs' + xml_differencies?(fixture(:describe_key_pairs), xml_response).must_be_empty + end + + it 'should return list of instances as InstancesResponse' do + authenticate + get Deltacloud[:root_url], 'Action' => 'DescribeInstances' + xml_differencies?(fixture(:describe_instances), xml_response).must_be_empty + end + + it 'should create and destroy a new key using the CreateKeyPair' do + authenticate + get Deltacloud[:root_url], 'Action' => 'CreateKeyPair', 'KeyName' => 'test01' + xml_differencies?(fixture(:create_key_pair), xml_response).must_be_empty + get Deltacloud[:root_url], 'Action' => 'DeleteKeyPair', 'KeyName' => 'test01' + (xml_response/'return').first.text.must_equal 'true' + end + + it 'should create and destroy a new instance using the RunInstances' do + authenticate + get Deltacloud[:root_url], 'Action' => 'RunInstances', 'ImageId' => 'img1', 'InstanceType' => 'm1-large', 'Placement.AvailabilityZone' => 'us' + xml_differencies?(fixture(:run_instances), xml_response).must_be_empty + instance_id = (xml_response/'RunInstancesResponse/instanceSet/item/instanceId').first.text + instance_id.wont_be_empty + get Deltacloud[:root_url], 'Action' => 'TerminateInstances', 'InstanceId.1' => instance_id + xml_differencies?(fixture(:terminate_instances), xml_response).must_be_empty + end + +end diff --git a/server/tests/ec2/common.rb b/server/tests/ec2/common.rb new file mode 100644 index 0000000..162ec99 --- /dev/null +++ b/server/tests/ec2/common.rb @@ -0,0 +1,73 @@ +ENV['RACK_ENV'] = 'test' +ENV['API_FRONTEND'] = 'ec2' +ENV['API_DRIVER'] = 'mock' +ENV['TESTS_API_USERNAME'] = 'mockuser' +ENV['TESTS_API_PASSWORD'] = 'mockpassword' + +$:.unshift File.join(File.dirname(__FILE__), '..', '..', '..') + +load File.join(File.dirname(__FILE__), '..', '..', 'lib', 'deltacloud_rack.rb') + +Deltacloud::configure do |server| + server.root_url '/' + server.version '2012-04-01' + server.klass 'Deltacloud::EC2::API' +end.require_frontend! + +require 'minitest/autorun' +require 'rack/test' +require 'nokogiri' +require 'nokogiri/diff' +require 'timecop' + +module Deltacloud + module Test + include Rack::Test::Methods + + def included?(sub) + sub.class_eval do + before do + header 'Accept', 'application/xml' + end + end + end + + def fixture(name) + Nokogiri::XML(clean_whitespace(File.read(File.join(File.dirname(__FILE__), 'fixtures', "#{name}.xml")))) + end + + def clean_whitespace(s) + s.gsub(/(\n|\t|\r)/, ' ').gsub(/>\s*</, '><') + end + + def xml_response + Nokogiri::XML(clean_whitespace(last_response.body)) + end + + def xml_differencies?(xml1, xml2) + differencies = [] + xml1.diff(xml2) do |change,node| + next if change.strip.empty? + differencies << "#{change} #{node.to_html} #{node.parent.path}" + end + differencies + end + + def authenticate + authorize ENV['TESTS_API_USERNAME'], ENV['TESTS_API_PASSWORD'] + end + + def collection_url(collection) + [Deltacloud[:root_url], collection.to_s].join('/') + end + + def app + Rack::Builder.new { + map '/' do + use Rack::Static, :urls => ["/stylesheets", "/javascripts"], :root => "public" + run Rack::Cascade.new([Deltacloud::EC2::API]) + end + } + end + end +end diff --git a/server/tests/ec2/entrypoint_test.rb b/server/tests/ec2/entrypoint_test.rb new file mode 100644 index 0000000..e226e5b --- /dev/null +++ b/server/tests/ec2/entrypoint_test.rb @@ -0,0 +1,41 @@ +$:.unshift File.join(File.dirname(__FILE__), '..', '..', '..') +require 'tests/ec2/common' + +describe 'Deltacloud with EC2 frontend' do + include Deltacloud::Test + + it 'should respond with 301 redirect to entrypoint request' do + get Deltacloud[:root_url] + last_response.status.must_equal 301 + end + + it 'should contain the Location header in entrypoint request response' do + get Deltacloud[:root_url] + last_response.location.wont_be_empty + end + + it 'should contain the Server header with API version' do + get Deltacloud[:root_url] + last_response.headers['Server'].wont_be_empty + last_response.headers['Server'].must_match /Apache-Deltacloud-EC2\/.*/ + end + + it 'should advertise the current driver in HTTP headers' do + get Deltacloud[:root_url] + last_response.headers['X-Deltacloud-Driver'].wont_be_empty + last_response.headers['X-Deltacloud-Driver'].must_equal 'mock' + end + + it 'should advertise the current provider in HTTP headers' do + get Deltacloud[:root_url] + last_response.headers['X-Deltacloud-Provider'].wont_be_empty + last_response.headers['X-Deltacloud-Provider'].must_equal 'default' + end + + it 'should respond properly on unknown Action' do + get Deltacloud[:root_url], 'Action' => 'UnknownAction' + (xml_response/'Response/Errors/Code').first.text.must_equal 'InvalidAction' + (xml_response/'Response/Errors/Message').first.text.must_equal 'The requested action is not valid for this web service' + end + +end diff --git a/server/tests/ec2/fixtures/create_key_pair.xml b/server/tests/ec2/fixtures/create_key_pair.xml new file mode 100644 index 0000000..e440074 --- /dev/null +++ b/server/tests/ec2/fixtures/create_key_pair.xml @@ -0,0 +1,6 @@ +<CreateKeyPairResponse xmlns='http://ec2.amazonaws.com/doc/2012-04-01/'> + <requestId>d4aa733f84758b12e62ceb416c41aecb</requestId> + <keyName>test01</keyName> + <keyFingerprint>1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f</keyFingerprint> + <keyMaterial></keyMaterial> +</CreateKeyPairResponse> diff --git a/server/tests/ec2/fixtures/describe_availability_zones.xml b/server/tests/ec2/fixtures/describe_availability_zones.xml new file mode 100644 index 0000000..7dfa885 --- /dev/null +++ b/server/tests/ec2/fixtures/describe_availability_zones.xml @@ -0,0 +1,15 @@ +<DescribeAvailabilityZonesResponse xmlns='http://ec2.amazonaws.com/doc/2012-04-01/'> + <requestId>d4aa733f84758b12e62ceb416c41aecb</requestId> + <availabilityZoneInfo> + <item> + <zoneName>us</zoneName> + <zoneState>AVAILABLE</zoneState> + <regionName>United States</regionName> + </item> + <item> + <zoneName>eu</zoneName> + <zoneState>AVAILABLE</zoneState> + <regionName>Europe</regionName> + </item> + </availabilityZoneInfo> +</DescribeAvailabilityZonesResponse> diff --git a/server/tests/ec2/fixtures/describe_images.xml b/server/tests/ec2/fixtures/describe_images.xml new file mode 100644 index 0000000..071d23a --- /dev/null +++ b/server/tests/ec2/fixtures/describe_images.xml @@ -0,0 +1,32 @@ +<DescribeImagesResponse xmlns='http://ec2.amazonaws.com/doc/2012-04-01/'> + <requestId>d4aa733f84758b12e62ceb416c41aecb</requestId> + <imagesSet> + <item> + <imageId>img1</imageId> + <imageState>available</imageState> + <imageOwnerId>fedoraproject</imageOwnerId> + <architecture>x86_64</architecture> + <imageType>machine</imageType> + <name>img1</name> + <description>Fedora 10</description> + </item> + <item> + <imageId>img2</imageId> + <imageState>available</imageState> + <imageOwnerId>fedoraproject</imageOwnerId> + <architecture>i386</architecture> + <imageType>machine</imageType> + <name>img2</name> + <description>Fedora 10</description> + </item> + <item> + <imageId>img3</imageId> + <imageState>available</imageState> + <imageOwnerId>mockuser</imageOwnerId> + <architecture>i386</architecture> + <imageType>machine</imageType> + <name>img3</name> + <description>JBoss</description> + </item> + </imagesSet> +</DescribeImagesResponse> diff --git a/server/tests/ec2/fixtures/describe_instances.xml b/server/tests/ec2/fixtures/describe_instances.xml new file mode 100644 index 0000000..b84f317 --- /dev/null +++ b/server/tests/ec2/fixtures/describe_instances.xml @@ -0,0 +1,57 @@ +<DescribeInstancesResponse xmlns='http://ec2.amazonaws.com/doc/2012-04-01/'> + <requestId>d4aa733f84758b12e62ceb416c41aecb</requestId> + <reservationSet> + <item> + <reservationId>r-11111111</reservationId> + <ownerId>deltacloud</ownerId> + <groupSet> + <item> + <groupId>sg-11111111</groupId> + <groupName>default</groupName> + </item> + </groupSet> + <instanceSet> + <item> + <instanceId>inst0</instanceId> + <imageId>img1</imageId> + <instanceType>m1-large</instanceType> + <launchTime>Wed Jun 06 15:15:14 +0200 2012</launchTime> + <ipAddress>img1.inst0.public.com</ipAddress> + <privateIpAddress>img1.inst0.public.com</privateIpAddress> + <dnsName>img1.inst0.public.com</dnsName> + <privateDnsName>img1.inst0.private.com</privateDnsName> + <architecture>i386</architecture> + <instanceState> + <code>16</code> + <name>running</name> + </instanceState> + <placement> + <availabilityZone>us</availabilityZone> + <groupName></groupName> + <tenancy>default</tenancy> + </placement> + </item> + <item> + <instanceId>inst1</instanceId> + <imageId>img3</imageId> + <instanceType>m1-small</instanceType> + <launchTime>Wed Jun 06 15:15:14 +0200 2012</launchTime> + <ipAddress>img1.inst1.public.com</ipAddress> + <privateIpAddress>img1.inst1.public.com</privateIpAddress> + <dnsName>img1.inst1.public.com</dnsName> + <privateDnsName>img1.inst1.private.com</privateDnsName> + <architecture>i386</architecture> + <instanceState> + <code>16</code> + <name>running</name> + </instanceState> + <placement> + <availabilityZone>us</availabilityZone> + <groupName></groupName> + <tenancy>default</tenancy> + </placement> + </item> +</instanceSet> + </item> +</reservationSet> +</DescribeInstancesResponse> diff --git a/server/tests/ec2/fixtures/describe_key_pairs.xml b/server/tests/ec2/fixtures/describe_key_pairs.xml new file mode 100644 index 0000000..0688603 --- /dev/null +++ b/server/tests/ec2/fixtures/describe_key_pairs.xml @@ -0,0 +1,9 @@ +<DescribeKeyPairsResponse xmlns='http://ec2.amazonaws.com/doc/2012-04-01/'> + <requestId>d4aa733f84758b12e62ceb416c41aecb</requestId> + <keySet> + <item> + <keyName>test-key</keyName> + <keyFingerprint>5e:ce:b6:dc:59:3b:5c:93:f8:2e:9d:20:ce:60:ca:f5:0b:8a:66:93</keyFingerprint> + </item> + </keySet> +</DescribeKeyPairsResponse> diff --git a/server/tests/ec2/fixtures/run_instances.xml b/server/tests/ec2/fixtures/run_instances.xml new file mode 100644 index 0000000..4c1f79e --- /dev/null +++ b/server/tests/ec2/fixtures/run_instances.xml @@ -0,0 +1,33 @@ +<RunInstancesResponse xmlns='http://ec2.amazonaws.com/doc/2012-04-01/'> + <requestId>d4aa733f84758b12e62ceb416c41aecb</requestId> + <reservationId>r-11111111</reservationId> +<ownerId>deltacloud</ownerId> +<groupSet> + <item> + <groupId>sg-11111111</groupId> + <groupName>default</groupName> + </item> +</groupSet> +<instanceSet> + <item> + <instanceId>inst3</instanceId> + <imageId>img1</imageId> + <instanceType>m1-large</instanceType> + <launchTime>Wed Jun 06 15:15:14 +0200 2012</launchTime> + <ipAddress>img1.inst3.public.com</ipAddress> + <privateIpAddress>img1.inst3.public.com</privateIpAddress> + <dnsName>img1.inst3.public.com</dnsName> + <privateDnsName>img1.inst3.private.com</privateDnsName> + <architecture>i386</architecture> + <instanceState> + <code>16</code> + <name>running</name> + </instanceState> + <placement> + <availabilityZone>us</availabilityZone> + <groupName></groupName> + <tenancy>default</tenancy> + </placement> + </item> +</instanceSet> +</RunInstancesResponse> diff --git a/server/tests/ec2/fixtures/terminate_instances.xml b/server/tests/ec2/fixtures/terminate_instances.xml new file mode 100644 index 0000000..8bfcc96 --- /dev/null +++ b/server/tests/ec2/fixtures/terminate_instances.xml @@ -0,0 +1,16 @@ +<TerminateInstancesResponse xmlns='http://ec2.amazonaws.com/doc/2012-04-01/'> + <requestId>d4aa733f84758b12e62ceb416c41aecb</requestId> + <instancesSet> + <item> + <instanceId></instanceId> + <currentState> + <code>32</code> + <name>shutting-down</name> + </currentState> + <previousState> + <code>-1</code> + <name>unknown</name> + </previousState> + </item> +</instancesSet> +</TerminateInstancesResponse> -- 1.7.10.2
