fog-core 1.44.3 → 1.45.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5d2d0f2a4c1abf23f1de5b3262514fd535952c1f
4
- data.tar.gz: 9da4fc2f995f4e9ef3a427ed034205aaa045a023
3
+ metadata.gz: 52a37f8e1b168c74d0d23ab2748a5217a99e2686
4
+ data.tar.gz: 97606f8e95a6969a93b597e4018d73a28476a966
5
5
  SHA512:
6
- metadata.gz: 598f0910ce96d1d1d6b0e2554cff115fd149b18f7c3e62ab6419e59f4952feea6c6c01eca051ff470161c90c0bfb9fd9cb1ee787e8e35fec86bd1bf3468b59b0
7
- data.tar.gz: ebd7184fb227d880707992edb5bd00357f1c6cceeb9f6770327d484e4f19f98c71c2a760efe777ba0ce6488b5a4de10034e7d88317375b8bd50b65f0d1b8475a
6
+ metadata.gz: d9f52e3fd097a95f90d8a9419499fd1ce5cb013c1ee2816aafacc150eb9903684eb72db7fe41243fa49fa7be43e2eba8f5d23282b3fa3e4eb8fdc773b7e1c528
7
+ data.tar.gz: 5133413d6aa3dc0004a70448ba63dc7042769cfb8609e8bcab0155ce2df7e02d0fa00c31672f64304029426a73011f8390a4145f07ac008ea04600c83b928845
@@ -23,7 +23,7 @@ matrix:
23
23
  gemfile: Gemfile.1.9.3
24
24
  - rvm: jruby-19mode
25
25
  gemfile: Gemfile.1.9.3
26
- - rvm: 2.1.0
26
+ - rvm: 2.1
27
27
  gemfile: Gemfile
28
28
  env: COVERAGE=true
29
29
  - rvm: jruby-head
data/Gemfile CHANGED
@@ -1,3 +1,2 @@
1
1
  source 'https://rubygems.org'
2
2
  gemspec
3
-
@@ -1,5 +1,8 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- gem "net-ssh", "< 3.0"
4
-
5
3
  gemspec
4
+
5
+ gem 'net-ssh', '< 3.0'
6
+ gem 'rubocop', '~> 0.41.2'
7
+ gem 'term-ansicolor', '~> 1.3.2'
8
+ gem 'tins', '~> 1.6.0'
@@ -1,3 +1,21 @@
1
+ 1.45.0 08/01/2017
2
+ ==========================================================
3
+
4
+ remove xmlrpc requirement/usage
5
+ fix for nested const across ruby versions
6
+ remove array#sample usage for legacy ruby compatibility
7
+ simplify uniq for cache and fix for legacy ruby
8
+ remove debugging puts from cache
9
+ tweak tins version for 1.9
10
+ loosen 2.1.x travis config to 2.1
11
+ add 1.9 compatible term-ansicolor
12
+ fix rubocop for 1.9.3
13
+ enable metadata for cache
14
+ add specs for server#sshable
15
+ add exponential backoff for server#sshable?
16
+ add server#ready? to base server for clarity
17
+ bump excon dependency
18
+
1
19
  1.44.3 05/25/2017
2
20
  ==========================================================
3
21
 
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency("builder")
22
- spec.add_dependency("excon", "~> 0.49")
22
+ spec.add_dependency("excon", "~> 0.58")
23
23
  spec.add_dependency("formatador", "~> 0.2")
24
24
 
25
25
  # https://github.com/fog/fog-core/issues/206
@@ -3,6 +3,8 @@ require "fog/core/model"
3
3
  module Fog
4
4
  module Compute
5
5
  class Server < Fog::Model
6
+ INITIAL_SSHABLE_TIMEOUT = 8
7
+
6
8
  attr_writer :username, :private_key, :private_key_path, :public_key, :public_key_path, :ssh_port, :ssh_options
7
9
  # Sets the proc used to determine the IP Address used for ssh/scp interactions.
8
10
  # @example
@@ -87,10 +89,45 @@ module Fog
87
89
  end
88
90
 
89
91
  def sshable?(options = {})
