Merge "Remove six and python 2.7 full support"
This commit is contained in:
commit
5601db2613
|
@ -15,7 +15,6 @@ import collections
|
|||
|
||||
from oslo_config import cfg
|
||||
from oslo_serialization import jsonutils
|
||||
import six
|
||||
import yaml
|
||||
|
||||
from heat.common import exception
|
||||
|
@ -73,7 +72,7 @@ def simple_parse(tmpl_str, tmpl_url=None):
|
|||
except yaml.YAMLError as yea:
|
||||
if tmpl_url is None:
|
||||
tmpl_url = '[root stack]'
|
||||
yea = six.text_type(yea)
|
||||
yea = str(yea)
|
||||
msg = _('Error parsing template %(tmpl)s '
|
||||
'%(yea)s') % {'tmpl': tmpl_url, 'yea': yea}
|
||||
raise ValueError(msg)
|
||||
|
@ -111,7 +110,7 @@ def parse(tmpl_str, tmpl_url=None):
|
|||
|
||||
# TODO(ricolin): Move this validation to api side.
|
||||
# Validate nested stack template.
|
||||
validate_template_limit(six.text_type(tmpl_str))
|
||||
validate_template_limit(str(tmpl_str))
|
||||
|
||||
tpl = simple_parse(tmpl_str, tmpl_url)
|
||||
# Looking for supported version keys in the loaded template
|
||||
|
@ -136,7 +135,7 @@ def convert_json_to_yaml(json_str):
|
|||
def top_level_items(tpl):
|
||||
yield ("HeatTemplateFormatVersion", '2012-12-12')
|
||||
|
||||
for k, v in six.iteritems(tpl):
|
||||
for k, v in tpl.items():
|
||||
if k != 'AWSTemplateFormatVersion':
|
||||
yield k, v
|
||||
|
||||
|
|
|
@ -14,12 +14,14 @@
|
|||
"""Utility for fetching a resource (e.g. a template) from a URL."""
|
||||
|
||||
import socket
|
||||
import urllib.error
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
import requests
|
||||
from requests import exceptions
|
||||
from six.moves import urllib
|
||||
|
||||
from heat.common import exception
|
||||
from heat.common.i18n import _
|
||||
|
|
|
@ -40,7 +40,6 @@ from oslo_utils import encodeutils
|
|||
from oslo_utils import importutils
|
||||
from paste.deploy import loadwsgi
|
||||
from routes import middleware
|
||||
import six
|
||||
import webob.dec
|
||||
import webob.exc
|
||||
|
||||
|
@ -648,7 +647,7 @@ class Debug(Middleware):
|
|||
resp = req.get_response(self.application)
|
||||
|
||||
print(("*" * 40) + " RESPONSE HEADERS")
|
||||
for (key, value) in six.iteritems(resp.headers):
|
||||
for (key, value) in resp.headers.items():
|
||||
print(key, "=", value)
|
||||
print('')
|
||||
|
||||
|
@ -823,7 +822,7 @@ class JSONRequestDeserializer(object):
|
|||
raise exception.RequestLimitExceeded(message=msg)
|
||||
return jsonutils.loads(datastring)
|
||||
except ValueError as ex:
|
||||
raise webob.exc.HTTPBadRequest(six.text_type(ex))
|
||||
raise webob.exc.HTTPBadRequest(str(ex))
|
||||
|
||||
def default(self, request):
|
||||
if self.has_body(request):
|
||||
|
@ -1004,8 +1003,7 @@ def translate_exception(exc, locale):
|
|||
return exc
|
||||
|
||||
|
||||
@six.add_metaclass(abc.ABCMeta)
|
||||
class BasePasteFactory(object):
|
||||
class BasePasteFactory(object, metaclass=abc.ABCMeta):
|
||||
"""A base class for paste app and filter factories.
|
||||
|
||||
Sub-classes must override the KEY class attribute and provide
|
||||
|
|
|
@ -28,7 +28,6 @@ from oslo_utils import encodeutils
|
|||
from oslo_utils import excutils
|
||||
from oslo_utils import timeutils
|
||||
import osprofiler.sqlalchemy
|
||||
import six
|
||||
import sqlalchemy
|
||||
from sqlalchemy import and_
|
||||
from sqlalchemy import func
|
||||
|
@ -112,7 +111,7 @@ def retry_on_deadlock(func):
|
|||
|
||||
def update_and_save(context, obj, values):
|
||||
with context.session.begin(subtransactions=True):
|
||||
for k, v in six.iteritems(values):
|
||||
for k, v in values.items():
|
||||
setattr(obj, k, v)
|
||||
|
||||
|
||||
|
@ -663,7 +662,7 @@ def _get_sort_keys(sort_keys, mapping):
|
|||
:param mapping: a mapping from keys to DB column names
|
||||
:returns: filtered list of sort keys
|
||||
"""
|
||||
if isinstance(sort_keys, six.string_types):
|
||||
if isinstance(sort_keys, str):
|
||||
sort_keys = [sort_keys]
|
||||
return [mapping[key] for key in sort_keys or [] if key in mapping]
|
||||
|
||||
|
@ -951,7 +950,7 @@ def user_creds_create(context):
|
|||
else:
|
||||
user_creds_ref.update(values)
|
||||
method, password = crypt.encrypt(values['password'])
|
||||
if len(six.text_type(password)) > 255:
|
||||
if len(str(password)) > 255:
|
||||
raise exception.Error(_("Length of OS_PASSWORD after encryption"
|
||||
" exceeds Heat limit (255 chars)"))
|
||||
user_creds_ref.password = password
|
||||
|
@ -1177,7 +1176,7 @@ def event_create(context, values):
|
|||
_delete_event_rows(context, values['stack_id'],
|
||||
cfg.CONF.event_purge_batch_size)
|
||||
except db_exception.DBError as exc:
|
||||
LOG.error('Failed to purge events: %s', six.text_type(exc))
|
||||
LOG.error('Failed to purge events: %s', str(exc))
|
||||
event_ref = models.Event()
|
||||
event_ref.update(values)
|
||||
event_ref.save(context.session)
|
||||
|
@ -1666,7 +1665,7 @@ def _db_encrypt_or_decrypt_template_params(
|
|||
not param_schemata[param_name].hidden):
|
||||
continue
|
||||
encrypted_val = crypt.encrypt(
|
||||
six.text_type(param_val), encryption_key)
|
||||
str(param_val), encryption_key)
|
||||
env['parameters'][param_name] = encrypted_val
|
||||
encrypted_params.append(param_name)
|
||||
needs_update = True
|
||||
|
|
|
@ -11,8 +11,6 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import six
|
||||
|
||||
|
||||
def exact_filter(query, model, filters):
|
||||
"""Applies exact match filtering to a query.
|
||||
|
@ -33,7 +31,7 @@ def exact_filter(query, model, filters):
|
|||
if filters is None:
|
||||
filters = {}
|
||||
|
||||
for key, value in six.iteritems(filters):
|
||||
for key, value in filters.items():
|
||||
if isinstance(value, (list, tuple, set, frozenset)):
|
||||
column_attr = getattr(model, key)
|
||||
query = query.filter(column_attr.in_(value))
|
||||
|
|
|
@ -15,7 +15,6 @@ import collections
|
|||
|
||||
from oslo_log import log as logging
|
||||
from oslo_utils import timeutils
|
||||
import six
|
||||
|
||||
from heat.common.i18n import _
|
||||
from heat.common import param_utils
|
||||
|
@ -65,7 +64,7 @@ def extract_args(params):
|
|||
raise ValueError(_('Invalid tags, not a list: %s') % tags)
|
||||
|
||||
for tag in tags:
|
||||
if not isinstance(tag, six.string_types):
|
||||
if not isinstance(tag, str):
|
||||
raise ValueError(_('Invalid tag, "%s" is not a string') % tag)
|
||||
|
||||
if len(tag) > 80:
|
||||
|
@ -188,7 +187,7 @@ def format_stack_output(output_defn, resolve_value=True):
|
|||
except Exception as ex:
|
||||
# We don't need error raising, just adding output_error to
|
||||
# resulting dict.
|
||||
result.update({rpc_api.OUTPUT_ERROR: six.text_type(ex)})
|
||||
result.update({rpc_api.OUTPUT_ERROR: str(ex)})
|
||||
finally:
|
||||
result.update({rpc_api.OUTPUT_VALUE: value})
|
||||
|
||||
|
@ -212,7 +211,7 @@ def format_stack(stack, preview=False, resolve_outputs=True):
|
|||
rpc_api.STACK_UPDATED_TIME: updated_time,
|
||||
rpc_api.STACK_DELETION_TIME: deleted_time,
|
||||
rpc_api.STACK_NOTIFICATION_TOPICS: [], # TODO(therve) Not implemented
|
||||
rpc_api.STACK_PARAMETERS: stack.parameters.map(six.text_type),
|
||||
rpc_api.STACK_PARAMETERS: stack.parameters.map(str),
|
||||
rpc_api.STACK_DESCRIPTION: stack.t[stack.t.DESCRIPTION],
|
||||
rpc_api.STACK_TMPL_DESCRIPTION: stack.t[stack.t.DESCRIPTION],
|
||||
rpc_api.STACK_CAPABILITIES: [], # TODO(?) Not implemented yet
|
||||
|
|
|
@ -12,9 +12,9 @@
|
|||
# under the License.
|
||||
|
||||
import collections
|
||||
import functools
|
||||
|
||||
from oslo_utils import strutils
|
||||
import six
|
||||
|
||||
from heat.common.i18n import _
|
||||
from heat.engine import constraints as constr
|
||||
|
@ -206,14 +206,14 @@ class Attributes(collections.Mapping):
|
|||
|
||||
def _validate_type(self, attrib, value):
|
||||
if attrib.schema.type == attrib.schema.STRING:
|
||||
if not isinstance(value, six.string_types):
|
||||
if not isinstance(value, str):
|
||||
LOG.warning("Attribute %(name)s is not of type "
|
||||
"%(att_type)s",
|
||||
{'name': attrib.name,
|
||||
'att_type': attrib.schema.STRING})
|
||||
elif attrib.schema.type == attrib.schema.LIST:
|
||||
if (not isinstance(value, collections.Sequence)
|
||||
or isinstance(value, six.string_types)):
|
||||
or isinstance(value, str)):
|
||||
LOG.warning("Attribute %(name)s is not of type "
|
||||
"%(att_type)s",
|
||||
{'name': attrib.name,
|
||||
|
@ -296,7 +296,7 @@ class Attributes(collections.Mapping):
|
|||
|
||||
def __repr__(self):
|
||||
return ("Attributes for %s:\n\t" % self._resource_name +
|
||||
'\n\t'.join(six.itervalues(self)))
|
||||
'\n\t'.join(self.values()))
|
||||
|
||||
|
||||
def select_from_attribute(attribute_value, path):
|
||||
|
@ -311,12 +311,12 @@ def select_from_attribute(attribute_value, path):
|
|||
collections.Sequence)):
|
||||
raise TypeError(_("Can't traverse attribute path"))
|
||||
|
||||
if not isinstance(key, (six.string_types, int)):
|
||||
if not isinstance(key, (str, int)):
|
||||
raise TypeError(_('Path components in attributes must be strings'))
|
||||
|
||||
return collection[key]
|
||||
|
||||
try:
|
||||
return six.moves.reduce(get_path_component, path, attribute_value)
|
||||
return functools.reduce(get_path_component, path, attribute_value)
|
||||
except (KeyError, IndexError, TypeError):
|
||||
return None
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
import collections
|
||||
|
||||
from oslo_serialization import jsonutils
|
||||
import six
|
||||
|
||||
from heat.api.aws import utils as aws_utils
|
||||
from heat.common import exception
|
||||
|
@ -39,7 +38,7 @@ class FindInMap(function.Function):
|
|||
try:
|
||||
self._mapname, self._mapkey, self._mapvalue = self.args
|
||||
except ValueError as ex:
|
||||
raise KeyError(six.text_type(ex))
|
||||
raise KeyError(str(ex))
|
||||
|
||||
def result(self):
|
||||
mapping = self.stack.t.maps[function.resolve(self._mapname)]
|
||||
|
@ -160,7 +159,7 @@ class Select(function.Function):
|
|||
# Handle by returning an empty string
|
||||
return ''
|
||||
|
||||
if isinstance(strings, six.string_types):
|
||||
if isinstance(strings, str):
|
||||
# might be serialized json.
|
||||
try:
|
||||
strings = jsonutils.loads(strings)
|
||||
|
@ -170,7 +169,7 @@ class Select(function.Function):
|
|||
raise ValueError(_('"%(fn_name)s": %(err)s') % fmt_data)
|
||||
|
||||
if isinstance(strings, collections.Mapping):
|
||||
if not isinstance(index, six.string_types):
|
||||
if not isinstance(index, str):
|
||||
raise TypeError(_('Index to "%s" must be a string') %
|
||||
self.fn_name)
|
||||
return strings.get(index, '')
|
||||
|
@ -181,8 +180,8 @@ class Select(function.Function):
|
|||
pass
|
||||
|
||||
if (isinstance(strings, collections.Sequence) and
|
||||
not isinstance(strings, six.string_types)):
|
||||
if not isinstance(index, six.integer_types):
|
||||
not isinstance(strings, str)):
|
||||
if not isinstance(index, int):
|
||||
raise TypeError(_('Index to "%s" must be an integer') %
|
||||
self.fn_name)
|
||||
|
||||
|
@ -230,7 +229,7 @@ class Split(function.Function):
|
|||
fmt_data = {'fn_name': self.fn_name,
|
||||
'example': example}
|
||||
|
||||
if isinstance(self.args, (six.string_types, collections.Mapping)):
|
||||
if isinstance(self.args, (str, collections.Mapping)):
|
||||
raise TypeError(_('Incorrect arguments to "%(fn_name)s" '
|
||||
'should be: %(example)s') % fmt_data)
|
||||
|
||||
|
@ -243,10 +242,10 @@ class Split(function.Function):
|
|||
def result(self):
|
||||
strings = function.resolve(self._strings)
|
||||
|
||||
if not isinstance(self._delim, six.string_types):
|
||||
if not isinstance(self._delim, str):
|
||||
raise TypeError(_("Delimiter for %s must be string") %
|
||||
self.fn_name)
|
||||
if not isinstance(strings, six.string_types):
|
||||
if not isinstance(strings, str):
|
||||
raise TypeError(_("String to split must be string; got %s") %
|
||||
type(strings))
|
||||
|
||||
|
@ -279,7 +278,7 @@ class Replace(hot_funcs.Replace):
|
|||
fmt_data = {'fn_name': self.fn_name,
|
||||
'example': example}
|
||||
|
||||
if isinstance(self.args, (six.string_types, collections.Mapping)):
|
||||
if isinstance(self.args, (str, collections.Mapping)):
|
||||
raise TypeError(_('Incorrect arguments to "%(fn_name)s" '
|
||||
'should be: %(example)s') % fmt_data)
|
||||
|
||||
|
@ -306,7 +305,7 @@ class Base64(function.Function):
|
|||
|
||||
def result(self):
|
||||
resolved = function.resolve(self.args)
|
||||
if not isinstance(resolved, six.string_types):
|
||||
if not isinstance(resolved, str):
|
||||
raise TypeError(_('"%s" argument must be a string') % self.fn_name)
|
||||
return resolved
|
||||
|
||||
|
@ -342,10 +341,10 @@ class MemberListToMap(function.Function):
|
|||
'''
|
||||
raise TypeError(_('Wrong Arguments try: "%s"') % correct)
|
||||
|
||||
if not isinstance(self._keyname, six.string_types):
|
||||
if not isinstance(self._keyname, str):
|
||||
raise TypeError(_('%s Key Name must be a string') % self.fn_name)
|
||||
|
||||
if not isinstance(self._valuename, six.string_types):
|
||||
if not isinstance(self._valuename, str):
|
||||
raise TypeError(_('%s Value Name must be a string') % self.fn_name)
|
||||
|
||||
def result(self):
|
||||
|
@ -355,7 +354,7 @@ class MemberListToMap(function.Function):
|
|||
raise TypeError(_('Member list must be a list'))
|
||||
|
||||
def item(s):
|
||||
if not isinstance(s, six.string_types):
|
||||
if not isinstance(s, str):
|
||||
raise TypeError(_("Member list items must be strings"))
|
||||
return s.split('=', 1)
|
||||
|
||||
|
@ -430,7 +429,7 @@ class Not(hot_funcs.Not):
|
|||
'[condition]') % self.fn_name
|
||||
if (not self.args or
|
||||
not isinstance(self.args, collections.Sequence) or
|
||||
isinstance(self.args, six.string_types)):
|
||||
isinstance(self.args, str)):
|
||||
raise ValueError(msg)
|
||||
if len(self.args) != 1:
|
||||
raise ValueError(msg)
|
||||
|
|
|
@ -13,8 +13,6 @@
|
|||
|
||||
import functools
|
||||
|
||||
import six
|
||||
|
||||
from heat.common import exception
|
||||
from heat.common.i18n import _
|
||||
from heat.engine.cfn import functions as cfn_funcs
|
||||
|
@ -98,12 +96,12 @@ class CfnTemplateBase(template_common.CommonTemplate):
|
|||
def param_schemata(self, param_defaults=None):
|
||||
params = self.t.get(self.PARAMETERS) or {}
|
||||
pdefaults = param_defaults or {}
|
||||
for name, schema in six.iteritems(params):
|
||||
for name, schema in params.items():
|
||||
if name in pdefaults:
|
||||
params[name][parameters.DEFAULT] = pdefaults[name]
|
||||
|
||||
return dict((name, parameters.Schema.from_dict(name, schema))
|
||||
for name, schema in six.iteritems(params))
|
||||
for name, schema in params.items())
|
||||
|
||||
def get_section_name(self, section):
|
||||
return section
|
||||
|
@ -124,7 +122,7 @@ class CfnTemplateBase(template_common.CommonTemplate):
|
|||
defn_data = dict(self._rsrc_defn_args(stack, name,
|
||||
snippet))
|
||||
except (TypeError, ValueError, KeyError) as ex:
|
||||
msg = six.text_type(ex)
|
||||
msg = str(ex)
|
||||
raise exception.StackValidationFailed(message=msg)
|
||||
|
||||
defn = rsrc_defn.ResourceDefinition(name, **defn_data)
|
||||
|
@ -135,7 +133,7 @@ class CfnTemplateBase(template_common.CommonTemplate):
|
|||
enabled = conditions.is_enabled(cond_name)
|
||||
except ValueError as exc:
|
||||
path = [self.RESOURCES, name, self.RES_CONDITION]
|
||||
message = six.text_type(exc)
|
||||
message = str(exc)
|
||||
raise exception.StackValidationFailed(path=path,
|
||||
message=message)
|
||||
if not enabled:
|
||||
|
@ -234,7 +232,7 @@ class CfnTemplate(CfnTemplateBase):
|
|||
|
||||
yield ('condition',
|
||||
self._parse_resource_field(self.RES_CONDITION,
|
||||
(six.string_types, bool,
|
||||
(str, bool,
|
||||
function.Function),
|
||||
'string or boolean',
|
||||
name, data, parse_cond))
|
||||
|
|
|
@ -13,8 +13,6 @@
|
|||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
import six
|
||||
|
||||
import eventlet.queue
|
||||
import functools
|
||||
|
||||
|
@ -83,7 +81,7 @@ class CheckResource(object):
|
|||
'during resource %s' % rsrc.action)
|
||||
rsrc.state_set(rsrc.action,
|
||||
rsrc.FAILED,
|
||||
six.text_type(status_reason))
|
||||
str(status_reason))
|
||||
return True
|
||||
elif (rs_obj.engine_id is None and
|
||||
rs_obj.current_template_id == prev_template_id):
|
||||
|
@ -177,7 +175,7 @@ class CheckResource(object):
|
|||
except exception.ResourceFailure as ex:
|
||||
action = ex.action or rsrc.action
|
||||
reason = 'Resource %s failed: %s' % (action,
|
||||
six.text_type(ex))
|
||||
str(ex))
|
||||
self._handle_resource_failure(cnxt, is_update, rsrc.id,
|
||||
stack, reason)
|
||||
except scheduler.Timeout:
|
||||
|
@ -323,7 +321,7 @@ class CheckResource(object):
|
|||
rsrc, stack)
|
||||
except BaseException as exc:
|
||||
with excutils.save_and_reraise_exception():
|
||||
msg = six.text_type(exc)
|
||||
msg = str(exc)
|
||||
LOG.exception("Unexpected exception in resource check.")
|
||||
self._handle_resource_failure(cnxt, is_update, rsrc.id,
|
||||
stack, msg)
|
||||
|
|
|
@ -11,10 +11,13 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import io
|
||||
import urllib.error
|
||||
import urllib.request
|
||||
|
||||
from oslo_config import cfg
|
||||
import requests
|
||||
from requests import exceptions
|
||||
import six
|
||||
|
||||
from heat.common import urlfetch
|
||||
from heat.tests import common
|
||||
|
@ -42,15 +45,15 @@ class UrlFetchTest(common.HeatTestCase):
|
|||
def test_file_scheme_supported(self):
|
||||
data = '{ "foo": "bar" }'
|
||||
url = 'file:///etc/profile'
|
||||
mock_open = self.patchobject(six.moves.urllib.request, 'urlopen')
|
||||
mock_open.return_value = six.moves.cStringIO(data)
|
||||
mock_open = self.patchobject(urllib.request, 'urlopen')
|
||||
mock_open.return_value = io.StringIO(data)
|
||||
self.assertEqual(data, urlfetch.get(url, allowed_schemes=['file']))
|
||||
mock_open.assert_called_once_with(url)
|
||||
|
||||
def test_file_scheme_failure(self):
|
||||
url = 'file:///etc/profile'
|
||||
mock_open = self.patchobject(six.moves.urllib.request, 'urlopen')
|
||||
mock_open.side_effect = six.moves.urllib.error.URLError('oops')
|
||||
mock_open = self.patchobject(urllib.request, 'urlopen')
|
||||
mock_open.side_effect = urllib.error.URLError('oops')
|
||||
self.assertRaises(urlfetch.URLFetchError,
|
||||
urlfetch.get, url, allowed_schemes=['file'])
|
||||
mock_open.assert_called_once_with(url)
|
||||
|
@ -109,5 +112,5 @@ class UrlFetchTest(common.HeatTestCase):
|
|||
mock_get.return_value = response
|
||||
exception = self.assertRaises(urlfetch.URLFetchError,
|
||||
urlfetch.get, url)
|
||||
self.assertIn("Template exceeds", six.text_type(exception))
|
||||
self.assertIn("Template exceeds", str(exception))
|
||||
mock_get.assert_called_once_with(url, stream=True)
|
||||
|
|
Loading…
Reference in New Issue