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,40 @@ 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 :
181
- updated = False
182
- running_tasks = self .client_fn ('describe_tasks' )['tasks' ]
183
- for task in running_tasks :
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
+
201
+ for task in described_tasks :
184
202
if task ['taskDefinitionArn' ] == \
185
203
self .new_task_definition ['taskDefinitionArn' ]:
186
- print ('SUCCESS' )
187
- updated = True
188
- if updated or time .time () > timeout :
204
+ print ('Service updated successfully, '
205
+ 'new task definition running.' )
206
+ return
207
+ if time .time () > started_at + timeout :
208
+ print ('ERROR: New task definition not running'
209
+ 'within %d seconds' % timeout )
189
210
sys .exit (1 )
190
211
time .sleep (1 )
191
212
@@ -235,10 +256,22 @@ def client_kwargs(self, fn):
235
256
kwargs ['family' ] = self .task_definition ['family' ]
236
257
kwargs ['containerDefinitions' ] = \
237
258
self .task_definition ['containerDefinitions' ]
259
+
238
260
# optional kwargs from args
239
- if self .args .get ('image' ):
240
- kwargs ['containerDefinitions' ][0 ]['image' ] = \
241
- self .args .get ('image' )
261
+ for ci in self .args .get ('container_image' ):
262
+ ci_container_name , ci_image = ci .split ('=' )
263
+ container_found = False
264
+
265
+ for cd in kwargs ['containerDefinitions' ]:
266
+ if cd ['name' ] == ci_container_name :
267
+ cd ['image' ] = ci_image
268
+ container_found = True
269
+
270
+ if not container_found :
271
+ print ('Container %s not found in the task definition %s' %
272
+ (ci_container_name ,
273
+ self .task_definition ['taskDefinitionArn' ]))
274
+ sys .exit (1 )
242
275
243
276
elif fn == 'update_service' :
244
277
kwargs ['cluster' ] = self .cluster
@@ -260,7 +293,7 @@ def client_kwargs(self, fn):
260
293
261
294
elif fn == 'describe_tasks' :
262
295
kwargs ['cluster' ] = self .cluster
263
- kwargs ['tasks' ] = self .client_fn ( 'list_tasks' )[ 'taskArns' ]
296
+ kwargs ['tasks' ] = self .running_tasks
264
297
265
298
return kwargs
266
299
0 commit comments