docker-api 0.1.0 → 1.0.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.
Files changed (42) hide show
  1. data/README.md +21 -48
  2. data/lib/docker/connection.rb +8 -1
  3. data/lib/docker/container.rb +11 -12
  4. data/lib/docker/error.rb +0 -4
  5. data/lib/docker/image.rb +44 -30
  6. data/lib/docker/model.rb +30 -40
  7. data/lib/docker/version.rb +1 -1
  8. data/spec/docker/connection_spec.rb +3 -2
  9. data/spec/docker/container_spec.rb +206 -377
  10. data/spec/docker/image_spec.rb +123 -237
  11. data/spec/vcr/Docker_Container/_all/when_the_HTTP_response_is_a_200/materializes_each_Container_into_a_Docker_Container.yml +2503 -263
  12. data/spec/vcr/Docker_Container/_attach/{when_the_Container_has_been_created/when_the_HTTP_response_status_is_200 → when_the_HTTP_response_status_is_200}/yields_each_chunk.yml +30 -22
  13. data/spec/vcr/Docker_Container/_changes/{when_the_Container_has_been_created/when_the_HTTP_response_status_is_200 → when_the_HTTP_response_status_is_200}/returns_the_changes_as_an_array.yml +41 -33
  14. data/spec/vcr/Docker_Container/_commit/{when_the_Container_has_been_created/when_the_HTTP_response_status_is_200 → when_the_HTTP_response_status_is_200}/creates_a_new_Image_from_the_Container_s_changes.yml +34 -28
  15. data/spec/vcr/Docker_Container/{_create_ → _create}/when_the_Container_does_not_yet_exist_and_the_body_is_a_Hash/when_the_HTTP_request_returns_a_200/sets_the_id.yml +11 -9
  16. data/spec/vcr/Docker_Container/_export/{when_the_Container_has_been_created/when_the_HTTP_response_status_is_200 → when_the_HTTP_response_status_is_200}/yields_each_chunk.yml +43 -29
  17. data/spec/vcr/Docker_Container/_json/when_the_HTTP_response_status_is_200/returns_the_description_as_a_Hash.yml +63 -0
  18. data/spec/vcr/Docker_Container/_kill/when_the_HTTP_response_status_is_204/kills_the_container.yml +1358 -0
  19. data/spec/vcr/Docker_Container/_restart/{when_the_Container_has_been_created/when_the_HTTP_response_status_is_204 → when_the_HTTP_response_status_is_204}/restarts_the_container.yml +73 -59
  20. data/spec/vcr/Docker_Container/_start/{when_the_Container_has_been_created/when_the_HTTP_response_status_is_200 → when_the_HTTP_response_status_is_200}/starts_the_container.yml +33 -28
  21. data/spec/vcr/Docker_Container/_stop/when_the_HTTP_response_status_is_204/stops_the_container.yml +1387 -0
  22. data/spec/vcr/Docker_Container/_wait/{when_the_Container_has_been_created/when_the_HTTP_response_status_is_200 → when_the_HTTP_response_status_is_200}/waits_for_the_command_to_finish.yml +31 -25
  23. data/spec/vcr/Docker_Image/_all/when_the_HTTP_response_is_a_200/materializes_each_Image_into_a_Docker_Image.yml +6 -6
  24. data/spec/vcr/Docker_Image/_build/with_a_valid_Dockerfile/builds_an_image.yml +4 -4
  25. data/spec/vcr/Docker_Image/_build/with_an_invalid_Dockerfile/throws_a_UnexpectedResponseError.yml +4 -4
  26. data/spec/vcr/Docker_Image/_build_from_dir/with_a_valid_Dockerfile/builds_the_image.yml +14 -14
  27. data/spec/vcr/Docker_Image/_create/when_the_Image_does_not_yet_exist_and_the_body_is_a_Hash/when_the_HTTP_request_returns_a_200/sets_the_id.yml +33 -0
  28. data/spec/vcr/Docker_Image/_history/when_the_HTTP_response_status_is_200/returns_the_history_of_the_Image.yml +63 -0
  29. data/spec/vcr/Docker_Image/_import/when_the_file_does_exist/creates_the_Image.yml +11 -9
  30. data/spec/vcr/Docker_Image/_insert/when_the_HTTP_response_status_is_200/inserts_the_url_s_file_into_a_new_Image.yml +220 -0
  31. data/spec/vcr/Docker_Image/_json/when_the_HTTP_response_status_is_200/returns_additional_information_about_image_image.yml +63 -0
  32. data/spec/vcr/Docker_Image/_remove/when_the_HTTP_response_status_is_204/removes_the_Image.yml +93 -0
  33. data/spec/vcr/Docker_Image/_remove/when_the_Image_has_been_created/when_the_HTTP_response_status_is_204/removes_the_Image.yml +63 -0
  34. data/spec/vcr/Docker_Image/_run/when_the_Image_has_been_created/when_the_argument_is_a_String/splits_the_String_by_spaces_and_creates_a_new_Container.yml +119 -0
  35. data/spec/vcr/Docker_Image/_run/when_the_Image_has_been_created/when_the_argument_is_an_Array/creates_a_new_Container.yml +119 -0
  36. data/spec/vcr/Docker_Image/_run/when_the_argument_is_a_String/splits_the_String_by_spaces_and_creates_a_new_Container.yml +119 -0
  37. data/spec/vcr/Docker_Image/_run/when_the_argument_is_an_Array/creates_a_new_Container.yml +119 -0
  38. data/spec/vcr/Docker_Image/_tag/when_the_HTTP_response_status_is_200/tags_the_image_with_the_repo_name.yml +63 -0
  39. metadata +46 -29
  40. data/spec/vcr/Docker_Container/_json/when_the_Container_has_been_created/when_the_HTTP_response_status_is_200/returns_the_description_as_a_Hash.yml +0 -61
  41. data/spec/vcr/Docker_Container/_kill/when_the_Container_has_been_created/when_the_HTTP_response_status_is_204/kills_the_container.yml +0 -232
  42. data/spec/vcr/Docker_Container/_stop/when_the_Container_has_been_created/when_the_HTTP_response_status_is_204/stops_the_container.yml +0 -259
