centurion 1.8.4 → 1.8.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 369271bc0ce536e622fa0f0af79033e644fabd73
4
- data.tar.gz: 0a6212a1a65e3c2d5d24dfdc5aee9d41c4144993
3
+ metadata.gz: 54fb3e35e5c7be90b4d79745d899b8434157977f
4
+ data.tar.gz: 13355844e36026541dd2d31a4d9ed2ac3c099dd7
5
5
  SHA512:
6
- metadata.gz: 1b48a1ff8e0da6f5a2b942ba7a5dbbbd377200c2c0f45c7d763fc99cfa2936a1c3c135f5b6bff84feabe10f813e8e7d18f3e23c1e50b674e96733ea7c1f3aa66
7
- data.tar.gz: 80a0fdae74711b67cd80cb732a0bf14bfefb56c69bafa0302b07a8b6449dc96873b2552cfc11fbf6a7db4590d0e272fe894ae6eefdffd5f7ccd694b3b697981b
6
+ metadata.gz: de4a567728bf795ca5f9dff906b3a6ccf97607689a0bf1a1ccba31a30d0a8ecc3e825b2efa3118645087773896f0b9c592a2f8126e303e88c08082804482815d
7
+ data.tar.gz: 0c9c70fe003c2eac325bc9b130371425e1e67429a2a45a6a43aee78828dcb218fd3f5dde3a785714d47e3b706e34c69f884e6f492de208915b75a4e3f0a841d6
@@ -0,0 +1 @@
1
+ language: ruby
@@ -13,6 +13,7 @@ Your name could be here!
13
13
  * [Jon Wood][jellybob]
14
14
  * [Mark Borcherding][markborcherding]
15
15
  * [Nick Laferriere][laferrieren]
16
+ * [Hugo Chinchilla][hugochinchilla]
16
17
 
17
18
  Pre-release
18
19
  -----------
@@ -74,3 +75,5 @@ Contributor | Commits | Additions | Deletio
74
75
  [skarap]: https://github.com/skarap
75
76
  [jellybob]: https://github.com/jellybob
76
77
  [markborcherding]: https://github.com/markborcherding
78
+ [dselans]: https://github.com/dselans
79
+ [idleyoungman]: https://github.com/idleyoungman
data/README.md CHANGED
@@ -394,6 +394,14 @@ with `/bin/bash`. It will use the first host from the host list.
394
394
  ````bash
395
395
  $ bundle exec centurion -p radio-radio -e staging -a deploy_console
396
396
  ````
397
+ ### Repair unhealthy docker containers
398
+
399
+ This will preform a health check on each host using rolling deployment
400
+ health check settings and redeploy to the host if a health check fails.
401
+
402
+ ````bash
403
+ $ bundle exec centurion -p radio-radio -e staging -a repair
404
+ ````
397
405
 
398
406
  ###List all the tags running on your servers for a particular project
399
407
 
@@ -23,9 +23,11 @@ module Centurion::Deploy
23
23
 
24
24
  def wait_for_health_check_ok(health_check_method, target_server, container_id, port, endpoint, image_id, tag, sleep_time=5, retries=12)
25
25
  info 'Waiting for the port to come up'
26
+ healthy = false
26
27
  1.upto(retries) do
27
28
  if container_up?(target_server, container_id) && health_check_method.call(target_server, port, endpoint)
28
29
  info 'Container is up!'
30
+ healthy = true
29
31
  break
30
32
  end
31
33
 
@@ -33,7 +35,7 @@ module Centurion::Deploy
33
35
  sleep(sleep_time)
34
36
  end
35
37
 
36
- unless health_check_method.call(target_server, port, endpoint)
38
+ unless healthy
37
39
  error "Failed to validate started container on #{target_server.hostname}:#{port}"
38
40
  exit(FAILED_CONTAINER_VALIDATION)
39
41
  end
@@ -97,7 +99,7 @@ module Centurion::Deploy
97
99
 
98
100
  def start_new_container(server, service, restart_policy)
99
101
  container_config = service.build_config(server.hostname, &hostname_proc)
