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

Reply via email to