bbcloud 0.10.1 → 0.11.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/bbcloud.gemspec +2 -2
- data/lib/bbcloud/api.rb +1 -1
- data/lib/bbcloud/cli.rb +8 -2
- data/lib/bbcloud/commands/servers-activate-cloud.rb +23 -0
- data/lib/bbcloud/commands/types-list.rb +1 -1
- data/lib/bbcloud/config.rb +1 -0
- data/lib/bbcloud/servers.rb +4 -0
- data/lib/bbcloud/types.rb +8 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/brightbox.rb +162 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/account.rb +51 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/cloud_ip.rb +47 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/cloud_ips.rb +34 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/flavor.rb +33 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/flavors.rb +28 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/image.rb +56 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/images.rb +28 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/load_balancer.rb +50 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/load_balancers.rb +28 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/server.rb +108 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/servers.rb +29 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/user.rb +39 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/users.rb +29 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/zone.rb +21 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/zones.rb +29 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/activate_console_server.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/add_listeners_load_balancer.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/add_nodes_load_balancer.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_api_client.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_cloud_ip.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_image.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_load_balancer.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_server.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_api_client.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_cloud_ip.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_image.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_load_balancer.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_server.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_account.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_api_client.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_cloud_ip.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_image.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_interface.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_load_balancer.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_server.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_server_type.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_user.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_zone.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_api_clients.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_cloud_ips.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_images.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_load_balancers.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_server_types.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_servers.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_users.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_zones.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/map_cloud_ip.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/remove_listeners_load_balancer.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/remove_nodes_load_balancer.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/reset_ftp_password_account.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/resize_server.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/shutdown_server.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/snapshot_server.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/start_server.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/stop_server.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/unmap_cloud_ip.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_account.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_api_client.rb +21 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_image.rb +21 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_load_balancer.rb +21 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_server.rb +21 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_user.rb +21 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute.rb +43 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/attributes.rb +178 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/collection.rb +127 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/connection.rb +35 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/credentials.rb +92 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/deprecation.rb +23 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/errors.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/hmac.rb +48 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/mock.rb +68 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/model.rb +57 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/parser.rb +99 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/provider.rb +18 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/scp.rb +67 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/service.rb +175 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/ssh.rb +120 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/time.rb +27 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/wait_for.rb +17 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core.rb +32 -0
- data/lib/bbcloud/vendor/fog/lib/fog/providers/brightbox.rb +9 -0
- data/lib/bbcloud/vendor/fog/lib/fog/providers.rb +9 -0
- data/lib/bbcloud/vendor/fog/lib/fog.rb +14 -0
- data/lib/bbcloud/version.rb +1 -1
- metadata +105 -26
@@ -0,0 +1,178 @@
|
|
1
|
+
module Fog
|
2
|
+
module Attributes
|
3
|
+
module ClassMethods
|
4
|
+
|
5
|
+
def _load(marshalled)
|
6
|
+
new(Marshal.load(marshalled))
|
7
|
+
end
|
8
|
+
|
9
|
+
def aliases
|
10
|
+
@aliases ||= {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def attributes
|
14
|
+
@attributes ||= []
|
15
|
+
end
|
16
|
+
|
17
|
+
def attribute(name, options = {})
|
18
|
+
class_eval <<-EOS, __FILE__, __LINE__
|
19
|
+
def #{name}
|
20
|
+
attributes[:#{name}]
|
21
|
+
end
|
22
|
+
EOS
|
23
|
+
case options[:type]
|
24
|
+
when :boolean
|
25
|
+
class_eval <<-EOS, __FILE__, __LINE__
|
26
|
+
def #{name}=(new_#{name})
|
27
|
+
attributes[:#{name}] = case new_#{name}
|
28
|
+
when 'true'
|
29
|
+
true
|
30
|
+
when 'false'
|
31
|
+
false
|
32
|
+
end
|
33
|
+
end
|
34
|
+
EOS
|
35
|
+
when :float
|
36
|
+
class_eval <<-EOS, __FILE__, __LINE__
|
37
|
+
def #{name}=(new_#{name})
|
38
|
+
attributes[:#{name}] = new_#{name}.to_f
|
39
|
+
end
|
40
|
+
EOS
|
41
|
+
when :integer
|
42
|
+
class_eval <<-EOS, __FILE__, __LINE__
|
43
|
+
def #{name}=(new_#{name})
|
44
|
+
attributes[:#{name}] = new_#{name}.to_i
|
45
|
+
end
|
46
|
+
EOS
|
47
|
+
when :string
|
48
|
+
class_eval <<-EOS, __FILE__, __LINE__
|
49
|
+
def #{name}=(new_#{name})
|
50
|
+
attributes[:#{name}] = new_#{name}.to_s
|
51
|
+
end
|
52
|
+
EOS
|
53
|
+
when :time
|
54
|
+
class_eval <<-EOS, __FILE__, __LINE__
|
55
|
+
def #{name}=(new_#{name})
|
56
|
+
attributes[:#{name}] = if new_#{name}.nil? || new_#{name} == "" || new_#{name}.is_a?(Time)
|
57
|
+
new_#{name}
|
58
|
+
else
|
59
|
+
Time.parse(new_#{name})
|
60
|
+
end
|
61
|
+
end
|
62
|
+
EOS
|
63
|
+
when :array
|
64
|
+
class_eval <<-EOS, __FILE__, __LINE__
|
65
|
+
def #{name}=(new_#{name})
|
66
|
+
attributes[:#{name}] = [*new_#{name}]
|
67
|
+
end
|
68
|
+
EOS
|
69
|
+
else
|
70
|
+
if squash = options[:squash]
|
71
|
+
class_eval <<-EOS, __FILE__, __LINE__
|
72
|
+
def #{name}=(new_data)
|
73
|
+
if new_data.is_a?(Hash)
|
74
|
+
if new_data[:#{squash}] || new_data["#{squash}"]
|
75
|
+
attributes[:#{name}] = new_data[:#{squash}] || new_data["#{squash}"]
|
76
|
+
else
|
77
|
+
attributes[:#{name}] = [ new_data ]
|
78
|
+
end
|
79
|
+
else
|
80
|
+
attributes[:#{name}] = new_data
|
81
|
+
end
|
82
|
+
end
|
83
|
+
EOS
|
84
|
+
else
|
85
|
+
class_eval <<-EOS, __FILE__, __LINE__
|
86
|
+
def #{name}=(new_#{name})
|
87
|
+
attributes[:#{name}] = new_#{name}
|
88
|
+
end
|
89
|
+
EOS
|
90
|
+
end
|
91
|
+
end
|
92
|
+
@attributes ||= []
|
93
|
+
@attributes |= [name]
|
94
|
+
for new_alias in [*options[:aliases]]
|
95
|
+
aliases[new_alias] = name
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def identity(name, options = {})
|
100
|
+
@identity = name
|
101
|
+
self.attribute(name, options)
|
102
|
+
end
|
103
|
+
|
104
|
+
def ignore_attributes(*args)
|
105
|
+
@ignored_attributes = args
|
106
|
+
end
|
107
|
+
|
108
|
+
def ignored_attributes
|
109
|
+
@ignored_attributes ||= []
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
module InstanceMethods
|
115
|
+
|
116
|
+
def _dump(level)
|
117
|
+
Marshal.dump(attributes)
|
118
|
+
end
|
119
|
+
|
120
|
+
def attributes
|
121
|
+
@attributes ||= {}
|
122
|
+
end
|
123
|
+
|
124
|
+
def identity
|
125
|
+
send(self.class.instance_variable_get('@identity'))
|
126
|
+
end
|
127
|
+
|
128
|
+
def identity=(new_identity)
|
129
|
+
send("#{self.class.instance_variable_get('@identity')}=", new_identity)
|
130
|
+
end
|
131
|
+
|
132
|
+
def merge_attributes(new_attributes = {})
|
133
|
+
for key, value in new_attributes
|
134
|
+
unless self.class.ignored_attributes.include?(key)
|
135
|
+
if aliased_key = self.class.aliases[key]
|
136
|
+
send("#{aliased_key}=", value)
|
137
|
+
elsif (public_methods | private_methods).detect {|method| ["#{key}=", :"#{key}="].include?(method)}
|
138
|
+
send("#{key}=", value)
|
139
|
+
else
|
140
|
+
attributes[key] = value
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
self
|
145
|
+
end
|
146
|
+
|
147
|
+
def new_record?
|
148
|
+
!identity
|
149
|
+
end
|
150
|
+
|
151
|
+
# check that the attributes specified in args exist and is not nil
|
152
|
+
def requires(*args)
|
153
|
+
missing = []
|
154
|
+
for arg in [:connection] | args
|
155
|
+
missing << arg unless send("#{arg}")
|
156
|
+
end
|
157
|
+
unless missing.empty?
|
158
|
+
if missing.length == 1
|
159
|
+
raise(ArgumentError, "#{missing.first} is required for this operation")
|
160
|
+
else
|
161
|
+
raise(ArgumentError, "#{missing[0...-1].join(", ")} and #{missing[-1]} are required for this operation")
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
private
|
167
|
+
|
168
|
+
def remap_attributes(attributes, mapping)
|
169
|
+
for key, value in mapping
|
170
|
+
if attributes.key?(key)
|
171
|
+
attributes[value] = attributes.delete(key)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
module Fog
|
2
|
+
class Collection < Array
|
3
|
+
|
4
|
+
extend Fog::Attributes::ClassMethods
|
5
|
+
include Fog::Attributes::InstanceMethods
|
6
|
+
|
7
|
+
Array.public_instance_methods(false).each do |method|
|
8
|
+
unless [:reject, :select].include?(method.to_sym)
|
9
|
+
class_eval <<-RUBY
|
10
|
+
def #{method}(*args)
|
11
|
+
unless @loaded
|
12
|
+
lazy_load
|
13
|
+
end
|
14
|
+
super
|
15
|
+
end
|
16
|
+
RUBY
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
%w[reject select].each do |method|
|
21
|
+
class_eval <<-RUBY
|
22
|
+
def #{method}(*args)
|
23
|
+
unless @loaded
|
24
|
+
lazy_load
|
25
|
+
end
|
26
|
+
data = super
|
27
|
+
result = self.clone.clear.concat(data)
|
28
|
+
end
|
29
|
+
RUBY
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.model(new_model=nil)
|
33
|
+
if new_model == nil
|
34
|
+
@model
|
35
|
+
else
|
36
|
+
@model = new_model
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
attr_accessor :connection
|
41
|
+
|
42
|
+
remove_method :clear
|
43
|
+
def clear
|
44
|
+
@loaded = true
|
45
|
+
super
|
46
|
+
end
|
47
|
+
|
48
|
+
def create(attributes = {})
|
49
|
+
object = new(attributes)
|
50
|
+
object.save
|
51
|
+
object
|
52
|
+
end
|
53
|
+
|
54
|
+
def initialize(attributes = {})
|
55
|
+
@loaded = false
|
56
|
+
merge_attributes(attributes)
|
57
|
+
end
|
58
|
+
|
59
|
+
remove_method :inspect
|
60
|
+
def inspect
|
61
|
+
Thread.current[:formatador] ||= Formatador.new
|
62
|
+
data = "#{Thread.current[:formatador].indentation}<#{self.class.name}\n"
|
63
|
+
Thread.current[:formatador].indent do
|
64
|
+
unless self.class.attributes.empty?
|
65
|
+
data << "#{Thread.current[:formatador].indentation}"
|
66
|
+
data << self.class.attributes.map {|attribute| "#{attribute}=#{send(attribute).inspect}"}.join(",\n#{Thread.current[:formatador].indentation}")
|
67
|
+
data << "\n"
|
68
|
+
end
|
69
|
+
data << "#{Thread.current[:formatador].indentation}["
|
70
|
+
unless self.empty?
|
71
|
+
data << "\n"
|
72
|
+
Thread.current[:formatador].indent do
|
73
|
+
data << self.map {|member| member.inspect}.join(",\n")
|
74
|
+
data << "\n"
|
75
|
+
end
|
76
|
+
data << Thread.current[:formatador].indentation
|
77
|
+
end
|
78
|
+
data << "]\n"
|
79
|
+
end
|
80
|
+
data << "#{Thread.current[:formatador].indentation}>"
|
81
|
+
data
|
82
|
+
end
|
83
|
+
|
84
|
+
def load(objects)
|
85
|
+
clear
|
86
|
+
for object in objects
|
87
|
+
self << new(object)
|
88
|
+
end
|
89
|
+
self
|
90
|
+
end
|
91
|
+
|
92
|
+
def model
|
93
|
+
self.class.instance_variable_get('@model')
|
94
|
+
end
|
95
|
+
|
96
|
+
def new(attributes = {})
|
97
|
+
model.new(
|
98
|
+
attributes.merge(
|
99
|
+
:collection => self,
|
100
|
+
:connection => connection
|
101
|
+
)
|
102
|
+
)
|
103
|
+
end
|
104
|
+
|
105
|
+
def reload
|
106
|
+
clear
|
107
|
+
lazy_load
|
108
|
+
self
|
109
|
+
end
|
110
|
+
|
111
|
+
def table(attributes = nil)
|
112
|
+
Formatador.display_table(self.map {|instance| instance.attributes}, attributes)
|
113
|
+
end
|
114
|
+
|
115
|
+
def to_json
|
116
|
+
require 'json'
|
117
|
+
self.map {|member| member.attributes}.to_json
|
118
|
+
end
|
119
|
+
|
120
|
+
private
|
121
|
+
|
122
|
+
def lazy_load
|
123
|
+
self.all
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Fog
|
2
|
+
class Connection
|
3
|
+
|
4
|
+
def initialize(url, persistent=false, params={})
|
5
|
+
@excon = Excon.new(url, params)
|
6
|
+
@persistent = persistent
|
7
|
+
end
|
8
|
+
|
9
|
+
def request(params, &block)
|
10
|
+
unless @persistent
|
11
|
+
reset
|
12
|
+
end
|
13
|
+
unless block_given?
|
14
|
+
if (parser = params.delete(:parser))
|
15
|
+
body = Nokogiri::XML::SAX::PushParser.new(parser)
|
16
|
+
block = lambda { |chunk| body << chunk }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
response = @excon.request(params, &block)
|
21
|
+
|
22
|
+
if parser
|
23
|
+
body.finish
|
24
|
+
response.body = parser.response
|
25
|
+
end
|
26
|
+
|
27
|
+
response
|
28
|
+
end
|
29
|
+
|
30
|
+
def reset
|
31
|
+
@excon.reset
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Fog
|
4
|
+
require 'fog/core/deprecation'
|
5
|
+
|
6
|
+
# Assign a new credential to use from configuration file
|
7
|
+
# @param [String, Symbol] new_credential name of new credential to use
|
8
|
+
# @ return [String, Symbol] name of the new credential
|
9
|
+
def self.credential=(new_credential)
|
10
|
+
@credentials = nil
|
11
|
+
@credential = new_credential
|
12
|
+
end
|
13
|
+
|
14
|
+
# @return [String, Symbol] The credential to use in Fog
|
15
|
+
def self.credential
|
16
|
+
@credential ||= :default
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [String] The path for configuration_file
|
20
|
+
def self.credentials_path
|
21
|
+
@credential_path ||= File.expand_path(ENV["FOG_RC"] || '~/.fog')
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [String] The new path for credentials file
|
25
|
+
def self.credentials_path=(new_credentials_path)
|
26
|
+
@credentials = nil
|
27
|
+
@credential_path = new_credentials_path
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [Hash] The credentials pulled from the configuration file
|
31
|
+
# @raise [LoadError] Configuration unavailable in configuration file
|
32
|
+
def self.credentials
|
33
|
+
@credentials ||= begin
|
34
|
+
if File.exists?(credentials_path)
|
35
|
+
credentials = YAML.load_file(credentials_path)
|
36
|
+
(credentials && credentials[credential]) or raise LoadError.new(missing_credentials)
|
37
|
+
else
|
38
|
+
{}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
# @return [String] The error message that will be raised, if credentials cannot be found
|
46
|
+
def self.missing_credentials
|
47
|
+
<<-YML
|
48
|
+
Missing Credentials
|
49
|
+
|
50
|
+
To run as '#{credential}', add the following to your resource config file: #{credentials_path}
|
51
|
+
An alternate file may be used by placing its path in the FOG_RC environment variable
|
52
|
+
|
53
|
+
#######################################################
|
54
|
+
# Fog Credentials File
|
55
|
+
#
|
56
|
+
# Key-value pairs should look like:
|
57
|
+
# :aws_access_key_id: 022QF06E7MXBSAMPLE
|
58
|
+
:#{credential}:
|
59
|
+
:aws_access_key_id:
|
60
|
+
:aws_secret_access_key:
|
61
|
+
:bluebox_api_key:
|
62
|
+
:bluebox_customer_id:
|
63
|
+
:brightbox_client_id:
|
64
|
+
:brightbox_secret:
|
65
|
+
:go_grid_api_key:
|
66
|
+
:go_grid_shared_secret:
|
67
|
+
:google_storage_access_key_id:
|
68
|
+
:google_storage_secret_access_key:
|
69
|
+
:linode_api_key:
|
70
|
+
:local_root:
|
71
|
+
:new_servers_password:
|
72
|
+
:new_servers_username:
|
73
|
+
:public_key_path:
|
74
|
+
:private_key_path:
|
75
|
+
:rackspace_api_key:
|
76
|
+
:rackspace_username:
|
77
|
+
:slicehost_password:
|
78
|
+
:terremark_username:
|
79
|
+
:terremark_password:
|
80
|
+
:voxel_api_key:
|
81
|
+
:voxel_api_secret:
|
82
|
+
:zerigo_email:
|
83
|
+
:zerigo_token:
|
84
|
+
:dnsimple_email:
|
85
|
+
:dnsimple_password:
|
86
|
+
#
|
87
|
+
# End of Fog Credentials File
|
88
|
+
#######################################################
|
89
|
+
|
90
|
+
YML
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Fog
|
2
|
+
module Deprecation
|
3
|
+
|
4
|
+
def deprecate(older, newer)
|
5
|
+
module_eval <<-EOS, __FILE__, __LINE__
|
6
|
+
def #{older}(*args)
|
7
|
+
Formatador.display_line("[yellow][WARN] #{self} => ##{older} is deprecated, use ##{newer} instead[/] [light_black](#{caller.first})[/]")
|
8
|
+
send(:#{newer}, *args)
|
9
|
+
end
|
10
|
+
EOS
|
11
|
+
end
|
12
|
+
|
13
|
+
def self_deprecate(older, newer)
|
14
|
+
module_eval <<-EOS, __FILE__, __LINE__
|
15
|
+
def self.#{older}(*args)
|
16
|
+
Formatador.display_line("[yellow][WARN] #{self} => ##{older} is deprecated, use ##{newer} instead[/] [light_black](#{caller.first})[/]")
|
17
|
+
send(:#{newer}, *args)
|
18
|
+
end
|
19
|
+
EOS
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Fog
|
2
|
+
module Errors
|
3
|
+
|
4
|
+
class Error < StandardError
|
5
|
+
attr_accessor :verbose
|
6
|
+
|
7
|
+
def self.slurp(error, message = nil)
|
8
|
+
new_error = new(message)
|
9
|
+
new_error.set_backtrace(error.backtrace)
|
10
|
+
new_error.verbose = error.message
|
11
|
+
new_error
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class MockNotImplemented < Fog::Errors::Error; end
|
16
|
+
|
17
|
+
class NotFound < Fog::Errors::Error; end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Fog
|
2
|
+
class HMAC
|
3
|
+
|
4
|
+
def initialize(type, key)
|
5
|
+
@key = key
|
6
|
+
case type
|
7
|
+
when 'sha1'
|
8
|
+
setup_sha1
|
9
|
+
when 'sha256'
|
10
|
+
setup_sha256
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def sign(data)
|
15
|
+
@signer.call(data)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def setup_sha1
|
21
|
+
@digest = OpenSSL::Digest::Digest.new('sha1')
|
22
|
+
@signer = lambda do |data|
|
23
|
+
OpenSSL::HMAC.digest(@digest, @key, data)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def setup_sha256
|
28
|
+
begin
|
29
|
+
@digest = OpenSSL::Digest::Digest.new('sha256')
|
30
|
+
@signer = lambda do |data|
|
31
|
+
OpenSSL::HMAC.digest(@digest, @key, data)
|
32
|
+
end
|
33
|
+
rescue RuntimeError => error
|
34
|
+
unless error.message == 'Unsupported digest algorithm (sha256).'
|
35
|
+
raise error
|
36
|
+
else
|
37
|
+
require 'hmac-sha2'
|
38
|
+
@hmac = ::HMAC::SHA256.new(@key)
|
39
|
+
@signer = lambda do |data|
|
40
|
+
@hmac.update(data)
|
41
|
+
@hmac.digest
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module Fog
|
2
|
+
|
3
|
+
@mocking = false
|
4
|
+
|
5
|
+
def self.mock!
|
6
|
+
@mocking = true
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.mock?
|
10
|
+
@mocking
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.mocking?
|
14
|
+
@mocking
|
15
|
+
end
|
16
|
+
|
17
|
+
module Mock
|
18
|
+
|
19
|
+
@delay = 1
|
20
|
+
def self.delay
|
21
|
+
@delay
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.delay=(new_delay)
|
25
|
+
raise ArgumentError, "delay must be non-negative" unless new_delay >= 0
|
26
|
+
@delay = new_delay
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.not_implemented
|
30
|
+
raise Fog::Errors::MockNotImplemented.new("Contributions welcome!")
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.random_base64(length)
|
34
|
+
random_selection(
|
35
|
+
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
|
36
|
+
length
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.random_hex(length)
|
41
|
+
max = ('f' * length).to_i(16)
|
42
|
+
rand(max).to_s(16).rjust(length, '0')
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.random_letters(length)
|
46
|
+
random_selection(
|
47
|
+
'abcdefghijklmnopqrstuvwxyz',
|
48
|
+
length
|
49
|
+
)
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.random_numbers(length)
|
53
|
+
max = ('9' * length).to_i
|
54
|
+
rand(max).to_s
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.random_selection(characters, length)
|
58
|
+
selection = ''
|
59
|
+
length.times do
|
60
|
+
position = rand(characters.length)
|
61
|
+
selection << characters[position..position]
|
62
|
+
end
|
63
|
+
selection
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Fog
|
2
|
+
class Model
|
3
|
+
|
4
|
+
extend Fog::Attributes::ClassMethods
|
5
|
+
include Fog::Attributes::InstanceMethods
|
6
|
+
|
7
|
+
attr_accessor :collection, :connection
|
8
|
+
|
9
|
+
def initialize(new_attributes = {})
|
10
|
+
merge_attributes(new_attributes)
|
11
|
+
end
|
12
|
+
|
13
|
+
def inspect
|
14
|
+
Thread.current[:formatador] ||= Formatador.new
|
15
|
+
data = "#{Thread.current[:formatador].indentation}<#{self.class.name}"
|
16
|
+
Thread.current[:formatador].indent do
|
17
|
+
unless self.class.attributes.empty?
|
18
|
+
data << "\n#{Thread.current[:formatador].indentation}"
|
19
|
+
data << self.class.attributes.map {|attribute| "#{attribute}=#{send(attribute).inspect}"}.join(",\n#{Thread.current[:formatador].indentation}")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
data << "\n#{Thread.current[:formatador].indentation}>"
|
23
|
+
data
|
24
|
+
end
|
25
|
+
|
26
|
+
def reload
|
27
|
+
requires :identity
|
28
|
+
if data = collection.get(identity)
|
29
|
+
new_attributes = data.attributes
|
30
|
+
merge_attributes(new_attributes)
|
31
|
+
self
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_json
|
36
|
+
require 'json'
|
37
|
+
attributes.to_json
|
38
|
+
end
|
39
|
+
|
40
|
+
def wait_for(timeout=600, interval=1, &block)
|
41
|
+
reload
|
42
|
+
Fog.wait_for(timeout, interval) do
|
43
|
+
retries = 3
|
44
|
+
if reload
|
45
|
+
retries = 3
|
46
|
+
elsif retries > 0
|
47
|
+
retries -= 1
|
48
|
+
sleep(1)
|
49
|
+
elsif retries == 0
|
50
|
+
raise Fog::Errors::Error.new("Reload failed, #{self.class} #{self.identity} went away.")
|
51
|
+
end
|
52
|
+
instance_eval(&block)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|