diff --git a/doc/requirements.txt b/doc/requirements.txt index 2256888a7..f829fa739 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -5,7 +5,7 @@ docutils>=0.11 # OSI-Approved Open Source, Public Domain beautifulsoup4>=4.6.0 # MIT reno>=2.5.0 # Apache-2.0 otcdocstheme # Apache-2.0 -sphinx!=1.6.6,!=1.6.7,>=1.6.5 # BSD +sphinx>=1.8.0,!=2.1.0 # BSD sphinxcontrib-apidoc>=0.2.0 # BSD cliff!=2.9.0,>=2.8.0 # Apache-2.0 oslo.i18n>=3.15.3 # Apache-2.0 diff --git a/otcextensions/_hacking.py b/otcextensions/_hacking.py new file mode 100644 index 000000000..01b05adfc --- /dev/null +++ b/otcextensions/_hacking.py @@ -0,0 +1,43 @@ +# Copyright (c) 2019, Red Hat, Inc. +# +# 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 hacking import core + +""" +Guidelines for writing new hacking checks + + - Use only for openstacksdk specific tests. OpenStack general tests + should be submitted to the common 'hacking' module. + - Pick numbers in the range O3xx. Find the current test with + the highest allocated number and then pick the next value. + - Keep the test method code in the source file ordered based + on the O3xx value. + - List the new rule in the top level HACKING.rst file + - Add test cases for each new rule to nova/tests/unit/test_hacking.py + +""" + +SETUPCLASS_RE = re.compile(r"def setUpClass\(") + + +@core.flake8ext +def assert_no_setupclass(logical_line): + """Check for use of setUpClass + + O300 + """ + if SETUPCLASS_RE.match(logical_line): + yield (0, "O300: setUpClass not allowed") diff --git a/otcextensions/tests/functional/base.py b/otcextensions/tests/functional/base.py index 1fd65dacf..10ba085f3 100644 --- a/otcextensions/tests/functional/base.py +++ b/otcextensions/tests/functional/base.py @@ -42,16 +42,10 @@ def _get_resource_value(resource_key, default): class BaseFunctionalTest(base.TestCase): - @classmethod - def setUpClass(cls): - super(BaseFunctionalTest, cls).setUpClass() - cls.conn = connection.Connection(config=TEST_CLOUD_REGION) - sdk.register_otc_extensions(cls.conn) - - # def setUp(self): - # super(BaseFunctionalTest, self).setUp() - # self.conn = connection.Connection(config=TEST_CLOUD_REGION) - # sdk.register_otc_extensions(self.conn) + def setUp(self): + super(BaseFunctionalTest, self).setUp() + self.conn = connection.Connection(config=TEST_CLOUD_REGION) + sdk.register_otc_extensions(self.conn) def addEmptyCleanup(self, func, *args, **kwargs): def cleanup(): diff --git a/otcextensions/tests/functional/osclient/obs/v1/test_container.py b/otcextensions/tests/functional/osclient/obs/v1/test_container.py index d8aa4f46a..8164b1aab 100644 --- a/otcextensions/tests/functional/osclient/obs/v1/test_container.py +++ b/otcextensions/tests/functional/osclient/obs/v1/test_container.py @@ -29,26 +29,22 @@ class ObsContainerTests(base.TestCase): NAME = uuid.uuid4().hex OTHER_NAME = uuid.uuid4().hex - @classmethod - def setUpClass(cls): - super(ObsContainerTests, cls).setUpClass() - json_output = json.loads(cls.openstack( - CREATE_COMMAND % {'name': cls.NAME} - )) - cls.container_id = json_output["id"] - cls.assertOutput(cls.NAME, json_output['name']) - - @classmethod - def tearDownClass(cls): + def tearDown(self): try: - cls.openstack( - DELETE_COMMAND % {'name': cls.NAME} + self.openstack( + DELETE_COMMAND % {'name': self.NAME} ) finally: - super(ObsContainerTests, cls).tearDownClass() + super(ObsContainerTests, self).tearDown() def setUp(self): super(ObsContainerTests, self).setUp() + json_output = json.loads(self.openstack( + CREATE_COMMAND % {'name': self.NAME} + )) + self.container_id = json_output["id"] + self.assertOutput(self.NAME, json_output['name']) + ver_fixture = fixtures.EnvironmentVariable( 'OS_OBS_API_VERSION', '1' ) diff --git a/otcextensions/tests/functional/osclient/obs/v1/test_obj.py b/otcextensions/tests/functional/osclient/obs/v1/test_obj.py index 279f00f8b..455e5e902 100644 --- a/otcextensions/tests/functional/osclient/obs/v1/test_obj.py +++ b/otcextensions/tests/functional/osclient/obs/v1/test_obj.py @@ -35,43 +35,39 @@ class ObsObjectTests(base.TestCase): OBJECT_CONTENT = uuid.uuid4().hex - @classmethod - def setUpClass(cls): - super(ObsObjectTests, cls).setUpClass() - json_output = json.loads(cls.openstack( - CONTAINER_CREATE_COMMAND % {'name': cls.CONTAINER_NAME} - )) - cls.container_id = json_output["id"] - cls.assertOutput(cls.CONTAINER_NAME, json_output['name']) - with open(cls.OBJECT_NAME, 'w') as file: - file.write(cls.OBJECT_CONTENT) - json_output = json.loads(cls.openstack( - OBJECT_CREATE_COMMAND % { - 'name': cls.OBJECT_NAME, - 'container': cls.CONTAINER_NAME - } - )) - cls.object_id = json_output["id"] - cls.assertOutput(cls.OBJECT_NAME, json_output['name']) - - @classmethod - def tearDownClass(cls): + def tearDown(self): try: - cls.openstack( + self.openstack( OBJECT_DELETE_COMMAND % { - 'name': cls.OBJECT_NAME, - 'container': cls.CONTAINER_NAME + 'name': self.OBJECT_NAME, + 'container': self.CONTAINER_NAME } ) - cls.openstack( - CONTAINER_DELETE_COMMAND % {'name': cls.CONTAINER_NAME} + self.openstack( + CONTAINER_DELETE_COMMAND % {'name': self.CONTAINER_NAME} ) - os.remove(cls.OBJECT_NAME) + os.remove(self.OBJECT_NAME) finally: - super(ObsObjectTests, cls).tearDownClass() + super(ObsObjectTests, self).tearDown() def setUp(self): super(ObsObjectTests, self).setUp() + json_output = json.loads(self.openstack( + CONTAINER_CREATE_COMMAND % {'name': self.CONTAINER_NAME} + )) + self.container_id = json_output["id"] + self.assertOutput(self.CONTAINER_NAME, json_output['name']) + with open(self.OBJECT_NAME, 'w') as file: + file.write(self.OBJECT_CONTENT) + json_output = json.loads(self.openstack( + OBJECT_CREATE_COMMAND % { + 'name': self.OBJECT_NAME, + 'container': self.CONTAINER_NAME + } + )) + self.object_id = json_output["id"] + self.assertOutput(self.OBJECT_NAME, json_output['name']) + ver_fixture = fixtures.EnvironmentVariable( 'OS_OBS_API_VERSION', '1' ) diff --git a/otcextensions/tests/functional/osclient/volume_backup/v2/test_policy.py b/otcextensions/tests/functional/osclient/volume_backup/v2/test_policy.py index 110078a04..ffc0f9603 100644 --- a/otcextensions/tests/functional/osclient/volume_backup/v2/test_policy.py +++ b/otcextensions/tests/functional/osclient/volume_backup/v2/test_policy.py @@ -30,26 +30,21 @@ class VolumeBackupPolicyTests(base.TestCase): NAME = uuid.uuid4().hex OTHER_NAME = uuid.uuid4().hex - @classmethod - def setUpClass(cls): - super(VolumeBackupPolicyTests, cls).setUpClass() - json_output = json.loads(cls.openstack( - CREATE_COMMAND % {'name': cls.NAME} - )) - cls.policy_id = json_output["id"] - cls.assertOutput(cls.NAME, json_output['name']) - - @classmethod - def tearDownClass(cls): + def tearDown(self): try: - cls.openstack( - DELETE_COMMAND % {'id': cls.policy_id} + self.openstack( + DELETE_COMMAND % {'id': self.policy_id} ) finally: - super(VolumeBackupPolicyTests, cls).tearDownClass() + super(VolumeBackupPolicyTests, self).tearDown() def setUp(self): super(VolumeBackupPolicyTests, self).setUp() + json_output = json.loads(self.openstack( + CREATE_COMMAND % {'name': self.NAME} + )) + self.policy_id = json_output["id"] + self.assertOutput(self.NAME, json_output['name']) ver_fixture = fixtures.EnvironmentVariable( 'OS_VBS_API_VERSION', '2' ) diff --git a/otcextensions/tests/functional/sdk/deh/v1/test_host.py b/otcextensions/tests/functional/sdk/deh/v1/test_host.py index 9941305dc..7688a5ecd 100644 --- a/otcextensions/tests/functional/sdk/deh/v1/test_host.py +++ b/otcextensions/tests/functional/sdk/deh/v1/test_host.py @@ -19,12 +19,11 @@ class TestHost(base.BaseFunctionalTest): - @classmethod - def setUpClass(cls): - super(TestHost, cls).setUpClass() + def setUp(self): + super(TestHost, self).setUp() openstack.enable_logging(debug=True, http_debug=True) - cls.client = cls.conn.deh - res = cls.client.create_host( + self.client = self.conn.deh + res = self.client.create_host( name=uuid.uuid4().hex, availability_zone='eu-de-01', host_type='general', @@ -32,13 +31,12 @@ def setUpClass(cls): ) assert len(res.dedicated_host_ids) == 1 host_id = res.dedicated_host_ids[0] - cls.host = cls.client.get_host(host_id) + self.host = self.client.get_host(host_id) - @classmethod - def tearDownClass(cls): + def tearDown(self): try: - if cls.host.id: - cls.client.delete_host(cls.host) + if self.host.id: + self.client.delete_host(self.host) except openstack.exceptions.SDKException as e: _logger.warning('Got exception during clearing resources %s' % e.message) diff --git a/otcextensions/tests/functional/sdk/dms/v1/test_message.py b/otcextensions/tests/functional/sdk/dms/v1/test_message.py index d1336bee4..06f9fce0e 100644 --- a/otcextensions/tests/functional/sdk/dms/v1/test_message.py +++ b/otcextensions/tests/functional/sdk/dms/v1/test_message.py @@ -26,78 +26,76 @@ class TestMessage(base.BaseFunctionalTest): messages = [] received_messages = [] - @classmethod - def setUpClass(cls): - super(TestMessage, cls).setUpClass() + def setUp(self): + super(TestMessage, self).setUp() openstack.enable_logging(debug=True, http_debug=True) try: - cls.queue = cls.conn.dms.create_queue( + self.queue = self.conn.dms.create_queue( name=TestMessage.QUEUE_ALIAS ) except openstack.exceptions.BadRequestException: - cls.queue = cls.conn.dms.get_queue(TestMessage.QUEUE_ALIAS) + self.queue = self.conn.dms.get_queue(TestMessage.QUEUE_ALIAS) - cls.queues.append(cls.queue) + self.queues.append(self.queue) try: - cls.group = cls.conn.dms.create_group( - cls.queue, {"name": "test_group"} + self.group = self.conn.dms.create_group( + self.queue, {"name": "test_group"} ) except openstack.exceptions.DuplicateResource: - cls.queue = cls.conn.dms.groups(cls.queue) + self.queue = self.conn.dms.groups(self.queue) - cls.groups.append(cls.group) + self.groups.append(self.group) - @classmethod - def tearDownClass(cls): + def tearDown(self): try: - for queue in cls.queues: + for queue in self.queues: if queue.id: - cls.conn.dms.delete_queue(queue) + self.conn.dms.delete_queue(queue) except openstack.exceptions.SDKException as e: _logger.warning('Got exception during clearing resources %s' % e.message) - def test_list(cls): - cls.queues = list(cls.conn.dms.queues()) - cls.assertGreaterEqual(len(cls.queues), 0) - if len(cls.queues) > 0: - queue = cls.queues[0] - q = cls.conn.dms.get_queue(queue=queue.id) - cls.assertIsNotNone(q) - - def test_group(cls): - cls.queues = list(cls.conn.dms.queues()) - # cls.assertGreaterEqual(len(cls.queues), 0) - if len(cls.queues) > 0: - # queue = cls.queues[0] - # q = cls.conn.dms.get_queue(queue=queue.id) - # cls.assertIsNotNone(q) + def test_list(self): + self.queues = list(self.conn.dms.queues()) + self.assertGreaterEqual(len(self.queues), 0) + if len(self.queues) > 0: + queue = self.queues[0] + q = self.conn.dms.get_queue(queue=queue.id) + self.assertIsNotNone(q) + + def test_group(self): + self.queues = list(self.conn.dms.queues()) + # self.assertGreaterEqual(len(self.queues), 0) + if len(self.queues) > 0: + # queue = self.queues[0] + # q = self.conn.dms.get_queue(queue=queue.id) + # self.assertIsNotNone(q) try: - cls.group = cls.conn.dms.create_group( - cls.queue, {"name": "test_group"} + self.group = self.conn.dms.create_group( + self.queue, {"name": "test_group"} ) except openstack.exceptions.BadRequestException: - cls.queue = cls.conn.dms.groups(cls.queue) + self.queue = self.conn.dms.groups(self.queue) - cls.groups.append(cls.group) + self.groups.append(self.group) # OS_TEST_TIMEOUT=60 is needed due to testbed slowness @classmethod - def test_message(cls): - cls.queues = list(cls.conn.dms.queues()) - # cls.assertGreaterEqual(len(cls.queues), 0) - if len(cls.queues) > 0: - # queue = cls.queues[0] - # q = cls.conn.dms.get_queue(queue=queue.id) + def test_message(self): + self.queues = list(self.conn.dms.queues()) + # self.assertGreaterEqual(len(self.queues), 0) + if len(self.queues) > 0: + # queue = self.queues[0] + # q = self.conn.dms.get_queue(queue=queue.id) time.sleep(50) - # cls.assertIsNotNone(q) - cls.message = cls.conn.dms.send_messages( - cls.queue, + # self.assertIsNotNone(q) + self.message = self.conn.dms.send_messages( + self.queue, messages=[ {"body": "TEST11", "attributes": @@ -111,19 +109,19 @@ def test_message(cls): # "attribute1" : "value1", # "attribute2" : "value2" } } - cls.messages.append(cls.message) + self.messages.append(self.message) try: - cls.group = cls.conn.dms.create_group( - cls.queue, {"name": "test_group2"} + self.group = self.conn.dms.create_group( + self.queue, {"name": "test_group2"} ) except openstack.exceptions.BadRequestException: - cls.queue = cls.conn.dms.groups(cls.queue) + self.queue = self.conn.dms.groups(self.queue) - cls.groups.append(cls.group) + self.groups.append(self.group) - cls.received_messages = cls.dms.consume_message( - cls.queue, - cls.group + self.received_messages = self.dms.consume_message( + self.queue, + self.group ) - cls.assertGreaterEqual(len(cls.received_messages), 0) + self.assertGreaterEqual(len(self.received_messages), 0) diff --git a/otcextensions/tests/functional/sdk/dms/v1/test_queue.py b/otcextensions/tests/functional/sdk/dms/v1/test_queue.py index 2a8d83d30..ece366cfe 100644 --- a/otcextensions/tests/functional/sdk/dms/v1/test_queue.py +++ b/otcextensions/tests/functional/sdk/dms/v1/test_queue.py @@ -21,24 +21,22 @@ class TestQueue(base.BaseFunctionalTest): QUEUE_ALIAS = 'sdk_test_queue' queues = [] - @classmethod - def setUpClass(cls): - super(TestQueue, cls).setUpClass() + def setUp(self): + super(TestQueue, self).setUp() try: - cls.queue = cls.conn.dms.create_queue( + self.queue = self.conn.dms.create_queue( name=TestQueue.QUEUE_ALIAS ) except exceptions.DuplicateResource: - cls.queue = cls.conn.dms.find_queue(alias=TestQueue.QUEUE_ALIAS) + self.queue = self.conn.dms.find_queue(alias=TestQueue.QUEUE_ALIAS) - cls.queues.append(cls.queue) + self.queues.append(self.queue) - @classmethod - def tearDownClass(cls): + def tearDown(self): try: - for queue in cls.queues: + for queue in self.queues: if queue.id: - cls.conn.dms.delete_queue(queue) + self.conn.dms.delete_queue(queue) except exceptions.SDKException as e: _logger.warning('Got exception during clearing resources %s' % e.message) diff --git a/otcextensions/tests/functional/sdk/kms/v1/test_data_key.py b/otcextensions/tests/functional/sdk/kms/v1/test_data_key.py index d7a9cba06..47c1cc7d9 100644 --- a/otcextensions/tests/functional/sdk/kms/v1/test_data_key.py +++ b/otcextensions/tests/functional/sdk/kms/v1/test_data_key.py @@ -21,21 +21,19 @@ class TestDataKey(base.BaseFunctionalTest): - @classmethod - def setUpClass(cls): - super(TestDataKey, cls).setUpClass() - # cls.cmk = cls.conn.kms.find_key(alias='sdk_test_key1') - cls.cmk = cls.conn.kms.create_key( + def setUp(self): + super(TestDataKey, self).setUp() + # self.cmk = self.conn.kms.find_key(alias='sdk_test_key1') + self.cmk = self.conn.kms.create_key( key_alias=uuid.uuid4().hex ) - @classmethod - def tearDownClass(cls): + def tearDown(self): try: - if cls.cmk: - key = cls.cmk + if self.cmk: + key = self.cmk if key.id: - cls.conn.kms.schedule_key_deletion(key, 7) + self.conn.kms.schedule_key_deletion(key, 7) except exceptions.SDKException as e: _logger.warning('Got exception during clearing resources %s' % e.message) diff --git a/otcextensions/tests/functional/sdk/kms/v1/test_key.py b/otcextensions/tests/functional/sdk/kms/v1/test_key.py index 62900d995..6066b0e34 100644 --- a/otcextensions/tests/functional/sdk/kms/v1/test_key.py +++ b/otcextensions/tests/functional/sdk/kms/v1/test_key.py @@ -21,24 +21,22 @@ class TestKey(base.BaseFunctionalTest): KEY_ALIAS = 'sdk_test_key' cmks = [] - @classmethod - def setUpClass(cls): - super(TestKey, cls).setUpClass() + def setUp(self): + super(TestKey, self).setUp() try: - cls.cmk = cls.conn.kms.create_key( + self.cmk = self.conn.kms.create_key( key_alias=TestKey.KEY_ALIAS ) except exceptions.DuplicateResource: - cls.cmk = cls.conn.kms.find_key(alias=TestKey.KEY_ALIAS) + self.cmk = self.conn.kms.find_key(alias=TestKey.KEY_ALIAS) - cls.cmks.append(cls.cmk) + self.cmks.append(self.cmk) - @classmethod - def tearDownClass(cls): + def tearDown(self): try: - for key in cls.cmks: + for key in self.cmks: if key.id: - cls.conn.kms.schedule_key_deletion(key, 7) + self.conn.kms.schedule_key_deletion(key, 7) except exceptions.SDKException as e: _logger.warning('Got exception during clearing resources %s' % e.message) diff --git a/otcextensions/tests/functional/sdk/volume_backup/__init__.py b/otcextensions/tests/functional/sdk/volume_backup/__init__.py index 0de866f6a..64d4dbbb8 100644 --- a/otcextensions/tests/functional/sdk/volume_backup/__init__.py +++ b/otcextensions/tests/functional/sdk/volume_backup/__init__.py @@ -14,7 +14,6 @@ class TestVbs(base.BaseFunctionalTest): - @classmethod - def setUpClass(cls): - super(TestVbs, cls).setUpClass() - cls.client = cls.conn.volume_backup + def setUp(self): + super(TestVbs, self).setUp() + self.client = self.conn.volume_backup diff --git a/otcextensions/tests/functional/sdk/volume_backup/v2/test_backup.py b/otcextensions/tests/functional/sdk/volume_backup/v2/test_backup.py index 847997a84..f4d4dd29d 100644 --- a/otcextensions/tests/functional/sdk/volume_backup/v2/test_backup.py +++ b/otcextensions/tests/functional/sdk/volume_backup/v2/test_backup.py @@ -22,14 +22,6 @@ class TestBackup(TestVbs): volume = None job = None - @classmethod - def setUpClass(cls): - super(TestBackup, cls).setUpClass() - - @classmethod - def tearDownClass(cls): - pass - def prepare_volume(self): self.SNAPSHOT_NAME = self.getUniqueString() @@ -115,20 +107,3 @@ def test_get_backup(self): if len(backups) > 0: backup = self.client.get_backup(backups[0]) self.assertIsNotNone(backup) - - # TODO(AGoncharov) backup creation takes too long. - # 1Gb empty volume backup takes more than 4 min - # The functional test for create/delete can not be scheduled with such - # timing - # def test_create_delete_backup(self): - # self.prepare_volume() - # - # backup = self.client.create_backup( - # volume_id=self.VOLUME_ID, - # snapshot_id=self.SNAPSHOT_ID, - # name='sdk_test_backup') - # assert isinstance(backup, _backup.Backup) - # self.client.wait_for_backup(backup) - # self.client.delete_backup(backup) - # self.client.wait_for_backup_delete(backup) - # self.cleanup_volume() diff --git a/otcextensions/tests/functional/sdk/volume_backup/v2/test_backup_policy.py b/otcextensions/tests/functional/sdk/volume_backup/v2/test_backup_policy.py index c18c8361b..6a3bba660 100644 --- a/otcextensions/tests/functional/sdk/volume_backup/v2/test_backup_policy.py +++ b/otcextensions/tests/functional/sdk/volume_backup/v2/test_backup_policy.py @@ -34,25 +34,18 @@ class TestBackupPolicy(TestVbs): policy = None volume = None - @classmethod - def setUpClass(cls): - super(TestBackupPolicy, cls).setUpClass() - # for volume in cls.conn.block_store.volumes(limit=1): - # cls.volume = volume - # break - # if not cls.volume: - # raise Exception("no exists volume for test") - # create backup policy - cls.policy = create_backup_policy(cls.client, cls.BACKUP_POLICY_NAME) + def setUp(self): + super(TestBackupPolicy, self).setUp() + self.policy = create_backup_policy(self.client, + self.BACKUP_POLICY_NAME) - @classmethod - def tearDownClass(cls): + def tearDown(self): #: delete backup policy - if cls.policy and cls.volume: - cls.conn.volume_backup.unlink_resources_of_policy(cls.policy, - [cls.volume.id]) - if cls.policy: - cls.conn.volume_backup.delete_backup_policy(cls.policy) + if self.policy and self.volume: + self.conn.volume_backup.unlink_resources_of_policy( + self.policy, [self.volume.id]) + if self.policy: + self.conn.volume_backup.delete_backup_policy(self.policy) def test_list_policies(self): policies = list(self.client.backup_policies()) @@ -79,53 +72,3 @@ def test_disable_policy(self): def test_execute_policy(self): policy = self.client.enable_policy(self.policy) self.client.execute_policy(policy) - - # def test_link(self): - # VOLUME_NAME = self.getUniqueString() - # self.volume = self.conn.block_storage.create_volume( - # name=VOLUME_NAME, - # size=1) - # self.client.link_resources_to_policy(self.policy, [self.volume.id]) -# -# def get_current_policy(self): -# policies = list(self.conn.volume_backup.backup_policies()) -# for policy in policies: -# if policy.id == self.policy.id: -# return policy -# -# def test_1_list_backup_policies(self): -# policies = list(self.conn.volume_backup.backup_policies()) -# self.assertIn(self.policy.name, [p.name for p in policies]) -# -# def test_2_update_backup_policy(self): -# updated = { -# "scheduled_policy": { -# "frequency": 5, -# "start_time": "01:00" -# } -# } -# self.conn.volume_backup.update_backup_policy(self.policy, **updated) -# policy = self.get_current_policy() -# self.assertEqual(5, policy.scheduled_policy.frequency) -# self.assertEqual("01:00", policy.scheduled_policy.start_time) -# self.policy = policy -# -# def test_3_bind_and_execute(self): -# if self.policy.scheduled_policy.status == "OFF": -# self.conn.volume_backup.enable_policy(self.policy) -# -# self.conn.volume_backup.link_resources_to_policy(self.policy, -# [self.volume.id]) -# self.conn.volume_backup.execute_policy(self.policy) -# -# def test_4_enable_disable_policy(self): -# if self.policy.scheduled_policy.status == "ON": -# self.conn.volume_backup.disable_policy(self.policy) -# policy = self.get_current_policy() -# self.assertEqual("OFF", policy.scheduled_policy.status) -# self.conn.volume_backup.enable_policy(self.policy) -# self.assertEqual("ON", self.policy.scheduled_policy.status) -# -# def test_5_list_tasks(self): -# tasks = list(self.conn.volume_backup.tasks(self.policy.id)) -# print(tasks) diff --git a/tox.ini b/tox.ini index 4a5cafd7f..28b0062a1 100644 --- a/tox.ini +++ b/tox.ini @@ -40,10 +40,12 @@ commands = flake8 doc8 doc/source README.rst -[hacking] -local-check-factory = openstack._hacking.factory - [testenv:venv] +deps = + -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} + -r{toxinidir}/test-requirements.txt + -r{toxinidir}/requirements.txt + -r{toxinidir}/doc/requirements.txt commands = {posargs} [testenv:debug] @@ -62,37 +64,39 @@ commands = coverage html -d cover coverage xml -o cover/coverage.xml -[testenv:ansible] -# Need to pass some env vars for the Ansible playbooks -basepython = {env:OPENSTACKSDK_TOX_PYTHON:python2} -passenv = HOME USER -commands = {toxinidir}/extras/run-ansible-tests.sh -e {envdir} {posargs} - -# Docs currently disabled [testenv:docs] deps = - -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} + -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} + -r{toxinidir}/requirements.txt -r{toxinidir}/doc/requirements.txt -commands = sphinx-build -W -d doc/build/doctrees -b html doc/source/ doc/build/html +commands = + sphinx-build -W -d doc/build/doctrees --keep-going -b html doc/source/ doc/build/html [testenv:releasenotes] -usedevelop = False -skip_install = True -commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html +deps = + -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} + -r{toxinidir}/requirements.txt + -r{toxinidir}/doc/requirements.txt +commands = + sphinx-build -a -E -W -d releasenotes/build/doctrees --keep-going -b html releasenotes/source releasenotes/build/html [flake8] # The following are ignored on purpose. It's not super worth it to fix them. # However, if you feel strongly about it, patches will be accepted to fix them # if they fix ALL of the occurances of one and only one of them. -# H103 Is about the Apache license. It's strangely strict about the use of -# single vs double quotes in the license text. If someone decides to fix -# this, please be sure to preseve all copyright lines. # H306 Is about alphabetical imports - there's a lot to fix. # H4 Are about docstrings and there's just a huge pile of pre-existing issues. -# D* Came from sdk, unknown why they're skipped. +# W503 Is supposed to be off by default but in the latest pycodestyle isn't. +# Also, both openstacksdk and Donald Knuth disagree with the rule. Line +# breaks should occur before the binary operator for readability. ignore = H306,H4,W503 show-source = True -exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build +exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build,openstack/_services_mixin.py + +[flake8:local-plugins] +extension = + O300 = _hacking:assert_no_setupclass +paths = ./otcextensions [doc8] extensions = .rst, .yaml