blob: babf9653aa2c9a278305621d489e11816ed34eac [file] [log] [blame]
# Copyright 2015 NEC Corporation. All rights reserved.
#
# 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.
from oslo_config import cfg
import testtools
from tempest.api.compute import base as compute_base
from tempest.common import api_version_utils
from tempest import config
from tempest import exceptions
from tempest.tests import base
from tempest.tests import fake_config
class VersionTestNoneTolatest(compute_base.BaseV2ComputeTest):
min_microversion = None
max_microversion = 'latest'
class VersionTestNoneTo2_2(compute_base.BaseV2ComputeTest):
min_microversion = None
max_microversion = '2.2'
class VersionTest2_3ToLatest(compute_base.BaseV2ComputeTest):
min_microversion = '2.3'
max_microversion = 'latest'
class VersionTest2_5To2_10(compute_base.BaseV2ComputeTest):
min_microversion = '2.5'
max_microversion = '2.10'
class VersionTest2_10To2_10(compute_base.BaseV2ComputeTest):
min_microversion = '2.10'
max_microversion = '2.10'
class InvalidVersionTest(compute_base.BaseV2ComputeTest):
min_microversion = '2.11'
max_microversion = '2.1'
class TestMicroversionsTestsClass(base.TestCase):
def setUp(self):
super(TestMicroversionsTestsClass, self).setUp()
self.useFixture(fake_config.ConfigFixture())
self.stubs.Set(config, 'TempestConfigPrivate',
fake_config.FakePrivate)
def _test_version(self, cfg_min, cfg_max,
expected_pass_tests,
expected_skip_tests):
cfg.CONF.set_default('min_microversion',
cfg_min, group='compute-feature-enabled')
cfg.CONF.set_default('max_microversion',
cfg_max, group='compute-feature-enabled')
try:
for test_class in expected_pass_tests:
test_class.skip_checks()
for test_class in expected_skip_tests:
self.assertRaises(testtools.TestCase.skipException,
test_class.skip_checks)
except testtools.TestCase.skipException as e:
raise testtools.TestCase.failureException(e.message)
def test_config_version_none_none(self):
expected_pass_tests = [VersionTestNoneTolatest, VersionTestNoneTo2_2]
expected_skip_tests = [VersionTest2_3ToLatest, VersionTest2_5To2_10,
VersionTest2_10To2_10]
self._test_version(None, None,
expected_pass_tests,
expected_skip_tests)
def test_config_version_none_23(self):
expected_pass_tests = [VersionTestNoneTolatest, VersionTestNoneTo2_2,
VersionTest2_3ToLatest]
expected_skip_tests = [VersionTest2_5To2_10, VersionTest2_10To2_10]
self._test_version(None, '2.3',
expected_pass_tests,
expected_skip_tests)
def test_config_version_22_latest(self):
expected_pass_tests = [VersionTestNoneTolatest, VersionTestNoneTo2_2,
VersionTest2_3ToLatest, VersionTest2_5To2_10,
VersionTest2_10To2_10]
expected_skip_tests = []
self._test_version('2.2', 'latest',
expected_pass_tests,
expected_skip_tests)
def test_config_version_22_23(self):
expected_pass_tests = [VersionTestNoneTolatest, VersionTestNoneTo2_2,
VersionTest2_3ToLatest]
expected_skip_tests = [VersionTest2_5To2_10, VersionTest2_10To2_10]
self._test_version('2.2', '2.3',
expected_pass_tests,
expected_skip_tests)
def test_config_version_210_210(self):
expected_pass_tests = [VersionTestNoneTolatest,
VersionTest2_3ToLatest,
VersionTest2_5To2_10,
VersionTest2_10To2_10]
expected_skip_tests = [VersionTestNoneTo2_2]
self._test_version('2.10', '2.10',
expected_pass_tests,
expected_skip_tests)
def test_config_version_none_latest(self):
expected_pass_tests = [VersionTestNoneTolatest, VersionTestNoneTo2_2,
VersionTest2_3ToLatest, VersionTest2_5To2_10,
VersionTest2_10To2_10]
expected_skip_tests = []
self._test_version(None, 'latest',
expected_pass_tests,
expected_skip_tests)
def test_config_version_latest_latest(self):
expected_pass_tests = [VersionTestNoneTolatest, VersionTest2_3ToLatest]
expected_skip_tests = [VersionTestNoneTo2_2, VersionTest2_5To2_10,
VersionTest2_10To2_10]
self._test_version('latest', 'latest',
expected_pass_tests,
expected_skip_tests)
def test_config_invalid_version(self):
cfg.CONF.set_default('min_microversion',
'2.5', group='compute-feature-enabled')
cfg.CONF.set_default('max_microversion',
'2.1', group='compute-feature-enabled')
self.assertRaises(exceptions.InvalidConfiguration,
VersionTestNoneTolatest.skip_checks)
def test_config_version_invalid_test_version(self):
cfg.CONF.set_default('min_microversion',
None, group='compute-feature-enabled')
cfg.CONF.set_default('max_microversion',
'2.13', group='compute-feature-enabled')
self.assertRaises(exceptions.InvalidConfiguration,
InvalidVersionTest.skip_checks)
class TestVersionSkipLogic(base.TestCase):
def _test_version(self, test_min_version, test_max_version,
cfg_min_version, cfg_max_version, expected_skip=False):
try:
api_version_utils.check_skip_with_microversion(test_min_version,
test_max_version,
cfg_min_version,
cfg_max_version)
except testtools.TestCase.skipException as e:
if not expected_skip:
raise testtools.TestCase.failureException(e.message)
def test_version_min_in_range(self):
self._test_version('2.2', '2.10', '2.1', '2.7')
def test_version_max_in_range(self):
self._test_version('2.1', '2.3', '2.2', '2.7')
def test_version_cfg_in_range(self):
self._test_version('2.2', '2.9', '2.3', '2.7')
def test_version_equal(self):
self._test_version('2.2', '2.2', '2.2', '2.2')
def test_version_below_cfg_min(self):
self._test_version('2.2', '2.4', '2.5', '2.7', expected_skip=True)
def test_version_above_cfg_max(self):
self._test_version('2.8', '2.9', '2.3', '2.7', expected_skip=True)
def test_version_min_greater_than_max(self):
self.assertRaises(exceptions.InvalidConfiguration,
self._test_version, '2.8', '2.7', '2.3', '2.7')
def test_cfg_version_min_greater_than_max(self):
self.assertRaises(exceptions.InvalidConfiguration,
self._test_version, '2.2', '2.7', '2.9', '2.7')
class TestSelectRequestMicroversion(base.TestCase):
def _test_request_version(self, test_min_version,
cfg_min_version, expected_version):
selected_version = api_version_utils.select_request_microversion(
test_min_version, cfg_min_version)
self.assertEqual(expected_version, selected_version)
def test_cfg_min_version_greater(self):
self._test_request_version('2.1', '2.3', expected_version='2.3')
def test_class_min_version_greater(self):
self._test_request_version('2.5', '2.3', expected_version='2.5')
def test_cfg_min_version_none(self):
self._test_request_version('2.5', None, expected_version='2.5')
def test_class_min_version_none(self):
self._test_request_version(None, '2.3', expected_version='2.3')
def test_both_min_version_none(self):
self._test_request_version(None, None, expected_version=None)
def test_both_min_version_equal(self):
self._test_request_version('2.3', '2.3', expected_version='2.3')
class TestMicroversionHeaderMatches(base.TestCase):
def test_header_matches(self):
microversion_header_name = 'x-openstack-xyz-api-version'
request_microversion = '2.1'
test_respose = {microversion_header_name: request_microversion}
api_version_utils.assert_version_header_matches_request(
microversion_header_name, request_microversion, test_respose)
def test_header_does_not_match(self):
microversion_header_name = 'x-openstack-xyz-api-version'
request_microversion = '2.1'
test_respose = {microversion_header_name: '2.2'}
self.assertRaises(
exceptions.InvalidHTTPResponseHeader,
api_version_utils.assert_version_header_matches_request,
microversion_header_name, request_microversion, test_respose)
def test_header_not_present(self):
microversion_header_name = 'x-openstack-xyz-api-version'
request_microversion = '2.1'
test_respose = {}
self.assertRaises(
exceptions.InvalidHTTPResponseHeader,
api_version_utils.assert_version_header_matches_request,
microversion_header_name, request_microversion, test_respose)