@@ -1,3 +1,3 @@
1
1
  module Docker
2
- VERSION = "0.1.0"
2
+ VERSION = '1.0.0'
3
3
  end
@@ -45,8 +45,9 @@ describe Docker::Connection do
45
45
  [:get, :put, :post, :delete].each do |method|
46
46
  describe "##{method}" do
47
47
  it 'is delegated to #resource' do
48
- subject.resource.should_receive(method)
49
- subject.public_send(method)
48
+ subject.should_receive(:reset!)
49
+ subject.stub_chain(:resource, :public_send).and_return(:lol)
50
+ subject.public_send(method).should == :lol
50
51
  end
51
52
  end
52
53
  end
@@ -3,501 +3,329 @@ require 'spec_helper'
3
3
  # WARNING if you're re-recording any of these VCRs, you must be running the
4
4
  # Docker daemon and have the base Image pulled.
5
5
  describe Docker::Container do
6
- describe '#initialize' do
7
- subject { described_class }
8
-
9
- context 'with no argument' do
10
- let(:container) { subject.new }
11
-
12
- it 'sets the id to nil' do
13
- container.id.should be_nil
14
- end
15
-
16
- it 'keeps the default Connection' do
17
- container.connection.should == Docker.connection
18
- end
19
- end
20
-
21
- context 'with an argument' do
22
- let(:id) { 'a7c2ee4' }
23
- let(:container) { subject.new(:id => id) }
24
-
25
- it 'sets the id to the argument' do
26
- container.id.should == id
27
- end
28
-
29
- it 'keeps the default Connection' do
30
- container.connection.should == Docker.connection
31
- end
32
- end
33
-
34
- context 'with two arguments' do
35
- context 'when the second argument is not a Docker::Connection' do
36
- let(:id) { 'abc123f' }
37
- let(:connection) { :not_a_connection }
38
- let(:container) { subject.new(:id => id, :connection => connection) }
39
-
40
- it 'raises an error' do
41
- expect { container }.to raise_error(Docker::Error::ArgumentError)
42
- end
43
- end
44
-
45
- context 'when the second argument is a Docker::Connection' do
46
- let(:id) { 'cb3f14a' }
47
- let(:connection) { Docker::Connection.new }
48
- let(:container) { subject.new(:id => id, :connection => connection) }
49
-
50
- it 'initializes the Container' do
51
- container.id.should == id
52
- container.connection.should == connection
53
- end
54
- end
55
- end
56
- end
6
+ subject { described_class.send(:new, :id => rand(10000).to_s) }
57
7
 
