deltacloud-client 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Rakefile CHANGED
@@ -25,15 +25,9 @@ task 'documentation' do
25
25
  load 'lib/documentation.rb'
26
26
  end
27
27
 
28
- @specs = ['ruby', 'java'].inject({}) do |hash, spec_platform|
29
- $platform = spec_platform
30
- hash.update(spec_platform => Gem::Specification.load('deltacloud-client.gemspec'))
31
- end
32
-
33
- @specs.values.each do |spec|
34
- Rake::GemPackageTask.new(spec) do |pkg|
35
- pkg.need_tar = true
36
- end
28
+ spec = Gem::Specification.load('deltacloud-client.gemspec')
29
+ Rake::GemPackageTask.new(spec) do |pkg|
30
+ pkg.need_tar = true
37
31
  end
38
32
 
39
33
  if Gem.available?('rspec')
data/bin/deltacloudc CHANGED
@@ -124,6 +124,7 @@ if options[:collection] and options[:operation]
124
124
  # If collection is set and requested operation is 'show' just 'singularize'
125
125
  # collection name and print item with specified id (-i parameter)
126
126
  if options[:operation].eql?('show')
127
+ invalid_usage("Missing ID, must be provided with --id") unless options[:id]
127
128
  puts format(client.send(options[:collection].gsub(/s$/, ''), options[:id]))
128
129
  exit(0)
129
130
  end
data/lib/base_object.rb CHANGED
@@ -172,7 +172,7 @@ module DeltaCloud
172
172
  base_method_handler(m, args)
173
173
  rescue NoHandlerForMethod
174
174
  case m[:type]
175
- when :action_link then do_action(m)
175
+ when :action_link then do_action(m, args)
176
176
  else raise NoHandlerForMethod
177
177
  end
178
178
  end
@@ -180,14 +180,19 @@ module DeltaCloud
180
180
 
181
181
  private
182
182
 
183
- def do_action(m)
184
- @client.request(:"#{m[:method]}", m[:href], {}, {})
183
+ def do_action(m, args)
184
+ args = args.first || {}
185
+ method = m[:method].to_sym
186
+ @client.request(method,
187
+ m[:href],
188
+ method == :get ? args : {},
189
+ method == :get ? {} : args)
185
190
  action_trigger(m[:rel])
186
191
  end
187
192
 
188
193
  end
189
194
 
190
- class StateFullObject < ActionObject
195
+ class StatefulObject < ActionObject
191
196
  attr_reader :state
192
197
 
193
198
  def initialize(opts={}, &block)
@@ -258,25 +263,28 @@ module DeltaCloud
258
263
  end
259
264
 
260
265
  def self.add_class(name, parent=:base)
261
- parent_class = case parent
262
- when :base then 'BaseObject'
263
- when :action then 'ActionObject'
264
- when :state then 'StateFullObject'
265
- end
266
+ parent = parent.to_s
267
+ parent_class = "#{parent.classify}Object"
266
268
  @defined_classes ||= []
267
- if @defined_classes.include?(name)
268
- DeltaCloud::API.class_eval("#{name.classify}")
269
- else
270
- DeltaCloud::API.class_eval("class #{name.classify} < DeltaCloud::#{parent_class}; end")
271
- DeltaCloud::API.const_get("#{name.classify}")
269
+ class_name = "#{parent.classify}::#{name.classify}"
270
+ unless @defined_classes.include?(class_name)
271
+ DeltaCloud::API.class_eval("class #{class_name} < DeltaCloud::#{parent_class}; end")
272
+ @defined_classes << class_name
272
273
  end
274
+
275
+ DeltaCloud::API.const_get(parent.classify).const_get(name.classify)
273
276
  end
274
277
 
275
278
  def self.guess_model_type(response)
276
279
  response = Nokogiri::XML(response.to_s)
277
280
  return :action if ((response/'//actions').length == 1) and ((response/'//state').length == 0)
278
- return :state if ((response/'//actions').length == 1) and ((response/'//state').length == 1)
281
+ return :stateful if ((response/'//actions').length == 1) and ((response/'//state').length == 1)
279
282
  return :base
