Hi again ;)
First patch just add possibility of XML output fom each command sent to API (which allows --xml option for command line client)
Second patch used this feature and added option for creating fixtures for future unit tests. (This will automate loading/saving XMLs from browser)
--- client/bin/deltacloudc | 26 ++++++++++++++++++++------ client/lib/deltacloud.rb | 18 ++++++++++++++++++ 2 files changed, 38 insertions(+), 6 deletions(-)
diff --git a/client/bin/deltacloudc b/client/bin/deltacloudc index f0b6958..0e9b898 100755 --- a/client/bin/deltacloudc +++ b/client/bin/deltacloudc @@ -22,7 +22,8 @@ require 'uri' require 'deltacloud'
options = { - :verbose => false + :verbose => false, + :xml => false }
@optparse = OptionParser.new do |opts| @@ -47,6 +48,7 @@ BANNER opts.on( '-h', '--help', 'Display this screen' ) { puts opts ; exit } opts.on( '-v', '--version', 'Display API version' ) { options[:version]=true } opts.on( '-V', '--verbose', 'Print verbose messages' ) { options[:verbose]=true } + opts.on( '-x', '--xml', 'Output XML' ) { options[:xml]=true } end
def invalid_usage(error_msg='') @@ -106,8 +108,13 @@ if options[:collection] and ( options[:operation].nil? or options[:operation].eq params.merge!(:architecture => options[:architecture]) if options[:architecture] params.merge!(:id => options[:id]) if options[:id] params.merge!(:state => options[:state]) if options[:state] - client.send(options[:collection].to_s, params).each do |model| - puts model.to_plain + out = client.send(options[:collection].to_s, params) + if options[:xml] + puts client.last_request_xml + else + out.each do |model| + puts model.to_plain + end end exit(0) end @@ -122,7 +129,12 @@ if options[:collection] and options[:operation] # If collection is set and requested operation is 'show' just 'singularize' # collection name and print item with specified id (-i parameter) if options[:operation].eql?('show') - puts client.send(options[:collection].gsub(/s$/, ''), options[:id] ).to_plain + data=client.send(options[:collection].gsub(/s$/, ''), options[:id] ) + if options[:xml] + puts client.last_request_xml + else + puts data.to_plain + end exit(0) end
@@ -134,7 +146,8 @@ if options[:collection] and options[:operation] params.merge!(:image_id => options[:image_id]) if options[:image_id] params.merge!(:flavor_id => options[:flavor_id]) if options[:flavor_id] instance = client.create_instance(options[:image_id], params) - puts instance.to_plain + puts instance.to_plain unless options[:xml] + puts client.last_request_xml if options[:xml] exit(0) end
@@ -143,7 +156,8 @@ if options[:collection] and options[:operation] instance = client.instance(options[:id]) instance.send("#{options[:operation]}!".to_s) instance = client.instance(options[:id]) - puts instance.to_plain + puts instance.to_plain unless options[:xml] + puts client.last_request_xml if options[:xml] exit(0) end end diff --git a/client/lib/deltacloud.rb b/client/lib/deltacloud.rb index 32e2a0c..433e134 100644 --- a/client/lib/deltacloud.rb +++ b/client/lib/deltacloud.rb @@ -40,6 +40,7 @@ class DeltaCloud
attr_accessor :logger attr_reader :api_uri + attr_reader :last_request_xml attr_reader :entry_points attr_reader :driver_name
@@ -84,6 +85,7 @@ class DeltaCloud def flavors(opts={}) flavors = [] request(entry_points[:flavors], :get, opts) do |response| + @last_request_xml = response doc = REXML::Document.new( response ) doc.get_elements( 'flavors/flavor' ).each do |flavor| uri = flavor.attributes['href'] @@ -95,6 +97,7 @@ class DeltaCloud
def flavor(id) request( entry_points[:flavors], :get, {:id=>id } ) do |response| + @last_request_xml = response doc = REXML::Document.new( response.body ) doc.get_elements( '/flavor' ).each do |flavor| uri = flavor.attributes['href'] @@ -154,6 +157,7 @@ class DeltaCloud def instance_states states = [] request( entry_points[:instance_states] ) do |response| + @last_request_xml = response doc = REXML::Document.new( response.body ) doc.get_elements( 'states/state' ).each do |state_elem| state = DCloud::State.new( state_elem.attributes['name'] ) @@ -177,6 +181,7 @@ class DeltaCloud def realms(opts={}) realms = [] request( entry_points[:realms], :get, opts ) do |response| + @last_request_xml = response doc = REXML::Document.new( response.body ) doc.get_elements( 'realms/realm' ).each do |realm| uri = realm.attributes['href'] @@ -188,6 +193,7 @@ class DeltaCloud
def realm(id) request( entry_points[:realms], :get, {:id=>id } ) do |response| + @last_request_xml = response doc = REXML::Document.new( response.body ) doc.get_elements( 'realm' ).each do |realm| uri = realm.attributes['href'] @@ -207,6 +213,7 @@ class DeltaCloud images = [] request_path = entry_points[:images] request( request_path, :get, opts ) do |response| + @last_request_xml = response doc = REXML::Document.new( response.body ) doc.get_elements( 'images/image' ).each do |image| uri = image.attributes['href'] @@ -218,6 +225,7 @@ class DeltaCloud
def image(id) request( entry_points[:images], :get, {:id=>id } ) do |response| + @last_request_xml = response doc = REXML::Document.new( response.body ) doc.get_elements( 'image' ).each do |instance| uri = instance.attributes['href'] @@ -230,6 +238,7 @@ class DeltaCloud def instances(opts={}) instances = [] request( entry_points[:instances], :get, opts ) do |response| + @last_request_xml = response doc = REXML::Document.new( response.body ) doc.get_elements( 'instances/instance' ).each do |instance| uri = instance.attributes['href'] @@ -242,6 +251,7 @@ class DeltaCloud def instance(id) request( entry_points[:instances], :get, {:id=>id } ) do |response| doc = REXML::Document.new( response.body ) + @last_request_xml = response doc.get_elements( 'instance' ).each do |instance| uri = instance.attributes['href'] return DCloud::Instance.new( self, uri, instance ) @@ -252,6 +262,7 @@ class DeltaCloud
def post_instance(uri) request( uri, :post ) do |response| + @last_request_xml = response return true end return false @@ -275,6 +286,7 @@ class DeltaCloud
params[:image_id] = image_id request( entry_points[:instances], :post, {}, params ) do |response| + @last_request_xml = response doc = REXML::Document.new( response.body ) instance = doc.root uri = instance.attributes['href'] @@ -285,6 +297,7 @@ class DeltaCloud def storage_volumes(opts={}) storage_volumes = [] request( entry_points[:storage_volumes] ) do |response| + @last_request_xml = response doc = REXML::Document.new( response.body ) doc.get_elements( 'storage-volumes/storage-volume' ).each do |instance| uri = instance.attributes['href'] @@ -296,6 +309,7 @@ class DeltaCloud
def storage_volume(id) request( entry_points[:storage_volumes], :get, {:id=>id } ) do |response| + @last_request_xml = response doc = REXML::Document.new( response.body ) doc.get_elements( 'storage-volume' ).each do |storage_volume| uri = storage_volume.attributes['href'] @@ -314,6 +328,7 @@ class DeltaCloud def storage_snapshots(opts={}) storage_snapshots = [] request( entry_points[:storage_snapshots] ) do |response| + @last_request_xml = response doc = REXML::Document.new( response.body ) doc.get_elements( 'storage-snapshots/storage-snapshot' ).each do |instance| uri = instance.attributes['href'] @@ -325,6 +340,7 @@ class DeltaCloud
def storage_snapshot(id) request( entry_points[:storage_snapshots], :get, {:id=>id } ) do |response| + @last_request_xml = response doc = REXML::Document.new( response.body ) doc.get_elements( 'storage-snapshot' ).each do |storage_snapshot| uri = storage_snapshot.attributes['href'] @@ -378,7 +394,9 @@ class DeltaCloud :authorization => "Basic "+Base64.encode64("#{@name}:#{@password}"), :accept => "application/xml" } + logger << "Request [#{method.to_s.upcase}] #{request_path}]\n" if @verbose + if method.eql?(:get) RestClient.send(method, request_path, headers, &block) else
--- server/libexec/tests/make_fixtures | 48 ++++++++++++++++++++++++++++++++++++ 1 files changed, 48 insertions(+), 0 deletions(-) create mode 100755 server/libexec/tests/make_fixtures
diff --git a/server/libexec/tests/make_fixtures b/server/libexec/tests/make_fixtures new file mode 100755 index 0000000..8a4b2d2 --- /dev/null +++ b/server/libexec/tests/make_fixtures @@ -0,0 +1,48 @@ +#!/bin/env ruby + +require 'rubygems' +require 'deltacloud' +require 'pp' + + +client = DeltaCloud.new('mockuser', 'mockpassword', 'http://localhost:3000/api', { :verbose => true }) +singularize = lambda { |s| s.to_s.gsub(/s$/, '') } + +FileUtils.mkdir_p 'fixtures' + +client.entry_points.keys.each do |entry_point| + + begin + items = client.send(:"#{entry_point}") + rescue NoMethodError => e + puts "[!] ERROR: #{e.message}" + next + end + + File.open("fixtures/#{entry_point}.xml", 'w') { |f| f.puts(client.last_request_xml) } + + if items.class.eql?(Array) + next if items.first.class.eql?(DCloud::State) + item = client.send(:"#{singularize.call(entry_point)}", items.first.id) + instance = items.first if entry_point.eql?(:instances) + File.open("fixtures/#{singularize.call(entry_point)}_#{items.first.id}.xml", 'w') { |f| f.puts(client.last_request_xml) } + end + + if instance + begin + instance.stop! + rescue + end + sleep(5) + File.open("fixtures/instance_stop.xml", "w") { |f| f.puts( client.last_request_xml )} + + instance.start! + sleep(5) + File.open("fixtures/instance_start.xml", "w") { |f| f.puts( client.last_request_xml )} + + instance.reboot! + sleep(5) + File.open("fixtures/instance_reboot.xml", "w") { |f| f.puts( client.last_request_xml )} + end + +end
On Mon, 2010-03-01 at 16:24 +0100, mfojtik@redhat.com wrote:
client/bin/deltacloudc | 26 ++++++++++++++++++++------ client/lib/deltacloud.rb | 18 ++++++++++++++++++ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/client/lib/deltacloud.rb b/client/lib/deltacloud.rb index 32e2a0c..433e134 100644 --- a/client/lib/deltacloud.rb +++ b/client/lib/deltacloud.rb @@ -40,6 +40,7 @@ class DeltaCloud
attr_accessor :logger attr_reader :api_uri
- attr_reader :last_request_xml attr_reader :entry_points attr_reader :driver_name
@@ -84,6 +85,7 @@ class DeltaCloud def flavors(opts={}) flavors = [] request(entry_points[:flavors], :get, opts) do |response|
@last_request_xml = response doc = REXML::Document.new( response ) doc.get_elements( 'flavors/flavor' ).each do |flavor| uri = flavor.attributes['href']
Adding all these assignments seems like it will be very error-prone. Why not do that in the request method ?
David
On 01/03/10 11:54 -0800, David Lutterkort wrote:
On Mon, 2010-03-01 at 16:24 +0100, mfojtik@redhat.com wrote:
client/bin/deltacloudc | 26 ++++++++++++++++++++------ client/lib/deltacloud.rb | 18 ++++++++++++++++++ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/client/lib/deltacloud.rb b/client/lib/deltacloud.rb index 32e2a0c..433e134 100644 --- a/client/lib/deltacloud.rb +++ b/client/lib/deltacloud.rb @@ -40,6 +40,7 @@ class DeltaCloud
attr_accessor :logger attr_reader :api_uri
- attr_reader :last_request_xml attr_reader :entry_points attr_reader :driver_name
@@ -84,6 +85,7 @@ class DeltaCloud def flavors(opts={}) flavors = [] request(entry_points[:flavors], :get, opts) do |response|
@last_request_xml = response doc = REXML::Document.new( response ) doc.get_elements( 'flavors/flavor' ).each do |flavor| uri = flavor.attributes['href']
Adding all these assignments seems like it will be very error-prone. Why not do that in the request method ?
Good catch. I sent another patch which fixes this.
- Michal
deltacloud-devel@lists.fedorahosted.org