fog 0.1.8 → 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -2
- data/Gemfile.lock +5 -5
- data/README.rdoc +29 -29
- data/fog.gemspec +24 -2
- data/lib/fog.rb +4 -15
- data/lib/fog/aws.rb +2 -2
- data/lib/fog/aws/ec2.rb +64 -101
- data/lib/fog/aws/elb.rb +19 -27
- data/lib/fog/aws/models/ec2/addresses.rb +1 -9
- data/lib/fog/aws/models/ec2/flavors.rb +1 -7
- data/lib/fog/aws/models/ec2/images.rb +1 -7
- data/lib/fog/aws/models/ec2/key_pairs.rb +1 -7
- data/lib/fog/aws/models/ec2/security_groups.rb +1 -7
- data/lib/fog/aws/models/ec2/servers.rb +1 -7
- data/lib/fog/aws/models/ec2/snapshots.rb +1 -9
- data/lib/fog/aws/models/ec2/volumes.rb +1 -9
- data/lib/fog/aws/models/s3/directories.rb +1 -7
- data/lib/fog/aws/models/s3/file.rb +5 -0
- data/lib/fog/aws/requests/ec2/allocate_address.rb +2 -0
- data/lib/fog/aws/requests/ec2/attach_volume.rb +2 -0
- data/lib/fog/aws/requests/ec2/create_key_pair.rb +2 -0
- data/lib/fog/aws/requests/ec2/create_snapshot.rb +2 -0
- data/lib/fog/aws/requests/ec2/create_volume.rb +2 -0
- data/lib/fog/aws/requests/ec2/describe_addresses.rb +2 -0
- data/lib/fog/aws/requests/ec2/describe_availability_zones.rb +2 -0
- data/lib/fog/aws/requests/ec2/describe_images.rb +2 -0
- data/lib/fog/aws/requests/ec2/describe_instances.rb +2 -0
- data/lib/fog/aws/requests/ec2/describe_key_pairs.rb +2 -0
- data/lib/fog/aws/requests/ec2/describe_regions.rb +2 -0
- data/lib/fog/aws/requests/ec2/describe_reserved_instances.rb +2 -0
- data/lib/fog/aws/requests/ec2/describe_security_groups.rb +2 -0
- data/lib/fog/aws/requests/ec2/describe_snapshots.rb +2 -0
- data/lib/fog/aws/requests/ec2/describe_volumes.rb +2 -0
- data/lib/fog/aws/requests/ec2/detach_volume.rb +2 -0
- data/lib/fog/aws/requests/ec2/get_console_output.rb +2 -0
- data/lib/fog/aws/requests/ec2/run_instances.rb +2 -0
- data/lib/fog/aws/requests/ec2/terminate_instances.rb +2 -0
- data/lib/fog/aws/requests/elb/create_load_balancer.rb +2 -0
- data/lib/fog/aws/requests/elb/delete_load_balancer.rb +2 -0
- data/lib/fog/aws/requests/elb/deregister_instances_from_load_balancer.rb +2 -0
- data/lib/fog/aws/requests/elb/describe_instance_health.rb +2 -0
- data/lib/fog/aws/requests/elb/describe_load_balancers.rb +2 -0
- data/lib/fog/aws/requests/elb/disable_availability_zones_for_load_balancer.rb +2 -0
- data/lib/fog/aws/requests/elb/enable_availability_zones_for_load_balancer.rb +2 -0
- data/lib/fog/aws/requests/elb/register_instances_with_load_balancer.rb +2 -0
- data/lib/fog/aws/requests/s3/copy_object.rb +2 -0
- data/lib/fog/aws/requests/s3/get_bucket.rb +2 -0
- data/lib/fog/aws/requests/s3/get_bucket_acl.rb +2 -0
- data/lib/fog/aws/requests/s3/get_bucket_location.rb +2 -0
- data/lib/fog/aws/requests/s3/get_bucket_logging.rb +2 -0
- data/lib/fog/aws/requests/s3/get_bucket_object_versions.rb +2 -0
- data/lib/fog/aws/requests/s3/get_bucket_versioning.rb +2 -0
- data/lib/fog/aws/requests/s3/get_object_acl.rb +2 -0
- data/lib/fog/aws/requests/s3/get_request_payment.rb +2 -0
- data/lib/fog/aws/requests/s3/get_service.rb +2 -0
- data/lib/fog/aws/requests/s3/put_object.rb +2 -2
- data/lib/fog/aws/requests/simpledb/domain_metadata.rb +2 -0
- data/lib/fog/aws/requests/simpledb/get_attributes.rb +2 -0
- data/lib/fog/aws/requests/simpledb/list_domains.rb +2 -0
- data/lib/fog/aws/requests/simpledb/select.rb +2 -0
- data/lib/fog/aws/s3.rb +68 -85
- data/lib/fog/aws/simpledb.rb +15 -29
- data/lib/fog/bluebox.rb +23 -40
- data/lib/fog/bluebox/models/flavors.rb +1 -7
- data/lib/fog/bluebox/models/images.rb +1 -9
- data/lib/fog/bluebox/models/servers.rb +1 -7
- data/lib/fog/credentials.rb +2 -0
- data/lib/fog/errors.rb +20 -0
- data/lib/fog/hmac.rb +48 -0
- data/lib/fog/local.rb +9 -22
- data/lib/fog/local/models/directories.rb +1 -7
- data/lib/fog/rackspace.rb +2 -6
- data/lib/fog/rackspace/files.rb +46 -48
- data/lib/fog/rackspace/models/files/directories.rb +1 -7
- data/lib/fog/rackspace/models/servers/flavors.rb +1 -7
- data/lib/fog/rackspace/models/servers/images.rb +1 -9
- data/lib/fog/rackspace/models/servers/server.rb +37 -1
- data/lib/fog/rackspace/models/servers/servers.rb +8 -7
- data/lib/fog/rackspace/requests/files/put_object.rb +1 -1
- data/lib/fog/rackspace/servers.rb +33 -45
- data/lib/fog/service.rb +82 -0
- data/lib/fog/slicehost.rb +28 -42
- data/lib/fog/slicehost/models/flavors.rb +1 -7
- data/lib/fog/slicehost/models/images.rb +1 -9
- data/lib/fog/slicehost/models/servers.rb +1 -7
- data/lib/fog/ssh.rb +1 -1
- data/lib/fog/vcloud.rb +20 -3
- data/lib/fog/vcloud/collection.rb +25 -5
- data/lib/fog/vcloud/model.rb +4 -0
- data/lib/fog/vcloud/parsers/get_organization.rb +2 -2
- data/lib/fog/vcloud/parsers/get_vdc.rb +2 -2
- data/lib/fog/vcloud/parsers/get_versions.rb +1 -1
- data/lib/fog/vcloud/parsers/login.rb +2 -2
- data/lib/fog/vcloud/parsers/network.rb +53 -0
- data/lib/fog/vcloud/requests/get_network.rb +54 -0
- data/lib/fog/vcloud/requests/get_organization.rb +1 -2
- data/lib/fog/vcloud/terremark/ecloud.rb +17 -4
- data/lib/fog/vcloud/terremark/ecloud/models/internet_service.rb +35 -0
- data/lib/fog/vcloud/terremark/ecloud/models/internet_services.rb +9 -9
- data/lib/fog/vcloud/terremark/ecloud/models/ip.rb +18 -0
- data/lib/fog/vcloud/terremark/ecloud/models/ips.rb +36 -0
- data/lib/fog/vcloud/terremark/ecloud/models/network.rb +32 -0
- data/lib/fog/vcloud/terremark/ecloud/models/networks.rb +38 -0
- data/lib/fog/vcloud/terremark/ecloud/models/public_ip.rb +3 -1
- data/lib/fog/vcloud/terremark/ecloud/models/public_ips.rb +1 -1
- data/lib/fog/vcloud/terremark/ecloud/models/vdc.rb +9 -0
- data/lib/fog/vcloud/terremark/ecloud/models/vdcs.rb +2 -0
- data/lib/fog/vcloud/terremark/ecloud/parsers/network.rb +28 -0
- data/lib/fog/vcloud/terremark/ecloud/parsers/network_ips.rb +31 -0
- data/lib/fog/vcloud/terremark/ecloud/requests/add_internet_service.rb +10 -7
- data/lib/fog/vcloud/terremark/ecloud/requests/configure_internet_service.rb +99 -0
- data/lib/fog/vcloud/terremark/ecloud/requests/get_network.rb +54 -0
- data/lib/fog/vcloud/terremark/ecloud/requests/get_network_ips.rb +51 -0
- data/spec/aws/models/s3/file_spec.rb +15 -0
- data/spec/vcloud/requests/get_network_spec.rb +55 -0
- data/spec/vcloud/spec_helper.rb +1 -0
- data/spec/vcloud/terremark/ecloud/models/internet_service_spec.rb +15 -0
- data/spec/vcloud/terremark/ecloud/models/ip_spec.rb +35 -0
- data/spec/vcloud/terremark/ecloud/models/ips_spec.rb +28 -0
- data/spec/vcloud/terremark/ecloud/models/network_spec.rb +65 -0
- data/spec/vcloud/terremark/ecloud/models/networks_spec.rb +26 -0
- data/spec/vcloud/terremark/ecloud/models/public_ip_spec.rb +0 -2
- data/spec/vcloud/terremark/ecloud/requests/configure_internet_service_spec.rb +44 -0
- data/spec/vcloud/terremark/ecloud/requests/get_network_ips_spec.rb +54 -0
- data/spec/vcloud/terremark/ecloud/requests/get_network_spec.rb +63 -0
- data/tests/aws/requests/ec2/volume_tests.rb +2 -2
- data/tests/helper.rb +2 -0
- metadata +25 -3
@@ -9,7 +9,6 @@ module Fog
|
|
9
9
|
identity :id
|
10
10
|
|
11
11
|
attribute :addresses
|
12
|
-
attribute :password, 'adminPass'
|
13
12
|
attribute :flavor_id, 'flavorId'
|
14
13
|
attribute :host_id, 'hostId'
|
15
14
|
attribute :image_id, 'imageId'
|
@@ -19,6 +18,8 @@ module Fog
|
|
19
18
|
attribute :progress
|
20
19
|
attribute :status
|
21
20
|
|
21
|
+
attr_accessor :password, :private_key_path, :public_key_path
|
22
|
+
|
22
23
|
def destroy
|
23
24
|
requires :id
|
24
25
|
connection.delete_server(@id)
|
@@ -50,6 +51,14 @@ module Fog
|
|
50
51
|
true
|
51
52
|
end
|
52
53
|
|
54
|
+
def private_key_path
|
55
|
+
@private_key_path || Fog.credentials[:private_key_path]
|
56
|
+
end
|
57
|
+
|
58
|
+
def public_key_path
|
59
|
+
@public_key_path || Fog.credentials[:public_key_path]
|
60
|
+
end
|
61
|
+
|
53
62
|
def save
|
54
63
|
requires :flavor_id, :image_id
|
55
64
|
options = {
|
@@ -63,8 +72,35 @@ module Fog
|
|
63
72
|
true
|
64
73
|
end
|
65
74
|
|
75
|
+
def ssh(commands)
|
76
|
+
requires :addresses, :identity, :private_key_path
|
77
|
+
@ssh ||= Fog::SSH.new(@addresses['public'].first, 'root', :keys => [private_key_path])
|
78
|
+
@ssh.run(commands)
|
79
|
+
end
|
80
|
+
|
81
|
+
def setup
|
82
|
+
requires :addresses, :identity, :password, :public_key_path
|
83
|
+
Fog::SSH.new(@addresses['public'].first, 'root', :password => password).run([
|
84
|
+
%{mkdir .ssh},
|
85
|
+
%{echo "#{File.read(File.expand_path(public_key_path))}" >> ~/.ssh/authorized_keys},
|
86
|
+
%{passwd -l root},
|
87
|
+
%{echo "#{attributes.to_json}" >> ~/attributes.json},
|
88
|
+
%{echo "#{metadata.to_json}" >> ~/metadata.json}
|
89
|
+
])
|
90
|
+
rescue Errno::ECONNREFUSED
|
91
|
+
sleep(1)
|
92
|
+
retry
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
|
97
|
+
def adminPass=(new_admin_pass)
|
98
|
+
@password = new_admin_pass
|
99
|
+
end
|
100
|
+
|
66
101
|
end
|
67
102
|
|
68
103
|
end
|
69
104
|
end
|
105
|
+
|
70
106
|
end
|
@@ -5,13 +5,7 @@ module Fog
|
|
5
5
|
module Rackspace
|
6
6
|
module Servers
|
7
7
|
|
8
|
-
|
9
|
-
def servers
|
10
|
-
Fog::Rackspace::Servers::Servers.new(:connection => self)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
class Real
|
8
|
+
module Collections
|
15
9
|
def servers
|
16
10
|
Fog::Rackspace::Servers::Servers.new(:connection => self)
|
17
11
|
end
|
@@ -26,6 +20,13 @@ module Fog
|
|
26
20
|
load(data)
|
27
21
|
end
|
28
22
|
|
23
|
+
def bootstrap(new_attributes = {})
|
24
|
+
server = create(new_attributes)
|
25
|
+
server.wait_for { ready? }
|
26
|
+
server.setup
|
27
|
+
server
|
28
|
+
end
|
29
|
+
|
29
30
|
def get(server_id)
|
30
31
|
if server = connection.get_server_details(server_id).body['server']
|
31
32
|
new(server)
|
@@ -9,7 +9,7 @@ module Fog
|
|
9
9
|
# * container<~String> - Name for container, should be < 256 bytes and must not contain '/'
|
10
10
|
#
|
11
11
|
def put_object(container, object, data)
|
12
|
-
data =
|
12
|
+
data = parse_data(data)
|
13
13
|
response = storage_request(
|
14
14
|
:body => data[:body],
|
15
15
|
:expects => 201,
|
@@ -1,52 +1,40 @@
|
|
1
1
|
module Fog
|
2
2
|
module Rackspace
|
3
3
|
module Servers
|
4
|
+
extend Fog::Service
|
4
5
|
|
5
|
-
|
6
|
-
class NotFound < Fog::Errors::NotFound; end
|
6
|
+
requires :rackspace_api_key, :rackspace_username
|
7
7
|
|
8
|
-
|
8
|
+
model_path 'fog/rackspace/models/servers'
|
9
|
+
model 'flavor'
|
10
|
+
model 'flavors'
|
11
|
+
model 'image'
|
12
|
+
model 'images'
|
13
|
+
model 'server'
|
14
|
+
model 'servers'
|
9
15
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
require 'fog/rackspace/requests/servers/list_images'
|
30
|
-
require 'fog/rackspace/requests/servers/list_images_detail'
|
31
|
-
require 'fog/rackspace/requests/servers/list_servers'
|
32
|
-
require 'fog/rackspace/requests/servers/list_servers_detail'
|
33
|
-
require 'fog/rackspace/requests/servers/reboot_server'
|
34
|
-
require 'fog/rackspace/requests/servers/update_server'
|
35
|
-
@required = true
|
36
|
-
end
|
37
|
-
|
38
|
-
if Fog.mocking?
|
39
|
-
Fog::Rackspace::Servers::Mock.new(options)
|
40
|
-
else
|
41
|
-
Fog::Rackspace::Servers::Real.new(options)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def self.reset_data(keys=Mock.data.keys)
|
46
|
-
Mock.reset_data(keys)
|
47
|
-
end
|
16
|
+
request_path 'fog/rackspace/requests/servers'
|
17
|
+
request 'create_image'
|
18
|
+
request 'create_server'
|
19
|
+
request 'delete_image'
|
20
|
+
request 'delete_server'
|
21
|
+
request 'get_flavor_details'
|
22
|
+
request 'get_image_details'
|
23
|
+
request 'get_server_details'
|
24
|
+
request 'list_addresses'
|
25
|
+
request 'list_private_addresses'
|
26
|
+
request 'list_public_addresses'
|
27
|
+
request 'list_flavors'
|
28
|
+
request 'list_flavors_detail'
|
29
|
+
request 'list_images'
|
30
|
+
request 'list_images_detail'
|
31
|
+
request 'list_servers'
|
32
|
+
request 'list_servers_detail'
|
33
|
+
request 'reboot_server'
|
34
|
+
request 'update_server'
|
48
35
|
|
49
36
|
class Mock
|
37
|
+
include Collections
|
50
38
|
|
51
39
|
def self.data
|
52
40
|
@data ||= Hash.new do |hash, key|
|
@@ -75,6 +63,7 @@ module Fog
|
|
75
63
|
end
|
76
64
|
|
77
65
|
class Real
|
66
|
+
include Collections
|
78
67
|
|
79
68
|
def initialize(options={})
|
80
69
|
credentials = Fog::Rackspace.authenticate(options)
|
@@ -88,7 +77,6 @@ module Fog
|
|
88
77
|
|
89
78
|
def request(params)
|
90
79
|
@connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}")
|
91
|
-
|
92
80
|
begin
|
93
81
|
response = @connection.request(params.merge!({
|
94
82
|
:headers => {
|
@@ -99,11 +87,11 @@ module Fog
|
|
99
87
|
:path => "#{@path}/#{params[:path]}"
|
100
88
|
}))
|
101
89
|
rescue Excon::Errors::Error => error
|
102
|
-
case error
|
90
|
+
raise case error
|
103
91
|
when Excon::Errors::NotFound
|
104
|
-
|
92
|
+
Fog::Rackspace::Servers::NotFound.slurp(error)
|
105
93
|
else
|
106
|
-
|
94
|
+
error
|
107
95
|
end
|
108
96
|
end
|
109
97
|
unless response.body.empty?
|
data/lib/fog/service.rb
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
module Fog
|
2
|
+
module Service
|
3
|
+
|
4
|
+
def self.extended(other)
|
5
|
+
super
|
6
|
+
other.module_eval <<-EOS, __FILE__, __LINE__
|
7
|
+
class Error < Fog::Errors::Error; end
|
8
|
+
class NotFound < Fog::Errors::NotFound; end
|
9
|
+
|
10
|
+
module Collections; end
|
11
|
+
|
12
|
+
def self.new(options={})
|
13
|
+
missing = []
|
14
|
+
for requirement in requirements
|
15
|
+
missing << requirement unless options[requirement]
|
16
|
+
end
|
17
|
+
unless missing.empty?
|
18
|
+
if missing.length == 1
|
19
|
+
raise(ArgumentError, [missing.first, "is required for this service"].join(' '))
|
20
|
+
else
|
21
|
+
raise(ArgumentError, [missing[0...-1].join(", "), 'and', missing[-1], 'are required for this service'].join(' '))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
unless @required
|
26
|
+
for model in models
|
27
|
+
require [@model_path, model].join('/')
|
28
|
+
end
|
29
|
+
for request in requests
|
30
|
+
require [@request_path, request].join('/')
|
31
|
+
end
|
32
|
+
@required = true
|
33
|
+
end
|
34
|
+
|
35
|
+
if Fog.mocking?
|
36
|
+
Mock.new(options)
|
37
|
+
else
|
38
|
+
Real.new(options)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
EOS
|
42
|
+
end
|
43
|
+
|
44
|
+
def model_path(new_path)
|
45
|
+
@model_path = new_path
|
46
|
+
end
|
47
|
+
|
48
|
+
def model(new_model)
|
49
|
+
models << new_model
|
50
|
+
end
|
51
|
+
|
52
|
+
def models
|
53
|
+
@models ||= []
|
54
|
+
end
|
55
|
+
|
56
|
+
def request_path(new_path)
|
57
|
+
@request_path = new_path
|
58
|
+
end
|
59
|
+
|
60
|
+
def request(new_request)
|
61
|
+
requests << new_request
|
62
|
+
end
|
63
|
+
|
64
|
+
def requests
|
65
|
+
@requests ||= []
|
66
|
+
end
|
67
|
+
|
68
|
+
def requires(*args)
|
69
|
+
requirements.concat(args)
|
70
|
+
end
|
71
|
+
|
72
|
+
def requirements
|
73
|
+
@requirements ||= []
|
74
|
+
end
|
75
|
+
|
76
|
+
def reset_data(keys=Mock.data.keys)
|
77
|
+
Mock.reset_data(keys)
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
data/lib/fog/slicehost.rb
CHANGED
@@ -1,46 +1,31 @@
|
|
1
1
|
module Fog
|
2
2
|
module Slicehost
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
@required = true
|
27
|
-
end
|
28
|
-
|
29
|
-
unless options[:slicehost_password]
|
30
|
-
raise ArgumentError.new('slicehost_password is required to access slicehost')
|
31
|
-
end
|
32
|
-
if Fog.mocking?
|
33
|
-
Fog::Slicehost::Mock.new(options)
|
34
|
-
else
|
35
|
-
Fog::Slicehost::Real.new(options)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.reset_data(keys=Mock.data.keys)
|
40
|
-
Mock.reset_data(keys)
|
41
|
-
end
|
3
|
+
extend Fog::Service
|
4
|
+
|
5
|
+
requires :slicehost_password
|
6
|
+
|
7
|
+
model_path 'fog/slicehost/models'
|
8
|
+
model 'flavor'
|
9
|
+
model 'flavors'
|
10
|
+
model 'image'
|
11
|
+
model 'images'
|
12
|
+
model 'server'
|
13
|
+
model 'servers'
|
14
|
+
|
15
|
+
request_path 'fog/slicehost/requests'
|
16
|
+
request 'create_slice'
|
17
|
+
request 'delete_slice'
|
18
|
+
request 'get_backups'
|
19
|
+
request 'get_flavor'
|
20
|
+
request 'get_flavors'
|
21
|
+
request 'get_image'
|
22
|
+
request 'get_images'
|
23
|
+
request 'get_slice'
|
24
|
+
request 'get_slices'
|
25
|
+
request 'reboot_slice'
|
42
26
|
|
43
27
|
class Mock
|
28
|
+
include Collections
|
44
29
|
|
45
30
|
def self.data
|
46
31
|
@data ||= Hash.new do |hash, key|
|
@@ -62,6 +47,7 @@ module Fog
|
|
62
47
|
end
|
63
48
|
|
64
49
|
class Real
|
50
|
+
include Collections
|
65
51
|
|
66
52
|
def initialize(options={})
|
67
53
|
@slicehost_password = options[:slicehost_password]
|
@@ -86,11 +72,11 @@ module Fog
|
|
86
72
|
begin
|
87
73
|
response = @connection.request(params.merge!({:host => @host}))
|
88
74
|
rescue Excon::Errors::Error => error
|
89
|
-
case error
|
75
|
+
raise case error
|
90
76
|
when Excon::Errors::NotFound
|
91
|
-
|
77
|
+
Fog::Slicehost::NotFound.slurp(error)
|
92
78
|
else
|
93
|
-
|
79
|
+
error
|
94
80
|
end
|
95
81
|
end
|
96
82
|
|
@@ -4,13 +4,7 @@ require 'fog/slicehost/models/flavor'
|
|
4
4
|
module Fog
|
5
5
|
module Slicehost
|
6
6
|
|
7
|
-
|
8
|
-
def flavors
|
9
|
-
Fog::Slicehost::Flavors.new(:connection => self)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
class Real
|
7
|
+
module Collections
|
14
8
|
def flavors
|
15
9
|
Fog::Slicehost::Flavors.new(:connection => self)
|
16
10
|
end
|
@@ -4,15 +4,7 @@ require 'fog/slicehost/models/image'
|
|
4
4
|
module Fog
|
5
5
|
module Slicehost
|
6
6
|
|
7
|
-
|
8
|
-
def images(attributes = {})
|
9
|
-
Fog::Slicehost::Images.new({
|
10
|
-
:connection => self
|
11
|
-
}.merge!(attributes))
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
class Real
|
7
|
+
module Collections
|
16
8
|
def images(attributes = {})
|
17
9
|
Fog::Slicehost::Images.new({
|
18
10
|
:connection => self
|
@@ -4,13 +4,7 @@ require 'fog/slicehost/models/server'
|
|
4
4
|
module Fog
|
5
5
|
module Slicehost
|
6
6
|
|
7
|
-
|
8
|
-
def servers
|
9
|
-
Fog::Slicehost::Servers.new(:connection => self)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
class Real
|
7
|
+
module Collections
|
14
8
|
def servers
|
15
9
|
Fog::Slicehost::Servers.new(:connection => self)
|
16
10
|
end
|
data/lib/fog/ssh.rb
CHANGED
@@ -54,7 +54,7 @@ module Fog
|
|
54
54
|
sudoable_command = command.sub(/^sudo/, %{sudo -p 'fog sudo password:'})
|
55
55
|
escaped_command = sudoable_command.sub(/'/, %{'"'"'})
|
56
56
|
channel.request_pty
|
57
|
-
result = Result.new(
|
57
|
+
result = Result.new(escaped_command)
|
58
58
|
channel.exec(%{bash -lc '#{escaped_command}'}) do |channel, success|
|
59
59
|
unless success
|
60
60
|
raise "Could not execute command: #{command.inspect}"
|