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
|