vagrant-proxyconf 1.5.2 → 2.0.1

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.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.travis.yml +11 -14
  4. data/CHANGELOG.md +38 -0
  5. data/Gemfile +28 -7
  6. data/LICENSE.txt +1 -1
  7. data/README.md +147 -18
  8. data/Rakefile +1 -27
  9. data/development/Dockerfile +45 -0
  10. data/development/README.md +2 -0
  11. data/development/Vagrantfile.example +185 -9
  12. data/development/install-c7.sh +46 -0
  13. data/development/install-debian.sh +55 -0
  14. data/development/tinyproxy.conf +333 -0
  15. data/lib/vagrant-proxyconf/action.rb +15 -7
  16. data/lib/vagrant-proxyconf/action/base.rb +47 -5
  17. data/lib/vagrant-proxyconf/action/configure_apt_proxy.rb +17 -0
  18. data/lib/vagrant-proxyconf/action/configure_chef_proxy.rb +32 -27
  19. data/lib/vagrant-proxyconf/action/configure_docker_proxy.rb +132 -14
  20. data/lib/vagrant-proxyconf/action/configure_env_proxy.rb +58 -11
  21. data/lib/vagrant-proxyconf/action/configure_git_proxy.rb +25 -9
  22. data/lib/vagrant-proxyconf/action/configure_npm_proxy.rb +14 -6
  23. data/lib/vagrant-proxyconf/action/configure_pear_proxy.rb +15 -8
  24. data/lib/vagrant-proxyconf/action/configure_svn_proxy.rb +15 -8
  25. data/lib/vagrant-proxyconf/action/configure_yum_proxy.rb +16 -0
  26. data/lib/vagrant-proxyconf/action/is_enabled.rb +18 -1
  27. data/lib/vagrant-proxyconf/cap/linux/chef_proxy_conf.rb +17 -0
  28. data/lib/vagrant-proxyconf/cap/linux/docker_proxy_conf.rb +2 -1
  29. data/lib/vagrant-proxyconf/cap/linux/yum_proxy_conf.rb +19 -0
  30. data/lib/vagrant-proxyconf/cap/util.rb +4 -5
  31. data/lib/vagrant-proxyconf/capability.rb +10 -0
  32. data/lib/vagrant-proxyconf/config.rb +20 -0
  33. data/lib/vagrant-proxyconf/config/chef_proxy.rb +25 -0
  34. data/lib/vagrant-proxyconf/config/docker_proxy.rb +25 -0
  35. data/lib/vagrant-proxyconf/config/git_proxy.rb +3 -0
  36. data/lib/vagrant-proxyconf/config/npm_proxy.rb +25 -0
  37. data/lib/vagrant-proxyconf/config/pear_proxy.rb +19 -0
  38. data/lib/vagrant-proxyconf/version.rb +1 -1
  39. data/locales/en.yml +38 -0
  40. data/resources/yum_config.awk +1 -0
  41. data/spec/spec_helper.rb +27 -9
  42. data/spec/unit/fixtures/docker_client_config_json_enabled_proxy +9 -0
  43. data/spec/unit/fixtures/docker_client_config_json_no_proxy +5 -0
  44. data/spec/unit/fixtures/etc_environment_only_http_proxy.conf +9 -0
  45. data/spec/unit/fixtures/yum_with_repository_and_proxy_containing_special_chars.conf +10 -0
  46. data/spec/unit/vagrant-proxyconf/action/base_spec.rb +191 -0
  47. data/spec/unit/vagrant-proxyconf/action/configure_apt_proxy_spec.rb +162 -0
  48. data/spec/unit/vagrant-proxyconf/action/configure_chef_proxy_spec.rb +32 -0
  49. data/spec/unit/vagrant-proxyconf/action/configure_docker_proxy_spec.rb +491 -0
  50. data/spec/unit/vagrant-proxyconf/action/configure_env_proxy_spec.rb +105 -4
  51. data/spec/unit/vagrant-proxyconf/action/configure_git_proxy_spec.rb +116 -0
  52. data/spec/unit/vagrant-proxyconf/action/configure_npm_proxy_spec.rb +67 -0
  53. data/spec/unit/vagrant-proxyconf/action/configure_pear_proxy_spec.rb +116 -0
  54. data/spec/unit/vagrant-proxyconf/action/configure_svn_proxy_spec.rb +85 -0
  55. data/spec/unit/vagrant-proxyconf/action/configure_yum_proxy_spec.rb +100 -0
  56. data/spec/unit/vagrant-proxyconf/action/is_enabled_spec.rb +162 -12
  57. data/spec/unit/vagrant-proxyconf/cap/linux/docker_proxy_conf_spec.rb +1 -1
  58. data/spec/unit/vagrant-proxyconf/cap/util_spec.rb +2 -2
  59. data/spec/unit/vagrant-proxyconf/config/key_mixin_spec.rb +1 -1
  60. data/spec/unit/vagrant-proxyconf/resources/yum_config_spec.rb +14 -0
  61. data/test/issues/180/.rspec +2 -0
  62. data/test/issues/180/Dockerfile +47 -0
  63. data/test/issues/180/README.md +31 -0
  64. data/test/issues/180/Rakefile +27 -0
  65. data/test/issues/180/Vagrantfile +31 -0
  66. data/test/issues/180/entrypoint.sh +50 -0
  67. data/test/issues/180/spec/default/redhat_spec.rb +15 -0
  68. data/test/issues/180/spec/docker_host/redhat_spec.rb +165 -0
  69. data/test/issues/180/spec/spec_helper.rb +43 -0
  70. data/test/issues/180/tinyproxy.conf +333 -0
  71. data/travis/before_install +26 -0
  72. metadata +44 -4
