dockistrano 0.0.6 → 0.0.7

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: 91762ce1db149fa71eab678c80fbc5c7e60c5cbd
4
- data.tar.gz: 28d8236dcd51b0d5235fb3ef62252514064d07c2
3
+ metadata.gz: b35d583a8fab01a67cce0aaa48b6991bf37ade7a
4
+ data.tar.gz: 2b732ea55ec66f519e2c1e78c111d846849f153f
5
5
  SHA512:
6
- metadata.gz: eec347010dcdec6e2db6ba72799be478aa41dff197cb2360849d20ad66a1ca205af2f817ade16b7369d5fbb3f193f89005a3ff1900455e23a18c879845f66196
7
- data.tar.gz: a52f46d46ef9510b6a6a8dd7c23db0a67531958dc9f9e0731c14a73d7b795a53e4a358cf016892692c28de1d642430e7847fad54ff6bf252f2cc0c1e0ec3dbd6
6
+ metadata.gz: 0be8f640a0a35ab5529ca25b34328fb299a98ad579f4e8510592023c3c8fb6b6d98a3d7d5d30a427040567be62cca1f29ed8e23a35c5503ef884fd4cec5fa9db
7
+ data.tar.gz: b8125c8ddd5c22d9e5e4922a984fbe5014316216daffb3cffb8e19cb9a75079d822fe5c3037dbd078608b6b0a97bafb38a3a6146d92952fdef4a75de2a013da2
@@ -17,8 +17,7 @@ module Dockistrano
17
17
  desc "setup", "Sets up a host for starting the application"
18
18
  method_option "environment", aliases: "-e", default: ENV["DOCKISTRANO_ENVIRONMENT"], type: :string, desc: "Environment to start the container in"
19
19
  def setup
20
- say "Please execute the following command on the host to setup", :green
21
- say "\tmkdir -p #{current_service.directories_required_on_host.join(" ")}"
20
+ `mkdir -p #{current_service.directories_required_on_host.join(" ")}`
22
21
  end
23
22
 
24
23
  desc "status", "Status of the application"
@@ -39,17 +38,23 @@ module Dockistrano
39
38
  say ""
40
39
  say "Dependencies", :blue
41
40
  current_service.backing_services.each do |name, service|
42
- say " #{service.full_image_name}"
41
+ if service.running?
42
+ say_status "online", "#{service.full_image_name}", :green
43
+ else
44
+ say_status "offline", "#{service.full_image_name}", :red
45
+ end
43
46
  end
44
47
  say ""
45
48
  say "Environment", :blue
46
49
  current_service.environment_variables.each do |key, value|
47
50
  say " #{key}=#{value}"
48
51
  end
49
- say ""
50
- say "Hipache", :blue
51
- Hipache.new(ENV["DOCKER_HOST_IP"]).status.each do |host, ips|
52
- say " #{host}: #{ips.join(", ")}"
52
+ if current_service.backing_services["hipache"] and redis_url = current_service.backing_services["hipache"].ip_address
53
+ say ""
54
+ say "Hipache", :blue
55
+ Hipache.new("redis://#{redis_url}:6379").status.each do |host, ips|
56
+ say " #{host}: #{ips.join(", ")}"
57
+ end
53
58
  end
54
59
  say ""
55
60
  end
@@ -4,8 +4,8 @@ module Dockistrano
4
4
 
5
5
  class Hipache
6
6
 
7
- def initialize(hipache_ip)
8
- @hipache_ip = hipache_ip
7
+ def initialize(hipache_url)
8
+ @hipache_url = hipache_url
9
9
  end
10
10
 
11
11
  def online?
@@ -55,7 +55,7 @@ module Dockistrano
55
55
  private
56
56
 
57
57
  def redis
58
- @redis ||= Redis.new(host: @hipache_ip, port: 16379)
58
+ @redis ||= Redis.new(url: @hipache_url)
59
59
  end
60
60
 
61
61
  end
@@ -37,7 +37,7 @@ module Dockistrano
37
37
  def config=(config)
38
38
  @config = config
39
39
  @dependencies = config["dependencies"] || {}
