You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
4.8 KiB
113 lines
4.8 KiB
# Copyright 2015 OpenStack Foundation
|
|
# Copyright (c) 2015 Hewlett-Packard Development Company, L.P.
|
|
#
|
|
# 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.
|
|
|
|
from neutron_lib.api import validators
|
|
from neutron_lib import exceptions
|
|
|
|
from networking_l2gw._i18n import _
|
|
from networking_l2gw.services.l2gateway.common import constants
|
|
|
|
ALLOWED_CONNECTION_ATTRIBUTES = set((constants.NETWORK_ID,
|
|
constants.SEG_ID,
|
|
constants.L2GATEWAY_ID
|
|
))
|
|
|
|
|
|
def validate_gwdevice_list(data, valid_values=None):
|
|
"""Validate the list of devices."""
|
|
if not data:
|
|
# Devices must be provided
|
|
msg = _("Cannot create a gateway with an empty device list")
|
|
return msg
|
|
try:
|
|
for device in data:
|
|
interface_data = device.get(constants.IFACE_NAME_ATTR)
|
|
device_name = device.get(constants.DEVICE_ID_ATTR)
|
|
if not device_name:
|
|
msg = _("Cannot create a gateway with an empty device_name")
|
|
return msg
|
|
if not interface_data:
|
|
msg = _("Cannot create a gateway with an empty interfaces")
|
|
return msg
|
|
if not isinstance(interface_data, list):
|
|
msg = _("interfaces format is not a type list of dicts")
|
|
return msg
|
|
for int_dict in interface_data:
|
|
if not isinstance(int_dict, dict):
|
|
msg = _("interfaces format is not a type dict")
|
|
return msg
|
|
err_msg = validators.validate_dict(int_dict, None)
|
|
if not int_dict.get('name'):
|
|
msg = _("Cannot create a gateway with an empty "
|
|
"interface name")
|
|
return msg
|
|
if constants.SEG_ID in int_dict:
|
|
seg_id_list = int_dict.get(constants.SEG_ID)
|
|
if seg_id_list and type(seg_id_list) is not list:
|
|
msg = _("segmentation_id type should be of list type ")
|
|
return msg
|
|
if not seg_id_list:
|
|
msg = _("segmentation_id_list should not be empty")
|
|
return msg
|
|
for seg_id in seg_id_list:
|
|
is_valid_vlan_id(seg_id)
|
|
if err_msg:
|
|
return err_msg
|
|
except TypeError:
|
|
return (_("%s: provided data are not iterable") %
|
|
validate_gwdevice_list.__name__)
|
|
|
|
|
|
def validate_network_mapping_list(network_mapping, check_vlan):
|
|
"""Validate network mapping list in connection."""
|
|
if network_mapping.get('segmentation_id'):
|
|
if check_vlan:
|
|
raise exceptions.InvalidInput(
|
|
error_message=_("default segmentation_id should not be"
|
|
" provided when segmentation_id is assigned"
|
|
" during l2gateway creation"))
|
|
seg_id = network_mapping.get(constants.SEG_ID)
|
|
is_valid_vlan_id(seg_id)
|
|
|
|
if not network_mapping.get('segmentation_id'):
|
|
if check_vlan is False:
|
|
raise exceptions.InvalidInput(
|
|
error_message=_("Segmentation id must be specified in create "
|
|
"l2gateway connections"))
|
|
network_id = network_mapping.get(constants.NETWORK_ID)
|
|
if not network_id:
|
|
raise exceptions.InvalidInput(
|
|
error_message=_("A valid network identifier must be specified "
|
|
"when connecting a network to a network "
|
|
"gateway. Unable to complete operation"))
|
|
connection_attrs = set(network_mapping.keys())
|
|
if not connection_attrs.issubset(ALLOWED_CONNECTION_ATTRIBUTES):
|
|
raise exceptions.InvalidInput(
|
|
error_message=(_("Invalid keys found among the ones provided "
|
|
"in request : %(connection_attrs)s."),
|
|
connection_attrs))
|
|
return network_id
|
|
|
|
|
|
def is_valid_vlan_id(seg_id):
|
|
try:
|
|
int_seg_id = int(seg_id)
|
|
except ValueError:
|
|
msg = _("Segmentation id must be a valid integer")
|
|
raise exceptions.InvalidInput(error_message=msg)
|
|
if int_seg_id < 0 or int_seg_id >= 4095:
|
|
msg = _("Segmentation id is out of range")
|
|
raise exceptions.InvalidInput(error_message=msg)
|