@@ -7,9 +7,14 @@ describe VagrantPlugins::ProxyConf::Action::ConfigureChefProxy do
7
7
  describe '#configure_chef' do
8
8
  let(:chef) { OpenStruct.new }
9
9
  let(:config) { OpenStruct.new }
10
+ let(:machine) { double('machine') }
11
+
10
12
 
11
13
  def configure_chef
12
14
  action = described_class.new(nil, nil)
15
+ action.instance_variable_set(:@machine, machine)
16
+ config.enabled = true if config.enabled.nil?
17
+ allow(machine).to receive_message_chain(:config, :proxy).and_return(config)
13
18
  allow(action).to receive(:config) { config }
14
19
  action.send(:configure_chef, chef)
15
20
  end
@@ -85,6 +90,33 @@ describe VagrantPlugins::ProxyConf::Action::ConfigureChefProxy do
85
90
  expect(chef.https_proxy).to eq 'http://sslproxy:3128'
86
91
  end
87
92
  end
93
+
94
+ context 'when user wants to disable the configured chef proxy and does not unset the configured proxy variables' do
95
+ before :each do
96
+ config.enabled = false
97
+ config.http = 'http://username:secretpass@my-proxy-host.example.com:8080'
98
+ config.https = 'https://username:secretpass@my-proxy-host.example.com:8080'
99
+ config.no_proxy = 'localhost,*.example.com'
100
+
101
+ configure_chef
102
+ end
103
+
104
+ it 'should unconfigure chef proxy' do
105
+ expect(config.enabled).to eq false
106
+ expect(config.http).to eq 'http://username:secretpass@my-proxy-host.example.com:8080'
107
+ expect(config.https).to eq 'https://username:secretpass@my-proxy-host.example.com:8080'
108
+ expect(config.no_proxy).to eq 'localhost,*.example.com'
109
+
110
+ expect(chef.http_proxy).to be_nil
111
+ expect(chef.http_proxy_user).to be_nil
112
+ expect(chef.http_proxy_pass).to be_nil
113
+ expect(chef.https_proxy).to be_nil
114
+ expect(chef.https_proxy_user).to be_nil
115
+ expect(chef.https_proxy_pass).to be_nil
116
+ expect(chef.no_proxy).to be_nil
117
+ end
118
+ end
119
+
88
120
  end
