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.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.travis.yml +5 -0
- data/Gemfile +5 -0
- data/LICENSE +20 -0
- data/README.md +293 -0
- data/Rakefile +9 -0
- data/Thorfile +1 -0
- data/armada.gemspec +37 -0
- data/bin/armada +5 -0
- data/lib/armada.rb +37 -0
- data/lib/armada/clean.rb +2 -0
- data/lib/armada/clean/containers.rb +30 -0
- data/lib/armada/clean/images.rb +29 -0
- data/lib/armada/cli.rb +40 -0
- data/lib/armada/cli/clean.rb +23 -0
- data/lib/armada/cli/deploy.rb +32 -0
- data/lib/armada/cli/inspect.rb +28 -0
- data/lib/armada/configuration.rb +33 -0
- data/lib/armada/connection.rb +3 -0
- data/lib/armada/connection/docker.rb +22 -0
- data/lib/armada/connection/health_check.rb +66 -0
- data/lib/armada/connection/remote.rb +26 -0
- data/lib/armada/deploy.rb +2 -0
- data/lib/armada/deploy/parallel.rb +58 -0
- data/lib/armada/deploy/rolling.rb +60 -0
- data/lib/armada/deploy_dsl.rb +156 -0
- data/lib/armada/docker.rb +6 -0
- data/lib/armada/docker/config.rb +55 -0
- data/lib/armada/docker/container.rb +120 -0
- data/lib/armada/docker/host.rb +68 -0
- data/lib/armada/docker/image.rb +86 -0
- data/lib/armada/thor.rb +1 -0
- data/lib/armada/ui.rb +15 -0
- data/lib/armada/utils.rb +2 -0
- data/lib/armada/utils/array.rb +9 -0
- data/lib/armada/utils/time.rb +23 -0
- data/lib/armada/version.rb +3 -0
- data/spec/connection/health_check_spec.rb +36 -0
- data/spec/deploy_dsl_spec.rb +84 -0
- data/spec/docker/container_spec.rb +124 -0
- data/spec/docker/image_spec.rb +110 -0
- data/spec/spec_helper.rb +12 -0
- metadata +289 -0
data/lib/armada/thor.rb
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'armada/cli'
|
data/lib/armada/ui.rb
ADDED
data/lib/armada/utils.rb
ADDED
|
@@ -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,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
|
data/spec/spec_helper.rb
ADDED
|
@@ -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
|