Tacker: ETSI MANO NFV Orchestrator / VNF Manager. See https://wiki.openstack.org/wiki/Tacker
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.
92 lines
4.0 KiB
92 lines
4.0 KiB
# Copyright (C) 2020 NTT DATA |
|
# All Rights Reserved. |
|
# |
|
# 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 tacker.api.common import attribute_filter |
|
from tacker.common import exceptions as exception |
|
|
|
|
|
class BaseViewBuilder(object): |
|
|
|
@classmethod |
|
def validate_filter(cls, filters=None): |
|
if not filters: |
|
return |
|
|
|
return attribute_filter.parse_filter_rule(filters, |
|
target=cls.FLATTEN_ATTRIBUTES) |
|
|
|
@classmethod |
|
def validate_attribute_fields(cls, all_fields=None, fields=None, |
|
exclude_fields=None, exclude_default=None): |
|
|
|
if all_fields and (fields or exclude_fields or exclude_default): |
|
msg = ("Invalid query parameter combination: 'all_fields' " |
|
"cannot be combined with 'fields' or 'exclude_fields' " |
|
"or 'exclude_default'") |
|
raise exception.ValidationError(msg) |
|
|
|
if fields and (all_fields or exclude_fields): |
|
msg = ("Invalid query parameter combination: 'fields' " |
|
"cannot be combined with 'all_fields' or 'exclude_fields' ") |
|
raise exception.ValidationError(msg) |
|
|
|
if exclude_fields and (all_fields or fields or exclude_default): |
|
msg = ("Invalid query parameter combination: 'exclude_fields' " |
|
"cannot be combined with 'all_fields' or 'fields' " |
|
"or 'exclude_default'") |
|
raise exception.ValidationError(msg) |
|
|
|
if exclude_default and (all_fields or exclude_fields): |
|
msg = ("Invalid query parameter combination: 'exclude_default' " |
|
"cannot be combined with 'all_fields' or 'exclude_fields' ") |
|
raise exception.ValidationError(msg) |
|
|
|
def _validate_complex_attributes(query_parameter, fields): |
|
msg = ("Invalid query parameter '%(query_parameter)s'. " |
|
"Value: %(field)s") |
|
for field in fields: |
|
if field in cls.COMPLEX_ATTRIBUTES: |
|
continue |
|
elif '*' in field: |
|
# Field should never contain '*' as it's reserved for |
|
# special purpose for handling key-value pairs. |
|
raise exception.ValidationError(msg % |
|
{"query_parameter": query_parameter, |
|
"field": field}) |
|
elif field not in cls.FLATTEN_COMPLEX_ATTRIBUTES: |
|
# Special case for field with key-value pairs. |
|
# In this particular case, key will act as an attribute |
|
# in structure so you need to treat it differently than |
|
# other fields. All key-value pair field will be post-fix |
|
# with '*' in FLATTEN_COMPLEX_ATTRIBUTES. Request |
|
# with field which contains '*' will be treated as an |
|
# error. |
|
special_field = False |
|
for attribute in cls.FLATTEN_COMPLEX_ATTRIBUTES: |
|
if '*' in attribute and field.startswith( |
|
attribute.split('*')[0]): |
|
special_field = True |
|
|
|
if not special_field: |
|
raise exception.ValidationError(msg % |
|
{"query_parameter": query_parameter, |
|
"field": field}) |
|
|
|
if fields: |
|
_validate_complex_attributes("fields", fields.split(',')) |
|
elif exclude_fields: |
|
_validate_complex_attributes("exclude_fields", |
|
exclude_fields.split(","))
|
|
|