40
- @image_name ||= config["image_name"] || Git.repository_name
40
+ @image_name ||= (config["image_name"] || Git.repository_name).gsub(/\-/, "_").gsub(/\./, "")
41
41
  @tag ||= config["tag"] || Git.branch
42
42
  @registry ||= config["registry"]
43
43
  @host ||= config["host"]
@@ -147,13 +147,13 @@ module Dockistrano
147
147
  end
148
148
 
149
149
  def update_hipache(server_up=true)
150
- if !host.nil?
151
- hipache = Hipache.new(ENV['DOCKER_HOST_IP'])
150
+ if !host.nil? and (redis_url = backing_services["hipache"].ip_address)
151
+ hipache = Hipache.new("redis://#{redis_url}:6379")
152
152
  host.each do |hostname, port|
153
153
  if server_up
154
- hipache.register(image_name, hostname, ip_address_for_port(port), port)
154
+ hipache.register(image_name, hostname, ip_address, port)
155
155
  else
156
- hipache.unregister(image_name, hostname, ip_address_for_port(port), port)
156
+ hipache.unregister(image_name, hostname, ip_address, port)
157
157
  end
158
158
  end
159
159
  end
@@ -260,7 +260,7 @@ module Dockistrano
260
260
  end
261
261
 
262
262
  # Returns a list of available tags in the registry for the image
263
- def available_tags
263
+ def available_tags_in_registry
264
264
  @available_tags ||= begin
265
265
  registry_instance.tags_for_image(image_name)
266
266
  rescue Dockistrano::Registry::RepositoryNotFoundInRegistry
@@ -268,6 +268,10 @@ module Dockistrano
268
268
  end
269
269
  end
270
270
 
271
+ def available_tags_local
272
+ @available_tags_local ||= Docker.tags_for_image("#{registry}/#{image_name}")
273
+ end
274
+
271
275
  class NoTagFoundForImage < StandardError
272
276
  end
273
277
 
@@ -277,28 +281,22 @@ module Dockistrano
277
281
 
278
282
  begin
279
283
  tag_suggestion = fallback_tags.shift
280
- final_tag = tag_suggestion if available_tags.include?(tag_suggestion)
284
+ final_tag = tag_suggestion if available_tags_local.include?(tag_suggestion)
281
285
  end while !final_tag and fallback_tags.any?
282
286
 
283
287
  if final_tag
284
288
  final_tag
285
289
  else
286
- raise NoTagFoundForImage.new("No tag found for image #{image_name}, wanted tag #{tag}, available tags: #{available_tags}")
290
+ raise NoTagFoundForImage.new("No tag found for image #{image_name}, wanted tag #{tag}, available tags: #{available_tags_local}")
287
291
  end
288
292
  end
289
293
 
290
- def ip_address_for_port(port)
291
- container_settings["NetworkSettings"]["Ports"]["#{port}/tcp"].first["HostIp"] if running?
294
+ def ip_address
295
+ container_settings["NetworkSettings"]["IPAddress"] if running?
292
296
  end
293
297
 
294
298
  def ports
295
- (config["ports"] || {}).collect { |k,v|
296
- if k.to_s.include?(":")
297
- "#{k}:#{v}"
298
- else
299
- "172.17.42.1:#{k}:#{v}"
300
- end
301
- }
299
+ (config["ports"] || [])
302
300
  end
303
301
 
304
302
  def attach(name=nil)
@@ -1,3 +1,3 @@
1
1
  module Dockistrano
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -5,6 +5,7 @@ describe Dockistrano::Cli do
5
5
  let(:service) { double(registry: "registry.provider.tld", image_name: "application", tag: "develop", volumes: [], backing_services: { "postgresql" => backing_service }, environment_variables: {}, newer_version_available?: false, stop: nil) }
6
6
  let(:backing_service) { double(:backing_service, full_image_name: "registry.provider.tld/postgresql:develop", image_name: "postgresql", running?: false, newer_version_available?: false, start: nil, stop: nil) }
7
7
  let(:hipache) { double }
