summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJoffrey F <joffrey@docker.com>2017-02-10 15:40:55 -0800
committerJoffrey F <joffrey@docker.com>2017-02-13 17:06:25 -0800
commite8a86e40cc387e98fa40e7e3638b921e1b9e18d1 (patch)
tree3c9ae19d9885717881145ef4fc7703947478c7e1 /tests
parentd1038c422b2a069494476dd743cc06e11e8939e7 (diff)
downloaddocker-py-e8a86e40cc387e98fa40e7e3638b921e1b9e18d1.tar.gz
Add tests for secret API implementation
Signed-off-by: Joffrey F <joffrey@docker.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/integration/api_secret_test.py69
-rw-r--r--tests/integration/api_service_test.py70
-rw-r--r--tests/integration/base.py7
-rw-r--r--tests/unit/api_container_test.py6
-rw-r--r--tests/unit/api_image_test.py2
5 files changed, 150 insertions, 4 deletions
diff --git a/tests/integration/api_secret_test.py b/tests/integration/api_secret_test.py
new file mode 100644
index 0000000..dcd880f
--- /dev/null
+++ b/tests/integration/api_secret_test.py
@@ -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']
diff --git a/tests/integration/api_service_test.py b/tests/integration/api_service_test.py
index fe96459..1dd295d 100644
--- a/tests/integration/api_service_test.py
+++ b/tests/integration/api_service_test.py
@@ -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
diff --git a/tests/integration/base.py b/tests/integration/base.py
index 6f00a46..aa7c6af 100644
--- a/tests/integration/base.py
+++ b/tests/integration/base.py
@@ -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)
diff --git a/tests/unit/api_container_test.py b/tests/unit/api_container_test.py
index abf3613..51d6678 100644
--- a/tests/unit/api_container_test.py
+++ b/tests/unit/api_container_test.py
@@ -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):
diff --git a/tests/unit/api_image_test.py b/tests/unit/api_image_test.py
index fbfb146..36b2a46 100644
--- a/tests/unit/api_image_test.py
+++ b/tests/unit/api_image_test.py
@@ -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):