diff options
-rw-r--r-- | .zuul.yaml | 48 | ||||
-rw-r--r-- | glanceclient/tests/functional/base.py | 3 | ||||
-rw-r--r-- | glanceclient/tests/functional/v1/__init__.py | 0 | ||||
-rw-r--r-- | glanceclient/tests/functional/v1/test_readonly_glance.py | 73 | ||||
-rw-r--r-- | glanceclient/tests/functional/v2/__init__.py | 0 | ||||
-rw-r--r-- | glanceclient/tests/functional/v2/test_http_headers.py (renamed from glanceclient/tests/functional/test_http_headers.py) | 0 | ||||
-rw-r--r-- | glanceclient/tests/functional/v2/test_readonly_glance.py (renamed from glanceclient/tests/functional/test_readonly_glance.py) | 15 | ||||
-rwxr-xr-x | tools/fix_ca_bundle.sh | 4 | ||||
-rw-r--r-- | tox.ini | 15 |
9 files changed, 136 insertions, 22 deletions
@@ -1,16 +1,54 @@ - job: + name: glanceclient-dsvm-functional-v1 + parent: devstack-tox-functional + description: | + Devstack-based functional tests for glanceclient + against the Image API v1. + + The Image API v1 is removed from glance in Rocky, but + is still supported by glanceclient until the S cycle, + so we test it against glance stable/queens. + + THIS JOB SHOULD BE REMOVED AT THE BEGINNING OF THE S + CYCLE. + override-checkout: stable/queens + required-projects: + - name: openstack/python-glanceclient + override-checkout: master + timeout: 4200 + vars: + tox_envlist: functional-v1 + devstack_localrc: + GLANCE_V1_ENABLED: true + devstack_services: + # turn off ceilometer + ceilometer-acentral: false + ceilometer-acompute: false + ceilometer-alarm-evaluator: false + ceilometer-alarm-notifier: false + ceilometer-anotification: false + ceilometer-api: false + ceilometer-collector: false + # turn on swift + s-account: true + s-container: true + s-object: true + s-proxy: true + # Hardcode glanceclient path so the job can be run on glance patches + zuul_work_dir: src/git.openstack.org/openstack/python-glanceclient + +- job: name: glanceclient-dsvm-functional parent: devstack-tox-functional description: | - devstack-based functional tests for glanceclient + Devstack-based functional tests for glanceclient. + + These test glanceclient against Image API v2 only. required-projects: - openstack/python-glanceclient timeout: 4200 vars: devstack_localrc: - # TODO(rosmaita): remove when glanceclient tests no longer - # use the Images v1 API - GLANCE_V1_ENABLED: true LIBS_FROM_GIT: python-glanceclient devstack_services: # turn off ceilometer @@ -39,11 +77,13 @@ - project: check: jobs: + - glanceclient-dsvm-functional-v1 - glanceclient-dsvm-functional - glanceclient-dsvm-functional-identity-v3-only: voting: false - openstack-tox-lower-constraints gate: jobs: + - glanceclient-dsvm-functional-v1 - glanceclient-dsvm-functional - openstack-tox-lower-constraints diff --git a/glanceclient/tests/functional/base.py b/glanceclient/tests/functional/base.py index 0efc079..578dc39 100644 --- a/glanceclient/tests/functional/base.py +++ b/glanceclient/tests/functional/base.py @@ -48,9 +48,10 @@ class ClientTestBase(base.ClientTestBase): def _get_clients(self): self.creds = credentials().get_auth_args() + venv_name = os.environ.get('OS_TESTENV_NAME', 'functional') cli_dir = os.environ.get( 'OS_GLANCECLIENT_EXEC_DIR', - os.path.join(os.path.abspath('.'), '.tox/functional/bin')) + os.path.join(os.path.abspath('.'), '.tox/%s/bin' % venv_name)) return base.CLIClient( username=self.creds['username'], diff --git a/glanceclient/tests/functional/v1/__init__.py b/glanceclient/tests/functional/v1/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/glanceclient/tests/functional/v1/__init__.py diff --git a/glanceclient/tests/functional/v1/test_readonly_glance.py b/glanceclient/tests/functional/v1/test_readonly_glance.py new file mode 100644 index 0000000..122c61b --- /dev/null +++ b/glanceclient/tests/functional/v1/test_readonly_glance.py @@ -0,0 +1,73 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import re + +from tempest.lib import exceptions + +from glanceclient.tests.functional import base + + +class SimpleReadOnlyGlanceClientTest(base.ClientTestBase): + + """Read only functional python-glanceclient tests. + + This only exercises client commands that are read only. + """ + + def test_list_v1(self): + out = self.glance('--os-image-api-version 1 image-list') + endpoints = self.parser.listing(out) + self.assertTableStruct(endpoints, [ + 'ID', 'Name', 'Disk Format', 'Container Format', + 'Size', 'Status']) + + def test_fake_action(self): + self.assertRaises(exceptions.CommandFailed, + self.glance, + 'this-does-not-exist') + + def test_member_list_v1(self): + tenant_name = '--tenant-id %s' % self.creds['project_name'] + out = self.glance('--os-image-api-version 1 member-list', + params=tenant_name) + endpoints = self.parser.listing(out) + self.assertTableStruct(endpoints, + ['Image ID', 'Member ID', 'Can Share']) + + def test_help(self): + help_text = self.glance('--os-image-api-version 1 help') + lines = help_text.split('\n') + self.assertFirstLineStartsWith(lines, 'usage: glance') + + commands = [] + cmds_start = lines.index('Positional arguments:') + cmds_end = lines.index('Optional arguments:') + command_pattern = re.compile('^ {4}([a-z0-9\-\_]+)') + for line in lines[cmds_start:cmds_end]: + match = command_pattern.match(line) + if match: + commands.append(match.group(1)) + commands = set(commands) + wanted_commands = {'bash-completion', 'help', + 'image-create', 'image-delete', + 'image-download', 'image-list', + 'image-show', 'image-update', + 'member-create', 'member-delete', + 'member-list'} + self.assertEqual(commands, wanted_commands) + + def test_version(self): + self.glance('', flags='--version') + + def test_debug_list(self): + self.glance('--os-image-api-version 1 image-list', flags='--debug') diff --git a/glanceclient/tests/functional/v2/__init__.py b/glanceclient/tests/functional/v2/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/glanceclient/tests/functional/v2/__init__.py diff --git a/glanceclient/tests/functional/test_http_headers.py b/glanceclient/tests/functional/v2/test_http_headers.py index 1596444..1596444 100644 --- a/glanceclient/tests/functional/test_http_headers.py +++ b/glanceclient/tests/functional/v2/test_http_headers.py diff --git a/glanceclient/tests/functional/test_readonly_glance.py b/glanceclient/tests/functional/v2/test_readonly_glance.py index ccd49d6..c024303 100644 --- a/glanceclient/tests/functional/test_readonly_glance.py +++ b/glanceclient/tests/functional/v2/test_readonly_glance.py @@ -24,13 +24,6 @@ class SimpleReadOnlyGlanceClientTest(base.ClientTestBase): This only exercises client commands that are read only. """ - def test_list_v1(self): - out = self.glance('--os-image-api-version 1 image-list') - endpoints = self.parser.listing(out) - self.assertTableStruct(endpoints, [ - 'ID', 'Name', 'Disk Format', 'Container Format', - 'Size', 'Status']) - def test_list_v2(self): out = self.glance('--os-image-api-version 2 image-list') endpoints = self.parser.listing(out) @@ -41,14 +34,6 @@ class SimpleReadOnlyGlanceClientTest(base.ClientTestBase): self.glance, 'this-does-not-exist') - def test_member_list_v1(self): - tenant_name = '--tenant-id %s' % self.creds['project_name'] - out = self.glance('--os-image-api-version 1 member-list', - params=tenant_name) - endpoints = self.parser.listing(out) - self.assertTableStruct(endpoints, - ['Image ID', 'Member ID', 'Can Share']) - def test_member_list_v2(self): try: # NOTE(flwang): If set disk-format and container-format, Jenkins diff --git a/tools/fix_ca_bundle.sh b/tools/fix_ca_bundle.sh index 8e3dba2..cd35d8d 100755 --- a/tools/fix_ca_bundle.sh +++ b/tools/fix_ca_bundle.sh @@ -6,10 +6,12 @@ # assumptions: # - devstack is running # - the devstack tls-proxy service is running +# - the environment var OS_TESTENV_NAME is set in tox.ini (defaults +# to 'functional' # # This code based on a function in devstack lib/tls function set_ca_bundle { - local python_cmd='.tox/functional/bin/python' + local python_cmd=".tox/${OS_TESTENV_NAME:-functional}/bin/python" local capath=$($python_cmd -c $'try:\n from requests import certs\n print (certs.where())\nexcept ImportError: pass') # of course, each distro keeps the CA store in a different location local fedora_CA='/etc/pki/tls/certs/ca-bundle.crt' @@ -30,7 +30,20 @@ warnerror = True # See glanceclient/tests/functional/README.rst # for information on running the functional tests. setenv = - OS_TEST_PATH = ./glanceclient/tests/functional + OS_TEST_PATH = ./glanceclient/tests/functional/v2 + OS_TESTENV_NAME = {envname} +whitelist_externals = + bash +commands = + bash tools/fix_ca_bundle.sh + python setup.py testr --testr-args='{posargs}' + +[testenv:functional-v1] +# TODO(rosmaita): remove this testenv at the beginning +# of the 'S' cycle +setenv = + OS_TEST_PATH = ./glanceclient/tests/functional/v1 + OS_TESTENV_NAME = {envname} whitelist_externals = bash commands = |