steamcannon-deltacloud-core 0.0.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (152) hide show
  1. data/COPYING +176 -0
  2. data/Rakefile +106 -0
  3. data/bin/deltacloudd +120 -0
  4. data/config.ru +5 -0
  5. data/deltacloud.rb +20 -0
  6. data/lib/deltacloud/base_driver/base_driver.rb +259 -0
  7. data/lib/deltacloud/base_driver/features.rb +173 -0
  8. data/lib/deltacloud/base_driver/mock_driver.rb +58 -0
  9. data/lib/deltacloud/base_driver.rb +20 -0
  10. data/lib/deltacloud/drivers/azure/azure_driver.rb +127 -0
  11. data/lib/deltacloud/drivers/ec2/ec2_driver.rb +580 -0
  12. data/lib/deltacloud/drivers/ec2/ec2_mock_driver.rb +170 -0
  13. data/lib/deltacloud/drivers/gogrid/gogrid_client.rb +50 -0
  14. data/lib/deltacloud/drivers/gogrid/gogrid_driver.rb +343 -0
  15. data/lib/deltacloud/drivers/gogrid/test.rb +13 -0
  16. data/lib/deltacloud/drivers/mock/data/buckets/blobs/blob1.yml +5 -0
  17. data/lib/deltacloud/drivers/mock/data/buckets/blobs/blob2.yml +5 -0
  18. data/lib/deltacloud/drivers/mock/data/buckets/blobs/blob3.yml +5 -0
  19. data/lib/deltacloud/drivers/mock/data/buckets/blobs/blob4.yml +5 -0
  20. data/lib/deltacloud/drivers/mock/data/buckets/blobs/blob5.yml +5 -0
  21. data/lib/deltacloud/drivers/mock/data/buckets/bucket1.yml +2 -0
  22. data/lib/deltacloud/drivers/mock/data/buckets/bucket2.yml +2 -0
  23. data/lib/deltacloud/drivers/mock/data/images/img1.yml +3 -0
  24. data/lib/deltacloud/drivers/mock/data/images/img2.yml +3 -0
  25. data/lib/deltacloud/drivers/mock/data/images/img3.yml +3 -0
  26. data/lib/deltacloud/drivers/mock/data/instances/inst0.yml +16 -0
  27. data/lib/deltacloud/drivers/mock/data/instances/inst1.yml +9 -0
  28. data/lib/deltacloud/drivers/mock/data/instances/inst2.yml +9 -0
  29. data/lib/deltacloud/drivers/mock/data/storage_snapshots/snap1.yml +4 -0
  30. data/lib/deltacloud/drivers/mock/data/storage_snapshots/snap2.yml +4 -0
  31. data/lib/deltacloud/drivers/mock/data/storage_snapshots/snap3.yml +4 -0
  32. data/lib/deltacloud/drivers/mock/data/storage_volumes/vol1.yml +6 -0
  33. data/lib/deltacloud/drivers/mock/data/storage_volumes/vol2.yml +6 -0
  34. data/lib/deltacloud/drivers/mock/data/storage_volumes/vol3.yml +6 -0
  35. data/lib/deltacloud/drivers/mock/mock_driver.rb +356 -0
  36. data/lib/deltacloud/drivers/opennebula/cloud_client.rb +116 -0
  37. data/lib/deltacloud/drivers/opennebula/occi_client.rb +204 -0
  38. data/lib/deltacloud/drivers/opennebula/opennebula_driver.rb +241 -0
  39. data/lib/deltacloud/drivers/rackspace/rackspace_client.rb +130 -0
  40. data/lib/deltacloud/drivers/rackspace/rackspace_driver.rb +290 -0
  41. data/lib/deltacloud/drivers/rhevm/rhevm_driver.rb +258 -0
  42. data/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb +85 -0
  43. data/lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb +166 -0
  44. data/lib/deltacloud/drivers/terremark/terremark_driver.rb +295 -0
  45. data/lib/deltacloud/hardware_profile.rb +153 -0
  46. data/lib/deltacloud/helpers/application_helper.rb +122 -0
  47. data/lib/deltacloud/helpers/blob_stream.rb +51 -0
  48. data/lib/deltacloud/helpers/conversion_helper.rb +39 -0
  49. data/lib/deltacloud/helpers/hardware_profiles_helper.rb +35 -0
  50. data/lib/deltacloud/helpers.rb +5 -0
  51. data/lib/deltacloud/method_serializer.rb +85 -0
  52. data/lib/deltacloud/models/base_model.rb +59 -0
  53. data/lib/deltacloud/models/blob.rb +26 -0
  54. data/lib/deltacloud/models/bucket.rb +24 -0
  55. data/lib/deltacloud/models/image.rb +27 -0
  56. data/lib/deltacloud/models/instance.rb +38 -0
  57. data/lib/deltacloud/models/instance_profile.rb +48 -0
  58. data/lib/deltacloud/models/key.rb +35 -0
  59. data/lib/deltacloud/models/realm.rb +26 -0
  60. data/lib/deltacloud/models/storage_snapshot.rb +27 -0
  61. data/lib/deltacloud/models/storage_volume.rb +28 -0
  62. data/lib/deltacloud/state_machine.rb +84 -0
  63. data/lib/deltacloud/validation.rb +70 -0
  64. data/lib/drivers.rb +51 -0
  65. data/lib/sinatra/accept_media_types.rb +128 -0
  66. data/lib/sinatra/lazy_auth.rb +56 -0
  67. data/lib/sinatra/rabbit.rb +279 -0
  68. data/lib/sinatra/respond_to.rb +238 -0
  69. data/lib/sinatra/static_assets.rb +83 -0
  70. data/lib/sinatra/url_for.rb +53 -0
  71. data/public/favicon.ico +0 -0
  72. data/public/images/grid.png +0 -0
  73. data/public/images/logo-wide.png +0 -0
  74. data/public/images/rails.png +0 -0
  75. data/public/images/topbar-bg.png +0 -0
  76. data/public/javascripts/application.js +32 -0
  77. data/public/javascripts/jquery-1.4.2.min.js +154 -0
  78. data/public/stylesheets/compiled/application.css +613 -0
  79. data/public/stylesheets/compiled/ie.css +31 -0
  80. data/public/stylesheets/compiled/print.css +27 -0
  81. data/public/stylesheets/compiled/screen.css +456 -0
  82. data/server.rb +516 -0
  83. data/support/fedora/deltacloudd +68 -0
  84. data/support/fedora/rubygem-deltacloud-core.spec +91 -0
  85. data/tests/api_test.rb +37 -0
  86. data/tests/hardware_profiles_test.rb +120 -0
  87. data/tests/images_test.rb +111 -0
  88. data/tests/instance_states_test.rb +51 -0
  89. data/tests/instances_test.rb +222 -0
  90. data/tests/realms_test.rb +78 -0
  91. data/tests/url_for_test.rb +50 -0
  92. data/views/accounts/index.html.haml +11 -0
  93. data/views/accounts/show.html.haml +30 -0
  94. data/views/api/show.html.haml +15 -0
  95. data/views/api/show.xml.haml +5 -0
  96. data/views/blobs/show.html.haml +20 -0
  97. data/views/blobs/show.xml.haml +7 -0
  98. data/views/buckets/index.html.haml +33 -0
  99. data/views/buckets/index.xml.haml +10 -0
  100. data/views/buckets/new.html.haml +13 -0
  101. data/views/buckets/show.html.haml +19 -0
  102. data/views/buckets/show.xml.haml +8 -0
  103. data/views/docs/collection.html.haml +37 -0
  104. data/views/docs/collection.xml.haml +14 -0
  105. data/views/docs/index.html.haml +15 -0
  106. data/views/docs/index.xml.haml +5 -0
  107. data/views/docs/operation.html.haml +31 -0
  108. data/views/docs/operation.xml.haml +10 -0
  109. data/views/errors/auth_exception.html.haml +8 -0
  110. data/views/errors/auth_exception.xml.haml +2 -0
  111. data/views/errors/backend_error.html.haml +19 -0
  112. data/views/errors/backend_error.xml.haml +8 -0
  113. data/views/errors/not_found.html.haml +6 -0
  114. data/views/errors/not_found.xml.haml +2 -0
  115. data/views/errors/validation_failure.html.haml +11 -0
  116. data/views/errors/validation_failure.xml.haml +7 -0
  117. data/views/hardware_profiles/index.html.haml +25 -0
  118. data/views/hardware_profiles/index.xml.haml +4 -0
  119. data/views/hardware_profiles/show.html.haml +19 -0
  120. data/views/hardware_profiles/show.xml.haml +18 -0
  121. data/views/images/index.html.haml +30 -0
  122. data/views/images/index.xml.haml +8 -0
  123. data/views/images/show.html.haml +21 -0
  124. data/views/images/show.xml.haml +5 -0
  125. data/views/instance_states/show.html.haml +31 -0
  126. data/views/instance_states/show.png.erb +45 -0
  127. data/views/instance_states/show.xml.haml +8 -0
  128. data/views/instances/index.html.haml +30 -0
  129. data/views/instances/index.xml.haml +21 -0
  130. data/views/instances/new.html.haml +55 -0
  131. data/views/instances/show.html.haml +43 -0
  132. data/views/instances/show.xml.haml +49 -0
  133. data/views/keys/index.html.haml +26 -0
  134. data/views/keys/index.xml.haml +4 -0
  135. data/views/keys/new.html.haml +8 -0
  136. data/views/keys/show.html.haml +22 -0
  137. data/views/keys/show.xml.haml +20 -0
  138. data/views/layout.html.haml +26 -0
  139. data/views/realms/index.html.haml +29 -0
  140. data/views/realms/index.xml.haml +10 -0
  141. data/views/realms/show.html.haml +15 -0
  142. data/views/realms/show.xml.haml +9 -0
  143. data/views/root/index.html.haml +4 -0
  144. data/views/storage_snapshots/index.html.haml +20 -0
  145. data/views/storage_snapshots/index.xml.haml +9 -0
  146. data/views/storage_snapshots/show.html.haml +14 -0
  147. data/views/storage_snapshots/show.xml.haml +7 -0
  148. data/views/storage_volumes/index.html.haml +21 -0
  149. data/views/storage_volumes/index.xml.haml +23 -0
  150. data/views/storage_volumes/show.html.haml +20 -0
  151. data/views/storage_volumes/show.xml.haml +24 -0
  152. metadata +409 -0
