Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 32b234f

Browse files
Merge pull request segmentio#104 from segmentio/drain-instances-for-rollover
[WIP] [roll-ami] drain old instances before terminating:
2 parents 6a91230 + 68b5c7a commit 32b234f

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

tools/roll-ami

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@ import queue
66
import sys
77
import threading
88
import time
9+
import copy
910

1011
asg = boto3.client('autoscaling')
1112
ec2 = boto3.client('ec2')
13+
ecs = boto3.client('ecs')
14+
1215

1316
def main(argv):
1417
options = parse_arguments(argv)
@@ -108,6 +111,28 @@ def run(options, step_size=1, launch_config=None, force=False, ignore_instances=
108111
info('%s - running', instance['InstanceId'])
109112
tmp_instances.remove(instance['InstanceId'])
110113

114+
container_instance_id_map = build_container_instance_map(options.cluster)
115+
116+
# Drain old instances
117+
info('draining ECS container instances...')
118+
for instance in old_instances:
119+
info('%s - draining', instance)
120+
ecs.update_container_instances_state(
121+
cluster=options.cluster,
122+
containerInstances=[container_instance_id_map[instance] for instance in old_instances],
123+
status='DRAINING')
124+
125+
draining_instances = copy.copy(old_instances)
126+
while draining_instances:
127+
time.sleep(5)
128+
ci_info = ecs.describe_container_instances(
129+
cluster=options.cluster,
130+
containerInstances=[container_instance_id_map[instance] for instance in draining_instances])
131+
for container_instance in ci_info['containerInstances']:
132+
if container_instance['runningTasksCount'] == 0:
133+
draining_instances.remove(container_instance['ec2InstanceId'])
134+
info('%s - drained', container_instance['ec2InstanceId'])
135+
111136
# Terminates the old instances that aren't necessary anymore (the ones
112137
# that were picked by the iterator).
113138
for instance in old_instances:
@@ -209,6 +234,16 @@ def filter_new_instances(instances, group_instances):
209234
new_instances.sort()
210235
return new_instances
211236

237+
def build_container_instance_map(cluster):
238+
container_instances = ecs.list_container_instances(cluster=cluster)
239+
full_info = ecs.describe_container_instances(cluster=cluster,
240+
containerInstances=container_instances['containerInstanceArns'])
241+
242+
container_instance_map = {}
243+
for ci in full_info['containerInstances']:
244+
container_instance_map[ci['ec2InstanceId']] = ci['containerInstanceArn']
245+
return container_instance_map
246+
212247
def iter_instance_groups(instances, group_size):
213248
while instances:
214249
n = min(group_size, len(instances))

0 commit comments

Comments
 (0)