90
- ready? && !ssh_ip_address.nil? && !!Timeout.timeout(8) { ssh("pwd", options) }
91
- rescue SystemCallError, Net::SSH::AuthenticationFailed, Net::SSH::Disconnect, Timeout::Error
92
+ result = ready? && !ssh_ip_address.nil? && !!Timeout.timeout(sshable_timeout) { ssh("pwd", options) }
93
+ @sshable_timeout = nil
94
+ result
95
+ rescue SystemCallError
96
+ false
97
+ rescue Net::SSH::AuthenticationFailed, Net::SSH::Disconnect
98
+ @sshable_timeout = nil
99
+ false
100
+ rescue Timeout::Error
101
+ increase_sshable_timeout
102
+ false
103
+ end
104
+
105
+ # Is the server ready to receive connections?
106
+ #
107
+ # Returns false by default.
108
+ #
109
+ # Subclasses should implement #ready? appropriately.
110
+ def ready?
92
111
  false
93
112
  end
113
+
114
+ private
115
+
116
+ def sshable_timeout
117
+ @sshable_timeout ||= increase_sshable_timeout
118
+ end
119
+
120
+ def increase_sshable_timeout
121
+ if defined?(@sshable_timeout) && @sshable_timeout
122
+ if @sshable_timeout >= 40
123
+ @sshable_timeout = 60
124
+ else
125
+ @sshable_timeout *= 1.5
126
+ end
127
+ else
128
+ @sshable_timeout = INITIAL_SSHABLE_TIMEOUT
129
+ end
130
+ end
94
131
  end
95
132
  end
96
133
  end
@@ -109,16 +109,21 @@ module Fog
109
109
 
110
110
  raise CacheNotFound if cache_files.empty?
111
111
 
112
- loaded = cache_files.map do |path|
113
- model_klass = Object.const_get(load_cache(path)[:model_klass])
114
- model_klass.new(load_cache(path)[:attrs])
115
- end
112
+ # collection_klass and model_klass should be the same across all instances
113
+ # choose a valid cache record from the dump to use as a sample to deterine
114
+ # which collection/model to instantiate.
115
+ sample_path = cache_files.detect{ |path| valid_for_load?(path) }
116
+ model_klass = const_get_compat(load_cache(sample_path)[:model_klass])
117
+ collection_klass = const_get_compat(load_cache(sample_path)[:collection_klass]) if load_cache(sample_path)[:collection_klass]
116
118
 
117
- collection_klass = load_cache(cache_files.sample)[:collection_klass] &&
118
- Object.const_get(load_cache(cache_files.sample)[:collection_klass])
119
+ # Load the cache data into actual ruby instances
120
+ loaded = cache_files.map do |path|
121
+ model_klass.new(load_cache(path)[:attrs]) if valid_for_load?(path)
122
+ end.compact
119
123
 
124
+ # Set the collection and service so they can be reloaded/connection is set properly.
125
+ # See https://github.com/fog/fog-aws/issues/354#issuecomment-286789702
120
126
  loaded.each do |i|
121
- # See https://github.com/fog/fog-aws/issues/354#issuecomment-286789702
122
127
  i.collection = collection_klass.new(:service => service) if collection_klass
123
128
  i.instance_variable_set(:@service, service)
124
129
  end
@@ -126,7 +131,7 @@ module Fog
126
131
  # uniqe-ify based on the total of attributes. duplicate cache can exist due to
127
132
  # `model#identity` not being unique. but if all attributes match, they are unique
128
133
  # and shouldn't be loaded again.
129
- uniq_loaded = loaded.uniq { |i| i.attributes }
134
+ uniq_loaded = uniq_w_block(loaded) { |i| i.attributes }
130
135
  if uniq_loaded.size != loaded.size
131
136
  Fog::Logger.warning("Found duplicate items in the cache. Expire all & refresh cache soon.")
132
137
  end
@@ -137,6 +142,40 @@ module Fog
137
142
  uniq_loaded
138
143
  end
139
144
 