280
283
  end
281
284
 
285
+ class API
286
+ class Action; end
287
+ class Base; end
288
+ class Stateful; end
289
+ end
282
290
  end
data/lib/deltacloud.rb CHANGED
@@ -34,8 +34,9 @@ module DeltaCloud
34
34
  # @param [String, password] API password
35
35
  # @param [String, user_name] API URL (eg. http://localhost:3001/api)
36
36
  # @return [DeltaCloud::API]
37
- def self.new(user_name, password, api_url, &block)
38
- API.new(user_name, password, api_url, &block)
37
+ def self.new(user_name, password, api_url, opts={}, &block)
38
+ opts ||= {}
39
+ API.new(user_name, password, api_url, opts, &block)
39
40
  end
40
41
 
41
42
  # Check given credentials if their are valid against
@@ -62,11 +63,13 @@ module DeltaCloud
62
63
  end
63
64
 
64
65
  class API
65
- attr_reader :api_uri, :driver_name, :api_version, :features, :entry_points
66
+ attr_reader :api_uri, :driver_name, :api_version, :features, :entry_points
67
+ attr_reader :api_driver, :api_provider
66
68
 
67
69
  def initialize(user_name, password, api_url, opts={}, &block)
68
70
  opts[:version] = true
69
- @username, @password = user_name, password
71
+ @api_driver, @api_provider = opts[:driver], opts[:provider]
72
+ @username, @password = opts[:username] || user_name, opts[:password] || password
70
73
  @api_uri = URI.parse(api_url)
71
74
  @features, @entry_points = {}, {}
72
75
  @verbose = opts[:verbose] || false
@@ -90,7 +93,7 @@ module DeltaCloud
90
93
  # Define methods based on 'rel' attribute in entry point
91
94
  # Two methods are declared: 'images' and 'image'
92
95
  def declare_entry_points_methods(entry_points)
93
-
96
+
94
97
  API.instance_eval do
95
98
  entry_points.keys.select {|k| [:instance_states].include?(k)==false }.each do |model|
96
99
 
@@ -99,13 +102,13 @@ module DeltaCloud
99
102
  base_object_collection(model, response)
100
103
  end
101
104
  end
102
-
105
+
103
106
  define_method :"#{model.to_s.singularize}" do |*args|
104
107
  request(:get, "#{entry_points[model]}/#{args[0]}") do |response|
105
108
  base_object(model, response)
106
109
  end
107
110
  end
108
-
111
+
109
112
  define_method :"fetch_#{model.to_s.singularize}" do |url|
