bbrowning-deltacloud-client 0.0.6.1 → 0.0.9.4

Sign up to get free protection for your applications and to get access to all the features.
data/bin/deltacloudc CHANGED
@@ -20,8 +20,8 @@
20
20
  require 'rubygems'
21
21
  require 'optparse'
22
22
  require 'uri'
23
- require 'lib/deltacloud'
24
- require 'lib/plain_formatter'
23
+ require 'deltacloud'
24
+ require 'plain_formatter'
25
25
 
26
26
  include DeltaCloud::PlainFormatter
27
27
 
@@ -80,8 +80,7 @@ collections.delete(:instance_states)
80
80
  # with API documentation
81
81
  if options[:list] and options[:collection].nil?
82
82
  collections.each do |c|
83
- doc = client.fetch_documentation(c.to_s)
84
- puts sprintf("%-22s: %s", c.to_s[0, 22], doc[:description])
83
+ puts sprintf("%-22s", c.to_s[0, 22])
85
84
  end
86
85
  exit(0)
87
86
  end
@@ -89,9 +88,9 @@ end
89
88
  # If collection parameter is present and user requested list
90
89
  # print all operation defined for collection with API documentation
91
90
  if options[:list] and options[:collection]
92
- doc = client.fetch_documentation(options[:collection])
93
- doc[:operations].each do |c|
94
- puts sprintf("%-20s: %s", c[:name][0, 20], c[:description])
91
+ doc = client.documentation(options[:collection])
92
+ doc.operations.each do |c|
93
+ puts sprintf("%-20s: %s", c.operation, c.description)
95
94
  end
96
95
  exit(0)
97
96
  end
data/lib/deltacloud.rb CHANGED
@@ -16,7 +16,7 @@
16
16
  # License for the specific language governing permissions and limitations
17
17
  # under the License.
18
18
 
19
- require 'hpricot'
19
+ require 'nokogiri'
20
20
  require 'rest_client'
21
21
  require 'base64'
22
22
  require 'logger'
@@ -116,7 +116,7 @@ module DeltaCloud
116
116
 
117
117
  def base_object_collection(c, model, response)
118
118
  collection = []
119
- Hpricot::XML(response).search("#{model}/#{model.to_s.singularize}").each do |item|
119
+ Nokogiri::XML(response).xpath("#{model}/#{model.to_s.singularize}").each do |item|
120
120
  c.instance_eval do
121
121
  attr_accessor :id
122
122
  attr_accessor :uri
@@ -129,7 +129,7 @@ module DeltaCloud
129
129
  # Add default attributes [id and href] to class
130
130
  def base_object(c, model, response)
131
131
  obj = nil
132
- Hpricot::XML(response).search("#{model.to_s.singularize}").each do |item|
132
+ Nokogiri::XML(response).xpath("#{model.to_s.singularize}").each do |item|
133
133
  c.instance_eval do
134
134
  attr_accessor :id
135
135
  attr_accessor :uri
@@ -155,7 +155,7 @@ module DeltaCloud
155
155
  logger << "[DC] Creating class #{obj.class.name}\n"
156
156
  obj.instance_eval do
157
157
  # Declare methods for all attributes in object
158
- item.search('./*').each do |attribute|
158
+ item.xpath('./*').each do |attribute|
159
159
  # If attribute is a link to another object then
160
160
  # create a method which request this object from API
161
161
  if api.entry_points.keys.include?(:"#{attribute.name}s")
@@ -174,7 +174,7 @@ module DeltaCloud
174
174
  # to dynamicaly create .stop!, .start! methods
175
175
  when "actions":
176
176
  actions = []
177
- attribute.search('link').each do |link|
177
+ attribute.xpath('link').each do |link|
178
178
  actions << [link['rel'], link[:href]]
179
179
  define_method :"#{link['rel'].sanitize}!" do
180
180
  client.request(:"#{link['method']}", link['href'], {}, {})
@@ -191,18 +191,19 @@ module DeltaCloud
191
191
  end
192
192
  # Property attribute is handled differently
193
193
  when "property":
