docker-armada 2.0.53

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.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.travis.yml +5 -0
  4. data/Gemfile +5 -0
  5. data/LICENSE +20 -0
  6. data/README.md +293 -0
  7. data/Rakefile +9 -0
  8. data/Thorfile +1 -0
  9. data/armada.gemspec +37 -0
  10. data/bin/armada +5 -0
  11. data/lib/armada.rb +37 -0
  12. data/lib/armada/clean.rb +2 -0
  13. data/lib/armada/clean/containers.rb +30 -0
  14. data/lib/armada/clean/images.rb +29 -0
  15. data/lib/armada/cli.rb +40 -0
  16. data/lib/armada/cli/clean.rb +23 -0
  17. data/lib/armada/cli/deploy.rb +32 -0
  18. data/lib/armada/cli/inspect.rb +28 -0
  19. data/lib/armada/configuration.rb +33 -0
  20. data/lib/armada/connection.rb +3 -0
  21. data/lib/armada/connection/docker.rb +22 -0
  22. data/lib/armada/connection/health_check.rb +66 -0
  23. data/lib/armada/connection/remote.rb +26 -0
  24. data/lib/armada/deploy.rb +2 -0
  25. data/lib/armada/deploy/parallel.rb +58 -0
  26. data/lib/armada/deploy/rolling.rb +60 -0
  27. data/lib/armada/deploy_dsl.rb +156 -0
  28. data/lib/armada/docker.rb +6 -0
  29. data/lib/armada/docker/config.rb +55 -0
  30. data/lib/armada/docker/container.rb +120 -0
  31. data/lib/armada/docker/host.rb +68 -0
  32. data/lib/armada/docker/image.rb +86 -0
  33. data/lib/armada/thor.rb +1 -0
  34. data/lib/armada/ui.rb +15 -0
  35. data/lib/armada/utils.rb +2 -0
  36. data/lib/armada/utils/array.rb +9 -0
  37. data/lib/armada/utils/time.rb +23 -0
  38. data/lib/armada/version.rb +3 -0
  39. data/spec/connection/health_check_spec.rb +36 -0
  40. data/spec/deploy_dsl_spec.rb +84 -0
  41. data/spec/docker/container_spec.rb +124 -0
  42. data/spec/docker/image_spec.rb +110 -0
  43. data/spec/spec_helper.rb +12 -0
  44. metadata +289 -0
