dockistrano 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4869a713668f9a34a7ff283320a89025f37be8fc
4
- data.tar.gz: 6cd46f26c5b421a8a1244ff07bc8ee13fc5c9d25
3
+ metadata.gz: 158d3061ea38673eaf98d564749fc35d959d304b
4
+ data.tar.gz: 6c106bbf2921d25169e3c1b0c2ed8e783755fdbd
5
5
  SHA512:
6
- metadata.gz: e3d575c20065873bdd259cce1b1d16c76885c2c3843c7ab8bac87f84fdc901d0b9953abfbf4eff4b73fe6003d66b729aea61b588a19f15ad8397d619e4bfd04f
7
- data.tar.gz: c67764b501790eb79ebf7a7a0f8e21feedef23bf9394b7b7e775c5c8a8430311ff243df252343ddbb5f8086f5780f71e20558dc25e1e4a0b9763b55f540f5f07
6
+ metadata.gz: 9d77e9bfa8f228b922b55d0e874cbd13fecd18a6a9c8ca7c80f25653981615984cd0d3c212afa4fe0ddb93b0181ecba6b2314986103dc990f23186957dbb8063
7
+ data.tar.gz: 6664a8a469961282bcccf1dacf140cc7e68de7b699011e324cad4d89e1fc2d825c0319ee81f66dace7f1bc1783f915c9a7f918f631006e9a28e16b51c859bcae
@@ -81,7 +81,7 @@ module Dockistrano
81
81
 
82
82
  desc "pull", "Pull new versions of dependencies"
83
83
  def pull
84
- current_service.backing_services.each do |name, service|
84
+ current_service.backing_services(initialize: false).each do |name, service|
85
85
  if service.newer_version_available?
86
86
  service.pull
87
87
  say_status "Pulled", name
@@ -77,6 +77,10 @@ module Dockistrano
77
77
  "#{registry}/#{image_name}:#{tag}"
78
78
  end
79
79
 
80
+ def full_image_name_with_fallback
81
+ "#{registry}/#{image_name}:#{tag_with_fallback}"
82
+ end
83
+
80
84
  # Builds a new image for this service
81
85
  def build
82
86
  previous_image_id = image_id
@@ -175,26 +179,28 @@ module Dockistrano
175
179
 
176
180
  # Runs a command in this container
177
181
  def run(command, options={})
178
- Docker.run(full_image_name, command: command, e: environment_variables, v: volumes, p: ports)
182
+ Docker.run(full_image_name_with_fallback, command: command, e: environment_variables, v: volumes, p: ports)
179
183
  end
180
184
 
181
185
  # Executes a command in this container
182
186
  def exec(command, options={})
183
187
  create_data_directories
184
- Docker.exec(full_image_name, command: command, e: environment_variables, v: volumes, p: ports)
188
+ Docker.exec(full_image_name_with_fallback, command: command, e: environment_variables, v: volumes, p: ports)
185
189
  end
186
190
 
187
191
  # Starts a console in the docker container
188
192
  def console(command, options={})
189
193
  create_data_directories
190
- Docker.console(full_image_name, command: command, e: environment_variables, v: volumes, p: ports)
194
+ Docker.console(full_image_name_with_fallback, command: command, e: environment_variables, v: volumes, p: ports)
191
195
  end
192
196
 
193
197
  # Lists all backing services for this service
194
- def backing_services
198
+ def backing_services(options={})
199
+ initialize = options.delete(:initialize)
200
+ initialize = true if initialize.nil?
195
201
  @backing_services ||= {}.tap do |hash|
196
202
  dependencies.collect do |name, config|
197
- hash[name] = ServiceDependency.factory(self, name, config)
203
+ hash[name] = ServiceDependency.factory(self, name, config, initialize)
198
204
  end
199
205
  end
200
206
  end
@@ -215,10 +221,9 @@ module Dockistrano
215
221
  vars["#{name.upcase}_#{k.upcase}"] = v
216
222
  end