145
+ # :nodoc: compatability for 1.8.7 1.9.3
146
+ def self.const_get_compat(strklass)
147
+ # https://stackoverflow.com/questions/3163641/get-a-class-by-name-in-ruby
148
+ strklass.split('::').inject(Object) do |mod, class_name|
149
+ mod.const_get(class_name)
150
+ end
151
+ end
152
+
153
+ # :nodoc: compatability for 1.8.7 1.9.3
154
+ def self.uniq_w_block(arr)
155
+ ret, keys = [], []
156
+ arr.each do |x|
157
+ key = block_given? ? yield(x) : x
158
+ unless keys.include? key
159
+ ret << x
160
+ keys << key
161
+ end
162
+ end
163
+ ret
164
+ end
165
+
166
+ # method to determine if a path can be loaded and is valid fog cache format.
167
+ def self.valid_for_load?(path)
168
+ data = load_cache(path)
169
+ if data && data.is_a?(Hash)
170
+ if [:identity, :model_klass, :collection_klass, :attrs].all? { |k| data.keys.include?(k) }
171
+ return true
172
+ else
173
+ Fog::Logger.warning("Found corrupt items in the cache: #{path}. Expire all & refresh cache soon.\n\nData:#{File.read(path)}")
174
+ return false
175
+ end
176
+ end
177
+ end
178
+
140
179
  # creates on-disk cache of this specific +model_klass+ and +@service+
141
180
  def self.create_namespace(model_klass, service)
142
181
  FileUtils.mkdir_p(self.namespace(model_klass, service))
@@ -148,6 +187,12 @@ module Fog
148
187
  FileUtils.rm_rf(namespace(model_klass, service))
149
188
  end
150
189
 
190
+ # cleans the `SANDBOX` - specific any resource cache of any namespace,
191
+ # and any metadata associated to any.
192
+ def self.clean!
193
+ FileUtils.rm_rf(SANDBOX)
194
+ end
195
+
151
196
  # loads yml cache from path on disk, used
152
197
  # to initialize Fog models.
153
198
  def self.load_cache(path)
@@ -164,6 +209,41 @@ module Fog
164
209
  @namespace_prefix
165
210
  end
166
211
 
212
+ # write any metadata - +hash+ information - specific to the namespaced cache in the session.
213
+ #
214
+ # you can retrieve this in other sessions, as long as +namespace_prefix+ is set
215
+ # you can overwrite metadata over time. see test cases as examples.
216
+ def self.write_metadata(h)
217
+ if namespace_prefix.nil?
218
+ raise CacheDir.new("Must set an explicit identifier/name for this cache. Example: 'serviceX-regionY'") unless namespace_prefix
219
+ elsif !h.is_a?(Hash)
220
+ raise CacheDir.new("metadta must be a hash of information like {:foo => 'bar'}")
221
+ end
222
+
223
+ mpath = File.join(SANDBOX, namespace_prefix, "metadata.yml")
224
+ to_write = if File.exist?(mpath)
225
+ YAML.dump(YAML.load(File.read(mpath)).merge!(h))
226
+ else
227
+ YAML.dump(h)
228
+ end
229
+
230
+ mdir = File.join(SANDBOX, namespace_prefix)
231
+ FileUtils.mkdir_p(mdir) if !File.exist?(mdir)
232
+
233
+ File.open(mpath, "w") { |f| f.write(to_write) }
234
+ end
235
+
236
+ # retrive metadata for this +namespace+ of cache. returns empty {} if none found.
237
+ def self.metadata
238
+ mpath = File.join(SANDBOX, namespace_prefix, "metadata.yml")
239
+ if File.exist?(mpath)
240
+ metadata = YAML.load(File.read(mpath))
241
+ return metadata
242
+ else
243
+ return {}
244
+ end
245
+ end
246
+
167
247
  # The path/namespace where the cache is stored for a specific +model_klass+ and +@service+.
168
248
  def self.namespace(model_klass, service)
169
249
 
@@ -204,7 +284,7 @@ module Fog
204
284
  # this means cache duplication is possible.
205
285
  #
206
286
  # see "dumping two models that have duplicate identity" test case.
207
- name = "#{self.class.namespace(model.class, model.service)}/#{model.identity}-#{SecureRandom.hex}.yml"
287
+ "#{self.class.namespace(model.class, model.service)}/#{model.identity}-#{SecureRandom.hex}.yml"
208
288
  end