58
8
  describe '#to_s' do
59
9
  let(:id) { 'bf119e2' }
60
10
  let(:connection) { Docker::Connection.new }
61
- let(:expected_string) do
11
+ let(:expected_string) {
62
12
  "Docker::Container { :id => #{id}, :connection => #{connection} }"
13
+ }
14
+ before do
15
+ {
16
+ :@id => id,
17
+ :@connection => connection
18
+ }.each { |k, v| subject.instance_variable_set(k, v) }
63
19
  end
64
- subject { described_class.new(:id => id, :connection => connection) }
65
20
 
66
21
  its(:to_s) { should == expected_string }
67
22
  end
68
23
 
69
- describe '#created?' do
70
- context 'when the id is nil' do
71
- its(:created?) { should be_false }
72
- end
73
-
74
- context 'when the id is present' do
75
- subject { described_class.new(:id => 'a732ebf') }
76
-
77
- its(:created?) { should be_true }
78
- end
79
- end
80
-
81
- describe '#create!' do
82
- context 'when the Container has already been created' do
83
- subject { described_class.new(:id => '5e88b2a') }
84
-
85
- it 'raises an error' do
86
- expect { subject.create! }
87
- .to raise_error(Docker::Error::StateError)
88
- end
89
- end
90
-
91
- context 'when the body is not a Hash' do
92
- it 'raises an error' do
93
- expect { subject.create!(:not_a_hash) }
94
- .to raise_error(Docker::Error::ArgumentError)
95
- end
96
- end
97
-
98
- context 'when the Container does not yet exist and the body is a Hash' do
99
- context 'when the HTTP request does not return a 200' do
100
- before { Excon.stub({ :method => :post }, { :status => 400 }) }
101
- after { Excon.stubs.shift }
102
-
103
- it 'raises an error' do
104
- expect { subject.create! }.to raise_error(Docker::Error::ClientError)
105
- end
106
- end
107
-
108
- context 'when the HTTP request returns a 200' do
109
- let(:options) do
110
- {
111
- "Hostname" => "",
112
- "User" => "",
113
- "Memory" => 0,
114
- "MemorySwap" => 0,
115
- "AttachStdin" => false,
116
- "AttachStdout" => false,
117
- "AttachStderr" => false,
118
- "PortSpecs" => nil,
119
- "Tty" => false,
120
- "OpenStdin" => false,
121
- "StdinOnce" => false,
122
- "Env" => nil,
123
- "Cmd" => ["date"],
124
- "Dns" => nil,
125
- "Image" => "base",
126
- "Volumes" => {},
127
- "VolumesFrom" => ""
128
- }
129
- end
130
-
131
- it 'sets the id', :vcr do
132
- expect { subject.create!(options) }
133
- .to change { subject.id }
134
- .from(nil)
135
- end
136
- end
137
- end
138
- end
139
-
140
24
  describe '#json' do
141
- context 'when the Container has not been created' do
25
+ context 'when the HTTP response status is not 200' do
26
+ before { Excon.stub({ :method => :get }, { :status => 500 }) }
27
+ after { Excon.stubs.shift }
28
+
142
29
  it 'raises an error' do
143
- expect { subject.json }.to raise_error Docker::Error::StateError
30
+ expect { subject.json }
31
+ .to raise_error(Docker::Error::ServerError)
144
32
  end
145
33
  end
146
34
 