89
121
 
90
122
  end
@@ -1,10 +1,501 @@
1
1
  require 'spec_helper'
2
+ require 'vagrant-proxyconf/config/proxy'
2
3
  require 'vagrant-proxyconf/action/configure_docker_proxy'
3
4
 
5
+ def mock_write_docker_config(machine)
6
+ allow(machine).to receive_message_chain(:communicate, :sudo).with("rm -f /tmp/vagrant-proxyconf", error_check: false)
7
+ allow(machine).to receive_message_chain(:communicate, :upload)
8
+ allow(machine).to receive_message_chain(:communicate, :sudo).with("touch /etc/default/docker")
9
+ allow(machine).to receive_message_chain(:communicate, :sudo).with("sed -e '/^HTTP_PROXY=/ d\n/^http_proxy=/ d\n/^HTTPS_PROXY=/ d\n/^https_proxy=/ d\n/^NO_PROXY=/ d\n/^no_proxy=/ d\n' /etc/default/docker > /etc/default/docker.new")
10
+ allow(machine).to receive_message_chain(:communicate, :sudo).with("cat /tmp/vagrant-proxyconf >> /etc/default/docker.new")
11
+ allow(machine).to receive_message_chain(:communicate, :test).with("diff /etc/default/docker.new /etc/default/docker")
12
+ allow(machine).to receive_message_chain(:communicate, :sudo).with("chmod 0644 /etc/default/docker.new")
13
+ allow(machine).to receive_message_chain(:communicate, :sudo).with("chown root:root /etc/default/docker.new")
14
+ allow(machine).to receive_message_chain(:communicate, :sudo).with("mv -f /etc/default/docker.new /etc/default/docker")
15
+ allow(machine).to receive_message_chain(:communicate, :sudo).with("kill -HUP `pgrep -f 'docker'` || systemctl restart docker || service docker restart || /etc/init.d/docker restart")
16
+ allow(machine).to receive_message_chain(:communicate, :sudo).with("rm -f /tmp/vagrant-proxyconf /etc/default/docker.new")
17
+ end
18
+
19
+ def mock_update_docker_client_config(machine)
20
+ allow(machine).to receive_message_chain(:communicate, :upload)
21
+ allow(machine).to receive_message_chain(:communicate, :sudo).with("mv /tmp/vagrant-proxyconf-docker-config.json /etc/docker/config.json")
22
+ allow(machine).to receive_message_chain(:communicate, :sudo).with("chown root:root /etc/docker/config.json")
23
+ allow(machine).to receive_message_chain(:communicate, :sudo).with("rm -f /tmp/vagrant-proxyconf-docker-config.json")
24
+ allow(machine).to receive_message_chain(:communicate, :sudo).with("sed -i.bak -e '/^DOCKER_CONFIG/d' /etc/environment")
25
+ allow(machine).to receive_message_chain(:communicate, :sudo).with("echo DOCKER_CONFIG=/etc/docker >> /etc/environment")
26
+ allow(machine).to receive_message_chain(:communicate, :sudo).with("mkdir -p /etc/docker")
27
+ allow(machine).to receive_message_chain(:communicate, :sudo).with("chown root:root /etc/docker")
28
+ end
29
+
30
+
4
31
  describe VagrantPlugins::ProxyConf::Action::ConfigureDockerProxy do
5
32
 
6
33
  describe '#config_name' do
7
34
  subject { described_class.new(double, double).config_name }
8
35
  it { is_expected.to eq 'docker_proxy' }
9
36
  end