209
289
  end
210
290
  end
@@ -1,5 +1,5 @@
1
1
  module Fog
2
2
  module Core
3
- VERSION = "1.44.3"
3
+ VERSION = "1.45.0"
4
4
  end
5
5
  end
@@ -0,0 +1,229 @@
1
+ require "spec_helper"
2
+ require "fog/compute/models/server"
3
+
4
+ describe Fog::Compute::Server do
5
+ before do
6
+ @server = Fog::Compute::Server.new
7
+ end
8
+
9
+ describe "#sshable?" do
10
+ describe "when the server is not ready" do
11
+ it "is false" do
12
+ @server.stub(:ready?, false) do
13
+ refute @server.sshable?
14
+ end
15
+ end
16
+ end
17
+
18
+ describe "when the server is ready" do
19
+ describe "when the ssh_ip_address is nil" do
20
+ it "is false" do
21
+ @server.stub(:ready?, true) do
22
+ @server.stub(:ssh_ip_address, nil) do
23
+ refute @server.sshable?
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+
30
+ describe "when the ssh_ip_address exists" do
31
+ # Define these constants which would be imported by net-ssh once loaded
32
+ module Net
33
+ module SSH
34
+ class AuthenticationFailed < RuntimeError
35
+ end
36
+ class Disconnect < RuntimeError
37
+ end
38
+ end
39
+ end
40
+
41
+ describe "and ssh times out" do
42
+ it "is false" do
43
+ @server.stub(:ready?, true) do
44
+ @server.stub(:ssh_ip_address, "10.0.0.1") do
45
+ raises_timeout = lambda { |_time| raise Timeout::Error.new }
46
+ Timeout.stub(:timeout, raises_timeout) do
47
+ refute @server.sshable?
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ describe "and it raises Net::SSH::AuthenticationFailed" do
55
+ it "is false" do
56
+ @server.stub(:ready?, true) do
57
+ @server.stub(:ssh_ip_address, "10.0.0.1") do
58
+ raise_error = lambda { |_cmd, _options| raise Net::SSH::AuthenticationFailed.new }
59
+ @server.stub(:ssh, raise_error) do
60
+ refute @server.sshable?
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ it "resets SSH timeout" do
67
+ @server.instance_variable_set(:@sshable_timeout, 8)
68
+ @server.stub(:ready?, true) do
69
+ @server.stub(:ssh_ip_address, "10.0.0.1") do
70
+ raise_error = lambda { |_cmd, _options| raise Net::SSH::AuthenticationFailed.new }
71
+ @server.stub(:ssh, raise_error) do
72
+ @server.sshable?
73
+ assert_nil @server.instance_variable_get(:@sshable_timeout), nil
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+
80
+ describe "and it raises Net::SSH::Disconnect" do
81
+ it "is false" do
82
+ @server.stub(:ready?, true) do
83
+ @server.stub(:ssh_ip_address, "10.0.0.1") do
84
+ raise_error = lambda { |_cmd, _options| raise Net::SSH::Disconnect.new }
85
+ @server.stub(:ssh, raise_error) do
86
+ refute @server.sshable?
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ it "resets SSH timeout" do
93
+ @server.instance_variable_set(:@sshable_timeout, 8)
94
+ @server.stub(:ready?, true) do
95
+ @server.stub(:ssh_ip_address, "10.0.0.1") do
96
+ raise_error = lambda { |_cmd, _options| raise Net::SSH::Disconnect.new }
97
+ @server.stub(:ssh, raise_error) do
98
+ @server.sshable?
99
+ assert_nil @server.instance_variable_get(:@sshable_timeout), nil
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+
106
+ describe "and it raises SystemCallError" do
107
+ it "is false" do
108
+ @server.stub(:ready?, true) do
109
+ @server.stub(:ssh_ip_address, "10.0.0.1") do
110
+ raise_error = lambda { |_cmd, _options| raise SystemCallError.new("message, 0") }
111
+ @server.stub(:ssh, raise_error) do
112
+ refute @server.sshable?
113
+ end
114
+ end
115
+ end
116
+ end
117
+
118
+ it "does not increase SSH timeout" do
119
+ @server.stub(:ready?, true) do
120
+ @server.stub(:ssh_ip_address, "10.0.0.1") do
121
+ raise_error = lambda { |_cmd, _options| raise SystemCallError.new("message, 0") }
122
+ @server.stub(:ssh, raise_error) do
123
+ @server.sshable?
124
+ assert_equal @server.instance_variable_get(:@sshable_timeout), 8
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+
131
+ describe "and ssh completes within the designated timeout" do
132
+ it "is true" do
133
+ @server.stub(:ready?, true) do
134
+ @server.stub(:ssh_ip_address, "10.0.0.1") do
135
+ @server.stub(:ssh, "datum") do
136
+ assert @server.sshable?
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
142
+
143
+ describe "when called successively" do
144
+ describe "and ssh times out" do
145
+ it "increases the timeout factor by 1.5" do
146
+ @server.stub(:ready?, true) do
147
+ @server.stub(:ssh_ip_address, "10.0.0.1") do
148
+ raises_timeout = lambda do |time|
149
+ assert(time == 8)
150
+ raise Timeout::Error.new
151
+ end
152
+ Timeout.stub(:timeout, raises_timeout) do
153
+ refute @server.sshable?
154
+ end
155
+
156
+ raises_timeout = lambda do |time|
157
+ assert_equal(12, time)
158
+ raise Timeout::Error.new
159
+ end
160
+ Timeout.stub(:timeout, raises_timeout) do
161
+ refute @server.sshable?
162
+ end
163
+ end
164
+ end
165
+ end
166
+
167
+ it "does not increase timeout beyond 60s" do
168
+ @server.stub(:ready?, true) do
169
+ @server.stub(:ssh_ip_address, "10.0.0.1") do
170
+ raises_timeout = lambda { |_time| raise Timeout::Error.new }
171
+ Timeout.stub(:timeout, raises_timeout) do
172
+ 5.times { refute @server.sshable? }
173
+ end
174
+
175
+ raises_timeout = lambda do |time|
176
+ assert_equal(60, time)
177
+ raise Timeout::Error.new
178
+ end
179
+ Timeout.stub(:timeout, raises_timeout) do
180
+ refute @server.sshable?
181
+ end
182
+
183
+ raises_timeout = lambda do |time|
184
+ assert_equal(60, time)
185
+ raise Timeout::Error.new
186
+ end
187
+ Timeout.stub(:timeout, raises_timeout) do
188
+ refute @server.sshable?
189
+ end
190
+ end
191
+ end
192
+ end
193
+
194
+ describe "when ssh eventually succeeds" do
195
+ it "resets the timeout to the initial value" do
196
+ @server.stub(:ready?, true) do
197
+ @server.stub(:ssh_ip_address, "10.0.0.1") do
198
+ raises_timeout = lambda do |time|
199
+ assert(time == 8)
200
+ raise Timeout::Error.new
201
+ end
202
+ Timeout.stub(:timeout, raises_timeout) do
203
+ refute @server.sshable?
204
+ end
205
+
206
+ @server.stub(:ssh, "datum") do
207
+ assert @server.sshable?
208
+ end
209
+
210
+ raises_timeout = lambda do |time|
211
+ assert_equal(8, time)
212
+ raise Timeout::Error.new
213
+ end
214
+ Timeout.stub(:timeout, raises_timeout) do
215
+ refute @server.sshable?
216
+ end
217
+ end
218
+ end
219
+ end
220
+ end
221
+
222
+ end
223
+ end
224
+
225
+ end
226
+ end
227
+
228
+ end
229
+ end
@@ -35,11 +35,61 @@ describe Fog::Cache do
35
35
  example_cache = File.expand_path(Fog::Cache.namespace(Fog::SubFogTestModel, @service)).downcase