217
223
 
218
- vars.merge!(backing_service.environment_variables)
224
+ vars.merge!(backing_service.provided_environment_variables)
219
225
  end
220
226
 
221
- vars.merge!(provides_env)
222
227
  vars.each do |key, value|
223
228
  vars.each do |replacement_key, replacement_value|
224
229
  unless vars[key].nil? or replacement_value.nil?
@@ -230,6 +235,10 @@ module Dockistrano
230
235
  vars
231
236
  end
232
237
 
238
+ def provided_environment_variables
239
+ provides_env
240
+ end
241
+
233
242
  # Returns the mounted volumes for this service
234
243
  def volumes
235
244
  [].tap do |volumes|
@@ -247,7 +256,7 @@ module Dockistrano
247
256
  # Returns a list of available tags in the registry for the image
248
257
  def available_tags
249
258
  @available_tags ||= begin
250
- registry_instance.tags_for_image(full_image_name)
259
+ registry_instance.tags_for_image(image_name)
251
260
  rescue Dockistrano::Registry::RepositoryNotFoundInRegistry
252
261
  []
253
262
  end
@@ -268,7 +277,7 @@ module Dockistrano
268
277
  if final_tag
269
278
  final_tag
270
279
  else
271
- raise NoTagFoundForImage.new("No tag found for image #{image_name}, available tags: #{available_tags}")
280
+ raise NoTagFoundForImage.new("No tag found for image #{image_name}, wanted tag #{tag}, available tags: #{available_tags}")
272
281
  end
273
282
  end
274
283
 
@@ -294,18 +303,18 @@ module Dockistrano
294
303
 
295
304
  def create_data_directories
296
305
  if data_directories.any?
297
- image_config = Docker.inspect_image(full_image_name)
306
+ image_config = Docker.inspect_image(full_image_name_with_fallback)
298
307
  image_user = image_config["container_config"]["User"]
299
308
 
300
309
  command = "mkdir -p #{data_directories.collect { |dir| "/dockistrano/data/#{dir}"}.join(" ") }; "
301
310
  command += "chown #{image_user}:#{image_user} #{data_directories.collect { |dir| "/dockistrano/data/#{dir}"}.join(" ") }"
302
311
  bash_command = "/bin/bash -c '#{command}'"
303
- Docker.run(full_image_name, command: bash_command, v: volumes, e: environment_variables, u: "root")
312
+ Docker.run(full_image_name_with_fallback, command: bash_command, v: volumes, e: environment_variables, u: "root")
304
313
  end
305
314
  end
306
315
 
307
316
  def newer_version_available?
308
- registry_image_id = registry_instance.latest_id_for_image(image_name, tag)
317
+ registry_image_id = registry_instance.latest_id_for_image(image_name, tag_with_fallback)
309
318
  registry_image_id and image_id != registry_image_id
310
319
  end
311
320
 
@@ -5,8 +5,15 @@ module Dockistrano
5
5
  # Creates a new service instance based on the name and configuration. When
6
6
  # configuration is not local, the configuration is fetched from Github and
7
7
  # processed.
8
- def self.factory(service, name, config)
9
- ServiceDependency.new(service, name, config).initialized_backing_service
8
+ # In some cases, you only need an uninitialized version of a dependency, for
9
+ # example when pulling new versions of images. Provide initialize=false to
10
+ # skip tag detection and configuration loading from the image.
11
+ def self.factory(service, name, config, initialize=true)
12
+ if initialize
13
+ ServiceDependency.new(service, name, config).initialized_backing_service
14
+ else
15
+ ServiceDependency.new(service, name, config).backing_service
16
+ end
10
17
  end
11
18
 
12
19
  class DefaultEnvironmentMissingInConfiguration < StandardError
@@ -1,3 +1,3 @@
1
1
  module Dockistrano
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -85,24 +85,28 @@ describe Dockistrano::Cli do
85
85
  let(:command) { ["pull"] }
86
86
 
