1
+ #!/usr/bin/env python
1
2
# -*- coding: utf-8 -*-
2
3
"""
3
4
ecs-deploy.py
@@ -26,7 +27,9 @@ def __init__(self):
26
27
'aws_access_key_id' )
27
28
credentials = self ._arg_kwargs (credentials , 'aws_secret_key' ,
28
29
'aws_secret_access_key' )
29
- credentials = self ._arg_kwargs (credentials , 'aws_region' , 'region' )
30
+ credentials = self ._arg_kwargs (credentials , 'aws_region' ,
31
+ 'region_name' )
32
+
30
33
# init boto3 ecs client
31
34
self .client = boto3 .client ('ecs' , ** credentials )
32
35
except ClientError as err :
@@ -77,7 +80,7 @@ def _init_parser(self):
77
80
78
81
parser .add_argument (
79
82
'-r' ,
80
- '--region' ,
83
+ '--aws- region' ,
81
84
help = 'AWS Region Name. May also be set as environment variable \
82
85
AWS_DEFAULT_REGION' )
83
86
@@ -103,13 +106,17 @@ def _init_parser(self):
103
106
help = 'Name of ECS cluster' )
104
107
105
108
parser .add_argument (
106
- '-i' ,
107
- '--image' ,
109
+ '-l' ,
110
+ '--container-image' ,
111
+ action = 'append' ,
108
112
required = True ,
109
- help = 'Name of Docker image to run, ex: repo/image:latest\n Format: \
110
- [domain][:port][/repo][/][image][:tag]\n Examples: mariadb, \
111
- mariadb:latest, silintl/mariadb,\n silintl/mariadb:latest, \
112
- private.registry.com:8000/repo/image:tag' )
113
+ help = 'Name of the container with the name of Docker image to run\
114
+ \n Format: \
115
+ [container_name]=[domain][:port][/repo][/][image][:tag]\
116
+ \n Examples: db=mariadb, database=mariadb:latest, \
117
+ db=silintl/mariadb:latest, \
118
+ my_container|private.registry.com:8000/repo/image:tag. \
119
+ You can use this argument multiple times to replace images.' )
113
120
114
121
# OPTIONAL ARGUMENTS
115
122
@@ -166,26 +173,44 @@ def _run_parser(self):
166
173
self .task_definition_name = self ._task_definition_name ()
167
174
self .service_name = self ._service_name ()
168
175
169
- self .task_definition = \
170
- self .client_fn ('describe_task_definition' )['taskDefinition' ]
171
- self .new_task_definition = \
172
- self .client_fn ('register_task_definition' )['taskDefinition' ]
176
+ self .task_definition = self .client_fn (
177
+ 'describe_task_definition' )['taskDefinition' ]
178
+ print ('Current task definition: %s' %
179
+ self .task_definition ['taskDefinitionArn' ])
180
+
181
+ self .new_task_definition = self .client_fn (
182
+ 'register_task_definition' )['taskDefinition' ]
183
+ print ('New task definition: %s' %
184
+ self .new_task_definition ['taskDefinitionArn' ])
173
185
174
186
if self .task_definition :
175
187
if not self .client_fn ('update_service' ):
176
188
sys .exit (1 )
177
189
178
190
# loop for desired timeout
179
- timeout = self .args .get ('timeout' ) or time .time () + 90
191
+ timeout = self .args .get ('timeout' ) or 90
192
+ started_at = time .time ()
180
193
while True :
194
+ self .running_tasks = self .client_fn ('list_tasks' )['taskArns' ]
195
+
196
+ if len (self .running_tasks ) > 0 :
197
+ described_tasks = self .client_fn ('describe_tasks' )['tasks' ]
198
+ else :
199
+ described_tasks = []
200
+
181
201
updated = False
182
- running_tasks = self .client_fn ('describe_tasks' )['tasks' ]
183
- for task in running_tasks :
202
+ for task in described_tasks :
184
203
if task ['taskDefinitionArn' ] == \
185
204
self .new_task_definition ['taskDefinitionArn' ]:
186
- print ('SUCCESS' )
205
+ print ('Service updated successfully, '
206
+ 'new task definition running.' )
187
207
updated = True
188
- if updated or time .time () > timeout :
208
+ break
209
+ if updated :
210
+ break
211
+ elif time .time () > started_at + timeout :
212
+ print ('ERROR: New task definition not running'
213
+ 'within %d seconds' % timeout )
189
214
sys .exit (1 )
190
215
time .sleep (1 )
191
216
@@ -235,10 +260,22 @@ def client_kwargs(self, fn):
235
260
kwargs ['family' ] = self .task_definition ['family' ]
236
261
kwargs ['containerDefinitions' ] = \
237
262
self .task_definition ['containerDefinitions' ]
263
+
238
264
# optional kwargs from args
239
- if self .args .get ('image' ):
240
- kwargs ['containerDefinitions' ][0 ]['image' ] = \
241
- self .args .get ('image' )
265
+ for ci in self .args .get ('container_image' ):
266
+ ci_container_name , ci_image = ci .split ('=' )
267
+ container_found = False
268
+
269
+ for cd in kwargs ['containerDefinitions' ]:
270
+ if cd ['name' ] == ci_container_name :
271
+ cd ['image' ] = ci_image
272
+ container_found = True
273
+
274
+ if not container_found :
275
+ print ('Container %s not found in the task definition %s' %
276
+ (ci_container_name ,
277
+ self .task_definition ['taskDefinitionArn' ]))
278
+ sys .exit (1 )
242
279
243
280
elif fn == 'update_service' :
244
281
kwargs ['cluster' ] = self .cluster
@@ -260,7 +297,7 @@ def client_kwargs(self, fn):
260
297
261
298
elif fn == 'describe_tasks' :
262
299
kwargs ['cluster' ] = self .cluster
263
- kwargs ['tasks' ] = self .client_fn ( 'list_tasks' )[ 'taskArns' ]
300
+ kwargs ['tasks' ] = self .running_tasks
264
301
265
302
return kwargs
266
303
0 commit comments