36
36
  expected_namespace = File.expand_path("~/.fog-cache/for-service-user-region-foo").downcase
37
37
 
38
- puts example_cache
39
- puts expected_namespace
40
38
  assert_equal example_cache.include?(expected_namespace), true
41
39
  end
42
40
 
41
+ it "has metadata associated to the namespace that you can save to" do
42
+ Fog::Cache.clean!
43
+ Fog::Cache.namespace_prefix = "for-service-user-region-foo"
44
+ # nothing exists, nothing comes back
45
+ assert_equal Fog::Cache.metadata, {}
46
+ # write/read
47
+ Fog::Cache.write_metadata({:last_dumped => "Tuesday, November 8, 2016"})
48
+ assert_equal Fog::Cache.metadata[:last_dumped], "Tuesday, November 8, 2016"
49
+
50
+ # diff namespace, diff metadata
51
+ Fog::Cache.namespace_prefix = "different-namespace"
52
+ assert_nil Fog::Cache.metadata[:last_dumped]
53
+ # still accessible per namespace
54
+ Fog::Cache.namespace_prefix = "for-service-user-region-foo"
55
+ assert_equal Fog::Cache.metadata[:last_dumped], "Tuesday, November 8, 2016"
56
+ # can overwrite
57
+ Fog::Cache.write_metadata({:last_dumped => "Diff date"})
58
+ assert_equal Fog::Cache.metadata[:last_dumped], "Diff date"
59
+
60
+ # can't write a non-hash/data entry.
61
+ assert_raises Fog::Cache::CacheDir do
62
+ Fog::Cache.write_metadata("boo")
63
+ end
64
+
65
+ # namespace must be set as well.
66
+ assert_raises Fog::Cache::CacheDir do
67
+ Fog::Cache.namespace_prefix = nil
68
+ Fog::Cache.write_metadata({:a => "b"})
69
+ end
70
+
71
+ end
72
+
73
+ it "can load cache data from disk" do
74
+ path = File.expand_path("~/.fog-cache-test-#{Time.now.to_i}.yml")
75
+ data = "--- ok\n...\n"
76
+ File.open(path, "w") { |f|
77
+ f.write(data)
78
+ }
79
+
80
+ assert_equal "ok", Fog::Cache.load_cache(path)
81
+ end
82
+
83
+ it "load bad cache data - empty file, from disk" do
84
+ path = File.expand_path("~/.fog-cache-test-2-#{Time.now.to_i}.yml")
85
+ data = ""
86
+ File.open(path, "w") { |f|
87
+ f.write(data)
88
+ }
89
+
90
+ assert_equal false, Fog::Cache.load_cache(path)
91
+ end
92
+
43
93
  it "must have a namespace_prefix configurable" do