@@ -0,0 +1 @@
1
+ require 'armada/cli'
data/lib/armada/ui.rb ADDED
@@ -0,0 +1,15 @@
1
+ module Armada
2
+ module UI
3
+ def info(message, color = :green)
4
+ say(message, color)
5
+ end
6
+
7
+ def warn(message, color = :yellow)
8
+ say(message, color)
9
+ end
10
+
11
+ def error(message, color = :red)
12
+ say(message, color)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,2 @@
1
+ require_relative 'utils/time'
2
+ require_relative 'utils/array'
@@ -0,0 +1,9 @@
1
+ class Array
2
+ def each_in_parallel(&block)
3
+ threads = map do |s|
4
+ Thread.new { block.call(s) }
5
+ end
6
+
7
+ threads.each { |t| t.join }
8
+ end
9
+ end
@@ -0,0 +1,23 @@
1
+ class Time
2
+ def self.seconds_to_string(s)
3
+ # d = days, h = hours, m = minutes, s = seconds
4
+ m = (s / 60).floor
5
+ s = s % 60
6
+ h = (m / 60).floor
7
+ m = m % 60
8
+ d = (h / 24).floor
9
+ h = h % 24
10
+
11
+ output = "#{s} second#{Time.pluralize(s)}" if (s > 0)
12
+ output = "#{m} minute#{Time.pluralize(m)}, #{s} second#{Time.pluralize(s)}" if (m > 0)
13
+ output = "#{h} hour#{Time.pluralize(h)}, #{m} minute#{Time.pluralize(m)}, #{s} second#{Time.pluralize(s)}" if (h > 0)
14
+ output = "#{d} day#{Time.pluralize(d)}, #{h} hour#{Time.pluralize(h)}, #{m} minute#{Time.pluralize(m)}, #{s} second#{Time.pluralize(s)}" if (d > 0)
15
+
16
+ return output
17
+ end
18
+
19
+ def self.pluralize number
20
+ return "s" unless number == 1
21
+ return ""
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module Armada
2
+ VERSION = IO.read(File.join(File.dirname(__FILE__), '..', '..', 'VERSION')) rescue "0.0.1"
3
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Armada::Connection::HealthCheck do
4
+
5
+ describe ".healthy?" do
6
+ context "when the container health check passes" do
7
+ subject { Armada::Connection::HealthCheck.new("foo-01", 2181) }
8
+ let(:mock_ok_status) { double('http_status_ok').tap { |s| s.stub(status: 200) } }
9
+ before { expect(Excon).to receive(:get).with(any_args).and_return(mock_ok_status) }
10
+
11
+ it "should return true" do
12
+ subject.healthy?.should be_true
13
+ end
14
+ end
15
+
16
+ context "when the container health check fails" do
17
+ subject { Armada::Connection::HealthCheck.new("foo-01", 2181) }
18
+ let(:mock_bad_status) { double('http_status_ok').tap { |s| s.stub(status: 500) } }
19
+ before { expect(Excon).to receive(:get).with(any_args).and_return(mock_bad_status) }
20
+
21
+ it "should return false" do
22
+ subject.healthy?.should be_false
23
+ end
24
+ end
25
+
26
+ context "when the container health check throws an error" do
27
+ subject { Armada::Connection::HealthCheck.new("foo-01", 2181) }
28
+ before { expect(Excon).to receive(:get).with(any_args).and_raise(Excon::Errors::SocketError.new(RuntimeError.new())) }
29
+
30
+ it "should return false" do
31
+ subject.healthy?.should be_false
32
+ end
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ class DeployDSLTest
4
+ extend Armada::DeployDSL
5
+ end
6
+
7
+ describe Armada::DeployDSL do
8
+ before do
9
+ DeployDSLTest.clear_env
10
+ DeployDSLTest.set_current_environment('test')
11
+ end
12
+
13
+ it 'adds new env_vars to the existing ones' do
14
+ DeployDSLTest.set(:env_vars, { 'SHAKESPEARE' => 'Hamlet' })
15
+ DeployDSLTest.env_vars('DICKENS' => 'David Copperfield')
16
+
17
+ expect(DeployDSLTest.fetch(:env_vars)).to include('SHAKESPEARE' => 'Hamlet', 'DICKENS' => 'David Copperfield')
18
+ end
19
+
20
+ it 'adds hosts to the host list' do
21
+ DeployDSLTest.set(:hosts, [ 'host1' ])
22
+ DeployDSLTest.host('host2')
23
+ expect(DeployDSLTest.fetch(:hosts)).to include("host1", "host2")
24
+ end
25
+
26
+ it 'adds the restart policy' do
27
+ DeployDSLTest.restart_policy({:foo => "bar"})
28
+ expect(DeployDSLTest.fetch(:restart_policy)).to eq({:foo => "bar"})
29
+ end
30
+
31
+ describe '#localhost' do
32
+ it 'adds a host by reading DOCKER_HOST if present' do
33
+ expect(ENV).to receive(:[]).with('DOCKER_HOST').and_return('tcp://127.1.1.1:4240')
34
+ DeployDSLTest.localhost
35
+ expect(DeployDSLTest.fetch(:hosts)).to include("127.1.1.1:4240")
36
+ end
37
+
38
+ it 'adds a host defaulting to loopback if DOCKER_HOST is not present' do
39
+ expect(ENV).to receive(:[]).with('DOCKER_HOST').and_return(nil)
40
+ DeployDSLTest.localhost
41
+ expect(DeployDSLTest.fetch(:hosts)).to include("127.0.0.1")
42
+ end
43
+ end
44
+
45
+ describe '#host_port' do
46
+ it 'raises unless passed container_port in the options' do
47
+ expect { DeployDSLTest.host_port(666, {}) }.to raise_error(ArgumentError, /:container_port/)
48
+ end
49
+
50
+ it 'adds new bind ports to the list' do
51
+ dummy_value = { '666/tcp' => ['value'] }
52
+ DeployDSLTest.set(:port_bindings, dummy_value)
53
+ DeployDSLTest.host_port(999, container_port: 80)
54
+
55
+ expect(DeployDSLTest.fetch(:port_bindings)).to include(dummy_value.merge('80/tcp' => [{ 'HostIp' => '0.0.0.0', 'HostPort' => '999' }]))
56
+ end
57
+
58
+ it 'does not explode if port_bindings is empty' do
59
+ expect { DeployDSLTest.host_port(999, container_port: 80) }.not_to raise_error
60
+ end
61
+
62
+ it 'raises if invalid options are passed' do
63
+ expect { DeployDSLTest.host_port(80, asdf: 'foo') }.to raise_error(ArgumentError, /invalid key!/)
64
+ end
65
+ end
66
+
67
+ describe '#host_volume' do
68
+ it 'raises unless passed the container_volume option' do
69
+ expect { DeployDSLTest.host_volume('foo', {}) }.to raise_error(ArgumentError, /:container_volume/)
70
+ end
71
+
72
+ it 'raises when passed bogus options' do
73
+ expect { DeployDSLTest.host_volume('foo', bogus: 1) }.to raise_error(ArgumentError, /invalid key!/)
74
+ end
75
+
76
+ it 'adds new host volumes' do
77
+ expect(DeployDSLTest.fetch(:binds)).to be_nil
78
+ DeployDSLTest.host_volume('volume1', container_volume: '/dev/sdd')
79
+ DeployDSLTest.host_volume('volume2', container_volume: '/dev/sde')
80
+ expect(DeployDSLTest.fetch(:binds)).to eq %w{ volume1:/dev/sdd volume2:/dev/sde }
81
+ end
82
+ end
83
+
84
+ end
@@ -0,0 +1,124 @@
1
+ require 'spec_helper'
2
+
3
+ describe Armada::Container do
4
+ let(:container_name) { "some_container" }
5
+ let(:container_id) { "123456789abc123" }
6
+ let(:image_id) { "123456789abc123" }
7
+ let(:image_name) { "quay.io/someorg/someimage" }
8
+ let(:tag) { "latest" }
9
+ let(:options) {{
10
+ :container_name => container_name,
11
+ :image => image_name,
12
+ :tag => tag
13
+ }}
14
+
15
+ let(:docker_host) { Armada::Host.create("http://foo-01:4243") }
16
+ let(:docker_connection) { ::Docker::Connection.new("http://foo-01:4243", {})}
17
+ let(:armada_image) { Armada::Image.new(docker_host, options) }
18
+ let(:docker_image) { ::Docker::Image.new(docker_connection, "id" => image_id) }
19
+ let(:docker_container) { ::Docker::Container.send(:new, docker_connection, {'id' => container_id, 'Names' => ["/#{container_name}"]}) }
20
+ let(:armada_container) { Armada::Container.new(armada_image, docker_host, options) }
21
+ let(:config) {{
22
+ :port_bindings => { "1111/tcp" => [{"HostIp" => "0.0.0.0", "HostPort" => "1111"}],
23
+ "2222/udp" => [{"HostIp" => "0.0.0.0", "HostPort" => "2222"}]},
24
+ :env_vars => { "KEY" => "VALUE" },
25
+ :binds => [ "/host/log:/container/log" ],
26
+ :restart_policy => { "MaximumRetryCount" => 5, "Name" => "always" }
27
+ }}
28
+
29
+ describe "#stop" do
30
+ context "when the container exists" do
31
+ before { docker_host.should_receive(:get_container).and_return(docker_container) }
32
+ it "should call kill and remove" do
33
+ expect(armada_container).to receive(:kill)
34
+ expect(armada_container).to receive(:remove)
35
+ armada_container.stop
36
+ end
37
+ end
38
+
39
+ context "when the container does not exist" do
40
+ before { docker_host.should_receive(:get_container).and_return(nil) }
41
+ it "should not call kill and remove" do
42
+ expect(armada_container).not_to receive(:kill)
43
+ expect(armada_container).not_to receive(:remove)
44
+ expect(Armada.ui).to receive(:warn).with(/No container found with the name/)
45
+ armada_container.stop
46
+ end
47
+ end
48
+ end
49
+
50
+ describe "#kill" do
51
+ context "when the container exists" do
52
+ before { docker_host.should_receive(:get_container).and_return(docker_container) }
53
+ it "should call kill on the container" do
54
+ expect(armada_container.container).to receive(:kill)
55
+ armada_container.kill
56
+ end
57
+
58
+ it "should call kill on the docker container" do
59
+ expect(docker_container).to receive(:kill)
60
+ armada_container.kill
61
+ end
62
+ end
63
+
64
+ context "when the container does not exist" do
65
+ before { docker_host.should_receive(:get_container).and_return(nil) }
66
+ it "should not call kill" do
67
+ allow_message_expectations_on_nil
68
+ expect(armada_container.container).not_to receive(:kill)
69
+ armada_container.kill
70
+ end
71
+ end
72
+ end
73
+
74
+ describe "#remove" do
75
+ context "when the container exists" do
76
+ before { docker_host.should_receive(:get_container).and_return(docker_container) }
77
+ it "should call remove on the container" do
78
+ expect(armada_container.container).to receive(:remove)
79
+ armada_container.remove
80
+ end
81
+
82
+ it "should call remove on the docker container" do
83
+ expect(docker_container).to receive(:remove)
84
+ armada_container.remove
85
+ end
86
+
87
+ it "should catch any exception that is thrown" do
88
+ expect(docker_container).to receive(:remove).and_raise(Exception.new("Could not remove container"))
89
+ expect(Armada.ui).to receive(:error).with(/Could not remove container/)
90
+ armada_container.remove
91
+ end
92
+ end
93
+
94
+ context "when the container does not exist" do
95
+ before { docker_host.should_receive(:get_container).and_return(nil) }
96
+ it "should not call remove" do
97
+ allow_message_expectations_on_nil
98
+ expect(armada_container.container).not_to receive(:remove)
99
+ armada_container.remove
100
+ end
101
+ end
102
+ end
103
+
104
+ describe ".create_container_config" do
105
+ subject { Armada::Container.create_container_config(image_id, container_name, "hostname", config) }
106
+ it { should include("Image" => "123456789abc123") }
107
+ it { should include("Hostname" => "hostname") }
108
+ it { should include("name" => "some_container") }
109
+ it { should include("ExposedPorts" => { "1111/tcp" => {}, "2222/udp" => {}}) }
110
+ it { should include("Env" => ["KEY=VALUE"]) }
111
+ it { should include("Volumes" => { "/container/log" => {}}) }
112
+ it { should include("VolumesFrom" => "parent") }
113
+ it { should include("RestartPolicy" => { "MaximumRetryCount" => 5, "Name" => "always" }) }
114
+ end
115
+
116
+ describe ".create_host_config" do
117
+ subject { Armada::Container.create_host_config(config) }
118
+ it { should include("Binds" => ["/host/log:/container/log"])}
119
+ it { should include("PortBindings" => {"1111/tcp" => [{"HostIp" => "0.0.0.0", "HostPort" => "1111"}],
120
+ "2222/udp" => [{"HostIp" => "0.0.0.0", "HostPort" => "2222"}]}) }
121
+ it { should include("PublishAllPorts" => true) }
122
+ end
123
+
124
+ end
@@ -0,0 +1,110 @@
1
+ require 'spec_helper'
2
+
3
+ describe Armada::Image do
4
+ let(:image_id) { "123456789abc123" }
5
+ let(:image_name) { "quay.io/someorg/someimage" }
6
+ let(:tag) { "latest" }
7
+ let(:pull) { true }
8
+ let(:credentials) {
9
+ Armada::Docker::Credentials.new image_name, 'username', 'password', 'email'
10
+ }
11
+ let(:dockercfg) {
12
+ Armada::Docker::Config.new [credentials]
13
+ }
14
+ let(:options) {{
15
+ :image => image_name,
16
+ :tag => tag,
17
+ :pull => pull
18
+ }}
19
+
20
+ let(:docker_host) { Armada::Host.create("foo-01:4243") }
21
+ let(:docker_connection) { ::Docker::Connection.new("http://foo-01", {}) }
22
+ let(:armada_image) { Armada::Image.new(docker_host, options) }
23
+ let(:docker_image) { ::Docker::Image.new(docker_connection, "id" => image_id) }
24
+
25
+ describe "#pull" do
26
+ context "when pull is false" do
27
+ let(:pull) { false }
28
+
29
+ it "should not call Docker::Image.create" do
30
+ options.merge!({
31
+ :docker_image => docker_image,
32
+ :id => image_id
33
+ })
34
+ expect(Docker::Image).not_to receive(:create)
35
+ armada_image.pull
36
+
37
+ expect(armada_image.id).to be(image_id)
38
+ expect(armada_image.image).to be(docker_image)
39
+ end
40
+
41
+ it { expect { armada_image.pull }.to raise_error }
42
+ end
43
+
44
+ context "when pull is true" do
45
+ it "should call Docker::Image.create" do
46
+ expect(::Docker::Image).to receive(:create).and_return(docker_image)
47
+ armada_image.pull
48
+ end
49
+ end
50
+ end
51
+
52
+ describe '#generate_auth' do
53
+ context 'with auth and dockercfg' do
54
+ let(:my_options) {
55
+ options.merge({
56
+ username: 'foobar',
57
+ password: 'herpderp',
58
+ dockercfg: dockercfg
59
+ })
60
+ }
61
+
62
+ let (:image) { Armada::Image.new(docker_host, my_options) }
63
+
64
+ it "should use username and password from options" do
65
+ expect(image.auth[:username]).to be(my_options[:username])
66
+ expect(image.auth[:password]).to be(my_options[:password])
67
+ end
68
+ end
69
+
70
+ context 'with no auth and dockercfg' do
71
+ let(:my_options) {
72
+ options.merge({
73
+ dockercfg: dockercfg
74
+ })
75
+ }
76
+
77
+ let (:image) { Armada::Image.new(docker_host, my_options) }
78
+
79
+ it "should use username and password from dockercfg" do
80
+ expect(image.auth).not_to be_nil
81
+ expect(image.auth[:username]).to be(credentials.username)
82
+ expect(image.auth[:password]).to be(credentials.password)
83
+ end
84
+ end
85
+
86
+ context 'with auth and no dockercfg' do
87
+ let(:my_options) {
88
+ options.merge({
89
+ username: 'foobar',
90
+ password: 'herpderp'
91
+ })
92
+ }
93
+
94
+ let (:image) { Armada::Image.new(docker_host, my_options) }
95
+
96
+ it "should use username and password from options" do
97
+ expect(image.auth[:username]).to be(my_options[:username])
98
+ expect(image.auth[:password]).to be(my_options[:password])
99
+ end
100
+ end
101
+
102
+ context 'with no auth and no dockercfg' do
103
+ let (:image) { Armada::Image.new(docker_host, options)}
104
+
105
+ it "should have no auth credentials" do
106
+ expect(image.auth).to be_nil
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,12 @@
1
+ $: << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
3
+ require 'rspec'
4
+ require 'armada'
5
+ require 'webmock/rspec'
6
+
7
+ RSpec.configure do |config|
8
+ config.mock_with :rspec
9
+ config.color = true
10
+ config.formatter = :documentation
11
+ config.tty = true
12
+ end
metadata ADDED
@@ -0,0 +1,289 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: docker-armada
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.53
5
+ platform: ruby
6
+ authors:
7
+ - Jonathan Chauncey
8
+ - Matt Farrar
9
+ - Darrell Hamilton
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2014-11-17 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: excon
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '0.33'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '0.33'
29
+ - !ruby/object:Gem::Dependency
30
+ name: net-ssh
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: net-ssh-gateway
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ - !ruby/object:Gem::Dependency
58
+ name: docker-api
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '1.13'
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '1.13'
71
+ - !ruby/object:Gem::Dependency
72
+ name: thor
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '0.19'
78
+ type: :runtime
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '0.19'
85
+ - !ruby/object:Gem::Dependency
86
+ name: awesome_print
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ type: :runtime
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ - !ruby/object:Gem::Dependency
100
+ name: table_print
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ type: :runtime
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ - !ruby/object:Gem::Dependency
114
+ name: conjur-cli
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ type: :runtime
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ - !ruby/object:Gem::Dependency
128
+ name: bundler
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ - !ruby/object:Gem::Dependency
142
+ name: rake
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ type: :development
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ - !ruby/object:Gem::Dependency
156
+ name: rspec
157
+ requirement: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - "~>"
160
+ - !ruby/object:Gem::Version
161
+ version: 2.14.0
162
+ type: :development
163
+ prerelease: false
164
+ version_requirements: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - "~>"
167
+ - !ruby/object:Gem::Version
168
+ version: 2.14.0
169
+ - !ruby/object:Gem::Dependency
170
+ name: thor-scmversion
171
+ requirement: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - "<"
174
+ - !ruby/object:Gem::Version
175
+ version: 1.6.0
176
+ type: :development
177
+ prerelease: false
178
+ version_requirements: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - "<"
181
+ - !ruby/object:Gem::Version
182
+ version: 1.6.0
183
+ - !ruby/object:Gem::Dependency
184
+ name: geminabox
185
+ requirement: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - "~>"
188
+ - !ruby/object:Gem::Version
189
+ version: '0.10'
190
+ type: :development
191
+ prerelease: false
192
+ version_requirements: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - "~>"
195
+ - !ruby/object:Gem::Version
196
+ version: '0.10'
197
+ - !ruby/object:Gem::Dependency
198
+ name: webmock
199
+ requirement: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ version: '0'
204
+ type: :development
205
+ prerelease: false
206
+ version_requirements: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - ">="
209
+ - !ruby/object:Gem::Version
210
+ version: '0'
211
+ description: Deploy utility for docker containers
212
+ email:
213
+ executables:
214
+ - armada
215
+ extensions: []
216
+ extra_rdoc_files: []
217
+ files:
218
+ - ".gitignore"
219
+ - ".travis.yml"
220
+ - Gemfile
221
+ - LICENSE
222
+ - README.md
223
+ - Rakefile
224
+ - Thorfile
225
+ - armada.gemspec
226
+ - bin/armada
227
+ - lib/armada.rb
228
+ - lib/armada/clean.rb
229
+ - lib/armada/clean/containers.rb
230
+ - lib/armada/clean/images.rb
231
+ - lib/armada/cli.rb
232
+ - lib/armada/cli/clean.rb
233
+ - lib/armada/cli/deploy.rb
234
+ - lib/armada/cli/inspect.rb
235
+ - lib/armada/configuration.rb
236
+ - lib/armada/connection.rb
237
+ - lib/armada/connection/docker.rb
238
+ - lib/armada/connection/health_check.rb
239
+ - lib/armada/connection/remote.rb
240
+ - lib/armada/deploy.rb
241
+ - lib/armada/deploy/parallel.rb
242
+ - lib/armada/deploy/rolling.rb
243
+ - lib/armada/deploy_dsl.rb
244
+ - lib/armada/docker.rb
245
+ - lib/armada/docker/config.rb
246
+ - lib/armada/docker/container.rb
247
+ - lib/armada/docker/host.rb
248
+ - lib/armada/docker/image.rb
249
+ - lib/armada/thor.rb
250
+ - lib/armada/ui.rb
251
+ - lib/armada/utils.rb
252
+ - lib/armada/utils/array.rb
253
+ - lib/armada/utils/time.rb
254
+ - lib/armada/version.rb
255
+ - spec/connection/health_check_spec.rb
256
+ - spec/deploy_dsl_spec.rb
257
+ - spec/docker/container_spec.rb
258
+ - spec/docker/image_spec.rb
259
+ - spec/spec_helper.rb
260
+ homepage: https://github.com/RallySoftware/armada
261
+ licenses:
262
+ - MIT
263
+ metadata: {}
264
+ post_install_message:
265
+ rdoc_options: []
266
+ require_paths:
267
+ - lib
268
+ required_ruby_version: !ruby/object:Gem::Requirement
269
+ requirements:
270
+ - - ">="
271
+ - !ruby/object:Gem::Version
272
+ version: 1.9.3
273
+ required_rubygems_version: !ruby/object:Gem::Requirement
274
+ requirements:
275
+ - - ">="
276
+ - !ruby/object:Gem::Version
277
+ version: '0'
278
+ requirements: []
279
+ rubyforge_project:
280
+ rubygems_version: 2.2.2
281
+ signing_key:
282
+ specification_version: 4
283
+ summary: Deploy utility for docker containers
284
+ test_files:
285
+ - spec/connection/health_check_spec.rb
286
+ - spec/deploy_dsl_spec.rb
287
+ - spec/docker/container_spec.rb
288
+ - spec/docker/image_spec.rb
289
+ - spec/spec_helper.rb