Source code for heat.common.netutils

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


[docs] 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)
[docs] 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])