44
94
  Fog::Cache.namespace_prefix = nil
45
95
  assert_raises Fog::Cache::CacheDir do
@@ -63,6 +113,24 @@ describe Fog::Cache do
63
113
  end
64
114
  end
65
115
 
116
+ it "Fog cache ignores bad cache data - empty file, from disk" do
117
+ Fog::Cache.expire_cache!(Fog::SubFogTestModel, @service)
118
+ id = SecureRandom.hex
119
+ a = Fog::SubFogTestModel.new(:id => id, :service => @service)
120
+ a.cache.dump
121
+
122
+ # input bad data
123
+ path_dir = File.expand_path(Fog::Cache.namespace(Fog::SubFogTestModel, @service))
124
+ path = File.join(path_dir, "foo.yml")
125
+ data = ""
126
+ File.open(path, "w") { |f|
127
+ f.write(data)
128
+ }
129
+
130
+ assert_equal 1, Fog::Cache.load(Fog::SubFogTestModel, @service).size
131
+ end
132
+
133
+
66
134
  it "can be dumped and reloaded back in" do
67
135
 
68
136
  Fog::Cache.expire_cache!(Fog::SubFogTestModel, @service)
@@ -85,7 +153,7 @@ describe Fog::Cache do
85
153
 
86
154
  id = SecureRandom.hex
87
155
 
88
- # security gruops on aws for eg can have the same identity group name 'default'.
156
+ # security groups on aws for eg can have the same identity group name 'default'.
89
157
  # there are no restrictions on `identity` fog attributes to be uniq.
90
158
  a = Fog::SubFogTestModel.new(:id => id, :service => @service, :bar => 'bar')
91
159
  b = Fog::SubFogTestModel.new(:id => id, :service => @service, :foo => 'foo')
