bigrig 0.0.0 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rspec +3 -0
- data/.rubocop.yml +20 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.md +19 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +84 -0
- data/LICENSE +28 -0
- data/README.md +191 -0
- data/Rakefile +10 -0
- data/bigrig.gemspec +29 -0
- data/bin/bigrig +113 -0
- data/lib/bigrig/actions/destroy_action.rb +21 -0
- data/lib/bigrig/actions/dev_action.rb +19 -0
- data/lib/bigrig/actions/log_action.rb +45 -0
- data/lib/bigrig/actions/run_action.rb +14 -0
- data/lib/bigrig/actions/ship_action.rb +51 -0
- data/lib/bigrig/actions.rb +5 -0
- data/lib/bigrig/dependency_graph.rb +21 -0
- data/lib/bigrig/descriptor.rb +43 -0
- data/lib/bigrig/docker_adapter.rb +129 -0
- data/lib/bigrig/models/application.rb +22 -0
- data/lib/bigrig/models/base_model.rb +7 -0
- data/lib/bigrig/models/container.rb +40 -0
- data/lib/bigrig/models.rb +3 -0
- data/lib/bigrig/output_parser.rb +52 -0
- data/lib/bigrig/runner.rb +94 -0
- data/lib/bigrig/version.rb +3 -0
- data/lib/bigrig.rb +8 -0
- data/spec/bigrig/actions/destroy_action_spec.rb +55 -0
- data/spec/bigrig/actions/dev_action_spec.rb +17 -0
- data/spec/bigrig/actions/log_action_spec.rb +33 -0
- data/spec/bigrig/actions/run_action_spec.rb +270 -0
- data/spec/bigrig/actions/ship_action_spec.rb +82 -0
- data/spec/bigrig/dependency_graph_spec.rb +19 -0
- data/spec/bigrig/descriptor_spec.rb +56 -0
- data/spec/bigrig/docker_adapter_spec.rb +409 -0
- data/spec/bigrig/models/application_spec.rb +32 -0
- data/spec/bigrig/models/container_spec.rb +115 -0
- data/spec/bigrig/output_parser_spec.rb +71 -0
- data/spec/bigrig_spec.rb +249 -0
- data/spec/data/addscontainer.json +24 -0
- data/spec/data/build/Dockerfile +2 -0
- data/spec/data/build/test +0 -0
- data/spec/data/dev.json +26 -0
- data/spec/data/duplicate.json +13 -0
- data/spec/data/env.json +12 -0
- data/spec/data/hosts_ip.json +12 -0
- data/spec/data/hosts_name.json +11 -0
- data/spec/data/links.json +13 -0
- data/spec/data/log.json +8 -0
- data/spec/data/multiple.json +13 -0
- data/spec/data/path.json +5 -0
- data/spec/data/ports.json +9 -0
- data/spec/data/profiles.json +24 -0
- data/spec/data/ship.json +5 -0
- data/spec/data/single.json +8 -0
- data/spec/data/tagandpath.json +24 -0
- data/spec/data/tiny-image.tar +0 -0
- data/spec/data/volumes.json +13 -0
- data/spec/spec_helper.rb +104 -0
- data/spec/support/bigrig_vcr +8 -0
- data/spec/support/vcr.rb +15 -0
- data/spec/vcr/Bigrig_DestroyAction/_perform/given_json_with_a_single_container/and_the_container_has_exited/should_remove_the_container.yml +392 -0
- data/spec/vcr/Bigrig_DestroyAction/_perform/given_json_with_a_single_container/and_the_container_is_running/kills_and_removes_the_container.yml +418 -0
- data/spec/vcr/Bigrig_DockerAdapter/_build/builds_the_given_directory.yml +63 -0
- data/spec/vcr/Bigrig_DockerAdapter/_build/passes_build_input_to_a_block.yml +35 -0
- data/spec/vcr/Bigrig_DockerAdapter/_container_exists_/when_the_container_does_not_exist/is_false.yml +115 -0
- data/spec/vcr/Bigrig_DockerAdapter/_container_exists_/when_the_container_exists/is_true.yml +82 -0
- data/spec/vcr/Bigrig_DockerAdapter/_image_id_by_tag/when_the_image_does_not_exist/raise_a_ImageNotFoundError.yml +172 -0
- data/spec/vcr/Bigrig_DockerAdapter/_image_id_by_tag/when_the_image_exists/returns_the_image_id.yml +148 -0
- data/spec/vcr/Bigrig_DockerAdapter/_kill/given_the_container_does_not_exist/should_raise_an_error.yml +115 -0
- data/spec/vcr/Bigrig_DockerAdapter/_kill/given_the_container_is_running/should_kill_the_container.yml +200 -0
- data/spec/vcr/Bigrig_DockerAdapter/_logs/streams_logs_to_a_block.yml +163 -0
- data/spec/vcr/Bigrig_DockerAdapter/_pull/given_a_block_to_capture_output/should_capture_output.yml +64 -0
- data/spec/vcr/Bigrig_DockerAdapter/_pull/given_the_repo_does_not_exist/raises_a_RepoNotFoundError.yml +30 -0
- data/spec/vcr/Bigrig_DockerAdapter/_pull/given_the_repo_exists/returns_the_image_id.yml +92 -0
- data/spec/vcr/Bigrig_DockerAdapter/_push/given_credentials/will_pass_login_and_password.yml +254 -0
- data/spec/vcr/Bigrig_DockerAdapter/_push/should_push_the_image.yml +482 -0
- data/spec/vcr/Bigrig_DockerAdapter/_remove_container/when_the_container_does_not_exist/raises_a_ContainerNotFoundError.yml +227 -0
- data/spec/vcr/Bigrig_DockerAdapter/_remove_container/when_the_container_exists/should_remove_the_container.yml +222 -0
- data/spec/vcr/Bigrig_DockerAdapter/_remove_container/when_the_container_is_running/raises_a_ContainerRunningError.yml +80 -0
- data/spec/vcr/Bigrig_DockerAdapter/_remove_image/when_the_image_doesnt_exist/raises_an_error.yml +115 -0
- data/spec/vcr/Bigrig_DockerAdapter/_remove_image/when_the_image_exists/removes_the_image.yml +199 -0
- data/spec/vcr/Bigrig_DockerAdapter/_run/given_an_image_id_that_exists/and_a_name/starts_the_container_with_the_right_name.yml +204 -0
- data/spec/vcr/Bigrig_DockerAdapter/_run/given_an_image_id_that_exists/and_a_name_and_env_variables/starts_the_container_with_env_set.yml +204 -0
- data/spec/vcr/Bigrig_DockerAdapter/_run/given_an_image_id_that_exists/and_a_name_and_ports/starts_the_container_with_ports_exposed.yml +230 -0
- data/spec/vcr/Bigrig_DockerAdapter/_running_/when_the_container_does_not_exist/returns_false.yml +115 -0
- data/spec/vcr/Bigrig_DockerAdapter/_running_/when_the_container_is_not_running/returns_false.yml +82 -0
- data/spec/vcr/Bigrig_DockerAdapter/_running_/when_the_container_is_running/returns_true.yml +103 -0
- data/spec/vcr/Bigrig_DockerAdapter/_tag/should_tag_the_image.yml +290 -0
- data/spec/vcr/Bigrig_LogAction/_perform/follows_the_log.yml +163 -0
- data/spec/vcr/Bigrig_RunAction/_perform/given_a_file_with_a_path/builds_the_image_before_starting_it.yml +310 -0
- data/spec/vcr/Bigrig_RunAction/_perform/given_a_file_with_hosts_by_ip/should_pass_hosts_to_container.yml +430 -0
- data/spec/vcr/Bigrig_RunAction/_perform/given_a_file_with_hosts_by_name/should_lookup_ips_for_hosts_with_a_hostname.yml +430 -0
- data/spec/vcr/Bigrig_RunAction/_perform/given_a_file_with_links/should_pass_links_to_the_right_container.yml +805 -0
- data/spec/vcr/Bigrig_RunAction/_perform/given_a_file_with_multiple_containers/launches_both_containers_in_parallel.yml +731 -0
- data/spec/vcr/Bigrig_RunAction/_perform/given_a_file_with_multiple_containers/spins_up_multiple_containers.yml +805 -0
- data/spec/vcr/Bigrig_RunAction/_perform/given_a_file_with_one_container/should_spin_up_a_single_container.yml +404 -0
- data/spec/vcr/Bigrig_RunAction/_perform/given_a_file_with_one_container/when_a_dead_container_exists/should_remove_existing_containers.yml +329 -0
- data/spec/vcr/Bigrig_RunAction/_perform/given_a_file_with_volumes_from/should_pass_volumes_from_to_the_right_container.yml +805 -0
- data/spec/vcr/Bigrig_RunAction/_perform/given_a_file_with_volumes_from/starts_the_dependant_container_last.yml +731 -0
- data/spec/vcr/Bigrig_RunAction/_perform/when_activating_profiles_that_do_not_exist/ignores_the_missing_profile.yml +409 -0
- data/spec/vcr/Bigrig_RunAction/_perform/with_a_file_with_active_profiles/uses_the_overridden_image.yml +432 -0
- data/spec/vcr/bigrig/destroy/spec/data/single_json/kills_the_container.yml +166 -0
- data/spec/vcr/bigrig/dev/spec/data/dev_json/activates_the_dev_profile.yml +37 -0
- data/spec/vcr/bigrig/dev/spec/data/dev_json/destroys_containers_on_exit.yml +227 -0
- data/spec/vcr/bigrig/dev/spec/data/dev_json/starts_the_containers.yml +107 -0
- data/spec/vcr/bigrig/logs/spec/data/log_json/tails_the_logs.yml +163 -0
- data/spec/vcr/bigrig/run/spec/data/profiles_json_-p_qa/leaves_existing_env_values_alone.yml +110 -0
- data/spec/vcr/bigrig/run/spec/data/profiles_json_-p_qa/overrides_the_env.yml +110 -0
- data/spec/vcr/bigrig/run/spec/data/profiles_json_-p_qa/overrides_the_tag.yml +103 -0
- data/spec/vcr/bigrig/run/spec/data/single_json/sends_the_name_of_the_container_to_stdout.yml +75 -0
- data/spec/vcr/bigrig/run/spec/data/single_json/starts_the_container.yml +101 -0
- data/spec/vcr/bigrig/ship/spec/data/ship_json/with_a_version/-c/cleans_the_image_when_its_done.yml +212 -0
- data/spec/vcr/bigrig/ship/spec/data/ship_json/with_a_version/builds_and_pushes_the_image.yml +128 -0
- data/spec/vcr/bigrig_bin_bigrig_destroy_spec/data/single_json_kills_the_container.yml +179 -0
- data/spec/vcr/bigrig_bin_bigrig_dev_spec/data/dev_json_activates_the_dev_profile.yml +1068 -0
- data/spec/vcr/bigrig_bin_bigrig_dev_spec/data/dev_json_destroys_containers_on_exit.yml +1070 -0
- data/spec/vcr/bigrig_bin_bigrig_dev_spec/data/dev_json_starts_the_containers.yml +1068 -0
- data/spec/vcr/bigrig_bin_bigrig_dev_spec/data/dev_json_tails_the_logs.yml +1075 -0
- data/spec/vcr/bigrig_bin_bigrig_logs_spec/data/log_json_tails_the_logs.yml +69 -0
- data/spec/vcr/bigrig_bin_bigrig_run_spec/data/profiles_json_-p_qa_leaves_existing_env_values_alone.yml +306 -0
- data/spec/vcr/bigrig_bin_bigrig_run_spec/data/profiles_json_-p_qa_overrides_the_env.yml +306 -0
- data/spec/vcr/bigrig_bin_bigrig_run_spec/data/profiles_json_-p_qa_overrides_the_tag.yml +306 -0
- data/spec/vcr/bigrig_bin_bigrig_run_spec/data/single_json_sends_the_name_of_the_container_to_stdout.yml +306 -0
- data/spec/vcr/bigrig_bin_bigrig_run_spec/data/single_json_starts_the_container.yml +306 -0
- data/spec/vcr/bigrig_bin_bigrig_ship_spec/data/ship_json_with_a_version_-c_cleans_the_image_when_its_done.yml +335 -0
- data/spec/vcr/bigrig_bin_bigrig_ship_spec/data/ship_json_with_a_version_builds_and_pushes_the_image.yml +285 -0
- data/test/dev/shipper.json +24 -0
- data/test/logs/bigrig.json +6 -0
- data/test/logs/container1/Dockerfile +4 -0
- data/test/logs/container1/run.sh +7 -0
- data/test/logs/container2/Dockerfile +4 -0
- data/test/logs/container2/run.sh +7 -0
- data/test/ship/bigrig-1.2.3.json +1 -0
- data/test/ship/bigrig.json +5 -0
- data/test/ship/registry.json +11 -0
- data/test/ship/ship/Dockerfile +4 -0
- data/test/ship/ship/run.sh +6 -0
- data/test/volumes_from/exports_volumes/Dockerfile +8 -0
- data/test/volumes_from/exports_volumes/index.html +8 -0
- data/test/volumes_from/exports_volumes/run.sh +7 -0
- data/test/volumes_from/shipper.json +14 -0
- metadata +278 -8
@@ -0,0 +1,270 @@
|
|
1
|
+
module Bigrig
|
2
|
+
describe RunAction do
|
3
|
+
describe '::perform' do
|
4
|
+
subject { described_class.new(descriptor.as_json).perform }
|
5
|
+
let(:descriptor) { Descriptor.read test_file(file), active_profiles }
|
6
|
+
let(:active_profiles) { [] }
|
7
|
+
|
8
|
+
context 'given a file with one container' do
|
9
|
+
let(:file) { 'single.json' }
|
10
|
+
let(:running?) { DockerAdapter.running? 'single-test' }
|
11
|
+
|
12
|
+
after do
|
13
|
+
begin
|
14
|
+
container = Docker::Container.get 'single-test'
|
15
|
+
container.kill.delete
|
16
|
+
rescue Docker::Error::NotFoundError # rubocop:disable Lint/HandleExceptions
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should spin up a single container', :vcr do
|
21
|
+
subject
|
22
|
+
expect(running?).to be true
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when a dead container exists' do
|
26
|
+
before do
|
27
|
+
container = Docker::Container.create 'Image' => 'hawknewton/show-env',
|
28
|
+
'name' => 'single-test'
|
29
|
+
container.start.kill
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should remove existing containers', :vcr do
|
33
|
+
subject
|
34
|
+
expect(running?).to be true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'given a file with multiple containers' do
|
40
|
+
let(:file) { 'multiple.json' }
|
41
|
+
let(:running?) do
|
42
|
+
DockerAdapter.running?('multiple-test1') && DockerAdapter.running?('multiple-test2')
|
43
|
+
end
|
44
|
+
let(:perform) { subject }
|
45
|
+
|
46
|
+
after do
|
47
|
+
begin
|
48
|
+
c1 = Docker::Container.get 'multiple-test1'
|
49
|
+
c1.kill.delete
|
50
|
+
rescue Docker::Error::NotFoundError # rubocop:disable Lint/HandleExceptions
|
51
|
+
end
|
52
|
+
begin
|
53
|
+
c1 = Docker::Container.get 'multiple-test2'
|
54
|
+
c1.kill.delete
|
55
|
+
rescue Docker::Error::NotFoundError # rubocop:disable Lint/HandleExceptions
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'spins up multiple containers', :vcr do
|
60
|
+
perform
|
61
|
+
expect(running?).to be true
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'launches both containers in parallel', :vcr do
|
65
|
+
running = 0
|
66
|
+
expect(DockerAdapter).to receive(:run).with hash_including(name: 'multiple-test1') do
|
67
|
+
running += 1
|
68
|
+
sleep 1
|
69
|
+
running -= 1
|
70
|
+
end
|
71
|
+
|
72
|
+
expect(DockerAdapter).to receive(:run).with hash_including(name: 'multiple-test2') do
|
73
|
+
sleep 0.5
|
74
|
+
expect(running).to eq 1
|
75
|
+
end
|
76
|
+
perform
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context 'given a file with links' do
|
81
|
+
let(:file) { 'links.json' }
|
82
|
+
let(:container) { Docker::Container.get 'uses_service' }
|
83
|
+
let(:links) { container.json['HostConfig']['Links'] }
|
84
|
+
let(:perform) { subject }
|
85
|
+
|
86
|
+
after do
|
87
|
+
begin
|
88
|
+
c1 = Docker::Container.get 'provides_service'
|
89
|
+
c1.kill.delete
|
90
|
+
rescue Docker::Error::NotFoundError # rubocop:disable Lint/HandleExceptions
|
91
|
+
end
|
92
|
+
begin
|
93
|
+
c1 = Docker::Container.get 'uses_service'
|
94
|
+
c1.kill.delete
|
95
|
+
rescue Docker::Error::NotFoundError # rubocop:disable Lint/HandleExceptions
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'should pass links to the right container', :vcr do
|
100
|
+
perform
|
101
|
+
expect(links).to eq ['/provides_service:/uses_service/service']
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'given a file with hosts by ip' do
|
106
|
+
let(:file) { 'hosts_ip.json' }
|
107
|
+
let(:container) { Docker::Container.get 'uses_host' }
|
108
|
+
let(:hosts) { container.json['HostConfig']['ExtraHosts'] }
|
109
|
+
let(:perform) { subject }
|
110
|
+
|
111
|
+
after do
|
112
|
+
begin
|
113
|
+
c1 = Docker::Container.get 'uses_host'
|
114
|
+
c1.kill.delete
|
115
|
+
rescue Docker::Error::NotFoundError # rubocop:disable Lint/HandleExceptions
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should pass hosts to container', :vcr do
|
120
|
+
perform
|
121
|
+
expect(hosts).to include '1.2.3.4:host1'
|
122
|
+
expect(hosts).to include '5.6.7.8:host2'
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
context 'given a file with hosts by name' do
|
127
|
+
let(:file) { 'hosts_name.json' }
|
128
|
+
let(:container) { Docker::Container.get 'uses_host' }
|
129
|
+
let(:hosts) { container.json['HostConfig']['ExtraHosts'] }
|
130
|
+
let(:perform) { subject }
|
131
|
+
|
132
|
+
after do
|
133
|
+
begin
|
134
|
+
c1 = Docker::Container.get 'uses_host'
|
135
|
+
c1.kill.delete
|
136
|
+
rescue Docker::Error::NotFoundError # rubocop:disable Lint/HandleExceptions
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'should lookup ips for hosts with a hostname', :vcr do
|
141
|
+
perform
|
142
|
+
expect(hosts[0]).to match(/^[0-9\.]+:host1$/)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
context 'given a file with volumes_from' do
|
147
|
+
let(:file) { 'volumes.json' }
|
148
|
+
let(:container) { Docker::Container.get 'mounts_volumes' }
|
149
|
+
let(:volumes_from) { container.json['HostConfig']['VolumesFrom'] }
|
150
|
+
let(:perform) { subject }
|
151
|
+
|
152
|
+
after do
|
153
|
+
begin
|
154
|
+
c1 = Docker::Container.get 'mounts_volumes'
|
155
|
+
c1.kill.delete
|
156
|
+
rescue Docker::Error::NotFoundError # rubocop:disable Lint/HandleExceptions
|
157
|
+
end
|
158
|
+
begin
|
159
|
+
c1 = Docker::Container.get 'exports_volumes'
|
160
|
+
c1.kill.delete
|
161
|
+
rescue Docker::Error::NotFoundError # rubocop:disable Lint/HandleExceptions
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
it 'should pass volumes_from to the right container', :vcr do
|
166
|
+
perform
|
167
|
+
expect(volumes_from).to eq ['exports_volumes']
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'starts the dependant container last', :vcr do
|
171
|
+
running = 0
|
172
|
+
allow(DockerAdapter).to receive(:run).with hash_including(name: 'exports_volumes') do
|
173
|
+
running += 1
|
174
|
+
sleep 1
|
175
|
+
running -= 1
|
176
|
+
end
|
177
|
+
|
178
|
+
expect(DockerAdapter).to receive(:run).with hash_including(name: 'mounts_volumes') do
|
179
|
+
sleep 0.5
|
180
|
+
expect(running).to eq 0
|
181
|
+
end
|
182
|
+
perform
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
context 'given a file with a path' do
|
187
|
+
let(:file) { 'path.json' }
|
188
|
+
let(:container) { Docker::Container.get subject }
|
189
|
+
|
190
|
+
after do
|
191
|
+
container.kill.delete
|
192
|
+
end
|
193
|
+
|
194
|
+
it 'builds the image before starting it', :vcr do
|
195
|
+
skip 'VCR freaks out'
|
196
|
+
expect(DockerAdapter).to receive(:build).
|
197
|
+
with('spec/data/build').and_call_original
|
198
|
+
|
199
|
+
subject
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
context 'given a file with env variables' do
|
204
|
+
let(:file) { 'env.json' }
|
205
|
+
|
206
|
+
it 'passes the environemnt variables to docker' do
|
207
|
+
allow(DockerAdapter).to receive(:remove_container)
|
208
|
+
allow(DockerAdapter).to receive(:image_id_by_tag).with('hawknewton/show-env:0.0.1').
|
209
|
+
and_return 'env-testid'
|
210
|
+
expect(DockerAdapter).to receive(:run).with hash_including(
|
211
|
+
image_id: 'env-testid',
|
212
|
+
env: { 'NAME1' => 'VALUE1', 'NAME2' => 'VALUE2' }
|
213
|
+
)
|
214
|
+
|
215
|
+
subject
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
context 'given a file with ports' do
|
220
|
+
let(:file) { 'ports.json' }
|
221
|
+
|
222
|
+
it 'passes ports to docker' do
|
223
|
+
allow(DockerAdapter).to receive(:remove_container)
|
224
|
+
allow(DockerAdapter).to receive(:image_id_by_tag).with('hawknewton/show-env:0.0.1').
|
225
|
+
and_return 'env-testid'
|
226
|
+
expect(DockerAdapter).to receive(:run).with hash_including(
|
227
|
+
image_id: 'env-testid',
|
228
|
+
ports: ['80:8080', '12345']
|
229
|
+
)
|
230
|
+
|
231
|
+
subject
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
context 'with a file with active profiles' do
|
236
|
+
let(:file) { 'profiles.json' }
|
237
|
+
let(:active_profiles) { ['qa'] }
|
238
|
+
|
239
|
+
after do
|
240
|
+
container = Docker::Container.get 'profiles'
|
241
|
+
container.kill.delete
|
242
|
+
end
|
243
|
+
|
244
|
+
it 'uses the overridden image', :vcr do
|
245
|
+
subject
|
246
|
+
container = Docker::Container.get 'profiles'
|
247
|
+
image = Docker::Image.get 'hawknewton/show-env'
|
248
|
+
expect(container.info['Image']).to eq image.id
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
context 'when activating profiles that do not exist' do
|
253
|
+
let(:file) { 'profiles.json' }
|
254
|
+
let(:active_profiles) { ['notreallyathing'] }
|
255
|
+
|
256
|
+
after do
|
257
|
+
container = Docker::Container.get 'profiles'
|
258
|
+
container.delete force: true
|
259
|
+
end
|
260
|
+
|
261
|
+
it 'ignores the missing profile', :vcr do
|
262
|
+
subject
|
263
|
+
container = Docker::Container.get 'profiles'
|
264
|
+
image = Docker::Image.get 'hawknewton/true'
|
265
|
+
expect(container.info['Image']).to eq image.id
|
266
|
+
end
|
267
|
+
end
|
268
|
+
end
|
269
|
+
end
|
270
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module Bigrig
|
2
|
+
describe ShipAction do
|
3
|
+
subject { described_class.new(file_name, version, false, credentials).perform }
|
4
|
+
let(:dir) { Dir.mktmpdir }
|
5
|
+
let(:version) { '1.2.3' }
|
6
|
+
let(:file) { 'ship.json' }
|
7
|
+
|
8
|
+
before do
|
9
|
+
allow(DockerAdapter).to receive :tag
|
10
|
+
allow(DockerAdapter).to receive :push
|
11
|
+
allow(DockerAdapter).to receive :build
|
12
|
+
end
|
13
|
+
|
14
|
+
around do |example|
|
15
|
+
FileUtils.copy_file test_file(file), File.join(dir, file_name)
|
16
|
+
FileUtils.cp_r "#{test_file('.')}/build", dir
|
17
|
+
Dir.chdir dir do
|
18
|
+
example.run
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'using defaults' do
|
23
|
+
let(:opts) { {} }
|
24
|
+
let(:json) { JSON.parse File.read File.join(dir, 'bigrig-1.2.3.json') }
|
25
|
+
let(:tag) { json['containers']['ship-me']['tag'] }
|
26
|
+
let(:path) { json['containers']['ship-me']['path'] }
|
27
|
+
let(:file_name) { 'bigrig.json' }
|
28
|
+
let(:exists?) { File.exist? File.join(dir, "bigrig-#{version}.json") }
|
29
|
+
let(:credentials) { nil }
|
30
|
+
|
31
|
+
it 'creates a bigrig.json with a version' do
|
32
|
+
subject
|
33
|
+
expect(exists?).to be true
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'adds a tag' do
|
37
|
+
subject
|
38
|
+
expect(tag).to eq '1.2.3'
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'removes the path' do
|
42
|
+
subject
|
43
|
+
expect(path).to be_nil
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'with a different file name' do
|
48
|
+
let(:opts) { {} }
|
49
|
+
let(:credentials) { nil }
|
50
|
+
let(:file_name) { 'custom.json' }
|
51
|
+
let(:exists?) { File.exist? File.join(dir, "custom-#{version}.json") }
|
52
|
+
|
53
|
+
it 'creates a file with that name' do
|
54
|
+
subject
|
55
|
+
expect(exists?).to be true
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'with credentials' do
|
60
|
+
let(:opts) { {} }
|
61
|
+
let(:credentials) do
|
62
|
+
{
|
63
|
+
username: 'user',
|
64
|
+
password: 'pass',
|
65
|
+
email: 'email@email.com'
|
66
|
+
}
|
67
|
+
end
|
68
|
+
let(:file_name) { 'bigrig.json' }
|
69
|
+
|
70
|
+
it 'hands the token to DockerAdapter' do
|
71
|
+
expected = {
|
72
|
+
'username' => 'user',
|
73
|
+
'password' => 'pass',
|
74
|
+
'email' => 'email@email.com',
|
75
|
+
'serveraddress' => 'https://index.docker.io/v1'
|
76
|
+
}
|
77
|
+
expect(DockerAdapter).to receive(:push).with(':1.2.3', expected)
|
78
|
+
subject
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Bigrig
|
2
|
+
describe DependencyGraph do
|
3
|
+
describe '#resolve' do
|
4
|
+
subject { described_class.new(containers).resolve }
|
5
|
+
context 'given two containers, one depending on the other' do
|
6
|
+
let(:containers) do
|
7
|
+
[
|
8
|
+
Container.new(name: 'test2', volumes_from: ['test1']),
|
9
|
+
Container.new(name: 'test1')
|
10
|
+
]
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'resolves in the correct order' do
|
14
|
+
expect(subject.map(&:name)).to match_array %w(test1 test2)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Bigrig
|
2
|
+
describe Descriptor do
|
3
|
+
subject { described_class.read test_file(file), profiles }
|
4
|
+
|
5
|
+
context 'given a simple descriptor' do
|
6
|
+
let(:file) { 'single.json' }
|
7
|
+
let(:tag) { subject.as_json['single-test']['tag'] }
|
8
|
+
let(:repo) { subject.as_json['single-test']['repo'] }
|
9
|
+
let(:profiles) { [] }
|
10
|
+
|
11
|
+
it 'returns JSON' do
|
12
|
+
expect(repo).to eq 'hawknewton/show-env'
|
13
|
+
expect(tag).to eq '0.0.1'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'given a descriptor and an active but missing profile' do
|
18
|
+
let(:file) { 'single.json' }
|
19
|
+
let(:repo) { subject.as_json['single-test']['repo'] }
|
20
|
+
let(:profiles) { ['dev'] }
|
21
|
+
|
22
|
+
it 'returns JSON' do
|
23
|
+
expect(repo).to eq 'hawknewton/show-env'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'given a descriptor with active profiles ' do
|
28
|
+
let(:file) { 'profiles.json' }
|
29
|
+
let(:profiles) { ['qa'] }
|
30
|
+
let(:env_vars) { subject.as_json['profiles']['env'] }
|
31
|
+
let(:repo) { subject.as_json['profiles']['repo'] }
|
32
|
+
|
33
|
+
it 'overrides present ENV values' do
|
34
|
+
expect(env_vars).to include 'NAME1' => 'VALUE1A'
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'leaves existing ENV values alone' do
|
38
|
+
expect(env_vars).to include 'NAME2' => 'VALUE2'
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'also overrides the repo' do
|
42
|
+
expect(repo).to eq 'hawknewton/show-env'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'given a descriptor that adds a container' do
|
47
|
+
let(:file) { 'addscontainer.json' }
|
48
|
+
let(:profiles) { ['new'] }
|
49
|
+
let(:container) { subject.as_json['new'] }
|
50
|
+
|
51
|
+
it 'adds the container' do
|
52
|
+
expect(container).to_not be_nil
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|