@@ -363,8 +363,15 @@ def update_service(self, service, version, task_template=None, name=None,
363
363
data = {}
364
364
headers = {}
365
365
366
- data ['Name' ] = name if name is not None else current .get ('Name' )
367
- data ['Labels' ] = labels if labels is not None else current .get ('Labels' )
366
+ if name is not None :
367
+ data ['Name' ] = name
368
+ else :
369
+ data ['Name' ] = current .get ('Name' )
370
+
371
+ if labels is not None :
372
+ data ['Labels' ] = labels
373
+ else :
374
+ data ['Labels' ] = current .get ('Labels' )
368
375
369
376
if mode is not None :
370
377
if not isinstance (mode , dict ):
@@ -373,35 +380,33 @@ def update_service(self, service, version, task_template=None, name=None,
373
380
else :
374
381
data ['Mode' ] = current .get ('Mode' )
375
382
376
- merged_task_template = current .get ('TaskTemplate' , {})
377
- if task_template is not None :
378
- for task_template_key , task_template_value in task_template .items ():
379
- if task_template_key == 'ContainerSpec' :
380
- if 'ContainerSpec' not in merged_task_template :
381
- merged_task_template ['ContainerSpec' ] = {}
382
- for container_spec_key , container_spec_value in task_template ['ContainerSpec' ].items ():
383
- merged_task_template ['ContainerSpec' ][container_spec_key ] = container_spec_value
384
- else :
385
- merged_task_template [task_template_key ] = task_template_value
386
- image = merged_task_template .get ('ContainerSpec' , {}).get ('Image' , None )
387
- if image is not None :
388
- registry , repo_name = auth .resolve_repository_name (image )
389
- auth_header = auth .get_config_header (self , registry )
390
- if auth_header :
391
- headers ['X-Registry-Auth' ] = auth_header
392
- data ['TaskTemplate' ] = merged_task_template
383
+ data ['TaskTemplate' ] = self ._merge_task_template (
384
+ current .get ('TaskTemplate' , {}), task_template
385
+ )
386
+
387
+ container_spec = data ['TaskTemplate' ].get ('ContainerSpec' , {})
388
+ image = container_spec .get ('Image' , None )
389
+ if image is not None :
390
+ registry , repo_name = auth .resolve_repository_name (image )
391
+ auth_header = auth .get_config_header (self , registry )
392
+ if auth_header :
393
+ headers ['X-Registry-Auth' ] = auth_header
393
394
394
395
if update_config is not None :
395
396
data ['UpdateConfig' ] = update_config
396
397
else :
397
398
data ['UpdateConfig' ] = current .get ('UpdateConfig' )
398
399
399
400
if networks is not None :
400
- data ['TaskTemplate' ]['Networks' ] = utils .convert_service_networks (networks )
401
- else :
402
- existing_networks = current .get ('TaskTemplate' , {}).get ('Networks' ) or current .get ('Networks' )
403
- if existing_networks is not None :
404
- data ['TaskTemplate' ]['Networks' ] = existing_networks
401
+ converted_networks = utils .convert_service_networks (networks )
402
+ data ['TaskTemplate' ]['Networks' ] = converted_networks
403
+ elif data ['TaskTemplate' ].get ('Networks' ) is None :
404
+ current_task_template = current .get ('TaskTemplate' , {})
405
+ current_networks = current_task_template .get ('Networks' )
406
+ if current_networks is None :
407
+ current_networks = current .get ('Networks' )
408
+ if current_networks is not None :
409
+ data ['TaskTemplate' ]['Networks' ] = current_networks
405
410
406
411
if endpoint_spec is not None :
407
412
data ['EndpointSpec' ] = endpoint_spec
@@ -413,3 +418,17 @@ def update_service(self, service, version, task_template=None, name=None,
413
418
)
414
419
self ._raise_for_status (resp )
415
420
return True
421
+
422
+ @staticmethod
423
+ def _merge_task_template (current , override ):
424
+ merged = current .copy ()
425
+ if override is not None :
426
+ for ts_key , ts_value in override .items ():
427
+ if ts_key == 'ContainerSpec' :
428
+ if 'ContainerSpec' not in merged :
429
+ merged ['ContainerSpec' ] = {}
430
+ for cs_key , cs_value in override ['ContainerSpec' ].items ():
431
+ merged ['ContainerSpec' ][cs_key ] = cs_value
432
+ else :
433
+ merged [ts_key ] = ts_value
434
+ return merged
0 commit comments