8
+ let(:hipache_service) { double(running?: true, full_image_name: "hipache") }
8
9
  let(:output) { capture(:stdout) { described_class.start(command) } }
9
10
 
10
11
  before do
@@ -48,7 +49,9 @@ describe Dockistrano::Cli do
48
49
  end
49
50
 
50
51
  it "lists the Hipache configuration" do
51
- allow(Dockistrano::Hipache).to receive(:new).with("127.0.0.1").and_return(hipache)
52
+ allow(service).to receive(:backing_services).and_return({ "hipache" => hipache_service })
53
+ allow(hipache_service).to receive(:ip_address).and_return("127.0.0.1")
54
+ allow(Dockistrano::Hipache).to receive(:new).with("redis://127.0.0.1:6379").and_return(hipache)
52
55
  allow(hipache).to receive(:status).and_return({ "somehostname.dev" => ["127.0.0.1:1000", "23.45.56.75:1234"] })
53
56
  expect(output).to include("somehostname.dev: 127.0.0.1:1000, 23.45.56.75:1234")
54
57
  end
@@ -242,21 +242,24 @@ describe Dockistrano::Service do
242
242
 
243
243
  context "#update_hipache" do
244
244
  let(:hipache) { double }
245
+ let(:hipache_service) { double }
245
246
 
246
247
  before do
247
248
  allow(Dockistrano::Hipache).to receive(:new).and_return(hipache)
249
+ allow(subject).to receive(:backing_services).and_return({ "hipache" => hipache_service })
250
+ allow(hipache_service).to receive(:ip_address).and_return("172.168.1.1")
248
251
  end
249
252
 
250
253
  it "registers the host in Hipache when the server is up" do
251
254
  allow(subject).to receive(:host).and_return({ "hostname.dev" => "8000" })
252
- expect(subject).to receive(:ip_address_for_port).with("8000").and_return("33.33.33.33")
255
+ expect(subject).to receive(:ip_address).and_return("33.33.33.33")
253
256
  expect(hipache).to receive(:register).with(subject.image_name, "hostname.dev", "33.33.33.33", "8000")
254
257
  subject.update_hipache(true)
255
258
  end
256
259
 
257
260
  it "unregisters the host in Hipache when the server is down" do
258
261
  allow(subject).to receive(:host).and_return({ "hostname.dev" => "8000" })
259
- expect(subject).to receive(:ip_address_for_port).with("8000").and_return("33.33.33.33")
262
+ expect(subject).to receive(:ip_address).and_return("33.33.33.33")
260
263
  expect(hipache).to receive(:unregister).with(subject.image_name, "hostname.dev", "33.33.33.33", "8000")
261
264
  subject.update_hipache(false)
262
265
  end
@@ -431,75 +434,79 @@ describe Dockistrano::Service do
431
434
 
432
435
  context "#directories_required_on_host"
433
436
 
434
- context "#available_tags" do
437
+ context "#available_tags_in_registry" do
435
438
  it "returns a list of available tags for the current service" do
436
439
  expect(subject).to receive(:registry_instance).and_return(registry = double)
437
440
  expect(registry).to receive(:tags_for_image).with(subject.image_name).and_return(["develop", "master"])
438
- expect(subject.available_tags).to eq(["develop", "master"])
441
+ expect(subject.available_tags_in_registry).to eq(["develop", "master"])
439
442
  end
440
443
 
441
444
  it "returns an empty list when the repository is not found in the registry" do
442
445
  expect(subject).to receive(:registry_instance).and_return(registry = double)
443
446
  expect(registry).to receive(:tags_for_image).with(subject.image_name).and_raise(Dockistrano::Registry::RepositoryNotFoundInRegistry)
444
- expect(subject.available_tags).to eq([])
447
+ expect(subject.available_tags_in_registry).to eq([])
448
+ end
449
+ end
450
+
451
+ context "#available_tags_local" do
452
+ it "returns a list of available tags for the current service" do
453
+ expect(Dockistrano::Docker).to receive(:tags_for_image).with("#{subject.registry}/#{subject.image_name}").and_return(["develop", "master"])
454
+ expect(subject.available_tags_local).to eq(["develop", "master"])
445
455
  end
