fog-core 1.24.0 → 1.25.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +5 -13
  2. data/.rubocop.yml +20 -0
  3. data/changelog.md +17 -0
  4. data/fog-core.gemspec +2 -1
  5. data/lib/fog/account.rb +3 -5
  6. data/lib/fog/billing.rb +3 -4
  7. data/lib/fog/cdn.rb +3 -5
  8. data/lib/fog/compute.rb +17 -20
  9. data/lib/fog/compute/models/server.rb +21 -26
  10. data/lib/fog/core.rb +61 -60
  11. data/lib/fog/core/association.rb +15 -0
  12. data/lib/fog/core/associations/default.rb +21 -3
  13. data/lib/fog/core/associations/many_identities.rb +8 -2
  14. data/lib/fog/core/associations/many_models.rb +7 -2
  15. data/lib/fog/core/associations/one_identity.rb +6 -1
  16. data/lib/fog/core/associations/one_model.rb +5 -1
  17. data/lib/fog/core/attributes.rb +41 -44
  18. data/lib/fog/core/attributes/array.rb +5 -1
  19. data/lib/fog/core/attributes/boolean.rb +5 -1
  20. data/lib/fog/core/attributes/default.rb +12 -2
  21. data/lib/fog/core/attributes/float.rb +5 -1
  22. data/lib/fog/core/attributes/integer.rb +5 -1
  23. data/lib/fog/core/attributes/string.rb +5 -1
  24. data/lib/fog/core/attributes/time.rb +5 -1
  25. data/lib/fog/core/attributes/timestamp.rb +5 -1
  26. data/lib/fog/core/collection.rb +22 -27
  27. data/lib/fog/core/connection.rb +5 -6
  28. data/lib/fog/core/credentials.rb +7 -7
  29. data/lib/fog/core/current_machine.rb +10 -8
  30. data/lib/fog/core/deprecated_connection_accessors.rb +0 -1
  31. data/lib/fog/core/deprecation.rb +0 -2
  32. data/lib/fog/core/errors.rb +3 -5
  33. data/lib/fog/core/hmac.rb +4 -6
  34. data/lib/fog/core/logger.rb +10 -11
  35. data/lib/fog/core/mock.rb +19 -25
  36. data/lib/fog/core/model.rb +9 -20
  37. data/lib/fog/core/provider.rb +6 -9
  38. data/lib/fog/core/scp.rb +14 -24
  39. data/lib/fog/core/service.rb +28 -31
  40. data/lib/fog/core/ssh.rb +16 -24
  41. data/lib/fog/core/stringify_keys.rb +7 -9
  42. data/lib/fog/core/time.rb +5 -7
  43. data/lib/fog/core/utils.rb +24 -20
  44. data/lib/fog/core/uuid.rb +2 -3
  45. data/lib/fog/core/version.rb +3 -1
  46. data/lib/fog/core/wait_for.rb +2 -2
  47. data/lib/fog/core/wait_for_defaults.rb +13 -10
  48. data/lib/fog/core/whitelist_keys.rb +1 -1
  49. data/lib/fog/dns.rb +6 -8
  50. data/lib/fog/identity.rb +5 -6
  51. data/lib/fog/image.rb +3 -5
  52. data/lib/fog/metering.rb +3 -6
  53. data/lib/fog/monitoring.rb +3 -5
  54. data/lib/fog/network.rb +4 -6
  55. data/lib/fog/orchestration.rb +3 -5
  56. data/lib/fog/schema/data_validator.rb +17 -22
  57. data/lib/fog/storage.rb +22 -16
  58. data/lib/fog/support.rb +3 -6
  59. data/lib/fog/test_helpers.rb +10 -10
  60. data/lib/fog/test_helpers/collection_helper.rb +23 -43
  61. data/lib/fog/test_helpers/compute/flavors_helper.rb +4 -10
  62. data/lib/fog/test_helpers/compute/server_helper.rb +3 -9
  63. data/lib/fog/test_helpers/compute/servers_helper.rb +0 -4
  64. data/lib/fog/test_helpers/formats_helper.rb +13 -14
  65. data/lib/fog/test_helpers/helper.rb +9 -4
  66. data/lib/fog/test_helpers/mock_helper.rb +92 -94
  67. data/lib/fog/test_helpers/model_helper.rb +7 -15
  68. data/lib/fog/test_helpers/responds_to_helper.rb +1 -3
  69. data/lib/fog/test_helpers/succeeds_helper.rb +1 -3
  70. data/lib/fog/volume.rb +3 -6
  71. data/lib/fog/vpn.rb +3 -5
  72. data/lib/tasks/test_task.rb +2 -6
  73. data/spec/compute_spec.rb +11 -13
  74. data/spec/connection_spec.rb +24 -14
  75. data/spec/credentials_spec.rb +23 -23
  76. data/spec/current_machine_spec.rb +6 -6
  77. data/spec/fake_app/fake_service.rb +18 -0
  78. data/spec/fake_app/models/collection.rb +5 -0
  79. data/spec/fake_app/models/model.rb +2 -0
  80. data/spec/fake_app/requests/request.rb +11 -0
  81. data/spec/fog_attribute_spec.rb +178 -136
  82. data/spec/identity_spec.rb +11 -13
  83. data/spec/mocking_spec.rb +7 -8
  84. data/spec/service_spec.rb +21 -7
  85. data/spec/spec_helper.rb +14 -8
  86. data/spec/storage_spec.rb +25 -13
  87. data/spec/test_helpers/formats_helper_spec.rb +52 -52
  88. data/spec/test_helpers/schema_validator_spec.rb +45 -45
  89. data/spec/timeout_spec.rb +1 -2
  90. data/spec/utils_spec.rb +2 -2
  91. data/spec/uuid_spec.rb +1 -1
  92. data/spec/wait_for_spec.rb +7 -4
  93. metadata +57 -33