37
+
38
+ describe "#configure_machine" do
39
+
40
+ context 'when docker is not supported' do
41
+ let(:app) { OpenStruct.new }
42
+ let(:env) { OpenStruct.new }
43
+ let(:machine) { double('machine') }
44
+
45
+ def configure_docker_proxy
46
+ docker_proxy = described_class.new(app, env)
47
+ docker_proxy.instance_variable_set(:@machine, machine)
48
+
49
+ allow(machine).to receive_message_chain(:guest, :capability?).with(:docker_proxy_conf).and_return(false)
50
+
51
+ @docker_proxy = docker_proxy
52
+ end
53
+
54
+ before :each do
55
+ configure_docker_proxy
56
+ end
57
+
58
+ it 'return nil' do
59
+ expect(@docker_proxy.send(:configure_machine)).to be_nil
60
+ end
61
+ end
62
+
63
+ context "when docker is supported" do
64
+ let(:app) { OpenStruct.new }
65
+ let(:env) { OpenStruct.new }
66
+ let(:machine) { double('machine') }
67
+
68
+ def configure_docker_proxy(fixture)
69
+ docker_proxy = described_class.new(app, env)
70
+ docker_proxy.instance_variable_set(:@machine, machine)
71
+
72
+ # #docker_client_config_path mock
73
+ fixture = docker_proxy.send(:tempfile, load_fixture(fixture)).path
74
+ docker_proxy.instance_variable_set(:@docker_client_config_path, fixture)
75
+
76
+ # #supported? mock
77
+ allow(machine).to receive_message_chain(:guest, :capability?).with(:docker_proxy_conf).and_return(true)
78
+ allow(machine).to receive_message_chain(:guest, :capability).with(:docker_proxy_conf).and_return('/etc/default/docker')
79
+
80
+ # #config mock
81
+ config = create_config_proxy(
82
+ :enabled => true,
83
+ :http => 'http://proxy-server-01.example.com:8080',
84
+ :https => 'https://proxy-server-01.example.com:8080',
85
+ :no_proxy => 'localhost',
86
+ )
87
+
88
+ allow(machine).to receive_message_chain(:config, :proxy).and_return(config)
89
+ allow(machine).to receive_message_chain(:config, :public_send).with(:docker_proxy).and_return(config)
90
+
91
+ mock_write_docker_config(machine)
92
+ mock_update_docker_client_config(machine)
93
+
94
+ # update_docker_client_config mock
95
+ allow(docker_proxy).to receive(:supports_config_json?).and_return(true)
96
+
97
+ @docker_proxy = docker_proxy
98
+ end
99
+
100
+ context 'and when /etc/docker/config.json has proxy configuration' do
101
+ before :each do
102
+ fixture = fixture_file("docker_client_config_json_enabled_proxy")
103
+ configure_docker_proxy(fixture)
104
+ end
105
+
106
+ it 'update /etc/docker/config.json' do
107
+ allow(machine).to receive_message_chain(:communicate, :test).with('command -v systemctl').and_return('')
108
+
109
+ expect(@docker_proxy.send(:configure_machine)).to eq true
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+ describe "#docker_client_config_path" do
116
+ let(:machine) { double('machine') }
117
+
118
+ context "when not supported" do
119
+ subject do
120
+ docker_proxy = described_class.new(nil, nil)
121
+ docker_proxy.instance_variable_set(:@machine, machine)
122
+
123
+ allow(docker_proxy).to receive(:supports_config_json?).and_return(false)
124
+
125
+ # #supported? mock
126
+ allow(machine).to receive_message_chain(:guest, :capability?).with(:docker_proxy_conf).and_return(true)
127
+ allow(machine).to receive_message_chain(:guest, :capability).with(:docker_proxy_conf).and_return('/etc/default/docker')
128
+
129
+ docker_proxy.send(:docker_client_config_path)
130
+ end
131
+
132
+ it { is_expected.to eq nil }
133
+ end
134
+
135
+ context "when supported" do
136
+ context "when /etc/docker/config.json exists" do
137
+ subject do
138
+ docker_proxy = described_class.new(nil, nil)
139
+ docker_proxy.instance_variable_set(:@machine, machine)
140
+ docker_proxy.instance_variable_set(:@docker_client_config_path, nil)
141
+
142
+ allow(docker_proxy).to receive(:supports_config_json?).and_return(true)
143
+
144
+ allow(machine).to receive_message_chain(:communicate, :test).with("[ -f /etc/docker/config.json ]").and_return(true)
145
+ allow(machine).to receive_message_chain(:communicate, :sudo).with("chmod 0644 /etc/docker/config.json")
146
+ allow(machine).to receive_message_chain(:communicate, :download)
147
+
148
+ docker_proxy.send(:docker_client_config_path)
149
+ end
150
+
151
+ it { expect(File.exists?(subject)).to eq true }
152
+ end
153
+
154
+ context "when /etc/docker/config.json does not exist" do
155
+ subject do
156
+ docker_proxy = described_class.new(nil, nil)
157
+ docker_proxy.instance_variable_set(:@machine, machine)
158
+ docker_proxy.instance_variable_set(:@docker_client_config_path, nil)
159
+
160
+ allow(docker_proxy).to receive(:supports_config_json?).and_return(true)
161
+
162
+ allow(machine).to receive_message_chain(:communicate, :test).with("[ -f /etc/docker/config.json ]").and_return(false)
163
+
164
+ docker_proxy.send(:docker_client_config_path)
165
+ end
166
+
167
+ it do
168
+ expect(File.exists?(subject)).to eq true
169
+ expect(File.read(subject)).to eq "{}"
170
+ end
171
+ end
172
+ end
173
+ end
174
+
175
+ describe "#update_docker_client_config" do
176
+ let(:app) { OpenStruct.new }
177
+ let(:env) { OpenStruct.new }
178
+ let(:machine) { double('machine') }
179
+
180
+ context "when #supports_config_json? returns false" do
181
+
182
+ it 'return nil' do
183
+ docker_proxy = described_class.new(app, env)
184
+ docker_proxy.instance_variable_set(:@machine, machine)
185
+
186
+ allow(docker_proxy).to receive(:supports_config_json?).and_return(false)
187
+
188
+ # #supported? mock
189
+ allow(machine).to receive_message_chain(:guest, :capability?).with(:docker_proxy_conf).and_return(true)
190
+ allow(machine).to receive_message_chain(:guest, :capability).with(:docker_proxy_conf).and_return('/etc/default/docker')
191
+
192
+ expect(docker_proxy.send(:update_docker_client_config)).to eq nil
193
+ end
194
+
195
+ end
196
+
197
+ context "when #docker_client_config_path returns nil" do
198
+ it 'return nil' do
199
+ docker_proxy = described_class.new(app, env)
200
+ docker_proxy.instance_variable_set(:@machine, machine)
201
+
202
+ # mock a result that looks like no proxy is configured for the config.json
203
+ allow(docker_proxy).to receive(:supports_config_json?).and_return(true)
204
+ allow(docker_proxy).to receive(:docker_client_config_path).and_return(nil)
205
+
206
+ # #supported? mock
207
+ allow(machine).to receive_message_chain(:guest, :capability?).with(:docker_proxy_conf).and_return(true)
208
+ allow(machine).to receive_message_chain(:guest, :capability).with(:docker_proxy_conf).and_return('/etc/default/docker')
209
+
210
+ expect(docker_proxy.send(:update_docker_client_config)).to eq nil
211
+ end
212
+ end
213
+
214
+ context "when /etc/docker/config.json is supported" do
215
+
216
+ context "when configuration is disabled" do
217
+ it do
218
+ docker_proxy = described_class.new(app, env)
219
+ docker_proxy.instance_variable_set(:@machine, machine)
220
+
221
+ # mock a result that looks like proxy is configured for the config.json
222
+ fixture = fixture_file("docker_client_config_json_enabled_proxy")
223
+ fixture_content = load_fixture(fixture)
224
+ config_path = docker_proxy.send(:tempfile, fixture_content).path
225
+
226
+ docker_proxy.instance_variable_set(:@docker_client_config_path, config_path)
227
+
228
+ allow(docker_proxy).to receive(:supports_config_json?).and_return(true)
229
+ allow(docker_proxy).to receive(:disabled?).and_return(true)
230
+
231
+ mock_update_docker_client_config(machine)
232
+
233
+ expected = JSON.pretty_generate(
234
+ {
235
+ "proxies" => {
236
+ "default" => Hash.new
237
+ }
238
+ }
239
+ )
240
+ expect(docker_proxy.send(:update_docker_client_config)).to eq expected
241
+ end
242
+ end
243
+
244
+ context "when configuration is enabled" do
245
+ it do
246
+ docker_proxy = described_class.new(app, env)
247
+ docker_proxy.instance_variable_set(:@machine, machine)
248
+
249
+ # simulate config
250
+ config = create_config_proxy(
251
+ :enabled => true,
252
+ :http => 'http://proxy-server-01.example.com:8080',
253
+ :https => 'https://proxy-server-01.example.com:8080',
254
+ :no_proxy => 'localhost',
255
+ )
256
+
257
+ allow(machine).to receive_message_chain(:config, :proxy).and_return(config)
258
+ allow(machine).to receive_message_chain(:config, :public_send).with(:docker_proxy).and_return(config)
259
+
260
+ # mock a result that looks like no proxy is configured for the config.json
261
+ fixture = fixture_file("docker_client_config_json_no_proxy")
262
+ fixture_content = load_fixture(fixture)
263
+ config_path = docker_proxy.send(:tempfile, fixture_content).path
264
+
265
+ docker_proxy.instance_variable_set(:@docker_client_config_path, config_path)
266
+
267
+ allow(docker_proxy).to receive(:supports_config_json?).and_return(true)
268
+ allow(docker_proxy).to receive(:disabled?).and_return(false)
269
+
270
+ mock_update_docker_client_config(machine)
271
+ expected = JSON.pretty_generate(
272
+ {
273
+ "proxies" => {
274
+ "default" => {
275
+ "httpProxy" => "http://proxy-server-01.example.com:8080",
276
+ "httpsProxy" => "https://proxy-server-01.example.com:8080",
277
+ "noProxy" => "localhost",
278
+ }
279
+ }
280
+ }
281
+ )
282
+
283
+ expect(docker_proxy.send(:update_docker_client_config)).to eq expected
284
+ end
285
+ end
286
+ end
287
+ end
288
+
289
+ describe "#unconfigure_machine" do
290
+
291
+ context "when not supported" do
292
+ let(:app) { OpenStruct.new }
293
+ let(:env) { OpenStruct.new }
294
+ let(:machine) { double('machine') }
295
+
296
+ subject do
297
+ docker_proxy = described_class.new(app, env)
298
+ docker_proxy.instance_variable_set(:@machine, machine)
299
+
300
+ allow(machine).to receive_message_chain(:guest, :capability?).with(:docker_proxy_conf).and_return(false)
301
+ allow(machine).to receive_message_chain(:guest, :capability).with(:docker_proxy_conf).and_return(nil)
302
+
303
+ docker_proxy.send(:unconfigure_machine)
304
+ end
305
+
306
+ it 'return nil' do
307
+ is_expected.to eq nil
308
+ end
309
+ end
310
+
311
+ context "when supported" do
312
+ context "when config is enabled" do
313
+ let(:app) { OpenStruct.new }
314
+ let(:env) { OpenStruct.new }
315
+ let(:machine) { double('machine') }
316
+
317
+ subject do
318
+ docker_proxy = described_class.new(app, env)
319
+ docker_proxy.instance_variable_set(:@machine, machine)
320
+ docker_proxy.instance_variable_set(:@version, [18, 9, 0])
321
+
322
+ fixture = fixture_file("docker_client_config_json_enabled_proxy")
323
+ config_path = docker_proxy.send(:tempfile, load_fixture(fixture)).path
324
+ docker_proxy.instance_variable_set(:@docker_client_config_path, config_path)
325
+
326
+ allow(machine).to receive_message_chain(:guest, :capability?).with(:docker_proxy_conf).and_return(true)
327
+ allow(machine).to receive_message_chain(:guest, :capability).with(:docker_proxy_conf).and_return('/etc/default/docker')
328
+
329
+ # #config mock
330
+ allow(machine).to receive_message_chain(:config, :proxy, :enabled).and_return(true)
331
+ config = create_config_proxy(
332
+ :enabled => true,
333
+ :http => 'http://proxy-server-01.example.com:8080',
334
+ :https => 'https://proxy-server-01.example.com:8080',
335
+ :no_proxy => 'localhost',
336
+ )
337
+ allow(machine).to receive_message_chain(:config, :proxy).and_return(config)
338
+ allow(machine).to receive_message_chain(:config, :public_send).with(:docker_proxy).and_return(config)
339
+
340
+ # mock write_docker_config
341
+ mock_write_docker_config(machine)
342
+
343
+ # mock update_docker_client_config
344
+ mock_update_docker_client_config(machine)
345
+
346
+ docker_proxy.send(:unconfigure_machine)
347
+ end
348
+
349
+ it 'return true' do
350
+ is_expected.to eq true
351
+ end
352
+ end
353
+
354
+ context "when config is disabled" do
355
+ let(:app) { OpenStruct.new }
356
+ let(:env) { OpenStruct.new }
357
+ let(:machine) { double('machine') }
358
+
359
+ subject do
360
+ docker_proxy = described_class.new(app, env)
361
+ docker_proxy.instance_variable_set(:@machine, machine)
362
+ docker_proxy.instance_variable_set(:@version, [18, 9, 0])
363
+
364
+ fixture = fixture_file("docker_client_config_json_enabled_proxy")
365
+ config_path = docker_proxy.send(:tempfile, load_fixture(fixture)).path
366
+ docker_proxy.instance_variable_set(:@docker_client_config_path, config_path)
367
+
368
+ allow(machine).to receive_message_chain(:guest, :capability?).with(:docker_proxy_conf).and_return(true)
369
+ allow(machine).to receive_message_chain(:guest, :capability).with(:docker_proxy_conf).and_return('/etc/default/docker')
370
+
371
+ # #config mock
372
+ allow(machine).to receive_message_chain(:config, :proxy, :enabled?).and_return(false)
373
+ config = create_config_proxy(
374
+ :enabled => false,
375
+ :http => 'http://proxy-server-01.example.com:8080',
376
+ :https => 'https://proxy-server-01.example.com:8080',
377
+ :no_proxy => 'localhost',
378
+ )
379
+ allow(machine).to receive_message_chain(:config, :proxy).and_return(config)
380
+ allow(machine).to receive_message_chain(:config, :public_send).with(:docker_proxy).and_return(config)
381
+
382
+ allow(docker_proxy).to receive(:disabled?).and_return(true)
383
+
384
+ mock_write_docker_config(machine)
385
+ mock_update_docker_client_config(machine)
386
+
387
+ docker_proxy.send(:unconfigure_machine)
388
+ end
389
+
390
+ it 'should disable proxy configuration' do
391
+ is_expected.to eq true
392
+ end
393
+ end
394
+
395
+ end
396
+ end
397
+
398
+ describe "#docker_version" do
399
+ let(:machine) { double('machine') }
400
+
401
+ context "when not supported" do
402
+ subject do
403
+ docker_proxy = described_class.new(nil, nil)
404
+ docker_proxy.instance_variable_set(:@machine, machine)
405
+
406
+ # #supported? mock
407
+ allow(machine).to receive_message_chain(:guest, :capability?).with(:docker_proxy_conf).and_return(false)
408
+ allow(machine).to receive_message_chain(:guest, :capability).with(:docker_proxy_conf).and_return(nil)
409
+
410
+ docker_proxy.send(:docker_version)
411
+ end
412
+
413
+ it { is_expected.to eq nil }
414
+ end
415
+
416
+ context "when supported parse" do
417
+ subject do
418
+ docker_proxy = described_class.new(nil, nil)
419
+ docker_proxy.instance_variable_set(:@machine, machine)
420
+
421
+ # #supported? mock
422
+ allow(machine).to receive_message_chain(:guest, :capability?).with(:docker_proxy_conf).and_return(true)
423
+ allow(machine).to receive_message_chain(:guest, :capability).with(:docker_proxy_conf).and_return("/etc/default/docker")
424
+
425
+ allow(machine).to receive_message_chain(:communicate, :execute).with('docker --version').and_yield(@type, @version)
426
+
427
+ docker_proxy.send(:docker_version)
428
+ end
429
+
430
+ context '"Docker version 17.05.0-ce, build 89658be"' do
431
+ it do
432
+ @type = :stdout
433
+ @version = "Docker version 17.05.0-ce, build 89658be"
434
+
435
+ is_expected.to eq [17, 5, 0]
436
+ end
437
+ end
438
+
439
+ context '"Docker version 18.09.0, build 4d60db4"' do
440
+ it do
441
+ @type = :stdout
442
+ @version = "Docker version 18.09.0, build 4d60db4"
443
+
444
+ is_expected.to eq [18, 9, 0]
445
+ end
446
+ end
447
+ end
448
+ end
449
+
450
+ describe "#supports_config_json?" do
451
+ let(:machine) { double('machine') }
452
+
453
+ context "when not supported" do
454
+ subject do
455
+ docker_proxy = described_class.new(nil, nil)
456
+ docker_proxy.instance_variable_set(:@machine, machine)
457
+
458
+ # #supported? mock
459
+ allow(machine).to receive_message_chain(:guest, :capability?).with(:docker_proxy_conf).and_return(false)
460
+ allow(machine).to receive_message_chain(:guest, :capability).with(:docker_proxy_conf).and_return(nil)
461
+
462
+ docker_proxy.send(:supports_config_json?)
463
+ end
464
+
465
+ it 'returns false' do
466
+ is_expected.to eq false
467
+ end
468
+ end
469
+
470
+ context "when supported" do
471
+ subject do
472
+ docker_proxy = described_class.new(nil, nil)
473
+ docker_proxy.instance_variable_set(:@machine, machine)
474
+ docker_proxy.instance_variable_set(:@version, @version)
475
+
476
+ # #supported? mock
477
+ allow(machine).to receive_message_chain(:guest, :capability?).with(:docker_proxy_conf).and_return(true)
478
+ allow(machine).to receive_message_chain(:guest, :capability).with(:docker_proxy_conf).and_return("/etc/defualt/docker")
479
+
480
+ docker_proxy.send(:supports_config_json?)
481
+ end
482
+
483
+ it 'given docker_version is 18.09.1, return true' do
484
+ @version = [18, 9, 1]
485
+ is_expected.to eq true
486
+ end
487
+
488
+ it 'given docker_version is 17.07, return true' do
489
+ @version = [17, 7, 0]
490
+ is_expected.to eq true
491
+ end
492
+
493
+ it 'given docker_version is 17.06, return false' do
494
+ @version = [17, 6, 0]
495
+ is_expected.to eq false
496
+ end
497
+ end
498
+
499
+ end
500
+
10
501
  end