summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--HACKING.rst1
-rw-r--r--neutron/agent/ovsdb/impl_vsctl.py3
-rw-r--r--neutron/api/v2/attributes.py5
-rw-r--r--neutron/db/common_db_mixin.py9
-rw-r--r--neutron/db/l3_dvr_db.py3
-rw-r--r--neutron/db/migration/alembic_migrations/heal_script.py5
-rw-r--r--neutron/extensions/securitygroup.py2
-rw-r--r--neutron/hacking/checks.py8
-rw-r--r--neutron/quota.py3
-rw-r--r--neutron/tests/unit/hacking/test_checks.py4
10 files changed, 31 insertions, 12 deletions
diff --git a/HACKING.rst b/HACKING.rst
index ce05f7f15b..101726231d 100644
--- a/HACKING.rst
+++ b/HACKING.rst
@@ -15,6 +15,7 @@ Neutron Specific Commandments
- [N323] Enforce namespace-less imports for oslo libraries
- [N324] Prevent use of deprecated contextlib.nested.
- [N325] Python 3: Do not use xrange.
+- [N326] Python 3: do not use basestring.
Creating Unit Tests
-------------------
diff --git a/neutron/agent/ovsdb/impl_vsctl.py b/neutron/agent/ovsdb/impl_vsctl.py
index f1189d3527..4fd8937d34 100644
--- a/neutron/agent/ovsdb/impl_vsctl.py
+++ b/neutron/agent/ovsdb/impl_vsctl.py
@@ -19,6 +19,7 @@ import uuid
from oslo_log import log as logging
from oslo_serialization import jsonutils
from oslo_utils import excutils
+import six
from neutron.agent.common import utils
from neutron.agent.ovsdb import api as ovsdb
@@ -255,7 +256,7 @@ def _set_colval_args(*col_values):
args += ["%s:%s%s%s" % (
col, k, op, _py_to_val(v)) for k, v in val.items()]
elif (isinstance(val, collections.Sequence)
- and not isinstance(val, basestring)):
+ and not isinstance(val, six.string_types)):
args.append("%s%s%s" % (col, op, ",".join(map(_py_to_val, val))))
else:
args.append("%s%s%s" % (col, op, _py_to_val(val)))
diff --git a/neutron/api/v2/attributes.py b/neutron/api/v2/attributes.py
index 1f992a0c18..6bf9e94d2c 100644
--- a/neutron/api/v2/attributes.py
+++ b/neutron/api/v2/attributes.py
@@ -17,6 +17,7 @@ import re
import netaddr
from oslo_log import log as logging
+import six
from neutron.common import constants
from neutron.common import exceptions as n_exc
@@ -105,7 +106,7 @@ def _validate_string_or_none(data, max_len=None):
def _validate_string(data, max_len=None):
- if not isinstance(data, basestring):
+ if not isinstance(data, six.string_types):
msg = _("'%s' is not a valid string") % data
LOG.debug(msg)
return msg
@@ -481,7 +482,7 @@ def _validate_non_negative(data, valid_values=None):
def convert_to_boolean(data):
- if isinstance(data, basestring):
+ if isinstance(data, six.string_types):
val = data.lower()
if val == "true" or val == "1":
return True
diff --git a/neutron/db/common_db_mixin.py b/neutron/db/common_db_mixin.py
index e75f2d1266..143c8f0e41 100644
--- a/neutron/db/common_db_mixin.py
+++ b/neutron/db/common_db_mixin.py
@@ -15,6 +15,7 @@
import weakref
+import six
from sqlalchemy import sql
from neutron.common import exceptions as n_exc
@@ -91,13 +92,13 @@ class CommonDbMixin(object):
for _name, hooks in self._model_query_hooks.get(model,
{}).iteritems():
query_hook = hooks.get('query')
- if isinstance(query_hook, basestring):
+ if isinstance(query_hook, six.string_types):
query_hook = getattr(self, query_hook, None)
if query_hook:
query = query_hook(context, model, query)
filter_hook = hooks.get('filter')
- if isinstance(filter_hook, basestring):
+ if isinstance(filter_hook, six.string_types):
filter_hook = getattr(self, filter_hook, None)
if filter_hook:
query_filter = filter_hook(context, model, query_filter)
@@ -141,7 +142,7 @@ class CommonDbMixin(object):
for _name, hooks in self._model_query_hooks.get(model,
{}).iteritems():
result_filter = hooks.get('result_filters', None)
- if isinstance(result_filter, basestring):
+ if isinstance(result_filter, six.string_types):
result_filter = getattr(self, result_filter, None)
if result_filter:
@@ -153,7 +154,7 @@ class CommonDbMixin(object):
for func in self._dict_extend_functions.get(
resource_type, []):
args = (response, db_object)
- if isinstance(func, basestring):
+ if isinstance(func, six.string_types):
func = getattr(self, func, None)
else:
# must call unbound method - use self as 1st argument
diff --git a/neutron/db/l3_dvr_db.py b/neutron/db/l3_dvr_db.py
index 3d15e96982..95c82f1a8a 100644
--- a/neutron/db/l3_dvr_db.py
+++ b/neutron/db/l3_dvr_db.py
@@ -16,6 +16,7 @@ import collections
from oslo_config import cfg
from oslo_log import log as logging
from oslo_utils import excutils
+import six
from neutron.api.v2 import attributes
from neutron.callbacks import events
@@ -165,7 +166,7 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin,
def _get_device_owner(self, context, router=None):
"""Get device_owner for the specified router."""
- router_is_uuid = isinstance(router, basestring)
+ router_is_uuid = isinstance(router, six.string_types)
if router_is_uuid:
router = self._get_router(context, router)
if is_distributed_router(router):
diff --git a/neutron/db/migration/alembic_migrations/heal_script.py b/neutron/db/migration/alembic_migrations/heal_script.py
index e20e4ee958..71bd21d05e 100644
--- a/neutron/db/migration/alembic_migrations/heal_script.py
+++ b/neutron/db/migration/alembic_migrations/heal_script.py
@@ -20,6 +20,7 @@ from alembic import autogenerate as autogen
from alembic import context
from alembic import op
+import six
import sqlalchemy
from sqlalchemy import schema as sa_schema
import sqlalchemy.sql.expression as expr
@@ -113,12 +114,12 @@ def parse_modify_command(command):
return
elif modified.endswith('default'):
modified = 'server_default'
- if isinstance(new, basestring):
+ if isinstance(new, six.string_types):
new = text(new)
kwargs = {modified: new, 'schema': schema}
default = existing.get('existing_server_default')
if default and isinstance(default, sa_schema.DefaultClause):
- if isinstance(default.arg, basestring):
+ if isinstance(default.arg, six.string_types):
existing['existing_server_default'] = default.arg
else:
existing['existing_server_default'] = default.arg.text
diff --git a/neutron/extensions/securitygroup.py b/neutron/extensions/securitygroup.py
index c8861e24d0..a772be5692 100644
--- a/neutron/extensions/securitygroup.py
+++ b/neutron/extensions/securitygroup.py
@@ -151,7 +151,7 @@ def convert_protocol(value):
def convert_ethertype_to_case_insensitive(value):
- if isinstance(value, basestring):
+ if isinstance(value, six.string_types):
for ethertype in sg_supported_ethertypes:
if ethertype.lower() == value.lower():
return ethertype
diff --git a/neutron/hacking/checks.py b/neutron/hacking/checks.py
index 10b26050f2..0426d8c295 100644
--- a/neutron/hacking/checks.py
+++ b/neutron/hacking/checks.py
@@ -166,6 +166,13 @@ def check_python3_xrange(logical_line):
"large loops.")
+def check_no_basestring(logical_line):
+ if re.search(r"\bbasestring\b", logical_line):
+ msg = ("N326: basestring is not Python3-compatible, use "
+ "six.string_types instead.")
+ yield(0, msg)
+
+
def factory(register):
register(validate_log_translations)
register(use_jsonutils)
@@ -174,3 +181,4 @@ def factory(register):
register(check_oslo_namespace_imports)
register(check_no_contextlib_nested)
register(check_python3_xrange)
+ register(check_no_basestring)
diff --git a/neutron/quota.py b/neutron/quota.py
index cd6a6b7143..c9f550b054 100644
--- a/neutron/quota.py
+++ b/neutron/quota.py
@@ -19,6 +19,7 @@ import sys
from oslo_config import cfg
from oslo_log import log as logging
from oslo_utils import importutils
+import six
import webob
from neutron.common import exceptions
@@ -219,7 +220,7 @@ class QuotaEngine(object):
_driver_class = QUOTA_CONF_DRIVER
LOG.info(_LI("ConfDriver is used as quota_driver because the "
"loaded plugin does not support 'quotas' table."))
- if isinstance(_driver_class, basestring):
+ if isinstance(_driver_class, six.string_types):
_driver_class = importutils.import_object(_driver_class)
if isinstance(_driver_class, ConfDriver):
versionutils.report_deprecated_feature(
diff --git a/neutron/tests/unit/hacking/test_checks.py b/neutron/tests/unit/hacking/test_checks.py
index 1445923b91..dc7c2f3f76 100644
--- a/neutron/tests/unit/hacking/test_checks.py
+++ b/neutron/tests/unit/hacking/test_checks.py
@@ -129,3 +129,7 @@ class HackingTestCase(base.BaseTestCase):
self.assertLineFails(f, 'c = xrange(1, 10, 2)')
self.assertLinePasses(f, 'd = range(1000)')
self.assertLinePasses(f, 'e = six.moves.range(1337)')
+
+ def test_no_basestring(self):
+ self.assertEqual(1,
+ len(list(checks.check_no_basestring("isinstance(x, basestring)"))))