This brings over the validation and convert_to methods from Neutron. Additional tests were added to improve coverage, and some supporting methods were added for these. Renamed validators to remove underscore, so that they can be imported into neutron/api/v2/attributes.py. Added devref docs to help developers in creating and using validators and converters. Change-Id: I81394dff69b816146e521bcd3e9641761178d6fd Implements: blueprint neutron-lib
120 lines
3.7 KiB
Python
120 lines
3.7 KiB
Python
# 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 six
|
|
|
|
from neutron_lib._i18n import _
|
|
from neutron_lib import exceptions as n_exc
|
|
|
|
|
|
def convert_to_boolean(data):
|
|
if isinstance(data, six.string_types):
|
|
val = data.lower()
|
|
if val == "true" or val == "1":
|
|
return True
|
|
if val == "false" or val == "0":
|
|
return False
|
|
elif isinstance(data, bool):
|
|
return data
|
|
elif isinstance(data, int):
|
|
if data == 0:
|
|
return False
|
|
elif data == 1:
|
|
return True
|
|
msg = _("'%s' cannot be converted to boolean") % data
|
|
raise n_exc.InvalidInput(error_message=msg)
|
|
|
|
|
|
def convert_to_boolean_if_not_none(data):
|
|
if data is not None:
|
|
return convert_to_boolean(data)
|
|
|
|
|
|
def convert_to_int(data):
|
|
try:
|
|
return int(data)
|
|
except (ValueError, TypeError):
|
|
msg = _("'%s' is not an integer") % data
|
|
raise n_exc.InvalidInput(error_message=msg)
|
|
|
|
|
|
def convert_to_int_if_not_none(data):
|
|
if data is not None:
|
|
return convert_to_int(data)
|
|
return data
|
|
|
|
|
|
def convert_to_positive_float_or_none(val):
|
|
# NOTE(salv-orlando): This conversion function is currently used by
|
|
# a vendor specific extension only at the moment It is used for
|
|
# port's RXTX factor in neutron.plugins.vmware.extensions.qos.
|
|
# It is deemed however generic enough to be in this module as it
|
|
# might be used in future for other API attributes.
|
|
if val is None:
|
|
return
|
|
try:
|
|
val = float(val)
|
|
if val < 0:
|
|
raise ValueError()
|
|
except (ValueError, TypeError):
|
|
msg = _("'%s' must be a non negative decimal.") % val
|
|
raise n_exc.InvalidInput(error_message=msg)
|
|
return val
|
|
|
|
|
|
def convert_kvp_str_to_list(data):
|
|
"""Convert a value of the form 'key=value' to ['key', 'value'].
|
|
|
|
:raises: n_exc.InvalidInput if any of the strings are malformed
|
|
(e.g. do not contain a key).
|
|
"""
|
|
kvp = [x.strip() for x in data.split('=', 1)]
|
|
if len(kvp) == 2 and kvp[0]:
|
|
return kvp
|
|
msg = _("'%s' is not of the form <key>=[value]") % data
|
|
raise n_exc.InvalidInput(error_message=msg)
|
|
|
|
|
|
def convert_kvp_list_to_dict(kvp_list):
|
|
"""Convert a list of 'key=value' strings to a dict.
|
|
|
|
:raises: n_exc.InvalidInput if any of the strings are malformed
|
|
(e.g. do not contain a key) or if any
|
|
of the keys appear more than once.
|
|
"""
|
|
if kvp_list == ['True']:
|
|
# No values were provided (i.e. '--flag-name')
|
|
return {}
|
|
kvp_map = {}
|
|
for kvp_str in kvp_list:
|
|
key, value = convert_kvp_str_to_list(kvp_str)
|
|
kvp_map.setdefault(key, set())
|
|
kvp_map[key].add(value)
|
|
return dict((x, list(y)) for x, y in six.iteritems(kvp_map))
|
|
|
|
|
|
def convert_none_to_empty_list(value):
|
|
return [] if value is None else value
|
|
|
|
|
|
def convert_none_to_empty_dict(value):
|
|
return {} if value is None else value
|
|
|
|
|
|
def convert_to_list(data):
|
|
if data is None:
|
|
return []
|
|
elif hasattr(data, '__iter__') and not isinstance(data, six.string_types):
|
|
return list(data)
|
|
else:
|
|
return [data]
|