@@ -103,7 +171,7 @@ describe Fog::Cache do
103
171
 
104
172
  id = SecureRandom.hex
105
173
 
106
- # security gruops on aws for eg can have the same identity group name 'default'.
174
+ # security groups on aws for eg can have the same identity group name 'default'.
107
175
  # there are no restrictions on `identity` fog attributes to be uniq.
108
176
  a = Fog::SubFogTestModel.new(:id => id, :service => @service, :bar => 'bar')
109
177
  b = Fog::SubFogTestModel.new(:id => id, :service => @service, :foo => 'foo')
@@ -1,5 +1,4 @@
1
1
  require "spec_helper"
2
- require "xmlrpc/datetime"
3
2
 
4
3
  class Service
5
4
  def single_associations
@@ -114,12 +113,6 @@ describe "Fog::Attributes" do
114
113
  model.merge_attributes(:time => string)
115
114
  assert_equal Time.parse(string), model.time
116
115
  end
117
-
118
- it "returns a Time object when passed a XMLRPC::DateTime object" do
119
- now = XMLRPC::DateTime.new(2000, 7, 8, 10, 20, 34)
120
- model.merge_attributes(:time => now)
121
- assert_equal now.to_time, model.time
122
- end
123
116
  end
124
117
 
125
118
  describe ":type => :boolean" do
@@ -238,7 +231,7 @@ describe "Fog::Attributes" do
238
231
 
239
232
  describe ":default => 'default_value'" do
240
233
  it "should return nil when default is not defined on a new object" do
241
- assert_equal model.bool, nil
234
+ assert_nil model.bool
242
235
  end
243
236
 
244
237
  it "should return the value of the object when default is not defined" do
@@ -266,18 +259,18 @@ describe "Fog::Attributes" do
266
259
 
267
260
  it "should return nil on a persisted object without a value" do
268
261
  model.merge_attributes(:id => "some-crazy-id")
269
- assert_equal model.default, nil
262
+ assert_nil model.default
270
263
  end
271
264
 
272
265
  it "should return nil when an attribute with default value is setted to nil" do
273
266
  model.default = nil
274
- assert_equal model.default, nil
267
+ assert_nil model.default
275
268
  end
276
269
  end
277
270
 
278
271
  describe ".has_one" do
279
272
  it "should create an instance_variable to save the association object" do
280
- assert_equal model.one_object, nil
273
+ assert_nil model.one_object
281
274
  end
282
275
 
283
276
  it "should create a getter to save the association model" do
@@ -299,7 +292,7 @@ describe "Fog::Attributes" do
299
292
 
300
293
  describe ".has_one_identity" do
301
294
  it "should create an instance_variable to save the association identity" do
302
- assert_equal model.one_identity, nil
295
+ assert_nil model.one_identity
303
296
  end
304
297
 
305
298
  it "should create a getter to load the association model" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fog-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.44.3
4
+ version: 1.45.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Light
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-05-25 00:00:00.000000000 Z
12
+ date: 2017-08-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: builder
@@ -31,14 +31,14 @@ dependencies:
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '0.49'
34
+ version: '0.58'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '0.49'
41
+ version: '0.58'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: formatador
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -277,6 +277,7 @@ files:
277
277
  - lib/fog/volume.rb
278
278
  - lib/fog/vpn.rb
279
279
  - lib/tasks/test_task.rb
280
+ - spec/compute/models/server_spec.rb
280
281
  - spec/compute_spec.rb
281
282
  - spec/connection_spec.rb
282
283
  - spec/core/cache_spec.rb
@@ -322,11 +323,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
322
323
  version: '0'
323
324
  requirements: []
324
325
  rubyforge_project:
325
- rubygems_version: 2.6.8
326
+ rubygems_version: 2.6.11
326
327
  signing_key:
327
328
  specification_version: 4
328
329
  summary: Shared classes and tests for fog providers and services.
329
330
  test_files:
331
+ - spec/compute/models/server_spec.rb
330
332
  - spec/compute_spec.rb
331
333
  - spec/connection_spec.rb
332
334
  - spec/core/cache_spec.rb