147
- context 'when the Container has been created' do
148
- context 'when the HTTP response status is not 200' do
149
- before do
150
- subject.stub(:created?).and_return(true)
151
- Excon.stub({ :method => :get }, { :status => 500 })
152
- end
153
- after { Excon.stubs.shift }
154
-
155
- it 'raises an error' do
156
- expect { subject.json }
157
- .to raise_error(Docker::Error::ServerError)
158
- end
159
- end
160
-
161
- context 'when the HTTP response status is 200' do
162
- let(:description) { subject.json }
163
- before { subject.create!('Cmd' => ['ls'], 'Image' => 'base') }
35
+ context 'when the HTTP response status is 200' do
36
+ subject { described_class.create('Cmd' => %w[true], 'Image' => 'base') }
37
+ let(:description) { subject.json }
164
38
 
165
- it 'returns the description as a Hash', :vcr do
166
- description.should be_a(Hash)
167
- description['ID'].should start_with(subject.id)
168
- end
39
+ it 'returns the description as a Hash', :vcr do
40
+ description.should be_a(Hash)
41
+ description['ID'].should start_with(subject.id)
169
42
  end
170
43
  end
171
44
  end
172
45
 
173
46
  describe '#changes' do
174
- context 'when the Container has not been created' do
47
+ context 'when the HTTP response status is not 200' do
48
+ before { Excon.stub({ :method => :get }, { :status => 500 }) }
49
+ after { Excon.stubs.shift }
50
+
175
51
  it 'raises an error' do
176
52
  expect { subject.changes }
177
- .to raise_error Docker::Error::StateError
53
+ .to raise_error(Docker::Error::ServerError)
178
54
  end
179
55
  end
180
56
 
181
- context 'when the Container has been created' do
182
- context 'when the HTTP response status is not 200' do
183
- before do
184
- subject.stub(:created?).and_return(true)
185
- Excon.stub({ :method => :get }, { :status => 500 })
186
- end
187
- after { Excon.stubs.shift }
57
+ context 'when the HTTP response status is 200' do
58
+ subject { described_class.create('Cmd' => %w[true], 'Image' => 'base') }
59
+ let(:changes) { subject.changes }
188
60
 
189
- it 'raises an error' do
190
- expect { subject.changes }
191
- .to raise_error(Docker::Error::ServerError)
192
- end
193
- end
194
-
195
- context 'when the HTTP response status is 200' do
196
- let(:changes) { subject.changes }
197
- before do
198
- subject.create!('Cmd' => ['ls'], 'Image' => 'base')
199
- subject.start
200
- subject.wait
201
- end
61
+ before { subject.tap(&:start).tap(&:wait) }
202
62
 
203
- it 'returns the changes as an array', :vcr do
204
- changes.should be_a Array
205
- changes.should be_all { |change| change.is_a?(Hash) }
206
- changes.length.should_not be_zero
207
- end
63
+ it 'returns the changes as an array', :vcr do
64
+ changes.should be_a Array
65
+ changes.should be_all { |change| change.is_a?(Hash) }
66
+ changes.length.should_not be_zero
208
67
  end
209
68
  end
210
69
  end
211
70
 
212
71
  describe '#export' do
213
- context 'when the Container has not been created' do
72
+ context 'when the HTTP response status is not 200' do
73
+ before { Excon.stub({ :method => :get }, { :status => 500 }) }
74
+ after { Excon.stubs.shift }
75
+
214
76
  it 'raises an error' do
215
77
  expect { subject.export { } }
216
- .to raise_error Docker::Error::StateError
78
+ .to raise_error(Docker::Error::ServerError)
217
79
  end
218
80
  end
219
81
 
220
- context 'when the Container has been created' do
221
- context 'when the HTTP response status is not 200' do
222
- before do
223
- subject.stub(:created?).and_return(true)
224
- Excon.stub({ :method => :get }, { :status => 500 })
225
- end
226
- after { Excon.stubs.shift }
82
+ context 'when the HTTP response status is 200' do
83
+ subject {
84
+ Docker::Container.create('Cmd' => %w[rm -rf / --no-preserve-root],
85
+ 'Image' => 'base')
86
+ }
87
+ before { subject.start }
227
88
 
