diff options
| author | Dolph Mathews <dolph.mathews@gmail.com> | 2012-01-23 11:02:01 -0600 |
|---|---|---|
| committer | Ziad Sawalha <github@highbridgellc.com> | 2012-01-25 00:29:37 -0600 |
| commit | b1581a1852142548814d72deb0eebee238b4fdbf (patch) | |
| tree | 38febb44f6a570fec1ada8b38773f3570a787aa7 | |
| parent | 56f7ad831765bc0d5446cf8f7cd8675a7527dc9e (diff) | |
Migrated 'enabled' int columns to bool for postgres (bug 885426)
Also included additional fixes for bp portable-identifiers
which were discovered by running existing tests against
postgres, per the bug referenced above.
Change-Id: I6c51bb817ec12df33866ff632f906d17c90c8d54
25 files changed, 196 insertions, 40 deletions
diff --git a/keystone/backends/api.py b/keystone/backends/api.py index 6fef80df..c44805b3 100755 --- a/keystone/backends/api.py +++ b/keystone/backends/api.py @@ -387,12 +387,18 @@ class BaseCredentialsAPI(object): def create(self, values): raise NotImplementedError + def update(self, id, credential): + raise NotImplementedError + def delete(self, id): raise NotImplementedError def get(self, id): raise NotImplementedError + def get_all(self): + raise NotImplementedError + def get_by_access(self, access): raise NotImplementedError diff --git a/keystone/backends/sqlalchemy/__init__.py b/keystone/backends/sqlalchemy/__init__.py index 24b2a240..cea111c1 100755 --- a/keystone/backends/sqlalchemy/__init__.py +++ b/keystone/backends/sqlalchemy/__init__.py @@ -15,7 +15,8 @@ # License for the specific language governing permissions and limitations # under the License. -# package import +# pylint: disable=W0602,W0603 + from sqlalchemy.orm import joinedload, aliased, sessionmaker import ast @@ -27,6 +28,7 @@ from sqlalchemy import create_engine from sqlalchemy.pool import StaticPool try: + # pylint: disable=E0611 from migrate.versioning import exceptions as versioning_exceptions except ImportError: from migrate import exceptions as versioning_exceptions @@ -37,7 +39,7 @@ from keystone.backends.sqlalchemy import migration import keystone.backends.api as top_api import keystone.backends.models as top_models -logger = logging.getLogger(__name__) +logger = logging.getLogger(__name__) # pylint: disable=C0103 _DRIVER = None @@ -96,7 +98,8 @@ class Driver(): (self.connection_str)) logging.warning(msg) - def _init_models(self, model_list): + @staticmethod + def _init_models(model_list): for model in model_list: model_class = getattr(models, model) top_models.set_value(model, model_class) diff --git a/keystone/backends/sqlalchemy/api/service.py b/keystone/backends/sqlalchemy/api/service.py index 7f15cf32..0ffb4f28 100644 --- a/keystone/backends/sqlalchemy/api/service.py +++ b/keystone/backends/sqlalchemy/api/service.py @@ -29,7 +29,7 @@ class ServiceAPI(api.BaseServiceAPI): @staticmethod def transpose(values): """ Handles transposing field names from Keystone model to - sqlalchemy mode + sqlalchemy model Differences: desc <-> description @@ -38,10 +38,22 @@ class ServiceAPI(api.BaseServiceAPI): if 'description' in values: values['desc'] = values.pop('description') + if hasattr(api.USER, 'uid_to_id'): + if 'owner_id' in values: + values['owner_id'] = api.USER.uid_to_id(values['owner_id']) + elif hasattr(values, 'owner_id'): + values.owner_id = api.USER.uid_to_id(values.owner_id) + @staticmethod def from_model(ref): """ Returns SQLAlchemy model object based on Keystone model""" if ref: + if hasattr(api.USER, 'uid_to_id'): + if 'owner_id' in ref: + ref['owner_id'] = api.USER.uid_to_id(ref['owner_id']) + elif hasattr(ref, 'owner_id'): + ref.owner_id = api.USER.uid_to_id(ref.owner_id) + result = models.Service() try: result.id = int(ref.id) @@ -57,6 +69,12 @@ class ServiceAPI(api.BaseServiceAPI): def to_model(ref): """ Returns Keystone model object based on SQLAlchemy model""" if ref: + if hasattr(api.USER, 'id_to_uid'): + if 'owner_id' in ref: + ref['owner_id'] = api.USER.id_to_uid(ref['owner_id']) + elif hasattr(ref, 'owner_id'): + ref.owner_id = api.USER.id_to_uid(ref.owner_id) + return Service(id=str(ref.id), name=ref.name, description=ref.desc, type=ref.type, owner_id=ref.owner_id) diff --git a/keystone/backends/sqlalchemy/api/tenant.py b/keystone/backends/sqlalchemy/api/tenant.py index 88d60adf..32432e5a 100755 --- a/keystone/backends/sqlalchemy/api/tenant.py +++ b/keystone/backends/sqlalchemy/api/tenant.py @@ -45,9 +45,9 @@ class TenantAPI(api.BaseTenantAPI): del values['description'] if 'enabled' in values: if values['enabled'] in [1, 'true', 'True', True]: - values['enabled'] = 1 + values['enabled'] = True else: - values['enabled'] = 0 + values['enabled'] = False @staticmethod def to_model(ref): diff --git a/keystone/backends/sqlalchemy/api/token.py b/keystone/backends/sqlalchemy/api/token.py index d3bf874b..e2624a9c 100755 --- a/keystone/backends/sqlalchemy/api/token.py +++ b/keystone/backends/sqlalchemy/api/token.py @@ -124,6 +124,9 @@ class TokenAPI(api.BaseTokenAPI): if hasattr(api.USER, 'uid_to_id'): user_id = api.USER.uid_to_id(user_id) + if hasattr(api.TENANT, 'uid_to_id'): + tenant_id = api.TENANT.uid_to_id(tenant_id) + result = session.query(models.Token).\ filter_by(user_id=user_id, tenant_id=tenant_id).\ order_by("expires desc").\ diff --git a/keystone/backends/sqlalchemy/api/user.py b/keystone/backends/sqlalchemy/api/user.py index 4e9486e0..156d79db 100755 --- a/keystone/backends/sqlalchemy/api/user.py +++ b/keystone/backends/sqlalchemy/api/user.py @@ -33,8 +33,7 @@ class UserAPI(api.BaseUserAPI): def transpose(ref): """ Transposes field names from domain to sql model""" if 'id' in ref: - ref['uid'] = ref['id'] - del ref['id'] + ref['uid'] = ref.pop('id') if hasattr(api.TENANT, 'uid_to_id'): if 'tenant_id' in ref: @@ -42,12 +41,6 @@ class UserAPI(api.BaseUserAPI): elif hasattr(ref, 'tenant_id'): ref.tenant_id = api.TENANT.uid_to_id(ref.tenant_id) - if hasattr(ref, 'enabled'): - if ref.enabled in [1, 'true', 'True', True]: - ref.enabled = 1 - else: - ref.enabled = 0 - @staticmethod def to_model(ref): """ Returns Keystone model object based on SQLAlchemy model""" @@ -90,6 +83,7 @@ class UserAPI(api.BaseUserAPI): if not session: session = get_session() + id = str(id) if id is not None else None result = session.query(models.User).filter_by(uid=id).first() return UserAPI.to_model(result) @@ -104,17 +98,20 @@ class UserAPI(api.BaseUserAPI): if not session: session = get_session() + id = str(id) if id is not None else None return session.query(models.User).filter_by(id=id).first() @staticmethod def id_to_uid(id, session=None): session = session or get_session() + id = str(id) if id is not None else None user = session.query(models.User).filter_by(id=id).first() return user.uid if user else None @staticmethod def uid_to_id(uid, session=None): session = session or get_session() + uid = str(uid) if uid is not None else None user = session.query(models.User).filter_by(uid=uid).first() return user.id if user else None @@ -276,10 +273,10 @@ class UserAPI(api.BaseUserAPI): user_rolegrant.update(values) user_rolegrant.save() - if hasattr(api.USER, 'uid_to_id'): - user_rolegrant.user_id = api.USER.uid_to_id(user_rolegrant.user_id) - if hasattr(api.TENANT, 'uid_to_id'): - user_rolegrant.tenant_id = api.TENANT.uid_to_id( + if hasattr(api.USER, 'id_to_uid'): + user_rolegrant.user_id = api.USER.id_to_uid(user_rolegrant.user_id) + if hasattr(api.TENANT, 'id_to_uid'): + user_rolegrant.tenant_id = api.TENANT.id_to_uid( user_rolegrant.tenant_id) return user_rolegrant diff --git a/keystone/backends/sqlalchemy/migrate_repo/versions/001_initial_migration.py b/keystone/backends/sqlalchemy/migrate_repo/versions/001_initial_migration.py index 9058ed1b..45b69685 100644 --- a/keystone/backends/sqlalchemy/migrate_repo/versions/001_initial_migration.py +++ b/keystone/backends/sqlalchemy/migrate_repo/versions/001_initial_migration.py @@ -1,4 +1,4 @@ -# pylint: disable=C0103 +# pylint: disable=C0103,R0801 import sqlalchemy diff --git a/keystone/backends/sqlalchemy/migrate_repo/versions/002_rename_token_table.py b/keystone/backends/sqlalchemy/migrate_repo/versions/002_rename_token_table.py index ab136ab7..e350b2a4 100644 --- a/keystone/backends/sqlalchemy/migrate_repo/versions/002_rename_token_table.py +++ b/keystone/backends/sqlalchemy/migrate_repo/versions/002_rename_token_table.py @@ -5,7 +5,7 @@ Renames the 'token' table to 'tokens', in order to appear more consistent with other table names. """ -# pylint: disable=C0103 +# pylint: disable=C0103,R0801 import sqlalchemy diff --git a/keystone/backends/sqlalchemy/migrate_repo/versions/003_add_endpoint_template_versions.py b/keystone/backends/sqlalchemy/migrate_repo/versions/003_add_endpoint_template_versions.py index 95ac175d..be5bde24 100644 --- a/keystone/backends/sqlalchemy/migrate_repo/versions/003_add_endpoint_template_versions.py +++ b/keystone/backends/sqlalchemy/migrate_repo/versions/003_add_endpoint_template_versions.py @@ -1,7 +1,7 @@ """ Adds support for versioning endpoint templates """ -# pylint: disable=C0103 +# pylint: disable=C0103,R0801 import sqlalchemy diff --git a/keystone/backends/sqlalchemy/migrate_repo/versions/004_add_service_owner.py b/keystone/backends/sqlalchemy/migrate_repo/versions/004_add_service_owner.py index ac212136..4bf02c8e 100644 --- a/keystone/backends/sqlalchemy/migrate_repo/versions/004_add_service_owner.py +++ b/keystone/backends/sqlalchemy/migrate_repo/versions/004_add_service_owner.py @@ -1,7 +1,7 @@ """ Adds support for owner id in services """ -# pylint: disable=C0103 +# pylint: disable=C0103,R0801 import sqlalchemy diff --git a/keystone/backends/sqlalchemy/migrate_repo/versions/005_add_tenants_uid.py b/keystone/backends/sqlalchemy/migrate_repo/versions/005_add_tenants_uid.py index 8b2325c4..ab8e7305 100644 --- a/keystone/backends/sqlalchemy/migrate_repo/versions/005_add_tenants_uid.py +++ b/keystone/backends/sqlalchemy/migrate_repo/versions/005_add_tenants_uid.py @@ -1,4 +1,4 @@ -# pylint: disable=C0103 +# pylint: disable=C0103,R0801 import sqlalchemy diff --git a/keystone/backends/sqlalchemy/migrate_repo/versions/006_populate_tenants_uid.py b/keystone/backends/sqlalchemy/migrate_repo/versions/006_populate_tenants_uid.py index eb5f25eb..8e5ea2d4 100644 --- a/keystone/backends/sqlalchemy/migrate_repo/versions/006_populate_tenants_uid.py +++ b/keystone/backends/sqlalchemy/migrate_repo/versions/006_populate_tenants_uid.py @@ -1,7 +1,7 @@ """ Data migration to populate tenants.uid with existing tenants.id values. """ -# pylint: disable=C0103 +# pylint: disable=C0103,R0801 import sqlalchemy diff --git a/keystone/backends/sqlalchemy/migrate_repo/versions/007_make_tenants_uid_unique.py b/keystone/backends/sqlalchemy/migrate_repo/versions/007_make_tenants_uid_unique.py index c75bbcb4..555d3c7f 100644 --- a/keystone/backends/sqlalchemy/migrate_repo/versions/007_make_tenants_uid_unique.py +++ b/keystone/backends/sqlalchemy/migrate_repo/versions/007_make_tenants_uid_unique.py @@ -1,7 +1,7 @@ """ Schema migration to enforce uniqueness on tenants.uid """ -# pylint: disable=C0103 +# pylint: disable=C0103,R0801 import sqlalchemy diff --git a/keystone/backends/sqlalchemy/migrate_repo/versions/008_add_users_uid.py b/keystone/backends/sqlalchemy/migrate_repo/versions/008_add_users_uid.py index 237bfa3e..c634cae9 100644 --- a/keystone/backends/sqlalchemy/migrate_repo/versions/008_add_users_uid.py +++ b/keystone/backends/sqlalchemy/migrate_repo/versions/008_add_users_uid.py @@ -1,4 +1,4 @@ -# pylint: disable=C0103 +# pylint: disable=C0103,R0801 import sqlalchemy diff --git a/keystone/backends/sqlalchemy/migrate_repo/versions/009_populate_users_uid.py b/keystone/backends/sqlalchemy/migrate_repo/versions/009_populate_users_uid.py index 3938d6c9..c769eaa5 100644 --- a/keystone/backends/sqlalchemy/migrate_repo/versions/009_populate_users_uid.py +++ b/keystone/backends/sqlalchemy/migrate_repo/versions/009_populate_users_uid.py @@ -1,7 +1,7 @@ """ Data migration to populate users.uid with existing users.id values. """ -# pylint: disable=C0103 +# pylint: disable=C0103,R0801 import sqlalchemy diff --git a/keystone/backends/sqlalchemy/migrate_repo/versions/010_make_users_uid_unique.py b/keystone/backends/sqlalchemy/migrate_repo/versions/010_make_users_uid_unique.py index 12f84aca..164be7d4 100644 --- a/keystone/backends/sqlalchemy/migrate_repo/versions/010_make_users_uid_unique.py +++ b/keystone/backends/sqlalchemy/migrate_repo/versions/010_make_users_uid_unique.py @@ -1,7 +1,7 @@ """ Schema migration to enforce uniqueness on users.uid """ -# pylint: disable=C0103 +# pylint: disable=C0103,R0801 import sqlalchemy diff --git a/keystone/backends/sqlalchemy/migrate_repo/versions/011_is_enabled_boolean.py b/keystone/backends/sqlalchemy/migrate_repo/versions/011_is_enabled_boolean.py new file mode 100644 index 00000000..47b4a0bf --- /dev/null +++ b/keystone/backends/sqlalchemy/migrate_repo/versions/011_is_enabled_boolean.py @@ -0,0 +1,58 @@ +""" +Change 'enabled' columns to boolean types +""" +# pylint: disable=C0103,R0801 + + +import sqlalchemy +from migrate.changeset import constraint + + +meta = sqlalchemy.MetaData() + + +# define the previous state of users + +user = {} +user['id'] = sqlalchemy.Column('id', sqlalchemy.Integer, primary_key=True, + autoincrement=True) +user['uid'] = sqlalchemy.Column('uid', sqlalchemy.String(255), unique=False, + nullable=False) +user['name'] = sqlalchemy.Column('name', sqlalchemy.String(255), unique=True) +user['password'] = sqlalchemy.Column('password', sqlalchemy.String(255)) +user['email'] = sqlalchemy.Column('email', sqlalchemy.String(255)) +user['enabled'] = sqlalchemy.Column('enabled', sqlalchemy.Integer) +user['tenant_id'] = sqlalchemy.Column('tenant_id', sqlalchemy.Integer) +users = sqlalchemy.Table('users', meta, *user.values()) +constraint.UniqueConstraint(user['uid']) + +tenant = {} +tenant['id'] = sqlalchemy.Column('id', sqlalchemy.Integer, primary_key=True, + autoincrement=True) +tenant['uid'] = sqlalchemy.Column('uid', sqlalchemy.String(255), unique=False, + nullable=False) +tenant['name'] = sqlalchemy.Column('name', sqlalchemy.String(255), unique=True) +tenant['desc'] = sqlalchemy.Column('desc', sqlalchemy.String(255)) +tenant['enabled'] = sqlalchemy.Column('enabled', sqlalchemy.Integer) +tenants = sqlalchemy.Table('tenants', meta, *tenant.values()) +constraint.UniqueConstraint(tenant['uid']) + + +def upgrade(migrate_engine): + meta.bind = migrate_engine + + user['enabled'].alter(type=sqlalchemy.Boolean) + assert users.c.enabled is user['enabled'] + + tenant['enabled'].alter(type=sqlalchemy.Boolean) + assert tenants.c.enabled is tenant['enabled'] + + +def downgrade(migrate_engine): + meta.bind = migrate_engine + + user['enabled'].alter(type=sqlalchemy.Integer) + assert users.c.enabled is user['enabled'] + + tenant['enabled'].alter(type=sqlalchemy.Integer) + assert tenants.c.enabled is tenant['enabled'] diff --git a/keystone/backends/sqlalchemy/migrate_repo/versions/011_postgresql_downgrade.sql b/keystone/backends/sqlalchemy/migrate_repo/versions/011_postgresql_downgrade.sql new file mode 100644 index 00000000..0d0bf99a --- /dev/null +++ b/keystone/backends/sqlalchemy/migrate_repo/versions/011_postgresql_downgrade.sql @@ -0,0 +1,5 @@ +ALTER TABLE users ALTER COLUMN enabled DROP DEFAULT; +ALTER TABLE users ALTER COLUMN enabled TYPE integer USING CASE enabled WHEN true THEN 1 ELSE 0 END; + +ALTER TABLE tenants ALTER COLUMN enabled DROP DEFAULT; +ALTER TABLE tenants ALTER COLUMN enabled TYPE integer USING CASE enabled WHEN true THEN 1 ELSE 0 END; diff --git a/keystone/backends/sqlalchemy/migrate_repo/versions/011_postgresql_upgrade.sql b/keystone/backends/sqlalchemy/migrate_repo/versions/011_postgresql_upgrade.sql new file mode 100644 index 00000000..f0eafb7e --- /dev/null +++ b/keystone/backends/sqlalchemy/migrate_repo/versions/011_postgresql_upgrade.sql @@ -0,0 +1,5 @@ +ALTER TABLE users ALTER COLUMN enabled DROP DEFAULT; +ALTER TABLE users ALTER COLUMN enabled TYPE boolean USING CASE enabled WHEN '1' THEN true ELSE '0' END; + +ALTER TABLE tenants ALTER COLUMN enabled DROP DEFAULT; +ALTER TABLE tenants ALTER COLUMN enabled TYPE boolean USING CASE enabled WHEN '1' THEN true ELSE '0' END; diff --git a/keystone/logic/service.py b/keystone/logic/service.py index 7aea1f60..9387464d 100755 --- a/keystone/logic/service.py +++ b/keystone/logic/service.py @@ -950,7 +950,7 @@ class IdentityService(object): utils.check_empty_string(role.name, "Expecting a Role name") - if self.role_manager.get(role.name) is not None: + if self.role_manager.get_by_name(role.name) is not None: raise fault.RoleConflictFault( "A role with that name '%s' already exists" % role.name) diff --git a/keystone/manage2/__init__.py b/keystone/manage2/__init__.py index 8e86fb7a..4336730b 100644 --- a/keystone/manage2/__init__.py +++ b/keystone/manage2/__init__.py @@ -2,12 +2,16 @@ import argparse +import optparse import os import pkgutil +import sys +from keystone.common import config as legacy_config +from keystone import config from keystone.manage2 import commands -from keystone.manage2 import common +CONF = config.CONF # builds a complete path to the commands package PACKAGE_PATH = os.path.dirname(commands.__file__) @@ -29,6 +33,53 @@ def load_module(module_name): return module +# pylint: disable=W0612 +def init_config(): + """Uses legacy config module to parse out legacy settings and provide + them to the new cfg.py parser. + + This is a hack until we find a better way to have cfg.py ignore + unknown arguments + """ + + class SilentOptParser(optparse.OptionParser): + """ Class used to prevent OptionParser from exiting when it detects + invalid options coming in """ + def exit(self, status=0, msg=None): + pass + + def error(self, msg): + pass + + # Initialize a parser for our configuration paramaters + parser = SilentOptParser() + legacy_config.add_common_options(parser) + legacy_config.add_log_options(parser) + + # Parse command-line and load config + (options, args) = legacy_config.parse_options(parser) + (legacy_args, unknown_args) = parser.parse_args() + + cfgfile = getattr(legacy_args, 'config_file', None) + if cfgfile: + known_args = ['--config-file', cfgfile] + else: + known_args = [] + + # Use the legacy code to find the config file + config_file = legacy_config.find_config_file(options, known_args) + + # Now init the CONF for the backends using only known args + old_args = sys.argv[:] + sys.argv = known_args + try: + CONF(config_files=[config_file]) + except StandardError: + raise + finally: + sys.argv = old_args + + def main(): # discover command modules module_names = [name for _, name, _ in MODULES] @@ -50,6 +101,7 @@ def main(): args = parser.parse_args() # configure and run command + init_config() module = load_module(args.command) cmd = module.Command() exit(cmd.run(args)) diff --git a/keystone/managers/credential.py b/keystone/managers/credential.py index bee9bc2b..0fc8388a 100644 --- a/keystone/managers/credential.py +++ b/keystone/managers/credential.py @@ -20,7 +20,7 @@ import logging import keystone.backends.api as api -logger = logging.getLogger(__name__) +logger = logging.getLogger(__name__) # pylint: disable=C0103 class Manager(object): diff --git a/keystone/test/functional/test_token.py b/keystone/test/functional/test_token.py index 4956ba0b..54a41ce0 100644 --- a/keystone/test/functional/test_token.py +++ b/keystone/test/functional/test_token.py @@ -14,8 +14,13 @@ # See the License for the specific language governing permissions and # limitations under the License. +# pylint: disable=W0613 import unittest2 as unittest + +from keystone.backends import api +from keystone.logic.types import fault +from keystone.logic import service from keystone.test.functional import common @@ -124,6 +129,7 @@ class CheckToken(common.FunctionalTestCase): self.check_token(common.unique_str(), assert_status=404) +# pylint: disable=E1101,E1120 class TokenEndpointTest(unittest.TestCase): def _noop_validate_admin_token(self, admin_token): pass @@ -164,10 +170,10 @@ class TokenEndpointTest(unittest.TestCase): def test_endpoints_from_good_token(self): """Happy Day scenario.""" - self.stubout.SmartSet(keystone.backends.api.TOKEN, + self.stubout.SmartSet(api.TOKEN, 'get', self._fake_token_get) - self.stubout.SmartSet(keystone.backends.api.BaseTenantAPI, + self.stubout.SmartSet(api.BaseTenantAPI, 'get_all_endpoints', self._fake_tenant_get_all_endpoints) @@ -177,7 +183,7 @@ class TokenEndpointTest(unittest.TestCase): self.assertEquals(len(auth_data.base_urls), 1) def test_endpoints_from_bad_token(self): - self.stubout.SmartSet(keystone.backends.api.TOKEN, + self.stubout.SmartSet(api.TOKEN, 'get', self._fake_missing_token_get) self.assertRaises(fault.ItemNotFoundFault, @@ -185,10 +191,10 @@ class TokenEndpointTest(unittest.TestCase): "admin token", "token id") def test_bad_endpoints(self): - self.stubout.SmartSet(keystone.backends.api.TOKEN, + self.stubout.SmartSet(api.TOKEN, 'get', self._fake_token_get) - self.stubout.SmartSet(keystone.backends.api.TENANT, + self.stubout.SmartSet(api.TENANT, 'get_all_endpoints', self._fake_exploding_tenant_get_all_endpoints) diff --git a/keystone/test/unit/test_commands_v1.py b/keystone/test/unit/test_commands_v1.py index a71edeff..abd722f6 100644 --- a/keystone/test/unit/test_commands_v1.py +++ b/keystone/test/unit/test_commands_v1.py @@ -30,12 +30,14 @@ class TestCommandsV1(unittest.TestCase): def setUp(self): self.clear_all_data() manage_api.add_tenant('Test tenant') - manage_api.add_user('Test user', 'Test password', 'Test tenant') + self.user = manage_api.add_user('Test user', 'Test password', + 'Test tenant') def tearDown(self): self.clear_all_data() - def clear_all_data(self): + @staticmethod + def clear_all_data(): """ Purges the database of all data """ @@ -52,7 +54,7 @@ class TestCommandsV1(unittest.TestCase): 'name': 'Test name', 'type': 'Test type', 'desc': 'Test description', - 'owner_id': 'Test owner', + 'owner_id': self.user.id, } manage_api.add_service(**data) result = manage_api.list_services() @@ -10,7 +10,8 @@ ignore=test # W0511: TODOs in code comments are fine. # W0142: *args and **kwargs are fine. # W0622: Redefining id is fine. -disable=C0111,W0511,W0142,W0622 +# R0801: Duplicate lines of code fine. +disable=C0111,W0511,W0142,W0622,R0801 [Basic] # Variable names can be 1 to 31 characters long, with lowercase and underscores |
