From d2edc7f665923bb41f00ac5111e5b9640b71bfa5 Mon Sep 17 00:00:00 2001 From: Hongbin Lu Date: Thu, 25 May 2017 23:55:59 +0000 Subject: [PATCH] Add more tempest tests for container run Add the following test cases: * Run a container with image from Glance * Run a container with environment variables set * Run a container with labels set * Run a container with restart_policy * Run a container with interactive mode enabled Partial-Implements: blueprint zun-functional-test Change-Id: I6d1f564d787e60b24c38314b7fdfe26a5bd0e50f --- zun/tests/tempest/api/clients.py | 18 +++++-- zun/tests/tempest/api/common/datagen.py | 8 ++- zun/tests/tempest/api/test_containers.py | 62 ++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 4 deletions(-) diff --git a/zun/tests/tempest/api/clients.py b/zun/tests/tempest/api/clients.py index f480ccd68..d6f0359ac 100644 --- a/zun/tests/tempest/api/clients.py +++ b/zun/tests/tempest/api/clients.py @@ -13,7 +13,7 @@ from six.moves.urllib import parse from tempest import config from tempest.lib.common import rest_client -from tempest.lib.services.compute import keypairs_client +from tempest.lib.services.image.v2 import images_client from tempest import manager from zun.container.docker import utils as docker_utils @@ -30,9 +30,9 @@ class Manager(manager.Manager): def __init__(self, credentials=None, service=None): super(Manager, self).__init__(credentials=credentials) - params = {'service': CONF.container_management.catalog_type, + params = {'service': 'image', 'region': CONF.identity.region} - self.keypairs_client = keypairs_client.KeyPairsClient( + self.images_client = images_client.ImagesClient( self.auth_provider, **params) self.container_client = ZunClient(self.auth_provider) @@ -203,3 +203,15 @@ class DockerClient(object): else: return False utils.wait_for_condition(is_pid_changed) + + def pull_image(self, repo, tag=None): + with docker_utils.docker_client() as docker: + docker.pull(repo, tag=tag) + + def get_image(self, name): + with docker_utils.docker_client() as docker: + return docker.get_image(name) + + def delete_image(self, name): + with docker_utils.docker_client() as docker: + return docker.remove_image(name) diff --git a/zun/tests/tempest/api/common/datagen.py b/zun/tests/tempest/api/common/datagen.py index d378e14f4..d7a812519 100644 --- a/zun/tests/tempest/api/common/datagen.py +++ b/zun/tests/tempest/api/common/datagen.py @@ -52,9 +52,15 @@ def container_data(**kwargs): 'name': data_utils.rand_name('container'), 'image': 'cirros:latest', 'command': 'sleep 10000', + 'cpu': 0.1, 'memory': '100', 'environment': {}, - 'image_driver': 'docker' + 'labels': {}, + 'image_driver': 'docker', + 'image_pull_policy': 'always', + 'restart_policy': {'Name': 'no'}, + 'workdir': '/', + 'interactive': False } data.update(kwargs) diff --git a/zun/tests/tempest/api/test_containers.py b/zun/tests/tempest/api/test_containers.py index 3d6a72e25..af20861e1 100644 --- a/zun/tests/tempest/api/test_containers.py +++ b/zun/tests/tempest/api/test_containers.py @@ -34,6 +34,7 @@ class TestContainer(base.BaseZunTest): super(TestContainer, cls).setup_clients() cls.container_client = cls.os.container_client cls.docker_client = clients.DockerClient() + cls.images_client = cls.os.images_client @classmethod def resource_setup(cls): @@ -77,6 +78,67 @@ class TestContainer(base.BaseZunTest): def test_run_container(self): self._run_container() + @decorators.idempotent_id('c32f93e3-da88-4c13-be38-25d2e662a28e') + def test_run_container_with_image_driver_glance(self): + image = None + try: + self.docker_client.pull_image('cirros') + image_data = self.docker_client.get_image('cirros') + image = self.images_client.create_image( + name='cirros', disk_format='raw', container_format='docker') + self.images_client.store_image_file(image['id'], image_data) + # delete the local image that was previously pulled down + self.docker_client.delete_image('cirros') + + _, model = self._run_container( + image='cirros', image_driver='glance') + finally: + if image: + try: + self.images_client.delete_image(image['id']) + except Exception: + pass + + @decorators.idempotent_id('b70bedbc-5ba2-400c-8f5f-0cf05ca17151') + def test_run_container_with_environment(self): + _, model = self._run_container(environment={ + 'key1': 'env1', 'key2': 'env2'}) + + container = self.docker_client.get_container(model.uuid) + env = container.get('Config').get('Env') + self.assertTrue('key1=env1', env) + self.assertTrue('key2=env2', env) + + @decorators.idempotent_id('0e59d549-58ff-440f-8704-10e223c31cbc') + def test_run_container_with_labels(self): + _, model = self._run_container(labels={ + 'key1': 'label1', 'key2': 'label2'}) + + container = self.docker_client.get_container(model.uuid) + labels = container.get('Config').get('Labels') + self.assertTrue('key1=label1', labels) + self.assertTrue('key2=label2', labels) + + @decorators.idempotent_id('9fc7fec0-e1a9-4f65-a5a6-dba425c1607c') + def test_run_container_with_restart_policy(self): + _, model = self._run_container(restart_policy={ + 'Name': 'on-failure', 'MaximumRetryCount': 2}) + + container = self.docker_client.get_container(model.uuid) + policy = container.get('HostConfig').get('RestartPolicy') + self.assertEqual('on-failure', policy['Name']) + self.assertTrue(2, policy['MaximumRetryCount']) + + @decorators.idempotent_id('58585a4f-cdce-4dbd-9741-4416d1098f94') + def test_run_container_with_interactive(self): + _, model = self._run_container(interactive=True) + + container = self.docker_client.get_container(model.uuid) + tty = container.get('Config').get('Tty') + stdin_open = container.get('Config').get('OpenStdin') + self.assertIs(True, tty) + self.assertIs(True, stdin_open) + @decorators.idempotent_id('3fa024ef-aba1-48fe-9682-0d6b7854faa3') def test_start_stop_container(self): _, model = self._run_container()