@@ -2,7 +2,6 @@ require "fog/core/deprecated_connection_accessors"
2
2
 
3
3
  module Fog
4
4
  class Model
5
-
6
5
  extend Fog::Attributes::ClassMethods
7
6
  include Fog::Attributes::InstanceMethods
8
7
  include Fog::Core::DeprecatedConnectionAccessors
@@ -11,7 +10,7 @@ module Fog
11
10
  attr_reader :service
12
11
 
13
12
  def initialize(new_attributes = {})
14
- # TODO Remove compatibility with old connection option
13
+ # TODO: Remove compatibility with old connection option
15
14
  attribs = new_attributes.clone
16
15
  @service = attribs.delete(:service)
17
16
  if @service.nil? && attribs[:connection]
@@ -27,7 +26,7 @@ module Fog
27
26
  Thread.current[:formatador].indent do
28
27
  unless self.class.attributes.empty?
29
28
  data << "\n#{Thread.current[:formatador].indentation}"
30
- data << self.class.attributes.map {|attribute| "#{attribute}=#{send(attribute).inspect}"}.join(",\n#{Thread.current[:formatador].indentation}")
29
+ data << self.class.attributes.map { |attribute| "#{attribute}=#{send(attribute).inspect}" }.join(",\n#{Thread.current[:formatador].indentation}")
31
30
  end
32
31
  end
33
32
  data << "\n#{Thread.current[:formatador].indentation}>"
@@ -37,30 +36,32 @@ module Fog
37
36
  def reload
38
37
  requires :identity
39
38
 
40
- return unless data = begin
39
+ data = begin
41
40
  collection.get(identity)
42
41
  rescue Excon::Errors::SocketError
43
42
  nil
44
43
  end
45
44
 
45
+ return unless data
46
+
46
47
  new_attributes = data.attributes
47
48
  merge_attributes(new_attributes)
48
49
  self
49
50
  end
50
51
 
51
- def to_json(options = {})
52
+ def to_json(_options = {})
52
53
  Fog::JSON.encode(attributes)
53
54
  end
54
55
 
55
56
  def symbolize_keys(hash)
56
57
  return nil if hash.nil?
