Commit 2d0aacae authored by JINMEI Tatuya's avatar JINMEI Tatuya
Browse files

[1414] Merge branch 'trac1414' of ssh://git.bind10.isc.org/var/bind10/git/bind10 into trac1414

parents 28f5b7df 23350205
......@@ -20,6 +20,7 @@ endif
for pytest in $(PYTESTS) ; do \
echo Running test: $$pytest ; \
$(LIBRARY_PATH_PLACEHOLDER) \
B10_FROM_BUILD=$(abs_top_builddir) \
PYTHONPATH=$(COMMON_PYTHON_PATH):$(abs_top_builddir)/src/bin/zonemgr:$(abs_top_builddir)/src/lib/dns/python/.libs:$(abs_top_builddir)/src/lib/xfr/.libs \
$(PYCOVERAGE_RUN) $(abs_srcdir)/$$pytest || exit ; \
done
......@@ -48,46 +48,16 @@ class MySession():
def group_recvmsg(self, nonblock, seq):
return None, None
class FakeConfig:
class FakeCCSession(isc.config.ConfigData):
def __init__(self):
self.zone_list = []
self.set_zone_list_from_name_classes([ZONE_NAME_CLASS1_IN,
ZONE_NAME_CLASS2_CH])
def set_zone_list_from_name_classes(self, zones):
self.zone_list = map(lambda nc: {"name": nc[0], "class": nc[1]}, zones)
def get(self, name):
if name == 'lowerbound_refresh':
return LOWERBOUND_REFRESH
elif name == 'lowerbound_retry':
return LOWERBOUND_RETRY
elif name == 'max_transfer_timeout':
return MAX_TRANSFER_TIMEOUT
elif name == 'refresh_jitter':
return REFRESH_JITTER
elif name == 'reload_jitter':
return RELOAD_JITTER
elif name == 'secondary_zones':
return self.zone_list
else:
raise ValueError('Uknown config option')
class FakeCCSession:
def __init__(self):
self.config = FakeConfig()
def get_full_config(self):
return {'lowerbound_refresh': LOWERBOUND_REFRESH,
'lowerbound_retry': LOWERBOUND_RETRY,
'max_transfer_timeout': MAX_TRANSFER_TIMEOUT,
'refresh_jitter': REFRESH_JITTER,
'reload_jitter': RELOAD_JITTER,
'secondary_zones': [] }
def get_default_value(self, identifier):
return "IN"
module_spec = isc.config.module_spec_from_file(SPECFILE_LOCATION)
ConfigData.__init__(self, module_spec)
def get_remote_config_value(self, module_name, identifier):
if module_name == "Auth" and identifier == "database_file":
return "initdb.file", False
else:
return "unknown", False
class MyZonemgrRefresh(ZonemgrRefresh):
def __init__(self):
......@@ -571,46 +541,49 @@ class TestZonemgrRefresh(unittest.TestCase):
self.assertFalse(listener.is_alive())
def test_secondary_zones(self):
def zone_list_from_name_classes(zones):
return map(lambda nc: {"name": nc[0], "class": nc[1]}, zones)
"""Test that we can modify the list of secondary zones"""
config = FakeConfig()
config.zone_list = []
config = self.cc_session.get_full_config()
config['secondary_zones'] = []
# First, remove everything
self.zone_refresh.update_config_data(config, self.cc_session)
self.assertEqual(self.zone_refresh._zonemgr_refresh_info, {})
# Put something in
config.set_zone_list_from_name_classes([ZONE_NAME_CLASS1_IN])
config['secondary_zones'] = \
zone_list_from_name_classes([ZONE_NAME_CLASS1_IN])
self.zone_refresh.update_config_data(config, self.cc_session)
self.assertTrue(("example.net.", "IN") in
self.zone_refresh._zonemgr_refresh_info)
# This one does not exist
config.set_zone_list_from_name_classes(["example.net", "CH"])
# Reset the data, set to use a different class, and make sure
# it does not get set to IN
config['secondary_zones'] = \
zone_list_from_name_classes([ZONE_NAME_CLASS1_CH])
self.zone_refresh.update_config_data(config, self.cc_session)
self.assertFalse(("example.net.", "CH") in
self.zone_refresh._zonemgr_refresh_info)
# Simply skip loading soa for the zone, the other configs should be updated successful
self.assertFalse(("example.net.", "IN") in
self.zone_refresh._zonemgr_refresh_info)
self.zone_refresh._zonemgr_refresh_info)
# Make sure it works even when we "accidentally" forget the final dot
config.set_zone_list_from_name_classes([("example.net", "IN")])
config['secondary_zones'] = \
zone_list_from_name_classes([("example.net", "IN")])
self.zone_refresh.update_config_data(config, self.cc_session)
self.assertTrue(("example.net.", "IN") in
self.zone_refresh._zonemgr_refresh_info)
# Try some bad names
config['secondary_zones'] = \
zone_list_from_name_classes([("example..net", "IN")])
self.assertRaises(ZonemgrException,
self.zone_refresh.update_config_data,
config, self.cc_session)
config['secondary_zones'] = \
zone_list_from_name_classes([("", "IN")])
self.assertRaises(ZonemgrException,
self.zone_refresh.update_config_data,
config, self.cc_session)
def tearDown(self):
sys.stderr= self.stderr_backup
class MyCCSession():
def __init__(self):
pass
def get_remote_config_value(self, module_name, identifier):
if module_name == "Auth" and identifier == "database_file":
return "initdb.file", False
else:
return "unknown", False
class MyZonemgr(Zonemgr):
def __init__(self):
......@@ -618,7 +591,7 @@ class MyZonemgr(Zonemgr):
self._zone_refresh = None
self._shutdown_event = threading.Event()
self._cc = MySession()
self._module_cc = MyCCSession()
self._module_cc = FakeCCSession()
self._config_data = {
"lowerbound_refresh" : 10,
"lowerbound_retry" : 5,
......
......@@ -28,6 +28,7 @@ import os
import time
import signal
import isc
import isc.dns
import random
import threading
import select
......@@ -461,9 +462,16 @@ class ZonemgrRefresh:
raise ZonemgrException("Secondary zone specified "
"without a name")
name = secondary_zone['name']
# Be tolerant to sclerotic users who forget the final dot
if name[-1] != '.':
name = name + '.'
# Convert to Name and back (both to check and to normalize)
try:
name = isc.dns.Name(name, True).to_text()
# Name() can raise a number of different exceptions, just
# catch 'em all.
except Exception as isce:
raise ZonemgrException("Bad zone name '" + name +
"': " + str(isce))
# Currently we use an explicit get_default_value call
# in case the class hasn't been set. Alternatively, we
# could use
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment