diff --git a/pylintrc b/pylintrc deleted file mode 100644 index 4085cd38f1..0000000000 --- a/pylintrc +++ /dev/null @@ -1,7 +0,0 @@ -# pylintrc -# -# For trove we use the defaults, this file is just to shut up an -# annoying error message from pylint. -# -# Don't set pylint options here. -# diff --git a/test-requirements.txt b/test-requirements.txt index 580adcb2fa..9c7452625c 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -8,7 +8,6 @@ python-troveclient>=2.2.0 # Apache-2.0 testtools>=2.2.0 # MIT stestr>=1.1.0 # Apache-2.0 doc8>=0.8.1 # Apache-2.0 -astroid==1.6.5 # LGPLv2.1 oslotest>=3.2.0 # Apache-2.0 tenacity>=4.9.0 # Apache-2.0 reno>=3.1.0 # Apache-2.0 diff --git a/tools/trove-pylint.README b/tools/trove-pylint.README deleted file mode 100644 index a369758fc7..0000000000 --- a/tools/trove-pylint.README +++ /dev/null @@ -1,170 +0,0 @@ -trove-pylint ------------- - -trove-pylint.py is a wrapper around pylint which allows for some -custom processing relevant to the trove source tree, and suitable to -run as a CI job for trove. - -The purpose is to perform a lint check on the code and detect obvious -(lintable) errors and fix them. - -How trove-pylint works ----------------------- - -trove-pylint is driven by a configuration file which is by default, -located in tools/trove-pylint.config. This file is a json dump of the -configuration. A default configuration file looks like this. - - { - "include": ["*.py"], - "folder": "trove", - "options": ["--rcfile=./pylintrc", "-E"], - "ignored_files": ['trove/tests'], - "ignored_codes": [], - "ignored_messages": [], - "ignored_file_codes": [], - "ignored_file_messages": [], - "ignored_file_code_messages": [], - "always_error_messages": [ - "Undefined variable '_'", - "Undefined variable '_LE'", - "Undefined variable '_LI'", - "Undefined variable '_LW'", - "Undefined variable '_LC'" - ] - } - -include -------- - - Provide a list of match specs (passed to fnmatch.fnmatch). The - default is only "*.py". - -folder ------- - - Provide the name of the top level folder to lint. This is a single - value. - -options -------- - - These are the pylint launch options. The default is to specify an - rcfile and only errors. Specifying the rcfile is required, and the - file is a dummy, to suppress an annoying warning. - -ignored_files -------------- - - This is a list of paths that we wish to ignore. When a file is - considered for linting, if the path name begins with any of these - provided prefixes, the file will not be linted. We ignore the - tests directory because it has a high instance of false positives. - -ignored_codes, ignored_messages, ignored_file_codes, -ignored_file_messages, and ignored_file_code_messages ------------------------------------------------------ - - These settings identify specific failures that are to be - ignored. Each is a list, some are lists of single elements, others - are lists of lists. - - ignored_codes, and ignored_messages are lists of single elements - that are to be ignored. You could specify either the code name, or - the code numeric representation. You must specify the exact - message. - - ignored_file_codes and ignored_file_messages are lists of lists - where each element is a code and a message. - - ignored_file_code_messages is a list of lists where each element - consists of a filename, an errorcode, a message, a line number and - a function name. - -always_error_messages ---------------------- - - This is a list of messages which have a low chance of false - positives, which are always flagged as errors. - -Using trove-pylint ------------------- - -You can check your code for errors by simply running: - - tox -e pylint - -or explicitly as: - - tox -e pylint check - -The equivalent result can be obtained by running the command: - - tools/trove-pylint.py - -or - - tools/trove-pylint.py check - -Running the tool directly may require installing addition pip -modules on your machine (such as pylint), so using 'tox' is the -preferred method. - - -For example, here is the result from such a run. - - $ tox -e pylint check - ERROR: trove/common/extensions.py 575: E1003 bad-super-call, \ - TroveExtensionMiddleware.__init__: Bad first argument \ - 'ExtensionMiddleware' given to super() - Check failed. 367 files processed, 1 had errors, 1 errors recorded. - -I wish to ignore this error and keep going. To do this, I rebuild the -list of errors to ignore as follows. - - $ tox -e pylint rebuild - Rebuild completed. 367 files processed, 177 exceptions recorded. - -This caused the tool to add the following two things to the config file. - - [ - "trove/common/extensions.py", - "E1003", - "Bad first argument 'ExtensionMiddleware' given to super()", - "TroveExtensionMiddleware.__init__" - ], - [ - "trove/common/extensions.py", - "bad-super-call", - "Bad first argument 'ExtensionMiddleware' given to super()", - "TroveExtensionMiddleware.__init__" - ], - -With that done, I can recheck as shown below. - - $ tox -e pylint - Check succeeded. 367 files processed - -You can review the errors that are being currently ignored by reading -the file tools/trove-pylint.config. - -If you want to fix some of these errors, identify the configuration(s) -that are causing those errors to be ignored, remove them and re-run the -check. Once you see that the errors are in fact being reported by the -tool, go ahead and fix the problem(s) and retest. - -Known issues ------------- - -1. The tool appears to be very sensitive to the version(s) of pylint -and astroid. In testing, I've found that if the version of either of -these changes, you could either have a failure of the tool (exceptions -thrown, ...) or a different set of errors reported. - -Refer to test-requirements.txt to see the versions currently being used. - -If you run the tool on your machine and find that there are no errors, -but find that either the CI generates errors, or that the tool run -through tox generates errors, check what versions of astroid and -pylint are being run in each configuration. - diff --git a/tools/trove-pylint.config b/tools/trove-pylint.config deleted file mode 100644 index 98251bfa24..0000000000 --- a/tools/trove-pylint.config +++ /dev/null @@ -1,1712 +0,0 @@ -{ - "always_error_messages": [ - "Undefined variable '_'", - "Undefined variable '_LC'", - "Undefined variable '_LE'", - "Undefined variable '_LI'", - "Undefined variable '_LW'" - ], - "folder": "trove", - "ignored_codes": ["not-callable"], - "ignored_file_code_messages": [ - [ - "trove/backup/models.py", - "E1101", - "Class 'DBBackup' has no 'deleted' member", - "Backup.list" - ], - [ - "trove/backup/models.py", - "E1101", - "Class 'DBBackup' has no 'id' member", - "Backup.running" - ], - [ - "trove/backup/models.py", - "E1101", - "Class 'DBBackup' has no 'instance_id' member", - "Backup.fail_for_instance" - ], - [ - "trove/backup/models.py", - "E1101", - "Class 'DBBackup' has no 'instance_id' member", - "Backup.running" - ], - [ - "trove/backup/models.py", - "E1101", - "Class 'DBBackup' has no 'state' member", - "Backup.fail_for_instance" - ], - [ - "trove/backup/models.py", - "E1101", - "Class 'DBBackup' has no 'state' member", - "Backup.running" - ], - [ - "trove/backup/models.py", - "E1101", - "Class 'DBBackup' has no 'tenant_id' member", - "Backup.list" - ], - [ - "trove/backup/models.py", - "E1101", - "Class 'DBBackup' has no 'updated' member", - "Backup._paginate" - ], - [ - "trove/backup/models.py", - "E1101", - "Class 'DBDatastoreVersion' has no 'datastore_id' member", - "Backup.list" - ], - [ - "trove/backup/models.py", - "E1101", - "Instance of 'BuiltInstance' has no 'validate_can_perform_action' member", - "Backup.create._create_resources" - ], - [ - "trove/backup/models.py", - "E1101", - "Instance of 'DBBackup' has no 'checksum' member", - "DBBackup.check_swift_object_exist" - ], - [ - "trove/backup/models.py", - "E1101", - "Instance of 'DBBackup' has no 'datastore_version_id' member", - "DBBackup.datastore" - ], - [ - "trove/backup/models.py", - "E1101", - "Instance of 'DBBackup' has no 'datastore_version_id' member", - "DBBackup.datastore_version" - ], - [ - "trove/backup/models.py", - "E1101", - "Instance of 'DBBackup' has no 'id' member", - "DBBackup.check_swift_object_exist" - ], - [ - "trove/backup/models.py", - "E1101", - "Instance of 'DBBackup' has no 'location' member", - "DBBackup.check_swift_object_exist" - ], - [ - "trove/backup/models.py", - "E1101", - "Instance of 'DBBackup' has no 'location' member", - "DBBackup.filename" - ], - [ - "trove/backup/models.py", - "E1101", - "Instance of 'DBBackup' has no 'state' member", - "DBBackup.is_done" - ], - [ - "trove/backup/models.py", - "E1101", - "Instance of 'DBBackup' has no 'state' member", - "DBBackup.is_done_successfuly" - ], - [ - "trove/backup/models.py", - "E1101", - "Instance of 'DBBackup' has no 'state' member", - "DBBackup.is_running" - ], - [ - "trove/backup/models.py", - "no-member", - "Class 'DBBackup' has no 'deleted' member", - "Backup.list" - ], - [ - "trove/backup/models.py", - "no-member", - "Class 'DBBackup' has no 'id' member", - "Backup.running" - ], - [ - "trove/backup/models.py", - "no-member", - "Class 'DBBackup' has no 'instance_id' member", - "Backup.fail_for_instance" - ], - [ - "trove/backup/models.py", - "no-member", - "Class 'DBBackup' has no 'instance_id' member", - "Backup.running" - ], - [ - "trove/backup/models.py", - "no-member", - "Class 'DBBackup' has no 'state' member", - "Backup.fail_for_instance" - ], - [ - "trove/backup/models.py", - "no-member", - "Class 'DBBackup' has no 'state' member", - "Backup.running" - ], - [ - "trove/backup/models.py", - "no-member", - "Class 'DBBackup' has no 'tenant_id' member", - "Backup.list" - ], - [ - "trove/backup/models.py", - "no-member", - "Class 'DBBackup' has no 'updated' member", - "Backup._paginate" - ], - [ - "trove/backup/models.py", - "no-member", - "Class 'DBDatastoreVersion' has no 'datastore_id' member", - "Backup.list" - ], - [ - "trove/backup/models.py", - "no-member", - "Instance of 'BuiltInstance' has no 'validate_can_perform_action' member", - "Backup.create._create_resources" - ], - [ - "trove/backup/models.py", - "no-member", - "Instance of 'DBBackup' has no 'checksum' member", - "DBBackup.check_swift_object_exist" - ], - [ - "trove/backup/models.py", - "no-member", - "Instance of 'DBBackup' has no 'datastore_version_id' member", - "DBBackup.datastore" - ], - [ - "trove/backup/models.py", - "no-member", - "Instance of 'DBBackup' has no 'datastore_version_id' member", - "DBBackup.datastore_version" - ], - [ - "trove/backup/models.py", - "no-member", - "Instance of 'DBBackup' has no 'id' member", - "DBBackup.check_swift_object_exist" - ], - [ - "trove/backup/models.py", - "no-member", - "Instance of 'DBBackup' has no 'location' member", - "DBBackup.check_swift_object_exist" - ], - [ - "trove/backup/models.py", - "no-member", - "Instance of 'DBBackup' has no 'location' member", - "DBBackup.filename" - ], - [ - "trove/backup/models.py", - "no-member", - "Instance of 'DBBackup' has no 'state' member", - "DBBackup.is_done" - ], - [ - "trove/backup/models.py", - "no-member", - "Instance of 'DBBackup' has no 'state' member", - "DBBackup.is_done_successfuly" - ], - [ - "trove/backup/models.py", - "no-member", - "Instance of 'DBBackup' has no 'state' member", - "DBBackup.is_running" - ], - [ - "trove/cmd/manage.py", - "E1101", - "Class 'Commands' has no 'has' member", - "Commands.params_of" - ], - [ - "trove/cmd/manage.py", - "no-member", - "Class 'Commands' has no 'has' member", - "Commands.params_of" - ], - [ - "trove/common/context.py", - "E1101", - "Module 'inspect' has no 'getfullargspec' member", - "TroveContext._remove_incompatible_context_args" - ], - [ - "trove/common/context.py", - "no-member", - "Module 'inspect' has no 'getfullargspec' member", - "TroveContext._remove_incompatible_context_args" - ], - [ - "trove/common/extensions.py", - "E1003", - "Bad first argument 'ExtensionMiddleware' given to super()", - "TroveExtensionMiddleware.__init__" - ], - [ - "trove/common/extensions.py", - "E1101", - "Module 'lxml.etree' has no 'Element' member", - "ExtensionsXMLSerializer._populate_ext" - ], - [ - "trove/common/extensions.py", - "E1101", - "Module 'lxml.etree' has no 'Element' member", - "ExtensionsXMLSerializer.index" - ], - [ - "trove/common/extensions.py", - "E1101", - "Module 'lxml.etree' has no 'Element' member", - "ExtensionsXMLSerializer.show" - ], - [ - "trove/common/extensions.py", - "E1101", - "Module 'lxml.etree' has no 'SubElement' member", - "ExtensionsXMLSerializer._populate_ext" - ], - [ - "trove/common/extensions.py", - "E1101", - "Module 'lxml.etree' has no 'SubElement' member", - "ExtensionsXMLSerializer.index" - ], - [ - "trove/common/extensions.py", - "E1101", - "Module 'lxml.etree' has no 'tostring' member", - "ExtensionsXMLSerializer._to_xml" - ], - [ - "trove/common/extensions.py", - "bad-super-call", - "Bad first argument 'ExtensionMiddleware' given to super()", - "TroveExtensionMiddleware.__init__" - ], - [ - "trove/common/extensions.py", - "no-member", - "Module 'lxml.etree' has no 'Element' member", - "ExtensionsXMLSerializer._populate_ext" - ], - [ - "trove/common/extensions.py", - "no-member", - "Module 'lxml.etree' has no 'Element' member", - "ExtensionsXMLSerializer.index" - ], - [ - "trove/common/extensions.py", - "no-member", - "Module 'lxml.etree' has no 'Element' member", - "ExtensionsXMLSerializer.show" - ], - [ - "trove/common/extensions.py", - "no-member", - "Module 'lxml.etree' has no 'SubElement' member", - "ExtensionsXMLSerializer._populate_ext" - ], - [ - "trove/common/extensions.py", - "no-member", - "Module 'lxml.etree' has no 'SubElement' member", - "ExtensionsXMLSerializer.index" - ], - [ - "trove/common/extensions.py", - "no-member", - "Module 'lxml.etree' has no 'tostring' member", - "ExtensionsXMLSerializer._to_xml" - ], - [ - "trove/common/models.py", - "E1101", - "Instance of 'ModelBase' has no 'id' member", - "ModelBase.__eq__" - ], - [ - "trove/common/models.py", - "E1101", - "Instance of 'ModelBase' has no 'id' member", - "ModelBase.__hash__" - ], - [ - "trove/common/models.py", - "no-member", - "Instance of 'ModelBase' has no 'id' member", - "ModelBase.__eq__" - ], - [ - "trove/common/models.py", - "no-member", - "Instance of 'ModelBase' has no 'id' member", - "ModelBase.__hash__" - ], - [ - "trove/common/clients_admin.py", - "E0611", - "No name 'v1_1' in module 'novaclient'", - null - ], - [ - "trove/common/clients_admin.py", - "no-name-in-module", - "No name 'v1_1' in module 'novaclient'", - null - ], - [ - "trove/common/strategies/cluster/experimental/mongodb/api.py", - "E1101", - "Instance of 'API' has no 'get_key' member", - "MongoDbCluster.add_shard" - ], - [ - "trove/common/strategies/cluster/experimental/mongodb/api.py", - "E1101", - "Instance of 'API' has no 'mongodb_add_shard_cluster' member", - "MongoDbCluster.add_shard" - ], - [ - "trove/common/strategies/cluster/experimental/mongodb/api.py", - "no-member", - "Instance of 'API' has no 'get_key' member", - "MongoDbCluster.add_shard" - ], - [ - "trove/common/strategies/cluster/experimental/mongodb/api.py", - "no-member", - "Instance of 'API' has no 'mongodb_add_shard_cluster' member", - "MongoDbCluster.add_shard" - ], - [ - "trove/common/stream_codecs.py", - "no-member", - "Instance of 'ConfigParser' has no 'read_file' member", - "IniCodec.deserialize" - ], - [ - "trove/common/utils.py", - "E1127", - "Slice index is not an int, None, or instance with __index__", - "MethodInspector.optional_args" - ], - [ - "trove/common/utils.py", - "E1127", - "Slice index is not an int, None, or instance with __index__", - "MethodInspector.required_args" - ], - [ - "trove/common/utils.py", - "invalid-slice-index", - "Slice index is not an int, None, or instance with __index__", - "MethodInspector.optional_args" - ], - [ - "trove/common/utils.py", - "invalid-slice-index", - "Slice index is not an int, None, or instance with __index__", - "MethodInspector.required_args" - ], - [ - "trove/common/wsgi.py", - "E0102", - "class already defined line 43", - "Router" - ], - [ - "trove/common/wsgi.py", - "E0102", - "class already defined line 46", - "JSONDictSerializer" - ], - [ - "trove/common/wsgi.py", - "function-redefined", - "class already defined line 43", - "Router" - ], - [ - "trove/common/wsgi.py", - "function-redefined", - "class already defined line 46", - "JSONDictSerializer" - ], - [ - "trove/configuration/models.py", - "E1101", - "Instance of 'DBConfiguration' has no 'datastore_version_id' member", - "DBConfiguration.datastore" - ], - [ - "trove/configuration/models.py", - "E1101", - "Instance of 'DBConfiguration' has no 'datastore_version_id' member", - "DBConfiguration.datastore_version" - ], - [ - "trove/configuration/models.py", - "E1101", - "Instance of 'DBConfigurationParameter' has no 'configuration_key' member", - "DBConfigurationParameter.__hash__" - ], - [ - "trove/configuration/models.py", - "no-member", - "Instance of 'DBConfiguration' has no 'datastore_version_id' member", - "DBConfiguration.datastore" - ], - [ - "trove/configuration/models.py", - "no-member", - "Instance of 'DBConfiguration' has no 'datastore_version_id' member", - "DBConfiguration.datastore_version" - ], - [ - "trove/configuration/models.py", - "no-member", - "Instance of 'DBConfigurationParameter' has no 'configuration_key' member", - "DBConfigurationParameter.__hash__" - ], - [ - "trove/configuration/service.py", - "E1101", - "Instance of 'BuiltInstance' has no 'update_configuration' member", - "ConfigurationsController._refresh_on_all_instances" - ], - [ - "trove/configuration/service.py", - "no-member", - "Instance of 'BuiltInstance' has no 'update_configuration' member", - "ConfigurationsController._refresh_on_all_instances" - ], - [ - "trove/datastore/models.py", - "E1101", - "Class 'DBDatastoreVersion' has no 'active' member", - "Datastores.load" - ], - [ - "trove/datastore/models.py", - "E1101", - "Instance of 'BaseCapability' has no 'name' member", - "BaseCapability.__repr__" - ], - [ - "trove/datastore/models.py", - "no-member", - "Class 'DBDatastoreVersion' has no 'active' member", - "Datastores.load" - ], - [ - "trove/datastore/models.py", - "no-member", - "Instance of 'BaseCapability' has no 'name' member", - "BaseCapability.__repr__" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/007_add_volume_flavor.py", - "E1101", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/007_add_volume_flavor.py", - "no-member", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/008_add_instance_fields.py", - "E1101", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/008_add_instance_fields.py", - "no-member", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/009_add_deleted_flag_to_instances.py", - "E1101", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/009_add_deleted_flag_to_instances.py", - "no-member", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/015_add_service_type.py", - "E1101", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/015_add_service_type.py", - "E1120", - "No value for argument 'dml' in method call", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/015_add_service_type.py", - "no-member", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/015_add_service_type.py", - "no-value-for-parameter", - "No value for argument 'dml' in method call", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/016_add_datastore_type.py", - "E1101", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/016_add_datastore_type.py", - "E1101", - "Instance of 'Table' has no 'drop_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/016_add_datastore_type.py", - "no-member", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/016_add_datastore_type.py", - "no-member", - "Instance of 'Table' has no 'drop_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/017_update_datastores.py", - "E1101", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/017_update_datastores.py", - "E1101", - "Instance of 'Table' has no 'drop_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/017_update_datastores.py", - "no-member", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/017_update_datastores.py", - "no-member", - "Instance of 'Table' has no 'drop_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/020_configurations.py", - "E1101", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/020_configurations.py", - "no-member", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/022_add_backup_parent_id.py", - "E1101", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/022_add_backup_parent_id.py", - "no-member", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/029_add_backup_datastore.py", - "E1101", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/029_add_backup_datastore.py", - "no-member", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/030_add_master_slave.py", - "E1101", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/030_add_master_slave.py", - "no-member", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/031_add_timestamps_to_configurations.py", - "E1101", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/031_add_timestamps_to_configurations.py", - "no-member", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/032_clusters.py", - "E1101", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/032_clusters.py", - "no-member", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/039_region.py", - "E1101", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/039_region.py", - "E1120", - "No value for argument 'dml' in method call", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/039_region.py", - "no-member", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/039_region.py", - "no-value-for-parameter", - "No value for argument 'dml' in method call", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/040_module_priority.py", - "E1101", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/040_module_priority.py", - "no-member", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/041_instance_keys.py", - "E1101", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/041_instance_keys.py", - "no-member", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/042_add_cluster_configuration_id.py", - "E1101", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/042_add_cluster_configuration_id.py", - "no-member", - "Instance of 'Table' has no 'create_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/044_remove_datastore_configuration_parameters_deleted.py", - "E1101", - "Instance of 'Table' has no 'drop_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/044_remove_datastore_configuration_parameters_deleted.py", - "no-member", - "Instance of 'Table' has no 'drop_column' member", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/044_remove_datastore_configuration_parameters_deleted.py", - "E1120", - "No value for argument 'dml' in method call", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migrate_repo/versions/044_remove_datastore_configuration_parameters_deleted.py", - "no-value-for-parameter", - "No value for argument 'dml' in method call", - "upgrade" - ], - [ - "trove/db/sqlalchemy/migration.py", - "E0611", - "No name 'exceptions' in module 'migrate.versioning'", - null - ], - [ - "trove/db/sqlalchemy/migration.py", - "E1120", - "No value for argument 'repo_path' in function call", - "version_control" - ], - [ - "trove/db/sqlalchemy/migration.py", - "no-name-in-module", - "No name 'exceptions' in module 'migrate.versioning'", - null - ], - [ - "trove/db/sqlalchemy/migration.py", - "no-value-for-parameter", - "No value for argument 'repo_path' in function call", - "version_control" - ], - [ - "trove/dns/designate/driver.py", - "E1101", - "Instance of 'Client' has no 'domains' member", - "DesignateDriver.get_dns_zones" - ], - [ - "trove/dns/designate/driver.py", - "E1101", - "Instance of 'Client' has no 'records' member", - "DesignateDriver._get_records" - ], - [ - "trove/dns/designate/driver.py", - "E1101", - "Instance of 'Client' has no 'records' member", - "DesignateDriver.create_entry" - ], - [ - "trove/dns/designate/driver.py", - "E1101", - "Instance of 'Client' has no 'records' member", - "DesignateDriver.delete_entry" - ], - [ - "trove/dns/designate/driver.py", - "no-member", - "Instance of 'Client' has no 'domains' member", - "DesignateDriver.get_dns_zones" - ], - [ - "trove/dns/designate/driver.py", - "no-member", - "Instance of 'Client' has no 'records' member", - "DesignateDriver._get_records" - ], - [ - "trove/dns/designate/driver.py", - "no-member", - "Instance of 'Client' has no 'records' member", - "DesignateDriver.create_entry" - ], - [ - "trove/dns/designate/driver.py", - "no-member", - "Instance of 'Client' has no 'records' member", - "DesignateDriver.delete_entry" - ], - [ - "trove/extensions/mgmt/instances/service.py", - "E1101", - "Instance of 'BuiltInstance' has no 'get_diagnostics' member", - "MgmtInstanceController.diagnostics" - ], - [ - "trove/extensions/mgmt/instances/service.py", - "E1101", - "Instance of 'BuiltInstance' has no 'get_hwinfo' member", - "MgmtInstanceController.hwinfo" - ], - [ - "trove/extensions/mgmt/instances/service.py", - "E1101", - "Instance of 'BuiltInstance' has no 'rpc_ping' member", - "MgmtInstanceController.rpc_ping" - ], - [ - "trove/extensions/mgmt/instances/service.py", - "no-member", - "Instance of 'BuiltInstance' has no 'get_diagnostics' member", - "MgmtInstanceController.diagnostics" - ], - [ - "trove/extensions/mgmt/instances/service.py", - "no-member", - "Instance of 'BuiltInstance' has no 'get_hwinfo' member", - "MgmtInstanceController.hwinfo" - ], - [ - "trove/extensions/mgmt/instances/service.py", - "no-member", - "Instance of 'BuiltInstance' has no 'rpc_ping' member", - "MgmtInstanceController.rpc_ping" - ], - [ - "trove/extensions/security_group/models.py", - "E1101", - "Instance of 'SecurityGroup' has no 'id' member", - "SecurityGroup.delete" - ], - [ - "trove/extensions/security_group/models.py", - "E1101", - "Instance of 'SecurityGroup' has no 'id' member", - "SecurityGroup.get_rules" - ], - [ - "trove/extensions/security_group/models.py", - "E1101", - "Instance of 'SecurityGroup' has no 'id' member", - "SecurityGroup.instance_id" - ], - [ - "trove/extensions/security_group/models.py", - "E1101", - "Instance of 'SecurityGroupInstanceAssociation' has no 'security_group_id' member", - "SecurityGroupInstanceAssociation.get_security_group" - ], - [ - "trove/extensions/security_group/models.py", - "E1101", - "Instance of 'SecurityGroupRule' has no 'group_id' member", - "SecurityGroupRule.get_security_group" - ], - [ - "trove/extensions/security_group/models.py", - "E1101", - "Instance of 'SecurityGroupRule' has no 'id' member", - "SecurityGroupRule.delete" - ], - [ - "trove/extensions/security_group/models.py", - "no-member", - "Instance of 'SecurityGroup' has no 'id' member", - "SecurityGroup.delete" - ], - [ - "trove/extensions/security_group/models.py", - "no-member", - "Instance of 'SecurityGroup' has no 'id' member", - "SecurityGroup.get_rules" - ], - [ - "trove/extensions/security_group/models.py", - "no-member", - "Instance of 'SecurityGroup' has no 'id' member", - "SecurityGroup.instance_id" - ], - [ - "trove/extensions/security_group/models.py", - "no-member", - "Instance of 'SecurityGroupInstanceAssociation' has no 'security_group_id' member", - "SecurityGroupInstanceAssociation.get_security_group" - ], - [ - "trove/extensions/security_group/models.py", - "no-member", - "Instance of 'SecurityGroupRule' has no 'group_id' member", - "SecurityGroupRule.get_security_group" - ], - [ - "trove/extensions/security_group/models.py", - "no-member", - "Instance of 'SecurityGroupRule' has no 'id' member", - "SecurityGroupRule.delete" - ], - [ - "trove/guestagent/datastore/experimental/cassandra/service.py", - "E0611", - "No name 'Cluster' in module 'cassandra.cluster'", - null - ], - [ - "trove/guestagent/datastore/experimental/cassandra/service.py", - "E0611", - "No name 'NoHostAvailable' in module 'cassandra.cluster'", - null - ], - [ - "trove/guestagent/datastore/experimental/cassandra/service.py", - "E1101", - "Instance of 'list' has no 'split' member", - "CassandraApp.get_seeds" - ], - [ - "trove/guestagent/datastore/experimental/cassandra/service.py", - "no-member", - "Instance of 'list' has no 'split' member", - "CassandraApp.get_seeds" - ], - [ - "trove/guestagent/datastore/experimental/cassandra/service.py", - "no-name-in-module", - "No name 'Cluster' in module 'cassandra.cluster'", - null - ], - [ - "trove/guestagent/datastore/experimental/cassandra/service.py", - "no-name-in-module", - "No name 'NoHostAvailable' in module 'cassandra.cluster'", - null - ], - [ - "trove/guestagent/datastore/experimental/redis/service.py", - "E0701", - "Bad except clauses order (ConnectionError is an ancestor class of BusyLoadingError)", - "RedisAppStatus._get_actual_db_status" - ], - [ - "trove/guestagent/datastore/experimental/redis/service.py", - "bad-except-order", - "Bad except clauses order (ConnectionError is an ancestor class of BusyLoadingError)", - "RedisAppStatus._get_actual_db_status" - ], - [ - "trove/guestagent/strategies/backup/base.py", - "E1101", - "Instance of 'Popen' has no 'pid' member", - "BackupRunner.__exit__" - ], - [ - "trove/guestagent/strategies/backup/base.py", - "E1101", - "Instance of 'Popen' has no 'pid' member", - "BackupRunner._run" - ], - [ - "trove/guestagent/strategies/backup/base.py", - "E1101", - "Instance of 'Popen' has no 'stdout' member", - "BackupRunner.read" - ], - [ - "trove/guestagent/strategies/backup/base.py", - "E1101", - "Instance of 'Popen' has no 'terminate' member", - "BackupRunner.__exit__" - ], - [ - "trove/guestagent/strategies/backup/base.py", - "E1101", - "Module 'eventlet.green.subprocess' has no 'PIPE' member", - "BackupRunner._run" - ], - [ - "trove/guestagent/strategies/backup/base.py", - "no-member", - "Instance of 'Popen' has no 'pid' member", - "BackupRunner.__exit__" - ], - [ - "trove/guestagent/strategies/backup/base.py", - "no-member", - "Instance of 'Popen' has no 'pid' member", - "BackupRunner._run" - ], - [ - "trove/guestagent/strategies/backup/base.py", - "no-member", - "Instance of 'Popen' has no 'stdout' member", - "BackupRunner.read" - ], - [ - "trove/guestagent/strategies/backup/base.py", - "no-member", - "Instance of 'Popen' has no 'terminate' member", - "BackupRunner.__exit__" - ], - [ - "trove/guestagent/strategies/backup/base.py", - "no-member", - "Module 'eventlet.green.subprocess' has no 'PIPE' member", - "BackupRunner._run" - ], - [ - "trove/guestagent/strategies/restore/base.py", - "E1101", - "Instance of 'Popen' has no 'stdin' member", - "RestoreRunner._unpack" - ], - [ - "trove/guestagent/strategies/restore/base.py", - "E1101", - "Instance of 'RestoreRunner' has no 'base_restore_cmd' member", - "RestoreRunner.__init__" - ], - [ - "trove/guestagent/strategies/restore/base.py", - "E1101", - "Module 'eventlet.green.subprocess' has no 'PIPE' member", - "RestoreRunner._unpack" - ], - [ - "trove/guestagent/strategies/restore/base.py", - "no-member", - "Instance of 'Popen' has no 'stdin' member", - "RestoreRunner._unpack" - ], - [ - "trove/guestagent/strategies/restore/base.py", - "no-member", - "Instance of 'RestoreRunner' has no 'base_restore_cmd' member", - "RestoreRunner.__init__" - ], - [ - "trove/guestagent/strategies/restore/base.py", - "no-member", - "Module 'eventlet.green.subprocess' has no 'PIPE' member", - "RestoreRunner._unpack" - ], - [ - "trove/guestagent/strategies/restore/experimental/postgresql_impl.py", - "E1101", - "Instance of 'PgBaseBackup' has no 'pgsql_restore_cmd' member", - "PgBaseBackup.write_recovery_file" - ], - [ - "trove/guestagent/strategies/restore/experimental/postgresql_impl.py", - "E1101", - "Instance of 'Popen' has no 'stdin' member", - "PgDump._execute_postgres_restore" - ], - [ - "trove/guestagent/strategies/restore/experimental/postgresql_impl.py", - "E1101", - "Module 'eventlet.green.subprocess' has no 'PIPE' member", - "PgDump._execute_postgres_restore" - ], - [ - "trove/guestagent/strategies/restore/experimental/postgresql_impl.py", - "no-member", - "Instance of 'PgBaseBackup' has no 'pgsql_restore_cmd' member", - "PgBaseBackup.write_recovery_file" - ], - [ - "trove/guestagent/strategies/restore/experimental/postgresql_impl.py", - "no-member", - "Instance of 'Popen' has no 'stdin' member", - "PgDump._execute_postgres_restore" - ], - [ - "trove/guestagent/strategies/restore/experimental/postgresql_impl.py", - "no-member", - "Module 'eventlet.green.subprocess' has no 'PIPE' member", - "PgDump._execute_postgres_restore" - ], - [ - "trove/instance/models.py", - "E1101", - "Class 'DBInstance' has no 'cluster_id' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "E1101", - "Class 'DBInstance' has no 'id' member", - "Instances.load" - ], - [ - "trove/instance/models.py", - "E1101", - "Class 'DBInstance' has no 'id' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "E1101", - "Class 'DBInstance' has no 'tenant_id' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "E1101", - "Class 'DBInstanceModule' has no 'deleted' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "E1101", - "Class 'DBInstanceModule' has no 'instance_id' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "E1101", - "Class 'DBInstanceModule' has no 'md5' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "E1101", - "Class 'DBInstanceModule' has no 'module_id' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "E1101", - "Class 'DBInstanceModule' has no 'updated' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "E1101", - "Class 'DBModule' has no 'id' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "E1101", - "Class 'DBModule' has no 'md5' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "E1101", - "Class 'DBModule' has no 'name' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "E1101", - "Class 'InstanceStatus' has no 'LOGGING' member", - "SimpleInstance.status" - ], - [ - "trove/instance/models.py", - "E1101", - "Instance of 'DBInstance' has no 'encrypted_key' member", - "DBInstance.key" - ], - [ - "trove/instance/models.py", - "E1101", - "Instance of 'InstanceServiceStatus' has no 'updated_at' member", - "InstanceServiceStatus.is_uptodate" - ], - [ - "trove/instance/models.py", - "no-member", - "Class 'DBInstance' has no 'cluster_id' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "no-member", - "Class 'DBInstance' has no 'id' member", - "Instances.load" - ], - [ - "trove/instance/models.py", - "no-member", - "Class 'DBInstance' has no 'id' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "no-member", - "Class 'DBInstance' has no 'tenant_id' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "no-member", - "Class 'DBInstanceModule' has no 'deleted' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "no-member", - "Class 'DBInstanceModule' has no 'instance_id' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "no-member", - "Class 'DBInstanceModule' has no 'md5' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "no-member", - "Class 'DBInstanceModule' has no 'module_id' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "no-member", - "Class 'DBInstanceModule' has no 'updated' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "no-member", - "Class 'DBModule' has no 'id' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "no-member", - "Class 'DBModule' has no 'md5' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "no-member", - "Class 'DBModule' has no 'name' member", - "module_instance_count" - ], - [ - "trove/instance/models.py", - "no-member", - "Class 'InstanceStatus' has no 'LOGGING' member", - "SimpleInstance.status" - ], - [ - "trove/instance/models.py", - "no-member", - "Instance of 'DBInstance' has no 'encrypted_key' member", - "DBInstance.key" - ], - [ - "trove/instance/models.py", - "no-member", - "Instance of 'InstanceServiceStatus' has no 'updated_at' member", - "InstanceServiceStatus.is_uptodate" - ], - [ - "trove/instance/service.py", - "E1101", - "Instance of 'BuiltInstance' has no 'get_default_configuration_template' member", - "InstanceController.configuration" - ], - [ - "trove/instance/service.py", - "no-member", - "Instance of 'BuiltInstance' has no 'get_default_configuration_template' member", - "InstanceController.configuration" - ], - [ - "trove/module/models.py", - "E1101", - "Class 'DBModule' has no 'datastore_id' member", - "Modules.add_datastore_filter" - ], - [ - "trove/module/models.py", - "E1101", - "Class 'DBModule' has no 'datastore_version_id' member", - "Modules.add_ds_version_filter" - ], - [ - "trove/module/models.py", - "E1101", - "Class 'DBModule' has no 'id' member", - "Modules.load_by_ids" - ], - [ - "trove/module/models.py", - "E1101", - "Class 'DBModule' has no 'tenant_id' member", - "Modules.add_tenant_filter" - ], - [ - "trove/module/models.py", - "E1101", - "Class 'DBModule' has no 'tenant_id' member", - "Modules.load" - ], - [ - "trove/module/models.py", - "no-member", - "Class 'DBModule' has no 'datastore_id' member", - "Modules.add_datastore_filter" - ], - [ - "trove/module/models.py", - "no-member", - "Class 'DBModule' has no 'datastore_version_id' member", - "Modules.add_ds_version_filter" - ], - [ - "trove/module/models.py", - "no-member", - "Class 'DBModule' has no 'id' member", - "Modules.load_by_ids" - ], - [ - "trove/module/models.py", - "no-member", - "Class 'DBModule' has no 'tenant_id' member", - "Modules.add_tenant_filter" - ], - [ - "trove/module/models.py", - "no-member", - "Class 'DBModule' has no 'tenant_id' member", - "Modules.load" - ], - [ - "trove/quota/quota.py", - "E1101", - "Class 'Enum' has no 'COMMITTED' member", - "DbQuotaDriver.commit" - ], - [ - "trove/quota/quota.py", - "E1101", - "Class 'Enum' has no 'RESERVED' member", - "DbQuotaDriver.reserve" - ], - [ - "trove/quota/quota.py", - "E1101", - "Class 'Enum' has no 'ROLLEDBACK' member", - "DbQuotaDriver.rollback" - ], - [ - "trove/quota/quota.py", - "no-member", - "Class 'Enum' has no 'COMMITTED' member", - "DbQuotaDriver.commit" - ], - [ - "trove/quota/quota.py", - "no-member", - "Class 'Enum' has no 'RESERVED' member", - "DbQuotaDriver.reserve" - ], - [ - "trove/quota/quota.py", - "no-member", - "Class 'Enum' has no 'ROLLEDBACK' member", - "DbQuotaDriver.rollback" - ], - [ - "trove/taskmanager/manager.py", - "E1101", - "Instance of 'BuiltInstance' has no 'create_backup' member", - "Manager.create_backup" - ], - [ - "trove/taskmanager/manager.py", - "E1101", - "Instance of 'BuiltInstance' has no 'detach_replica' member", - "Manager.detach_replica" - ], - [ - "trove/taskmanager/manager.py", - "E1101", - "Instance of 'BuiltInstance' has no 'migrate' member", - "Manager.migrate" - ], - [ - "trove/taskmanager/manager.py", - "E1101", - "Instance of 'BuiltInstance' has no 'reboot' member", - "Manager.reboot" - ], - [ - "trove/taskmanager/manager.py", - "E1101", - "Instance of 'BuiltInstance' has no 'resize_flavor' member", - "Manager.resize_flavor" - ], - [ - "trove/taskmanager/manager.py", - "E1101", - "Instance of 'BuiltInstance' has no 'resize_volume' member", - "Manager.resize_volume" - ], - [ - "trove/taskmanager/manager.py", - "E1101", - "Instance of 'BuiltInstance' has no 'restart' member", - "Manager.restart" - ], - [ - "trove/taskmanager/manager.py", - "E1101", - "Instance of 'BuiltInstance' has no 'upgrade' member", - "Manager.upgrade" - ], - [ - "trove/taskmanager/manager.py", - "E1101", - "Instance of 'FreshInstance' has no 'create_instance' member", - "Manager._create_instance" - ], - [ - "trove/taskmanager/manager.py", - "E1101", - "Instance of 'FreshInstance' has no 'create_instance' member", - "Manager._create_replication_slave" - ], - [ - "trove/taskmanager/manager.py", - "E1101", - "Instance of 'FreshInstance' has no 'get_replication_master_snapshot' member", - "Manager._create_replication_slave" - ], - [ - "trove/taskmanager/manager.py", - "E1136", - "Value 'snapshot' is unsubscriptable", - "Manager._create_replication_slave" - ], - [ - "trove/taskmanager/manager.py", - "E1101", - "Instance of 'FreshInstance' has no 'wait_for_instance' member", - "Manager._create_instance" - ], - [ - "trove/taskmanager/manager.py", - "no-member", - "Instance of 'BuiltInstance' has no 'create_backup' member", - "Manager.create_backup" - ], - [ - "trove/taskmanager/manager.py", - "no-member", - "Instance of 'BuiltInstance' has no 'detach_replica' member", - "Manager.detach_replica" - ], - [ - "trove/taskmanager/manager.py", - "no-member", - "Instance of 'BuiltInstance' has no 'migrate' member", - "Manager.migrate" - ], - [ - "trove/taskmanager/manager.py", - "no-member", - "Instance of 'BuiltInstance' has no 'reboot' member", - "Manager.reboot" - ], - [ - "trove/taskmanager/manager.py", - "no-member", - "Instance of 'BuiltInstance' has no 'resize_flavor' member", - "Manager.resize_flavor" - ], - [ - "trove/taskmanager/manager.py", - "no-member", - "Instance of 'BuiltInstance' has no 'resize_volume' member", - "Manager.resize_volume" - ], - [ - "trove/taskmanager/manager.py", - "no-member", - "Instance of 'BuiltInstance' has no 'restart' member", - "Manager.restart" - ], - [ - "trove/taskmanager/manager.py", - "no-member", - "Instance of 'BuiltInstance' has no 'upgrade' member", - "Manager.upgrade" - ], - [ - "trove/taskmanager/manager.py", - "no-member", - "Instance of 'FreshInstance' has no 'create_instance' member", - "Manager._create_instance" - ], - [ - "trove/taskmanager/manager.py", - "no-member", - "Instance of 'FreshInstance' has no 'create_instance' member", - "Manager._create_replication_slave" - ], - [ - "trove/taskmanager/manager.py", - "no-member", - "Instance of 'FreshInstance' has no 'get_replication_master_snapshot' member", - "Manager._create_replication_slave" - ], - [ - "trove/taskmanager/manager.py", - "no-member", - "Instance of 'FreshInstance' has no 'wait_for_instance' member", - "Manager._create_instance" - ], - [ - "trove/taskmanager/models.py", - "E1101", - "Instance of 'BuiltInstance' has no 'backup_required_for_replication' member", - "FreshInstanceTasks.get_replication_master_snapshot" - ], - [ - "trove/taskmanager/models.py", - "E1101", - "Instance of 'BuiltInstance' has no 'get_replication_snapshot' member", - "FreshInstanceTasks.get_replication_master_snapshot" - ], - [ - "trove/taskmanager/models.py", - "E1101", - "Instance of 'ResizeActionBase' has no '_assert_nova_action_was_successful' member", - "ResizeActionBase._perform_nova_action" - ], - [ - "trove/taskmanager/models.py", - "E1101", - "Instance of 'ResizeActionBase' has no '_initiate_nova_action' member", - "ResizeActionBase._perform_nova_action" - ], - [ - "trove/taskmanager/models.py", - "E1101", - "Instance of 'ResizeActionBase' has no '_record_action_success' member", - "ResizeActionBase._perform_nova_action" - ], - [ - "trove/taskmanager/models.py", - "E1101", - "Instance of 'ResizeActionBase' has no '_start_datastore' member", - "ResizeActionBase._assert_datastore_is_ok" - ], - [ - "trove/taskmanager/models.py", - "E1101", - "Instance of 'str' has no 'render' member", - "FreshInstanceTasks._create_server_volume_heat" - ], - [ - "trove/taskmanager/models.py", - "E1123", - "Unexpected keyword argument 'recover_func' in method call", - "ResizeVolumeAction._resize_active_volume" - ], - [ - "trove/taskmanager/models.py", - "no-member", - "Instance of 'BuiltInstance' has no 'backup_required_for_replication' member", - "FreshInstanceTasks.get_replication_master_snapshot" - ], - [ - "trove/taskmanager/models.py", - "no-member", - "Instance of 'BuiltInstance' has no 'get_replication_snapshot' member", - "FreshInstanceTasks.get_replication_master_snapshot" - ], - [ - "trove/taskmanager/models.py", - "no-member", - "Instance of 'ResizeActionBase' has no '_assert_nova_action_was_successful' member", - "ResizeActionBase._perform_nova_action" - ], - [ - "trove/taskmanager/models.py", - "no-member", - "Instance of 'ResizeActionBase' has no '_initiate_nova_action' member", - "ResizeActionBase._perform_nova_action" - ], - [ - "trove/taskmanager/models.py", - "no-member", - "Instance of 'ResizeActionBase' has no '_record_action_success' member", - "ResizeActionBase._perform_nova_action" - ], - [ - "trove/taskmanager/models.py", - "no-member", - "Instance of 'ResizeActionBase' has no '_start_datastore' member", - "ResizeActionBase._assert_datastore_is_ok" - ], - [ - "trove/taskmanager/models.py", - "no-member", - "Instance of 'str' has no 'render' member", - "FreshInstanceTasks._create_server_volume_heat" - ], - [ - "trove/taskmanager/models.py", - "unexpected-keyword-arg", - "Unexpected keyword argument 'recover_func' in method call", - "ResizeVolumeAction._resize_active_volume" - ], - [ - "trove/common/context.py", - "E1101", - "Instance of 'TroveContext' has no 'notification' member", - "TroveContext.to_dict" - ] - ], - "ignored_file_codes": [], - "ignored_file_messages": [], - "ignored_files": [ - "trove/tests" - ], - "ignored_messages": [], - "include": [ - "*.py" - ], - "options": [ - "--rcfile=./pylintrc", - "-E" - ] -} diff --git a/tools/trove-pylint.py b/tools/trove-pylint.py deleted file mode 100755 index f705051db0..0000000000 --- a/tools/trove-pylint.py +++ /dev/null @@ -1,350 +0,0 @@ -#!/usr/bin/env python -# Copyright 2016 Tesora, 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 fnmatch -import json -from collections import OrderedDict -import io -import os -import re -import sys - -from pylint import lint -from pylint.reporters import text - -DEFAULT_CONFIG_FILE = "tools/trove-pylint.config" -DEFAULT_IGNORED_FILES = ['trove/tests'] -DEFAULT_IGNORED_CODES = [] -DEFAULT_IGNORED_MESSAGES = [] -DEFAULT_ALWAYS_ERROR = [ - "Undefined variable '_'", - "Undefined variable '_LE'", - "Undefined variable '_LI'", - "Undefined variable '_LW'", - "Undefined variable '_LC'"] - -MODE_CHECK = "check" -MODE_REBUILD = "rebuild" - -class Config(object): - def __init__(self, filename=DEFAULT_CONFIG_FILE): - - self.default_config = { - "include": ["*.py"], - "folder": "trove", - "options": ["--rcfile=./pylintrc", "-E"], - "ignored_files": DEFAULT_IGNORED_FILES, - "ignored_codes": DEFAULT_IGNORED_CODES, - "ignored_messages": DEFAULT_IGNORED_MESSAGES, - "ignored_file_codes": [], - "ignored_file_messages": [], - "ignored_file_code_messages": [], - "always_error_messages": DEFAULT_ALWAYS_ERROR - } - - self.config = self.default_config - - def sort_config(self): - sorted_config = OrderedDict() - for key in sorted(self.config.keys()): - value = self.get(key) - if isinstance(value, list) and not isinstance(value,str): - sorted_config[key] = sorted(value) - else: - sorted_config[key] = value - - return sorted_config - - def save(self, filename=DEFAULT_CONFIG_FILE): - if os.path.isfile(filename): - os.rename(filename, "%s~" % filename) - - with open(filename, 'w') as fp: - json.dump(self.sort_config(), fp, encoding="utf-8", - indent=2, separators=(',', ': ')) - - def load(self, filename=DEFAULT_CONFIG_FILE): - with open(filename) as fp: - self.config = json.load(fp, encoding="utf-8") - - def get(self, attribute): - return self.config[attribute] - - def is_file_ignored(self, f): - if any(f.startswith(i) - for i in self.config['ignored_files']): - return True - - return False - - def is_file_included(self, f): - if any(fnmatch.fnmatch(f, wc) for wc in self.config['include']): - return True - - return False - - def is_always_error(self, message): - if message in self.config['always_error_messages']: - return True - - return False - - def ignore(self, filename, code, codename, message): - # the high priority checks - if self.is_file_ignored(filename): - return True - - # never ignore messages - if self.is_always_error(message): - return False - - if code in self.config['ignored_codes']: - return True - - if codename in self.config['ignored_codes']: - return True - - if message and any(message.startswith(ignore_message) - for ignore_message - in self.config['ignored_messages']): - return True - - if filename and message and ( - [filename, message] in self.config['ignored_file_messages']): - return True - - if filename and code and ( - [filename, code] in self.config['ignored_file_codes']): - return True - - if filename and codename and ( - [filename, codename] in self.config['ignored_file_codes']): - return True - - for fcm in self.config['ignored_file_code_messages']: - if filename != fcm[0]: - # This ignore rule is for a different file. - continue - if fcm[1] not in (code, codename): - # This ignore rule is for a different code or codename. - continue - if message.startswith(fcm[2]): - return True - - return False - - def ignore_code(self, c): - _c = set(self.config['ignored_codes']) - _c.add(c) - self.config['ignored_codes'] = list(_c) - - def ignore_files(self, f): - _c = set(self.config['ignored_files']) - _c.add(f) - self.config['ignored_files'] = list(_c) - - def ignore_message(self, m): - _c = set(self.config['ignored_messages']) - _c.add(m) - self.config['ignored_messages'] = list(_c) - - def ignore_file_code(self, f, c): - _c = set(self.config['ignored_file_codes']) - _c.add((f, c)) - self.config['ignored_file_codes'] = list(_c) - - def ignore_file_message(self, f, m): - _c = set(self.config['ignored_file_messages']) - _c.add((f, m)) - self.config['ignored_file_messages'] = list(_c) - - def ignore_file_code_message(self, f, c, m, fn): - _c = set(self.config['ignored_file_code_messages']) - _c.add((f, c, m, fn)) - self.config['ignored_file_code_messages'] = list(_c) - -def main(): - if len(sys.argv) == 1 or sys.argv[1] == "check": - return check() - elif sys.argv[1] == "rebuild": - return rebuild() - elif sys.argv[1] == "initialize": - return initialize() - else: - return usage() - -def usage(): - print("Usage: %s [check|rebuild]" % sys.argv[0]) - print("\tUse this tool to perform a lint check of the trove project.") - print("\t check: perform the lint check.") - print("\t rebuild: rebuild the list of exceptions to ignore.") - return 0 - -class ParseableTextReporter(text.TextReporter): - name = 'parseable' - line_format = '{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}' - - # that's it folks - - -class LintRunner(object): - def __init__(self): - self.config = Config() - self.idline = re.compile("^[*]* Module .*") - self.detail = re.compile(r"(\S+):(\d+): \[(\S+)\((\S+)\)," - r" (\S+)?] (.*)") - - def dolint(self, filename): - exceptions = set() - - buffer = io.StringIO() - reporter = ParseableTextReporter(output=buffer) - options = list(self.config.get('options')) - options.append(filename) - lint.Run(options, reporter=reporter, exit=False) - - output = buffer.getvalue() - buffer.close() - - for line in output.splitlines(): - if self.idline.match(line): - continue - - if self.detail.match(line): - mo = self.detail.search(line) - tokens = mo.groups() - fn = tokens[0] - ln = tokens[1] - code = tokens[2] - codename = tokens[3] - func = tokens[4] - message = tokens[5] - - if not self.config.ignore(fn, code, codename, message): - exceptions.add((fn, ln, code, codename, func, message)) - - return exceptions - - def process(self, mode=MODE_CHECK): - files_processed = 0 - files_with_errors = 0 - errors_recorded = 0 - exceptions_recorded = 0 - all_exceptions = [] - - for (root, dirs, files) in os.walk(self.config.get('folder')): - # if we shouldn't even bother about this part of the - # directory structure, we can punt quietly - if self.config.is_file_ignored(root): - continue - - # since we are walking top down, let's clean up the dirs - # that we will walk by eliminating any dirs that will - # end up getting ignored - for d in dirs: - p = os.path.join(root, d) - if self.config.is_file_ignored(p): - dirs.remove(d) - - # check if we can ignore the file and process if not - for f in files: - p = os.path.join(root, f) - if self.config.is_file_ignored(p): - continue - - if not self.config.is_file_included(f): - continue - - files_processed += 1 - exceptions = self.dolint(p) - file_had_errors = 0 - - for e in exceptions: - # what we do with this exception depents on the - # kind of exception, and the mode - if self.config.is_always_error(e[5]): - all_exceptions.append(e) - errors_recorded += 1 - file_had_errors += 1 - elif mode == MODE_REBUILD: - # parameters to ignore_file_code_message are - # filename, code, message and function - self.config.ignore_file_code_message(e[0], e[2], e[-1], e[4]) - self.config.ignore_file_code_message(e[0], e[3], e[-1], e[4]) - exceptions_recorded += 1 - elif mode == MODE_CHECK: - all_exceptions.append(e) - errors_recorded += 1 - file_had_errors += 1 - - if file_had_errors: - files_with_errors += 1 - - for e in sorted(all_exceptions): - print("ERROR: %s %s: %s %s, %s: %s" % - (e[0], e[1], e[2], e[3], e[4], e[5])) - - return (files_processed, files_with_errors, errors_recorded, - exceptions_recorded) - - def rebuild(self): - self.initialize() - (files_processed, - files_with_errors, - errors_recorded, - exceptions_recorded) = self.process(mode=MODE_REBUILD) - - if files_with_errors > 0: - print("Rebuild failed. %s files processed, %s had errors, " - "%s errors recorded." % ( - files_processed, files_with_errors, errors_recorded)) - - return 1 - - self.config.save() - print("Rebuild completed. %s files processed, %s exceptions recorded." % - (files_processed, exceptions_recorded)) - return 0 - - def check(self): - self.config.load() - (files_processed, - files_with_errors, - errors_recorded, - exceptions_recorded) = self.process(mode=MODE_CHECK) - - if files_with_errors > 0: - print("Check failed. %s files processed, %s had errors, " - "%s errors recorded." % ( - files_processed, files_with_errors, errors_recorded)) - return 1 - - print("Check succeeded. %s files processed" % files_processed) - return 0 - - def initialize(self): - self.config.save() - return 0 - -def check(): - exit(LintRunner().check()) - -def rebuild(): - exit(LintRunner().rebuild()) - -def initialize(): - exit(LintRunner().initialize()) - -if __name__ == "__main__": - main()