194
- define_method :"#{attribute['name'].sanitize}" do
195
- if attribute['value'] =~ /^(\d+)$/
196
- DeltaCloud::HWP::FloatProperty.new(attribute, attribute['name'])
197
- else
198
- DeltaCloud::HWP::Property.new(attribute, attribute['name'])
199
- end
194
+ attr_accessor :"#{attribute['name'].sanitize}"
195
+ if attribute['value'] =~ /^(\d+)$/
196
+ obj.send(:"#{attribute['name'].sanitize}=",
197
+ DeltaCloud::HWP::FloatProperty.new(attribute, attribute['name']))
198
+ else
199
+ obj.send(:"#{attribute['name'].sanitize}=",
200
+ DeltaCloud::HWP::Property.new(attribute, attribute['name']))
200
201
  end
201
202
  # Public and private addresses are returned as Array
202
203
  when "public_addresses", "private_addresses":
203
204
  attr_accessor :"#{attribute.name.sanitize}"
204
205
  obj.send(:"#{attribute.name.sanitize}=",
205
- attribute.search('address').collect { |address| address.text })
206
+ attribute.xpath('address').collect { |address| address.text })
206
207
  # Value for other attributes are just returned using
207
208
  # method with same name as attribute (eg. .owner_id, .state)
208
209
  else
@@ -221,16 +222,16 @@ module DeltaCloud
221
222
  def discover_entry_points
222
223
  return if discovered?
223
224
  request(:get, @api_uri.to_s) do |response|
224
- api_xml = Hpricot::XML(response)
225
- @driver_name = api_xml.search('/api').first['driver']
226
- @api_version = api_xml.search('/api').first['version']
225
+ api_xml = Nokogiri::XML(response)
226
+ @driver_name = api_xml.xpath('/api').first['driver']
227
+ @api_version = api_xml.xpath('/api').first['version']
227
228
  logger << "[API] Version #{@api_version}\n"
228
229
  logger << "[API] Driver #{@driver_name}\n"
229
- api_xml.search("api > link").each do |entry_point|
230
+ api_xml.css("api > link").each do |entry_point|
230
231
  rel, href = entry_point['rel'].to_sym, entry_point['href']
231
232
  @entry_points.store(rel, href)
232
233
  logger << "[API] Entry point '#{rel}' added\n"
233
- entry_point.search("feature").each do |feature|
234
+ entry_point.css("feature").each do |feature|
234
235
  @features[rel] ||= []
235
236
  @features[rel] << feature['name'].to_sym
236
237
  logger << "[API] Feature #{feature['name']} added to #{rel}\n"
@@ -239,6 +240,17 @@ module DeltaCloud
239
240
  end
240
241
  declare_entry_points_methods(@entry_points)
241
242
  end
243
+
244
+ def create_instance_credential(opts={}, &block)
245
+ params = { :name => opts[:name] }
246
+ instance_credential = nil
247
+ request(:post, entry_points[:instance_credentials], {}, params) do |response|
248
+ c = DeltaCloud.define_class("InstanceCredential")
249
+ instance_credential = base_object(c, :instance_credential, response)
250
+ yield instance_credential if block_given?
251
+ end
252
+ return instance_credential
253
+ end
242
254
 
243
255
  # Create a new instance, using image +image_id+. Possible optiosn are
244
256
  #
@@ -254,11 +266,13 @@ module DeltaCloud
254
266
  name = opts[:name]
255
267
  realm_id = opts[:realm]
256
268
  user_data = opts[:user_data]
269
+ key_name = opts[:key_name]
257
270
 
258
271
  params = opts.dup
259
272
  ( params[:realm_id] = realm_id ) if realm_id
260
273
  ( params[:name] = name ) if name
261
274
  ( params[:user_data] = user_data ) if user_data
275
+ ( params[:keyname] = user_data ) if key_name
262
276
 
263
277
  if opts[:hardware_profile].is_a?(String)
264
278
  params[:hwp_id] = opts[:hardware_profile]
@@ -315,16 +329,16 @@ module DeltaCloud
315
329
 
316
330
  # Check if specified collection have wanted feature
317
331
  def feature?(collection, name)
318
- @feature.has_key?(collection) && @feature[collection].include?(name)
332
+ @features.has_key?(collection) && @features[collection].include?(name)
319
333
  end
320
334
 
321
335
  # List available instance states and transitions between them
322
336
  def instance_states
323
337
  states = []
324
338
  request(:get, entry_points[:instance_states]) do |response|
325
- Hpricot::XML(response).search('states/state').each do |state_el|
339
+ Nokogiri::XML(response).xpath('states/state').each do |state_el|
326
340
  state = DeltaCloud::InstanceState::State.new(state_el['name'])
327
- state_el.search('transition').each do |transition_el|
341
+ state_el.xpath('transition').each do |transition_el|
328
342
  state.transitions << DeltaCloud::InstanceState::Transition.new(
329
343
  transition_el['to'],
330
344
  transition_el['action']
@@ -349,9 +363,10 @@ module DeltaCloud
349
363
  def documentation(collection, operation=nil)
350
364
  data = {}
351
365
  request(:get, "/docs/#{collection}") do |body|
352
- document = Hpricot::XML(body)
366
+ document = Nokogiri::XML(body)
353
367
  if operation
354
- data[:description] = document.search('/docs/collection/operations/operation[@name = "'+operation+'"]/description').first
368
+ data[:operation] = operation
369
+ data[:description] = document.xpath('/docs/collection/operations/operation[@name = "'+operation+'"]/description').first.text.strip
355
370
  return false unless data[:description]
356
371
  data[:params] = []
357
372
  (document/"/docs/collection/operations/operation[@name='#{operation}']/parameter").each do |param|
@@ -363,9 +378,11 @@ module DeltaCloud
363
378
  end
364
379
  else
365
380
  data[:description] = (document/'/docs/collection/description').text
381
+ data[:collection] = collection
382
+ data[:operations] = (document/"/docs/collection/operations/operation").collect{ |o| o['name'] }
366
383
  end
367
384
  end
368
- return Documentation.new(data)
385
+ return Documentation.new(self, data)
369
386
  end
370
387
 
371
388
  private
@@ -384,15 +401,23 @@ module DeltaCloud
384
401
  end
385
402
 
386
403
  class Documentation
387
- attr_reader :description
388
- attr_reader :params
389
404
 
390
- def initialize(opts={})
391
- @description = opts[:description]
405
+ attr_reader :api, :description, :params, :collection_operations
406
+ attr_reader :collection, :operation
407
+
408
+ def initialize(api, opts={})
409
+ @description, @api = opts[:description], api
392
410
  @params = parse_parameters(opts[:params]) if opts[:params]
411
+ @collection_operations = opts[:operations] if opts[:operations]
412
+ @collection = opts[:collection]
413
+ @operation = opts[:operation]
393
414
  self
394
415
  end
395
416
 
417
+ def operations
418
+ @collection_operations.collect { |o| api.documentation(@collection, o) }
419
+ end
420
+
396
421
  class OperationParameter
397
422
  attr_reader :name
398
423
  attr_reader :type
@@ -466,12 +491,12 @@ module DeltaCloud
466
491
  self.class.instance_eval do
467
492
  attr_reader :range
468
493
  end
469
- @range = { :from => xml.search('range').first['first'], :to => xml.search('range').first['last'] }
494
+ @range = { :from => xml.xpath('range').first['first'], :to => xml.xpath('range').first['last'] }
470
495
  when 'enum':
471
496
  self.class.instance_eval do
472
497
  attr_reader :options
473
498
  end
474
- @options = xml.search('enum/entry').collect { |e| e['value'] }
499
+ @options = xml.xpath('enum/entry').collect { |e| e['value'] }
475
500
  end
476
501
  end
477
502
 
data/lib/documentation.rb CHANGED
@@ -12,7 +12,8 @@ end
12
12
  @dc.entry_points.keys.each do |ep|
13
13
  @dc.send(ep)
14
14
  end
15
- class_list = @dc.classes
15
+
16
+ class_list = DeltaCloud::classes.collect { |c| DeltaCloud::module_eval("::DeltaCloud::API::#{c}")}
16
17
 
17
18
  def read_method_description(c, method)
18
19
  if method =~ /es$/
@@ -57,13 +58,13 @@ class_list.each do |c|
57
58
  @dc.entry_points.keys.each do |ep|
58
59
  out << "# Return #{ep.to_s.classify} object with given id\n"
59
60
  out << "# "
60
- out << "# *#{@dc.documentation(ep.to_s).description}*"
61
+ out << "# #{@dc.documentation(ep.to_s).description.split("\n").join("\n# ")}"
61
62
  out << "# @return [#{ep.to_s.classify}]"
62
63
  out << "def #{ep.to_s.gsub(/s$/, '')}"
63
64
  out << "end"
64
65
  out << "# Return collection of #{ep.to_s.classify} objects"
65
66
  out << "# "
66
- out << "# *#{@dc.documentation(ep.to_s).description}*"
67
+ out << "# #{@dc.documentation(ep.to_s).description.split("\n").join("\n# ")}"
67
68
  @dc.documentation(ep.to_s, 'index').params.each do |p|
68
69
  out << p.to_comment
69
70
  end
@@ -77,7 +77,7 @@ module DeltaCloud
77
77
  end
78
78
 
79
79
  def format(obj)
80
- object_name = obj.class.name.classify.gsub(/^DeltaCloud::/, '')
80
+ object_name = obj.class.name.classify.gsub(/^DeltaCloud::API::/, '')
81
81
  format_class = DeltaCloud::PlainFormatter::FormatObject.const_get(object_name)
82
82
  format_class.new(obj).format
83
83
  end
@@ -37,9 +37,7 @@ describe "hardware_profiles" do
37
37
  hardware_profiles.each do |hwp|
38
38
  hwp.uri.should_not be_nil
39
39
  hwp.uri.should be_a(String)
40
- prop_check(hwp.architecture, String)
41
- prop_check(hwp.storage, Float)
42
- prop_check(hwp.memory, Float)
40
+ prop_check(hwp.architecture, String) if hwp.architecture
43
41
  end
44
42
  end
45
43
  end
@@ -61,6 +59,14 @@ describe "hardware_profiles" do
61
59
  end
62
60
  end
63
61
 
62
+ it "should allow fetching different hardware_profiles" do
63
+ client = DeltaCloud.new( API_NAME, API_PASSWORD, API_URL )
64
+ hwp1 = client.hardware_profile( 'm1-small' )
65
+ hwp2 = client.hardware_profile( 'm1-xlarge' )
66
+ hwp1.storage.value.should_not eql(hwp2.storage.value)
67
+ hwp1.memory.value.should_not eql(hwp2.memory.value)
68
+ end
69
+
64
70
  it "should allow fetching a hardware_profile by URI" do
65
71
  DeltaCloud.new( API_NAME, API_PASSWORD, API_URL ) do |client|
66
72
  hwp = client.fetch_hardware_profile( API_URL + '/hardware_profiles/m1-small' )
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bbrowning-deltacloud-client
3
3
  version: !ruby/object:Gem::Version
4
- hash: 85
4
+ hash: 99
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 6
10
- - 1
11
- version: 0.0.6.1
9
+ - 9
10
+ - 4
11
+ version: 0.0.9.4
12
12
  platform: ruby
13
13
  authors:
14
14
  - Red Hat, Inc.
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-07-25 00:00:00 -04:00
19
+ date: 2010-08-23 00:00:00 -04:00
20
20
  default_executable: deltacloudc
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -36,19 +36,21 @@ dependencies:
36
36
  type: :runtime
37
37
  version_requirements: *id001
38
38
  - !ruby/object:Gem::Dependency
39
- name: hpricot
39
+ name: nokogiri
40
40
  prerelease: false
41
41
  requirement: &id002 !ruby/object:Gem::Requirement
42
42
  none: false
43
43
  requirements:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- hash: 59
46
+ hash: 62196439
47
47
  segments:
48
+ - 1
49
+ - 5
48
50
  - 0
49
- - 8
51
+ - beta
50
52
  - 2
51
- version: 0.8.2
53
+ version: 1.5.0.beta.2
52
54
  type: :runtime
53
55
  version_requirements: *id002
54
56
  - !ruby/object:Gem::Dependency
@@ -77,34 +79,34 @@ extra_rdoc_files:
77
79
  - COPYING
78
80
  files:
79
81
  - Rakefile
82
+ - lib/deltacloud.rb
80
83
  - lib/documentation.rb
81
84
  - lib/plain_formatter.rb
82
- - lib/deltacloud.rb
83
85
  - init.rb
84
86
  - bin/deltacloudc
85
87
  - COPYING
86
- - specs/shared/resources.rb
87
- - specs/realms_spec.rb
88
- - specs/images_spec.rb
89
- - specs/storage_snapshot_spec.rb
90
- - specs/spec_helper.rb
91
- - specs/instance_states_spec.rb
92
- - specs/hardware_profiles_spec.rb
93
- - specs/storage_volume_spec.rb
88
+ - specs/fixtures/images/img1.yml
89
+ - specs/fixtures/images/img2.yml
90
+ - specs/fixtures/images/img3.yml
91
+ - specs/fixtures/instances/inst0.yml
94
92
  - specs/fixtures/instances/inst1.yml
95
93
  - specs/fixtures/instances/inst2.yml
96
- - specs/fixtures/instances/inst0.yml
97
- - specs/fixtures/storage_volumes/vol1.yml
98
- - specs/fixtures/storage_volumes/vol3.yml
99
- - specs/fixtures/storage_volumes/vol2.yml
100
- - specs/fixtures/storage_snapshots/snap3.yml
101
94
  - specs/fixtures/storage_snapshots/snap1.yml
102
95
  - specs/fixtures/storage_snapshots/snap2.yml
103
- - specs/fixtures/images/img2.yml
104
- - specs/fixtures/images/img1.yml
105
- - specs/fixtures/images/img3.yml
106
- - specs/instances_spec.rb
96
+ - specs/fixtures/storage_snapshots/snap3.yml
97
+ - specs/fixtures/storage_volumes/vol1.yml
98
+ - specs/fixtures/storage_volumes/vol2.yml
99
+ - specs/fixtures/storage_volumes/vol3.yml
100
+ - specs/hardware_profiles_spec.rb
101
+ - specs/images_spec.rb
107
102
  - specs/initialization_spec.rb
103
+ - specs/instance_states_spec.rb
104
+ - specs/instances_spec.rb
105
+ - specs/realms_spec.rb
106
+ - specs/shared/resources.rb
107
+ - specs/spec_helper.rb
108
+ - specs/storage_snapshot_spec.rb
109
+ - specs/storage_volume_spec.rb
108
110
  has_rdoc: true
109
111
  homepage: http://www.deltacloud.org
110
112
  licenses: []
@@ -140,25 +142,25 @@ signing_key:
140
142
  specification_version: 3
141
143
  summary: Deltacloud REST Client
142
144
  test_files:
143
- - specs/shared/resources.rb
144
- - specs/realms_spec.rb
145
- - specs/images_spec.rb
146
- - specs/storage_snapshot_spec.rb
147
- - specs/spec_helper.rb
148
- - specs/instance_states_spec.rb
149
- - specs/hardware_profiles_spec.rb
150
- - specs/storage_volume_spec.rb
145
+ - specs/fixtures/images/img1.yml
146
+ - specs/fixtures/images/img2.yml
147
+ - specs/fixtures/images/img3.yml
148
+ - specs/fixtures/instances/inst0.yml
151
149
  - specs/fixtures/instances/inst1.yml
152
150
  - specs/fixtures/instances/inst2.yml
153
- - specs/fixtures/instances/inst0.yml
154
- - specs/fixtures/storage_volumes/vol1.yml
155
- - specs/fixtures/storage_volumes/vol3.yml
156
- - specs/fixtures/storage_volumes/vol2.yml
157
- - specs/fixtures/storage_snapshots/snap3.yml
158
151
  - specs/fixtures/storage_snapshots/snap1.yml
159
152
  - specs/fixtures/storage_snapshots/snap2.yml
160
- - specs/fixtures/images/img2.yml
161
- - specs/fixtures/images/img1.yml
162
- - specs/fixtures/images/img3.yml
163
- - specs/instances_spec.rb
153
+ - specs/fixtures/storage_snapshots/snap3.yml
154
+ - specs/fixtures/storage_volumes/vol1.yml
155
+ - specs/fixtures/storage_volumes/vol2.yml
156
+ - specs/fixtures/storage_volumes/vol3.yml
157
+ - specs/hardware_profiles_spec.rb
158
+ - specs/images_spec.rb
164
159
  - specs/initialization_spec.rb
160
+ - specs/instance_states_spec.rb
161
+ - specs/instances_spec.rb
162
+ - specs/realms_spec.rb
163
+ - specs/shared/resources.rb
164
+ - specs/spec_helper.rb
165
+ - specs/storage_snapshot_spec.rb
166
+ - specs/storage_volume_spec.rb