fog-core 1.44.3 → 1.45.0

Sign up to get free protection for your applications and to get access to all the features.
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