@@ -6,9 +6,12 @@ import queue
66import sys
77import threading
88import time
9+ import copy
910
1011asg = boto3 .client ('autoscaling' )
1112ec2 = boto3 .client ('ec2' )
13+ ecs = boto3 .client ('ecs' )
14+
1215
1316def main (argv ):
1417 options = parse_arguments (argv )
@@ -108,6 +111,25 @@ 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+ ecs .update_container_instances_state (
118+ cluster = options .cluster ,
119+ containerInstances = [container_instance_id_map [instance ] for instance in old_instances ],
120+ status = 'DRAINING' )
121+
122+ draining_instances = copy .copy (old_instances )
123+ while draining_instances :
124+ time .sleep (1 )
125+ ci_info = ecs .describe_container_instances (
126+ cluster = options .cluster ,
127+ containerInstances = [container_instance_id_map [instance ] for instance in draining_instances ])
128+ for container_instance in ci_info ['containerInstances' ]:
129+ if container_instance ['runningTasksCount' ] == 0 :
130+ draining_instances .remove (container_instance ['ec2InstanceId' ])
131+ info ('%s - drained' , container_instance ['ec2InstanceId' ])
132+
111133 # Terminates the old instances that aren't necessary anymore (the ones
112134 # that were picked by the iterator).
113135 for instance in old_instances :
@@ -209,6 +231,16 @@ def filter_new_instances(instances, group_instances):
209231 new_instances .sort ()
210232 return new_instances
211233
234+ def build_container_instance_map (cluster ):
235+ container_instances = ecs .list_container_instances (cluster = cluster )
236+ full_info = ecs .describe_container_instances (cluster = cluster ,
237+ containerInstances = container_instances ['containerInstanceArns' ])
238+
239+ container_instance_map = {}
240+ for ci in full_info ['containerInstances' ]:
241+ container_instance_map [ci ['ec2InstanceId' ]] = ci ['containerInstanceArn' ]
242+ return container_instance_map
243+
212244def iter_instance_groups (instances , group_size ):
213245 while instances :
214246 n = min (group_size , len (instances ))
0 commit comments