87
87
  it "pulls a backing service when newer versions are available" do
88
+ expect(service).to receive(:backing_services).with(initialize: false).and_return({ "postgresql" => backing_service })
88
89
  expect(backing_service).to receive(:newer_version_available?).and_return(true)
89
90
  expect(backing_service).to receive(:pull)
90
91
  expect(output).to include("Pulled")
91
92
  end
92
93
 
93
94
  it "doesn't pull a service when no new versions are available" do
95
+ expect(service).to receive(:backing_services).with(initialize: false).and_return({ "postgresql" => backing_service })
94
96
  expect(backing_service).to receive(:newer_version_available?).and_return(false)
95
97
  expect(backing_service).to_not receive(:pull)
96
98
  expect(output).to include("Uptodate")
97
99
  end
98
100
 
99
101
  it "pulls the application container when newer versions are available" do
102
+ expect(service).to receive(:backing_services).with(initialize: false).and_return({ "postgresql" => backing_service })
100
103
  expect(service).to receive(:newer_version_available?).and_return(true)
101
104
  expect(service).to receive(:pull)
102
105
  expect(output).to include("Pulled")
103
106
  end
104
107
 
105
108
  it "doesn't pull the application container when no newer versions are available" do
109
+ expect(service).to receive(:backing_services).with(initialize: false).and_return({ "postgresql" => backing_service })
106
110
  expect(service).to receive(:newer_version_available?).and_return(false)
107
111
  expect(service).to_not receive(:pull)
108
112
  expect(output).to include("Uptodate")
@@ -12,6 +12,12 @@ describe Dockistrano::ServiceDependency do
12
12
  expect(service_dependency).to receive(:initialized_backing_service).and_return(service)
13
13
  expect(described_class.factory(service, "redis", { foo: "bar" })).to eq(service)
14
14
  end
15
+
16
+ it "creates a new service based on the name" do
17
+ expect(described_class).to receive(:new).and_return(service_dependency)
18
+ expect(service_dependency).to receive(:backing_service).and_return(service)
19
+ expect(described_class.factory(service, "redis", { foo: "bar" }, false)).to eq(service)
20
+ end
15
21
  end
16
22
 
17
23
  context "#backing_service" do
@@ -294,32 +294,35 @@ describe Dockistrano::Service do
294
294
 
295
295
  context "#run" do
296
296
  it "runs the command inside the container" do
297
+ allow(subject).to receive(:full_image_name_with_fallback).and_return("image:develop")
297
298
  allow(subject).to receive(:environment_variables).and_return(environment = double)
298
299
  allow(subject).to receive(:volumes).and_return(volumes = double)
299
300
  allow(subject).to receive(:ports).and_return(ports = double)
300
- expect(Dockistrano::Docker).to receive(:run).with(subject.full_image_name, e: environment, v: volumes, p: ports, command: "foobar")
301
+ expect(Dockistrano::Docker).to receive(:run).with(subject.full_image_name_with_fallback, e: environment, v: volumes, p: ports, command: "foobar")
301
302
  subject.run("foobar")
302
303
  end
303
304
  end
304
305
 
305
306
  context "#exec" do
306
307
  it "executes the command inside the container" do
308
+ allow(subject).to receive(:full_image_name_with_fallback).and_return("image:develop")
307
309
  allow(subject).to receive(:environment_variables).and_return(environment = double)
308
310
  allow(subject).to receive(:volumes).and_return(volumes = double)
309
311
  allow(subject).to receive(:ports).and_return(ports = double)
310
312
  expect(subject).to receive(:create_data_directories)
311
- expect(Dockistrano::Docker).to receive(:exec).with(subject.full_image_name, e: environment, v: volumes, p: ports, command: "foobar")
313
+ expect(Dockistrano::Docker).to receive(:exec).with(subject.full_image_name_with_fallback, e: environment, v: volumes, p: ports, command: "foobar")
312
314
  subject.exec("foobar")
313
315
  end
314
316
  end
