5797d34ccd
This adds constraints to be used with properties of neutron resources for internal/external dns resolution. Change-Id: I728eec876b9f5e12b92ee8283c0d1a7610d7ed76 Blueprint: neutron-dns-resolution
63 lines
2.3 KiB
Python
63 lines
2.3 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 netaddr
|
|
import re
|
|
|
|
from heat.common.i18n import _
|
|
|
|
DNS_LABEL_MAX_LEN = 63
|
|
DNS_LABEL_REGEX = "[a-z0-9-]{1,%d}$" % DNS_LABEL_MAX_LEN
|
|
FQDN_MAX_LEN = 255
|
|
|
|
|
|
def is_prefix_subset(orig_prefixes, new_prefixes):
|
|
"""Check whether orig_prefixes is subset of new_prefixes.
|
|
|
|
|
|
This takes valid prefix lists for orig_prefixes and new_prefixes,
|
|
returns 'True', if orig_prefixes is subset of new_prefixes.
|
|
"""
|
|
orig_set = netaddr.IPSet(orig_prefixes)
|
|
new_set = netaddr.IPSet(new_prefixes)
|
|
return orig_set.issubset(new_set)
|
|
|
|
|
|
def validate_dns_format(data):
|
|
if not data:
|
|
return
|
|
trimmed = data if not data.endswith('.') else data[:-1]
|
|
if len(trimmed) > FQDN_MAX_LEN:
|
|
raise ValueError(
|
|
_("'%(data)s' exceeds the %(max_len)s character FQDN limit") % {
|
|
'data': trimmed,
|
|
'max_len': FQDN_MAX_LEN})
|
|
names = trimmed.split('.')
|
|
for name in names:
|
|
if not name:
|
|
raise ValueError(_("Encountered an empty component."))
|
|
if name.endswith('-') or name.startswith('-'):
|
|
raise ValueError(
|
|
_("Name '%s' must not start or end with a hyphen.") % name)
|
|
if not re.match(DNS_LABEL_REGEX, name):
|
|
raise ValueError(
|
|
_("Name '%(name)s' must be 1-%(max_len)s characters long, "
|
|
"each of which can only be alphanumeric or "
|
|
"a hyphen.") % {'name': name,
|
|
'max_len': DNS_LABEL_MAX_LEN})
|
|
# RFC 1123 hints that a Top Level Domain(TLD) can't be all numeric.
|
|
# Last part is a TLD, if it's a FQDN.
|
|
if (data.endswith('.') and len(names) > 1
|
|
and re.match("^[0-9]+$", names[-1])):
|
|
raise ValueError(_("TLD '%s' must not be all numeric.") % names[-1])
|