110
113
  id = url.grep(/\/#{model}\/(.*)$/)
111
114
  self.send(model.to_s.singularize.to_sym, $1)
@@ -129,7 +132,7 @@ module DeltaCloud
129
132
 
130
133
  # Convert XML response to defined Ruby Class
131
134
  def xml_to_class(base_object, item)
132
-
135
+
133
136
  return nil unless item
134
137
 
135
138
  params = {
@@ -166,11 +169,17 @@ module DeltaCloud
166
169
  end && next
167
170
  end
168
171
 
172
+ if attribute.name == 'mount'
173
+ obj.add_link!("instance", (attribute/"./instance/@id").first)
174
+ obj.add_text!("device", (attribute/"./device/@name").first.value)
175
+ next
176
+ end
177
+
169
178
  # Deal with collections like public-addresses, private-addresses
170
179
  if (attribute/'./*').length > 0
171
180
  obj.add_collection!(attribute.name, (attribute/'*').collect { |value| value.text }) && next
172
181
  end
173
-
182
+
174
183
  # Anything else is treaten as text object
175
184
  obj.add_text!(attribute.name, attribute.text.convert)
176
185
  end
@@ -185,15 +194,15 @@ module DeltaCloud
185
194
  api_xml = Nokogiri::XML(response)
186
195
  @driver_name = api_xml.xpath('/api').first['driver']
187
196
  @api_version = api_xml.xpath('/api').first['version']
188
-
197
+
189
198
  api_xml.css("api > link").each do |entry_point|
190
199
  rel, href = entry_point['rel'].to_sym, entry_point['href']
191
200
  @entry_points.store(rel, href)
192
-
201
+
193
202
  entry_point.css("feature").each do |feature|
194
203
  @features[rel] ||= []
195
204
  @features[rel] << feature['name'].to_sym
196
-
205
+
197
206
  end
198
207
  end
199
208
  end
@@ -235,6 +244,25 @@ module DeltaCloud
235
244
  raise NoMethodError
236
245
  end
237
246
 
247
+ def use_driver(driver, opts={})
248
+ if opts[:driver]
249
+ @api_driver = driver
250
+ @driver_name = driver
251
+ discover_entry_points
252
+ end
253
+ @username = opts[:username] if opts[:username]
254
+ @password = opts[:password] if opts[:password]
255
+ @api_provider = opts[:provider] if opts[:provider]
256
+ return self
257
+ end
258
+
259
+ def extended_headers
260
+ headers = {}
261
+ headers["X-Deltacloud-Driver"] = @api_driver.to_s if @api_driver
262
+ headers["X-Deltacloud-Provider"] = @api_provider.to_s if @api_provider
263
+ headers
264
+ end
265
+
238
266
  # Basic request method
239
267
  #
240
268
  def request(*args, &block)
@@ -247,9 +275,9 @@ module DeltaCloud
247
275
  if conf[:query_args] != {}
248
276
  conf[:path] += '?' + URI.escape(conf[:query_args].collect{ |key, value| "#{key}=#{value}" }.join('&')).to_s
249
277
  end
250
-
278
+
251
279
  if conf[:method].eql?(:post)
252
- RestClient.send(:post, conf[:path], conf[:form_data], default_headers) do |response, request, block|
280
+ RestClient.send(:post, conf[:path], conf[:form_data], default_headers.merge(extended_headers)) do |response, request, block|
253
281
  handle_backend_error(response) if response.code.eql?(500)
254
282
  if response.respond_to?('body')
255
283
  yield response.body if block_given?
@@ -258,7 +286,7 @@ module DeltaCloud
258
286
  end
259
287
  end
260
288
  else
261
- RestClient.send(conf[:method], conf[:path], default_headers) do |response, request, block|
289
+ RestClient.send(conf[:method], conf[:path], default_headers.merge(extended_headers)) do |response, request, block|
262
290
  handle_backend_error(response) if response.code.eql?(500)
263
291
  if conf[:method].eql?(:get) and [301, 302, 307].include? response.code
264
292
  response.follow_redirection(request) do |response, request, block|
@@ -34,9 +34,9 @@ describe "instances" do
34
34
  instance.owner_id.should_not be_nil
35
35
  instance.owner_id.should be_a( String )
36
36
  instance.image.should_not be_nil
37
- instance.image.should be_a( DeltaCloud::API::Image )
37
+ instance.image.should be_a( DeltaCloud::API::Base::Image )
38
38
  instance.hardware_profile.should_not be_nil
39
- instance.hardware_profile.should be_a( DeltaCloud::API::HardwareProfile )
39
+ instance.hardware_profile.should be_a( DeltaCloud::API::Base::HardwareProfile )
40
40
  instance.state.should_not be_nil
41
41
  instance.state.should be_a( String )
42
42
  instance.public_addresses.should_not be_nil
@@ -44,7 +44,6 @@ describe "storage volumes" do
44
44
  storage_volume = client.storage_volume( 'vol3' )
45
45
  storage_volume.id.should eql( 'vol3' )
46
46
  storage_volume.uri.should eql( API_URL + '/storage_volumes/vol3' )
47
- storage_volume.state.should eql( 'IN-USE' )
48
47
  storage_volume.capacity.should eql( 1.0 )
49
48
  storage_volume.device.should eql( '/dev/sda1' )
50
49
  storage_volume.instance.should_not be_nil
@@ -61,7 +60,6 @@ describe "storage volumes" do
61
60
  storage_volume.should_not be_nil
62
61
  storage_volume.id.should eql( 'vol3' )
63
62
  storage_volume.uri.should eql( API_URL + '/storage_volumes/vol3' )
64
- storage_volume.state.should eql( 'IN-USE' )
65
63
  storage_volume.capacity.should eql( 1.0 )
66
64
  storage_volume.device.should eql( '/dev/sda1' )
67
65
  storage_volume.instance.should_not be_nil
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deltacloud-client
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 0
10
- version: 0.1.0
9
+ - 1
10
+ version: 0.1.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Red Hat, Inc.
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-29 00:00:00 +02:00
18
+ date: 2010-12-09 00:00:00 +01:00
19
19
  default_executable: deltacloudc
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -26,12 +26,12 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- hash: 3
29
+ hash: 13
30
30
  segments:
31
31
  - 1
32
- - 4
33
- - 2
34
- version: 1.4.2
32
+ - 6
33
+ - 1
34
+ version: 1.6.1
35
35
  type: :runtime
36
36
  version_requirements: *id001
37
37
  - !ruby/object:Gem::Dependency
@@ -42,12 +42,12 @@ dependencies:
42
42
  requirements:
43
43
  - - ">="
44
44
  - !ruby/object:Gem::Version
45
- hash: 5
45
+ hash: 1
46
46
  segments:
47
47
  - 1
48
48
  - 4
49
- - 1
50
- version: 1.4.1
49
+ - 3
50
+ version: 1.4.3
51
51
  type: :runtime
52
52
  version_requirements: *id002
53
53
  - !ruby/object:Gem::Dependency
@@ -81,8 +81,8 @@ files:
81
81
  - lib/hwp_properties.rb
82
82
  - lib/instance_state.rb
83
83
  - lib/string.rb
84
- - lib/deltacloud.rb
85
84
  - lib/base_object.rb
85
+ - lib/deltacloud.rb
86
86
  - init.rb
87
87
  - bin/deltacloudc
88
88
  - COPYING
@@ -103,9 +103,11 @@ files:
103
103
  - specs/initialization_spec.rb
104
104
  - specs/instance_states_spec.rb
105
105
  - specs/realms_spec.rb
106
- - specs/spec_helper.rb
107
106
  - specs/storage_snapshot_spec.rb
107
+ - specs/hardware_profiles_spec.rb
108
108
  - specs/storage_volume_spec.rb
109
+ - specs/spec_helper.rb
110
+ - specs/instances_spec.rb
109
111
  - specs/data/storage_volumes/vol1.yml
110
112
  - specs/data/storage_volumes/vol3.yml
111
113
  - specs/data/storage_volumes/vol2.yml
@@ -118,8 +120,6 @@ files:
118
120
  - specs/data/instances/inst1.yml
119
121
  - specs/data/instances/inst2.yml
120
122
  - specs/data/instances/inst0.yml
121
- - specs/hardware_profiles_spec.rb
122
- - specs/instances_spec.rb
123
123
  has_rdoc: true
124
124
  homepage: http://www.deltacloud.org
125
125
  licenses: []
@@ -172,9 +172,11 @@ test_files:
172
172
  - specs/initialization_spec.rb
173
173
  - specs/instance_states_spec.rb
174
174
  - specs/realms_spec.rb
175
- - specs/spec_helper.rb
176
175
  - specs/storage_snapshot_spec.rb
176
+ - specs/hardware_profiles_spec.rb
177
177
  - specs/storage_volume_spec.rb
178
+ - specs/spec_helper.rb
179
+ - specs/instances_spec.rb
178
180
  - specs/data/storage_volumes/vol1.yml
179
181
  - specs/data/storage_volumes/vol3.yml
180
182
  - specs/data/storage_volumes/vol2.yml
@@ -187,5 +189,3 @@ test_files:
187
189
  - specs/data/instances/inst1.yml
188
190
  - specs/data/instances/inst2.yml
189
191
  - specs/data/instances/inst0.yml
190
- - specs/hardware_profiles_spec.rb
191
- - specs/instances_spec.rb