mirror of https://github.com/docker/docker-py.git
Add tests for secret API implementation
Signed-off-by: Joffrey F <joffrey@docker.com>
This commit is contained in:
parent
d1038c422b
commit
e8a86e40cc
|
@ -1,5 +1,7 @@
|
|||
import base64
|
||||
|
||||
import six
|
||||
|
||||
from .. import utils
|
||||
|
||||
|
||||
|
@ -20,6 +22,8 @@ class SecretApiMixin(object):
|
|||
data = data.encode('utf-8')
|
||||
|
||||
data = base64.b64encode(data)
|
||||
if six.PY3:
|
||||
data = data.decode('ascii')
|
||||
body = {
|
||||
'Data': data,
|
||||
'Name': name,
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
import docker
|
||||
import pytest
|
||||
|
||||
from ..helpers import force_leave_swarm, requires_api_version
|
||||
from .base import BaseAPIIntegrationTest
|
||||
|
||||
|
||||
@requires_api_version('1.25')
|
||||
class SecretAPITest(BaseAPIIntegrationTest):
|
||||
def setUp(self):
|
||||
super(SecretAPITest, self).setUp()
|
||||
self.init_swarm()
|
||||
|
||||
def tearDown(self):
|
||||
super(SecretAPITest, self).tearDown()
|
||||
force_leave_swarm(self.client)
|
||||
|
||||
def test_create_secret(self):
|
||||
secret_id = self.client.create_secret(
|
||||
'favorite_character', 'sakuya izayoi'
|
||||
)
|
||||
self.tmp_secrets.append(secret_id)
|
||||
assert 'ID' in secret_id
|
||||
data = self.client.inspect_secret(secret_id)
|
||||
assert data['Spec']['Name'] == 'favorite_character'
|
||||
|
||||
def test_create_secret_unicode_data(self):
|
||||
secret_id = self.client.create_secret(
|
||||
'favorite_character', u'いざよいさくや'
|
||||
)
|
||||
self.tmp_secrets.append(secret_id)
|
||||
assert 'ID' in secret_id
|
||||
data = self.client.inspect_secret(secret_id)
|
||||
assert data['Spec']['Name'] == 'favorite_character'
|
||||
|
||||
def test_inspect_secret(self):
|
||||
secret_name = 'favorite_character'
|
||||
secret_id = self.client.create_secret(
|
||||
secret_name, 'sakuya izayoi'
|
||||
)
|
||||
self.tmp_secrets.append(secret_id)
|
||||
data = self.client.inspect_secret(secret_id)
|
||||
assert data['Spec']['Name'] == secret_name
|
||||
assert 'ID' in data
|
||||
assert 'Version' in data
|
||||
|
||||
def test_remove_secret(self):
|
||||
secret_name = 'favorite_character'
|
||||
secret_id = self.client.create_secret(
|
||||
secret_name, 'sakuya izayoi'
|
||||
)
|
||||
self.tmp_secrets.append(secret_id)
|
||||
|
||||
assert self.client.remove_secret(secret_id)
|
||||
with pytest.raises(docker.errors.NotFound):
|
||||
self.client.inspect_secret(secret_id)
|
||||
|
||||
def test_list_secrets(self):
|
||||
secret_name = 'favorite_character'
|
||||
secret_id = self.client.create_secret(
|
||||
secret_name, 'sakuya izayoi'
|
||||
)
|
||||
self.tmp_secrets.append(secret_id)
|
||||
|
||||
data = self.client.secrets(filters={'names': ['favorite_character']})
|
||||
assert len(data) == 1
|
||||
assert data[0]['ID'] == secret_id['ID']
|
|
@ -1,4 +1,7 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
import random
|
||||
import time
|
||||
|
||||
import docker
|
||||
|
||||
|
@ -24,6 +27,21 @@ class ServiceTest(BaseAPIIntegrationTest):
|
|||
def get_service_name(self):
|
||||
return 'dockerpytest_{0:x}'.format(random.getrandbits(64))
|
||||
|
||||
def get_service_container(self, service_name, attempts=20, interval=0.5):
|
||||
# There is some delay between the service's creation and the creation
|
||||
# of the service's containers. This method deals with the uncertainty
|
||||
# when trying to retrieve the container associated with a service.
|
||||
while True:
|
||||
containers = self.client.containers(
|
||||
filters={'name': [service_name]}, quiet=True
|
||||
)
|
||||
if len(containers) > 0:
|
||||
return containers[0]
|
||||
attempts -= 1
|
||||
if attempts <= 0:
|
||||
return None
|
||||
time.sleep(interval)
|
||||
|
||||
def create_simple_service(self, name=None):
|
||||
if name:
|
||||
name = 'dockerpytest_{0}'.format(name)
|
||||
|
@ -317,3 +335,55 @@ class ServiceTest(BaseAPIIntegrationTest):
|
|||
new_index = svc_info['Version']['Index']
|
||||
assert new_index > version_index
|
||||
assert svc_info['Spec']['TaskTemplate']['ForceUpdate'] == 10
|
||||
|
||||
@requires_api_version('1.25')
|
||||
def test_create_service_with_secret(self):
|
||||
secret_name = 'favorite_touhou'
|
||||
secret_data = b'phantasmagoria of flower view'
|
||||
secret_id = self.client.create_secret(secret_name, secret_data)
|
||||
self.tmp_secrets.append(secret_id)
|
||||
secret_ref = docker.types.SecretReference(secret_id, secret_name)
|
||||
container_spec = docker.types.ContainerSpec(
|
||||
'busybox', ['top'], secrets=[secret_ref]
|
||||
)
|
||||
task_tmpl = docker.types.TaskTemplate(container_spec)
|
||||
name = self.get_service_name()
|
||||
svc_id = self.client.create_service(task_tmpl, name=name)
|
||||
svc_info = self.client.inspect_service(svc_id)
|
||||
assert 'Secrets' in svc_info['Spec']['TaskTemplate']['ContainerSpec']
|
||||
secrets = svc_info['Spec']['TaskTemplate']['ContainerSpec']['Secrets']
|
||||
assert secrets[0] == secret_ref
|
||||
|
||||
container = self.get_service_container(name)
|
||||
assert container is not None
|
||||
exec_id = self.client.exec_create(
|
||||
container, 'cat /run/secrets/{0}'.format(secret_name)
|
||||
)
|
||||
assert self.client.exec_start(exec_id) == secret_data
|
||||
|
||||
@requires_api_version('1.25')
|
||||
def test_create_service_with_unicode_secret(self):
|
||||
secret_name = 'favorite_touhou'
|
||||
secret_data = u'東方花映塚'
|
||||
secret_id = self.client.create_secret(secret_name, secret_data)
|
||||
self.tmp_secrets.append(secret_id)
|
||||
secret_ref = docker.types.SecretReference(secret_id, secret_name)
|
||||
container_spec = docker.types.ContainerSpec(
|
||||
'busybox', ['top'], secrets=[secret_ref]
|
||||
)
|
||||
task_tmpl = docker.types.TaskTemplate(container_spec)
|
||||
name = self.get_service_name()
|
||||
svc_id = self.client.create_service(task_tmpl, name=name)
|
||||
svc_info = self.client.inspect_service(svc_id)
|
||||
assert 'Secrets' in svc_info['Spec']['TaskTemplate']['ContainerSpec']
|
||||
secrets = svc_info['Spec']['TaskTemplate']['ContainerSpec']['Secrets']
|
||||
assert secrets[0] == secret_ref
|
||||
|
||||
container = self.get_service_container(name)
|
||||
assert container is not None
|
||||
exec_id = self.client.exec_create(
|
||||
container, 'cat /run/secrets/{0}'.format(secret_name)
|
||||
)
|
||||
container_secret = self.client.exec_start(exec_id)
|
||||
container_secret = container_secret.decode('utf-8')
|
||||
assert container_secret == secret_data
|
||||
|
|
|
@ -28,6 +28,7 @@ class BaseIntegrationTest(unittest.TestCase):
|
|||
self.tmp_volumes = []
|
||||
self.tmp_networks = []
|
||||
self.tmp_plugins = []
|
||||
self.tmp_secrets = []
|
||||
|
||||
def tearDown(self):
|
||||
client = docker.from_env(version=TEST_API_VERSION)
|
||||
|
@ -52,6 +53,12 @@ class BaseIntegrationTest(unittest.TestCase):
|
|||
except docker.errors.APIError:
|
||||
pass
|
||||
|
||||
for secret in self.tmp_secrets:
|
||||
try:
|
||||
client.api.remove_secret(secret)
|
||||
except docker.errors.APIError:
|
||||
pass
|
||||
|
||||
for folder in self.tmp_folders:
|
||||
shutil.rmtree(folder)
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@ class StartContainerTest(BaseAPIClientTest):
|
|||
|
||||
self.assertEqual(
|
||||
str(excinfo.value),
|
||||
'image or container param is undefined',
|
||||
'Resource ID was not provided',
|
||||
)
|
||||
|
||||
with pytest.raises(ValueError) as excinfo:
|
||||
|
@ -53,7 +53,7 @@ class StartContainerTest(BaseAPIClientTest):
|
|||
|
||||
self.assertEqual(
|
||||
str(excinfo.value),
|
||||
'image or container param is undefined',
|
||||
'Resource ID was not provided',
|
||||
)
|
||||
|
||||
def test_start_container_regression_573(self):
|
||||
|
@ -1559,7 +1559,7 @@ class ContainerTest(BaseAPIClientTest):
|
|||
self.client.inspect_container(arg)
|
||||
|
||||
self.assertEqual(
|
||||
excinfo.value.args[0], 'image or container param is undefined'
|
||||
excinfo.value.args[0], 'Resource ID was not provided'
|
||||
)
|
||||
|
||||
def test_container_stats(self):
|
||||
|
|
|
@ -204,7 +204,7 @@ class ImageTest(BaseAPIClientTest):
|
|||
self.client.inspect_image(arg)
|
||||
|
||||
self.assertEqual(
|
||||
excinfo.value.args[0], 'image or container param is undefined'
|
||||
excinfo.value.args[0], 'Resource ID was not provided'
|
||||
)
|
||||
|
||||
def test_insert_image(self):
|
||||
|
|
Loading…
Reference in New Issue