100
- info "Creating new container for #{container_config['Image'][0..7]}"
102
+ info "Creating new container for #{container_config['Image']}"
101
103
  container = server.create_container(container_config, service.name)
102
104
 
103
105
  host_config = service.build_host_config(restart_policy)
@@ -126,4 +128,14 @@ module Centurion::Deploy
126
128
 
127
129
  server.attach(container['Id'])
128
130
  end
131
+
132
+ def enter_container(server, service)
133
+ container = if service.public_ports.nil? || service.public_ports.empty?
134
+ server.find_containers_by_name(service.name).first
135
+ else
136
+ server.find_containers_by_public_port(service.public_ports.first).first
137
+ end
138
+
139
+ server.exec_it(container["Id"], "/bin/bash")
140
+ end
129
141
  end
@@ -8,6 +8,10 @@ module Centurion::DeployDSL
8
8
  build_server_group.tap { |hosts| hosts.each { |host| block.call(host) } }
9
9
  end
10
10
 
11
+ def on_first_docker_host(&block)
12
+ build_server_group.tap { |hosts| block.call(hosts.first) }
13
+ end
14
+
11
15
  def env_vars(new_vars)
12
16
  current = fetch(:env_vars, {})
13
17
  new_vars.each_pair do |new_key, new_value|
@@ -16,7 +16,7 @@ class Centurion::DockerServer
16
16
  def_delegators :docker_via_api, :create_container, :inspect_container,
17
17
  :inspect_image, :ps, :start_container, :stop_container,
18
18
  :remove_container, :restart_container
19
- def_delegators :docker_via_cli, :pull, :tail, :attach, :exec
19
+ def_delegators :docker_via_cli, :pull, :tail, :attach, :exec, :exec_it
20
20
 
21
21
  def initialize(host, docker_path, tls_params = {})
22
22
  @docker_path = docker_path
@@ -31,6 +31,14 @@ class Centurion::DockerViaCli
31
31
  Centurion::Shell.echo(build_command(:exec, "#{container_id} #{commandline}"))
32
32
  end
33
33
 
34
+ def exec_it(container_id, commandline)
35
+ # the "or true" on the command is to prevent an exception from Shell.validate_status
36
+ # because docker exec returns the same exit code as the latest command executed on
37
+ # the shell, which causes an exception to be raised if the latest comand executed
38
+ # was unsuccessful when you exit the shell.
39
+ Centurion::Shell.echo(build_command(:exec, "-it #{container_id} #{commandline} || true"))
40
+ end
41
+
34
42
  private
35
43
 
36
44
  def self.tls_keys
@@ -34,6 +34,8 @@ module Centurion
34
34
  s.port_bindings = fetch(:port_bindings, [])
35
35
  s.network_mode = fetch(:network_mode, 'bridge')
36
36
  s.command = fetch(:command, nil)
37
+ s.memory = fetch(:memory, 0)
38
+ s.cpu_shares = fetch(:cpu_shares, 0)
37
39
 
38
40
  s.add_env_vars(fetch(:env_vars, {}))
39
41
  end
@@ -141,6 +143,12 @@ module Centurion
141
143
  # Add ExtraHosts if needed
142
144
  host_config['ExtraHosts'] = extra_hosts if extra_hosts
143
145
 
146
+ # Set memory limits
147
+ host_config['Memory'] = memory if memory
148
+
149
+ # Set cpushare limits
150
+ host_config['CpuShares'] = cpu_shares if cpu_shares
151
+
144
152
  # Restart Policy
145
153
  if restart_policy
146
154
  host_config['RestartPolicy'] = {}
@@ -1,3 +1,3 @@
1
1
  module Centurion
2
- VERSION = '1.8.4'
2
+ VERSION = '1.8.5'
3
3
  end
@@ -12,7 +12,7 @@ end
12
12
 
13
13
  task :deploy_console do
14
14
  invoke 'deploy:get_image'
15
- invoke 'deploy:stop'
15
+ #invoke 'deploy:stop'
16
16
  invoke 'deploy:launch_console'
17
17
  invoke 'deploy:cleanup'
18
18
  end
@@ -23,7 +23,14 @@ task :rolling_deploy do
23
23
  invoke 'deploy:cleanup'
24
24
  end
