1
+ # -*- coding: utf-8 -*-
2
+
1
3
import random
4
+ import time
2
5
3
6
import docker
4
7
@@ -24,6 +27,21 @@ def tearDown(self):
24
27
def get_service_name (self ):
25
28
return 'dockerpytest_{0:x}' .format (random .getrandbits (64 ))
26
29
30
+ def get_service_container (self , service_name , attempts = 20 , interval = 0.5 ):
31
+ # There is some delay between the service's creation and the creation
32
+ # of the service's containers. This method deals with the uncertainty
33
+ # when trying to retrieve the container associated with a service.
34
+ while True :
35
+ containers = self .client .containers (
36
+ filters = {'name' : [service_name ]}, quiet = True
37
+ )
38
+ if len (containers ) > 0 :
39
+ return containers [0 ]
40
+ attempts -= 1
41
+ if attempts <= 0 :
42
+ return None
43
+ time .sleep (interval )
44
+
27
45
def create_simple_service (self , name = None ):
28
46
if name :
29
47
name = 'dockerpytest_{0}' .format (name )
@@ -317,3 +335,55 @@ def test_update_service_force_update(self):
317
335
new_index = svc_info ['Version' ]['Index' ]
318
336
assert new_index > version_index
319
337
assert svc_info ['Spec' ]['TaskTemplate' ]['ForceUpdate' ] == 10
338
+
339
+ @requires_api_version ('1.25' )
340
+ def test_create_service_with_secret (self ):
341
+ secret_name = 'favorite_touhou'
342
+ secret_data = b'phantasmagoria of flower view'
343
+ secret_id = self .client .create_secret (secret_name , secret_data )
344
+ self .tmp_secrets .append (secret_id )
345
+ secret_ref = docker .types .SecretReference (secret_id , secret_name )
346
+ container_spec = docker .types .ContainerSpec (
347
+ 'busybox' , ['top' ], secrets = [secret_ref ]
348
+ )
349
+ task_tmpl = docker .types .TaskTemplate (container_spec )
350
+ name = self .get_service_name ()
351
+ svc_id = self .client .create_service (task_tmpl , name = name )
352
+ svc_info = self .client .inspect_service (svc_id )
353
+ assert 'Secrets' in svc_info ['Spec' ]['TaskTemplate' ]['ContainerSpec' ]
354
+ secrets = svc_info ['Spec' ]['TaskTemplate' ]['ContainerSpec' ]['Secrets' ]
355
+ assert secrets [0 ] == secret_ref
356
+
357
+ container = self .get_service_container (name )
358
+ assert container is not None
359
+ exec_id = self .client .exec_create (
360
+ container , 'cat /run/secrets/{0}' .format (secret_name )
361
+ )
362
+ assert self .client .exec_start (exec_id ) == secret_data
363
+
364
+ @requires_api_version ('1.25' )
365
+ def test_create_service_with_unicode_secret (self ):
366
+ secret_name = 'favorite_touhou'
367
+ secret_data = u'東方花映塚'
368
+ secret_id = self .client .create_secret (secret_name , secret_data )
369
+ self .tmp_secrets .append (secret_id )
370
+ secret_ref = docker .types .SecretReference (secret_id , secret_name )
371
+ container_spec = docker .types .ContainerSpec (
372
+ 'busybox' , ['top' ], secrets = [secret_ref ]
373
+ )
374
+ task_tmpl = docker .types .TaskTemplate (container_spec )
375
+ name = self .get_service_name ()
376
+ svc_id = self .client .create_service (task_tmpl , name = name )
377
+ svc_info = self .client .inspect_service (svc_id )
378
+ assert 'Secrets' in svc_info ['Spec' ]['TaskTemplate' ]['ContainerSpec' ]
379
+ secrets = svc_info ['Spec' ]['TaskTemplate' ]['ContainerSpec' ]['Secrets' ]
380
+ assert secrets [0 ] == secret_ref
381
+
382
+ container = self .get_service_container (name )
383
+ assert container is not None
384
+ exec_id = self .client .exec_create (
385
+ container , 'cat /run/secrets/{0}' .format (secret_name )
386
+ )
387
+ container_secret = self .client .exec_start (exec_id )
388
+ container_secret = container_secret .decode ('utf-8' )
389
+ assert container_secret == secret_data
0 commit comments