docker-api 1.27.0 → 2.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.
- checksums.yaml +5 -5
- data/README.md +110 -10
- data/lib/docker.rb +7 -14
- data/lib/docker/connection.rb +3 -3
- data/lib/docker/container.rb +103 -45
- data/lib/docker/event.rb +100 -14
- data/lib/docker/exec.rb +6 -6
- data/lib/docker/image.rb +32 -11
- data/lib/docker/network.rb +16 -12
- data/lib/docker/util.rb +56 -16
- data/lib/docker/version.rb +1 -4
- data/lib/docker/volume.rb +8 -4
- metadata +16 -66
- data/.cane +0 -2
- data/.gitignore +0 -6
- data/.rspec +0 -1
- data/.simplecov +0 -4
- data/.travis.yml +0 -25
- data/Dockerfile +0 -2
- data/Gemfile +0 -3
- data/Rakefile +0 -54
- data/TESTING.md +0 -49
- data/docker-api.gemspec +0 -28
- data/script/docker +0 -149
- data/script/docker.conf +0 -61
- data/script/install_docker.sh +0 -35
- data/spec/docker/connection_spec.rb +0 -123
- data/spec/docker/container_spec.rb +0 -801
- data/spec/docker/event_spec.rb +0 -89
- data/spec/docker/exec_spec.rb +0 -181
- data/spec/docker/image_spec.rb +0 -683
- data/spec/docker/messages_spec.rb +0 -97
- data/spec/docker/messages_stack.rb +0 -26
- data/spec/docker/network_spec.rb +0 -150
- data/spec/docker/util_spec.rb +0 -154
- data/spec/docker/volume_spec.rb +0 -46
- data/spec/docker_spec.rb +0 -258
- data/spec/fixtures/build_from_dir/Dockerfile +0 -2
- data/spec/fixtures/export.tar +0 -0
- data/spec/fixtures/load.tar +0 -0
- data/spec/fixtures/top/Dockerfile +0 -2
- data/spec/spec_helper.rb +0 -36
@@ -1,97 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Docker::Messages do
|
4
|
-
shared_examples_for "two equal messages" do
|
5
|
-
it "has the same messages as we expect" do
|
6
|
-
expect(messages.all_messages).to eq(expected.all_messages)
|
7
|
-
expect(messages.stdout_messages).to eq(expected.stdout_messages)
|
8
|
-
expect(messages.stderr_messages).to eq(expected.stderr_messages)
|
9
|
-
expect(messages.buffer).to eq(expected.buffer)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
describe '.decipher_messages' do
|
14
|
-
shared_examples_for "decipher_messages of raw_test" do
|
15
|
-
let(:messages) {
|
16
|
-
subject.decipher_messages(raw_text)
|
17
|
-
}
|
18
|
-
|
19
|
-
it_behaves_like "two equal messages"
|
20
|
-
end
|
21
|
-
|
22
|
-
context 'given both standard out and standard error' do
|
23
|
-
let(:raw_text) {
|
24
|
-
"\x01\x00\x00\x00\x00\x00\x00\x01a\x02\x00\x00\x00\x00\x00\x00\x01b"
|
25
|
-
}
|
26
|
-
let(:expected) {
|
27
|
-
Docker::Messages.new(["a"], ["b"], ["a","b"], "")
|
28
|
-
}
|
29
|
-
|
30
|
-
it_behaves_like "decipher_messages of raw_test"
|
31
|
-
end
|
32
|
-
|
33
|
-
context 'given a single header' do
|
34
|
-
let(:raw_text) { "\x01\x00\x00\x00\x00\x00\x00\x01a" }
|
35
|
-
let(:expected) {
|
36
|
-
Docker::Messages.new(["a"], [], ["a"], "")
|
37
|
-
}
|
38
|
-
|
39
|
-
it_behaves_like "decipher_messages of raw_test"
|
40
|
-
end
|
41
|
-
|
42
|
-
context 'given two headers' do
|
43
|
-
let(:raw_text) {
|
44
|
-
"\x01\x00\x00\x00\x00\x00\x00\x01a\x01\x00\x00\x00\x00\x00\x00\x01b"
|
45
|
-
}
|
46
|
-
|
47
|
-
let(:expected) {
|
48
|
-
Docker::Messages.new(["a", "b"], [], ["a","b"], "")
|
49
|
-
}
|
50
|
-
|
51
|
-
it_behaves_like "decipher_messages of raw_test"
|
52
|
-
end
|
53
|
-
|
54
|
-
context 'given a header for text longer then 255 characters' do
|
55
|
-
let(:raw_text) {
|
56
|
-
"\x01\x00\x00\x00\x00\x00\x01\x01" + ("a" * 257)
|
57
|
-
}
|
58
|
-
let(:expected) {
|
59
|
-
Docker::Messages.new([("a" * 257)], [], [("a" * 257)], "")
|
60
|
-
}
|
61
|
-
|
62
|
-
it_behaves_like "decipher_messages of raw_test"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
describe "#append" do
|
67
|
-
context "appending one set of messages on another" do
|
68
|
-
let(:messages) {
|
69
|
-
Docker::Messages.new([], [], [], "")
|
70
|
-
}
|
71
|
-
|
72
|
-
before do
|
73
|
-
messages.append(new_messages)
|
74
|
-
end
|
75
|
-
|
76
|
-
context "with a buffer" do
|
77
|
-
let(:new_messages) {
|
78
|
-
Docker::Messages.new(["a"], [], ["a"], "b")
|
79
|
-
}
|
80
|
-
let(:expected) {
|
81
|
-
Docker::Messages.new(["a"], [], ["a"], "")
|
82
|
-
}
|
83
|
-
it_behaves_like "two equal messages"
|
84
|
-
end
|
85
|
-
|
86
|
-
context "without a buffer" do
|
87
|
-
let(:new_messages) {
|
88
|
-
Docker::Messages.new(["a"], [], ["a"], "")
|
89
|
-
}
|
90
|
-
let(:expected) {
|
91
|
-
Docker::Messages.new(["a"], [], ["a"], "")
|
92
|
-
}
|
93
|
-
it_behaves_like "two equal messages"
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Docker::MessagesStack do
|
4
|
-
|
5
|
-
describe '#append' do
|
6
|
-
context 'without limits' do |variable|
|
7
|
-
it 'does not limit stack size by default' do
|
8
|
-
data = ['foo', 'bar']
|
9
|
-
msg = Docker::Messages.new(data, [], data)
|
10
|
-
expect(subject.messages).not_to receive(:shift)
|
11
|
-
1000.times { subject.append(msg) }
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
context 'with size limit' do
|
16
|
-
let(:subject) { described_class.new(100) }
|
17
|
-
|
18
|
-
it 'limits stack to given size' do
|
19
|
-
data = ['foo', 'bar']
|
20
|
-
msg = Docker::Messages.new(data, [], data)
|
21
|
-
expect(subject.messages).to receive(:shift).exactly(1900).times
|
22
|
-
1000.times { subject.append(msg) }
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
data/spec/docker/network_spec.rb
DELETED
@@ -1,150 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Docker::Network, docker_1_9: true do
|
4
|
-
let(:name) do |example|
|
5
|
-
example.description.downcase.gsub('\s', '-')
|
6
|
-
end
|
7
|
-
|
8
|
-
describe '#to_s' do
|
9
|
-
subject { described_class.new(Docker.connection, info) }
|
10
|
-
let(:connection) { Docker.connection }
|
11
|
-
|
12
|
-
let(:id) do
|
13
|
-
'a6c5ffd25e07a6c906accf804174b5eb6a9d2f9e07bccb8f5aa4f4de5be6d01d'
|
14
|
-
end
|
15
|
-
|
16
|
-
let(:info) do
|
17
|
-
{
|
18
|
-
'Name' => 'bridge',
|
19
|
-
'Scope' => 'local',
|
20
|
-
'Driver' => 'bridge',
|
21
|
-
'IPAM' => {
|
22
|
-
'Driver' => 'default',
|
23
|
-
'Config' => [{ 'Subnet' => '172.17.0.0/16' }]
|
24
|
-
},
|
25
|
-
'Containers' => {},
|
26
|
-
'Options' => {
|
27
|
-
'com.docker.network.bridge.default_bridge' => 'true',
|
28
|
-
'com.docker.network.bridge.enable_icc' => 'true',
|
29
|
-
'com.docker.network.bridge.enable_ip_masquerade' => 'true',
|
30
|
-
'com.docker.network.bridge.host_binding_ipv4' => '0.0.0.0',
|
31
|
-
'com.docker.network.bridge.name' => 'docker0',
|
32
|
-
'com.docker.network.driver.mtu' => '1500'
|
33
|
-
},
|
34
|
-
'id' => id
|
35
|
-
}
|
36
|
-
end
|
37
|
-
|
38
|
-
let(:expected_string) do
|
39
|
-
"Docker::Network { :id => #{id}, :info => #{info.inspect}, "\
|
40
|
-
":connection => #{connection} }"
|
41
|
-
end
|
42
|
-
|
43
|
-
its(:to_s) { should == expected_string }
|
44
|
-
end
|
45
|
-
|
46
|
-
describe '.create' do
|
47
|
-
let!(:id) { subject.id }
|
48
|
-
subject { described_class.create(name) }
|
49
|
-
after { described_class.remove(id) }
|
50
|
-
|
51
|
-
it 'creates a Network' do
|
52
|
-
expect(Docker::Network.all.map(&:id)).to include(id)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
describe '.remove' do
|
57
|
-
let(:id) { subject.id }
|
58
|
-
subject { described_class.create(name) }
|
59
|
-
|
60
|
-
it 'removes the Network' do
|
61
|
-
described_class.remove(id)
|
62
|
-
expect(Docker::Network.all.map(&:id)).to_not include(id)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
describe '.get' do
|
67
|
-
after do
|
68
|
-
described_class.remove(name)
|
69
|
-
end
|
70
|
-
|
71
|
-
let!(:network) { described_class.create(name) }
|
72
|
-
|
73
|
-
it 'returns a network' do
|
74
|
-
expect(Docker::Network.get(name).id).to eq(network.id)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
describe '.all' do
|
79
|
-
let!(:networks) do
|
80
|
-
5.times.map { |i| described_class.create("#{name}-#{i}") }
|
81
|
-
end
|
82
|
-
|
83
|
-
after do
|
84
|
-
networks.each(&:remove)
|
85
|
-
end
|
86
|
-
|
87
|
-
it 'should return all networks' do
|
88
|
-
expect(Docker::Network.all.map(&:id)).to include(*networks.map(&:id))
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
describe '#connect' do
|
93
|
-
let!(:container) do
|
94
|
-
Docker::Container.create(
|
95
|
-
'Cmd' => %w(sleep 10),
|
96
|
-
'Image' => 'debian:wheezy'
|
97
|
-
)
|
98
|
-
end
|
99
|
-
subject { described_class.create(name) }
|
100
|
-
|
101
|
-
before(:each) { container.start }
|
102
|
-
after(:each) do
|
103
|
-
container.kill!.remove
|
104
|
-
subject.remove
|
105
|
-
end
|
106
|
-
|
107
|
-
it 'connects a container to a network' do
|
108
|
-
subject.connect(container.id)
|
109
|
-
expect(subject.info['Containers']).to include(container.id)
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
describe '#disconnect' do
|
114
|
-
let!(:container) do
|
115
|
-
Docker::Container.create(
|
116
|
-
'Cmd' => %w(sleep 10),
|
117
|
-
'Image' => 'debian:wheezy'
|
118
|
-
)
|
119
|
-
end
|
120
|
-
|
121
|
-
subject { described_class.create(name) }
|
122
|
-
|
123
|
-
before(:each) do
|
124
|
-
container.start
|
125
|
-
sleep 1
|
126
|
-
subject.connect(container.id)
|
127
|
-
end
|
128
|
-
|
129
|
-
after(:each) do
|
130
|
-
container.kill!.remove
|
131
|
-
subject.remove
|
132
|
-
end
|
133
|
-
|
134
|
-
it 'connects a container to a network' do
|
135
|
-
subject.disconnect(container.id)
|
136
|
-
expect(subject.info['Containers']).not_to include(container.id)
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
describe '#remove' do
|
141
|
-
let(:id) { subject.id }
|
142
|
-
let(:name) { 'test-network-remove' }
|
143
|
-
subject { described_class.create(name) }
|
144
|
-
|
145
|
-
it 'removes the Network' do
|
146
|
-
subject.remove
|
147
|
-
expect(Docker::Network.all.map(&:id)).to_not include(id)
|
148
|
-
end
|
149
|
-
end
|
150
|
-
end
|
data/spec/docker/util_spec.rb
DELETED
@@ -1,154 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Docker::Util do
|
4
|
-
subject { described_class }
|
5
|
-
|
6
|
-
describe '.parse_json' do
|
7
|
-
subject { described_class.parse_json(arg) }
|
8
|
-
|
9
|
-
context 'when the argument is nil' do
|
10
|
-
let(:arg) { nil }
|
11
|
-
|
12
|
-
it { should be_nil }
|
13
|
-
end
|
14
|
-
|
15
|
-
context 'when the argument is empty' do
|
16
|
-
let(:arg) { '' }
|
17
|
-
|
18
|
-
it { should be_nil }
|
19
|
-
end
|
20
|
-
|
21
|
-
context 'when the argument is \'null\'' do
|
22
|
-
let(:arg) { 'null' }
|
23
|
-
|
24
|
-
it { should be_nil }
|
25
|
-
end
|
26
|
-
|
27
|
-
context 'when the argument is not valid JSON' do
|
28
|
-
let(:arg) { '~~lol not valid json~~' }
|
29
|
-
|
30
|
-
it 'raises an error' do
|
31
|
-
expect { subject }.to raise_error Docker::Error::UnexpectedResponseError
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
context 'when the argument is valid JSON' do
|
36
|
-
let(:arg) { '{"yolo":"swag"}' }
|
37
|
-
|
38
|
-
it 'parses the JSON into a Hash' do
|
39
|
-
expect(subject).to eq 'yolo' => 'swag'
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
describe '.fix_json' do
|
45
|
-
let(:response) { '{"this":"is"}{"not":"json"}' }
|
46
|
-
subject { Docker::Util.fix_json(response) }
|
47
|
-
|
48
|
-
it 'fixes the "JSON" response that Docker returns' do
|
49
|
-
expect(subject).to eq [
|
50
|
-
{
|
51
|
-
'this' => 'is'
|
52
|
-
},
|
53
|
-
{
|
54
|
-
'not' => 'json'
|
55
|
-
}
|
56
|
-
]
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
describe '.create_dir_tar' do
|
61
|
-
attr_accessor :tmpdir
|
62
|
-
|
63
|
-
around do |example|
|
64
|
-
Dir.mktmpdir do |tmpdir|
|
65
|
-
self.tmpdir = tmpdir
|
66
|
-
example.call
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
specify do
|
71
|
-
tar = subject.create_dir_tar tmpdir
|
72
|
-
expect { FileUtils.rm tar }.to_not raise_error
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
describe '.build_auth_header' do
|
77
|
-
subject { described_class }
|
78
|
-
|
79
|
-
let(:credentials) {
|
80
|
-
{
|
81
|
-
:username => 'test',
|
82
|
-
:password => 'password',
|
83
|
-
:email => 'test@example.com',
|
84
|
-
:serveraddress => 'https://registry.com/'
|
85
|
-
}
|
86
|
-
}
|
87
|
-
let(:credential_string) { credentials.to_json }
|
88
|
-
let(:encoded_creds) { Base64.encode64(credential_string).gsub(/\n/, '') }
|
89
|
-
let(:expected_header) {
|
90
|
-
{
|
91
|
-
'X-Registry-Auth' => encoded_creds
|
92
|
-
}
|
93
|
-
}
|
94
|
-
|
95
|
-
|
96
|
-
context 'given credentials as a Hash' do
|
97
|
-
it 'returns an X-Registry-Auth header encoded' do
|
98
|
-
expect(subject.build_auth_header(credentials)).to eq(expected_header)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
context 'given credentials as a String' do
|
103
|
-
it 'returns an X-Registry-Auth header encoded' do
|
104
|
-
expect(
|
105
|
-
subject.build_auth_header(credential_string)
|
106
|
-
).to eq(expected_header)
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
describe '.build_config_header' do
|
112
|
-
subject { described_class }
|
113
|
-
|
114
|
-
let(:credentials) {
|
115
|
-
{
|
116
|
-
:username => 'test',
|
117
|
-
:password => 'password',
|
118
|
-
:email => 'test@example.com',
|
119
|
-
:serveraddress => 'https://registry.com/'
|
120
|
-
}
|
121
|
-
}
|
122
|
-
|
123
|
-
let(:credentials_object) {
|
124
|
-
{
|
125
|
-
:'https://registry.com/' => {
|
126
|
-
:username => 'test',
|
127
|
-
:password => 'password',
|
128
|
-
:email => 'test@example.com',
|
129
|
-
}
|
130
|
-
}.to_json
|
131
|
-
}
|
132
|
-
|
133
|
-
let(:encoded_creds) { Base64.encode64(credentials_object).gsub(/\n/, '') }
|
134
|
-
let(:expected_header) {
|
135
|
-
{
|
136
|
-
'X-Registry-Config' => encoded_creds
|
137
|
-
}
|
138
|
-
}
|
139
|
-
|
140
|
-
context 'given credentials as a Hash' do
|
141
|
-
it 'returns an X-Registry-Config header encoded' do
|
142
|
-
expect(subject.build_config_header(credentials)).to eq(expected_header)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
context 'given credentials as a String' do
|
147
|
-
it 'returns an X-Registry-Config header encoded' do
|
148
|
-
expect(
|
149
|
-
subject.build_config_header(credentials.to_json)
|
150
|
-
).to eq(expected_header)
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
data/spec/docker/volume_spec.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
# Volume requests are actually slow enough to occasionally not work
|
4
|
-
# Use sleep statements to manage that
|
5
|
-
describe Docker::Volume, :docker_1_9 do
|
6
|
-
let(:name) { "ArbitraryNameForTheRakeTestVolume" }
|
7
|
-
|
8
|
-
describe '.create' do
|
9
|
-
let(:volume) { Docker::Volume.create(name) }
|
10
|
-
|
11
|
-
after { volume.remove }
|
12
|
-
|
13
|
-
it 'creates a volume' do
|
14
|
-
expect(volume.id).to eq(name)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
describe '.get' do
|
19
|
-
let(:volume) { Docker::Volume.get(name) }
|
20
|
-
|
21
|
-
before { Docker::Volume.create(name); sleep 1 }
|
22
|
-
after { volume.remove }
|
23
|
-
|
24
|
-
it 'gets volume details' do
|
25
|
-
expect(volume.id).to eq(name)
|
26
|
-
expect(volume.info).to_not be_empty
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe '.all' do
|
31
|
-
after { Docker::Volume.get(name).remove }
|
32
|
-
|
33
|
-
it 'gets a list of volumes' do
|
34
|
-
expect { Docker::Volume.create(name); sleep 1 }.to change { Docker::Volume.all.length }.by(1)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe '#remove' do
|
39
|
-
it 'removes a volume' do
|
40
|
-
volume = Docker::Volume.create(name)
|
41
|
-
sleep 1
|
42
|
-
expect { volume.remove }.to change { Docker::Volume.all.length }.by(-1)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|