57
- hash.inject({}) do |options, (key, value)|
58
+ hash.reduce({}) do |options, (key, value)|
58
59
  options[(key.to_sym rescue key) || key] = value
59
60
  options
60
61
  end
61
62
  end
62
63
 
63
- def wait_for(timeout=Fog.timeout, interval=1, &block)
64
+ def wait_for(timeout = Fog.timeout, interval = 1, &block)
64
65
  reload_has_succeeded = false
65
66
  duration = Fog.wait_for(timeout, interval) do # Note that duration = false if it times out
66
67
  if reload
@@ -73,20 +74,8 @@ module Fog
73
74
  if reload_has_succeeded
74
75
  return duration # false if timeout; otherwise {:duration => elapsed time }
75
76
  else
76
- raise Fog::Errors::Error.new("Reload failed, #{self.class} #{self.identity} not present.")
77
- end
78
- end
79
-
80
- def method_missing(method_name, *args)
81
- if self.class.aliases.include?(method_name)
82
- send(self.class.aliases[method_name])
83
- else
84
- super
77
+ raise Fog::Errors::Error, "Reload failed, #{self.class} #{identity} not present."
85
78
  end
86
79
  end
87
-
88
- def respond_to?(method_name, include_private = false)
89
- super || self.class.aliases.include?(method_name)
90
- end
91
80
  end
92
81
  end
@@ -1,17 +1,15 @@
1
1
  module Fog
2
+ class << self
3
+ attr_writer :providers
4
+ end
2
5
 
3
6
  def self.providers
4
7
  @providers ||= {}
5
8
  end
6
9
 
7
- def self.providers=(new_providers)
8
- @providers = new_providers
9
- end
10
-
11
10
  module Provider
12
-
13
11
  def self.extended(base)
14
- provider = base.to_s.split('::').last
12
+ provider = base.to_s.split("::").last
15
13
  Fog.providers[provider.downcase.to_sym] = provider
16
14
  end
17
15
 
@@ -21,14 +19,13 @@ module Fog
21
19
 
22
20
  def service(new_service, constant_string)
23
21
  Fog.services[new_service] ||= []
24
- Fog.services[new_service] |= [self.to_s.split('::').last.downcase.to_sym]
22
+ Fog.services[new_service] |= [to_s.split("::").last.downcase.to_sym]
25
23
  @services_registry ||= {}
26
- @services_registry[new_service] = [self.to_s, constant_string].join('::')
24
+ @services_registry[new_service] = [to_s, constant_string].join("::")
27
25
  end
28
26
 
29
27
  def services
30
28
  @services_registry.keys
31
29
  end
32
-
33
30
  end
34
31
  end
@@ -1,6 +1,5 @@
1
1
  module Fog
2
2
  module SCP
3
-
4
3
  def self.new(address, username, options = {})
5
4
  if Fog.mocking?
6
5
  Fog::SCP::Mock.new(address, username, options)
@@ -10,7 +9,6 @@ module Fog
10
9
  end
11
10
 
12
11
  class Mock
13
-
14
12
  def self.data
15
13
  @data ||= Hash.new do |hash, key|
16
14
  hash[key] = []
@@ -38,25 +36,23 @@ module Fog
38
36
  :local_path => local_path,
39
37
  :download_options => download_options }
40
38
  end
41
-
42
39
  end
43
40
 
44
41
  class Real
45
-
46
42
  def initialize(address, username, options)
47
- require 'net/scp'
43
+ require "net/scp"
48
44
 
49
45
  key_manager = Net::SSH::Authentication::KeyManager.new(nil, options)
50
46
 
51
47
  unless options[:key_data] || options[:keys] || options[:password] || key_manager.agent
52
- raise ArgumentError.new(':key_data, :keys, :password or a loaded ssh-agent is required to initialize SSH')
48
+ raise ArgumentError, ":key_data, :keys, :password or a loaded ssh-agent is required to initialize SSH"
53
49
  end
54
50
 
55
51
  options[:timeout] = 30
56
52
  if options[:key_data] || options[:keys]
57
53
  options[:keys_only] = true
58
- #Explicitly set these so net-ssh doesn't add the default keys
59
- #as seen at https://github.com/net-ssh/net-ssh/blob/master/lib/net/ssh/authentication/session.rb#L131-146
54
+ # Explicitly set these so net-ssh doesn't add the default keys
55
+ # as seen at https://github.com/net-ssh/net-ssh/blob/master/lib/net/ssh/authentication/session.rb#L131-146
60
56
  options[:keys] = [] unless options[:keys]
61
57
  options[:key_data] = [] unless options[:key_data]
62
58
  end
@@ -67,30 +63,24 @@ module Fog
67
63
  end
68
64
 
69
65
  def upload(local_path, remote_path, upload_options = {}, &block)
70
- begin
71
- Net::SCP.start(@address, @username, @options) do |scp|
72
- scp.upload!(local_path, remote_path, upload_options) do |ch, name, sent, total|
73
- block.call(ch, name, sent, total) if block
74
- end
66
+ Net::SCP.start(@address, @username, @options) do |scp|
67
+ scp.upload!(local_path, remote_path, upload_options) do |ch, name, sent, total|
68
+ block.call(ch, name, sent, total) if block
75
69
  end
76
- rescue Exception => error
77
- raise error
78
70
  end
71
+ rescue Exception => error
72
+ raise error
79
73
  end
80
74
 
81
75
  def download(remote_path, local_path, download_options = {}, &block)
82
- begin
83
- Net::SCP.start(@address, @username, @options) do |scp|
84
- scp.download!(remote_path, local_path, download_options) do |ch, name, sent, total|
85
- block.call(ch, name, sent, total) if block
86
- end
76
+ Net::SCP.start(@address, @username, @options) do |scp|
77
+ scp.download!(remote_path, local_path, download_options) do |ch, name, sent, total|
78
+ block.call(ch, name, sent, total) if block
87
79
  end
88
- rescue Exception => error
89
- raise error
90
80
  end
81
+ rescue Exception => error
82
+ raise error
91
83
  end
92
-
93
84
  end
94
-
95
85
  end
96
86
  end
@@ -11,7 +11,7 @@ module Fog
11
11
 
12
12
  module NoLeakInspector
13
13
  def inspect
14
- "#<#{self.class}:#{self.object_id} #{(self.instance_variables - service.secrets).map {|iv| [iv, self.instance_variable_get(iv).inspect].join('=')}.join(' ')}>"
14
+ "#<#{self.class}:#{object_id} #{(instance_variables - service.secrets).map { |iv| [iv, instance_variable_get(iv).inspect].join("=") }.join(" ")}>"
15
15
  end
16
16
  end
17
17
 
@@ -117,14 +117,12 @@ module Fog
117
117
  end
118
118
 
119
119
  # @deprecated
120
- def fetch_credentials(options)
120
+ def fetch_credentials(_options)
121
121
  # attempt to load credentials from config file
122
- begin
123
- Fog.credentials.reject { |key, value| !(recognized | requirements).include?(key) }
124
- rescue LoadError
125
- # if there are no configured credentials, do nothing
126
- {}
127
- end
122
+ Fog.credentials.reject { |key, _value| !(recognized | requirements).include?(key) }
123
+ rescue LoadError
124
+ # if there are no configured credentials, do nothing
125
+ {}
128
126
  end
129
127
 
130
128
  def setup_requirements
@@ -133,12 +131,13 @@ module Fog
133
131
  end
134
132
 
135
133
  @required ||= false
136
- unless @required
137
- require_models
138
- require_collections_and_define
139
- require_requests_and_mock
140
- @required = true
141
- end
134
+
135
+ return false if @required
136
+
137
+ require_models
138
+ require_collections_and_define
139
+ require_requests_and_mock
140
+ @required = true
142
141
  end
143
142
 
144
143
  # @note This path is used to require model and collection files
@@ -163,13 +162,13 @@ module Fog
163
162
  options[key] = value.to_i
164
163
  else
165
164
  options[key] = case value_string