228
- it 'raises an error' do
229
- expect { subject.export { } }
230
- .to raise_error(Docker::Error::ServerError)
231
- end
232
- end
233
-
234
- context 'when the HTTP response status is 200' do
235
- before do
236
- subject.create!('Cmd' => %w[rm -rf / --no-preserve-root],
237
- 'Image' => 'base')
238
- subject.start
239
- end
240
-
241
- it 'yields each chunk', :vcr do
242
- first = nil
243
- subject.export do |chunk|
244
- first = chunk
245
- break
246
- end
247
- first[257..261].should == "ustar" # Make sure the export is a tar.
89
+ it 'yields each chunk', :vcr do
90
+ first = nil
91
+ subject.export do |chunk|
92
+ first = chunk
93
+ break
248
94
  end
95
+ first[257..261].should == "ustar" # Make sure the export is a tar.
249
96
  end
250
97
  end
251
98
  end
252
99
 
253
100
  describe '#attach' do
254
- context 'when the Container has not been created' do
101
+ context 'when the HTTP response status is not 200' do
102
+ before { Excon.stub({ :method => :post }, { :status => 500 }) }
103
+ after { Excon.stubs.shift }
104
+
255
105
  it 'raises an error' do
256
106
  expect { subject.attach { } }
257
- .to raise_error Docker::Error::StateError
107
+ .to raise_error(Docker::Error::ServerError)
258
108
  end
259
109
  end
260
110
 
261
- context 'when the Container has been created' do
262
- context 'when the HTTP response status is not 200' do
263
- before do
264
- subject.stub(:created?).and_return(true)
265
- Excon.stub({ :method => :post }, { :status => 500 })
266
- end
267
- after { Excon.stubs.shift }
268
-
269
- it 'raises an error' do
270
- expect { subject.attach { } }
271
- .to raise_error(Docker::Error::ServerError)
272
- end
273
- end
274
-
275
- context 'when the HTTP response status is 200' do
276
- before { subject.create!('Cmd' => %w[uname -r], 'Image' => 'base') }
111
+ context 'when the HTTP response status is 200' do
112
+ subject { described_class.create('Cmd' => %w[uname -r],
113
+ 'Image' => 'base') }
277
114
 
278
- it 'yields each chunk', :vcr do
279
- subject.tap(&:start).attach { |chunk|
280
- chunk.should == "3.8.0-25-generic\n"
281
- }
282
- end
115
+ it 'yields each chunk', :vcr do
116
+ subject.tap(&:start).attach { |chunk|
117
+ chunk.should == "3.8.0-25-generic\n"
118
+ }
283
119
  end
284
120
  end
285
121
  end
286
122
 
287
123
  describe '#start' do
288
- context 'when the Container has not been created' do
124
+ context 'when the HTTP response status is not 200' do
125
+ before { Excon.stub({ :method => :post }, { :status => 500 }) }
126
+ after { Excon.stubs.shift }
127
+
289
128
  it 'raises an error' do
290
- expect { subject.start }.to raise_error Docker::Error::StateError
129
+ expect { subject.start }
130
+ .to raise_error(Docker::Error::ServerError)
291
131
  end
292
132
  end
293
133
 
294
- context 'when the Container has been created' do
295
- context 'when the HTTP response status is not 200' do
296
- before do
297
- subject.stub(:created?).and_return(true)
298
- Excon.stub({ :method => :post }, { :status => 500 })
299
- end
300
- after { Excon.stubs.shift }
301
-
302
- it 'raises an error' do
303
- expect { subject.start }
304
- .to raise_error(Docker::Error::ServerError)
305
- end
306
- end
307
-
308
- context 'when the HTTP response status is 200' do
309
- before { subject.create!('Cmd' => ['/usr/bin/sleep 10'],
310
- 'Image' => 'base') }
134
+ context 'when the HTTP response status is 200' do
135
+ subject {
136
+ described_class.create('Cmd' => %w[true], 'Image' => 'base')
137
+ }
311
138
 
312
- it 'starts the container', :vcr do
313
- subject.start
314
- described_class.all.map(&:id).should be_any { |id|
315
- id.start_with?(subject.id)
316
- }
317
- end
139
+ it 'starts the container', :vcr do
140
+ subject.start
141
+ described_class.all.map(&:id).should be_any { |id|
142
+ id.start_with?(subject.id)
143
+ }
318
144
  end
