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]
|