166
- when 'false'
167
- false
168
- when 'true'
169
- true
170
- else
171
- value
172
- end
165
+ when "false"
166
+ false
167
+ when "true"
168
+ true
169
+ else
170
+ value
171
+ end
173
172
  end
174
173
  end
175
174
  end
@@ -202,7 +201,7 @@ module Fog
202
201
  if args.empty?
203
202
  @secrets ||= []
204
203
  else
205
- args.inject(secrets) do |secrets, secret|
204
+ args.reduce(secrets) do |secrets, secret|
206
205
  secrets << "@#{secret}".to_sym
207
206
  end
208
207
  end
@@ -226,21 +225,19 @@ module Fog
226
225
 
227
226
  def validate_options(options)
228
227
  keys = []
229
- for key, value in options
230
- unless value.nil?
231
- keys << key
232
- end
228
+ options.each_pair do |key, value|
229
+ keys << key unless value.nil?
233
230
  end
234
231
  missing = requirements - keys
235
232
 
236
233
  unless missing.empty?
237
- raise ArgumentError, "Missing required arguments: #{missing.join(', ')}"
234
+ raise ArgumentError, "Missing required arguments: #{missing.join(", ")}"
238
235
  end
239
236
 
240
237
  unless recognizes.empty?
241
238
  unrecognized = options.keys - requirements - recognized
242
239
  unless unrecognized.empty?
243
- Fog::Logger.warning("Unrecognized arguments: #{unrecognized.join(', ')}")
240
+ Fog::Logger.warning("Unrecognized arguments: #{unrecognized.join(", ")}")
244
241
  end
245
242
  end
246
243
  end
@@ -262,7 +259,7 @@ module Fog
262
259
  coerce_options(prepared_settings)
263
260
  end
264
261
 
265
- # This will attempt to require all model files declared by the service using fog's DSL
262
+ # This will attempt to require all model files declared by the service using fog"s DSL
266
263
  def require_models
267
264
  models.each do |model|
268
265
  require File.join(@model_path, model.to_s)
@@ -287,10 +284,10 @@ module Fog
287
284
  # @param [String,Symbol] collection The name of the collection broken with underscores
288
285
  # @return [String] in camel case
289
286
  def camel_case_collection_name(collection)
290
- collection.to_s.split('_').map(&:capitalize).join
287
+ collection.to_s.split("_").map(&:capitalize).join
291
288
  end
292
289
 
293
- # This will attempt to require all request files declared in the service using fog's DSL
290
+ # This will attempt to require all request files declared in the service using fog"s DSL
294
291
  def require_requests_and_mock
295
292
  requests.each do |request|
296
293
  require File.join(@request_path, request.to_s)
@@ -1,8 +1,7 @@
1
- require 'delegate'
1
+ require "delegate"
2
2
 
3
3
  module Fog
4
4
  module SSH
5
-
6
5
  def self.new(address, username, options = {})
7
6
  if Fog.mocking?
8
7
  Fog::SSH::Mock.new(address, username, options)
@@ -12,7 +11,6 @@ module Fog
12
11
  end
13
12
 
14
13
  class Mock
15
-
16
14
  def self.data
17
15
  @data ||= Hash.new do |hash, key|
18
16
  hash[key] = []
@@ -20,7 +18,7 @@ module Fog
20
18
  end
21
19
 
22
20
  def self.reset
23
- @data= nil
21
+ @data = nil
24
22
  end
25
23
 
26
24
  def initialize(address, username, options)
@@ -29,28 +27,26 @@ module Fog
29
27
  @options = options
30
28
  end
31
29
 
32
- def run(commands, &blk)
33
- self.class.data[@address] << {:commands => commands, :username => @username, :options => @options}
30
+ def run(commands, &_blk)
31
+ self.class.data[@address] << { :commands => commands, :username => @username, :options => @options }
34
32
  end
35
-
36
33
  end
37
34
 
38
35
  class Real
39
-
40
36
  def initialize(address, username, options)
41
- require 'net/ssh'
37
+ require "net/ssh"
42
38
 
