From 5f083986ade8029ba203c06c2a26f6304f363a1a Mon Sep 17 00:00:00 2001 From: astaroverov Date: Mon, 17 Apr 2017 13:02:16 +0300 Subject: [PATCH] Prepare tests to moving validators to 'openstack/validators.py' Change-Id: I8ae17f57afdb2129fc39452f19b3c24bbabb53a9 --- .../plugins/openstack/context/cleanup/base.py | 5 +- .../openstack/context/neutron/lbaas.py | 1 + .../openstack/context/nova/keypairs.py | 1 + .../openstack/context/swift/objects.py | 1 + tests/unit/doc/test_docstrings.py | 86 +++++++++---------- 5 files changed, 49 insertions(+), 45 deletions(-) diff --git a/rally/plugins/openstack/context/cleanup/base.py b/rally/plugins/openstack/context/cleanup/base.py index 69696635..9f39a2c3 100644 --- a/rally/plugins/openstack/context/cleanup/base.py +++ b/rally/plugins/openstack/context/cleanup/base.py @@ -20,9 +20,12 @@ from rally.plugins.openstack.cleanup import manager @validation.configure("check_cleanup_resources") class CheckCleanupResourcesValidator(validation.Validator): - """Validates that openstack resource managers exist""" def __init__(self, admin_required): + """Validates that openstack resource managers exist + + :param admin_required: describes access level to resource + """ super(CheckCleanupResourcesValidator, self).__init__() self.admin_required = admin_required diff --git a/rally/plugins/openstack/context/neutron/lbaas.py b/rally/plugins/openstack/context/neutron/lbaas.py index b2cb1bc0..0dd3d8bd 100644 --- a/rally/plugins/openstack/context/neutron/lbaas.py +++ b/rally/plugins/openstack/context/neutron/lbaas.py @@ -24,6 +24,7 @@ LOG = logging.getLogger(__name__) @context.configure(name="lbaas", order=360) class Lbaas(context.Context): + """Creates a lb-pool for every subnet created in network context.""" CONFIG_SCHEMA = { "type": "object", "$schema": consts.JSON_SCHEMA, diff --git a/rally/plugins/openstack/context/nova/keypairs.py b/rally/plugins/openstack/context/nova/keypairs.py index 8c20926e..702456d7 100644 --- a/rally/plugins/openstack/context/nova/keypairs.py +++ b/rally/plugins/openstack/context/nova/keypairs.py @@ -25,6 +25,7 @@ LOG = logging.getLogger(__name__) @context.configure(name="keypair", order=310) class Keypair(context.Context): + """Create Nova KeyPair for each user.""" # NOTE(andreykurilin): "type" != "null", since we need to support backward # compatibility(previously empty dict was valid) and I hope in near diff --git a/rally/plugins/openstack/context/swift/objects.py b/rally/plugins/openstack/context/swift/objects.py index 4f9e0b40..28eb5123 100644 --- a/rally/plugins/openstack/context/swift/objects.py +++ b/rally/plugins/openstack/context/swift/objects.py @@ -25,6 +25,7 @@ LOG = logging.getLogger(__name__) @context.configure(name="swift_objects", order=360) class SwiftObjectGenerator(swift_utils.SwiftObjectMixin, context.Context): + """Create containers and objects in each tenant.""" CONFIG_SCHEMA = { "type": "object", "$schema": consts.JSON_SCHEMA, diff --git a/tests/unit/doc/test_docstrings.py b/tests/unit/doc/test_docstrings.py index 34d2a0da..b2958662 100644 --- a/tests/unit/doc/test_docstrings.py +++ b/tests/unit/doc/test_docstrings.py @@ -15,12 +15,11 @@ from rally.common.plugin import info from rally.common.plugin import plugin +from rally.common import validation from rally import plugins +from rally.task import scenario from tests.unit import test -EXCEPTIONS_DOCSTR = "missed_docstrings.txt" -EXCEPTIONS_FORMAT = "wrong_format.txt" - class DocstringsTestCase(test.TestCase): @@ -28,59 +27,58 @@ class DocstringsTestCase(test.TestCase): super(DocstringsTestCase, self).setUp() plugins.load() - self.exceptions = self._open_file( - EXCEPTIONS_DOCSTR) + self._open_file(EXCEPTIONS_FORMAT) - - def _open_file(self, filename): - with open("./tests/unit/doc/%s" % filename) as file: - return (file.read().lower().split()) + def _validate_code_block(self, plg_cls, code_block): + ignored_params = ["self", "scenario_obj"] + params_count = code_block.co_argcount + params = code_block.co_varnames[:params_count] + param_data = plg_cls.get_info()["parameters"] + documented_params = [p["name"] for p in param_data] + result = [] + for param in params: + if param not in ignored_params: + if param not in documented_params: + msg = ("Class: %(class)s Docstring for " + "%(scenario)s should" + " describe the '%(param)s' parameter" + " in the :param : clause." + % {"class": plg_cls.__name__, + "scenario": plg_cls.get_name(), + "param": param}) + result.append(msg) + return result def _check_docstrings(self, msg_buffer): for plg_cls in plugin.Plugin.get_all(): if plg_cls.__module__.startswith("rally."): - if plg_cls.get_name().lower() not in self.exceptions: - doc = info.parse_docstring(plg_cls.__doc__) - short_description = doc["short_description"] - if short_description.startswith("Test"): - msg_buffer.append("One-line description for %s" - " should be declarative and not" - " start with 'Test(s) ...'" - % plg_cls.__name__) - if not plg_cls.get_info()["title"]: - msg = ("Class '{}' should have a docstring.") - inst_name = plg_cls.__name__ - msg_buffer.append(msg.format(inst_name)) + doc = info.parse_docstring(plg_cls.__doc__) + short_description = doc["short_description"] + if short_description.startswith("Test"): + msg_buffer.append("One-line description for %s" + " should be declarative and not" + " start with 'Test(s) ...'" + % plg_cls.__name__) + if not plg_cls.get_info()["title"]: + msg = "Class '{}.{}' should have a docstring." + msg_buffer.append(msg.format(plg_cls.__module__, + plg_cls.__name__)) def _check_described_params(self, msg_buffer): for plg_cls in plugin.Plugin.get_all(): - if plg_cls.get_name().lower() not in self.exceptions: - ignored_params = ["self", "scenario_obj"] - if hasattr(plg_cls, "run"): - code_block = plg_cls.run.__code__ - params_count = code_block.co_argcount - params = code_block.co_varnames[:params_count] - param_data = plg_cls.get_info()["parameters"] - documented_params = [p["name"] for p in param_data] - for param in params: - if param not in ignored_params: - if param not in documented_params: - msg = ("Class: %(class)s Docstring for " - "%(scenario)s should" - " describe the '%(param)s' parameter" - " in the :param : clause." - % {"class": plg_cls.__name__, - "scenario": plg_cls.get_name(), - "param": param}) - msg_buffer.append(msg) + msg = [] + if hasattr(plg_cls, "run") and issubclass( + plg_cls, scenario.Scenario): + msg = self._validate_code_block(plg_cls, + plg_cls.run.__code__) + elif hasattr(plg_cls, "validate") and issubclass( + plg_cls, validation.Validator): + msg = self._validate_code_block(plg_cls, + plg_cls.__init__.__code__) + msg_buffer.extend(msg) if len(msg) else None def test_all_plugins_have_docstrings(self): - msg_buffer = [] self._check_docstrings(msg_buffer) - if msg_buffer: - self.fail("\n%s" % "\n".join(msg_buffer)) - msg_buffer = [] self._check_described_params(msg_buffer) if msg_buffer: self.fail("\n%s" % "\n".join(msg_buffer))