centurion 1.0.7 → 1.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/centurion/deploy.rb +14 -6
- data/lib/centurion/docker_via_api.rb +2 -2
- data/lib/centurion/version.rb +1 -1
- data/spec/deploy_spec.rb +10 -2
- data/spec/docker_via_api_spec.rb +12 -12
- metadata +1 -1
data/lib/centurion/deploy.rb
CHANGED
@@ -87,7 +87,7 @@ module Centurion::Deploy
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
|
-
def container_config_for(target_server, image_id, port_bindings=nil, env_vars=nil)
|
90
|
+
def container_config_for(target_server, image_id, port_bindings=nil, env_vars=nil, volumes=nil)
|
91
91
|
container_config = {
|
92
92
|
'Image' => image_id,
|
93
93
|
'Hostname' => target_server.hostname,
|
@@ -101,16 +101,24 @@ module Centurion::Deploy
|
|
101
101
|
container_config['Env'] = env_vars.map { |k,v| "#{k}=#{v}" }
|
102
102
|
end
|
103
103
|
|
104
|
+
if volumes
|
105
|
+
container_config['Volumes'] = volumes.inject({}) do |memo, v|
|
106
|
+
memo[v.split(/:/).last] = {}
|
107
|
+
memo
|
108
|
+
end
|
109
|
+
container_config['VolumesFrom'] = 'parent'
|
110
|
+
end
|
111
|
+
|
104
112
|
container_config
|
105
113
|
end
|
106
114
|
|
107
115
|
def start_new_container(target_server, image_id, port_bindings, volumes, env_vars=nil)
|
108
|
-
container_config = container_config_for(target_server, image_id, port_bindings, env_vars)
|
116
|
+
container_config = container_config_for(target_server, image_id, port_bindings, env_vars, volumes)
|
109
117
|
start_container_with_config(target_server, volumes, port_bindings, container_config)
|
110
118
|
end
|
111
119
|
|
112
120
|
def launch_console(target_server, image_id, port_bindings, volumes, env_vars=nil)
|
113
|
-
container_config = container_config_for(target_server, image_id, port_bindings, env_vars).merge(
|
121
|
+
container_config = container_config_for(target_server, image_id, port_bindings, env_vars, volumes).merge(
|
114
122
|
'Cmd' => [ '/bin/bash' ],
|
115
123
|
'AttachStdin' => true,
|
116
124
|
'Tty' => true,
|
@@ -128,11 +136,11 @@ module Centurion::Deploy
|
|
128
136
|
info "Creating new container for #{container_config['Image'][0..7]}"
|
129
137
|
new_container = target_server.create_container(container_config)
|
130
138
|
|
131
|
-
host_config = {
|
132
|
-
'PortBindings' => port_bindings
|
133
|
-
}
|
139
|
+
host_config = {}
|
134
140
|
# Map some host volumes if needed
|
135
141
|
host_config['Binds'] = volumes if volumes && !volumes.empty?
|
142
|
+
# Bind the ports
|
143
|
+
host_config['PortBindings'] = port_bindings
|
136
144
|
|
137
145
|
info "Starting new container #{new_container['Id'][0..7]}"
|
138
146
|
target_server.start_container(new_container['Id'], host_config)
|
@@ -61,7 +61,7 @@ class Centurion::DockerViaApi
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def create_container(configuration)
|
64
|
-
path = "/v1.
|
64
|
+
path = "/v1.10/containers/create"
|
65
65
|
response = Excon.post(
|
66
66
|
@base_uri + path,
|
67
67
|
:body => configuration.to_json,
|
@@ -72,7 +72,7 @@ class Centurion::DockerViaApi
|
|
72
72
|
end
|
73
73
|
|
74
74
|
def start_container(container_id, configuration)
|
75
|
-
path = "/v1.
|
75
|
+
path = "/v1.10/containers/#{container_id}/start"
|
76
76
|
response = Excon.post(
|
77
77
|
@base_uri + path,
|
78
78
|
:body => configuration.to_json,
|
data/lib/centurion/version.rb
CHANGED
data/spec/deploy_spec.rb
CHANGED
@@ -158,13 +158,21 @@ describe Centurion::Deploy do
|
|
158
158
|
expect(config).to be_a(Hash)
|
159
159
|
expect(config.keys).to match_array(%w{ Hostname Image })
|
160
160
|
end
|
161
|
+
|
162
|
+
it 'handles mapping host volumes' do
|
163
|
+
config = test_deploy.container_config_for(server, 'image_id', nil, nil, ["/tmp/foo:/tmp/chaucer"])
|
164
|
+
|
165
|
+
expect(config).to be_a(Hash)
|
166
|
+
expect(config.keys).to match_array(%w{ Hostname Image Volumes VolumesFrom })
|
167
|
+
expect(config['Volumes']['/tmp/chaucer']).to eq({})
|
168
|
+
end
|
161
169
|
end
|
162
170
|
|
163
171
|
describe '#start_new_container' do
|
164
172
|
let(:bindings) { {'80/tcp'=>[{'HostIp'=>'0.0.0.0', 'HostPort'=>'80'}]} }
|
165
173
|
|
166
174
|
it 'configures the container' do
|
167
|
-
expect(test_deploy).to receive(:container_config_for).with(server, 'image_id', bindings, nil).once
|
175
|
+
expect(test_deploy).to receive(:container_config_for).with(server, 'image_id', bindings, nil, {}).once
|
168
176
|
test_deploy.stub(:start_container_with_config)
|
169
177
|
|
170
178
|
test_deploy.start_new_container(server, 'image_id', bindings, {})
|
@@ -193,7 +201,7 @@ describe Centurion::Deploy do
|
|
193
201
|
let(:bindings) { {'80/tcp'=>[{'HostIp'=>'0.0.0.0', 'HostPort'=>'80'}]} }
|
194
202
|
|
195
203
|
it 'configures the container' do
|
196
|
-
expect(test_deploy).to receive(:container_config_for).with(server, 'image_id', bindings, nil).once
|
204
|
+
expect(test_deploy).to receive(:container_config_for).with(server, 'image_id', bindings, nil, {}).once
|
197
205
|
test_deploy.stub(:start_container_with_config)
|
198
206
|
|
199
207
|
test_deploy.start_new_container(server, 'image_id', bindings, {})
|
data/spec/docker_via_api_spec.rb
CHANGED
@@ -5,7 +5,7 @@ describe Centurion::DockerViaApi do
|
|
5
5
|
let(:hostname) { 'example.com' }
|
6
6
|
let(:port) { '4243' }
|
7
7
|
let(:api) { Centurion::DockerViaApi.new(hostname, port) }
|
8
|
-
let(:excon_uri) { "http://#{hostname}:#{port}/
|
8
|
+
let(:excon_uri) { "http://#{hostname}:#{port}/" }
|
9
9
|
let(:json_string) { '[{ "Hello": "World" }]' }
|
10
10
|
let(:json_value) { JSON.load(json_string) }
|
11
11
|
let(:inspected_containers) do
|
@@ -18,21 +18,21 @@ describe Centurion::DockerViaApi do
|
|
18
18
|
|
19
19
|
it 'lists processes' do
|
20
20
|
expect(Excon).to receive(:get).
|
21
|
-
with(excon_uri + "/containers/json").
|
21
|
+
with(excon_uri + "v1.7" + "/containers/json").
|
22
22
|
and_return(double(body: json_string, status: 200))
|
23
23
|
expect(api.ps).to eq(json_value)
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'lists all processes' do
|
27
27
|
expect(Excon).to receive(:get).
|
28
|
-
with(excon_uri + "/containers/json?all=1").
|
28
|
+
with(excon_uri + "v1.7" + "/containers/json?all=1").
|
29
29
|
and_return(double(body: json_string, status: 200))
|
30
30
|
expect(api.ps(all: true)).to eq(json_value)
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'inspects an image' do
|
34
34
|
expect(Excon).to receive(:get).
|
35
|
-
with(excon_uri + "/images/foo:bar/json",
|
35
|
+
with(excon_uri + "v1.7" + "/images/foo:bar/json",
|
36
36
|
headers: {'Accept' => 'application/json'}).
|
37
37
|
and_return(double(body: json_string, status: 200))
|
38
38
|
expect(api.inspect_image('foo', 'bar')).to eq(json_value)
|
@@ -42,7 +42,7 @@ describe Centurion::DockerViaApi do
|
|
42
42
|
configuration_as_json = double
|
43
43
|
configuration = double(:to_json => configuration_as_json)
|
44
44
|
expect(Excon).to receive(:post).
|
45
|
-
with(excon_uri + "/containers/create",
|
45
|
+
with(excon_uri + "v1.10" + "/containers/create",
|
46
46
|
body: configuration_as_json,
|
47
47
|
headers: {'Content-Type' => 'application/json'}).
|
48
48
|
and_return(double(body: json_string, status: 201))
|
@@ -53,7 +53,7 @@ describe Centurion::DockerViaApi do
|
|
53
53
|
configuration_as_json = double
|
54
54
|
configuration = double(:to_json => configuration_as_json)
|
55
55
|
expect(Excon).to receive(:post).
|
56
|
-
with(excon_uri + "/containers/12345/start",
|
56
|
+
with(excon_uri + "v1.10" + "/containers/12345/start",
|
57
57
|
body: configuration_as_json,
|
58
58
|
headers: {'Content-Type' => 'application/json'}).
|
59
59
|
and_return(double(body: json_string, status: 204))
|
@@ -62,34 +62,34 @@ describe Centurion::DockerViaApi do
|
|
62
62
|
|
63
63
|
it 'stops a container' do
|
64
64
|
expect(Excon).to receive(:post).
|
65
|
-
with(excon_uri + "/containers/12345/stop?t=30").
|
65
|
+
with(excon_uri + "v1.7" + "/containers/12345/stop?t=30").
|
66
66
|
and_return(double(status: 204))
|
67
67
|
api.stop_container('12345')
|
68
68
|
end
|
69
69
|
|
70
70
|
it 'inspects a container' do
|
71
71
|
expect(Excon).to receive(:get).
|
72
|
-
with(excon_uri + "/containers/12345/json").
|
72
|
+
with(excon_uri + "v1.7" + "/containers/12345/json").
|
73
73
|
and_return(double(body: json_string, status: 200))
|
74
74
|
expect(api.inspect_container('12345')).to eq(json_value)
|
75
75
|
end
|
76
76
|
|
77
77
|
it 'removes a container' do
|
78
78
|
expect(Excon).to receive(:delete).
|
79
|
-
with(excon_uri + "/containers/12345").
|
79
|
+
with(excon_uri + "v1.7" + "/containers/12345").
|
80
80
|
and_return(double(status: 204))
|
81
81
|
expect(api.remove_container('12345')).to eq(true)
|
82
82
|
end
|
83
83
|
|
84
84
|
it 'lists old containers for a port' do
|
85
85
|
expect(Excon).to receive(:get).
|
86
|
-
with(excon_uri + "/containers/json?all=1").
|
86
|
+
with(excon_uri + "v1.7" + "/containers/json?all=1").
|
87
87
|
and_return(double(body: inspected_containers.to_json, status: 200))
|
88
88
|
expect(Excon).to receive(:get).
|
89
|
-
with(excon_uri + "/containers/123/json").
|
89
|
+
with(excon_uri + "v1.7" + "/containers/123/json").
|
90
90
|
and_return(double(body: inspected_container_on_port("123", 8485).to_json, status: 200))
|
91
91
|
expect(Excon).to receive(:get).
|
92
|
-
with(excon_uri + "/containers/789/json").
|
92
|
+
with(excon_uri + "v1.7" + "/containers/789/json").
|
93
93
|
and_return(double(body: inspected_container_on_port("789", 8486).to_json, status: 200))
|
94
94
|
|
95
95
|
expect(api.old_containers_for_port(8485)).to eq([{"Id" => "123", "Status" => "Exit 0"}])
|