43
39
  key_manager = Net::SSH::Authentication::KeyManager.new(nil, options)
44
40
 
45
41
  unless options[:key_data] || options[:keys] || options[:password] || key_manager.agent
46
- raise ArgumentError.new(':key_data, :keys, :password or a loaded ssh-agent is required to initialize SSH')
42
+ raise ArgumentError, ":key_data, :keys, :password or a loaded ssh-agent is required to initialize SSH"
47
43
  end
48
44
 
49
45
  options[:timeout] ||= 30
50
46
  if options[:key_data] || options[:keys]
51
47
  options[:keys_only] = true
52
- #Explicitly set these so net-ssh doesn't add the default keys
53
- #as seen at https://github.com/net-ssh/net-ssh/blob/master/lib/net/ssh/authentication/session.rb#L131-146
48
+ # Explicitly set these so net-ssh doesn"t add the default keys
49
+ # as seen at https://github.com/net-ssh/net-ssh/blob/master/lib/net/ssh/authentication/session.rb#L131-146
54
50
  options[:keys] = [] unless options[:keys]
55
51
  options[:key_data] = [] unless options[:key_data]
56
52
  end
@@ -74,22 +70,22 @@ module Fog
74
70
  raise "Could not execute command: #{command.inspect}"
75
71
  end
76
72
 
77
- channel.on_data do |ch, data|
73
+ channel.on_data do |_ch, data|
78
74
  result.stdout << data
79
- yield [data, ''] if blk
75
+ yield [data, ""] if blk
80
76
  end
81
77
 
82
- channel.on_extended_data do |ch, type, data|
78
+ channel.on_extended_data do |_ch, type, data|
83
79
  next unless type == 1
84
80
  result.stderr << data
85
- yield ['', data] if blk
81
+ yield ["", data] if blk
86
82
  end
87
83
 
88
- channel.on_request('exit-status') do |ch, data|
84
+ channel.on_request("exit-status") do |_ch, data|
89
85
  result.status = data.read_long
90
86
  end
91
87
 
92
- channel.on_request('exit-signal') do |ch, data|
88
+ channel.on_request("exit-signal") do |_ch, _data|
93
89
  result.status = 255
94
90
  end
95
91
  end
@@ -105,11 +101,9 @@ module Fog
105
101
  end
106
102
  results
107
103
  end
108
-
109
104
  end
110
105
 
111
106
  class Result
112
-
113
107
  attr_accessor :command, :stderr, :stdout, :status
114
108
 
115
109
  def display_stdout
@@ -127,11 +121,9 @@ module Fog
127
121
 
128
122
  def initialize(command)
129
123
  @command = command
130
- @stderr = ''
131
- @stdout = ''
124
+ @stderr = ""
125
+ @stdout = ""
132
126
  end
133
-
134
127
  end
135
-
136
128
  end
137
129
  end
@@ -1,27 +1,25 @@
1
1
  module Fog
2
2
  module StringifyKeys
3
-
4
3
  # Returns a new hash with all keys converted to strings.
5
4
  def self.stringify(hash)
6
- self.transform_hash(hash) {|hash, key, value|
5
+ transform_hash(hash) do |hash, key, value|
7
6
  hash[key.to_s] = value
8
- }
7
+ end
9
8
  end
10
9
 
11
10
  private
12
11
 
13
12
  # http://devblog.avdi.org/2009/11/20/hash-transforms-in-ruby/
14
- def self.transform_hash(original, options={}, &block)
15
- original.inject({}){|result, (key,value)|
16
- value = if (options[:deep] && Hash === value)
13
+ def self.transform_hash(original, options = {}, &block)
14
+ original.reduce({}) do |result, (key, value)|
15
+ value = if options[:deep] && Hash === value
17
16
  transform_hash(value, options, &block)
18
17
  else
19
18
  value
20
19
  end
21
- block.call(result,key,value)
20
+ block.call(result, key, value)
22
21
  result
23
- }
22
+ end
24
23
  end
25
-
26
24
  end
27
25
  end