fog 1.2.0 → 1.3.0
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 +1 -0
- data/changelog.txt +91 -0
- data/fog.gemspec +3 -3
- data/lib/fog.rb +1 -1
- data/lib/fog/aws/compute.rb +5 -4
- data/lib/fog/aws/models/compute/security_group.rb +7 -1
- data/lib/fog/aws/models/compute/subnet.rb +0 -1
- data/lib/fog/aws/parsers/compute/create_security_group.rb +24 -0
- data/lib/fog/aws/requests/cloud_watch/get_metric_statistics.rb +1 -1
- data/lib/fog/aws/requests/compute/authorize_security_group_ingress.rb +19 -11
- data/lib/fog/aws/requests/compute/create_security_group.rb +5 -3
- data/lib/fog/aws/requests/compute/describe_security_groups.rb +1 -1
- data/lib/fog/aws/requests/storage/get_object_http_url.rb +2 -2
- data/lib/fog/aws/requests/storage/get_object_https_url.rb +2 -2
- data/lib/fog/aws/simpledb.rb +6 -1
- data/lib/fog/bin.rb +1 -0
- data/lib/fog/bin/ibm.rb +34 -0
- data/lib/fog/compute.rb +3 -0
- data/lib/fog/core/errors.rb +2 -0
- data/lib/fog/ibm.rb +176 -0
- data/lib/fog/ibm/compute.rb +233 -0
- data/lib/fog/ibm/models/compute/address.rb +62 -0
- data/lib/fog/ibm/models/compute/addresses.rb +28 -0
- data/lib/fog/ibm/models/compute/image.rb +61 -0
- data/lib/fog/ibm/models/compute/images.rb +27 -0
- data/lib/fog/ibm/models/compute/instance-type.rb +14 -0
- data/lib/fog/ibm/models/compute/instance-types.rb +15 -0
- data/lib/fog/ibm/models/compute/key.rb +35 -0
- data/lib/fog/ibm/models/compute/keys.rb +35 -0
- data/lib/fog/ibm/models/compute/location.rb +15 -0
- data/lib/fog/ibm/models/compute/locations.rb +27 -0
- data/lib/fog/ibm/models/compute/server.rb +193 -0
- data/lib/fog/ibm/models/compute/servers.rb +27 -0
- data/lib/fog/ibm/models/storage/offering.rb +18 -0
- data/lib/fog/ibm/models/storage/offerings.rb +19 -0
- data/lib/fog/ibm/models/storage/volume.rb +95 -0
- data/lib/fog/ibm/models/storage/volumes.rb +27 -0
- data/lib/fog/ibm/requests/compute/clone_image.rb +48 -0
- data/lib/fog/ibm/requests/compute/create_address.rb +50 -0
- data/lib/fog/ibm/requests/compute/create_image.rb +56 -0
- data/lib/fog/ibm/requests/compute/create_instance.rb +80 -0
- data/lib/fog/ibm/requests/compute/create_key.rb +61 -0
- data/lib/fog/ibm/requests/compute/delete_address.rb +46 -0
- data/lib/fog/ibm/requests/compute/delete_image.rb +43 -0
- data/lib/fog/ibm/requests/compute/delete_instance.rb +52 -0
- data/lib/fog/ibm/requests/compute/delete_key.rb +41 -0
- data/lib/fog/ibm/requests/compute/get_image.rb +67 -0
- data/lib/fog/ibm/requests/compute/get_image_agreement.rb +66 -0
- data/lib/fog/ibm/requests/compute/get_image_manifest.rb +39 -0
- data/lib/fog/ibm/requests/compute/get_instance.rb +76 -0
- data/lib/fog/ibm/requests/compute/get_instance_logs.rb +25 -0
- data/lib/fog/ibm/requests/compute/get_key.rb +49 -0
- data/lib/fog/ibm/requests/compute/get_location.rb +55 -0
- data/lib/fog/ibm/requests/compute/get_request.rb +78 -0
- data/lib/fog/ibm/requests/compute/list_address_offerings.rb +58 -0
- data/lib/fog/ibm/requests/compute/list_addresses.rb +53 -0
- data/lib/fog/ibm/requests/compute/list_images.rb +58 -0
- data/lib/fog/ibm/requests/compute/list_instances.rb +57 -0
- data/lib/fog/ibm/requests/compute/list_keys.rb +57 -0
- data/lib/fog/ibm/requests/compute/list_locations.rb +37 -0
- data/lib/fog/ibm/requests/compute/list_vlans.rb +52 -0
- data/lib/fog/ibm/requests/compute/modify_instance.rb +71 -0
- data/lib/fog/ibm/requests/compute/modify_key.rb +52 -0
- data/lib/fog/ibm/requests/storage/create_volume.rb +66 -0
- data/lib/fog/ibm/requests/storage/delete_volume.rb +42 -0
- data/lib/fog/ibm/requests/storage/get_volume.rb +72 -0
- data/lib/fog/ibm/requests/storage/list_offerings.rb +76 -0
- data/lib/fog/ibm/requests/storage/list_volumes.rb +47 -0
- data/lib/fog/ibm/storage.rb +82 -0
- data/lib/fog/ovirt/compute.rb +1 -0
- data/lib/fog/ovirt/models/compute/server.rb +5 -0
- data/lib/fog/ovirt/requests/compute/vm_ticket.rb +21 -0
- data/lib/fog/providers.rb +1 -0
- data/lib/fog/storage.rb +3 -0
- data/tests/aws/requests/compute/security_group_tests.rb +37 -39
- data/tests/compute/helper.rb +4 -0
- data/tests/compute/models/flavors_tests.rb +1 -1
- data/tests/helper.rb +1 -1
- data/tests/helpers/mock_helper.rb +2 -0
- data/tests/ibm/models/compute/image_tests.rb +10 -0
- data/tests/ibm/models/compute/key_tests.rb +23 -0
- data/tests/ibm/models/compute/keys_tests.rb +35 -0
- data/tests/ibm/models/compute/locations_tests.rb +18 -0
- data/tests/ibm/models/compute/server_tests.rb +88 -0
- data/tests/ibm/models/compute/servers_tests.rb +37 -0
- data/tests/ibm/models/storage/volume_tests.rb +60 -0
- data/tests/ibm/requests/compute/address_tests.rb +44 -0
- data/tests/ibm/requests/compute/image_tests.rb +110 -0
- data/tests/ibm/requests/compute/instance_tests.rb +102 -0
- data/tests/ibm/requests/compute/key_tests.rb +50 -0
- data/tests/ibm/requests/compute/location_tests.rb +28 -0
- data/tests/ibm/requests/storage/volume_tests.rb +100 -0
- metadata +122 -43
@@ -0,0 +1,37 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class IBM
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Returns the list of Images available to be provisioned on the IBM DeveloperCloud.
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# No parameters
|
10
|
+
#
|
11
|
+
# ==== Returns
|
12
|
+
# * response<~Excon::Response>:
|
13
|
+
# * body<~Hash>:
|
14
|
+
# * 'locations'<~Array>: list of locations
|
15
|
+
def list_locations
|
16
|
+
request(
|
17
|
+
:method => 'GET',
|
18
|
+
:expects => 200,
|
19
|
+
:path => "/locations"
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
class Mock
|
26
|
+
|
27
|
+
def list_locations
|
28
|
+
response = Excon::Response.new
|
29
|
+
response.status = 200
|
30
|
+
response.body = { "locations" => self.data[:locations].values }
|
31
|
+
response
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class IBM
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Returns the vlan offerings for user
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# No parameters
|
10
|
+
#
|
11
|
+
# ==== Returns
|
12
|
+
# * response<~Excon::Response>:
|
13
|
+
# * body<~Hash>:
|
14
|
+
# * 'addresses'<~Array>: list of addresses
|
15
|
+
# * 'location'<~String>: location of address
|
16
|
+
# * 'mode'<~Integer>:
|
17
|
+
# * 'offeringId'<~String>: offering ID
|
18
|
+
# * 'id'<~String>: id
|
19
|
+
# * 'type'<~Integer>: TODO unsure
|
20
|
+
# * 'ip'<~String>: IP address.. with space at the end
|
21
|
+
# * 'hostname'<~String>: seems to be same as ip
|
22
|
+
# * 'state'<~Integer>: state of address
|
23
|
+
def list_vlans
|
24
|
+
request(
|
25
|
+
:method => 'GET',
|
26
|
+
:expects => 200,
|
27
|
+
:path => '/offerings/vlan'
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
class Mock
|
33
|
+
|
34
|
+
def list_vlans
|
35
|
+
response = Excon::Response.new
|
36
|
+
response.status = 200
|
37
|
+
response.body = {"addresses"=>
|
38
|
+
[{"location"=>"101",
|
39
|
+
"mode"=>0,
|
40
|
+
"offeringId"=>"20001223",
|
41
|
+
"id"=>"75321",
|
42
|
+
"type"=>1,
|
43
|
+
"ip"=>"170.224.192.210 ",
|
44
|
+
"hostname"=>"170.224.192.210 ",
|
45
|
+
"state"=>2}]},
|
46
|
+
response
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class IBM
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Modify an instance
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# * instance_id<~String> - id of instance to rename
|
10
|
+
# * params<~Hash> - depends on type of request
|
11
|
+
#
|
12
|
+
# ==== Returns
|
13
|
+
# * response<~Excon::Response>:
|
14
|
+
# * body<~Hash>:
|
15
|
+
# * 'success'<~Bool>:
|
16
|
+
# OR
|
17
|
+
# * response<~Excon::Response>:
|
18
|
+
# * body<~Hash>:
|
19
|
+
# ????
|
20
|
+
# * 'expirationTime'<~Integer>: new expiration time of instance (epoch)
|
21
|
+
#
|
22
|
+
# Note: The feature of dynamically attaching or detaching storage is only
|
23
|
+
# supported by data centers where the KVM host version is RHEL 6.1. If the
|
24
|
+
# feature is not supported by the data center, you will get an exception like
|
25
|
+
# "Unsupported exception. Dynamic features are not supported on the KVM
|
26
|
+
# Host".
|
27
|
+
def modify_instance(instance_id, options={})
|
28
|
+
request(
|
29
|
+
:method => 'PUT',
|
30
|
+
:expects => 200,
|
31
|
+
:path => "/instances/#{instance_id}",
|
32
|
+
:body => options
|
33
|
+
)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class Mock
|
38
|
+
|
39
|
+
def modify_instance(instance_id, params={})
|
40
|
+
response = Excon::Response.new
|
41
|
+
if instance_exists? instance_id
|
42
|
+
if params['state'] == 'restart'
|
43
|
+
self.data[:instances][instance_id]["status"] = "8"
|
44
|
+
response.status = 200
|
45
|
+
response.body = { "success" => true }
|
46
|
+
elsif params['type'] == 'attach' || params['type'] == 'detach'
|
47
|
+
if Fog::Storage[:ibm].volume_exists?(params['volume_id'])
|
48
|
+
# TODO: Update the instance in the data hash, assuming IBM ever gets this feature working properly.
|
49
|
+
response.status = 415
|
50
|
+
else
|
51
|
+
response.status = 404
|
52
|
+
end
|
53
|
+
elsif params['name']
|
54
|
+
self.data[:instances][instance_id]["name"] = params['name']
|
55
|
+
response.status = 200
|
56
|
+
response.body = { "success" => true }
|
57
|
+
elsif params['expirationTime']
|
58
|
+
self.data[:instances][instance_id]["expirationTime"] = params['expirationTime']
|
59
|
+
response.status = 200
|
60
|
+
response.body = { 'expirationTime' => params['expirationTime'] }
|
61
|
+
end
|
62
|
+
else
|
63
|
+
response.status = 404
|
64
|
+
end
|
65
|
+
response
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class IBM
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Modify a key
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# * key_name<~String> - name of key to be modified
|
10
|
+
# * params<~Hash> - depends on type of request
|
11
|
+
#
|
12
|
+
# ==== Returns
|
13
|
+
# * response<~Excon::Response>:
|
14
|
+
# * body<~Hash>:
|
15
|
+
# * 'success'<~Bool>: success status of update request
|
16
|
+
def modify_key(key_name, params={})
|
17
|
+
request(
|
18
|
+
:method => 'PUT',
|
19
|
+
:expects => 200,
|
20
|
+
:path => "/keys/#{key_name}",
|
21
|
+
:body => params
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
class Mock
|
27
|
+
|
28
|
+
def modify_key(key_name, params={})
|
29
|
+
response = Excon::Response.new
|
30
|
+
if key_exists? key_name
|
31
|
+
if params['public_key']
|
32
|
+
self.data[:keys][key_name]['keyMaterial'] = public_key
|
33
|
+
self.data[:keys][key_name]['lastModifiedTime'] = Fog::IBM::Mock.launch_time
|
34
|
+
end
|
35
|
+
if params['default']
|
36
|
+
self.data[:keys].values.each do |key|
|
37
|
+
key['default'] = false
|
38
|
+
end
|
39
|
+
self.data[:keys][key_name]['default'] = true
|
40
|
+
end
|
41
|
+
response.status = 200
|
42
|
+
response.body = {"success"=>true}
|
43
|
+
else
|
44
|
+
response.status = 404
|
45
|
+
end
|
46
|
+
response
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Fog
|
2
|
+
module Storage
|
3
|
+
class IBM
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Requests a new Storage Volume be created.
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# * name<~String> - The alias to use to referance storage volume
|
10
|
+
# * offeringID<~String> - offering id can be requested from /computecloud/enterprise/api/rest/20100331/offerings/storage
|
11
|
+
# * format<~String> - filesystem format for volume
|
12
|
+
# * location<~String> - datacenter location for volume
|
13
|
+
# * size<~String> - size of volume desired (Small, Medium, Large) (varies by location what size actually is)
|
14
|
+
# * storageAreaID<~String> - (not supported yet)
|
15
|
+
#
|
16
|
+
# === Returns
|
17
|
+
# * response<~Excon::Response>:
|
18
|
+
# * body<~Hash>:
|
19
|
+
# * name<~String> - The alias to use to referance storage volume
|
20
|
+
# * format<~String> - filesystem format for storage
|
21
|
+
# * location<~String> - datacenter location for storage
|
22
|
+
# * createdTime<~Integer> - Epoch time of creation
|
23
|
+
# * size<~String> - size of storage desired (Small, Medium, Large) (varies by location what size actually is)
|
24
|
+
# * productCodes<~Array> -
|
25
|
+
# * offeringID<~String> - offering id can be requested from /computecloud/enterprise/api/rest/20100331/offerings/storage
|
26
|
+
# * id<~String> - id of new storage
|
27
|
+
# * owner<~String> - owner of new storage
|
28
|
+
# * state<~Integer> - state of newly requested storage
|
29
|
+
def create_volume(name, offering_id, format, location_id, size)
|
30
|
+
request(
|
31
|
+
:method => 'POST',
|
32
|
+
:expects => 200,
|
33
|
+
:path => '/storage',
|
34
|
+
:body => {
|
35
|
+
'name' => name,
|
36
|
+
'offeringID' => offering_id,
|
37
|
+
'format' => format,
|
38
|
+
'location' => location_id,
|
39
|
+
'size' => size
|
40
|
+
}
|
41
|
+
)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class Mock
|
46
|
+
|
47
|
+
def create_volume(name, offering_id, format, location_id, size)
|
48
|
+
volume = Fog::IBM::Mock.create_volume(name, offering_id, format, location_id, size)
|
49
|
+
self.data[:volumes][volume['id']] = volume
|
50
|
+
response = Excon::Response.new
|
51
|
+
response.status = 200
|
52
|
+
response.body = format_create_volume_response_for(volume['id'])
|
53
|
+
response
|
54
|
+
end
|
55
|
+
|
56
|
+
# The create_volume response doesn't contain ioPrice either
|
57
|
+
def format_create_volume_response_for(volume_id)
|
58
|
+
# If we aren't attached/ready, make us ready
|
59
|
+
ready_volume(volume_id) unless volume_attached? volume_id
|
60
|
+
self.data[:volumes][volume_id].reject { |k,v| k == 'ioPrice' }
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Fog
|
2
|
+
module Storage
|
3
|
+
class IBM
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Deletes the storage that the authenticated user manages with the specified :storage_id
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# * volume_id<~String> - Id of storage volume
|
10
|
+
#
|
11
|
+
# ==== Returns
|
12
|
+
# * response<~Excon::Response>:
|
13
|
+
# * body<~Hash>:
|
14
|
+
# *'success'<~Bool>: true or false for success
|
15
|
+
def delete_volume(volume_id)
|
16
|
+
request(
|
17
|
+
:method => 'DELETE',
|
18
|
+
:expects => 200,
|
19
|
+
:path => "/storage/#{volume_id}"
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
class Mock
|
26
|
+
|
27
|
+
def delete_volume(volume_id)
|
28
|
+
response = Excon::Response.new
|
29
|
+
if volume_exists? volume_id
|
30
|
+
self.data[:volumes].delete volume_id
|
31
|
+
response.status = 200
|
32
|
+
response.body = {"success"=>true}
|
33
|
+
else
|
34
|
+
response.status = 404
|
35
|
+
end
|
36
|
+
response
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Fog
|
2
|
+
module Storage
|
3
|
+
class IBM
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Used to retrieve the specified storage volume for specified volume_id
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# * volume_id<~String> - Id of storage volume
|
10
|
+
#
|
11
|
+
# ==== Returns
|
12
|
+
# * response<~Excon::Response>:
|
13
|
+
# * body<~Hash>:
|
14
|
+
def get_volume(volume_id)
|
15
|
+
request(
|
16
|
+
:method => 'GET',
|
17
|
+
:expects => 200,
|
18
|
+
:path => "/storage/#{volume_id}"
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
class Mock
|
25
|
+
|
26
|
+
# For whatever reason, get_volume returns different data than an entry in list_volumes
|
27
|
+
def get_volume(volume_id)
|
28
|
+
response = Excon::Response.new
|
29
|
+
if volume_exists? volume_id
|
30
|
+
response.status = 200
|
31
|
+
response.body = format_get_volume_response_for(volume_id)
|
32
|
+
else
|
33
|
+
response.status = 404
|
34
|
+
end
|
35
|
+
response
|
36
|
+
end
|
37
|
+
|
38
|
+
# get_volume response doesn't contain instanceId
|
39
|
+
def format_get_volume_response_for(volume_id)
|
40
|
+
# If we aren't attached/ready, make us ready
|
41
|
+
ready_volume(volume_id) unless volume_attached? volume_id
|
42
|
+
self.data[:volumes][volume_id].reject { |k,v| k == 'instanceId' }
|
43
|
+
end
|
44
|
+
|
45
|
+
# The list_volumes response doesn't contain ioPrice
|
46
|
+
def format_list_volumes_response
|
47
|
+
self.data[:volumes].values.dup.map { |volume| volume.reject { |k,v| k == 'ioPrice'} }
|
48
|
+
end
|
49
|
+
|
50
|
+
def volume_exists?(volume_id)
|
51
|
+
self.data[:volumes].key? volume_id
|
52
|
+
end
|
53
|
+
|
54
|
+
# Checks if an volume is Active
|
55
|
+
def volume_ready?(volume_id)
|
56
|
+
self.data[:volumes][volume_id]['state'] == 4
|
57
|
+
end
|
58
|
+
|
59
|
+
def volume_attached?(volume_id)
|
60
|
+
self.data[:volumes][volume_id]['instanceId'] != "0"
|
61
|
+
end
|
62
|
+
|
63
|
+
# Sets volume status to Detached if it's not already set, and or attached
|
64
|
+
def ready_volume(volume_id)
|
65
|
+
# If not ready, make ready
|
66
|
+
self.data[:volumes][volume_id]['state'] = 4
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Fog
|
2
|
+
module Storage
|
3
|
+
class IBM
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Returns the offerings of storage for the authenticated user
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# No parameters
|
10
|
+
#
|
11
|
+
# ==== Returns
|
12
|
+
# * response<~Excon::Response>:
|
13
|
+
# * body<~Hash>:
|
14
|
+
# * 'volumes'<~Array>: list of images
|
15
|
+
# * 'name'<~String>: Name of storage offering
|
16
|
+
# * 'price'<~Hash>: hash containing pricing information
|
17
|
+
# * 'pricePerQuantity'<~Integer>:
|
18
|
+
# * 'effectiveDate'<~Integer>: starting date price is effective
|
19
|
+
# * 'rate'<~Float>: rate per unit
|
20
|
+
# * 'countryCode'<~String>:
|
21
|
+
# * 'currencyCode'<~String>: currency used
|
22
|
+
# * 'location'<~String>: datacenter location string
|
23
|
+
# * 'id'<~String>: id of offering
|
24
|
+
# * 'formats'<~Array>: filesystem format storage offered with
|
25
|
+
# * 'label'<~String>: label for filesystem
|
26
|
+
# * 'id'<~String>: string used for id of format
|
27
|
+
# * 'capacity'<~Integer>: size in GB's
|
28
|
+
def list_offerings
|
29
|
+
request(
|
30
|
+
:method => 'GET',
|
31
|
+
:expects => 200,
|
32
|
+
:path => '/offerings/storage'
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
class Mock
|
39
|
+
|
40
|
+
def list_offerings
|
41
|
+
response = Excon::Response.new
|
42
|
+
response.status = 200
|
43
|
+
response.body = {"volumes"=>
|
44
|
+
[{"name"=>"Small",
|
45
|
+
"price"=>
|
46
|
+
{"pricePerQuantity"=>1,
|
47
|
+
"effectiveDate"=>-1,
|
48
|
+
"rate"=>0.0384,
|
49
|
+
"countryCode"=>"897",
|
50
|
+
"unitOfMeasure"=>"UHR",
|
51
|
+
"currencyCode"=>"USD"},
|
52
|
+
"location"=>"61",
|
53
|
+
"id"=>"20001208",
|
54
|
+
"formats"=>
|
55
|
+
[{"label"=>"ext3", "id"=>"EXT3"}, {"label"=>"raw", "id"=>"RAW"}],
|
56
|
+
"capacity"=>256},
|
57
|
+
{"name"=>"Small",
|
58
|
+
"price"=>
|
59
|
+
{"pricePerQuantity"=>1,
|
60
|
+
"effectiveDate"=>-1,
|
61
|
+
"rate"=>0.0384,
|
62
|
+
"countryCode"=>"897",
|
63
|
+
"unitOfMeasure"=>"UHR",
|
64
|
+
"currencyCode"=>"USD"},
|
65
|
+
"location"=>"141",
|
66
|
+
"id"=>"20001208",
|
67
|
+
"formats"=>
|
68
|
+
[{"label"=>"ext3", "id"=>"EXT3"}, {"label"=>"raw", "id"=>"RAW"}],
|
69
|
+
"capacity"=>256}]},
|
70
|
+
response
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|