319
145
  end
320
146
  end
321
147
 
322
148
  describe '#stop' do
323
- context 'when the Container has not been created' do
149
+ context 'when the HTTP response status is not 204' do
150
+ before { Excon.stub({ :method => :post }, { :status => 500 }) }
151
+ after { Excon.stubs.shift }
152
+
324
153
  it 'raises an error' do
325
- expect { subject.stop }.to raise_error Docker::Error::StateError
154
+ expect { subject.stop }
155
+ .to raise_error(Docker::Error::ServerError)
326
156
  end
327
157
  end
328
158
 
329
- context 'when the Container has been created' do
330
- context 'when the HTTP response status is not 204' do
331
- before do
332
- subject.stub(:created?).and_return(true)
333
- Excon.stub({ :method => :post }, { :status => 500 })
334
- end
335
- after { Excon.stubs.shift }
336
-
337
- it 'raises an error' do
338
- expect { subject.stop }
339
- .to raise_error(Docker::Error::ServerError)
340
- end
341
- end
342
-
343
- context 'when the HTTP response status is 204' do
344
- before { subject.create!('Cmd' => ['ls'], 'Image' => 'base') }
159
+ context 'when the HTTP response status is 204' do
160
+ subject { described_class.create('Cmd' => %w[ls], 'Image' => 'base') }
345
161
 
346
- it 'stops the container', :vcr do
347
- subject.tap(&:start).stop
348
- described_class.all(:all => true).map(&:id).should be_any { |id|
349
- id.start_with?(subject.id)
350
- }
351
- described_class.all.map(&:id).should be_none { |id|
352
- id.start_with?(subject.id)
353
- }
354
- end
162
+ it 'stops the container', :vcr do
163
+ subject.tap(&:start).stop
164
+ described_class.all(:all => true).map(&:id).should be_any { |id|
165
+ id.start_with?(subject.id)
166
+ }
167
+ described_class.all.map(&:id).should be_none { |id|
168
+ id.start_with?(subject.id)
169
+ }
355
170
  end
356
171
  end
357
172
  end
358
173
 
359
174
  describe '#kill' do
360
- context 'when the Container has not been created' do
175
+ context 'when the HTTP response status is not 204' do
176
+ before { Excon.stub({ :method => :post }, { :status => 500 }) }
177
+ after { Excon.stubs.shift }
178
+
361
179
  it 'raises an error' do
362
- expect { subject.kill }.to raise_error Docker::Error::StateError
180
+ expect { subject.kill }
181
+ .to raise_error(Docker::Error::ServerError)
363
182
  end
364
183
  end
365
184
 
366
- context 'when the Container has been created' do
367
- context 'when the HTTP response status is not 204' do
368
- before do
369
- subject.stub(:created?).and_return(true)
370
- Excon.stub({ :method => :post }, { :status => 500 })
371
- end
372
- after { Excon.stubs.shift }
373
-
374
- it 'raises an error' do
375
- expect { subject.kill }
376
- .to raise_error(Docker::Error::ServerError)
377
- end
378
- end
379
-
380
- context 'when the HTTP response status is 204' do
381
- before { subject.create!('Cmd' => ['ls'], 'Image' => 'base') }
185
+ context 'when the HTTP response status is 204' do
186
+ subject { described_class.create('Cmd' => ['ls'], 'Image' => 'base') }
382
187
 
383
- it 'kills the container', :vcr do
384
- subject.kill
385
- described_class.all.map(&:id).should be_none { |id|
386
- id.start_with?(subject.id)
387
- }
388
- described_class.all(:all => true).map(&:id).should be_any { |id|
389
- id.start_with?(subject.id)
390
- }
391
- end
188
+ it 'kills the container', :vcr do
189
+ subject.kill
190
+ described_class.all.map(&:id).should be_none { |id|
191
+ id.start_with?(subject.id)
192
+ }
193
+ described_class.all(:all => true).map(&:id).should be_any { |id|
194
+ id.start_with?(subject.id)
195
+ }
392
196
  end