315
317
 
316
318
  context "#console" do
317
319
  it "runs the command inside the container" do
320
+ allow(subject).to receive(:full_image_name_with_fallback).and_return("image:develop")
318
321
  allow(subject).to receive(:environment_variables).and_return(environment = double)
319
322
  allow(subject).to receive(:volumes).and_return(volumes = double)
320
323
  allow(subject).to receive(:ports).and_return(ports = double)
321
324
  expect(subject).to receive(:create_data_directories)
322
- expect(Dockistrano::Docker).to receive(:console).with(subject.full_image_name, e: environment, v: volumes, p: ports, command: "foobar")
325
+ expect(Dockistrano::Docker).to receive(:console).with(subject.full_image_name_with_fallback, e: environment, v: volumes, p: ports, command: "foobar")
323
326
  subject.console("foobar")
324
327
  end
325
328
  end
@@ -332,9 +335,14 @@ describe Dockistrano::Service do
332
335
  end
333
336
 
334
337
  it "returns a hash with backing services" do
335
- expect(Dockistrano::ServiceDependency).to receive(:factory).with(subject, "postgresql", {}).and_return(service)
338
+ expect(Dockistrano::ServiceDependency).to receive(:factory).with(subject, "postgresql", {}, true).and_return(service)
336
339
  expect(subject.backing_services).to eq({ "postgresql" => service })
337
340
  end
341
+
342
+ it "returns a hash with uninitialized backing services" do
343
+ expect(Dockistrano::ServiceDependency).to receive(:factory).with(subject, "postgresql", {}, false).and_return(service)
344
+ expect(subject.backing_services(initialize: false)).to eq({ "postgresql" => service })
345
+ end
338
346
  end
339
347
 
340
348
  context "#environment_variables" do
@@ -343,7 +351,7 @@ describe Dockistrano::Service do
343
351
  ip_address: "172.0.0.1",
344
352
  port: "1245",
345
353
  backing_service_env: { database: "dockistrano_development" },
346
- environment_variables: { "DATABASE_URL" => "postgres://postgres@$POSTGRESQL_IP/$POSTGRESQL_DATABASE"}
354
+ provided_environment_variables: { "DATABASE_URL" => "postgres://postgres@$POSTGRESQL_IP/$POSTGRESQL_DATABASE"}
347
355
  )
348
356
  }
349
357
 
@@ -368,18 +376,22 @@ describe Dockistrano::Service do
368
376
  end
369
377
 
370
378
  it "includes environment variables from each backing service" do
371
- expect(backing_service).to receive(:environment_variables).and_return({ "SUB_ENV" => "some_value" })
379
+ expect(backing_service).to receive(:provided_environment_variables).and_return({ "SUB_ENV" => "some_value" })
372
380
  expect(subject.environment_variables["SUB_ENV"]).to eq("some_value")
373
381
  end
374
382
 
383
+ it "interpolates environment variables with present values" do
384
+ expect(subject.environment_variables["DATABASE_URL"]).to eq("postgres://postgres@172.0.0.1/dockistrano_development")
385
+ end
386
+ end
387
+
388
+ context "#provided_environment_variables" do
389
+
375
390
  it "includes environment variables that are provided by the service" do
376
391
  expect(subject).to receive(:provides_env).and_return({ "BUNDLE_PATH" => "/bundle" })
377
- expect(subject.environment_variables["BUNDLE_PATH"]).to eq("/bundle")
392
+ expect(subject.provided_environment_variables["BUNDLE_PATH"]).to eq("/bundle")
378
393
  end
379
394
 
380
- it "interpolates environment variables with present values" do
381
- expect(subject.environment_variables["DATABASE_URL"]).to eq("postgres://postgres@172.0.0.1/dockistrano_development")
382
- end
383
395
  end
384
396
 
385
397
  context "#volumes" do
@@ -398,13 +410,13 @@ describe Dockistrano::Service do
398
410
  context "#available_tags" do