25
25
 
26
+ task :repair do
27
+ invoke 'deploy:get_image'
28
+ invoke 'deploy:repair'
29
+ invoke 'deploy:cleanup'
30
+ end
31
+
26
32
  task :stop => ['deploy:stop']
33
+ task :enter_container => ['deploy:enter_container']
27
34
 
28
35
  namespace :dev do
29
36
  task :export_only do
@@ -106,11 +113,18 @@ namespace :deploy do
106
113
  end
107
114
 
108
115
  task :launch_console do
109
- on_each_docker_host do |server|
116
+ on_first_docker_host do |server|
117
+ defined_service.port_bindings.clear
110
118
  launch_console(server, defined_service)
111
119
  end
112
120
  end
113
121
 
122
+ task :enter_container do
123
+ on_first_docker_host do |server|
124
+ enter_container(server, defined_service)
125
+ end
126
+ end
127
+
114
128
  task :rolling_deploy do
115
129
  on_each_docker_host do |server|
116
130
  service = defined_service
@@ -138,6 +152,27 @@ namespace :deploy do
138
152
  end
139
153
  end
140
154
 
155
+ task :repair do
156
+ service = defined_service
157
+
158
+ # find nodes that are down
159
+ on_each_docker_host do |server|
160
+ failed_healthcheck = false
161
+ public_ports = service.public_ports - fetch(:rolling_deploy_skip_ports, [])
162
+ public_ports.each do |port|
163
+ unless method(:http_status_ok?).call(server, port, fetch(:status_endpoint, '/'))
164
+ failed_healthcheck = true
165
+ break
166
+ end
167
+ end
168
+ next unless failed_healthcheck
169
+ # issue stop to clean host
170
+ stop_containers(server, service, fetch(:stop_timeout, 30))
171
+ # start new container services is already down, so no need to role gracefully
172
+ start_new_container(server, defined_service, defined_restart_policy)
173
+ end
174
+ end
175
+
141
176
  task :cleanup do
142
177
  on_each_docker_host do |server|
143
178
  cleanup_containers(server, defined_service)
@@ -124,6 +124,16 @@ describe Centurion::DeployDSL do
124
124
  expect(DeployDSLTest.defined_service.network_mode).to eq('host')
125
125
  end
126
126
 
127
+ it 'accepts cpu share limit' do
128
+ DeployDSLTest.cpu_shares(12345678)
129
+ expect(DeployDSLTest.defined_service.cpu_shares).to eq(12345678)
130
+ end
131
+
132
+ it 'accepts memory limit' do
133
+ DeployDSLTest.memory(12345)
134
+ expect(DeployDSLTest.defined_service.memory).to eq(12345)
135
+ end
136
+
127
137
  it 'accepts bridge mode' do
128
138
  DeployDSLTest.network_mode('bridge')
129
139
  expect(DeployDSLTest.defined_service.network_mode).to eq('bridge')
@@ -55,15 +55,6 @@ describe Centurion::Dogestry do
55
55
  end
56
56
  end
57
57
 
58
- describe '#pull' do
59
- it 'returns correct value' do
60
- if registry.which('dogestry')
61
- expect(registry).to receive(:echo).with("dogestry #{flags} pull #{registry.s3_url} #{repo}")
62
- registry.pull(repo, pull_hosts)
63
- end
64
- end
65
- end
66
-
67
58
  describe '#which' do
68
59
  it 'finds dogestry command line' do
69
60
  allow(File).to receive(:executable?).and_return(true)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: centurion
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.4
4
+ version: 1.8.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nic Benders
@@ -20,7 +20,7 @@ authors:
20
20
  autorequire:
21
21
  bindir: bin
22
22
  cert_chain: []
23
- date: 2015-12-02 00:00:00.000000000 Z
23
+ date: 2016-01-12 00:00:00.000000000 Z
24
24
  dependencies:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: trollop
@@ -156,6 +156,7 @@ extensions: []
156
156
  extra_rdoc_files: []
157
157
  files:
158
158
  - ".gitignore"
159
+ - ".travis.yml"
159
160
  - CONTRIBUTORS.md
160
161
  - Gemfile
161
162
  - LICENSE