@@ -0,0 +1,580 @@
1
+ #
2
+ # Copyright (C) 2009 Red Hat, Inc.
3
+ #
4
+ # Licensed to the Apache Software Foundation (ASF) under one or more
5
+ # contributor license agreements. See the NOTICE file distributed with
6
+ # this work for additional information regarding copyright ownership. The
7
+ # ASF licenses this file to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance with the
9
+ # License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
16
+ # License for the specific language governing permissions and limitations
17
+ # under the License.
18
+
19
+
20
+ require 'deltacloud/base_driver'
21
+ require 'active_support'
22
+ require 'AWS'
23
+ require 'right_aws'
24
+
25
+ class Instance
26
+ attr_accessor :keyname
27
+ attr_accessor :authn_error
28
+
29
+ def authn_feature_failed?
30
+ return true unless authn_error.nil?
31
+ end
32
+
33
+ end
34
+
35
+ module Deltacloud
36
+ module Drivers
37
+ module EC2
38
+ class EC2Driver < Deltacloud::BaseDriver
39
+
40
+ def supported_collections
41
+ DEFAULT_COLLECTIONS + [ :keys, :buckets ]
42
+ end
43
+
44
+ feature :instances, :user_data
45
+ feature :instances, :authentication_key
46
+ feature :images, :owner_id
47
+ feature :buckets, :bucket_location
48
+
49
+ define_hardware_profile('m1.small') do
50
+ cpu 1
51
+ memory 1.7 * 1024
52
+ storage 160
53
+ architecture 'i386'
54
+ end
55
+
56
+ define_hardware_profile('m1.large') do
57
+ cpu 4
58
+ memory 7.5 * 1024
59
+ storage 850
60
+ architecture 'x86_64'
61
+ end
62
+
63
+ define_hardware_profile('m1.xlarge') do
64
+ cpu 8
65
+ memory 15 * 1024
66
+ storage 1690
67
+ architecture 'x86_64'
68
+ end
69
+
70
+ define_hardware_profile('c1.medium') do
71
+ cpu 5
72
+ memory 1.7 * 1024
73
+ storage 350
74
+ architecture 'i386'
75
+ end
76
+
77
+ define_hardware_profile('c1.xlarge') do
78
+ cpu 20
79
+ memory 7 * 1024
80
+ storage 1690
81
+ architecture 'x86_64'
82
+ end
83
+
84
+ define_hardware_profile('m2.xlarge') do
85
+ cpu 6.5
86
+ memory 17.1 * 1024
87
+ storage 420
88
+ architecture 'x86_64'
89
+ end
90
+
91
+ define_hardware_profile('m2.2xlarge') do
92
+ cpu 13
93
+ memory 34.2 * 1024
94
+ storage 850
95
+ architecture 'x86_64'
96
+ end
97
+
98
+ define_hardware_profile('m2.4xlarge') do
99
+ cpu 26
100
+ memory 68.4 * 1024
101
+ storage 1690
102
+ architecture 'x86_64'
103
+ end
104
+
105
+ define_instance_states do
106
+ start.to( :pending ) .automatically
107
+ pending.to( :running ) .automatically
108
+ pending.to( :stopping ) .on( :stop )
109
+ pending.to( :stopped ) .automatically
110
+ stopped.to( :running ) .on( :start )
111
+ running.to( :running ) .on( :reboot )
112
+ running.to( :stopping ) .on( :stop )
113
+ shutting_down.to( :stopped ) .automatically
114
+ stopped.to( :finish ) .automatically
115
+ end
116
+
117
+ #
118
+ # Images
119
+ #
120
+
121
+ def images(credentials, opts={} )
122
+ ec2 = new_client(credentials)
123
+ img_arr = []
124
+ # if we know the image_id, we don't want to limit by owner_id, since this
125
+ # will exclude public images
126
+ if (opts and opts[:id])
127
+ config = { :image_id => opts[:id] }
128
+ else
129
+ config = { :owner_id => "amazon" }
130
+ config.merge!({ :owner_id => opts[:owner_id] }) if opts and opts[:owner_id]
131
+ end
132
+ safely do
133
+ ec2.describe_images(config).imagesSet.item.each do |image|
134
+ img_arr << convert_image(image)
135
+ end
136
+ end
137
+ img_arr = filter_on( img_arr, :architecture, opts )
138
+ img_arr.sort_by{|e| [e.owner_id, e.name]}
139
+ end
140
+
141
+ #
142
+ # Realms
143
+ #
144
+
145
+ def realms(credentials, opts=nil)
146
+ ec2 = new_client(credentials)
147
+ realms = []
148
+ safely do
149
+ ec2.describe_availability_zones.availabilityZoneInfo.item.each do |ec2_realm|
150
+ realms << convert_realm( ec2_realm )
151
+ end
152
+ end
153
+ realms
154
+ end
155
+
156
+ #
157
+ # Instances
158
+ #
159
+ def instances(credentials, opts=nil)
160
+ ec2 = new_client(credentials)
161
+ instances = []
162
+ safely do
163
+ param = opts.nil? ? nil : opts[:id]
164
+ ec2_instances = ec2.describe_instances.reservationSet
165
+ return [] unless ec2_instances
166
+ ec2_instances.item.each do |item|
167
+ item.instancesSet.item.each do |ec2_instance|
168
+ instances << convert_instance( ec2_instance, item.ownerId )
169
+ end
170
+ end
171
+ end
172
+ instances = filter_on( instances, :id, opts )
173
+ instances = filter_on( instances, :state, opts )
174
+ instances
175
+ end
176
+
177
+
178
+ def create_instance(credentials, image_id, opts)
179
+ ec2 = new_client( credentials )
180
+ realm_id = opts[:realm_id]
181
+ safely do
182
+ image = image(credentials, :id => image_id )
183
+ hwp = find_hardware_profile(credentials, opts[:hwp_id], image.id)
184
+ ec2_instances = ec2.run_instances(
185
+ :image_id => image.id,
186
+ :user_data => opts[:user_data],
187
+ :key_name => opts[:keyname],
188
+ :availability_zone => realm_id,
189
+ :monitoring_enabled => true,
190
+ :instance_type => hwp.name,
191
+ :disable_api_termination => false,
192
+ :instance_initiated_shutdown_behavior => 'terminate',
193
+ :security_group => opts[:security_group]
194
+ )
195
+ return convert_instance( ec2_instances.instancesSet.item.first, 'pending' )
196
+ end
197
+ end
198
+
199
+ def generate_instance(ec2, id, backup)
200
+ begin
201
+ this_instance = ec2.describe_instances( :instance_id => id ).reservationSet.item.first.instancesSet.item.first
202
+ convert_instance(this_instance, this_instance.ownerId)
203
+ rescue Exception => e
204
+ puts "WARNING: ignored error during instance refresh: #{e.message}"
205
+ # at this point, the action has succeeded but our follow-up
206
+ # "describe_instances" failed for some reason. Create a simple Instance
207
+ # object with only the ID and new state in place
208
+ state = convert_state(backup.instancesSet.item.first.currentState.name)
209
+ Instance.new( {
210
+ :id => id,
211
+ :state => state,
212
+ :actions => instance_actions_for( state ),
213
+ } )
214
+ end
215
+ end
216
+
217
+ def reboot_instance(credentials, id)
218
+ ec2 = new_client(credentials)
219
+ backup = ec2.reboot_instances( :instance_id => id )
220
+
221
+ generate_instance(ec2, id, backup)
222
+ end
223
+
224
+ def stop_instance(credentials, id)
225
+ ec2 = new_client(credentials)
226
+ backup = ec2.terminate_instances( :instance_id => id )
227
+
228
+ generate_instance(ec2, id, backup)
229
+ end
230
+
231
+ def destroy_instance(credentials, id)
232
+ ec2 = new_client(credentials)
233
+ backup = ec2.terminate_instances( :instance_id => id )
234
+
235
+ generate_instance(ec2, id, backup)
236
+ end
237
+
238
+ #
239
+ # Storage Volumes
240
+ #
241
+
242
+ def storage_volumes(credentials, opts=nil)
243
+ ec2 = new_client( credentials )
244
+ volumes = []
245
+ safely do
246
+ if (opts)
247
+ ec2.describe_volumes(:volume_id => opts[:id]).volumeSet.item.each do |ec2_volume|
248
+ volumes << convert_volume( ec2_volume )
249
+ end
250
+ else
251
+ ec2_volumes = ec2.describe_volumes.volumeSet
252
+ return [] unless ec2_volumes
253
+ ec2_volumes.item.each do |ec2_volume|
254
+ volumes << convert_volume( ec2_volume )
255
+ end
256
+ end
257
+ end
258
+ volumes
259
+ end
260
+
261
+ def create_storage_volume(credentials, opts)
262
+ ec2 = new_client( credentials )
263
+ safely do
264
+ ec2_volume = ec2.create_volume(
265
+ :availability_zone => opts[:realm_id],
266
+ :size => opts[:capacity]
267
+ )
268
+ return convert_volume( ec2_volume )
269
+ end
270
+ end
271
+
272
+ def destroy_storage_volume(credentials, id)
273
+ ec2 = new_client(credentials)
274
+ ec2.delete_volume( :volume_id => id )
275
+ storage_volumes( credentials, :id => id ).first
276
+ end
277
+
278
+ def attach_storage_volume(credentials, opts)
279
+ ec2 = new_client(credentials)
280
+ id = opts[:id]
281
+ ec2.attach_volume(
282
+ :volume_id => id,
283
+ :instance_id => opts[:instance_id],
284
+ :device => opts[:device]
285
+ )
286
+ storage_volumes( credentials, :id => id ).first
287
+ end
288
+
289
+ def detach_storage_volume(credentials, id)
290
+ ec2 = new_client(credentials)
291
+ ec2.detach_volume( :volume_id => id )
292
+ storage_volumes( credentials, :id => id ).first
293
+ end
294
+
295
+ #
296
+ # Storage Snapshots
297
+ #
298
+
299
+ def storage_snapshots(credentials, opts=nil)
300
+ ec2 = new_client( credentials )
301
+ snapshots = []
302
+ safely do
303
+ if (opts)
304
+ ec2.describe_snapshots(:owner => 'self', :snapshot_id => opts[:id]).snapshotSet.item.each do |ec2_snapshot|
305
+ snapshots << convert_snapshot( ec2_snapshot )
306
+ end
307
+ else
308
+ ec2_snapshots = ec2.describe_snapshots(:owner => 'self').snapshotSet
309
+ return [] unless ec2_snapshots
310
+ ec2_snapshots.item.each do |ec2_snapshot|
311
+ snapshots << convert_snapshot( ec2_snapshot )
312
+ end
313
+ end
314
+ end
315
+ snapshots
316
+ end
317
+
318
+ def key(credentials, opts=nil)
319
+ keys(credentials, opts).first
320
+ end
321
+
322
+ def keys(credentials, opts=nil)
323
+ ec2 = new_client( credentials )
324
+ opts[:key_name] = opts[:id] if opts and opts[:id]
325
+ keypairs = ec2.describe_keypairs(opts || {})
326
+ result = []
327
+ safely do
328
+ keypairs.keySet.item.each do |keypair|
329
+ result << convert_key(keypair)
330
+ end
331
+ end
332
+ result
333
+ end
334
+
335
+ def create_key(credentials, opts={})
336
+ key = Key.new
337
+ ec2 = new_client( credentials )
338
+ safely do
339
+ key = convert_key(ec2.create_keypair(opts))
340
+ end
341
+ return key
342
+ end
343
+
344
+ def destroy_key(credentials, opts={})
345
+ safely do
346
+ ec2 = new_client( credentials )
347
+ ec2.delete_keypair(opts)
348
+ end
349
+ end
350
+
351
+ def valid_credentials?(credentials)
352
+ client = new_client(credentials)
353
+ # FIXME: We need to do this call to determine if
354
+ # EC2 is working with given credentials. There is no
355
+ # other way to check, if given credentials are valid or not.
356
+ realms = client.describe_availability_zones rescue false
357
+ return realms ? true : false
358
+ end
359
+
360
+ #--
361
+ # Buckets
362
+ #-- get a list of your buckets from the s3 service
363
+ def buckets(credentials, opts)
364
+ buckets = []
365
+ safely do
366
+ s3_client = s3_client(credentials)
367
+ bucket_list = s3_client.buckets
368
+ bucket_list.each do |current|
369
+ buckets << convert_bucket(current)
370
+ end
371
+ end
372
+ buckets = filter_on(buckets, :id, opts)
373
+ buckets
374
+ end
375
+
376
+ #--
377
+ # Create bucket
378
+ #--
379
+ #valid values for bucket location: 'EU'|'us-west1'|'ap-southeast-1' - if you
380
+ #don't specify a location then by default buckets are created in 'us-east'
381
+ #[but if you *do* specify 'us-east' things blow up]
382
+ def create_bucket(credentials, name, opts={})
383
+ bucket = nil
384
+ safely do
385
+ begin
386
+ s3_client = s3_client(credentials)
387
+ bucket_location = opts['location']
388
+ if bucket_location
389
+ bucket = RightAws::S3::Bucket.create(s3_client, name, true, nil, :location => bucket_location)
390
+ else
391
+ bucket = RightAws::S3::Bucket.create(s3_client, name, true)
392
+ end #if
393
+ rescue RightAws::AwsError => e
394
+ raise e unless e.message =~ /BucketAlreadyExists/
395
+ raise Deltacloud::BackendError.new(409, e.class.to_s, e.message, e.backtrace)
396
+ end #begin
397
+ end #do
398
+ convert_bucket(bucket)
399
+ end
400
+
401
+ #--
402
+ # Delete_bucket
403
+ #--
404
+ def delete_bucket(credentials, name, opts={})
405
+ s3_client = s3_client(credentials)
406
+ safely do
407
+ s3_client.interface.delete_bucket(name)
408
+ end
409
+ end
410
+
411
+ #--
412
+ # Blobs
413
+ #--
414
+ def blobs(credentials, opts = nil)
415
+ s3_client = s3_client(credentials)
416
+ blobs = []
417
+ safely do
418
+ s3_bucket = s3_client.bucket(opts['bucket'])
419
+ s3_bucket.keys({}, true).each do |s3_object|
420
+ blobs << convert_object(s3_object)
421
+ end
422
+ end
423
+ blobs = filter_on(blobs, :id, opts)
424
+ blobs
425
+ end
426
+
427
+ #--
428
+ # Blob data
429
+ #--
430
+ def blob_data(credentials, bucket_id, blob_id, opts)
431
+ s3_client = s3_client(credentials)
432
+ s3_client.interface.get(bucket_id, blob_id) do |chunk|
433
+ yield chunk
434
+ end
435
+ end
436
+
437
+ private
438
+
439
+ def new_client(credentials)
440
+ opts = {
441
+ :access_key_id => credentials.user,
442
+ :secret_access_key => credentials.password
443
+ }
444
+ opts[:server] = ENV['DCLOUD_EC2_URL'] if ENV['DCLOUD_EC2_URL']
445
+ safely do
446
+ AWS::EC2::Base.new(opts)
447
+ end
448
+ end
449
+
450
+ def convert_key(key)
451
+ Key.new({
452
+ :id => key['keyName'],
453
+ :fingerprint => key['keyFingerprint'],
454
+ :credential_type => :key,
455
+ :pem_rsa_key => key['keyMaterial']
456
+ })
457
+ end
458
+
459
+ def convert_image(ec2_image)
460
+ Image.new( {
461
+ :id=>ec2_image['imageId'],
462
+ :name=>ec2_image['name'] || ec2_image['imageId'],
463
+ :description=>ec2_image['description'] || ec2_image['imageLocation'] || '',
464
+ :owner_id=>ec2_image['imageOwnerId'],
465
+ :architecture=>ec2_image['architecture'],
466
+ } )
467
+ end
468
+
469
+ def convert_realm(ec2_realm)
470
+ Realm.new( {
471
+ :id=>ec2_realm['zoneName'],
472
+ :name=>ec2_realm['regionName'],
473
+ :limit=>ec2_realm['zoneState'].eql?('available') ? :unlimited : 0,
474
+ :state=>ec2_realm['zoneState'].upcase,
475
+ } )
476
+ end
477
+
478
+ def convert_state(ec2_state)
479
+ case ec2_state
480
+ when "terminated"
481
+ "STOPPED"
482
+ when "stopped"
483
+ "STOPPED"
484
+ when "running"
485
+ "RUNNING"
486
+ when "pending"
487
+ "PENDING"
488
+ when "shutting-down"
489
+ "STOPPED"
490
+ end
491
+ end
492
+
493
+ def convert_instance(ec2_instance, owner_id)
494
+ state = convert_state(ec2_instance['instanceState']['name'])
495
+ realm_id = ec2_instance['placement']['availabilityZone']
496
+ (realm_id = nil ) if ( realm_id == '' )
497
+ hwp_name = ec2_instance['instanceType']
498
+ instance = Instance.new( {
499
+ :id=>ec2_instance['instanceId'],
500
+ :name => ec2_instance['imageId'],
501
+ :state=>state,
502
+ :image_id=>ec2_instance['imageId'],
503
+ :owner_id=>owner_id,
504
+ :realm_id=>realm_id,
505
+ :public_addresses=>( ec2_instance['dnsName'] == '' ? [] : [ec2_instance['dnsName']] ),
506
+ :private_addresses=>( ec2_instance['privateDnsName'] == '' ? [] : [ec2_instance['privateDnsName']] ),
507
+ :instance_profile =>InstanceProfile.new(hwp_name),
508
+ :actions=>instance_actions_for( state ),
509
+ :keyname => ec2_instance['keyName'],
510
+ :launch_time => ec2_instance['launchTime']
511
+ } )
512
+ instance.authn_error = "Key not set for instance" unless ec2_instance['keyName']
513
+ return instance
514
+ end
515
+
516
+ def convert_volume(ec2_volume)
517
+ attachment = ec2_volume.attachmentSet.item.first if ec2_volume.attachmentSet
518
+ attachment ||= { }
519
+ StorageVolume.new( {
520
+ :id=>ec2_volume['volumeId'],
521
+ :created=>ec2_volume['createTime'],
522
+ :state=>ec2_volume['status'].upcase,
523
+ :capacity=>ec2_volume['size'],
524
+ :instance_id=>attachment['instanceId'],
525
+ :device=>attachment['device'],
526
+ } )
527
+ end
528
+
529
+ def convert_snapshot(ec2_snapshot)
530
+ StorageSnapshot.new( {
531
+ :id=>ec2_snapshot['snapshotId'],
532
+ :state=>ec2_snapshot['status'].upcase,
533
+ :storage_volume_id=>ec2_snapshot['volumeId'],
534
+ :created=>ec2_snapshot['startTime'],
535
+ } )
536
+ end
537
+
538
+ def s3_client(credentials)
539
+ safely do
540
+ s3_client = RightAws::S3.new(credentials.user, credentials.password)
541
+ end
542
+ end
543
+
544
+ def convert_bucket(s3_bucket)
545
+ #get blob list:
546
+ blob_list = []
547
+ s3_bucket.keys.each do |s3_object|
548
+ blob_list << s3_object.name
549
+ end
550
+ #can use AWS::S3::Owner.current.display_name or current.id
551
+ Bucket.new( { :id => s3_bucket.name,
552
+ :name => s3_bucket.name,
553
+ :size => s3_bucket.keys.length,
554
+ :blob_list => blob_list
555
+ }
556
+ )
557
+ end
558
+
559
+ def convert_object(s3_object)
560
+ Blob.new({ :id => s3_object.name,
561
+ :bucket => s3_object.bucket.name.to_s,
562
+ :content_length => s3_object.size,
563
+ :content_type => s3_object.content_type,
564
+ :last_modified => s3_object.last_modified
565
+ })
566
+ end
567
+
568
+ def catched_exceptions_list
569
+ {
570
+ :auth => [ AWS::AuthFailure ],
571
+ :error => [],
572
+ :glob => [ /AWS::(\w+)/ ]
573
+ }
574
+ end
575
+
576
+ end
577
+
578
+ end
579
+ end
580
+ end