399
411
  it "returns a list of available tags for the current service" do
400
412
  expect(subject).to receive(:registry_instance).and_return(registry = double)
401
- expect(registry).to receive(:tags_for_image).with(subject.full_image_name).and_return(["develop", "master"])
413
+ expect(registry).to receive(:tags_for_image).with(subject.image_name).and_return(["develop", "master"])
402
414
  expect(subject.available_tags).to eq(["develop", "master"])
403
415
  end
404
416
 
405
417
  it "returns an empty list when the repository is not found in the registry" do
406
418
  expect(subject).to receive(:registry_instance).and_return(registry = double)
407
- expect(registry).to receive(:tags_for_image).with(subject.full_image_name).and_raise(Dockistrano::Registry::RepositoryNotFoundInRegistry)
419
+ expect(registry).to receive(:tags_for_image).with(subject.image_name).and_raise(Dockistrano::Registry::RepositoryNotFoundInRegistry)
408
420
  expect(subject.available_tags).to eq([])
409
421
  end
410
422
  end
@@ -492,12 +504,13 @@ describe Dockistrano::Service do
492
504
 
493
505
  context "#create_data_directories" do
494
506
  it "creates directories in the mounted data folder" do
507
+ allow(subject).to receive(:full_image_name_with_fallback).and_return("image:develop")
495
508
  allow(subject).to receive(:data_directories).and_return(["logs"])
496
509
  allow(subject).to receive(:volumes).and_return(volumes = double)
497
510
  allow(subject).to receive(:environment_variables).and_return(environment_variables = double)
498
- allow(Dockistrano::Docker).to receive(:inspect_image).with(subject.full_image_name).and_return({ "container_config" => { "User" => "app" }})
511
+ allow(Dockistrano::Docker).to receive(:inspect_image).with(subject.full_image_name_with_fallback).and_return({ "container_config" => { "User" => "app" }})
499
512
 
500
- expect(Dockistrano::Docker).to receive(:run).with(subject.full_image_name,
513
+ expect(Dockistrano::Docker).to receive(:run).with(subject.full_image_name_with_fallback,
501
514
  v: volumes,
502
515
  e: environment_variables,
503
516
  u: "root",
@@ -513,22 +526,23 @@ describe Dockistrano::Service do
513
526
 
514
527
  before do
515
528
  allow(subject).to receive(:registry_instance).and_return(registry_instance)
529
+ allow(subject).to receive(:tag_with_fallback).and_return("develop")
516
530
  end
517
531
 
518
532
  it "returns true when a newer version of the image is available" do
519
533
  expect(subject).to receive(:image_id).and_return("1")
520
- expect(registry_instance).to receive(:latest_id_for_image).with(subject.image_name, subject.tag).and_return("2")
534
+ expect(registry_instance).to receive(:latest_id_for_image).with(subject.image_name, subject.tag_with_fallback).and_return("2")
521
535
  expect(subject.newer_version_available?).to be_true
522
536
  end
523
537
 
524
538
  it "returns false when no registry image id is found" do
525
- expect(registry_instance).to receive(:latest_id_for_image).with(subject.image_name, subject.tag).and_return(nil)
539
+ expect(registry_instance).to receive(:latest_id_for_image).with(subject.image_name, subject.tag_with_fallback).and_return(nil)
526
540
  expect(subject.newer_version_available?).to be_false
527
541
  end
528
542
 
529
543
  it "returns false when the registry image id is equal to the local id" do
530
544
  expect(subject).to receive(:image_id).and_return("1")
531
- expect(registry_instance).to receive(:latest_id_for_image).with(subject.image_name, subject.tag).and_return("1")
545
+ expect(registry_instance).to receive(:latest_id_for_image).with(subject.image_name, subject.tag_with_fallback).and_return("1")
532
546
  expect(subject.newer_version_available?).to be_false
533
547
  end
534
548
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dockistrano
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edwin Vlieg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-25 00:00:00.000000000 Z
11
+ date: 2013-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor