fog-maestrodev 1.14.0.20130806165225 → 1.15.0.20130829165835
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/changelog.txt +296 -0
- data/fog.gemspec +2 -2
- data/lib/fog/atmos/storage.rb +0 -3
- data/lib/fog/aws/cdn.rb +1 -2
- data/lib/fog/aws/compute.rb +52 -2
- data/lib/fog/aws/dns.rb +0 -1
- data/lib/fog/aws/models/auto_scaling/groups.rb +6 -3
- data/lib/fog/aws/models/compute/address.rb +1 -0
- data/lib/fog/aws/models/compute/flavors.rb +19 -0
- data/lib/fog/aws/models/compute/route_table.rb +69 -0
- data/lib/fog/aws/models/compute/route_tables.rb +92 -0
- data/lib/fog/aws/models/rds/instance_option.rb +21 -0
- data/lib/fog/aws/models/rds/instance_options.rb +30 -0
- data/lib/fog/aws/parsers/compute/associate_route_table.rb +20 -0
- data/lib/fog/aws/parsers/compute/create_route_table.rb +75 -0
- data/lib/fog/aws/parsers/compute/describe_account_attributes.rb +42 -0
- data/lib/fog/aws/parsers/compute/describe_route_tables.rb +85 -0
- data/lib/fog/aws/parsers/rds/describe_orderable_db_instance_options.rb +47 -0
- data/lib/fog/aws/rds.rb +5 -0
- data/lib/fog/aws/requests/auto_scaling/describe_auto_scaling_groups.rb +9 -1
- data/lib/fog/aws/requests/auto_scaling/describe_policies.rb +15 -1
- data/lib/fog/aws/requests/compute/associate_dhcp_options.rb +2 -2
- data/lib/fog/aws/requests/compute/associate_route_table.rb +75 -0
- data/lib/fog/aws/requests/compute/attach_internet_gateway.rb +2 -2
- data/lib/fog/aws/requests/compute/create_route.rb +89 -0
- data/lib/fog/aws/requests/compute/create_route_table.rb +70 -0
- data/lib/fog/aws/requests/compute/create_vpc.rb +16 -1
- data/lib/fog/aws/requests/compute/delete_dhcp_options.rb +2 -2
- data/lib/fog/aws/requests/compute/delete_internet_gateway.rb +2 -2
- data/lib/fog/aws/requests/compute/delete_network_interface.rb +2 -2
- data/lib/fog/aws/requests/compute/delete_route.rb +60 -0
- data/lib/fog/aws/requests/compute/delete_route_table.rb +51 -0
- data/lib/fog/aws/requests/compute/delete_subnet.rb +2 -2
- data/lib/fog/aws/requests/compute/delete_vpc.rb +2 -2
- data/lib/fog/aws/requests/compute/describe_account_attributes.rb +49 -0
- data/lib/fog/aws/requests/compute/describe_route_tables.rb +87 -0
- data/lib/fog/aws/requests/compute/detach_internet_gateway.rb +2 -2
- data/lib/fog/aws/requests/compute/detach_network_interface.rb +2 -2
- data/lib/fog/aws/requests/compute/disassociate_route_table.rb +57 -0
- data/lib/fog/aws/requests/compute/reset_network_interface_attribute.rb +2 -1
- data/lib/fog/aws/requests/elb/create_load_balancer.rb +23 -9
- data/lib/fog/aws/requests/iam/upload_server_certificate.rb +1 -1
- data/lib/fog/aws/requests/rds/describe_orderable_db_instance_options.rb +76 -0
- data/lib/fog/aws/storage.rb +0 -2
- data/lib/fog/brightbox/models/compute/collaboration.rb +10 -2
- data/lib/fog/brightbox/models/compute/collaborations.rb +26 -2
- data/lib/fog/brightbox/models/compute/user_collaboration.rb +16 -1
- data/lib/fog/brightbox/models/compute/user_collaborations.rb +10 -2
- data/lib/fog/cloudstack/models/compute/server.rb +4 -0
- data/lib/fog/core/collection.rb +18 -0
- data/lib/fog/core/credentials.rb +6 -1
- data/lib/fog/google/compute.rb +17 -0
- data/lib/fog/google/examples/get_list_images.rb +27 -0
- data/lib/fog/google/examples/get_list_snapshots.rb +20 -0
- data/lib/fog/google/examples/image_create.rb +18 -0
- data/lib/fog/google/examples/launch_micro_instance.rb +10 -5
- data/lib/fog/google/examples/network.rb +21 -0
- data/lib/fog/google/models/compute/disk.rb +16 -5
- data/lib/fog/google/models/compute/image.rb +36 -18
- data/lib/fog/google/models/compute/images.rb +36 -10
- data/lib/fog/google/models/compute/server.rb +41 -11
- data/lib/fog/google/models/compute/servers.rb +1 -1
- data/lib/fog/google/models/compute/snapshot.rb +36 -0
- data/lib/fog/google/models/compute/snapshots.rb +28 -0
- data/lib/fog/google/requests/compute/delete_disk.rb +5 -1
- data/lib/fog/google/requests/compute/get_disk.rb +2 -1
- data/lib/fog/google/requests/compute/get_snapshot.rb +34 -0
- data/lib/fog/google/requests/compute/insert_disk.rb +23 -7
- data/lib/fog/google/requests/compute/insert_image.rb +16 -9
- data/lib/fog/google/requests/compute/insert_server.rb +22 -10
- data/lib/fog/google/requests/compute/list_disks.rb +1 -1
- data/lib/fog/google/requests/compute/list_snapshots.rb +30 -0
- data/lib/fog/google/storage.rb +1 -3
- data/lib/fog/hp/storage.rb +0 -2
- data/lib/fog/internet_archive/storage.rb +0 -2
- data/lib/fog/local/storage.rb +0 -2
- data/lib/fog/ninefold/storage.rb +0 -1
- data/lib/fog/openstack/models/storage/file.rb +2 -0
- data/lib/fog/openstack/requests/compute/add_flavor_access.rb +1 -1
- data/lib/fog/openstack/requests/compute/create_volume.rb +8 -7
- data/lib/fog/openstack/requests/compute/list_tenants_with_flavor_access.rb +1 -1
- data/lib/fog/openstack/requests/compute/remove_flavor_access.rb +1 -1
- data/lib/fog/openstack/requests/image/create_image.rb +23 -23
- data/lib/fog/openstack/requests/image/update_image.rb +31 -33
- data/lib/fog/openstack/requests/storage/get_object_https_url.rb +3 -3
- data/lib/fog/openstack/requests/storage/post_set_meta_temp_url_key.rb +1 -1
- data/lib/fog/openstack/storage.rb +10 -11
- data/lib/fog/openstack.rb +10 -1
- data/lib/fog/rackspace/cdn.rb +13 -0
- data/lib/fog/rackspace/compute.rb +8 -4
- data/lib/fog/rackspace/compute_v2.rb +2 -0
- data/lib/fog/rackspace/databases.rb +4 -4
- data/lib/fog/rackspace/dns.rb +6 -6
- data/lib/fog/rackspace/examples/compute_v2/bootstrap_server.rb +98 -0
- data/lib/fog/rackspace/load_balancers.rb +5 -4
- data/lib/fog/rackspace/models/compute_v2/flavors.rb +1 -2
- data/lib/fog/rackspace/models/compute_v2/images.rb +35 -3
- data/lib/fog/rackspace/models/compute_v2/metadatum.rb +2 -2
- data/lib/fog/rackspace/models/identity/service_catalog.rb +34 -16
- data/lib/fog/rackspace/models/load_balancers/load_balancer.rb +8 -3
- data/lib/fog/rackspace/models/monitoring/alarm.rb +16 -8
- data/lib/fog/rackspace/models/monitoring/base.rb +2 -8
- data/lib/fog/rackspace/monitoring.rb +14 -6
- data/lib/fog/rackspace/requests/compute_v2/list_flavors_detail.rb +39 -0
- data/lib/fog/rackspace/requests/compute_v2/list_images.rb +15 -5
- data/lib/fog/rackspace/requests/compute_v2/list_images_detail.rb +53 -0
- data/lib/fog/rackspace/requests/identity/create_token.rb +1 -1
- data/lib/fog/rackspace/requests/load_balancers/create_load_balancer.rb +12 -0
- data/lib/fog/rackspace/requests/load_balancers/get_stats.rb +31 -0
- data/lib/fog/rackspace/requests/monitoring/get_entity.rb +33 -0
- data/lib/fog/rackspace/service.rb +7 -0
- data/lib/fog/rackspace/storage.rb +6 -3
- data/lib/fog/rackspace.rb +8 -5
- data/lib/fog/riakcs/provisioning.rb +0 -1
- data/lib/fog/riakcs/usage.rb +2 -3
- data/lib/fog/storage.rb +2 -0
- data/lib/fog/vcloud/examples/README.md +54 -0
- data/lib/fog/vcloud/examples/creating_a_connection.md +20 -0
- data/lib/fog/vcloud/examples/creating_a_vapp.md +17 -0
- data/lib/fog/vcloud/examples/get_network_information.md +10 -0
- data/lib/fog/vcloud/examples/get_vapp_information.md +10 -0
- data/lib/fog/vcloud/examples/more_on_vapps.md +23 -0
- data/lib/fog/version.rb +1 -1
- data/lib/tasks/changelog_task.rb +1 -0
- data/tests/aws/models/elb/model_tests.rb +5 -0
- data/tests/aws/models/rds/instance_option_tests.rb +14 -0
- data/tests/aws/requests/compute/client_tests.rb +25 -0
- data/tests/aws/requests/compute/route_tests.rb +277 -0
- data/tests/aws/requests/rds/helper.rb +22 -0
- data/tests/aws/requests/rds/instance_option_tests.rb +21 -0
- data/tests/core/credential_tests.rb +21 -0
- data/tests/core/service_tests.rb +26 -0
- data/tests/openstack/authenticate_tests.rb +22 -0
- data/tests/openstack/models/storage/file_tests.rb +20 -1
- data/tests/openstack/requests/compute/flavor_tests.rb +27 -12
- data/tests/openstack/requests/compute/volume_tests.rb +10 -12
- data/tests/openstack/requests/image/image_tests.rb +30 -15
- data/tests/rackspace/block_storage_tests.rb +9 -4
- data/tests/rackspace/cdn_tests.rb +14 -0
- data/tests/rackspace/compute_tests.rb +10 -4
- data/tests/rackspace/compute_v2_tests.rb +9 -4
- data/tests/rackspace/databases_tests.rb +9 -4
- data/tests/rackspace/dns_tests.rb +9 -4
- data/tests/rackspace/helper.rb +21 -2
- data/tests/rackspace/identity_tests.rb +9 -4
- data/tests/rackspace/load_balancer_tests.rb +8 -4
- data/tests/rackspace/models/compute_v2/server_tests.rb +18 -21
- data/tests/rackspace/models/identity/service_catalog_tests.rb +54 -29
- data/tests/rackspace/models/load_balancers/load_balancer_tests.rb +5 -0
- data/tests/rackspace/models/monitoring/alarm_examples_tests.rb +1 -1
- data/tests/rackspace/models/monitoring/alarm_tests.rb +2 -2
- data/tests/rackspace/monitoring_tests.rb +9 -4
- data/tests/rackspace/requests/compute_v2/flavor_tests.rb +6 -0
- data/tests/rackspace/requests/compute_v2/image_tests.rb +4 -0
- data/tests/rackspace/requests/compute_v2/server_tests.rb +2 -2
- data/tests/rackspace/requests/load_balancers/get_stats_tests.rb +13 -0
- data/tests/rackspace/requests/load_balancers/helper.rb +9 -0
- data/tests/rackspace/requests/monitoring/alarm_tests.rb +4 -5
- data/tests/rackspace/requests/monitoring/entity_tests.rb +9 -1
- data/tests/rackspace/requests/storage/large_object_tests.rb +12 -4
- data/tests/rackspace/storage_tests.rb +23 -4
- data/tests/rackspace/url_encoding_tests.rb +3 -1
- metadata +117 -133
- checksums.yaml +0 -15
- data/lib/fog/aws/parsers/compute/associate_dhcp_options.rb +0 -24
- data/lib/fog/aws/parsers/compute/attach_internet_gateway.rb +0 -24
- data/lib/fog/aws/parsers/compute/delete_dhcp_options.rb +0 -24
- data/lib/fog/aws/parsers/compute/delete_internet_gateway.rb +0 -24
- data/lib/fog/aws/parsers/compute/delete_network_interface.rb +0 -24
- data/lib/fog/aws/parsers/compute/delete_subnet.rb +0 -24
- data/lib/fog/aws/parsers/compute/delete_vpc.rb +0 -24
- data/lib/fog/aws/parsers/compute/detach_internet_gateway.rb +0 -24
- data/lib/fog/aws/parsers/compute/detach_network_interface.rb +0 -24
@@ -4,18 +4,17 @@ module Fog
|
|
4
4
|
class Real
|
5
5
|
|
6
6
|
def update_image(attributes)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
}
|
7
|
+
data = {
|
8
|
+
'x-image-meta-name' => attributes[:name],
|
9
|
+
'x-image-meta-disk-format' => attributes[:disk_format],
|
10
|
+
'x-image-meta-container-format' => attributes[:container_format],
|
11
|
+
'x-image-meta-size' => attributes[:size],
|
12
|
+
'x-image-meta-is-public' => attributes[:is_public],
|
13
|
+
'x-image-meta-min-ram' => attributes[:min_ram],
|
14
|
+
'x-image-meta-min-disk' => attributes[:min_disk],
|
15
|
+
'x-image-meta-checksum' => attributes[:checksum],
|
16
|
+
'x-image-meta-owner' => attributes[:owner]
|
17
|
+
}.reject {|k,v| v.nil? }
|
19
18
|
|
20
19
|
unless attributes[:properties].nil?
|
21
20
|
attributes[:properties].each do |key,value|
|
@@ -40,28 +39,27 @@ module Fog
|
|
40
39
|
response.status = 200
|
41
40
|
image = self.images.last
|
42
41
|
response.body = {
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
42
|
+
'image'=> {
|
43
|
+
'name' => attributes[:name] || image.name,
|
44
|
+
'size' => image.size,
|
45
|
+
'min_disk' => (attributes[:min_disk] || image.min_disk).to_i,
|
46
|
+
'disk_format' => attributes[:disk_format] || image.disk_format,
|
47
|
+
'created_at' => image.created_at,
|
48
|
+
'container_format' => attributes[:container_format] || image.container_format,
|
49
|
+
'deleted_at' => nil,
|
50
|
+
'updated_at' => Time.now.to_s,
|
51
|
+
'checksum' => image.checksum,
|
52
|
+
'id' => attributes[:id],
|
53
|
+
'deleted' => false,
|
54
|
+
'protected' => false,
|
55
|
+
'is_public' => attributes[:is_public] || image.is_public,
|
56
|
+
'status' => image.status,
|
57
|
+
'min_ram' => (attributes[:min_ram] || image.min_ram).to_i,
|
58
|
+
'owner' => attributes[:owner] || image.owner,
|
59
|
+
'properties' => attributes[:properties] || image.properties
|
60
|
+
}
|
61
|
+
}
|
63
62
|
response
|
64
|
-
|
65
63
|
end
|
66
64
|
|
67
65
|
end
|
@@ -18,8 +18,8 @@ module Fog
|
|
18
18
|
# ==== See Also
|
19
19
|
# http://docs.rackspace.com/files/api/v1/cf-devguide/content/Create_TempURL-d1a444.html
|
20
20
|
def get_object_https_url(container, object, expires, options = {})
|
21
|
-
if @
|
22
|
-
raise ArgumentError, "Storage must my instantiated with the :
|
21
|
+
if @openstack_temp_url_key.nil?
|
22
|
+
raise ArgumentError, "Storage must my instantiated with the :openstack_temp_url_key option"
|
23
23
|
end
|
24
24
|
|
25
25
|
method = 'GET'
|
@@ -28,7 +28,7 @@ module Fog
|
|
28
28
|
object_path_unescaped = "#{@path}/#{Fog::OpenStack.escape(container)}/#{object}"
|
29
29
|
string_to_sign = "#{method}\n#{expires}\n#{object_path_unescaped}"
|
30
30
|
|
31
|
-
hmac = Fog::HMAC.new('sha1', @
|
31
|
+
hmac = Fog::HMAC.new('sha1', @openstack_temp_url_key)
|
32
32
|
sig = sig_to_hex(hmac.sign(string_to_sign))
|
33
33
|
|
34
34
|
"https://#{@host}#{object_path_escaped}?temp_url_sig=#{sig}&temp_url_expires=#{expires}"
|
@@ -8,7 +8,7 @@ module Fog
|
|
8
8
|
# used to generate signed expiring URLs.
|
9
9
|
#
|
10
10
|
# Once the key has been set with this request you should create new
|
11
|
-
# Storage objects with the :
|
11
|
+
# Storage objects with the :openstack_temp_url_key option then use
|
12
12
|
# the get_object_https_url method to generate expiring URLs.
|
13
13
|
#
|
14
14
|
# *** CAUTION *** changing this secret key will invalidate any expiring
|
@@ -9,7 +9,7 @@ module Fog
|
|
9
9
|
:openstack_api_key
|
10
10
|
recognizes :persistent, :openstack_service_name,
|
11
11
|
:openstack_service_type, :openstack_tenant,
|
12
|
-
:openstack_region
|
12
|
+
:openstack_region, :openstack_temp_url_key
|
13
13
|
|
14
14
|
model_path 'fog/openstack/models/storage'
|
15
15
|
model :directory
|
@@ -45,7 +45,6 @@ module Fog
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def initialize(options={})
|
48
|
-
require 'mime/types'
|
49
48
|
@openstack_api_key = options[:openstack_api_key]
|
50
49
|
@openstack_username = options[:openstack_username]
|
51
50
|
@path = '/v1/AUTH_1234'
|
@@ -58,7 +57,7 @@ module Fog
|
|
58
57
|
def reset_data
|
59
58
|
self.class.data.delete(@openstack_username)
|
60
59
|
end
|
61
|
-
|
60
|
+
|
62
61
|
def change_account(account)
|
63
62
|
@original_path ||= @path
|
64
63
|
version_string = @original_path.split('/')[1]
|
@@ -74,7 +73,6 @@ module Fog
|
|
74
73
|
class Real
|
75
74
|
|
76
75
|
def initialize(options={})
|
77
|
-
require 'mime/types'
|
78
76
|
@openstack_api_key = options[:openstack_api_key]
|
79
77
|
@openstack_username = options[:openstack_username]
|
80
78
|
@openstack_auth_url = options[:openstack_auth_url]
|
@@ -86,6 +84,7 @@ module Fog
|
|
86
84
|
@openstack_region = options[:openstack_region]
|
87
85
|
@openstack_tenant = options[:openstack_tenant]
|
88
86
|
@connection_options = options[:connection_options] || {}
|
87
|
+
@openstack_temp_url_key = options[:openstack_temp_url_key]
|
89
88
|
authenticate
|
90
89
|
@persistent = options[:persistent] || false
|
91
90
|
@connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}", @persistent, @connection_options)
|
@@ -105,7 +104,7 @@ module Fog
|
|
105
104
|
# # List current user account details
|
106
105
|
# service = Fog::Storage[:openstack]
|
107
106
|
# service.request :method => 'HEAD'
|
108
|
-
#
|
107
|
+
#
|
109
108
|
# Would return something like:
|
110
109
|
#
|
111
110
|
# Account: AUTH_1234
|
@@ -118,9 +117,9 @@ module Fog
|
|
118
117
|
#
|
119
118
|
# service.change_account('AUTH_3333')
|
120
119
|
# service.request :method => 'HEAD'
|
121
|
-
#
|
120
|
+
#
|
122
121
|
# Would return something like:
|
123
|
-
#
|
122
|
+
#
|
124
123
|
# Account: AUTH_3333
|
125
124
|
# Date: Tue, 05 Mar 2013 16:51:53 GMT
|
126
125
|
# X-Account-Bytes-Used: 23423433
|
@@ -130,9 +129,9 @@ module Fog
|
|
130
129
|
# If we wan't to go back to our original admin account:
|
131
130
|
#
|
132
131
|
# service.reset_account_name
|
133
|
-
#
|
132
|
+
#
|
134
133
|
def change_account(account)
|
135
|
-
@original_path ||= @path
|
134
|
+
@original_path ||= @path
|
136
135
|
version_string = @path.split('/')[1]
|
137
136
|
@path = "/#{version_string}/#{account}"
|
138
137
|
end
|
@@ -174,7 +173,7 @@ module Fog
|
|
174
173
|
end
|
175
174
|
|
176
175
|
private
|
177
|
-
|
176
|
+
|
178
177
|
def authenticate
|
179
178
|
if !@openstack_management_url || @openstack_must_reauthenticate
|
180
179
|
options = {
|
@@ -188,7 +187,7 @@ module Fog
|
|
188
187
|
:openstack_endpoint_type => 'publicURL'
|
189
188
|
}
|
190
189
|
|
191
|
-
credentials = Fog::OpenStack.
|
190
|
+
credentials = Fog::OpenStack.authenticate(options, @connection_options)
|
192
191
|
|
193
192
|
@current_user = credentials[:user]
|
194
193
|
@current_tenant = credentials[:tenant]
|
data/lib/fog/openstack.rb
CHANGED
@@ -49,6 +49,15 @@ module Fog
|
|
49
49
|
service(:volume, 'openstack/volume', 'Volume')
|
50
50
|
service(:metering, 'openstack/metering', 'Metering')
|
51
51
|
|
52
|
+
def self.authenticate(options, connection_options = {})
|
53
|
+
case options[:openstack_auth_uri].path
|
54
|
+
when /v1(\.\d+)?/
|
55
|
+
authenticate_v1(options, connection_options)
|
56
|
+
else
|
57
|
+
authenticate_v2(options, connection_options)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
52
61
|
# legacy v1.0 style auth
|
53
62
|
def self.authenticate_v1(options, connection_options = {})
|
54
63
|
uri = options[:openstack_auth_uri]
|
@@ -69,7 +78,7 @@ module Fog
|
|
69
78
|
|
70
79
|
return {
|
71
80
|
:token => response.headers['X-Auth-Token'],
|
72
|
-
:server_management_url => response.headers['X-Server-Management-Url'],
|
81
|
+
:server_management_url => response.headers['X-Server-Management-Url'] || response.headers['X-Storage-Url'],
|
73
82
|
:identity_public_endpoint => response.headers['X-Keystone']
|
74
83
|
}
|
75
84
|
end
|
data/lib/fog/rackspace/cdn.rb
CHANGED
@@ -119,6 +119,10 @@ module Fog
|
|
119
119
|
include Base
|
120
120
|
|
121
121
|
def initialize(options={})
|
122
|
+
# api_key and username missing from instance variable sets
|
123
|
+
@rackspace_api_key = options[:rackspace_api_key]
|
124
|
+
@rackspace_username = options[:rackspace_username]
|
125
|
+
|
122
126
|
@connection_options = options[:connection_options] || {}
|
123
127
|
@rackspace_auth_url = options[:rackspace_auth_url]
|
124
128
|
@rackspace_cdn_url = options[:rackspace_cdn_url]
|
@@ -176,6 +180,15 @@ module Fog
|
|
176
180
|
@auth_token = credentials['X-Auth-Token']
|
177
181
|
end
|
178
182
|
|
183
|
+
# Fix for invalid auth_token, likely after 24 hours.
|
184
|
+
def authenticate(options={})
|
185
|
+
super({
|
186
|
+
:rackspace_api_key => @rackspace_api_key,
|
187
|
+
:rackspace_username => @rackspace_username,
|
188
|
+
:rackspace_auth_url => @rackspace_auth_url,
|
189
|
+
:connection_options => @connection_options
|
190
|
+
})
|
191
|
+
end
|
179
192
|
end
|
180
193
|
end
|
181
194
|
end
|
@@ -6,6 +6,10 @@ module Fog
|
|
6
6
|
class Rackspace < Fog::Service
|
7
7
|
include Fog::Rackspace::Errors
|
8
8
|
|
9
|
+
class ServiceError < Fog::Rackspace::Errors::ServiceError; end
|
10
|
+
class InternalServerError < Fog::Rackspace::Errors::InternalServerError; end
|
11
|
+
class BadRequest < Fog::Rackspace::Errors::BadRequest; end
|
12
|
+
|
9
13
|
requires :rackspace_api_key, :rackspace_username
|
10
14
|
recognizes :rackspace_auth_url, :rackspace_servicenet, :persistent
|
11
15
|
recognizes :rackspace_auth_token, :rackspace_management_url, :rackspace_compute_v1_url, :rackspace_region
|
@@ -204,13 +208,13 @@ module Fog
|
|
204
208
|
def request(params, parse_json = true, &block)
|
205
209
|
super(params, parse_json, &block)
|
206
210
|
rescue Excon::Errors::NotFound => error
|
207
|
-
raise NotFound.slurp(error,
|
211
|
+
raise NotFound.slurp(error, self)
|
208
212
|
rescue Excon::Errors::BadRequest => error
|
209
|
-
raise BadRequest.slurp
|
213
|
+
raise BadRequest.slurp(error, self)
|
210
214
|
rescue Excon::Errors::InternalServerError => error
|
211
|
-
raise InternalServerError.slurp
|
215
|
+
raise InternalServerError.slurp(error, self)
|
212
216
|
rescue Excon::Errors::HTTPStatusError => error
|
213
|
-
raise ServiceError.slurp
|
217
|
+
raise ServiceError.slurp(error, self)
|
214
218
|
end
|
215
219
|
|
216
220
|
def service_net?
|
@@ -76,10 +76,12 @@ module Fog
|
|
76
76
|
|
77
77
|
request :create_image
|
78
78
|
request :list_images
|
79
|
+
request :list_images_detail
|
79
80
|
request :get_image
|
80
81
|
request :delete_image
|
81
82
|
|
82
83
|
request :list_flavors
|
84
|
+
request :list_flavors_detail
|
83
85
|
request :get_flavor
|
84
86
|
|
85
87
|
request :attach_volume
|
@@ -88,13 +88,13 @@ module Fog
|
|
88
88
|
def request(params, parse_json = true, &block)
|
89
89
|
super(params, parse_json, &block)
|
90
90
|
rescue Excon::Errors::NotFound => error
|
91
|
-
raise NotFound.slurp(error,
|
91
|
+
raise NotFound.slurp(error, self)
|
92
92
|
rescue Excon::Errors::BadRequest => error
|
93
|
-
raise BadRequest.slurp
|
93
|
+
raise BadRequest.slurp(error, self)
|
94
94
|
rescue Excon::Errors::InternalServerError => error
|
95
|
-
raise InternalServerError.slurp
|
95
|
+
raise InternalServerError.slurp(error, self)
|
96
96
|
rescue Excon::Errors::HTTPStatusError => error
|
97
|
-
raise ServiceError.slurp
|
97
|
+
raise ServiceError.slurp(error, self)
|
98
98
|
end
|
99
99
|
|
100
100
|
def endpoint_uri(service_endpoint_url=nil)
|
data/lib/fog/rackspace/dns.rb
CHANGED
@@ -115,17 +115,17 @@ module Fog
|
|
115
115
|
begin
|
116
116
|
super(params, parse_json, &block)
|
117
117
|
rescue Excon::Errors::NotFound => error
|
118
|
-
raise NotFound.slurp(error,
|
118
|
+
raise NotFound.slurp(error, self)
|
119
119
|
rescue Excon::Errors::BadRequest => error
|
120
|
-
raise BadRequest.slurp
|
120
|
+
raise BadRequest.slurp(error, self)
|
121
121
|
rescue Excon::Errors::InternalServerError => error
|
122
|
-
raise InternalServerError.slurp
|
122
|
+
raise InternalServerError.slurp(error, self)
|
123
123
|
rescue Excon::Errors::ServiceUnavailable => error
|
124
|
-
raise ServiceUnavailable.slurp
|
124
|
+
raise ServiceUnavailable.slurp(error, self)
|
125
125
|
rescue Excon::Errors::Conflict => error
|
126
|
-
raise Conflict.slurp
|
126
|
+
raise Conflict.slurp(error, self)
|
127
127
|
rescue Excon::Errors::HTTPStatusError => error
|
128
|
-
raise ServiceError.slurp
|
128
|
+
raise ServiceError.slurp(error, self)
|
129
129
|
end
|
130
130
|
end
|
131
131
|
|
@@ -0,0 +1,98 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# This example demonstrates creating a server with the Rackpace Open Cloud
|
4
|
+
|
5
|
+
require 'rubygems' #required for Ruby 1.8.x
|
6
|
+
require 'fog'
|
7
|
+
require 'base64' #required to encode files for personality functionality
|
8
|
+
require 'sshkey' #required to generate ssh keys. 'gem install sshkey'
|
9
|
+
|
10
|
+
def get_user_input(prompt)
|
11
|
+
print "#{prompt}: "
|
12
|
+
gets.chomp
|
13
|
+
end
|
14
|
+
|
15
|
+
# Use username defined in ~/.fog file, if absent prompt for username.
|
16
|
+
# For more details on ~/.fog refer to http://fog.io/about/getting_started.html
|
17
|
+
def rackspace_username
|
18
|
+
Fog.credentials[:rackspace_username] || get_user_input("Enter Rackspace Username")
|
19
|
+
end
|
20
|
+
|
21
|
+
# Use api key defined in ~/.fog file, if absent prompt for api key
|
22
|
+
# For more details on ~/.fog refer to http://fog.io/about/getting_started.html
|
23
|
+
def rackspace_api_key
|
24
|
+
Fog.credentials[:rackspace_api_key] || get_user_input("Enter Rackspace API key")
|
25
|
+
end
|
26
|
+
|
27
|
+
# Generates a ssh key using the SSHKey library. The private key is avaialble via
|
28
|
+
# the '.private_key' and the public key is avaialble via '.ssh_public_key'
|
29
|
+
def generate_ssh_key
|
30
|
+
SSHKey.generate
|
31
|
+
end
|
32
|
+
|
33
|
+
# create Next Generation Cloud Server service
|
34
|
+
service = Fog::Compute.new({
|
35
|
+
:provider => 'rackspace',
|
36
|
+
:rackspace_username => rackspace_username,
|
37
|
+
:rackspace_api_key => rackspace_api_key,
|
38
|
+
:version => :v2, # Use Next Gen Cloud Servers
|
39
|
+
:rackspace_region => :ord #Use Chicago Region
|
40
|
+
})
|
41
|
+
|
42
|
+
# pick the first flavor
|
43
|
+
flavor = service.flavors.first
|
44
|
+
|
45
|
+
# pick the first Ubuntu image we can find
|
46
|
+
image = service.images.find {|image| image.name =~ /Ubuntu/}
|
47
|
+
|
48
|
+
# prompt for server name
|
49
|
+
server_name = get_user_input "\nEnter Server Name"
|
50
|
+
|
51
|
+
# generate the ssh key
|
52
|
+
ssh_key = generate_ssh_key
|
53
|
+
|
54
|
+
# reload flavor in order to retrieve all of its attributes
|
55
|
+
flavor.reload
|
56
|
+
|
57
|
+
puts "\nNow creating server '#{server_name}' the following with specifications:\n"
|
58
|
+
puts "\t* #{flavor.ram} MB RAM"
|
59
|
+
puts "\t* #{flavor.disk} GB"
|
60
|
+
puts "\t* #{flavor.vcpus} CPU(s)"
|
61
|
+
puts "\t* #{image.name}"
|
62
|
+
puts "\n"
|
63
|
+
|
64
|
+
begin
|
65
|
+
# bootstrap server
|
66
|
+
server = service.servers.bootstrap :name => server_name,
|
67
|
+
:flavor_id => flavor.id,
|
68
|
+
:image_id => image.id,
|
69
|
+
:private_key => ssh_key.private_key,
|
70
|
+
:public_key => ssh_key.ssh_public_key
|
71
|
+
|
72
|
+
if server.ready?
|
73
|
+
puts "[DONE]\n\n"
|
74
|
+
|
75
|
+
puts "The server has been successfully created.\n"
|
76
|
+
puts "Write the following ssh keys to you ~/.ssh directory in order to log in\n\n"
|
77
|
+
puts "+++++++++++PRIVATE_KEY (~/.ssh/fog_key)++++++++++++"
|
78
|
+
puts ssh_key.private_key
|
79
|
+
puts "++++++++++PUBLIC_KEY (~/.ssh/fog_key.pub)++++++++++"
|
80
|
+
puts ssh_key.ssh_public_key
|
81
|
+
puts "+++++++++++++++++++++++++++++++++++++++++++++++++++i\n\n"
|
82
|
+
|
83
|
+
puts "You can then log into the server using the following command\n"
|
84
|
+
puts "ssh #{server.username}@#{server.public_ip_address}\n\n"
|
85
|
+
else
|
86
|
+
puts "An error occured, please try again"
|
87
|
+
end
|
88
|
+
|
89
|
+
rescue Fog::Errors::TimeoutError
|
90
|
+
puts "[TIMEOUT]\n\n"
|
91
|
+
|
92
|
+
puts "This server is currently #{server.progress}% into the build process and is taking longer to complete than expected."
|
93
|
+
puts "You can continute to monitor the build process through the web console at https://mycloud.rackspace.com/\n\n"
|
94
|
+
end
|
95
|
+
|
96
|
+
puts "To delete the server please execute the delete_server.rb script\n\n"
|
97
|
+
|
98
|
+
|
@@ -73,6 +73,7 @@ module Fog
|
|
73
73
|
request :get_error_page
|
74
74
|
request :set_error_page
|
75
75
|
request :remove_error_page
|
76
|
+
request :get_stats
|
76
77
|
|
77
78
|
module Shared
|
78
79
|
|
@@ -122,13 +123,13 @@ module Fog
|
|
122
123
|
def request(params, parse_json = true, &block)
|
123
124
|
super(params, parse_json, &block)
|
124
125
|
rescue Excon::Errors::NotFound => error
|
125
|
-
raise NotFound.slurp(error,
|
126
|
+
raise NotFound.slurp(error, self)
|
126
127
|
rescue Excon::Errors::BadRequest => error
|
127
|
-
raise BadRequest.slurp
|
128
|
+
raise BadRequest.slurp(error, self)
|
128
129
|
rescue Excon::Errors::InternalServerError => error
|
129
|
-
raise InternalServerError.slurp
|
130
|
+
raise InternalServerError.slurp(error, self)
|
130
131
|
rescue Excon::Errors::HTTPStatusError => error
|
131
|
-
raise ServiceError.slurp
|
132
|
+
raise ServiceError.slurp(error, self)
|
132
133
|
end
|
133
134
|
|
134
135
|
def authenticate(options={})
|
@@ -15,9 +15,8 @@ module Fog
|
|
15
15
|
# @raise [Fog::Compute::RackspaceV2::InternalServerError] - HTTP 500
|
16
16
|
# @raise [Fog::Compute::RackspaceV2::ServiceError]
|
17
17
|
# @note Fog's currentl implementation only returns 1000 flavors.
|
18
|
-
# @note Fog does not retrieve all flavor details. Please use #get to retrieve all details for a specific flavor.
|
19
18
|
def all
|
20
|
-
data = service.
|
19
|
+
data = service.list_flavors_detail.body['flavors']
|
21
20
|
load(data)
|
22
21
|
end
|
23
22
|
|
@@ -5,6 +5,30 @@ module Fog
|
|
5
5
|
module Compute
|
6
6
|
class RackspaceV2
|
7
7
|
class Images < Fog::Collection
|
8
|
+
|
9
|
+
# @!attribute [rw] name
|
10
|
+
# @return [String] Given a string value x, filters the list of images by image name.
|
11
|
+
attribute :name
|
12
|
+
|
13
|
+
# @!attribute [rw] status
|
14
|
+
# @return [String] Given a string value x, filters the list of images by status.
|
15
|
+
# @note Possible values are ACTIVE, DELETED, ERROR, SAVING, and UNKNOWN.
|
16
|
+
attribute :status
|
17
|
+
|
18
|
+
# @!attribute [rw] marker
|
19
|
+
# @return [String] Given a string value x, return object names greater in value than the specified marker.
|
20
|
+
# @see http://docs.rackspace.com/files/api/v1/cf-devguide/content/List_Large_Number_of_Objects-d1e1521.html
|
21
|
+
attribute :marker
|
22
|
+
|
23
|
+
# @!attribute [rw] limit
|
24
|
+
# @return [Integer] For an integer value n, limits the number of results to at most n values.
|
25
|
+
# @see http://docs.rackspace.com/files/api/v1/cf-devguide/content/List_Large_Number_of_Objects-d1e1521.html
|
26
|
+
attribute :limit
|
27
|
+
|
28
|
+
# @!attribute [rw] type
|
29
|
+
# @return [String] Given a string value x, filters the list of images by type.
|
30
|
+
# @note Valid values are BASE and SNAPSHOT
|
31
|
+
attribute :type
|
8
32
|
|
9
33
|
model Fog::Compute::RackspaceV2::Image
|
10
34
|
|
@@ -15,10 +39,18 @@ module Fog
|
|
15
39
|
# @raise [Fog::Compute::RackspaceV2::InternalServerError] - HTTP 500
|
16
40
|
# @raise [Fog::Compute::RackspaceV2::ServiceError]
|
17
41
|
# @note Fog's current implementation only returns 1000 images.
|
18
|
-
# @note Fog does not retrieve all image details. Please use get to retrieve all details for a specific image.
|
19
42
|
# @see http://docs.rackspace.com/servers/api/v2/cs-devguide/content/List_Images-d1e4435.html
|
20
|
-
def all
|
21
|
-
|
43
|
+
def all(options = {})
|
44
|
+
options = {
|
45
|
+
'name' => name,
|
46
|
+
'status' => status,
|
47
|
+
'marker' => marker,
|
48
|
+
'limit' => limit,
|
49
|
+
'type' => type
|
50
|
+
}.merge!(options)
|
51
|
+
merge_attributes(options)
|
52
|
+
|
53
|
+
data = service.list_images_detail(options).body['images']
|
22
54
|
load(data)
|
23
55
|
end
|
24
56
|
|
@@ -19,7 +19,7 @@ module Fog
|
|
19
19
|
# @raise [Fog::Compute::RackspaceV2::ServiceError]
|
20
20
|
def destroy
|
21
21
|
requires :identity
|
22
|
-
|
22
|
+
service.delete_metadata_item(collection_name, parent.id, key)
|
23
23
|
true
|
24
24
|
end
|
25
25
|
|
@@ -31,7 +31,7 @@ module Fog
|
|
31
31
|
# @raise [Fog::Compute::RackspaceV2::ServiceError]
|
32
32
|
def save
|
33
33
|
requires :identity, :value
|
34
|
-
|
34
|
+
service.set_metadata_item(collection_name, parent.id, key, value)
|
35
35
|
true
|
36
36
|
end
|
37
37
|
|
@@ -22,7 +22,7 @@ module Fog
|
|
22
22
|
|
23
23
|
def display_service_regions(service_type)
|
24
24
|
endpoints = get_endpoints(service_type)
|
25
|
-
endpoints.collect { |k,v| ":#{k}" }.join(", ")
|
25
|
+
endpoints.collect { |k,v| ":#{k}" }.join(", ")
|
26
26
|
end
|
27
27
|
|
28
28
|
def get_endpoint(service_type, region=nil)
|
@@ -32,7 +32,7 @@ module Fog
|
|
32
32
|
return endpoint if endpoint.is_a?(String) #There is only one endpoint for service
|
33
33
|
|
34
34
|
unless region
|
35
|
-
raise "There are multiple endpoints
|
35
|
+
raise "There are multiple endpoints available for #{service_type}. Please specify one of the following regions: #{display_service_regions(service_type)}."
|
36
36
|
end
|
37
37
|
region = region.is_a?(String) ? region.to_sym : region
|
38
38
|
endpoint = get_endpoints(service_type)[region]
|
@@ -48,10 +48,16 @@ module Fog
|
|
48
48
|
|
49
49
|
def self.from_response(service, hash)
|
50
50
|
service_catalog = ServiceCatalog.new :service => service
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
51
|
+
begin
|
52
|
+
services = hash["access"]["serviceCatalog"]
|
53
|
+
services.each do |serv|
|
54
|
+
name = serv["name"] ? serv["name"].to_sym : nil
|
55
|
+
next unless name
|
56
|
+
service_catalog.send(:add_endpoints, name, serv)
|
57
|
+
end
|
58
|
+
rescue => e
|
59
|
+
Logger.warning "Exception occurred while loading service catalog - #{e.inspect}"
|
60
|
+
Logger.warning "Unable to load service catalog. Please specify endpoints manually"
|
55
61
|
end
|
56
62
|
service_catalog
|
57
63
|
end
|
@@ -59,20 +65,32 @@ module Fog
|
|
59
65
|
private
|
60
66
|
|
61
67
|
def add_endpoints(service_name, hash)
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
68
|
+
begin
|
69
|
+
endpoints = hash["endpoints"]
|
70
|
+
if endpoints.size == 1
|
71
|
+
catalog[service_name] = endpoints[0]["publicURL"].freeze
|
72
|
+
else
|
73
|
+
catalog[service_name] = endpoints_from_array(service_name, endpoints)
|
74
|
+
end
|
75
|
+
rescue => e
|
76
|
+
Logger.warning "Exception occurred while loading #{service_name} service endpoints - #{e.inspect}"
|
77
|
+
Logger.warning "Unable to load service endpoints for #{service_name}. Please specify #{service_name} endpoints manually."
|
67
78
|
end
|
68
79
|
end
|
69
80
|
|
70
|
-
def endpoints_from_array(endpoints)
|
81
|
+
def endpoints_from_array(service_name, endpoints)
|
71
82
|
hash = {}
|
72
83
|
endpoints.each do |endpoint|
|
73
|
-
|
74
|
-
|
75
|
-
|
84
|
+
begin
|
85
|
+
region_name = endpoint["region"]
|
86
|
+
region = region_name ? region_name.downcase.to_sym : :global
|
87
|
+
url = endpoint["publicURL"].freeze
|
88
|
+
hash[region] = url
|
89
|
+
rescue => e
|
90
|
+
Logger.warning "Exception occurred while loading #{service_name} service endpoints - #{e.inspect}"
|
91
|
+
Logger.warning "Unable to parse #{service_name} endpoint - #{endpoint}"
|
92
|
+
Logger.warning "You may need to specify #{service_name} endpoints manually."
|
93
|
+
end
|
76
94
|
end
|
77
95
|
hash
|
78
96
|
end
|
@@ -80,4 +98,4 @@ module Fog
|
|
80
98
|
end
|
81
99
|
end
|
82
100
|
end
|
83
|
-
end
|
101
|
+
end
|