159 lines
6.7 KiB
Python
159 lines
6.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 mock
|
|
|
|
from neutron_lib.api.validators import dns
|
|
from neutron_lib.db import constants as db_constants
|
|
from neutron_lib.tests import _base as base
|
|
|
|
|
|
class TestDnsValidators(base.BaseTestCase):
|
|
|
|
@mock.patch('oslo_config.cfg.CONF')
|
|
def test_validate_dns_name(self, CONF):
|
|
CONF.dns_domain = ''
|
|
msg = dns.validate_dns_name('')
|
|
self.assertIsNone(msg)
|
|
|
|
CONF.dns_domain = 'example.org.'
|
|
dns_name = 'host'
|
|
msg = dns.validate_dns_name(dns_name)
|
|
self.assertIsNone(msg)
|
|
|
|
invalid_data = 'A' * 256
|
|
max_len = 255
|
|
expected = ("'%(data)s' not a valid PQDN or FQDN. Reason: "
|
|
"'%(data)s' exceeds the %(maxlen)s character FQDN "
|
|
"limit") % {'data': invalid_data, 'maxlen': max_len}
|
|
msg = dns.validate_dns_name(invalid_data, max_len)
|
|
self.assertEqual(expected, msg)
|
|
|
|
invalid_data = '.hostname'
|
|
expected = ("'%(data)s' not a valid PQDN or FQDN. Reason: "
|
|
"Encountered an empty component") % {'data': invalid_data}
|
|
msg = dns.validate_dns_name(invalid_data)
|
|
self.assertEqual(expected, msg)
|
|
|
|
invalid_data = 'hostname-'
|
|
expected = ("'%(data)s' not a valid PQDN or FQDN. Reason: "
|
|
"Name '%(data)s' must not start or end with a "
|
|
"hyphen") % {'data': invalid_data}
|
|
msg = dns.validate_dns_name(invalid_data)
|
|
self.assertEqual(expected, msg)
|
|
|
|
invalid_data = 'hostname@host'
|
|
expected = ("'%(data)s' not a valid PQDN or FQDN. Reason: "
|
|
"Name '%(data)s' must be 1-63 characters long, each of "
|
|
"which can only be alphanumeric or a "
|
|
"hyphen") % {'data': invalid_data}
|
|
msg = dns.validate_dns_name(invalid_data)
|
|
self.assertEqual(expected, msg)
|
|
invalid_suffix = '1234'
|
|
invalid_data = 'hostname.' + invalid_suffix
|
|
expected = ("'%(data)s' not a valid PQDN or FQDN. Reason: "
|
|
"TLD '%(suffix)s' must not be all "
|
|
"numeric") % {'data': invalid_data,
|
|
'suffix': invalid_suffix}
|
|
msg = dns.validate_dns_name(invalid_data)
|
|
self.assertEqual(expected, msg)
|
|
|
|
# len(dns_name + dns_domain) > 255
|
|
invalid_domain = 'A' * 250 + '.org.'
|
|
CONF.dns_domain = invalid_domain
|
|
dns_name = 'hostname'
|
|
expected = ("The dns_name passed is a PQDN and its size is "
|
|
"'%(dns_name_len)s'. The dns_domain option in "
|
|
"neutron.conf is set to %(dns_domain)s, with a "
|
|
"length of '%(higher_labels_len)s'. When the two are "
|
|
"concatenated to form a FQDN (with a '.' at the end), "
|
|
"the resulting length exceeds the maximum size "
|
|
"of '%(fqdn_max_len)s'"
|
|
) % {'dns_name_len': len(dns_name),
|
|
'dns_domain': invalid_domain,
|
|
'higher_labels_len': len(invalid_domain) + 1,
|
|
'fqdn_max_len': db_constants.FQDN_FIELD_SIZE}
|
|
msg = dns.validate_dns_name(dns_name)
|
|
self.assertEqual(expected, msg)
|
|
|
|
dns_name = 'host.'
|
|
dns_domain = 'example.com.'
|
|
CONF.dns_domain = dns_domain
|
|
expected = ("The dns_name passed is a FQDN. Its higher level labels "
|
|
"must be equal to the dns_domain option in neutron.conf, "
|
|
"that has been set to '%(dns_domain)s'. It must also "
|
|
"include one or more valid DNS labels to the left "
|
|
"of '%(dns_domain)s'") % {'dns_domain': dns_domain}
|
|
msg = dns.validate_dns_name(dns_name)
|
|
self.assertEqual(expected, msg)
|
|
|
|
def test_validate_fip_dns_name(self):
|
|
# Don't run tests duplicated to validate_dns_name()
|
|
|
|
msg = dns.validate_fip_dns_name('')
|
|
self.assertIsNone(msg)
|
|
|
|
msg = dns.validate_fip_dns_name('host')
|
|
self.assertIsNone(msg)
|
|
|
|
invalid_data = 1234
|
|
expected = "'%s' is not a valid string" % invalid_data
|
|
msg = dns.validate_fip_dns_name(invalid_data)
|
|
self.assertEqual(expected, msg)
|
|
|
|
invalid_data = 'host.'
|
|
expected = ("'%s' is a FQDN. It should be a relative domain "
|
|
"name") % invalid_data
|
|
msg = dns.validate_fip_dns_name(invalid_data)
|
|
self.assertEqual(expected, msg)
|
|
|
|
length = 10
|
|
invalid_data = 'a' * length
|
|
max_len = 12
|
|
expected = ("'%(data)s' contains %(length)s characters. Adding a "
|
|
"domain name will cause it to exceed the maximum length "
|
|
"of a FQDN of '%(max_len)s'") % {"data": invalid_data,
|
|
"length": length,
|
|
"max_len": max_len}
|
|
msg = dns.validate_fip_dns_name(invalid_data, max_len)
|
|
self.assertEqual(expected, msg)
|
|
|
|
def test_validate_dns_domain(self):
|
|
# Don't run tests duplicated to validate_dns_name()
|
|
|
|
msg = dns.validate_dns_domain('')
|
|
self.assertIsNone(msg)
|
|
|
|
msg = dns.validate_dns_domain('example.com.')
|
|
self.assertIsNone(msg)
|
|
|
|
invalid_data = 1234
|
|
expected = "'%s' is not a valid string" % invalid_data
|
|
msg = dns.validate_dns_domain(invalid_data)
|
|
self.assertEqual(expected, msg)
|
|
|
|
invalid_data = 'example.com'
|
|
expected = "'%s' is not a FQDN" % invalid_data
|
|
msg = dns.validate_dns_domain(invalid_data)
|
|
self.assertEqual(expected, msg)
|
|
|
|
length = 9
|
|
invalid_data = 'a' * length + '.'
|
|
max_len = 11
|
|
expected = ("'%(data)s' contains %(length)s characters. Adding a "
|
|
"sub-domain will cause it to exceed the maximum length "
|
|
"of a FQDN of '%(max_len)s'") % {"data": invalid_data,
|
|
"length": length + 1,
|
|
"max_len": max_len}
|
|
msg = dns.validate_dns_domain(invalid_data, max_len)
|
|
self.assertEqual(expected, msg)
|