393
197
  end
394
198
  end
395
199
 
396
200
  describe '#restart' do
397
- context 'when the Container has not been created' do
201
+ context 'when the HTTP response status is not 204' do
202
+ before { Excon.stub({ :method => :post }, { :status => 500 }) }
203
+ after { Excon.stubs.shift }
204
+
398
205
  it 'raises an error' do
399
- expect { subject.restart }.to raise_error Docker::Error::StateError
206
+ expect { subject.restart }
207
+ .to raise_error(Docker::Error::ServerError)
400
208
  end
401
209
  end
402
210
 
403
- context 'when the Container has been created' do
404
- context 'when the HTTP response status is not 204' do
405
- before do
406
- subject.stub(:created?).and_return(true)
407
- Excon.stub({ :method => :post }, { :status => 500 })
408
- end
409
- after { Excon.stubs.shift }
410
-
411
- it 'raises an error' do
412
- expect { subject.restart }
413
- .to raise_error(Docker::Error::ServerError)
414
- end
415
- end
416
-
417
- context 'when the HTTP response status is 204' do
418
- before { subject.create!('Cmd' => ['/usr/bin/sleep 50'],
419
- 'Image' => 'base') }
211
+ context 'when the HTTP response status is 204' do
212
+ subject {
213
+ described_class.create('Cmd' => %w[/usr/bin/sleep 50],
214
+ 'Image' => 'base')
215
+ }
420
216
 
421
- it 'restarts the container', :vcr do
422
- subject.start
423
- described_class.all.map(&:id).should be_any { |id|
424
- id.start_with?(subject.id)
425
- }
426
- subject.stop
427
- described_class.all.map(&:id).should be_none { |id|
428
- id.start_with?(subject.id)
429
- }
430
- subject.restart
431
- described_class.all.map(&:id).should be_any { |id|
432
- id.start_with?(subject.id)
433
- }
434
- end
217
+ it 'restarts the container', :vcr do
218
+ subject.start
219
+ described_class.all.map(&:id).should be_any { |id|
220
+ id.start_with?(subject.id)
221
+ }
222
+ subject.stop
223
+ described_class.all.map(&:id).should be_none { |id|
224
+ id.start_with?(subject.id)
225
+ }
226
+ subject.restart
227
+ described_class.all.map(&:id).should be_any { |id|
228
+ id.start_with?(subject.id)
229
+ }
435
230
  end
436
231
  end
437
232
  end
438
233
 
439
234
  describe '#wait' do
440
- context 'when the Container has not been created' do
235
+ context 'when the HTTP response status is not 200' do
236
+ before { Excon.stub({ :method => :post }, { :status => 500 }) }
237
+ after { Excon.stubs.shift }
238
+
441
239
  it 'raises an error' do
442
- expect { subject.wait }.to raise_error Docker::Error::StateError
240
+ expect { subject.wait }
241
+ .to raise_error(Docker::Error::ServerError)
443
242
  end
444
243
  end
445
244
 
446
- context 'when the Container has been created' do
447
- context 'when the HTTP response status is not 200' do
448
- before do
449
- subject.stub(:created?).and_return(true)
450
- Excon.stub({ :method => :post }, { :status => 500 })
451
- end
452
- after { Excon.stubs.shift }
245
+ context 'when the HTTP response status is 200' do
246
+ subject {
247
+ described_class.create('Cmd' => %w[tar nonsense],
248
+ 'Image' => 'base') }
453
249
 
454
- it 'raises an error' do
455
- expect { subject.wait }
456
- .to raise_error(Docker::Error::ServerError)
457
- end
250
+ it 'waits for the command to finish', :vcr do
251
+ subject.start
252
+ subject.wait['StatusCode'].should == 64
458
253
  end
254
+ end
255
+ end
459
256
 
460
- context 'when the HTTP response status is 200' do
461
- before { subject.create!('Cmd' => %w[tar nonsense],
462
- 'Image' => 'base') }
257
+ describe '#commit' do
258
+ context 'when the HTTP response status is not 200' do
259
+ before { Excon.stub({ :method => :post }, { :status => 500 }) }
260
+ after { Excon.stubs.shift }
463
261
 
