rollo 0.3.0 → 0.8.0.pre.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CODE_OF_CONDUCT.md +1 -1
- data/Gemfile +4 -2
- data/Gemfile.lock +1128 -524
- data/LICENSE.txt +1 -1
- data/Rakefile +134 -10
- data/bin/console +4 -3
- data/lib/rollo.rb +3 -1
- data/lib/rollo/commands.rb +2 -0
- data/lib/rollo/commands/hosts.rb +232 -0
- data/lib/rollo/commands/main.rb +78 -48
- data/lib/rollo/commands/services.rb +173 -0
- data/lib/rollo/model.rb +2 -0
- data/lib/rollo/model/host.rb +4 -2
- data/lib/rollo/model/host_cluster.rb +34 -23
- data/lib/rollo/model/scaling_activity.rb +8 -6
- data/lib/rollo/model/service.rb +37 -24
- data/lib/rollo/model/service_cluster.rb +19 -14
- data/lib/rollo/version.rb +3 -1
- metadata +145 -43
- data/.envrc +0 -5
- data/.gitignore +0 -31
- data/.rspec +0 -3
- data/.ruby-version +0 -1
- data/.travis.yml +0 -5
- data/exe/rollo +0 -5
- data/go +0 -61
- data/lib/rollo/commands/host_cluster.rb +0 -184
- data/lib/rollo/commands/service_cluster.rb +0 -124
- data/rollo.gemspec +0 -37
data/LICENSE.txt
CHANGED
data/Rakefile
CHANGED
@@ -1,24 +1,148 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require 'yaml'
|
4
|
+
require 'rake_circle_ci'
|
5
|
+
require 'rake_github'
|
6
|
+
require 'rake_ssh'
|
7
|
+
require 'rake_gpg'
|
8
|
+
require 'securerandom'
|
9
|
+
require 'rspec/core/rake_task'
|
10
|
+
require 'rubocop/rake_task'
|
4
11
|
|
5
|
-
task :
|
12
|
+
task default: %i[
|
13
|
+
library:fix
|
14
|
+
test:unit
|
15
|
+
]
|
16
|
+
|
17
|
+
namespace :encryption do
|
18
|
+
namespace :directory do
|
19
|
+
desc 'Ensure CI secrets directory exists.'
|
20
|
+
task :ensure do
|
21
|
+
FileUtils.mkdir_p('config/secrets/ci')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
namespace :passphrase do
|
26
|
+
desc 'Generate encryption passphrase used by CI.'
|
27
|
+
task generate: ['directory:ensure'] do
|
28
|
+
File.open('config/secrets/ci/encryption.passphrase', 'w') do |f|
|
29
|
+
f.write(SecureRandom.base64(36))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
namespace :keys do
|
36
|
+
namespace :deploy do
|
37
|
+
RakeSSH.define_key_tasks(
|
38
|
+
path: 'config/secrets/ci/',
|
39
|
+
comment: 'maintainers@infrablocks.io'
|
40
|
+
)
|
41
|
+
end
|
42
|
+
|
43
|
+
namespace :secrets do
|
44
|
+
namespace :gpg do
|
45
|
+
RakeGPG.define_generate_key_task(
|
46
|
+
output_directory: 'config/secrets/ci',
|
47
|
+
name_prefix: 'gpg',
|
48
|
+
owner_name: 'InfraBlocks Maintainers',
|
49
|
+
owner_email: 'maintainers@infrablocks.io',
|
50
|
+
owner_comment: 'rollo CI Key'
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
54
|
+
desc 'Generate key used by CI to access secrets.'
|
55
|
+
task generate: [:'gpg:generate']
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
namespace :secrets do
|
60
|
+
desc 'Regenerate all generatable secrets.'
|
61
|
+
task regenerate: %w[
|
62
|
+
encryption:passphrase:generate
|
63
|
+
keys:deploy:generate
|
64
|
+
keys:secrets:generate
|
65
|
+
]
|
66
|
+
end
|
67
|
+
|
68
|
+
RuboCop::RakeTask.new
|
69
|
+
|
70
|
+
namespace :library do
|
71
|
+
desc 'Run all checks of the library'
|
72
|
+
task check: [:rubocop]
|
73
|
+
|
74
|
+
desc 'Attempt to automatically fix issues with the library'
|
75
|
+
task fix: [:'rubocop:auto_correct']
|
76
|
+
end
|
77
|
+
|
78
|
+
namespace :test do
|
79
|
+
RSpec::Core::RakeTask.new(:unit)
|
80
|
+
end
|
81
|
+
|
82
|
+
RakeCircleCI.define_project_tasks(
|
83
|
+
namespace: :circle_ci,
|
84
|
+
project_slug: 'github/infrablocks/rollo'
|
85
|
+
) do |t|
|
86
|
+
circle_ci_config =
|
87
|
+
YAML.load_file('config/secrets/circle_ci/config.yaml')
|
88
|
+
|
89
|
+
t.api_token = circle_ci_config['circle_ci_api_token']
|
90
|
+
t.environment_variables = {
|
91
|
+
ENCRYPTION_PASSPHRASE:
|
92
|
+
File.read('config/secrets/ci/encryption.passphrase')
|
93
|
+
.chomp
|
94
|
+
}
|
95
|
+
t.checkout_keys = []
|
96
|
+
t.ssh_keys = [
|
97
|
+
{
|
98
|
+
hostname: 'github.com',
|
99
|
+
private_key: File.read('config/secrets/ci/ssh.private')
|
100
|
+
}
|
101
|
+
]
|
102
|
+
end
|
103
|
+
|
104
|
+
RakeGithub.define_repository_tasks(
|
105
|
+
namespace: :github,
|
106
|
+
repository: 'infrablocks/rollo'
|
107
|
+
) do |t|
|
108
|
+
github_config =
|
109
|
+
YAML.load_file('config/secrets/github/config.yaml')
|
110
|
+
|
111
|
+
t.access_token = github_config['github_personal_access_token']
|
112
|
+
t.deploy_keys = [
|
113
|
+
{
|
114
|
+
title: 'CircleCI',
|
115
|
+
public_key: File.read('config/secrets/ci/ssh.public')
|
116
|
+
}
|
117
|
+
]
|
118
|
+
end
|
119
|
+
|
120
|
+
namespace :pipeline do
|
121
|
+
desc 'Prepare CircleCI Pipeline'
|
122
|
+
task prepare: %i[
|
123
|
+
circle_ci:project:follow
|
124
|
+
circle_ci:env_vars:ensure
|
125
|
+
circle_ci:checkout_keys:ensure
|
126
|
+
circle_ci:ssh_keys:ensure
|
127
|
+
github:deploy_keys:ensure
|
128
|
+
]
|
129
|
+
end
|
6
130
|
|
7
131
|
namespace :version do
|
8
|
-
desc
|
132
|
+
desc 'Bump version for specified type (pre, major, minor, patch)'
|
9
133
|
task :bump, [:type] do |_, args|
|
10
134
|
bump_version_for(args.type)
|
11
135
|
end
|
12
136
|
end
|
13
137
|
|
14
|
-
desc
|
138
|
+
desc 'Release gem'
|
15
139
|
task :release do
|
16
|
-
sh
|
140
|
+
sh 'gem release --tag --push'
|
17
141
|
end
|
18
142
|
|
19
143
|
def bump_version_for(version_type)
|
20
|
-
sh "gem bump --version #{version_type} "
|
21
|
-
|
22
|
-
|
23
|
-
|
144
|
+
sh "gem bump --version #{version_type} " \
|
145
|
+
'&& bundle install ' \
|
146
|
+
'&& export LAST_MESSAGE="$(git log -1 --pretty=%B)" ' \
|
147
|
+
'&& git commit -a --amend -m "${LAST_MESSAGE} [ci skip]"'
|
24
148
|
end
|
data/bin/console
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
require
|
4
|
-
require
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'rollo'
|
5
6
|
|
6
7
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
8
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +11,5 @@ require "rollo"
|
|
10
11
|
# require "pry"
|
11
12
|
# Pry.start
|
12
13
|
|
13
|
-
require
|
14
|
+
require 'irb'
|
14
15
|
IRB.start(__FILE__)
|
data/lib/rollo.rb
CHANGED
data/lib/rollo/commands.rb
CHANGED
@@ -0,0 +1,232 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'thor'
|
4
|
+
require_relative '../model'
|
5
|
+
|
6
|
+
module Rollo
|
7
|
+
module Commands
|
8
|
+
# rubocop:disable Metrics/ClassLength
|
9
|
+
class Hosts < Thor
|
10
|
+
namespace :hosts
|
11
|
+
|
12
|
+
def self.exit_on_failure?
|
13
|
+
true
|
14
|
+
end
|
15
|
+
|
16
|
+
desc(
|
17
|
+
'expand REGION ASG_NAME ECS_CLUSTER_NAME',
|
18
|
+
'Expands the host cluster by one batch.'
|
19
|
+
)
|
20
|
+
method_option(
|
21
|
+
:batch_size,
|
22
|
+
aliases: '-b',
|
23
|
+
type: :numeric,
|
24
|
+
default: 3,
|
25
|
+
desc: 'The number of hosts to add at a time.'
|
26
|
+
)
|
27
|
+
# rubocop:disable Metrics/AbcSize
|
28
|
+
# rubocop:disable Metrics/MethodLength
|
29
|
+
def expand(
|
30
|
+
region, asg_name, _,
|
31
|
+
host_cluster = nil
|
32
|
+
)
|
33
|
+
batch_size = options[:batch_size]
|
34
|
+
|
35
|
+
host_cluster ||= Rollo::Model::HostCluster.new(asg_name, region)
|
36
|
+
|
37
|
+
say("Increasing host cluster desired capacity by #{batch_size}...")
|
38
|
+
with_padding do
|
39
|
+
host_cluster.increase_capacity_by(batch_size) do |on|
|
40
|
+
on.prepare do |current, target|
|
41
|
+
say(
|
42
|
+
"Changing desired capacity from #{current} to " \
|
43
|
+
"#{target}..."
|
44
|
+
)
|
45
|
+
end
|
46
|
+
on.waiting_for_start do |attempt|
|
47
|
+
say(
|
48
|
+
'Waiting for capacity change to start ' \
|
49
|
+
"(attempt #{attempt})..."
|
50
|
+
)
|
51
|
+
end
|
52
|
+
on.waiting_for_end do |attempt|
|
53
|
+
say(
|
54
|
+
'Waiting for capacity change to complete ' \
|
55
|
+
"(attempt #{attempt})..."
|
56
|
+
)
|
57
|
+
end
|
58
|
+
on.waiting_for_health do |attempt|
|
59
|
+
say("Waiting for a healthy state (attempt #{attempt})")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
say 'Host cluster desired capacity increased, continuing...'
|
64
|
+
end
|
65
|
+
|
66
|
+
# rubocop:enable Metrics/MethodLength
|
67
|
+
# rubocop:enable Metrics/AbcSize
|
68
|
+
|
69
|
+
desc(
|
70
|
+
'contract REGION ASG_NAME ECS_CLUSTER_NAME',
|
71
|
+
'Contracts the host cluster by one batch'
|
72
|
+
)
|
73
|
+
method_option(
|
74
|
+
:batch_size,
|
75
|
+
aliases: '-b',
|
76
|
+
type: :numeric,
|
77
|
+
default: 3,
|
78
|
+
desc: 'The number of hosts to remove at a time.'
|
79
|
+
)
|
80
|
+
# rubocop:disable Metrics/AbcSize
|
81
|
+
# rubocop:disable Metrics/MethodLength
|
82
|
+
def contract(
|
83
|
+
region, asg_name, ecs_cluster_name,
|
84
|
+
host_cluster = nil, service_cluster = nil
|
85
|
+
)
|
86
|
+
batch_size = options[:batch_size]
|
87
|
+
|
88
|
+
host_cluster ||= Rollo::Model::HostCluster.new(asg_name, region)
|
89
|
+
service_cluster ||= Rollo::Model::ServiceCluster.new(
|
90
|
+
ecs_cluster_name, region
|
91
|
+
)
|
92
|
+
|
93
|
+
say("Decreasing host cluster desired capacity by #{batch_size}...")
|
94
|
+
# rubocop:disable Metrics/BlockLength
|
95
|
+
with_padding do
|
96
|
+
host_cluster.decrease_capacity_by(batch_size) do |on|
|
97
|
+
on.prepare do |current, target|
|
98
|
+
say(
|
99
|
+
"Changing desired capacity from #{current} to " \
|
100
|
+
"#{target}..."
|
101
|
+
)
|
102
|
+
end
|
103
|
+
on.waiting_for_start do |attempt|
|
104
|
+
say(
|
105
|
+
'Waiting for capacity change to start ' \
|
106
|
+
"(attempt #{attempt})..."
|
107
|
+
)
|
108
|
+
end
|
109
|
+
on.waiting_for_end do |attempt|
|
110
|
+
say(
|
111
|
+
'Waiting for capacity change to complete ' \
|
112
|
+
"(attempt #{attempt})..."
|
113
|
+
)
|
114
|
+
end
|
115
|
+
on.waiting_for_health do |attempt|
|
116
|
+
say(
|
117
|
+
'Waiting for host cluster to reach healthy state ' \
|
118
|
+
"(attempt #{attempt})..."
|
119
|
+
)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
service_cluster.with_replica_services do |services|
|
123
|
+
services.each_service do |service|
|
124
|
+
service.wait_for_service_health do |on|
|
125
|
+
on.waiting_for_health do |attempt|
|
126
|
+
say(
|
127
|
+
"Waiting for service #{service.name} to reach a " \
|
128
|
+
"steady state (attempt #{attempt})..."
|
129
|
+
)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
# rubocop:enable Metrics/BlockLength
|
136
|
+
say 'Host cluster desired capacity decreased, continuing...'
|
137
|
+
end
|
138
|
+
|
139
|
+
# rubocop:enable Metrics/MethodLength
|
140
|
+
# rubocop:enable Metrics/AbcSize
|
141
|
+
|
142
|
+
desc(
|
143
|
+
'terminate REGION ASG_NAME ECS_CLUSTER_NAME INSTANCE_IDS*',
|
144
|
+
'Terminates the specified hosts within the cluster.'
|
145
|
+
)
|
146
|
+
method_option(
|
147
|
+
:batch_size,
|
148
|
+
aliases: '-b',
|
149
|
+
type: :numeric,
|
150
|
+
default: 3,
|
151
|
+
desc: 'The number of hosts to add at a time.'
|
152
|
+
)
|
153
|
+
method_option(
|
154
|
+
:startup_time,
|
155
|
+
aliases: '-t',
|
156
|
+
type: :numeric,
|
157
|
+
default: 2,
|
158
|
+
desc: 'The number of minutes to wait for services to start up.'
|
159
|
+
)
|
160
|
+
# rubocop:disable Metrics/MethodLength
|
161
|
+
# rubocop:disable Metrics/AbcSize
|
162
|
+
# rubocop:disable Metrics/ParameterLists
|
163
|
+
def terminate(
|
164
|
+
region, asg_name, ecs_cluster_name, instance_ids,
|
165
|
+
host_cluster = nil, service_cluster = nil
|
166
|
+
)
|
167
|
+
batch_size = options[:batch_size]
|
168
|
+
|
169
|
+
service_start_wait_minutes = options[:startup_time]
|
170
|
+
service_start_wait_seconds = 60 * service_start_wait_minutes
|
171
|
+
|
172
|
+
host_cluster ||= Rollo::Model::HostCluster.new(asg_name, region)
|
173
|
+
service_cluster ||= Rollo::Model::ServiceCluster.new(ecs_cluster_name,
|
174
|
+
region)
|
175
|
+
|
176
|
+
hosts = host_cluster.hosts.select { |h| instance_ids.include?(h.id) }
|
177
|
+
host_batches = hosts.each_slice(batch_size).to_a
|
178
|
+
|
179
|
+
say(
|
180
|
+
'Terminating old hosts in host cluster in batches of ' \
|
181
|
+
"#{batch_size}..."
|
182
|
+
)
|
183
|
+
# rubocop:disable Metrics/BlockLength
|
184
|
+
with_padding do
|
185
|
+
host_batches.each_with_index do |host_batch, index|
|
186
|
+
say(
|
187
|
+
"Batch #{index + 1} contains hosts: " \
|
188
|
+
"\n\t\t[#{host_batch.map(&:id).join(",\n\t\t ")}]\n" \
|
189
|
+
'Terminating...'
|
190
|
+
)
|
191
|
+
host_batch.each(&:terminate)
|
192
|
+
host_cluster.wait_for_capacity_health do |on|
|
193
|
+
on.waiting_for_health do |attempt|
|
194
|
+
say(
|
195
|
+
'Waiting for host cluster to reach healthy state ' \
|
196
|
+
"(attempt #{attempt})"
|
197
|
+
)
|
198
|
+
end
|
199
|
+
end
|
200
|
+
service_cluster.with_replica_services do |services|
|
201
|
+
services.each_service do |service|
|
202
|
+
service.wait_for_service_health do |on|
|
203
|
+
on.waiting_for_health do |attempt|
|
204
|
+
say(
|
205
|
+
"Waiting for service #{service.name} to reach a " \
|
206
|
+
"steady state (attempt #{attempt})..."
|
207
|
+
)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
say(
|
213
|
+
"Waiting #{service_start_wait_minutes} minute(s) for " \
|
214
|
+
'services to finish starting...'
|
215
|
+
)
|
216
|
+
sleep(service_start_wait_seconds)
|
217
|
+
say(
|
218
|
+
"Waited #{service_start_wait_minutes} minute(s). " \
|
219
|
+
'Continuing...'
|
220
|
+
)
|
221
|
+
end
|
222
|
+
end
|
223
|
+
# rubocop:enable Metrics/BlockLength
|
224
|
+
end
|
225
|
+
# rubocop:enable Metrics/ParameterLists
|
226
|
+
# rubocop:enable Metrics/MethodLength
|
227
|
+
# rubocop:enable Metrics/AbcSize
|
228
|
+
end
|
229
|
+
|
230
|
+
# rubocop:enable Metrics/ClassLength
|
231
|
+
end
|
232
|
+
end
|
data/lib/rollo/commands/main.rb
CHANGED
@@ -1,48 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'thor'
|
2
4
|
require_relative '../model'
|
3
|
-
require_relative './
|
4
|
-
require_relative './
|
5
|
+
require_relative './hosts'
|
6
|
+
require_relative './services'
|
5
7
|
|
6
8
|
module Rollo
|
7
9
|
module Commands
|
8
10
|
class Main < Thor
|
11
|
+
namespace :main
|
12
|
+
|
9
13
|
def self.exit_on_failure?
|
10
14
|
true
|
11
15
|
end
|
12
16
|
|
13
|
-
desc('
|
14
|
-
subcommand
|
17
|
+
desc('hosts', 'Manages the host cluster')
|
18
|
+
subcommand :hosts, Rollo::Commands::Hosts
|
15
19
|
|
16
|
-
desc('
|
17
|
-
subcommand
|
20
|
+
desc('services', 'Manages the service cluster')
|
21
|
+
subcommand :services, Rollo::Commands::Services
|
18
22
|
|
19
|
-
desc('version', '
|
23
|
+
desc('version', 'Prints the version number of rollo')
|
20
24
|
def version
|
21
25
|
say Rollo::VERSION
|
22
26
|
end
|
23
27
|
|
24
28
|
desc('roll REGION ASG_NAME ECS_CLUSTER_NAME',
|
25
|
-
|
29
|
+
'Rolls all hosts in the cluster')
|
30
|
+
method_option(
|
31
|
+
:batch_size,
|
32
|
+
aliases: '-b',
|
33
|
+
type: :numeric,
|
34
|
+
default: 3,
|
35
|
+
desc:
|
36
|
+
'The number of hosts / service instances to add / remove at ' \
|
37
|
+
'a time.'
|
38
|
+
)
|
26
39
|
method_option(
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
40
|
+
:maximum_service_instances,
|
41
|
+
aliases: '-mx',
|
42
|
+
type: :numeric,
|
43
|
+
desc: 'The maximum number of service instances to expand to.'
|
44
|
+
)
|
45
|
+
method_option(
|
46
|
+
:minimum_service_instances,
|
47
|
+
aliases: '-mn',
|
48
|
+
type: :numeric,
|
49
|
+
desc: 'The minimum number of service instances to contract to.'
|
50
|
+
)
|
51
|
+
# rubocop:disable Metrics/MethodLength
|
52
|
+
# rubocop:disable Metrics/AbcSize
|
34
53
|
def roll(region, asg_name, ecs_cluster_name)
|
35
54
|
host_cluster = Rollo::Model::HostCluster.new(asg_name, region)
|
36
55
|
service_cluster = Rollo::Model::ServiceCluster
|
37
|
-
|
56
|
+
.new(ecs_cluster_name, region)
|
38
57
|
|
39
58
|
initial_hosts = host_cluster.hosts
|
40
59
|
|
41
60
|
say(
|
42
|
-
|
43
|
-
|
61
|
+
"Rolling instances in host cluster #{host_cluster.name} for " \
|
62
|
+
"service cluster #{service_cluster.name}..."
|
63
|
+
)
|
64
|
+
# rubocop:disable Metrics/BlockLength
|
44
65
|
with_padding do
|
45
|
-
unless host_cluster.
|
66
|
+
unless host_cluster.desired_capacity?
|
46
67
|
say('ERROR: Host cluster is not in stable state.')
|
47
68
|
say('This may be due to scaling above or below the desired')
|
48
69
|
say('capacity or because hosts are not in service or are ')
|
@@ -51,44 +72,53 @@ module Rollo
|
|
51
72
|
end
|
52
73
|
|
53
74
|
invoke(
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
75
|
+
'hosts:expand',
|
76
|
+
[
|
77
|
+
region, asg_name, ecs_cluster_name,
|
78
|
+
host_cluster
|
79
|
+
]
|
80
|
+
)
|
59
81
|
|
60
82
|
invoke(
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
83
|
+
'services:expand',
|
84
|
+
[
|
85
|
+
region, asg_name, ecs_cluster_name,
|
86
|
+
service_cluster
|
87
|
+
],
|
88
|
+
maximum_instances: options[:maximum_service_instances]
|
89
|
+
)
|
66
90
|
|
67
91
|
invoke(
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
92
|
+
'hosts:terminate',
|
93
|
+
[
|
94
|
+
region, asg_name, ecs_cluster_name, initial_hosts.map(&:id),
|
95
|
+
host_cluster, service_cluster
|
96
|
+
]
|
97
|
+
)
|
73
98
|
|
74
99
|
invoke(
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
100
|
+
'hosts:contract',
|
101
|
+
[
|
102
|
+
region, asg_name, ecs_cluster_name,
|
103
|
+
host_cluster, service_cluster
|
104
|
+
]
|
105
|
+
)
|
80
106
|
|
81
107
|
invoke(
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
108
|
+
'services:contract',
|
109
|
+
[
|
110
|
+
region, asg_name, ecs_cluster_name,
|
111
|
+
service_cluster
|
112
|
+
],
|
113
|
+
minimum_instances: options[:minimum_service_instances]
|
114
|
+
)
|
87
115
|
end
|
88
|
-
|
89
|
-
say("Instances in host cluster #{host_cluster.name} rolled "
|
90
|
-
|
116
|
+
# rubocop:enable Metrics/BlockLength
|
117
|
+
say("Instances in host cluster #{host_cluster.name} rolled " \
|
118
|
+
'successfully.')
|
91
119
|
end
|
120
|
+
# rubocop:enable Metrics/MethodLength
|
121
|
+
# rubocop:enable Metrics/AbcSize
|
92
122
|
end
|
93
123
|
end
|
94
|
-
end
|
124
|
+
end
|