ACK - pushed
On 29/11/12 08:02, [email protected] wrote:
> From: Ronelle Landy <[email protected]>
>
> ---
> tests/cimi/cep_test.rb | 40 ++++++++----
> tests/cimi/part2_test.rb | 83 +++++++++++++++++++++++++
> tests/cimi/part3_test.rb | 23 +++++++
> tests/cimi/part4_test.rb | 147 +++++++++++++++++++++++++++++++++++++++++++
> tests/cimi/part5_test.rb | 131 +++++++++++++++++++++++++++++++++++++++
> tests/cimi/test_helper.rb | 151
> +++++++++++++++++++++++++++++++++++++++++++++
> tests/config.yaml | 4 +
> 7 files changed, 566 insertions(+), 13 deletions(-)
> create mode 100644 tests/cimi/part2_test.rb
> create mode 100644 tests/cimi/part3_test.rb
> create mode 100644 tests/cimi/part4_test.rb
> create mode 100644 tests/cimi/part5_test.rb
>
> diff --git a/tests/cimi/cep_test.rb b/tests/cimi/cep_test.rb
> index 42bb057..f764ea2 100644
> --- a/tests/cimi/cep_test.rb
> +++ b/tests/cimi/cep_test.rb
> @@ -50,23 +50,37 @@ class CloundEntryPointBehavior < CIMI::Test::Spec
> subject.name.wont_be_empty
> end
>
> + it "should have a response code equal to 200" do
> + subject
> + last_response.code.must_equal 200
> + end
> +
> it "should have the correct resourceURI", :only => :json do
> subject.wont_be_nil # Make sure we talk to the server
> last_response.json["resourceURI"].must_equal RESOURCE_URI
> end
>
> - it "should have root collections" do
> - ROOTS.each do |root|
> - r = root.underscore.to_sym
> - if subject.respond_to?(r)
> - coll = subject.send(r)
> - coll.must_respond_to :href, "#{root} collection"
> - unless coll.href.nil?
> - coll.href.must_be_uri "#{root} collection"
> - model = fetch(coll.href)
> - last_response.code.must_equal 200
> - end
> - end
> - end
> + query_the_cep(ROOTS)
> +
> + # Testing "*/*" Accept Headers returns json output
> + response = RestClient.get(api.cep_url, "Accept" => "*/*")
> + log.info( " */* accept headers return: " + response.json.to_s() )
> +
> + it "should return json response", :only => "*/*" do
> + response.wont_be_nil
> + response.headers[:content_type].eql?("application/json")
> + end
> +
> + it "should have a response code equal to 200", :only => "*/*" do
> + response.code.must_equal 200
> end
> +
> + it "should have an id equal to the CEP URL" , :only => "*/*" do
> + response.json["id"].must_equal api.cep_url
> + end
> +
> + it "should have a baseURI" do
> + response.json["baseURI"].must_be_uri
> + end
> +
> end
> diff --git a/tests/cimi/part2_test.rb b/tests/cimi/part2_test.rb
> new file mode 100644
> index 0000000..0742a90
> --- /dev/null
> +++ b/tests/cimi/part2_test.rb
> @@ -0,0 +1,83 @@
> +#
> +# Licensed to the Apache Software Foundation (ASF) under one or more
> +# contributor license agreements. See the NOTICE file distributed with
> +# this work for additional information regarding copyright ownership. The
> +# ASF licenses this file to you under the Apache License, Version 2.0 (the
> +# "License"); you may not use this file except in compliance with the
> +# License. You may obtain a copy of the License at
> +#
> +# http://www.apache.org/licenses/LICENSE-2.0
> +#
> +# Unless required by applicable law or agreed to in writing, software
> +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
> +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
> +# License for the specific language governing permissions and limitations
> +# under the License.
> +
> +$:.unshift File.join(File.dirname(__FILE__))
> +
> +require "test_helper.rb"
> +
> +class CreateNewMachine < CIMI::Test::Spec
> + RESOURCE_URI =
> + "http://schemas.dmtf.org/cimi/1/CloudEntryPoint"
> + ROOTS = ["machines", "machineImages", "machineConfigurations"]
> +
> + MiniTest::Unit.after_tests { teardown(@@created_resources, api.basic_auth)
> }
> +
> + # 2.1: Query the CEP
> + model :subject, :cache => true do |fmt|
> + cep(:accept => fmt)
> + end
> +
> + # This test must adhere to one of the "Query the CEP" test in the previous
> section.
> + query_the_cep(ROOTS)
> +
> + # At least one MachineImage resource must appear in the collection
> + # At least one MachineConfiguration resource must appear in the collection
> + it "should contain one MachineImage resource and one MachineConfiguration
> resource" do
> + ROOTS.each do |root|
> + r = root.underscore.to_sym
> + unless r.eql?(:machines)
> + model = fetch(subject.send(r).href)
> + log.info(model.attribute_values[r][0])
> + assert_equal model.attribute_values[r][0].nil?(), false
> + end
> + end
> +end
> +
> + # 2.4: Create a new CredentialResource
> + log.info("Create a new CredentialResource: credential_resources is not a
> supported collection.")
> +
> + # 2.5: Create a new Machine
> + model :machine do |fmt|
> + cep_json = cep(:accept => :json)
> +
> + RestClient.post(cep_json.json["machines"]["href"],
> + "<Machine>" +
> + "<name>cimi_machine_" + fmt.to_s() + "</name>" +
> + "<machineTemplate>" +
> + "<machineConfig " +
> + "href=\"" + cep_json.json["machineConfigs"]["href"] + "/" +
> api.provider_perferred_config + "\"/>" +
> + "<machineImage " +
> + "href=\"" + cep_json.json["machineImages"]["href"] + "/" +
> api.provider_perferred_image + "\"/>" +
> + "</machineTemplate>" +
> + "</Machine>",
> + {'Authorization' => api.basic_auth, :accept => fmt})
> + end
> +
> + it "should add resource for cleanup" do
> + @@created_resources[:machines] << machine.id
> + end
> +
> + it "should have a name" do
> + machine.name.wont_be_empty
> + log.info("machine name: " + machine.name)
> + end
> +
> + it "should have a response code equal to 201" do
> + machine
> + last_response.code.must_equal 201
> + end
> +
> +end
> diff --git a/tests/cimi/part3_test.rb b/tests/cimi/part3_test.rb
> new file mode 100644
> index 0000000..10bc2d5
> --- /dev/null
> +++ b/tests/cimi/part3_test.rb
> @@ -0,0 +1,23 @@
> +#
> +# Licensed to the Apache Software Foundation (ASF) under one or more
> +# contributor license agreements. See the NOTICE file distributed with
> +# this work for additional information regarding copyright ownership. The
> +# ASF licenses this file to you under the Apache License, Version 2.0 (the
> +# "License"); you may not use this file except in compliance with the
> +# License. You may obtain a copy of the License at
> +#
> +# http://www.apache.org/licenses/LICENSE-2.0
> +#
> +# Unless required by applicable law or agreed to in writing, software
> +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
> +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
> +# License for the specific language governing permissions and limitations
> +# under the License.
> +
> +$:.unshift File.join(File.dirname(__FILE__))
> +
> +require "test_helper.rb"
> +
> +class CreateNewMachineFromMachineTemplate < CIMI::Test::Spec
> + log.info("MachineTemplates are not yet a supported collection - Deltacloud
> CIMI interface.")
> +end
> diff --git a/tests/cimi/part4_test.rb b/tests/cimi/part4_test.rb
> new file mode 100644
> index 0000000..e5c1433
> --- /dev/null
> +++ b/tests/cimi/part4_test.rb
> @@ -0,0 +1,147 @@
> +#
> +# Licensed to the Apache Software Foundation (ASF) under one or more
> +# contributor license agreements. See the NOTICE file distributed with
> +# this work for additional information regarding copyright ownership. The
> +# ASF licenses this file to you under the Apache License, Version 2.0 (the
> +# "License"); you may not use this file except in compliance with the
> +# License. You may obtain a copy of the License at
> +#
> +# http://www.apache.org/licenses/LICENSE-2.0
> +#
> +# Unless required by applicable law or agreed to in writing, software
> +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
> +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
> +# License for the specific language governing permissions and limitations
> +# under the License.
> +
> +$:.unshift File.join(File.dirname(__FILE__))
> +
> +require "test_helper.rb"
> +
> +class AddVolumeToMachine < CIMI::Test::Spec
> + RESOURCE_URI = "http://schemas.dmtf.org/cimi/1/VolumeCreate"
> +
> + ROOTS = [ "machines" , "volumes" , "volumeConfigurations"]
> +
> + # Cleanup for resources created for the test
> + MiniTest::Unit.after_tests { teardown(@@created_resources,
> api.basic_auth) }
> +
> + # 4.1: Query the CEP
> + model :subject, :cache => true do |fmt|
> + cep(:accept => fmt)
> + end
> +
> + # 2.2, 2.3: CEP.machines, CEP.volumes and CEP.volumeConfigs must be set
> + query_the_cep(ROOTS)
> +
> + # At least one VolumeConfiguration resource must appear in the collection
> + it "should have at least one volumeConfiguration collection" do
> + ROOTS.each do |root|
> + r = root.underscore.to_sym
> + if r.eql?(:volume_configurations)
> + model = fetch(subject.send(r).href)
> + log.info(model.attribute_values[r][0])
> + assert_equal model.attribute_values[r][0].nil?(), false
> + model.attribute_values[r][0].id.must_be_uri
> + end
> + end
> + end
> +
> +# Create a machine to attach the volume
> + cep_json = cep(:accept => :json)
> + machine = RestClient.post(cep_json.json["machines"]["href"],
> + "<Machine>" +
> + "<name>cimi_machine</name>" +
> + "<machineTemplate>" +
> + "<machineConfig " +
> + "href=\"" + cep_json.json["machineConfigs"]["href"] + "/" +
> api.provider_perferred_config + "\"/>" +
> + "<machineImage " +
> + "href=\"" + cep_json.json["machineImages"]["href"] + "/" +
> api.provider_perferred_image + "\"/>" +
> + "</machineTemplate>" +
> + "</Machine>",
> + {'Authorization' => api.basic_auth, :accept => :json})
> +
> + # 4.3: Create a new Volume
> + model :volume do |fmt|
> + RestClient.post(cep_json.json["volumes"]["href"],
> + "<Volume>" +
> + "<name>cimi_volume_" + fmt.to_s() +"</name>" +
> + "<description>volume for testing</description>" +
> + "<volumeTemplate>" +
> + "<volumeConfig href=\"" + cep_json.json["volumeConfigs"]["href"]
> + "/" +
> + api.provider_perferred_volume_config + "\">" +
> + "</volumeConfig>" +
> + "</volumeTemplate>" +
> + "</Volume>",
> + {'Authorization' => api.basic_auth, :accept => fmt})
> + end
> +
> + it "should add resource machine resource for cleanup", :only => :json do
> + @@created_resources[:machines] << machine.json["id"]
> + end
> +
> +# it "should add resource for cleanup" do
> +# @@created_resources[:volumes] << volume.id
> +# end
> +
> + it "should have a name" do
> + volume.name.wont_be_empty
> + log.info("volume name: " + volume.name)
> + end
> +
> + it "should have a response code equal to 201 for creating a volume" do
> + volume
> + last_response.code.must_equal 201
> + end
> +
> + it "should have the correct resourceURI", :only => :json do
> + volume.wont_be_nil
> + last_response.json["resourceURI"].must_equal RESOURCE_URI.gsub("Create",
> "")
> + end
> +
> + # 4.4: Attach the new Volume to a Machine
> + log.info(machine.json["id"].to_s() + " is the machine id")
> + volume = RestClient.post(cep_json.json["volumes"]["href"],
> + "<Volume>" +
> + "<name>cimi_volume_for_attach</name>" +
> + "<description>volume for attach testing</description>" +
> + "<volumeTemplate>" +
> + "<volumeConfig href=\"" + cep_json.json["volumeConfigs"]["href"] +
> "/" +
> + api.provider_perferred_volume_config + "\">" +
> + "</volumeConfig>" +
> + "</volumeTemplate>" +
> + "</Volume>",
> +{'Authorization' => api.basic_auth, :accept => :json})
> +
> + log.info(volume.json["id"].to_s() + " is the volume id")
> +
> + model :machineWithVolume, :only => :xml do
> + RestClient.put(machine.json["id"] + "/volume_attach",
> + "<MachineVolume xmlns=\"http://schemas.dmtf.org/cimi/1/MachineVolume\">"
> +
> + "<initialLocation>/dev/sdf</initialLocation>" +
> + "<volume href=\"" + volume.json["id"] + "\"/>" +
> + "</MachineVolume>",
> + {'Authorization' => api.basic_auth, :accept => :xml})
> + end
> +
> + it "should have a response code equal to 201 for attaching a volume",
> :only => :xml do
> + machineWithVolume
> + last_response.code.must_equal 201
> + end
> +
> + it "should have delete and edit operations", :only => :xml do
> + # no edit
> + machineWithVolume[:operations][0][0].must_include "delete"
> + end
> +
> + it "should be able to detach from the instance", :only => :xml do
> + log.info( machine.json["id"] +
> + "/volumes/" + volume.json["id"].split("/volumes/")[1])
> + sleep 5
> + response = RestClient.delete(machine.json["id"] +
> + "/volumes/" + volume.json["id"].split("/volumes/")[1],
> + {'Authorization' => api.basic_auth, :accept => :xml})
> + response.code.must_equal 200
> + end
> +
> +end
> diff --git a/tests/cimi/part5_test.rb b/tests/cimi/part5_test.rb
> new file mode 100644
> index 0000000..52f8b58
> --- /dev/null
> +++ b/tests/cimi/part5_test.rb
> @@ -0,0 +1,131 @@
> +#
> +# Licensed to the Apache Software Foundation (ASF) under one or more
> +# contributor license agreements. See the NOTICE file distributed with
> +# this work for additional information regarding copyright ownership. The
> +# ASF licenses this file to you under the Apache License, Version 2.0 (the
> +# "License"); you may not use this file except in compliance with the
> +# License. You may obtain a copy of the License at
> +#
> +# http://www.apache.org/licenses/LICENSE-2.0
> +#
> +# Unless required by applicable law or agreed to in writing, software
> +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
> +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
> +# License for the specific language governing permissions and limitations
> +# under the License.
> +
> +$:.unshift File.join(File.dirname(__FILE__))
> +
> +require "test_helper.rb"
> +require "set"
> +require "time"
> +
> +class ManipulateAMachine < CIMI::Test::Spec
> + RESOURCE_URI =
> + "http://schemas.dmtf.org/cimi/1/Machine"
> +
> + MiniTest::Unit.after_tests { teardown(@@created_resources,
> api.basic_auth) }
> +
> + # 2.1: Query the Machine
> + # For some providers - need to create a machine before querying it.
> + cep_json = cep(:accept => :json)
> + machine_created = RestClient.post(cep_json.json["machines"]["href"],
> + "<Machine>" +
> + "<name>cimi_machine_part5</name>" +
> + "<machineTemplate>" +
> + "<machineConfig " +
> + "href=\"" + cep_json.json["machineConfigs"]["href"] + "/" +
> api.provider_perferred_config + "\"/>" +
> + "<machineImage " +
> + "href=\"" + cep_json.json["machineImages"]["href"] + "/" +
> api.provider_perferred_image + "\"/>" +
> + "</machineTemplate>" +
> + "</Machine>",
> + {'Authorization' => api.basic_auth, :accept => :json})
> +
> + model :machine do |fmt|
> + get machine_created.json["id"], :accept => fmt
> + end
> +
> + it "should add resource for cleanup", :only => :json do
> + @@created_resources[:machines] << machine_created.json["id"]
> + end
> +
> + it "should have a name" do
> + log.info("machine name: " + machine.name)
> + machine.name.wont_be_empty
> + end
> +
> + it "should have have a description" do
> + machine.description.wont_be_empty
> + end
> +
> + it "should have an id including the cep url" do
> + log.info("machine id: " + machine.id)
> + machine.id.must_include api.cep_url.gsub("cloudEntryPoint", "machines/")
> + end
> +
> + it "should have a valid creation time" do
> + Time.parse(machine.created.to_s()) < Time.now
> + end
> +
> + it "should have numerical values for memory and cpu" do
> + machine.cpu.to_s.must_match /^[0-9]+$/
> + machine.memory.to_s.must_match /^[0-9]+$/
> + end
> +
> + it "should have a valid state" do
> + s = Set.new ["RUNNING", "NEW", "PAUSED", "STOPPED", "STARTED"]
> + log.info("machine state: " + machine.state.upcase)
> + s.must_include machine.state.upcase
> + end
> +
> + it "should have disks and columes collections" do
> + machine.disks.must_respond_to :href, "disks collection"
> + machine.volumes.must_respond_to :href, "volumes collection"
> + end
> +
> + it "should have a response code equal to 200" do
> + machine
> + last_response.code.must_equal 200
> + end
> +
> + it "should return correct content type" do
> + machine
> + last_response.wont_be_nil
> + last_response.headers[:content_type].eql?(:fmt)
> + end
> +
> + it "should return possible operations to be executed on a machine" do
> + if (machine.state.upcase.eql?("RUNNING") ||
> + machine.state.upcase.eql?("STARTED"))
> + log.info(RESOURCE_URI.gsub("Machine", "action/restart"))
> + # This relies on odering and needs to be improved
> + machine[:operations][0][0].must_include RESOURCE_URI.gsub( "Machine",
> "action/restart")
> + machine[:operations][1][0].must_include RESOURCE_URI.gsub( "Machine",
> "action/stop")
> + machine[:operations][2][0].must_include RESOURCE_URI.gsub( "Machine",
> "action/capture")
> + elsif machine.state.upcase.eql?("STOPPED")
> + machine[:operations][0][0].must_include RESOURCE_URI.gsub( "Machine",
> "action/start")
> + machine[:operations][1][0].must_include RESOURCE_URI.gsub( "Machine",
> "action/destroy")
> + machine[:operations][2][0].must_include RESOURCE_URI.gsub( "Machine",
> "action/capture")
> + else
> + log.info("machine is in an intermediate state: " + machine.state)
> + end
> + end
> +
> + # 52., 5.3: Start, stop the machine
> + it "should be able to start and stop machines" do
> + if (machine.state.upcase.eql?("RUNNING") ||
> + machine.state.upcase.eql?("STARTED"))
> + machine_stop_start(machine, "stop", "STOPPED")
> + machine_stop_start(machine, "start", "STARTED")
> + elsif machine.state.upcase.eql?("STOPPED")
> + machine_stop_start(machine, "start", "STARTED")
> + machine_stop_start(machine, "stop", "STOPPED")
> + else
> + log.info("machine is in an intermediate state: " + machine.state)
> + end
> + end
> +
> + # 5.4: Modify a Machine attribute
> + log.info("Modifying machine attributes is not supported - Deltacloud CIMI
> interface.")
> +
> +end
> diff --git a/tests/cimi/test_helper.rb b/tests/cimi/test_helper.rb
> index 29a8d71..ace38bd 100644
> --- a/tests/cimi/test_helper.rb
> +++ b/tests/cimi/test_helper.rb
> @@ -19,6 +19,7 @@ require 'require_relative'
> require_relative '../helpers/common.rb'
> require 'singleton'
> require_relative "../../server/lib/cimi/models"
> +require 'logger'
>
> # Add CIMI specific config stuff
> module CIMI
> @@ -33,6 +34,7 @@ module CIMI
> def initialize
> @hash = Deltacloud::Test::yaml_config
> @cimi = @hash["cimi"]
> + @preferred = @cimi["preferred"]
> end
>
> def cep_url
> @@ -49,6 +51,18 @@ module CIMI
> "Basic #{Base64.encode64("#{u}:#{p}")}"
> end
>
> + def provider_perferred_image
> + @preferred["machine_image"]
> + end
> +
> + def provider_perferred_config
> + @preferred["machine_config"]
> + end
> +
> + def provider_perferred_volume_config
> + @preferred["volume_config"]
> + end
> +
> def collections
> xml.xpath("/c:CloudEntryPoint/c:*[@href]", ns).map { |c|
> c.name.to_sym }
> end
> @@ -61,6 +75,7 @@ module CIMI
> { "c" => CIMI_NAMESPACE }
> end
>
> +
> private
> def xml
> unless @xml
> @@ -79,6 +94,7 @@ end
> module CIMI::Test::Methods
>
> module Global
> +
> def api
> CIMI::Test::config
> end
> @@ -134,6 +150,40 @@ module CIMI::Test::Methods
> end
> headers
> end
> +
> + # Adding logging capability
> + def log
> + unless @log
> + @log = Logger.new(STDOUT)
> + if ENV['LOG_LEVEL'].nil?
> + @log.level = Logger::WARN
> + else
> + @log.level = Logger.const_get ENV['LOG_LEVEL']
> + end
> + end
> + @log
> + end
> +
> + def poll_state(machine, state)
> + while not machine.state.upcase.eql?(state)
> + puts state
> + puts 'waiting for machine to be: ' + state.to_s()
> + sleep(10)
> + machine = machine(:refetch => true)
> + end
> + end
> +
> + def machine_stop_start(machine, action, state)
> + response = RestClient.post( machine.id + "/" + action,
> + "<Action xmlns=\"http://schemas.dmtf.org/cimi/1\">" +
> + "<action> http://http://schemas.dmtf.org/cimi/1/action/" +
> action + "</action>" +
> + "</Action>",
> + {'Authorization' => api.basic_auth, :accept => :xml })
> + response.code.must_equal 202
> + poll_state(machine(:refetch => true), state)
> + machine(:refetch => true).state.upcase.must_equal state
> + end
> +
> end
>
> module ClassMethods
> @@ -164,6 +214,98 @@ module CIMI::Test::Methods
> end
> end
> end
> +
> + # Cleanup: stop/destroy the resources created for the tests
> + def teardown(created_resources, api_basic_auth)
> + @@created_resources = created_resources
> + puts "CLEANING UP... resources for deletion:
> #{@@created_resources.inspect}"
> +
> + # machines:
> + if not @@created_resources[:machines].nil?
> + @@created_resources[:machines].each_index do |i|
> + attempts = 0
> + begin
> + stop_res = RestClient.post( @@created_resources[:machines][i] +
> "/stop",
> + "<Action xmlns=\"http://schemas.dmtf.org/cimi/1\">" +
> + "<action>
> http://http://schemas.dmtf.org/cimi/1/action/stop</action>" +
> + "</Action>",
> + {'Authorization' => api.basic_auth, :accept => :xml } )
> +
> + if stop_res.code == 202
> +
> + model_state = RestClient.get(
> @@created_resources[:machines][i],
> + {'Authorization' => api_basic_auth, :accept => :json}
> ).json["state"]
> +
> + while not model_state.upcase.eql?("STOPPED")
> + puts 'waiting for machine to be STOPPED'
> + sleep(10)
> + model_state = RestClient.get(
> @@created_resources[:machines][i],
> + {'Authorization' => api_basic_auth, :accept => :json}
> ).json["state"]
> + end
> + end
> + delete_res = RestClient.delete(
> @@created_resources[:machines][i],
> + {'Authorization' => api_basic_auth, :accept => :json} )
> + @@created_resources[:machines][i] = nil if delete_res.code == 200
> + rescue Exception => e
> + sleep(10)
> + attempts += 1
> + retry if (attempts <= 5)
> + end
> + end
> +
> + @@created_resources[:machines].compact!
> + @@created_resources.delete(:machines) if
> @@created_resources[:machines].empty?
> + end
> +
> + # machine_image, machine_volumes, other collections
> + if (not @@created_resources[:machine_images].nil?) &&
> + (not @@created_resources[:volumes].nil?)
> + [:machine_images, :volumes].each do |col|
> + @@created_resources[col].each do |k|
> + attempts = 0
> + begin
> + puts "#{k}"
> + res = RestClient.delete( "#{k}",
> + {'Authorization' => api_basic_auth, :accept => :json} )
> + @@created_resources[col].delete(k) if res.code == 200
> + rescue Exception => e
> + sleep(10)
> + attempts += 1
> + retry if (attempts <= 5)
> + end
> + end
> + @@created_resources.delete(col) if @@created_resources[col].empty?
> + end
> + end
> +
> + puts "CLEANUP attempt finished... resources looks like:
> #{@@created_resources.inspect}"
> + raise Exception.new("Unable to delete all created resources - please
> check: #{@@created_resources.inspect}") unless @@created_resources.empty?
> + end
> +
> + def query_the_cep(collections = [])
> + it "should have root collections" do
> + cep = self.send(:subject)
> + collections.each do |root|
> + r = root.underscore.to_sym
> + if cep.respond_to?(r)
> + log.info( "Testing collection: " + root )
> + coll = cep.send(r)
> + coll.must_respond_to :href, "#{root} collection"
> + unless coll.href.nil?
> + coll.href.must_be_uri "#{root} collection"
> + model = fetch(coll.href)
> + last_response.code.must_equal 200
> + if
> last_response.headers[:content_type].eql?("application/json")
> + last_response.json["resourceURI"].wont_be_nil
> + end
> + else
> + log.info( root + " is not supported by this provider." )
> + end
> + end
> + end
> + end
> +
> + end
> end
>
> def self.included(base)
> @@ -220,6 +362,7 @@ class CIMI::Test::Spec < MiniTest::Spec
> @@_cache.delete(k)
> end
> end
> +
> resp = @_memoized.fetch("#{name}_#{@format}") do |k|
> if opts[:cache]
> @_memoized[k] = @@_cache.fetch(k) do |k|
> @@ -241,6 +384,14 @@ class CIMI::Test::Spec < MiniTest::Spec
> @@_cache[:last_response][@format]
> end
>
> + def setup
> + unless defined? @@created_resources
> + # Keep track of what collections were created for deletion after tests:
> + @@created_resources = {:machines=>[], :machine_images=>[], :volumes=>[]}
> + end
> + @@created_resources
> + end
> +
> private
>
> def parse(response)
> diff --git a/tests/config.yaml b/tests/config.yaml
> index 67892f0..a8cd727 100644
> --- a/tests/config.yaml
> +++ b/tests/config.yaml
> @@ -35,3 +35,7 @@ cimi:
> cep: "http://localhost:3001/cimi/cloudEntryPoint"
> user: "mockuser"
> password: "mockpassword"
> + preferred:
> + machine_image: "img2"
> + machine_config: "m1-small"
> + volume_config: "2"
>