464
- it 'waits for the command to finish', :vcr do
465
- subject.start
466
- subject.wait['StatusCode'].should == 64
467
- end
262
+ it 'raises an error' do
263
+ expect { subject.commit }
264
+ .to raise_error(Docker::Error::ServerError)
265
+ end
266
+ end
267
+
268
+ context 'when the HTTP response status is 200' do
269
+ let(:image) { subject.commit }
270
+ subject { described_class.create('Cmd' => %w[ls], 'Image' => 'base') }
271
+
272
+ before { subject.start }
273
+
274
+ it 'creates a new Image from the Container\'s changes', :vcr do
275
+ image.should be_a Docker::Image
276
+ image.id.should_not be_nil
468
277
  end
469
278
  end
470
279
  end
471
280
 
472
- describe '#commit' do
473
- context 'when the Container has not been created' do
281
+ describe '.create' do
282
+ subject { described_class }
283
+
284
+ context 'when the body is not a Hash' do
474
285
  it 'raises an error' do
475
- expect { subject.commit }.to raise_error Docker::Error::StateError
286
+ expect { subject.create(:not_a_hash) }
287
+ .to raise_error(Docker::Error::ArgumentError)
476
288
  end
477
289
  end
478
290
 
479
- context 'when the Container has been created' do
480
- context 'when the HTTP response status is not 200' do
481
- before do
482
- subject.stub(:id).and_return('abc')
483
- Excon.stub({ :method => :post }, { :status => 500 })
484
- end
291
+ context 'when the Container does not yet exist and the body is a Hash' do
292
+ context 'when the HTTP request does not return a 200' do
293
+ before { Excon.stub({ :method => :post }, { :status => 400 }) }
485
294
  after { Excon.stubs.shift }
486
295
 
487
296
  it 'raises an error' do
488
- expect { subject.commit }
489
- .to raise_error(Docker::Error::ServerError)
297
+ expect { subject.create }.to raise_error(Docker::Error::ClientError)
490
298
  end
491
299
  end
492
300
 
493
- context 'when the HTTP response status is 200' do
494
- let(:image) { subject.commit }
495
- before { subject.create!('Cmd' => %w[ls], 'Image' => 'base') }
301
+ context 'when the HTTP request returns a 200' do
302
+ let(:options) do
303
+ {
304
+ "Hostname" => "",
305
+ "User" => "",
306
+ "Memory" => 0,
307
+ "MemorySwap" => 0,
308
+ "AttachStdin" => false,
309
+ "AttachStdout" => false,
310
+ "AttachStderr" => false,
311
+ "PortSpecs" => nil,
312
+ "Tty" => false,
313
+ "OpenStdin" => false,
314
+ "StdinOnce" => false,
315
+ "Env" => nil,
316
+ "Cmd" => ["date"],
317
+ "Dns" => nil,
318
+ "Image" => "base",
319
+ "Volumes" => {},
320
+ "VolumesFrom" => ""
321
+ }
322
+ end
323
+ let(:container) { subject.create(options) }
496
324
 
497
- it 'creates a new Image from the Container\'s changes', :vcr do
498
- subject.start
499
- image.should be_a Docker::Image
500
- image.id.should_not be_nil
325
+ it 'sets the id', :vcr do
326
+ container.should be_a Docker::Container
327
+ container.id.should_not be_nil
328
+ container.connection.should_not be_nil
501
329
  end
502
330
  end
503
331
  end
@@ -517,8 +345,9 @@ describe Docker::Container do
517
345
  end
518
346
 
519
347
  context 'when the HTTP response is a 200' do
348
+ before { described_class.create('Cmd' => ['ls'], 'Image' => 'base') }
349
+
520
350
  it 'materializes each Container into a Docker::Container', :vcr do
521
- subject.new.create!('Cmd' => ['ls'], 'Image' => 'base')
522
351
  subject.all(:all => true).should be_all { |container|
523
352
  container.is_a?(Docker::Container)
524
353
  }