446
456
  end
447
457
 
448
458
  context "#tag_with_fallback" do
449
459
  it "uses the feature branch when available" do
450
460
  allow(subject).to receive(:tag).and_return("feature_branch")
451
- allow(subject).to receive(:available_tags).and_return(["develop", "master", "feature_branch"])
461
+ allow(subject).to receive(:available_tags_local).and_return(["develop", "master", "feature_branch"])
452
462
  expect(subject.tag_with_fallback).to eq("feature_branch")
453
463
  end
454
464
 
455
465
  it "uses the develop branch when available" do
456
466
  allow(subject).to receive(:tag).and_return("feature_branch")
457
- allow(subject).to receive(:available_tags).and_return(["develop", "master", "latest"])
467
+ allow(subject).to receive(:available_tags_local).and_return(["develop", "master", "latest"])
458
468
  expect(subject.tag_with_fallback).to eq("develop")
459
469
  end
460
470
 
461
471
  it "uses the master branch when available" do
462
472
  allow(subject).to receive(:tag).and_return("feature_branch")
463
- allow(subject).to receive(:available_tags).and_return(["master", "latest"])
473
+ allow(subject).to receive(:available_tags_local).and_return(["master", "latest"])
464
474
  expect(subject.tag_with_fallback).to eq("master")
465
475
  end
466
476
 
467
477
  it "uses the latest branch when available" do
468
478
  allow(subject).to receive(:tag).and_return("feature_branch")
469
- allow(subject).to receive(:available_tags).and_return(["latest"])
479
+ allow(subject).to receive(:available_tags_local).and_return(["latest"])
470
480
  expect(subject.tag_with_fallback).to eq("latest")
471
481
  end
472
482
 
473
483
  it "raises an error when no tags are found" do
474
484
  allow(subject).to receive(:tag).and_return("feature_branch")
475
- allow(subject).to receive(:available_tags).and_return(["foobar", "test"])
485
+ allow(subject).to receive(:available_tags_local).and_return(["foobar", "test"])
476
486
  expect { subject.tag_with_fallback }.to raise_error(Dockistrano::Service::NoTagFoundForImage)
477
487
  end
478
488
  end
479
489
 
480
- context "#ip_address_for_port" do
481
- it "returns the ip address at which the port is listening" do
490
+ context "#ip_address" do
491
+ it "returns the ip address of the running container" do
482
492
  allow(subject).to receive(:running?).and_return(true)
483
- allow(subject).to receive(:container_settings).and_return({ "NetworkSettings" => { "Ports" => {
484
- "3000/tcp" => [
485
- {
486
- "HostIp" => "127.0.0.1",
487
- "HostPort" => "3000"
488
- }
489
- ]
490
- }}})
491
- expect(subject.ip_address_for_port(3000)).to eq("127.0.0.1")
493
+ allow(subject).to receive(:container_settings).and_return({
494
+ "NetworkSettings" => {
495
+ "IPAddress" => "172.168.1.1"
496
+ }
497
+ })
498
+ expect(subject.ip_address).to eq("172.168.1.1")
492
499
  end
493
500
  end
494
501
 
495
502
  context "#ports" do
496
503
  it "returns a string representation of the port mappings" do
497
- subject.config = { "ports" => { "1234" => "5678" } }
498
- expect(subject.ports).to eq(["172.17.42.1:1234:5678"])
504
+ subject.config = { "ports" => [ "1234:5678" ] }
505
+ expect(subject.ports).to eq(["1234:5678"])
499
506
  end
500
507
 
501
508
  it "returns the ip address included in the configuration" do
502
- subject.config = { "ports" => { "33.33.33.10:1234" => "5678" } }
509
+ subject.config = { "ports" => [ "33.33.33.10:1234:5678" ] }
503
510
  expect(subject.ports).to eq(["33.33.33.10:1234:5678"])
504
511
  end
505
512
  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.6
4
+ version: 0.0.7
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-11-05 00:00:00.000000000 Z
11
+ date: 2013-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor