deltacloud-core 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -37,15 +37,22 @@ Rake::TestTask.new("test") { |t|
37
37
  'tests/images_test.rb',
38
38
  'tests/instances_test.rb',
39
39
  'tests/instance_states_test.rb',
40
+ 'tests/url_for_test.rb'
40
41
  ]
41
42
  t.verbose = true
42
43
  t.warning = false
43
44
  }
44
45
 
45
- load 'deltacloud-core.gemspec'
46
46
 
47
- Rake::GemPackageTask.new(@spec) do |pkg|
48
- pkg.need_tar = true
47
+ @specs = ['ruby', 'java'].inject({}) do |hash, spec_platform|
48
+ $platform = spec_platform
49
+ hash.update(spec_platform => Gem::Specification.load('deltacloud-core.gemspec'))
50
+ end
51
+
52
+ @specs.values.each do |spec|
53
+ Rake::GemPackageTask.new(spec) do |pkg|
54
+ pkg.need_tar = true
55
+ end
49
56
  end
50
57
 
51
58
  desc "Install API"
@@ -2,7 +2,6 @@
2
2
 
3
3
  require 'rubygems'
4
4
  require 'optparse'
5
- require 'thin'
6
5
 
7
6
  options = {
8
7
  :env => 'development'
@@ -44,45 +43,78 @@ end
44
43
  ENV["API_HOST"] = "localhost" unless ENV["API_HOST"]
45
44
  ENV["API_PORT"] = "3001" unless ENV["API_PORT"]
46
45
 
46
+ puts "Starting Deltacloud API :: #{ENV["API_DRIVER"]} :: http://#{ENV["API_HOST"]}:#{ENV["API_PORT"]}/api"
47
+ puts
48
+
47
49
  dirname="#{File.dirname(__FILE__)}/.."
50
+ platform = RUBY_PLATFORM[/java/] || 'ruby'
48
51
 
49
- argv_opts = ARGV.clone
50
- argv_opts << ['start'] unless Thin::Runner.commands.include?(options[0])
51
- argv_opts << ['--address', ENV["API_HOST"] ]
52
- argv_opts << ['--port', ENV["API_PORT"] ]
53
- argv_opts << ['--rackup', 'config.ru' ]
54
- argv_opts << ['--chdir', dirname ]
55
- argv_opts << ['-e', options[:env] ]
56
- argv_opts << ['--threaded', '-D', '--stats', '/stats']
57
-
58
- argv_opts.flatten!
59
-
60
- if options[:env] == "development"
61
- use_rerun = false
62
- begin
63
- require "rerun"
64
- use_rerun = true
65
- rescue
66
- # Do nothing
67
- end
68
- end
52
+ if platform == 'java'
53
+ require 'rack'
69
54
 
70
- puts "Starting Deltacloud API :: #{ENV["API_DRIVER"]} :: http://#{ENV["API_HOST"]}:#{ENV["API_PORT"]}/api"
71
- puts
55
+ # We can't chdir with webrick so add our root directory
56
+ # onto the load path
57
+ $: << dirname
58
+
59
+ # Read in config.ru and convert it to an instance of Rack::Builder
60
+ cfgfile = File.read(File.join(dirname, 'config.ru'))
61
+ inner_app = eval("Rack::Builder.new {(" + cfgfile + "\n )}.to_app",
62
+ nil, 'config.ru')
72
63
 
73
- if use_rerun
74
- argv_opts.unshift "thin"
75
- command = argv_opts.join(" ")
76
- topdir = File::expand_path(File::join(File::dirname(__FILE__), ".."))
77
- rerun = Rerun::Runner.new(command, :dir => topdir)
78
- rerun.start
79
- rerun.join
64
+ app = Rack::Builder.new {
65
+ use Rack::CommonLogger # apache-like logging
66
+ use Rack::Reloader if options[:env] == "development"
67
+ set :root, dirname # Set Sinatra root since we can't chdir to ../
68
+ run inner_app
69
+ }.to_app
70
+
71
+ # There's a bug with string ports on JRuby so convert to int
72
+ # http://jira.codehaus.org/browse/JRUBY-4868
73
+ port = ENV["API_PORT"].to_i
74
+
75
+ puts "=> Ctrl-C to shutdown server"
76
+ Rack::Handler::WEBrick.run(app,
77
+ :Host => ENV["API_HOST"],
78
+ :Port => port,
79
+ :AccessLog => [])
80
80
  else
81
- thin = Thin::Runner.new(argv_opts)
81
+ require 'thin'
82
+
83
+ argv_opts = ARGV.clone
84
+ argv_opts << ['start'] unless Thin::Runner.commands.include?(options[0])
85
+ argv_opts << ['--address', ENV["API_HOST"] ]
86
+ argv_opts << ['--port', ENV["API_PORT"] ]
87
+ argv_opts << ['--rackup', 'config.ru' ]
88
+ argv_opts << ['--chdir', dirname ]
89
+ argv_opts << ['-e', options[:env] ]
90
+ argv_opts << ['--threaded', '-D', '--stats', '/stats']
91
+
92
+ argv_opts.flatten!
93
+
94
+ if options[:env] == "development"
95
+ use_rerun = false
96
+ begin
97
+ require "rerun"
98
+ use_rerun = true
99
+ rescue
100
+ # Do nothing
101
+ end
102
+ end
103
+
104
+ if use_rerun
105
+ argv_opts.unshift "thin"
106
+ command = argv_opts.join(" ")
107
+ topdir = File::expand_path(File::join(File::dirname(__FILE__), ".."))
108
+ rerun = Rerun::Runner.new(command, :dir => topdir)
109
+ rerun.start
110
+ rerun.join
111
+ else
112
+ thin = Thin::Runner.new(argv_opts)
82
113
 
83
- begin
84
- thin.run!
85
- rescue Exception => e
86
- puts "ERROR: #{e.message}"
114
+ begin
115
+ thin.run!
116
+ rescue Exception => e
117
+ puts "ERROR: #{e.message}"
118
+ end
87
119
  end
88
120
  end
data/config.ru CHANGED
@@ -1,5 +1,5 @@
1
- require 'sinatra'
2
1
  require 'rubygems'
2
+ require 'sinatra'
3
3
 
4
4
  require 'server.rb'
5
5
  run Sinatra::Application
@@ -310,6 +310,15 @@ class EC2Driver < Deltacloud::BaseDriver
310
310
  end
311
311
  end
312
312
 
313
+ def valid_credentials?(credentials)
314
+ client = new_client(credentials)
315
+ # FIXME: We need to do this call to determine if
316
+ # EC2 is working with given credentials. There is no
317
+ # other way to check, if given credentials are valid or not.
318
+ realms = client.describe_availability_zones rescue false
319
+ return realms ? true : false
320
+ end
321
+
313
322
  private
314
323
 
315
324
  def new_client(credentials)
@@ -9,7 +9,7 @@ class GoGridClient
9
9
  apikey='YOUR API KEY',
10
10
  secret='YOUR SHARED SECRET',
11
11
  format='json',
12
- version='1.4')
12
+ version='1.5')
13
13
  @server = server
14
14
  @secret = secret
15
15
  @default_params = {'format'=>format, 'v'=>version,'api_key' => apikey}
@@ -30,7 +30,12 @@ class GoGridClient
30
30
  open(getRequestURL(method,params)).read
31
31
  end
32
32
 
33
- def request(method, params={})
33
+ def request(method, params={}, version=nil)
34
+ if version
35
+ @default_params['v'] = version
36
+ else
37
+ @default_params['v'] = '1.5'
38
+ end
34
39
  begin
35
40
  JSON::parse(sendAPIRequest(method, params))
36
41
  rescue Exception => e
@@ -67,7 +67,7 @@ class GogridDriver < Deltacloud::BaseDriver
67
67
 
68
68
  def realms(credentials, opts=nil)
69
69
  safely do
70
- new_client(credentials).request('common/lookup/list', { 'lookup' => 'image.type' })['list'].collect do |realm|
70
+ new_client(credentials).request('common/lookup/list', { 'lookup' => 'ip.datacenter' })['list'].collect do |realm|
71
71
  convert_realm(realm)
72
72
  end
73
73
  end
@@ -88,7 +88,7 @@ class GogridDriver < Deltacloud::BaseDriver
88
88
  'name' => name,
89
89
  'image' => image_id,
90
90
  'server.ram' => server_ram,
91
- 'ip' => get_next_free_ip(credentials)
91
+ 'ip' => get_free_ip_from_realm(credentials, opts[:realm_id] || '1')
92
92
  })['list'].first
93
93
  if instance
94
94
  login_data = get_login_data(client, instance[:id])
@@ -120,6 +120,7 @@ class GogridDriver < Deltacloud::BaseDriver
120
120
  end
121
121
 
122
122
  def instances(credentials, opts=nil)
123
+ require 'ap'
123
124
  instances = []
124
125
  if opts and opts[:id]
125
126
  begin
@@ -154,25 +155,25 @@ class GogridDriver < Deltacloud::BaseDriver
154
155
 
155
156
  def reboot_instance(credentials, id)
156
157
  safely do
157
- new_client(credentials).request('grid/server/power', { 'id' => id, 'power' => 'reboot'})
158
+ new_client(credentials).request('grid/server/power', { 'name' => id, 'power' => 'reboot'})
158
159
  end
159
160
  end
160
161
 
161
162
  def destroy_instance(credentials, id)
162
163
  safely do
163
- new_client(credentials).request('grid/server/delete', { 'id' => id})
164
+ new_client(credentials).request('grid/server/delete', { 'name' => id})
164
165
  end
165
166
  end
166
167
 
167
168
  def stop_instance(credentials, id)
168
169
  safely do
169
- new_client(credentials).request('grid/server/power', { 'id' => id, 'power' => 'off'})
170
+ new_client(credentials).request('grid/server/power', { 'name' => id, 'power' => 'off'})
170
171
  end
171
172
  end
172
173
 
173
174
  def start_instance(credentials, id)
174
175
  safely do
175
- new_client(credentials).request('grid/server/power', { 'id' => id, 'power' => 'on'})
176
+ new_client(credentials).request('grid/server/power', { 'name' => id, 'power' => 'on'})
176
177
  end
177
178
  end
178
179
 
@@ -183,12 +184,23 @@ class GogridDriver < Deltacloud::BaseDriver
183
184
  def keys(credentials, opts=nil)
184
185
  gogrid = new_client( credentials )
185
186
  creds = []
186
- gogrid.request('support/password/list')['list'].each do |password|
187
- creds << convert_key(password)
187
+ safely do
188
+ gogrid.request('support/password/list')['list'].each do |password|
189
+ creds << convert_key(password)
190
+ end
188
191
  end
189
192
  return creds
190
193
  end
191
194
 
195
+ def valid_credentials?(credentials)
196
+ client = new_client(credentials)
197
+ # FIXME: We need to do this call to determine if
198
+ # GoGrid is working with given credentials. There is no
199
+ # other way to check, if given credentials are valid or not.
200
+ return false unless new_client(credentials).request('common/lookup/list', { 'lookup' => 'ip.datacenter' })
201
+ true
202
+ end
203
+
192
204
  define_instance_states do
193
205
  start.to( :pending ) .automatically
194
206
  pending.to( :running ) .automatically
@@ -202,6 +214,7 @@ class GogridDriver < Deltacloud::BaseDriver
202
214
 
203
215
  def new_client(credentials)
204
216
  GoGridClient.new('https://api.gogrid.com/api', credentials.user, credentials.password)
217
+
205
218
  end
206
219
 
207
220
  def get_login_data(client, instance_id)
@@ -282,7 +295,7 @@ class GogridDriver < Deltacloud::BaseDriver
282
295
  :image_id => instance['image']['id'],
283
296
  :instance_profile => prof,
284
297
  :name => instance['name'],
285
- :realm_id => instance['type']['id'],
298
+ :realm_id => instance['ip']['datacenter']['id'],
286
299
  :state => convert_server_state(instance['state']['name'], instance['id']),
287
300
  :actions => instance_actions_for(convert_server_state(instance['state']['name'], instance['id'])),
288
301
  :public_addresses => [ instance['ip']['ip'] ],
@@ -301,12 +314,13 @@ class GogridDriver < Deltacloud::BaseDriver
301
314
  state.eql?('Off') ? 'STOPPED' : 'RUNNING'
302
315
  end
303
316
 
304
- def get_next_free_ip(credentials)
317
+ def get_free_ip_from_realm(credentials, realm_id)
305
318
  ip = ""
306
319
  safely do
307
320
  ip = new_client(credentials).request('grid/ip/list', {
308
321
  'ip.type' => '1',
309
- 'ip.state' => '1'
322
+ 'ip.state' => '1',
323
+ 'datacenter' => realm_id
310
324
  })['list'].first['ip']
311
325
  end
312
326
  return ip
@@ -0,0 +1,13 @@
1
+ require 'gogrid_client'
2
+ require 'ap'
3
+
4
+ user='fbb1de3897597ccf'
5
+ password='ngieth10'
6
+
7
+ client=GoGridClient.new('https://api.gogrid.com/api', user, password)
8
+
9
+ ap client.request('grid/ip/list', {
10
+ 'ip.type' => '1',
11
+ 'ip.state' => '1',
12
+ 'datacenter' => '1'
13
+ })
@@ -257,6 +257,15 @@ class MockDriver < Deltacloud::BaseDriver
257
257
  snapshots
258
258
  end
259
259
 
260
+ def valid_credentials?(credentials)
261
+ begin
262
+ check_credentials(credentials)
263
+ return true
264
+ rescue Deltacloud::AuthException
265
+ end
266
+ return false
267
+ end
268
+
260
269
  private
261
270
 
262
271
  def check_credentials(credentials)
@@ -73,6 +73,11 @@ class RackspaceDriver < Deltacloud::BaseDriver
73
73
  safely do
74
74
  racks.reboot_server(id)
75
75
  end
76
+ Instance.new( {
77
+ :id => id,
78
+ :state => "REBOOT",
79
+ :actions => instance_actions_for( state ),
80
+ } )
76
81
  end
77
82
 
78
83
  def stop_instance(credentials, id)
@@ -84,6 +89,11 @@ class RackspaceDriver < Deltacloud::BaseDriver
84
89
  safely do
85
90
  racks.delete_server(id)
86
91
  end
92
+ Instance.new( {
93
+ :id => id,
94
+ :state => "STOPPED",
95
+ :actions => instance_actions_for( "STOPPED" ),
96
+ } )
87
97
  end
88
98
 
89
99
 
@@ -121,9 +131,17 @@ class RackspaceDriver < Deltacloud::BaseDriver
121
131
  instances
122
132
  end
123
133
 
134
+ def valid_credentials?(credentials)
135
+ begin
136
+ new_client(credentials)
137
+ rescue
138
+ return false
139
+ end
140
+ true
141
+ end
142
+
124
143
 
125
144
  def convert_srv_to_instance(srv)
126
- status = srv["status"] == "ACTIVE" ? "RUNNING" : "PENDING"
127
145
  inst = Instance.new(:id => srv["id"].to_s,
128
146
  :owner_id => "root",
129
147
  :realm_id => "us")
@@ -118,7 +118,7 @@ VAPP_STATE_MAP = { "0" => "PENDING", "1" => "PENDING", "2" => "STOPPED", "4"
118
118
  running.to(:running) .on( :reboot )
119
119
  running.to(:shutting_down) .on( :stop )
120
120
  shutting_down.to(:stopped) .automatically
121
- stopped.to(:end) .on( :destroy )
121
+ stopped.to(:finish) .on( :destroy )
122
122
  end
123
123
 
124
124
 
@@ -191,6 +191,15 @@ def destroy_instance(credentials, id)
191
191
  end
192
192
  end
193
193
 
194
+ def valid_credentials?(credentials)
195
+ begin
196
+ new_client(credentials)
197
+ rescue Deltacloud::AuthException
198
+ return false
199
+ end
200
+ true
201
+ end
202
+
194
203
  #--
195
204
  # PRIVATE METHODS:
196
205
  #--
@@ -20,8 +20,8 @@
20
20
  module ApplicationHelper
21
21
 
22
22
  def bread_crumb
23
- s = "<ul class='breadcrumb'><li class='first'><a href='/'>&#948</a></li>"
24
- url = request.path.split('?') #remove extra query string parameters
23
+ s = "<ul class='breadcrumb'><li class='first'><a href='#{url_for('/')}'>&#948</a></li>"
24
+ url = request.path_info.split('?') #remove extra query string parameters
25
25
  levels = url[0].split('/') #break up url into different levels
26
26
  levels.each_with_index do |level, index|
27
27
  unless level.blank?
@@ -30,7 +30,7 @@ module ApplicationHelper
30
30
  s += "<li class='subsequent'>#{level.gsub(/_/, ' ')}</li>\n" unless level.to_i > 0
31
31
  else
32
32
  link = levels.slice(0, index+1).join("/")
33
- s += "<li class='subsequent'><a href=\"#{link}\">#{level.gsub(/_/, ' ')}</a></li>\n"
33
+ s += "<li class='subsequent'><a href=\"#{url_for(link)}\">#{level.gsub(/_/, ' ')}</a></li>\n"
34
34
  end
35
35
  end
36
36
  end
@@ -52,8 +52,8 @@ class BaseModel
52
52
  out
53
53
  end
54
54
 
55
- def to_json
56
- self.to_hash.to_json
55
+ def to_json(*a)
56
+ self.to_hash.to_json(*a)
57
57
  end
58
58
 
59
59
  end
@@ -33,7 +33,13 @@ module Sinatra
33
33
  raise TypeError, "Unknown url_for mode #{mode}"
34
34
  end
35
35
  url_escape = URI.escape(url_fragment)
36
- "#{base}#{url_escape}"
36
+ # Don't add the base fragment if url_for gets called more than once
37
+ # per url or the url_fragment passed in is an absolute url
38
+ if url_escape.match(/^#{base}/) or url_escape.match(/^http/)
39
+ url_escape
40
+ else
41
+ "#{base}#{url_escape}"
42
+ end
37
43
  end
38
44
 
39
45
  def root_url
data/server.rb CHANGED
@@ -38,10 +38,13 @@ error Deltacloud::BackendError do
38
38
  end
39
39
 
40
40
  # Redirect to /api
41
- get '/' do redirect '/api'; end
41
+ get '/' do redirect url_for('/api'); end
42
42
 
43
43
  get '/api\/?' do
44
44
  @version = 0.1
45
+ if params[:force_auth]
46
+ return [401, 'Authentication failed'] unless driver.valid_credentials?(credentials)
47
+ end
45
48
  respond_to do |format|
46
49
  format.xml { haml :"api/show" }
47
50
  format.json do
@@ -174,7 +177,7 @@ END
174
177
  end
175
178
 
176
179
  operation :show do
177
- description 'Show an image identified by "id" parameter.'
180
+ description 'Show an instance identified by "id" parameter.'
178
181
  param :id, :string, :required
179
182
  control { show(:instance) }
180
183
  end
data/test.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'rubygems'
2
+ require 'AWS'
3
+ require 'ap'
4
+
5
+ client = AWS::EC2::Base.new(:access_key_id => "AKIAJ5XGZSACLBSBMUIA" ,
6
+ :secret_access_key => "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")
7
+
8
+ print client.describe_addresses
@@ -0,0 +1,50 @@
1
+ require 'tests/common'
2
+
3
+ module DeltacloudUnitTest
4
+ class UrlForTest < Test::Unit::TestCase
5
+ include Rack::Test::Methods
6
+
7
+ def app
8
+ Sinatra::Application
9
+ end
10
+
11
+ def test_it_works_for_root
12
+ verify_url_for("/", "/")
13
+ end
14
+
15
+ def test_it_works_for_root_absolute
16
+ verify_url_for("/", "http://localhost/", :full)
17
+ end
18
+
19
+ def test_it_works_with_spaces
20
+ verify_url_for("/url with spaces", "/url%20with%20spaces")
21
+ end
22
+
23
+ def test_it_works_when_given_absolute
24
+ verify_url_for("http://test.com", "http://test.com")
25
+ end
26
+
27
+ def test_it_works_when_not_at_root_context
28
+ verify_url_for("/", "context/", :path_only, {}, {"SCRIPT_NAME" => "context"})
29
+ end
30
+
31
+ def verify_url_for(url, expected_url, mode=:path_only, params={}, rack_env={})
32
+ # generate a unique url for each test
33
+ test_url = "/url_for_test/#{expected_url.hash}/#{Time.now.to_f}"
34
+ # Create our sinatra test endpoint
35
+ self.class.create_test_url_content(test_url, url, mode)
36
+
37
+ # verify the generated url matches what we expect
38
+ get test_url, params, rack_env
39
+ last_response.body.should == expected_url
40
+ end
41
+
42
+ def self.create_test_url_content(test_url, url_content, mode)
43
+ get test_url do
44
+ content_type "text/plain"
45
+ url_for(url_content, mode)
46
+ end
47
+ end
48
+
49
+ end
50
+ end
@@ -12,4 +12,4 @@
12
12
  = op
13
13
  %li
14
14
  %strong
15
- %a{:href => "/api/docs"} Documentation (v#{@version})
15
+ %a{:href => url_for("/api/docs")} Documentation (v#{@version})
@@ -16,7 +16,7 @@
16
16
  - @operations.keys.sort_by { |k| k.to_s }.each do |operation|
17
17
  %tr
18
18
  %td{:style => "width:15em"}
19
- %a{:href => "/api/docs/#{@collection.name.to_s}/#{operation}"} #{operation}
19
+ %a{:href => url_for("/api/docs/#{@collection.name.to_s}/#{operation}")} #{operation}
20
20
  %td{:style => "width:10em"} #{@operations[operation].description}
21
21
 
22
22
  %h3 Features:
@@ -34,4 +34,4 @@
34
34
  %td= feature.description
35
35
  %td
36
36
  - feature.operations.each do |op|
37
- %a{:href => "/api/docs/#{@collection.name.to_s}/#{op.name}"} #{op.name}
37
+ %a{:href => url_for("/api/docs/#{@collection.name.to_s}/#{op.name}")} #{op.name}
@@ -1,9 +1,9 @@
1
1
  %docs{:status => "unsupported"}
2
- %collection{:url => "/api/docs/#{@collection.name}", :name => "#{@collection.name}"}
2
+ %collection{:url => url_for("/api/docs/#{@collection.name}"), :name => "#{@collection.name}"}
3
3
  %description #{@collection.description}
4
4
  %operations
5
5
  - @operations.keys.sort_by { |k| k.to_s }.each do |operation|
6
- %operation{:url => "/api/#{@collection.name.to_s}", :name => "#{operation}", :href => "#{@operations[operation].path}", :method => "#{@operations[operation].method}"}
6
+ %operation{:url => url_for("/api/#{@collection.name.to_s}"), :name => "#{operation}", :href => url_for("#{@operations[operation].path}"), :method => "#{@operations[operation].method}"}
7
7
  %description #{@operations[operation].description}
8
8
  - @operations[operation].each_param do |param|
9
9
  %parameter{:name => "#{param.name}", :type => "#{param.type}"}
@@ -11,5 +11,5 @@
11
11
  - collections.keys.sort_by { |k| k.to_s }.each do |collection|
12
12
  %tr
13
13
  %td{:style => "width:15em"}
14
- %a{:href => "/api/docs/#{collection}"} #{collection}
14
+ %a{:href => url_for("/api/docs/#{collection}")} #{collection}
15
15
  %td{:style => "width:10em"} #{collections[collection].description}
@@ -1,5 +1,5 @@
1
1
  %docs{:status => "unsupported"}
2
2
  - collections.keys.sort_by { |k| k.to_s }.each do |collection|
3
- %collection{:url => "/api/docs/#{collection}"}
3
+ %collection{:url => url_for("/api/docs/#{collection}")}
4
4
  %name #{collection}
5
5
  %description #{collections[collection].description}
@@ -1,5 +1,5 @@
1
1
  %h2
2
- %a{:href => "/api/docs/#{@collection.name.to_s}"} #{@collection.name.to_s.titlecase}
2
+ %a{:href => url_for("/api/docs/#{@collection.name.to_s}")} #{@collection.name.to_s.titlecase}
3
3
  #{'::'}
4
4
  #{@operation.name}
5
5
 
@@ -9,7 +9,7 @@
9
9
  %h3
10
10
  URL:
11
11
  %u
12
- = "/api/#{@collection.name.to_s}/#{@operation.name.to_s}"
12
+ = url_for("/api/#{@collection.name.to_s}/#{@operation.name.to_s}")
13
13
  %br
14
14
  %h3 Parameters:
15
15
 
@@ -1,5 +1,5 @@
1
1
  %docs{:status => "unsupported"}
2
- %operation{:url => "/api/docs/#{@collection.name.to_s}", :name => "#{@operation.name.to_s}", :href => "#{@operation.path}", :method => "#{@operation.method}"}
2
+ %operation{:url => url_for("/api/docs/#{@collection.name.to_s}"), :name => "#{@operation.name.to_s}", :href => url_for("#{@operation.path}"), :method => "#{@operation.method}"}
3
3
  %description #{@operation.description}
4
4
  - @operation.each_param do |param|
5
5
  %parameter{:name => "#{param.name}", :type => "#{param.type}"}
@@ -22,4 +22,5 @@
22
22
  Driver: #{DRIVER}
23
23
  #copyright
24
24
  Copyright 2009, 2010
25
- #{link_to 'Red Hat', 'http://redhat.com'} and individual contributors.
25
+ %a{:href => 'http://redhat.com'} Red Hat
26
+ and individual contributors.
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deltacloud-core
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 19
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 0
8
- - 5
9
- version: 0.0.5
9
+ - 6
10
+ version: 0.0.6
10
11
  platform: ruby
11
12
  authors:
12
13
  - Red Hat, Inc.
@@ -14,16 +15,18 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-08-04 00:00:00 +02:00
18
+ date: 2010-09-10 00:00:00 +02:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: rake
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ">="
26
28
  - !ruby/object:Gem::Version
29
+ hash: 49
27
30
  segments:
28
31
  - 0
29
32
  - 8
@@ -35,9 +38,11 @@ dependencies:
35
38
  name: eventmachine
36
39
  prerelease: false
37
40
  requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
38
42
  requirements:
39
43
  - - ">="
40
44
  - !ruby/object:Gem::Version
45
+ hash: 59
41
46
  segments:
42
47
  - 0
43
48
  - 12
@@ -49,9 +54,11 @@ dependencies:
49
54
  name: haml
50
55
  prerelease: false
51
56
  requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
52
58
  requirements:
53
59
  - - ">="
54
60
  - !ruby/object:Gem::Version
61
+ hash: 37
55
62
  segments:
56
63
  - 2
57
64
  - 2
@@ -63,9 +70,11 @@ dependencies:
63
70
  name: sinatra
64
71
  prerelease: false
65
72
  requirement: &id004 !ruby/object:Gem::Requirement
73
+ none: false
66
74
  requirements:
67
75
  - - ">="
68
76
  - !ruby/object:Gem::Version
77
+ hash: 51
69
78
  segments:
70
79
  - 0
71
80
  - 9
@@ -77,9 +86,11 @@ dependencies:
77
86
  name: rack
78
87
  prerelease: false
79
88
  requirement: &id005 !ruby/object:Gem::Requirement
89
+ none: false
80
90
  requirements:
81
91
  - - ">="
82
92
  - !ruby/object:Gem::Version
93
+ hash: 23
83
94
  segments:
84
95
  - 1
85
96
  - 0
@@ -91,9 +102,11 @@ dependencies:
91
102
  name: thin
92
103
  prerelease: false
93
104
  requirement: &id006 !ruby/object:Gem::Requirement
105
+ none: false
94
106
  requirements:
95
107
  - - ">="
96
108
  - !ruby/object:Gem::Version
109
+ hash: 21
97
110
  segments:
98
111
  - 1
99
112
  - 2
@@ -105,9 +118,11 @@ dependencies:
105
118
  name: rerun
106
119
  prerelease: false
107
120
  requirement: &id007 !ruby/object:Gem::Requirement
121
+ none: false
108
122
  requirements:
109
123
  - - ">="
110
124
  - !ruby/object:Gem::Version
125
+ hash: 15
111
126
  segments:
112
127
  - 0
113
128
  - 5
@@ -119,9 +134,11 @@ dependencies:
119
134
  name: json
120
135
  prerelease: false
121
136
  requirement: &id008 !ruby/object:Gem::Requirement
137
+ none: false
122
138
  requirements:
123
139
  - - ">="
124
140
  - !ruby/object:Gem::Version
141
+ hash: 1
125
142
  segments:
126
143
  - 1
127
144
  - 4
@@ -133,9 +150,11 @@ dependencies:
133
150
  name: compass
134
151
  prerelease: false
135
152
  requirement: &id009 !ruby/object:Gem::Requirement
153
+ none: false
136
154
  requirements:
137
155
  - - ">="
138
156
  - !ruby/object:Gem::Version
157
+ hash: 29
139
158
  segments:
140
159
  - 0
141
160
  - 8
@@ -147,9 +166,11 @@ dependencies:
147
166
  name: nokogiri
148
167
  prerelease: false
149
168
  requirement: &id010 !ruby/object:Gem::Requirement
169
+ none: false
150
170
  requirements:
151
171
  - - ">="
152
172
  - !ruby/object:Gem::Version
173
+ hash: 5
153
174
  segments:
154
175
  - 1
155
176
  - 4
@@ -161,9 +182,11 @@ dependencies:
161
182
  name: rack-test
162
183
  prerelease: false
163
184
  requirement: &id011 !ruby/object:Gem::Requirement
185
+ none: false
164
186
  requirements:
165
187
  - - ">="
166
188
  - !ruby/object:Gem::Version
189
+ hash: 13
167
190
  segments:
168
191
  - 0
169
192
  - 5
@@ -175,9 +198,11 @@ dependencies:
175
198
  name: cucumber
176
199
  prerelease: false
177
200
  requirement: &id012 !ruby/object:Gem::Requirement
201
+ none: false
178
202
  requirements:
179
203
  - - ">="
180
204
  - !ruby/object:Gem::Version
205
+ hash: 1
181
206
  segments:
182
207
  - 0
183
208
  - 6
@@ -189,9 +214,11 @@ dependencies:
189
214
  name: rcov
190
215
  prerelease: false
191
216
  requirement: &id013 !ruby/object:Gem::Requirement
217
+ none: false
192
218
  requirements:
193
219
  - - ">="
194
220
  - !ruby/object:Gem::Version
221
+ hash: 43
195
222
  segments:
196
223
  - 0
197
224
  - 9
@@ -210,129 +237,138 @@ extra_rdoc_files:
210
237
  files:
211
238
  - Rakefile
212
239
  - config.ru
240
+ - test.rb
213
241
  - deltacloud.rb
214
242
  - server.rb
215
- - support/fedora/deltacloudd
216
243
  - support/fedora/rubygem-deltacloud-core.spec
217
- - lib/deltacloud/base_driver.rb
218
- - lib/deltacloud/base_driver/base_driver.rb
219
- - lib/deltacloud/base_driver/features.rb
220
- - lib/deltacloud/base_driver/mock_driver.rb
221
- - lib/deltacloud/drivers/ec2/ec2_driver.rb
244
+ - support/fedora/deltacloudd
245
+ - lib/drivers.rb
246
+ - lib/sinatra/respond_to.rb
247
+ - lib/sinatra/lazy_auth.rb
248
+ - lib/sinatra/accept_media_types.rb
249
+ - lib/sinatra/static_assets.rb
250
+ - lib/sinatra/url_for.rb
251
+ - lib/sinatra/rabbit.rb
252
+ - lib/deltacloud/models/base_model.rb
253
+ - lib/deltacloud/models/realm.rb
254
+ - lib/deltacloud/models/instance.rb
255
+ - lib/deltacloud/models/key.rb
256
+ - lib/deltacloud/models/instance_profile.rb
257
+ - lib/deltacloud/models/storage_volume.rb
258
+ - lib/deltacloud/models/storage_snapshot.rb
259
+ - lib/deltacloud/models/image.rb
260
+ - lib/deltacloud/method_serializer.rb
261
+ - lib/deltacloud/helpers.rb
222
262
  - lib/deltacloud/drivers/ec2/ec2_mock_driver.rb
263
+ - lib/deltacloud/drivers/ec2/ec2_driver.rb
264
+ - lib/deltacloud/drivers/terremark/terremark_driver.rb
265
+ - lib/deltacloud/drivers/gogrid/test.rb
223
266
  - lib/deltacloud/drivers/gogrid/gogrid_client.rb
224
267
  - lib/deltacloud/drivers/gogrid/gogrid_driver.rb
225
- - lib/deltacloud/drivers/mock/mock_driver.rb
226
- - lib/deltacloud/drivers/opennebula/cloud_client.rb
227
- - lib/deltacloud/drivers/opennebula/occi_client.rb
228
268
  - lib/deltacloud/drivers/opennebula/opennebula_driver.rb
269
+ - lib/deltacloud/drivers/opennebula/occi_client.rb
270
+ - lib/deltacloud/drivers/opennebula/cloud_client.rb
271
+ - lib/deltacloud/drivers/mock/mock_driver.rb
272
+ - lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb
273
+ - lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
229
274
  - lib/deltacloud/drivers/rackspace/rackspace_client.rb
230
275
  - lib/deltacloud/drivers/rackspace/rackspace_driver.rb
231
276
  - lib/deltacloud/drivers/rhevm/rhevm_driver.rb
232
- - lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
233
- - lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb
234
- - lib/deltacloud/drivers/terremark/terremark_driver.rb
235
277
  - lib/deltacloud/hardware_profile.rb
236
- - lib/deltacloud/helpers.rb
278
+ - lib/deltacloud/validation.rb
279
+ - lib/deltacloud/base_driver/mock_driver.rb
280
+ - lib/deltacloud/base_driver/base_driver.rb
281
+ - lib/deltacloud/base_driver/features.rb
282
+ - lib/deltacloud/helpers/hardware_profiles_helper.rb
237
283
  - lib/deltacloud/helpers/application_helper.rb
238
284
  - lib/deltacloud/helpers/conversion_helper.rb
239
- - lib/deltacloud/helpers/hardware_profiles_helper.rb
240
- - lib/deltacloud/method_serializer.rb
241
- - lib/deltacloud/models/base_model.rb
242
- - lib/deltacloud/models/image.rb
243
- - lib/deltacloud/models/instance.rb
244
- - lib/deltacloud/models/instance_profile.rb
245
- - lib/deltacloud/models/realm.rb
246
- - lib/deltacloud/models/storage_snapshot.rb
247
- - lib/deltacloud/models/storage_volume.rb
248
- - lib/deltacloud/models/key.rb
249
285
  - lib/deltacloud/state_machine.rb
250
- - lib/deltacloud/validation.rb
251
- - lib/drivers.rb
252
- - lib/sinatra/accept_media_types.rb
253
- - lib/sinatra/lazy_auth.rb
254
- - lib/sinatra/rabbit.rb
255
- - lib/sinatra/respond_to.rb
256
- - lib/sinatra/static_assets.rb
257
- - lib/sinatra/url_for.rb
258
- - lib/deltacloud/drivers/mock/data/images/img1.yml
286
+ - lib/deltacloud/base_driver.rb
287
+ - lib/deltacloud/drivers/mock/data/storage_volumes/vol1.yml
288
+ - lib/deltacloud/drivers/mock/data/storage_volumes/vol3.yml
289
+ - lib/deltacloud/drivers/mock/data/storage_volumes/vol2.yml
290
+ - lib/deltacloud/drivers/mock/data/storage_snapshots/snap3.yml
291
+ - lib/deltacloud/drivers/mock/data/storage_snapshots/snap1.yml
292
+ - lib/deltacloud/drivers/mock/data/storage_snapshots/snap2.yml
259
293
  - lib/deltacloud/drivers/mock/data/images/img2.yml
260
294
  - lib/deltacloud/drivers/mock/data/images/img3.yml
261
- - lib/deltacloud/drivers/mock/data/instances/inst0.yml
295
+ - lib/deltacloud/drivers/mock/data/images/img1.yml
262
296
  - lib/deltacloud/drivers/mock/data/instances/inst1.yml
263
297
  - lib/deltacloud/drivers/mock/data/instances/inst2.yml
264
- - lib/deltacloud/drivers/mock/data/storage_snapshots/snap1.yml
265
- - lib/deltacloud/drivers/mock/data/storage_snapshots/snap2.yml
266
- - lib/deltacloud/drivers/mock/data/storage_snapshots/snap3.yml
267
- - lib/deltacloud/drivers/mock/data/storage_volumes/vol1.yml
268
- - lib/deltacloud/drivers/mock/data/storage_volumes/vol2.yml
269
- - lib/deltacloud/drivers/mock/data/storage_volumes/vol3.yml
298
+ - lib/deltacloud/drivers/mock/data/instances/inst0.yml
299
+ - views/instance_states/show.xml.haml
300
+ - views/instance_states/show.html.haml
301
+ - views/root/index.html.haml
302
+ - views/storage_volumes/show.xml.haml
303
+ - views/storage_volumes/index.xml.haml
304
+ - views/storage_volumes/index.html.haml
305
+ - views/storage_volumes/show.html.haml
270
306
  - views/accounts/index.html.haml
271
307
  - views/accounts/show.html.haml
272
- - views/api/show.html.haml
273
- - views/api/show.xml.haml
274
- - views/docs/collection.html.haml
275
- - views/docs/collection.xml.haml
276
- - views/docs/index.html.haml
277
- - views/docs/index.xml.haml
278
- - views/docs/operation.html.haml
279
- - views/docs/operation.xml.haml
280
- - views/errors/auth_exception.html.haml
308
+ - views/storage_snapshots/show.xml.haml
309
+ - views/storage_snapshots/index.xml.haml
310
+ - views/storage_snapshots/index.html.haml
311
+ - views/storage_snapshots/show.html.haml
312
+ - views/layout.html.haml
313
+ - views/errors/not_found.html.haml
281
314
  - views/errors/auth_exception.xml.haml
282
- - views/errors/backend_error.html.haml
283
- - views/errors/backend_error.xml.haml
284
- - views/errors/validation_failure.html.haml
285
315
  - views/errors/validation_failure.xml.haml
286
- - views/errors/not_found.html.haml
287
316
  - views/errors/not_found.xml.haml
288
- - views/hardware_profiles/index.html.haml
289
- - views/hardware_profiles/index.xml.haml
290
- - views/hardware_profiles/show.html.haml
291
- - views/hardware_profiles/show.xml.haml
292
- - views/images/index.html.haml
317
+ - views/errors/backend_error.xml.haml
318
+ - views/errors/auth_exception.html.haml
319
+ - views/errors/backend_error.html.haml
320
+ - views/errors/validation_failure.html.haml
321
+ - views/images/show.xml.haml
293
322
  - views/images/index.xml.haml
323
+ - views/images/index.html.haml
294
324
  - views/images/show.html.haml
295
- - views/images/show.xml.haml
296
- - views/instance_states/show.html.haml
297
- - views/instance_states/show.xml.haml
298
- - views/instances/index.html.haml
325
+ - views/api/show.xml.haml
326
+ - views/api/show.html.haml
327
+ - views/keys/show.xml.haml
328
+ - views/keys/new.html.haml
329
+ - views/keys/index.xml.haml
330
+ - views/keys/index.html.haml
331
+ - views/keys/show.html.haml
332
+ - views/instances/show.xml.haml
299
333
  - views/instances/index.xml.haml
300
- - views/instances/new.html.haml
334
+ - views/instances/index.html.haml
301
335
  - views/instances/show.html.haml
302
- - views/instances/show.xml.haml
303
- - views/layout.html.haml
304
- - views/realms/index.html.haml
336
+ - views/instances/new.html.haml
337
+ - views/hardware_profiles/show.xml.haml
338
+ - views/hardware_profiles/index.xml.haml
339
+ - views/hardware_profiles/index.html.haml
340
+ - views/hardware_profiles/show.html.haml
341
+ - views/docs/operation.xml.haml
342
+ - views/docs/operation.html.haml
343
+ - views/docs/collection.xml.haml
344
+ - views/docs/index.xml.haml
345
+ - views/docs/index.html.haml
346
+ - views/docs/collection.html.haml
347
+ - views/realms/show.xml.haml
305
348
  - views/realms/index.xml.haml
306
349
  - views/realms/show.html.haml
307
- - views/realms/show.xml.haml
308
- - views/root/index.html.haml
309
- - views/storage_snapshots/index.html.haml
310
- - views/storage_snapshots/index.xml.haml
311
- - views/storage_snapshots/show.html.haml
312
- - views/storage_snapshots/show.xml.haml
313
- - views/storage_volumes/index.html.haml
314
- - views/storage_volumes/index.xml.haml
315
- - views/storage_volumes/show.html.haml
316
- - views/storage_volumes/show.xml.haml
317
- - views/keys/index.html.haml
318
- - views/keys/index.xml.haml
319
- - views/keys/new.html.haml
320
- - views/keys/show.html.haml
321
- - views/keys/show.xml.haml
350
+ - views/realms/index.html.haml
322
351
  - views/instance_states/show.gv.erb
323
352
  - public/favicon.ico
353
+ - public/images/topbar-bg.png
324
354
  - public/images/grid.png
325
- - public/images/logo-wide.png
326
355
  - public/images/rails.png
327
- - public/images/topbar-bg.png
328
- - public/javascripts/application.js
356
+ - public/images/logo-wide.png
329
357
  - public/javascripts/jquery-1.4.2.min.js
330
- - public/stylesheets/compiled/application.css
358
+ - public/javascripts/application.js
331
359
  - public/stylesheets/compiled/ie.css
360
+ - public/stylesheets/compiled/application.css
332
361
  - public/stylesheets/compiled/print.css
333
362
  - public/stylesheets/compiled/screen.css
334
363
  - bin/deltacloudd
335
364
  - COPYING
365
+ - tests/instance_states_test.rb
366
+ - tests/api_test.rb
367
+ - tests/instances_test.rb
368
+ - tests/hardware_profiles_test.rb
369
+ - tests/realms_test.rb
370
+ - tests/images_test.rb
371
+ - tests/url_for_test.rb
336
372
  has_rdoc: true
337
373
  homepage: http://www.deltacloud.org
338
374
  licenses: []
@@ -343,32 +379,37 @@ rdoc_options: []
343
379
  require_paths:
344
380
  - lib
345
381
  required_ruby_version: !ruby/object:Gem::Requirement
382
+ none: false
346
383
  requirements:
347
384
  - - ">="
348
385
  - !ruby/object:Gem::Version
386
+ hash: 53
349
387
  segments:
350
388
  - 1
351
389
  - 8
352
390
  - 1
353
391
  version: 1.8.1
354
392
  required_rubygems_version: !ruby/object:Gem::Requirement
393
+ none: false
355
394
  requirements:
356
395
  - - ">="
357
396
  - !ruby/object:Gem::Version
397
+ hash: 3
358
398
  segments:
359
399
  - 0
360
400
  version: "0"
361
401
  requirements: []
362
402
 
363
403
  rubyforge_project:
364
- rubygems_version: 1.3.6
404
+ rubygems_version: 1.3.7
365
405
  signing_key:
366
406
  specification_version: 3
367
407
  summary: Deltacloud REST API
368
408
  test_files:
369
- - tests/realms_test.rb
370
- - tests/images_test.rb
371
- - tests/instances_test.rb
409
+ - tests/instance_states_test.rb
372
410
  - tests/api_test.rb
411
+ - tests/instances_test.rb
373
412
  - tests/hardware_profiles_test.rb
374
- - tests/instance_states_test.rb
413
+ - tests/realms_test.rb
414
+ - tests/images_test.rb
415
+ - tests/url_for_test.rb