mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-09-02 15:05:16 +00:00
[master] Merge branch 'master' of ssh://git.kea.isc.org/git/kea
Conflicts: ChangeLog
This commit is contained in:
13
ChangeLog
13
ChangeLog
@@ -1,7 +1,18 @@
|
||||
828. [build] jreed
|
||||
830. [build] jreed
|
||||
The configure script no longer requires pkg-config.
|
||||
(Trac #3511, git 99a5a2db8c011b358873d485ac48f7c78ac6374c)
|
||||
|
||||
829. [build] wlodek
|
||||
Lettuce DNS tests removed with all related python code,
|
||||
most of them will be used in Forge project which can be found
|
||||
http://kea.isc.org/wiki/IscForge
|
||||
(Trac #3420, git e51bcbeedbc169050751c1b896726965243667be)
|
||||
|
||||
828. [bug] marcin
|
||||
Corrected the IfaceMgrTest.detectIface unit test that failed on
|
||||
Linux systems with virtual interfaces present.
|
||||
(Trac #3527, git 7aa01a6965b6e9fc39ff005803cada7f58f2e628)
|
||||
|
||||
827. [build] jiri, tomek
|
||||
Deprecated AC_PROG_LIBTOOL macro replaced by LT_INIT.
|
||||
(Trac #3525, git 6c0aacf29fae1d0501ca69ff6324df8d4fc8c7ee)
|
||||
|
@@ -77,7 +77,7 @@
|
||||
</section>
|
||||
|
||||
<section id="dhcp4-configuration">
|
||||
<title>Configuring the DHCPv4 Server</title>
|
||||
<title>DHCPv4 Server Configuration</title>
|
||||
<section>
|
||||
<title>Introduction</title>
|
||||
<para>
|
||||
|
@@ -25,19 +25,22 @@
|
||||
</simpara>
|
||||
</listitem>
|
||||
|
||||
<!-- We may need to replace it with the link to a downloadable tarball
|
||||
once we have it. -->
|
||||
<listitem>
|
||||
<simpara>
|
||||
Checkout the latest Kea revision from the Git repository:
|
||||
<screen>$ <userinput>git clone git://git.kea.isc.org/kea</userinput> </screen>
|
||||
</simpara>
|
||||
<para>
|
||||
Download Kea source tarball from <ulink url="https://www.isc.org/downloads/">ISC.org downloads page</ulink> or <ulink url="http://ftp.isc.org/isc/kea/">ISC ftp server</ulink>.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
Extract the tarball. For example:
|
||||
<screen>$ <userinput>tar xvf kea-0.9-beta1.tar.gz</userinput></screen>
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>Go into the source directory and run the configure script:
|
||||
<screen>$ <userinput>cd kea</userinput>
|
||||
$ <userinput>autoreconf --install</userinput>
|
||||
<screen>$ <userinput>cd kea-0.9-beta1</userinput>
|
||||
$ <userinput>./configure [your extra parameters]</userinput></screen>
|
||||
</para>
|
||||
</listitem>
|
||||
@@ -50,66 +53,69 @@ $ <userinput>./configure [your extra parameters]</userinput></screen>
|
||||
|
||||
<listitem>
|
||||
<para>Install it (by default the installation prefix is <filename>/usr/local/</filename>,
|
||||
so you need root privileges for that step):
|
||||
<screen>$ <userinput>make install</userinput></screen>
|
||||
so you likely need root privileges for that step):
|
||||
<screen># <userinput>make install</userinput></screen>
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>If you wish to run a DHCP server for IPv4, you need to set up and start
|
||||
the kea-dhcp4 server:</para>
|
||||
<orderedlist>
|
||||
<listitem>
|
||||
<para>Edit your configuration file for DHCPv4. <xref linkend="dhcp4-configuration"/>
|
||||
describes the configuration choices available; example DHCPv4 configuration can be found in
|
||||
doc/examples/kea4.</para>
|
||||
<para>Edit configuration file which is by default installed in
|
||||
<filename>[kea-install-dir]/etc/kea/kea.conf</filename> and contains
|
||||
configuration for all Kea services. Configuration choices for DHCPv4
|
||||
and DHCPv6 services are described in <xref linkend="dhcp4-configuration"/> and <xref linkend="dhcp6-configuration"/>, respectively.</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>Start Kea DHCPv4 server (as root):
|
||||
<screen># <userinput>kea-dhcp4 -c /path/to/your/kea4/config/file.json</userinput></screen>
|
||||
<para>In order to start the DHCPv4 server in background, run the
|
||||
following command (as root):
|
||||
<screen># <userinput>keactrl start -s dhcp4</userinput></screen>
|
||||
Or run the following command to start DHCPv6 server instead:
|
||||
<screen># <userinput>keactrl start -s dhcp6</userinput></screen>
|
||||
Note that it is also possible to start both servers simultaneously:
|
||||
<screen>$ <userinput>keactrl start</userinput></screen>
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>Test it; for example, use the
|
||||
<ulink url="http://www.isc.org/downloads/DHCP/">ISC DHCP client</ulink>
|
||||
to send DHCPv4 queries to the server and verify that the client receives a
|
||||
configuration from the server:
|
||||
<screen>$ <userinput>dhclient -4 eth0</userinput></screen>
|
||||
<para>Verify that Kea server(s) are running:
|
||||
<screen># <userinput>keactrl status</userinput></screen>
|
||||
If the server status is "inactive" may indicate a configuration
|
||||
error. Please check a log file (by default located in
|
||||
<filename>[kea-install-dir]/var/kea/kea.log</filename>) for the
|
||||
details of the error.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
If the server has been started sucessfully, test that it is
|
||||
responding to DHCP queries and that the client
|
||||
receives a configuration from the server; for example, use
|
||||
the <ulink url="http://www.isc.org/downloads/DHCP/">ISC DHCP client</ulink>.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
Stop running server(s):
|
||||
<screen># <userinput>keactrl stop</userinput></screen>
|
||||
</para>
|
||||
</listitem>
|
||||
</orderedlist>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>If you wish to run a DHCP server for IPv6, you need to set up and start
|
||||
the kea-dhcp6 server:</para>
|
||||
<orderedlist>
|
||||
<listitem>
|
||||
<para>Edit your configuration file for DHCPv6. <xref linkend="dhcp6-configuration"/>
|
||||
describes the configuration choices, and some example DHCPv6 configuration can be found in
|
||||
doc/examples/kea6.</para>
|
||||
</listitem>
|
||||
<para>The details of <command>keactrl</command> script usage can be found
|
||||
in <xref linkend="keactrl"/>.</para>
|
||||
</section>
|
||||
|
||||
<listitem>
|
||||
<para>Start Kea DHCPv6 server (as root):
|
||||
<section id="quick-start-direct-run">
|
||||
<title>Running Kea servers directly</title>
|
||||
<para>Kea servers can be started directly (without a need to use
|
||||
<command>keactrl</command>). To start DHCPv4 server run the following
|
||||
commmand:
|
||||
<screen># <userinput>kea-dhcp4 -c /path/to/your/kea4/config/file.json</userinput></screen>
|
||||
And, to start the DHCPv6 server run the following command:
|
||||
<screen># <userinput>kea-dhcp6 -c /path/to/your/kea6/config/file.json</userinput></screen>
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>Test it; for example, use the
|
||||
<ulink url="http://www.isc.org/downloads/DHCP/">ISC DHCP client</ulink>
|
||||
to send DHCPv6 queries to the server and verify that the client receives a
|
||||
configuration from the server:
|
||||
<screen>$ <userinput>dhclient -6 eth0</userinput></screen>
|
||||
</para>
|
||||
</listitem>
|
||||
</orderedlist>
|
||||
</listitem>
|
||||
</orderedlist>
|
||||
|
||||
</section>
|
||||
|
||||
</chapter>
|
||||
|
@@ -2362,7 +2362,20 @@ TEST_F(IfaceMgrTest, detectIfaces) {
|
||||
// Go over all interfaces detected by the unit test and see if they
|
||||
// match with the interfaces detected by IfaceMgr.
|
||||
for (ifptr = iflist; ifptr != 0; ifptr = ifptr->ifa_next) {
|
||||
Iface* i = ifacemgr.getIface(std::string(ifptr->ifa_name));
|
||||
// When more than one IPv4 address is assigned to the particular
|
||||
// physical interface, virtual interfaces may be created for each
|
||||
// additional IPv4 address. For example, when multiple addresses
|
||||
// are assigned to the eth0 interface, additional virtual interfaces
|
||||
// will be eth0:0, eth0:1 etc. This is the case on some Linux
|
||||
// distributions. The getifaddrs will return virtual interfaces,
|
||||
// with single address each, but the Netlink-based implementation
|
||||
// (used by IfaceMgr) will rather hold a list of physical interfaces
|
||||
// with multiple IPv4 addresses assigned. This means that the test
|
||||
// can't use a name of the interface returned by getifaddrs to match
|
||||
// with the interface name held by IfaceMgr. Instead, we use the
|
||||
// index of the interface because the virtual interfaces have the
|
||||
// same indexes as the physical interfaces.
|
||||
Iface* i = ifacemgr.getIface(if_nametoindex(ifptr->ifa_name));
|
||||
|
||||
// If the given interface was also detected by the IfaceMgr,
|
||||
// check that its properties are correct.
|
||||
|
2
tests/lettuce/.gitignore
vendored
2
tests/lettuce/.gitignore
vendored
@@ -1,2 +0,0 @@
|
||||
/output/
|
||||
/setup_intree_bind10.sh
|
@@ -1 +0,0 @@
|
||||
noinst_SCRIPTS = setup_intree_bind10.sh
|
@@ -1,131 +0,0 @@
|
||||
BIND10 system testing with Lettuce
|
||||
or: to BDD or not to BDD
|
||||
|
||||
In this directory, we define a set of behavioral tests for BIND 10. Currently,
|
||||
these tests are specific for BIND10, but we are keeping in mind that RFC-related
|
||||
tests could be separated, so that we can test other systems as well.
|
||||
|
||||
Prerequisites:
|
||||
- BIND 10 must be compiled or installed (even when testing in-tree build;
|
||||
see below) with both DNS and DHCP components enabled
|
||||
- dig
|
||||
- lettuce (http://lettuce.it)
|
||||
|
||||
To install lettuce, if you have the python pip installation tool, simply do
|
||||
pip install lettuce
|
||||
See http://lettuce.it/intro/install.html
|
||||
|
||||
Most systems have the pip tool in a separate package; on Debian-based systems
|
||||
it is called python-pip. On FreeBSD the port is devel/py-pip.
|
||||
|
||||
Running the tests
|
||||
-----------------
|
||||
|
||||
At this moment, we have a fixed port for local tests in our setups, port 56176.
|
||||
This port must be free. (TODO: can we make this run-time discovered?).
|
||||
Port 56175 is used for cmdctl, and must also be available.
|
||||
(note, we will need to extend this to a range, or if possible, we will need to
|
||||
do some on-the-fly available port finding)
|
||||
|
||||
You can run the lettuce tests with the provided run_lettuce.sh script.
|
||||
|
||||
By default it will use the build tree, but you can use an installed version
|
||||
of bind10 by passing -I as the first argument of run_lettuce.sh
|
||||
|
||||
The tool 'dig' must be in the default search path of your environment. If
|
||||
you specified -I, so must the main BIND 10 programs. And, with or without
|
||||
-I, some BIND 10 programs still have to be installed as they are invoked
|
||||
from test tools. Those include bindctl and b10-loadzone.
|
||||
|
||||
Due to the default way lettuce prints its output, it is advisable to run it
|
||||
in a terminal that is wide than the default. If you see a lot of lines twice
|
||||
in different colors, the terminal is not wide enough.
|
||||
|
||||
If you just want to run one specific feature test, use
|
||||
run_lettuce.sh [-I] features/<feature file>
|
||||
|
||||
To run a specific scenario from a feature, use
|
||||
run_lettuce.sh [-I] features/<feature file> -s <scenario number>
|
||||
|
||||
We have set up the tests to assume that lettuce is run from this directory,
|
||||
so even if you specify a specific feature file, you should do it from this
|
||||
directory.
|
||||
|
||||
What to do when a test fails
|
||||
----------------------------
|
||||
|
||||
First of all, look at the error it printed and see what step it occurred in.
|
||||
If written well, the output should explain most of what went wrong.
|
||||
|
||||
The stacktrace that is printed is *not* of bind10, but of the testing
|
||||
framework; this helps in finding more information about what exactly the test
|
||||
tried to achieve when it failed (as well as help debug the tests themselves).
|
||||
|
||||
Furthermore, if any scenario fails, the output from long-running processes
|
||||
will be stored in the directory output/. The name of the files will be
|
||||
<Feature name>-<Scenario name>-<Process name>.stdout and
|
||||
<Feature name>-<Scenario name>-<Process name>.stderr
|
||||
Where spaces and other non-standard characters are replaced by an underscore.
|
||||
The process name is either the standard name for said process (e.g. 'bind10'),
|
||||
or the name given to it by the test ('when i run bind10 as <name>').
|
||||
|
||||
These files *will* be overwritten or deleted if the same scenarios are run
|
||||
again, so if you want to inspect them after a failed test, either do so
|
||||
immediately or move the files.
|
||||
|
||||
If you want to keep these output files even for successful runs, you can
|
||||
specify the environment variable LETTUCE_KEEP_OUTPUT=1. The files will
|
||||
still be overwritten by subsequent runs, but they will not automatically be
|
||||
deleted.
|
||||
|
||||
Adding and extending tests
|
||||
--------------------------
|
||||
|
||||
If you want to add tests, it is advisable to first go through the examples to
|
||||
see what is possible, and read the documentation on http://www.lettuce.it
|
||||
|
||||
There is also a README.tutorial file here.
|
||||
|
||||
We have a couple of conventions to keep things manageable.
|
||||
|
||||
Configuration files go into the configurations/ directory.
|
||||
Data files go into the data/ directory.
|
||||
Step definition go into the features/terrain/ directory (the name terrain is
|
||||
chosen for the same reason Lettuce chose terrain.py, this is the place the
|
||||
tests 'live' in).
|
||||
Feature definitions go directly into the features/ directory.
|
||||
|
||||
These directories are currently not divided further; we may want to consider
|
||||
this as the set grows. Due to a (current?) limitation of Lettuce, for
|
||||
feature files this is currently not possible; the python files containing
|
||||
steps and terrain must be below or at the same level of the feature files.
|
||||
|
||||
Long-running processes should be started through the world.RunningProcesses
|
||||
instance. If you want to add a process (e.g. bind9), create start, stop and
|
||||
control steps in terrain/<base_name>_control.py, and let it use the
|
||||
RunningProcesses API (defined in terrain.py). See bind10_control.py for an
|
||||
example.
|
||||
|
||||
For sending queries and checking the results, steps have been defined in
|
||||
terrain/querying.py. These use dig and store the results split up into text
|
||||
strings. This is intentionally not parsed through our own library (as that way
|
||||
we might run into a 'symmetric bug'). If you need something more advanced from
|
||||
query results, define it here.
|
||||
|
||||
Some very general steps are defined in terrain/steps.py.
|
||||
Initialization code, cleanup code, and helper classes are defined in
|
||||
terrain/terrain.py.
|
||||
|
||||
To find the right steps, case insensitive matching is used. Parameters taken
|
||||
from the steps are case-sensitive though. So a step defined as
|
||||
'do foo with value (bar)' will be matched when using
|
||||
'Do Foo with value xyz', but xyz will be taken as given.
|
||||
|
||||
If you need to add steps that are very particular to one test, create a new
|
||||
file with a name relevant for that test in terrain. We may want to consider
|
||||
creating a specific subdirectory for these, but at this moment it is unclear
|
||||
whether we need to.
|
||||
|
||||
We should try to keep steps as general as possible, while not making them to
|
||||
complex and error-prone.
|
||||
|
@@ -1,157 +0,0 @@
|
||||
Quick tutorial and overview
|
||||
---------------------------
|
||||
|
||||
Lettuce is a framework for doing Behaviour Driven Development (BDD).
|
||||
|
||||
The idea behind BDD is that you first write down your requirements in
|
||||
the form of scenarios, then implement their behaviour.
|
||||
|
||||
We do not plan on doing full BDD, but such a system should also help
|
||||
us make system tests. And, hopefully, being able to better identify
|
||||
what exactly is going wrong when a test fails.
|
||||
|
||||
Lettuce is a python implementation of the Cucumber framework, which is
|
||||
a ruby system. So far we chose lettuce because we already need python
|
||||
anyway, so chances are higher that any system we want to run it on
|
||||
supports it. It only supports a subset of cucumber, but more cucumber
|
||||
features are planned. As I do not know much details of cucumber, I
|
||||
can't really say what is there and what is not.
|
||||
|
||||
A slight letdown is that the current version does not support python 3.
|
||||
However, as long as the tool-calling glue is python2, this should not
|
||||
cause any problems, since these aren't unit tests; We do not plan to use
|
||||
our libraries directly, but only through the runnable scripts and
|
||||
executables.
|
||||
|
||||
-----
|
||||
|
||||
Features, Scenarios, Steps.
|
||||
|
||||
Lettuce makes a distinction between features, scenarios, and steps.
|
||||
|
||||
Features are general, well, features. Each 'feature' has its own file
|
||||
ending in .feature. A feature file contains a description and a number
|
||||
of scenarios. Each scenario tests one or more particular parts of the
|
||||
feature. Each scenario consists of a number of steps.
|
||||
|
||||
So let's open up a simple one.
|
||||
|
||||
-- example.feature
|
||||
Feature: showing off BIND 10
|
||||
This is to show BIND 10 running and that it answer queries
|
||||
|
||||
Scenario: Starting bind10
|
||||
# steps go here
|
||||
--
|
||||
|
||||
I have predefined a number of steps we can use, as we build test we
|
||||
will need to expand these, but we will look at them shortly.
|
||||
|
||||
This file defines a feature, just under the feature name we can
|
||||
provide a description of the feature.
|
||||
|
||||
The one scenario we have has no steps, so if we run it we should
|
||||
see something like:
|
||||
|
||||
-- output
|
||||
> ./run_lettuce.sh
|
||||
Feature: showing off BIND 10
|
||||
This is to show BIND 10 running and that it answer queries
|
||||
|
||||
Scenario: Starting bind10
|
||||
|
||||
1 feature (1 passed)
|
||||
1 scenario (1 passed)
|
||||
0 step (0 passed)
|
||||
--
|
||||
|
||||
Let's first add some steps that send queries.
|
||||
|
||||
--
|
||||
A query for www.example.com should have rcode REFUSED
|
||||
A query for www.example.org should have rcode NOERROR
|
||||
--
|
||||
|
||||
Since we didn't start any bind10, dig will time out and the result
|
||||
should be an error saying it got no answer. Errors are in the
|
||||
form of stack traces (trigger by failed assertions), so we can find
|
||||
out easily where in the tests they occurred. Especially when the total
|
||||
set of steps gets bigger we might need that.
|
||||
|
||||
So let's add a step that starts bind10.
|
||||
|
||||
--
|
||||
When I start bind10 with configuration example.org.config
|
||||
--
|
||||
|
||||
This is not good enough; it will start the process, but setting up
|
||||
b10-auth may take a few moments, so we need to add a step to wait for
|
||||
it to be started before we continue.
|
||||
|
||||
--
|
||||
Then wait for bind10 auth to start
|
||||
--
|
||||
|
||||
And let's run the tests again.
|
||||
|
||||
--
|
||||
> ./run_lettuce.sh
|
||||
|
||||
Feature: showing off BIND 10
|
||||
This is to show BIND 10 running and that it answer queries
|
||||
|
||||
Scenario: Starting bind10
|
||||
When I start bind10 with configuration example.org.config
|
||||
Then wait for bind10 auth to start
|
||||
A query for www.example.com should have rcode REFUSED
|
||||
A query for www.example.org should have rcode NOERROR
|
||||
|
||||
1 feature (1 passed)
|
||||
1 scenario (1 passed)
|
||||
4 steps (4 passed)
|
||||
(finished within 2 seconds)
|
||||
--
|
||||
|
||||
So take a look at one of those steps, let's pick the first one.
|
||||
|
||||
A step is defined through a python decorator, which in essence is a regular
|
||||
expression; lettuce searches through all defined steps to find one that
|
||||
matches. These are 'partial' matches (unless specified otherwise in the
|
||||
regular expression itself), so if the step is defined with "do foo bar", the
|
||||
scenario can add words for readability "When I do foo bar".
|
||||
|
||||
Each captured group will be passed as an argument to the function we define.
|
||||
For bind10, I defined a configuration file, a cmdctl port, and a process
|
||||
name. The first two should be self-evident, and the process name is an
|
||||
optional name we give it, should we want to address it in the rest of the
|
||||
tests. This is most useful if we want to start multiple instances. In the
|
||||
next step (the wait for auth to start), I added a 'of <instance>'. So if we
|
||||
define the bind10 'as b10_second_instance', we can specify that one here as
|
||||
'of b10_second_instance'.
|
||||
|
||||
--
|
||||
When I start bind10 with configuration second.config
|
||||
with cmdctl port 12345 as b10_second_instance
|
||||
--
|
||||
(line wrapped for readability)
|
||||
|
||||
But notice how we needed two steps, which we probably always need (but
|
||||
not entirely always)? We can also combine steps; for instance:
|
||||
|
||||
--
|
||||
@step('have bind10 running(?: with configuration ([\w.]+))?')
|
||||
def have_bind10_running(step, config_file):
|
||||
step.given('start bind10 with configuration ' + config_file)
|
||||
step.given('wait for bind10 auth to start')
|
||||
--
|
||||
|
||||
Now we can replace the two steps with one:
|
||||
|
||||
--
|
||||
Given I have bind10 running
|
||||
--
|
||||
|
||||
That's it for the quick overview. For some more examples, with comments,
|
||||
take a look at features/example.feature. You can read more about lettuce and
|
||||
its features on http://www.lettuce.it, and if you plan on adding tests and
|
||||
scenarios, please consult the last section of the main README first.
|
5
tests/lettuce/configurations/.gitignore
vendored
5
tests/lettuce/configurations/.gitignore
vendored
@@ -1,5 +0,0 @@
|
||||
/bindctl_commands.config
|
||||
/example.org.config
|
||||
/generate.config
|
||||
/root.config
|
||||
/static.config
|
2
tests/lettuce/configurations/auth/.gitignore
vendored
2
tests/lettuce/configurations/auth/.gitignore
vendored
@@ -1,2 +0,0 @@
|
||||
/auth_badzone.config
|
||||
/auth_basic.config
|
@@ -1,38 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [{
|
||||
"severity": "DEBUG",
|
||||
"name": "*",
|
||||
"debuglevel": 99
|
||||
}]
|
||||
},
|
||||
"Auth": {
|
||||
"listen_on": [{
|
||||
"port": 56176,
|
||||
"address": "127.0.0.1"
|
||||
}]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [
|
||||
{
|
||||
"type": "MasterFiles",
|
||||
"cache-enable": true,
|
||||
"params": {
|
||||
"example.org": "data/example.org",
|
||||
"example.com": "data/example.com-broken",
|
||||
"example.net": "data/example.net-empty",
|
||||
"example.info": "data/example.info-doesnt-exist"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
} ]
|
||||
},
|
||||
"Auth": {
|
||||
"listen_on": [ {
|
||||
"port": 56176,
|
||||
"address": "127.0.0.1"
|
||||
} ]
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1 +0,0 @@
|
||||
/bindctl.config
|
@@ -1,25 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
} ]
|
||||
},
|
||||
"Auth": {
|
||||
"database_file": "data/example.org.sqlite3",
|
||||
"listen_on": [ {
|
||||
"port": 56176,
|
||||
"address": "127.0.0.1"
|
||||
} ]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {}
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,37 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
} ]
|
||||
},
|
||||
"Auth": {
|
||||
"database_file": "data/example.org.sqlite3",
|
||||
"listen_on": [ {
|
||||
"port": 56176,
|
||||
"address": "127.0.0.1"
|
||||
} ]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {}
|
||||
},
|
||||
"StatsHttpd": {
|
||||
"listen_on": [ {
|
||||
"port": 47811,
|
||||
"address": "127.0.0.1"
|
||||
} ]
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "dispensable", "special": "auth" },
|
||||
"b10-xfrin": { "address": "Xfrin", "kind": "dispensable" },
|
||||
"b10-xfrout": { "address": "Xfrout", "kind": "dispensable" },
|
||||
"b10-zonemgr": { "address": "Zonemgr", "kind": "dispensable" },
|
||||
"b10-stats": { "address": "Stats", "kind": "dispensable" },
|
||||
"b10-stats-httpd": { "address": "StatsHttpd", "kind": "dispensable" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
2
tests/lettuce/configurations/ddns/.gitignore
vendored
2
tests/lettuce/configurations/ddns/.gitignore
vendored
@@ -1,2 +0,0 @@
|
||||
/ddns.config
|
||||
/noddns.config
|
@@ -1,90 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [
|
||||
{
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Zonemgr": {
|
||||
"secondary_zones": [
|
||||
{
|
||||
"class": "IN",
|
||||
"name": "secondary.org"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Auth": {
|
||||
"database_file": "data/ddns/example.org.sqlite3",
|
||||
"listen_on": [
|
||||
{
|
||||
"port": 56176,
|
||||
"address":
|
||||
"127.0.0.1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [
|
||||
{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/ddns/example.org.sqlite3"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-xfrout": {
|
||||
"kind": "dispensable",
|
||||
"address": "Xfrout"
|
||||
},
|
||||
"b10-zonemgr": {
|
||||
"kind": "dispensable",
|
||||
"address": "ZoneMgr"
|
||||
},
|
||||
"b10-ddns": {
|
||||
"kind": "dispensable",
|
||||
"address": "DDNS"
|
||||
},
|
||||
"b10-auth": {
|
||||
"kind": "needed",
|
||||
"special": "auth"
|
||||
},
|
||||
"b10-cmdctl": {
|
||||
"kind": "needed",
|
||||
"special": "cmdctl"
|
||||
}
|
||||
}
|
||||
},
|
||||
"DDNS": {
|
||||
"zones": [
|
||||
{
|
||||
"origin": "example.org.",
|
||||
"update_acl": [
|
||||
{
|
||||
"action": "ACCEPT",
|
||||
"from": "127.0.0.1"
|
||||
}
|
||||
],
|
||||
"class": "IN"
|
||||
},
|
||||
{
|
||||
"origin": "secondary.org.",
|
||||
"update_acl": [
|
||||
{
|
||||
"action": "ACCEPT",
|
||||
"from": "127.0.0.1"
|
||||
}
|
||||
],
|
||||
"class": "IN"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
@@ -1,46 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [
|
||||
{
|
||||
"severity": "DEBUG",
|
||||
"name": "*",
|
||||
"debuglevel": 99
|
||||
}
|
||||
]
|
||||
},
|
||||
"DDNS": {"zones": []},
|
||||
"Auth": {
|
||||
"database_file": "data/ddns/example.org.sqlite3",
|
||||
"listen_on": [
|
||||
{
|
||||
"port": 56176,
|
||||
"address": "127.0.0.1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [
|
||||
{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/ddns/example.org.sqlite3"
|
||||
},
|
||||
"cache-enable": true,
|
||||
"cache-zones": [
|
||||
"example.org"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-xfrout": {"kind": "dispensable"},
|
||||
"b10-auth": {"kind": "needed", "special": "auth"},
|
||||
"b10-zonemgr": {"kind": "dispensable", "address": "ZoneMgr" },
|
||||
"b10-cmdctl": {"kind": "needed", "special": "cmdctl"}
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
} ]
|
||||
},
|
||||
"StatsHttpd": {
|
||||
"listen_on": [ {
|
||||
"port": 47811,
|
||||
"address": "127.0.0.1"
|
||||
} ]
|
||||
}
|
||||
}
|
@@ -1 +0,0 @@
|
||||
root,bind10
|
|
@@ -1,35 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
} ]
|
||||
},
|
||||
"Auth": {
|
||||
"database_file": "data/example.org.sqlite3",
|
||||
"listen_on": [ {
|
||||
"port": 56176,
|
||||
"address": "127.0.0.1"
|
||||
} ]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [
|
||||
{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/example.org.sqlite3"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,45 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [{
|
||||
"severity": "DEBUG",
|
||||
"name": "*",
|
||||
"debuglevel": 99
|
||||
}]
|
||||
},
|
||||
"Auth": {
|
||||
"listen_on": [{
|
||||
"port": 56176,
|
||||
"address": "127.0.0.1"
|
||||
}]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [
|
||||
{
|
||||
"type": "MasterFiles",
|
||||
"cache-enable": true,
|
||||
"params": {
|
||||
"example.org": "data/example.org"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "broken_libraries_should_be_skipped",
|
||||
"cache-enable": false,
|
||||
"params": {
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Stats": {
|
||||
"poll-interval": 1
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-stats": { "address": "Stats", "kind": "dispensable" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,36 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"severity": "DEBUG",
|
||||
"name": "*",
|
||||
"debuglevel": 99
|
||||
}
|
||||
]
|
||||
},
|
||||
"Auth": {
|
||||
"database_file": "data/example.org.sqlite3",
|
||||
"listen_on": [ {
|
||||
"port": 56177,
|
||||
"address": "::1"
|
||||
} ]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [
|
||||
{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/example.org.sqlite3"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,35 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [{
|
||||
"severity": "DEBUG",
|
||||
"name": "*",
|
||||
"debuglevel": 99
|
||||
}]
|
||||
},
|
||||
"Auth": {
|
||||
"listen_on": [{
|
||||
"port": 56176,
|
||||
"address": "127.0.0.1"
|
||||
}]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [
|
||||
{
|
||||
"type": "MasterFiles",
|
||||
"cache-enable": true,
|
||||
"params": {
|
||||
"example.org": "data/generate.zone"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,34 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [{
|
||||
"severity": "DEBUG",
|
||||
"name": "*",
|
||||
"debuglevel": 99
|
||||
}]
|
||||
},
|
||||
"Auth": {
|
||||
"listen_on": [{
|
||||
"port": 56176,
|
||||
"address": "127.0.0.1"
|
||||
}]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [
|
||||
{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/glue.sqlite3"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,40 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
} ]
|
||||
},
|
||||
"Auth": {
|
||||
"listen_on": [ {
|
||||
"port": 56176,
|
||||
"address": "127.0.0.1"
|
||||
} ]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [
|
||||
{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/example.org.sqlite3"
|
||||
},
|
||||
"cache-enable": true,
|
||||
"cache-zones": [
|
||||
"example.org"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-xfrin": { "address": "Xfrin", "kind": "dispensable" },
|
||||
"b10-zonemgr": { "address": "Zonemgr", "kind": "dispensable" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,62 +0,0 @@
|
||||
{
|
||||
"Xfrin": {
|
||||
"zones": [
|
||||
{
|
||||
"class": "IN",
|
||||
"name": "example.com.",
|
||||
"master_addr": "178.18.82.80"
|
||||
}
|
||||
]
|
||||
},
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers":
|
||||
[
|
||||
{
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"output_options": [
|
||||
{
|
||||
"output": "stderr",
|
||||
"flush": true
|
||||
}
|
||||
],
|
||||
"name": "*"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Auth": {
|
||||
"database_file": "data/ixfr-out/zones.sqlite3",
|
||||
"listen_on": [
|
||||
{
|
||||
"port": 56176,
|
||||
"address": "::"
|
||||
},
|
||||
{
|
||||
"port": 56176,
|
||||
"address": "0.0.0.0"
|
||||
}
|
||||
]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [
|
||||
{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/ixfr-out/zones.sqlite3"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-xfrin": { "address": "Xfrin", "kind": "dispensable" },
|
||||
"b10-xfrout": { "address": "Xfrout", "kind": "dispensable" },
|
||||
"b10-zonemgr": { "address": "Zonemgr", "kind": "dispensable" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1 +0,0 @@
|
||||
/multi_auth.config
|
@@ -1,34 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
} ]
|
||||
},
|
||||
"Auth": {
|
||||
"database_file": "data/test_nonexistent_db.sqlite3",
|
||||
"listen_on": [ {
|
||||
"port": 56176,
|
||||
"address": "127.0.0.1"
|
||||
} ]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/test_nonexistent_db.sqlite3"
|
||||
}
|
||||
}]
|
||||
}
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth-2": {"kind": "dispensable", "special": "auth"},
|
||||
"b10-auth": {"kind": "dispensable", "special": "auth"},
|
||||
"b10-cmdctl": {"kind": "needed", "special": "cmdctl"}
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,36 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"severity": "DEBUG",
|
||||
"name": "*",
|
||||
"debuglevel": 99
|
||||
}
|
||||
]
|
||||
},
|
||||
"Auth": {
|
||||
"database_file": "data/test_nonexistent_db.sqlite3",
|
||||
"listen_on": [ {
|
||||
"port": 56176,
|
||||
"address": "127.0.0.1"
|
||||
} ]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [
|
||||
{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/test_nonexistent_db.sqlite3"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,36 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [
|
||||
{
|
||||
"severity": "DEBUG",
|
||||
"name": "*", "debuglevel": 99
|
||||
}
|
||||
]
|
||||
},
|
||||
"Auth": {
|
||||
"datasources": [
|
||||
{"zones": [{"origin": "example.", "file": "configurations/nsec3/rfc5155-example.zone.signed"}], "type": "memory"}],
|
||||
"listen_on": [{"port": 56176, "address": "0.0.0.0"}
|
||||
]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [
|
||||
{
|
||||
"type": "MasterFiles",
|
||||
"cache-enable": true,
|
||||
"params": {
|
||||
"example.": "configurations/nsec3/rfc5155-example.zone.signed"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": {"kind": "needed", "special": "auth"},
|
||||
"b10-cmdctl": {"kind": "needed", "special": "cmdctl"}
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,72 +0,0 @@
|
||||
;; The example NSEC3-signed zone used in RFC5155.
|
||||
|
||||
example. 3600 IN SOA ns1.example. bugs.x.w.example. 1 3600 300 3600000 3600
|
||||
example. 3600 IN RRSIG SOA 7 1 3600 20150420235959 20051021000000 40430 example. Hu25UIyNPmvPIVBrldN+9Mlp9Zql39qaUd8iq4ZLlYWfUUbbAS41pG+6 8z81q1xhkYAcEyHdVI2LmKusbZsT0Q==
|
||||
example. 3600 IN NS ns1.example.
|
||||
example. 3600 IN NS ns2.example.
|
||||
example. 3600 IN RRSIG NS 7 1 3600 20150420235959 20051021000000 40430 example. PVOgtMK1HHeSTau+HwDWC8Ts+6C8qtqd4pQJqOtdEVgg+MA+ai4fWDEh u3qHJyLcQ9tbD2vvCnMXjtz6SyObxA==
|
||||
example. 3600 IN MX 1 xx.example.
|
||||
example. 3600 IN RRSIG MX 7 1 3600 20150420235959 20051021000000 40430 example. GgQ1A9xs47k42VPvpL/a1BWUz/6XsnHkjotw9So8MQtZtl2wJBsnOQsa oHrRCrRbyriEl/GZn9Mto/Kx+wBo+w==
|
||||
example. 3600 IN DNSKEY 256 3 7 AwEAAaetidLzsKWUt4swWR8yu0wPHPiUi8LUsAD0QPWU+wzt89epO6tH zkMBVDkC7qphQO2hTY4hHn9npWFRw5BYubE=
|
||||
example. 3600 IN DNSKEY 257 3 7 AwEAAcUlFV1vhmqx6NSOUOq2R/dsR7Xm3upJj7IommWSpJABVfW8Q0rO vXdM6kzt+TAu92L9AbsUdblMFin8CVF3n4s=
|
||||
example. 3600 IN RRSIG DNSKEY 7 1 3600 20150420235959 20051021000000 12708 example. AuU4juU9RaxescSmStrQks3Gh9FblGBlVU31uzMZ/U/FpsUb8aC6QZS+ sTsJXnLnz7flGOsmMGQZf3bH+QsCtg==
|
||||
example. 3600 IN NSEC3PARAM 1 0 12 AABBCCDD
|
||||
example. 3600 IN RRSIG NSEC3PARAM 7 1 3600 20150420235959 20051021000000 40430 example. C1Gl8tPZNtnjlrYWDeeUV/sGLCyy/IHie2rerN05XSA3Pq0U3+4VvGWY WdUMfflOdxqnXHwJTLQsjlkynhG6Cg==
|
||||
2t7b4g4vsa5smi47k61mv5bv1a22bojr.example. 3600 IN A 192.0.2.127
|
||||
2t7b4g4vsa5smi47k61mv5bv1a22bojr.example. 3600 IN RRSIG A 7 2 3600 20150420235959 20051021000000 40430 example. h6c++bzhRuWWt2bykN6mjaTNBcXNq5UuL5EdK+iDP4eY8I0kSiKaCjg3 tC1SQkeloMeub2GWk8p6xHMPZumXlw==
|
||||
a.example. 3600 IN NS ns1.a.example.
|
||||
a.example. 3600 IN NS ns2.a.example.
|
||||
a.example. 3600 IN DS 58470 5 1 3079F1593EBAD6DC121E202A8B766A6A4837206C
|
||||
a.example. 3600 IN RRSIG DS 7 2 3600 20150420235959 20051021000000 40430 example. XacFcQVHLVzdoc45EJhN616zQ4mEXtE8FzUhM2KWjfy1VfRKD9r1MeVG wwoukOKgJxBPFsWoo722vZ4UZ2dIdA==
|
||||
ns1.a.example. 3600 IN A 192.0.2.5
|
||||
ns2.a.example. 3600 IN A 192.0.2.6
|
||||
ai.example. 3600 IN A 192.0.2.9
|
||||
ai.example. 3600 IN RRSIG A 7 2 3600 20150420235959 20051021000000 40430 example. hVe+wKYMlObTRPhX0NL67GxeZfdxqr/QeR6FtfdAj5+FgYxyzPEjIzvK Wy00hWIl6wD3Vws+rznEn8sQ64UdqA==
|
||||
ai.example. 3600 IN HINFO "KLH-10" "ITS"
|
||||
ai.example. 3600 IN RRSIG HINFO 7 2 3600 20150420235959 20051021000000 40430 example. Yi42uOq43eyO6qXHNvwwfFnIustWgV5urFcxenkLvs6pKRh00VBjODmf 3Z4nMO7IOl6nHSQ1v0wLHpEZG7Xj2w==
|
||||
ai.example. 3600 IN AAAA 2001:db8::f00:baa9
|
||||
ai.example. 3600 IN RRSIG AAAA 7 2 3600 20150420235959 20051021000000 40430 example. LcdxKaCB5bGZwPDg+3JJ4O02zoMBrjxqlf6WuaHQZZfTUpb9Nf2nxFGe 2XRPfR5tpJT6GdRGcHueLuXkMjBArQ==
|
||||
c.example. 3600 IN NS ns1.c.example.
|
||||
c.example. 3600 IN NS ns2.c.example.
|
||||
ns1.c.example. 3600 IN A 192.0.2.7
|
||||
ns2.c.example. 3600 IN A 192.0.2.8
|
||||
ns1.example. 3600 IN A 192.0.2.1
|
||||
ns1.example. 3600 IN RRSIG A 7 2 3600 20150420235959 20051021000000 40430 example. bu6kx73n6XEunoVGuRfAgY7EF/AJqHy7hj0jkiqJjB0dOrx3wuz9SaBe GfqWIdn/uta3SavN4FRvZR9SCFHF5Q==
|
||||
ns2.example. 3600 IN A 192.0.2.2
|
||||
ns2.example. 3600 IN RRSIG A 7 2 3600 20150420235959 20051021000000 40430 example. ktQ3TqE0CfRfki0Rb/Ip5BM0VnxelbuejCC4zpLbFKA/7eD7UNAwxMgx JPtbdST+syjYSJaj4IHfeX6n8vfoGA==
|
||||
*.w.example. 3600 IN MX 1 ai.example.
|
||||
*.w.example. 3600 IN RRSIG MX 7 2 3600 20150420235959 20051021000000 40430 example. CikebjQwGQPwijVcxgcZcSJKtfynugtlBiKb9FcBTrmOoyQ4InoWVudh CWsh/URX3lc4WRUMivEBP6+4KS3ldA==
|
||||
x.w.example. 3600 IN MX 1 xx.example.
|
||||
x.w.example. 3600 IN RRSIG MX 7 3 3600 20150420235959 20051021000000 40430 example. IrK3tq/tHFIBF0scHiE/1IwMAvckS/55hAVvQyxTFbkAdDloP3NbZzu+ yoSsr3b3OX6qbBpY7WCtwwekLKRAwQ==
|
||||
x.y.w.example. 3600 IN MX 1 xx.example.
|
||||
x.y.w.example. 3600 IN RRSIG MX 7 4 3600 20150420235959 20051021000000 40430 example. MqSt5HqJIN8+SLlzTOImrh5h9Xa6gDvAW/GnnbdPc6Z7nXvCpLPJj/5l Cwx3VuzVOjkbvXze8/8Ccl2Zn2hbug==
|
||||
xx.example. 3600 IN A 192.0.2.10
|
||||
xx.example. 3600 IN RRSIG A 7 2 3600 20150420235959 20051021000000 40430 example. T35hBWEZ017VC5u2c4OriKyVn/pu+fVK4AlXYOxJ6iQylfV2HQIKjv6b 7DzINB3aF/wjJqgXpQvhq+Ac6+ZiFg==
|
||||
xx.example. 3600 IN HINFO "KLH-10" "TOPS-20"
|
||||
xx.example. 3600 IN RRSIG HINFO 7 2 3600 20150420235959 20051021000000 40430 example. KimG+rDd+7VA1zRsu0ITNAQUTRlpnsmqWrihFRnU+bRa93v2e5oFNFYC s3Rqgv62K93N7AhW6Jfqj/8NzWjvKg==
|
||||
xx.example. 3600 IN AAAA 2001:db8::f00:baaa
|
||||
xx.example. 3600 IN RRSIG AAAA 7 2 3600 20150420235959 20051021000000 40430 example. IXBcXORITNwd8h3gNwyxtYFvAupS/CYWufVeuBUX0O25ivBCULjZjpDx FSxfohb/KA7YRdxENzYfMItpILl/Xw==
|
||||
0p9mhaveqvm6t7vbl5lop2u3t2rp3tom.example. 3600 IN NSEC3 1 1 12 AABBCCDD 2T7B4G4VSA5SMI47K61MV5BV1A22BOJR NS SOA MX RRSIG DNSKEY NSEC3PARAM
|
||||
0p9mhaveqvm6t7vbl5lop2u3t2rp3tom.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. OSgWSm26B+cS+dDL8b5QrWr/dEWhtCsKlwKLIBHYH6blRxK9rC0bMJPw Q4mLIuw85H2EY762BOCXJZMnpuwhpA==
|
||||
2t7b4g4vsa5smi47k61mv5bv1a22bojr.example. 3600 IN NSEC3 1 1 12 AABBCCDD 2VPTU5TIMAMQTTGL4LUU9KG21E0AOR3S A RRSIG
|
||||
2t7b4g4vsa5smi47k61mv5bv1a22bojr.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. OmBvJ1Vgg1hCKMXHFiNeIYHK9XVW0iLDLwJN4TFoNxZuP03gAXEI634Y wOc4YBNITrj413iqNI6mRk/r1dOSUw==
|
||||
2vptu5timamqttgl4luu9kg21e0aor3s.example. 3600 IN NSEC3 1 1 12 AABBCCDD 35MTHGPGCU1QG68FAB165KLNSNK3DPVL MX RRSIG
|
||||
2vptu5timamqttgl4luu9kg21e0aor3s.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. KL1V2oFYghNV0Hm7Tf2vpJjM6l+0g1JCcVYGVfI0lKrhPmTsOA96cLEA Cgo1x8I7kApJX+obTuktZ+sdsZPY1w==
|
||||
35mthgpgcu1qg68fab165klnsnk3dpvl.example. 3600 IN NSEC3 1 1 12 AABBCCDD B4UM86EGHHDS6NEA196SMVMLO4ORS995 NS DS RRSIG
|
||||
35mthgpgcu1qg68fab165klnsnk3dpvl.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. g6jPUUpduAJKRljUsN8gB4UagAX0NxY9shwQAynzo8EUWH+z6hEIBlUT PGj15eZll6VhQqgZXtAIR3chwgW+SA==
|
||||
b4um86eghhds6nea196smvmlo4ors995.example. 3600 IN NSEC3 1 1 12 AABBCCDD GJEQE526PLBF1G8MKLP59ENFD789NJGI MX RRSIG
|
||||
b4um86eghhds6nea196smvmlo4ors995.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. ZkPG3M32lmoHM6pa3D6gZFGB/rhL//Bs3Omh5u4m/CUiwtblEVOaAKKZ d7S959OeiX43aLX3pOv0TSTyiTxIZg==
|
||||
gjeqe526plbf1g8mklp59enfd789njgi.example. 3600 IN NSEC3 1 1 12 AABBCCDD JI6NEOAEPV8B5O6K4EV33ABHA8HT9FGC A HINFO AAAA RRSIG
|
||||
gjeqe526plbf1g8mklp59enfd789njgi.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. IVnezTJ9iqblFF97vPSmfXZ5Zozngx3KX3byLTZC4QBH2dFWhf6scrGF ZB980AfCxoD9qbbKDy+rdGIeRSVNyw==
|
||||
ji6neoaepv8b5o6k4ev33abha8ht9fgc.example. 3600 IN NSEC3 1 1 12 AABBCCDD K8UDEMVP1J2F7EG6JEBPS17VP3N8I58H
|
||||
ji6neoaepv8b5o6k4ev33abha8ht9fgc.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. gPkFp1s2QDQ6wQzcg1uSebZ61W33rUBDcTj72F3kQ490fEdp7k1BUIfb cZtPbX3YCpE+sIt0MpzVSKfTwx4uYA==
|
||||
k8udemvp1j2f7eg6jebps17vp3n8i58h.example. 3600 IN NSEC3 1 1 12 AABBCCDD KOHAR7MBB8DC2CE8A9QVL8HON4K53UHI
|
||||
k8udemvp1j2f7eg6jebps17vp3n8i58h.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. FtXGbvF0+wf8iWkyo73enAuVx03klN+pILBKS6qCcftVtfH4yVzsEZqu J27NHR7ruxJWDNMtOtx7w9WfcIg62A==
|
||||
kohar7mbb8dc2ce8a9qvl8hon4k53uhi.example. 3600 IN NSEC3 1 1 12 AABBCCDD Q04JKCEVQVMU85R014C7DKBA38O0JI5R A RRSIG
|
||||
kohar7mbb8dc2ce8a9qvl8hon4k53uhi.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. VrDXs2uVW21N08SyQIz88zml+y4ZCInTwgDr6zz43yAg+LFERjOrj3Oj ct51ac7Dp4eZbf9FQJazmASFKGxGXg==
|
||||
q04jkcevqvmu85r014c7dkba38o0ji5r.example. 3600 IN NSEC3 1 1 12 AABBCCDD R53BQ7CC2UVMUBFU5OCMM6PERS9TK9EN A RRSIG
|
||||
q04jkcevqvmu85r014c7dkba38o0ji5r.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. hV5I89b+4FHJDATp09g4bbN0R1F845CaXpL3ZxlMKimoPAyqletMlEWw LfFia7sdpSzn+ZlNNlkxWcLsIlMmUg==
|
||||
r53bq7cc2uvmubfu5ocmm6pers9tk9en.example. 3600 IN NSEC3 1 1 12 AABBCCDD T644EBQK9BIBCNA874GIVR6JOJ62MLHV MX RRSIG
|
||||
r53bq7cc2uvmubfu5ocmm6pers9tk9en.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. aupviViruXs4bDg9rCbezzBMf9h1ZlDvbW/CZFKulIGXXLj8B/fsDJar XVDA9bnUoRhEbKp+HF1FWKW7RIJdtQ==
|
||||
t644ebqk9bibcna874givr6joj62mlhv.example. 3600 IN NSEC3 1 1 12 AABBCCDD 0P9MHAVEQVM6T7VBL5LOP2U3T2RP3TOM A HINFO AAAA RRSIG
|
||||
t644ebqk9bibcna874givr6joj62mlhv.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. RAjGECB8P7O+F4Pa4Dx3tC0M+Z3KmlLKImcafb9XWwx+NWUNz7NBEDBQ HivIyKPVDkChcePIX1xPl1ATNa+8Dw==
|
@@ -1 +0,0 @@
|
||||
/resolver_basic.config
|
@@ -1,31 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"severity": "DEBUG",
|
||||
"name": "*",
|
||||
"debuglevel": 99
|
||||
} ]
|
||||
},
|
||||
"Resolver": {
|
||||
"query_acl": [ {
|
||||
"action": "REJECT",
|
||||
"from": "127.0.0.1"
|
||||
} ],
|
||||
"listen_on": [ {
|
||||
"port": 56176,
|
||||
"address": "127.0.0.1"
|
||||
} ]
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-resolver": {
|
||||
"kind": "needed"
|
||||
},
|
||||
"b10-cmdctl": {
|
||||
"kind": "needed",
|
||||
"special": "cmdctl"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,40 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
} ]
|
||||
},
|
||||
"Auth": {
|
||||
"database_file": "data/root.sqlite3",
|
||||
"listen_on": [ {
|
||||
"port": 56176,
|
||||
"address": "127.0.0.1"
|
||||
} ]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [
|
||||
{
|
||||
"type": "sqlite3",
|
||||
"cache-enable": false,
|
||||
"params": {
|
||||
"database_file": "data/root.sqlite3"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Stats": {
|
||||
"poll-interval": 60
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-stats": { "address": "Stats", "kind": "dispensable" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,36 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [{
|
||||
"severity": "DEBUG",
|
||||
"name": "*",
|
||||
"debuglevel": 99
|
||||
}]
|
||||
},
|
||||
"Auth": {
|
||||
"listen_on": [{
|
||||
"port": 56176,
|
||||
"address": "127.0.0.1"
|
||||
}]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [
|
||||
{
|
||||
"type": "MasterFiles",
|
||||
"cache-enable": true,
|
||||
"params": {
|
||||
"example.org": "data/example.org"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-stats": { "address": "Stats", "kind": "dispensable" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,4 +0,0 @@
|
||||
/retransfer_master.conf
|
||||
/retransfer_master_nons.conf
|
||||
/retransfer_slave.conf
|
||||
/retransfer_slave_notify.conf
|
@@ -1,41 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
} ]
|
||||
},
|
||||
"Auth": {
|
||||
"database_file": "data/inmem-xfrin.sqlite3",
|
||||
"listen_on": [ {
|
||||
"address": "::1",
|
||||
"port": 56176
|
||||
} ]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [
|
||||
{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/inmem-xfrin.sqlite3"
|
||||
},
|
||||
"cache-enable": true,
|
||||
"cache-zones": [
|
||||
"example.org"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-xfrin": { "address": "Xfrin", "kind": "dispensable" },
|
||||
"b10-zonemgr": { "address": "Zonemgr", "kind": "dispensable" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,45 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
} ]
|
||||
},
|
||||
"Auth": {
|
||||
"database_file": "data/example.org.sqlite3",
|
||||
"listen_on": [ {
|
||||
"address": "::1",
|
||||
"port": 56177
|
||||
} ]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/example.org.sqlite3"
|
||||
}
|
||||
}]
|
||||
}
|
||||
},
|
||||
"Xfrout": {
|
||||
"zone_config": [ {
|
||||
"origin": "example.org"
|
||||
} ],
|
||||
"also_notify": [ {
|
||||
"address": "::1",
|
||||
"port": 56176
|
||||
} ]
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-xfrout": { "address": "Xfrout", "kind": "dispensable" },
|
||||
"b10-zonemgr": { "address": "Zonemgr", "kind": "dispensable" },
|
||||
"b10-stats": { "address": "Stats", "kind": "dispensable" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,47 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
} ]
|
||||
},
|
||||
"Auth": {
|
||||
"database_file": "data/xfrin-diffs.sqlite3",
|
||||
"listen_on": [ {
|
||||
"address": "::1",
|
||||
"port": 56177
|
||||
} ]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/xfrin-diffs.sqlite3"
|
||||
}
|
||||
}]
|
||||
}
|
||||
},
|
||||
"Xfrout": {
|
||||
"zone_config": [ {
|
||||
"origin": "example."
|
||||
} ],
|
||||
"also_notify": [ {
|
||||
"address": "::1",
|
||||
"port": 56176
|
||||
} ]
|
||||
},
|
||||
"Stats": {
|
||||
"poll-interval": 1
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-xfrout": { "address": "Xfrout", "kind": "dispensable" },
|
||||
"b10-zonemgr": { "address": "Zonemgr", "kind": "dispensable" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,48 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
} ]
|
||||
},
|
||||
"Auth": {
|
||||
"database_file": "data/example.org-nons.sqlite3",
|
||||
"listen_on": [ {
|
||||
"address": "::1",
|
||||
"port": 56177
|
||||
} ]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/example.org-nons.sqlite3"
|
||||
}
|
||||
}]
|
||||
}
|
||||
},
|
||||
"Xfrout": {
|
||||
"zone_config": [ {
|
||||
"origin": "example.org"
|
||||
} ],
|
||||
"also_notify": [ {
|
||||
"address": "::1",
|
||||
"port": 56176
|
||||
} ]
|
||||
},
|
||||
"Stats": {
|
||||
"poll-interval": 1
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-xfrout": { "address": "Xfrout", "kind": "dispensable" },
|
||||
"b10-zonemgr": { "address": "Zonemgr", "kind": "dispensable" },
|
||||
"b10-stats": { "address": "Stats", "kind": "dispensable" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,45 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
} ]
|
||||
},
|
||||
"Auth": {
|
||||
"database_file": "data/example.org.sqlite3",
|
||||
"listen_on": [ {
|
||||
"address": "127.0.0.1",
|
||||
"port": 56179
|
||||
} ]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/example.org.sqlite3"
|
||||
}
|
||||
}]
|
||||
}
|
||||
},
|
||||
"Xfrout": {
|
||||
"zone_config": [ {
|
||||
"origin": "example.org"
|
||||
} ],
|
||||
"also_notify": [ {
|
||||
"address": "127.0.0.1",
|
||||
"port": 56176
|
||||
} ]
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-xfrout": { "address": "Xfrout", "kind": "dispensable" },
|
||||
"b10-zonemgr": { "address": "Zonemgr", "kind": "dispensable" },
|
||||
"b10-stats": { "address": "Stats", "kind": "dispensable" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,34 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
} ]
|
||||
},
|
||||
"Auth": {
|
||||
"listen_on": [ {
|
||||
"address": "::1",
|
||||
"port": 56176
|
||||
} ]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/test_nonexistent_db.sqlite3"
|
||||
}
|
||||
}]
|
||||
}
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-xfrin": { "address": "Xfrin", "kind": "dispensable" },
|
||||
"b10-zonemgr": { "address": "Zonemgr", "kind": "dispensable" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,41 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
} ]
|
||||
},
|
||||
"Auth": {
|
||||
"listen_on": [ {
|
||||
"address": "::1",
|
||||
"port": 56176
|
||||
} ]
|
||||
},
|
||||
"Xfrin": {
|
||||
"zones": [ {
|
||||
"name": "example",
|
||||
"master_addr": "::1",
|
||||
"master_port": 56177
|
||||
} ]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/xfrin-before-diffs.sqlite3"
|
||||
}
|
||||
}]
|
||||
}
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-xfrin": { "address": "Xfrin", "kind": "dispensable" },
|
||||
"b10-zonemgr": { "address": "Zonemgr", "kind": "dispensable" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,49 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
} ]
|
||||
},
|
||||
"Auth": {
|
||||
"listen_on": [ {
|
||||
"address": "::1",
|
||||
"port": 56176
|
||||
} ]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/xfrin-notify.sqlite3"
|
||||
}
|
||||
}]
|
||||
}
|
||||
},
|
||||
"Xfrin": {
|
||||
"zones": [ {
|
||||
"name": "example.org",
|
||||
"master_addr": "::1",
|
||||
"master_port": 56177,
|
||||
"request_ixfr": "no"
|
||||
} ]
|
||||
},
|
||||
"Zonemgr": {
|
||||
"secondary_zones": [ {
|
||||
"name": "example.org",
|
||||
"class": "IN"
|
||||
} ]
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-xfrin": { "address": "Xfrin", "kind": "dispensable" },
|
||||
"b10-zonemgr": { "address": "Zonemgr", "kind": "dispensable" },
|
||||
"b10-stats": { "address": "Stats", "kind": "dispensable" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,49 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
} ]
|
||||
},
|
||||
"Auth": {
|
||||
"listen_on": [ {
|
||||
"address": "127.0.0.1",
|
||||
"port": 56176
|
||||
} ]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/xfrin-notify.sqlite3"
|
||||
}
|
||||
}]
|
||||
}
|
||||
},
|
||||
"Xfrin": {
|
||||
"zones": [ {
|
||||
"name": "example.org",
|
||||
"master_addr": "127.0.0.1",
|
||||
"master_port": 56179,
|
||||
"request_ixfr": "no"
|
||||
} ]
|
||||
},
|
||||
"Zonemgr": {
|
||||
"secondary_zones": [ {
|
||||
"name": "example.org",
|
||||
"class": "IN"
|
||||
} ]
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-xfrin": { "address": "Xfrin", "kind": "dispensable" },
|
||||
"b10-zonemgr": { "address": "Zonemgr", "kind": "dispensable" },
|
||||
"b10-stats": { "address": "Stats", "kind": "dispensable" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,41 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"Logging": {
|
||||
"loggers": [ {
|
||||
"debuglevel": 99,
|
||||
"severity": "DEBUG",
|
||||
"name": "*"
|
||||
} ]
|
||||
},
|
||||
"Auth": {
|
||||
"database_file": "data/xfrout.sqlite3",
|
||||
"listen_on": [ {
|
||||
"address": "::1",
|
||||
"port": 56176
|
||||
} ]
|
||||
},
|
||||
"data_sources": {
|
||||
"classes": {
|
||||
"IN": [{
|
||||
"type": "sqlite3",
|
||||
"params": {
|
||||
"database_file": "data/xfrout.sqlite3"
|
||||
}
|
||||
}]
|
||||
}
|
||||
},
|
||||
"Xfrout": {
|
||||
"zone_config": [ {
|
||||
"origin": "example.org"
|
||||
} ]
|
||||
},
|
||||
"Init": {
|
||||
"components": {
|
||||
"b10-auth": { "kind": "needed", "special": "auth" },
|
||||
"b10-xfrout": { "address": "Xfrout", "kind": "dispensable" },
|
||||
"b10-zonemgr": { "address": "Zonemgr", "kind": "dispensable" },
|
||||
"b10-stats": { "address": "Stats", "kind": "dispensable" },
|
||||
"b10-cmdctl": { "special": "cmdctl", "kind": "needed" }
|
||||
}
|
||||
}
|
||||
}
|
5
tests/lettuce/data/.gitignore
vendored
5
tests/lettuce/data/.gitignore
vendored
@@ -1,5 +0,0 @@
|
||||
/inmem-xfrin.sqlite3
|
||||
/root.sqlite3
|
||||
/test_nonexistent_db.sqlite3
|
||||
/xfrin-before-diffs.sqlite3
|
||||
/xfrin-notify.sqlite3
|
@@ -1,9 +0,0 @@
|
||||
!echo shouldshow
|
||||
# just add something so the test can verify it's reverted
|
||||
config add /Init/components b10-auth
|
||||
config set /Init/components/b10-auth/kind needed
|
||||
config set /Init/components/b10-auth/special auth
|
||||
bad command
|
||||
# this should not be reached
|
||||
!echo shouldnotshow
|
||||
config commit
|
@@ -1,19 +0,0 @@
|
||||
# this is a comment: commentexample1
|
||||
!echo this is an echo: echoexample2
|
||||
!verbose on
|
||||
# this is a comment with verbose on: verbosecommentexample3
|
||||
!verbose off
|
||||
# this is a comment with verbose off again: commentexample4
|
||||
# empty lines and lines with only whitespace should be ignored
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# directives are case insensitive, and should handle whitespace
|
||||
!ECHO echoexample5
|
||||
!eChO echoexample6
|
||||
!Verbose ON
|
||||
# verbosecommentexample7
|
||||
!verBOSE off
|
||||
# commentexample8
|
@@ -1,2 +0,0 @@
|
||||
# include a different file
|
||||
execute file data/commands/nested1
|
@@ -1,2 +0,0 @@
|
||||
# this is included by nested
|
||||
!echo shouldshow
|
1
tests/lettuce/data/ddns/.gitignore
vendored
1
tests/lettuce/data/ddns/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
/example.org.sqlite3
|
Binary file not shown.
Binary file not shown.
@@ -1,11 +0,0 @@
|
||||
example.com. 3600 IN SOA ns1.example.com. admin.example.com. 1234 3600 1800 2419200 7200
|
||||
example.com. 3600 IN NS ns1.example.com.
|
||||
example.com. 3600 IN NS ns2.example.com.
|
||||
example.com. 3600 IN MX 10 mail.example.com.
|
||||
www.example.com. 3600 IN A 192.0.2.1
|
||||
ns1.example.com. 3600 IN A 192.0.2.3
|
||||
ns2.example.com. 3600 IN A 192.0.2.4
|
||||
|
||||
;; DNAME + NS (non-apex) throws ZoneDataUpdater::AddError
|
||||
ns1.example.com. 3600 IN DNAME foo.example.com.
|
||||
ns1.example.com. 3600 IN NS bar.example.com.
|
@@ -1 +0,0 @@
|
||||
|
@@ -1,13 +0,0 @@
|
||||
example.org. 3600 IN SOA ns1.example.org. admin.example.org. 1234 3600 1800 2419200 7200
|
||||
example.org. 3600 IN NS ns1.example.org.
|
||||
example.org. 3600 IN NS ns2.example.org.
|
||||
example.org. 3600 IN MX 10 mail.example.org.
|
||||
www.example.org. 3600 IN A 192.0.2.1
|
||||
mail.example.org. 3600 IN A 192.0.2.10
|
||||
sub.example.org. 3600 IN NS ns.sub.example.org.
|
||||
ns.sub.example.org. 3600 IN A 192.0.2.101
|
||||
dname.example.org. 3600 IN DNAME dname.example.info.
|
||||
dname2.foo.example.org. 3600 IN DNAME dname2.example.info.
|
||||
ns1.example.org. 3600 IN A 192.0.2.3
|
||||
ns2.example.org. 3600 IN A 192.0.2.4
|
||||
shell.example.org. 3600 IN SSHFP 2 1 123456789abcdef67890123456789abcdef67890
|
Binary file not shown.
Binary file not shown.
@@ -1,4 +0,0 @@
|
||||
$ORIGIN example.org.
|
||||
example.org. 3600 IN SOA ns1.example.org. admin.example.org. 12341 3600 1800 2419200 7200
|
||||
$GENERATE 1-2 @ NS ns$.example.org.
|
||||
$GENERATE 1-4 host$ A 192.0.2.$
|
Binary file not shown.
@@ -1,7 +0,0 @@
|
||||
example.org. 3600 IN SOA ns1.example.org. admin.example.org. 1234 3600 1800 2419200 7200
|
||||
example.org. 3600 IN NS ns1.example.org.
|
||||
example.org. 3600 IN NS ns2.example.org.
|
||||
example.org. 3600 IN MX 10 mail.example.org.
|
||||
www.example.org. 3600 IN A 192.0.2.63
|
||||
ns1.example.org. 3600 IN A 192.0.2.3
|
||||
ns2.example.org. 3600 IN A 192.0.2.4
|
Binary file not shown.
1
tests/lettuce/data/ixfr-out/.gitignore
vendored
1
tests/lettuce/data/ixfr-out/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
/zones.sqlite3
|
Binary file not shown.
Binary file not shown.
@@ -1,3 +0,0 @@
|
||||
BIND. 3600 CH SOA BIND. BIND. 3 3600 300 36000 3600
|
||||
BIND. 3600 CH NS BIND.
|
||||
VERSION.BIND. 3600 CH TXT "10"
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
1
tests/lettuce/features/.gitignore
vendored
1
tests/lettuce/features/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
/resolver_basic.feature
|
@@ -1,49 +0,0 @@
|
||||
Feature: Authoritative DNS server with a bad zone
|
||||
This feature set is for testing the execution of the b10-auth
|
||||
component when one zone is broken, whereas others are fine. In this
|
||||
case, b10-auth should not reject the data source, but reject the bad
|
||||
zone only (with SERVFAIL) and serve the good zones anyway.
|
||||
|
||||
Scenario: Bad zone
|
||||
Given I have bind10 running with configuration auth/auth_badzone.config
|
||||
|
||||
# loading example.com, example.net and example.info zones fail.
|
||||
# Note: wait for these messages right away as otherwise they
|
||||
# will be logged and we cannot use the 'new' keyword to wait for
|
||||
# 3 different log messages. *There could still be a race here if
|
||||
# auth starts very quickly.*
|
||||
And wait for new bind10 stderr message DATASRC_LOAD_ZONE_ERROR
|
||||
And wait for new bind10 stderr message DATASRC_LOAD_ZONE_ERROR
|
||||
And wait for new bind10 stderr message DATASRC_LOAD_ZONE_ERROR
|
||||
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
|
||||
A query for www.example.org should have rcode NOERROR
|
||||
The last query response should have flags qr aa
|
||||
The last query response should have ancount 1
|
||||
The last query response should have nscount 2
|
||||
The last query response should have adcount 2
|
||||
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
www.example.org. 3600 IN A 192.0.2.1
|
||||
"""
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example.org. 3600 IN NS ns1.example.org.
|
||||
example.org. 3600 IN NS ns2.example.org.
|
||||
"""
|
||||
The additional section of the last query response should be
|
||||
"""
|
||||
ns1.example.org. 3600 IN A 192.0.2.3
|
||||
ns2.example.org. 3600 IN A 192.0.2.4
|
||||
"""
|
||||
|
||||
A query for www.example.com should have rcode SERVFAIL
|
||||
A query for www.example.net should have rcode SERVFAIL
|
||||
A query for www.example.info should have rcode SERVFAIL
|
@@ -1,20 +0,0 @@
|
||||
Feature: Basic Authoritative DNS server
|
||||
This feature set is for testing the execution of the b10-auth
|
||||
component using its default datasource configurations. This
|
||||
will start it and perform queries against it.
|
||||
|
||||
Scenario: Query builtin bind zone
|
||||
Given I have bind10 running with configuration auth/auth_basic.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
|
||||
A query for example.com should have rcode REFUSED
|
||||
A query for version.bind type TXT class CH should have rcode NOERROR
|
||||
A query for authors.bind type TXT class CH should have rcode NOERROR
|
||||
|
||||
# TODO: to be compatible with BIND 9
|
||||
# A query for nonexistent.bind type TXT class CH should have rcode REFUSED
|
@@ -1,171 +0,0 @@
|
||||
Feature: control with bindctl
|
||||
Assorted tests using bindctl for the administration of BIND 10.
|
||||
|
||||
|
||||
Scenario: Removing modules
|
||||
# This test runs the original example configuration, which has
|
||||
# a number of modules. It then removes all non-essential modules,
|
||||
# and checks whether they do disappear from the list of running
|
||||
# modules (note that it 'misuses' the help command for this,
|
||||
# there is a Init command 'show_processes' but it's output is
|
||||
# currently less standardized than 'help')
|
||||
Given I have bind10 running with configuration bindctl_commands.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message ZONEMGR_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message XFRIN_STARTED
|
||||
And wait for bind10 stderr message XFROUT_STARTED
|
||||
And wait for bind10 stderr message STATS_STARTING
|
||||
And wait for bind10 stderr message STATSHTTPD_STARTED
|
||||
|
||||
Then remove bind10 configuration Init/components/NOSUCHMODULE
|
||||
last bindctl output should contain Error
|
||||
|
||||
bind10 module Xfrout should be running
|
||||
bind10 module Stats should be running
|
||||
bind10 module Zonemgr should be running
|
||||
bind10 module Xfrin should be running
|
||||
bind10 module Auth should be running
|
||||
bind10 module StatsHttpd should be running
|
||||
bind10 module Resolver should not be running
|
||||
|
||||
Then remove bind10 configuration Init/components value b10-xfrout
|
||||
And wait for new bind10 stderr message BIND10_PROCESS_ENDED
|
||||
last bindctl output should not contain Error
|
||||
|
||||
# assuming it won't error for further modules (if it does, the final
|
||||
# 'should not be running' tests would fail anyway)
|
||||
Then remove bind10 configuration Init/components value b10-stats-httpd
|
||||
And wait for new bind10 stderr message BIND10_PROCESS_ENDED
|
||||
last bindctl output should not contain Error
|
||||
|
||||
Then remove bind10 configuration Init/components value b10-stats
|
||||
And wait for new bind10 stderr message BIND10_PROCESS_ENDED
|
||||
last bindctl output should not contain Error
|
||||
|
||||
Then remove bind10 configuration Init/components value b10-zonemgr
|
||||
And wait for new bind10 stderr message BIND10_PROCESS_ENDED
|
||||
last bindctl output should not contain Error
|
||||
|
||||
Then remove bind10 configuration Init/components value b10-xfrin
|
||||
And wait for new bind10 stderr message BIND10_PROCESS_ENDED
|
||||
last bindctl output should not contain Error
|
||||
|
||||
Then remove bind10 configuration Init/components value b10-auth
|
||||
And wait for new bind10 stderr message BIND10_PROCESS_ENDED
|
||||
last bindctl output should not contain Error
|
||||
|
||||
# After these ^^^ have been stopped...
|
||||
bind10 module Xfrout should not be running
|
||||
bind10 module Zonemgr should not be running
|
||||
bind10 module Xfrin should not be running
|
||||
bind10 module Auth should not be running
|
||||
bind10 module StatsHttpd should not be running
|
||||
bind10 module Stats should not be running
|
||||
bind10 module Resolver should not be running
|
||||
|
||||
Scenario: Executing scripts from files
|
||||
# This test tests the 'execute' command, which reads and executes
|
||||
# bindctl commands from a file
|
||||
Given I have bind10 running with configuration bindctl/bindctl.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
|
||||
# first a few bad commands
|
||||
When I send bind10 the command execute
|
||||
last bindctl output should contain Error
|
||||
When I send bind10 the command execute file
|
||||
last bindctl output should contain Error
|
||||
When I send bind10 the command execute file data/commands/nosuchfile
|
||||
last bindctl output should contain Error
|
||||
|
||||
# empty list should be no-op
|
||||
When I send bind10 the command execute file data/commands/empty
|
||||
last bindctl output should not contain Error
|
||||
|
||||
# some tests of directives like !echo and !verbose
|
||||
When I send bind10 the command execute file data/commands/directives
|
||||
last bindctl output should not contain Error
|
||||
last bindctl output should not contain commentexample1
|
||||
last bindctl output should contain echoexample2
|
||||
last bindctl output should contain verbosecommentexample3
|
||||
last bindctl output should not contain commentexample4
|
||||
last bindctl output should contain echoexample5
|
||||
last bindctl output should contain echoexample6
|
||||
last bindctl output should contain verbosecommentexample7
|
||||
last bindctl output should not contain commentexample8
|
||||
|
||||
# bad_command contains a bad command, at which point execution should stop
|
||||
When I send bind10 the command execute file data/commands/bad_command
|
||||
last bindctl output should contain shouldshow
|
||||
last bindctl output should contain Error
|
||||
last bindctl output should not contain shouldnotshow
|
||||
# This would fail if the entire list was passed, or the configuration
|
||||
# was committed
|
||||
send bind10 the command config show Init/components
|
||||
last bindctl output should not contain b10-auth
|
||||
|
||||
# nested_command contains another execute script
|
||||
When I send bind10 the command execute file data/commands/nested
|
||||
last bindctl output should contain shouldshow
|
||||
last bindctl output should not contain Error
|
||||
|
||||
# show commands from a file
|
||||
When I send bind10 the command execute file data/commands/bad_command show
|
||||
last bindctl output should not contain Error
|
||||
last bindctl output should contain shouldshow
|
||||
last bindctl output should contain shouldnotshow
|
||||
|
||||
Scenario: Executing builting script init_authoritative_server
|
||||
Given I have bind10 running with configuration bindctl/bindctl.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
|
||||
When I send bind10 the command execute init_authoritative_server show
|
||||
# just test some parts of the output
|
||||
last bindctl output should contain /Init/components/b10-auth/special
|
||||
last bindctl output should contain /Init/components/b10-zonemgr/kind
|
||||
last bindctl output should contain Please
|
||||
|
||||
# nothing should have been changed
|
||||
When I send bind10 the command config diff
|
||||
last bindctl output should contain {}
|
||||
|
||||
# ok now make sure modules aren't running, execute it, and make
|
||||
# sure modules are running
|
||||
bind10 module Auth should not be running
|
||||
bind10 module Xfrout should not be running
|
||||
bind10 module Xfrin should not be running
|
||||
bind10 module Zonemgr should not be running
|
||||
|
||||
When I send bind10 the following commands:
|
||||
"""
|
||||
execute init_authoritative_server
|
||||
config commit
|
||||
"""
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message ZONEMGR_STARTED
|
||||
And wait for bind10 stderr message XFRIN_STARTED
|
||||
And wait for bind10 stderr message XFROUT_STARTED
|
||||
|
||||
last bindctl output should not contain Error
|
||||
bind10 module Auth should be running
|
||||
bind10 module Xfrout should be running
|
||||
bind10 module Xfrin should be running
|
||||
bind10 module Zonemgr should be running
|
||||
|
||||
Scenario: Shutting down a certain module
|
||||
# We could test with several modules, but for now we are particularly
|
||||
# interested in shutting down cmdctl. It previously caused hangup,
|
||||
# so this scenario confirms it's certainly fixed. Note: since cmdctl
|
||||
# is a "needed" component, shutting it down will result in system
|
||||
# shutdown. So "send bind10 command" will fail (it cannot complete
|
||||
# "quit").
|
||||
Given I have bind10 running with configuration bindctl/bindctl.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
|
||||
When I send bind10 ignoring failure the command Cmdctl shutdown
|
||||
And wait for bind10 stderr message CMDCTL_EXITING
|
||||
And wait for bind10 stderr message BIND10_SHUTDOWN_COMPLETE
|
@@ -1,179 +0,0 @@
|
||||
Feature: DDNS System
|
||||
A number of BIND10-specific DDNS tests, that do not fall under the
|
||||
'compliance' category; specific ACL checks, module checks, etc.
|
||||
|
||||
Scenario: Module tests
|
||||
# The given config has b10-ddns disabled
|
||||
Given I have bind10 running with configuration ddns/noddns.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
# Sanity check
|
||||
bind10 module DDNS should not be running
|
||||
|
||||
# Test 1
|
||||
When I use DDNS to set the SOA serial to 1235
|
||||
# Note: test spec says refused here, system returns NOTIMP
|
||||
The DDNS response should be NOTIMP
|
||||
And the SOA serial for example.org should be 1234
|
||||
|
||||
# Test 2
|
||||
When I configure bind10 to run DDNS
|
||||
And wait for new bind10 stderr message DDNS_STARTED
|
||||
bind10 module DDNS should be running
|
||||
|
||||
# Test 3
|
||||
When I use DDNS to set the SOA serial to 1236
|
||||
The DDNS response should be REFUSED
|
||||
And the SOA serial for example.org should be 1234
|
||||
|
||||
# Test 4
|
||||
When I send bind10 the following commands
|
||||
"""
|
||||
config add DDNS/zones
|
||||
config set DDNS/zones[0]/origin example.org
|
||||
config add DDNS/zones[0]/update_acl {"action": "ACCEPT", "from": "127.0.0.1"}
|
||||
config commit
|
||||
"""
|
||||
|
||||
# Test 5
|
||||
When I use DDNS to set the SOA serial to 1237
|
||||
# also check if Auth server reloaded
|
||||
And wait for new bind10 stderr message AUTH_DATASRC_CLIENTS_BUILDER_LOAD_ZONE
|
||||
The DDNS response should be SUCCESS
|
||||
And the SOA serial for example.org should be 1237
|
||||
|
||||
# Test 6
|
||||
When I send bind10 the command DDNS shutdown
|
||||
And wait for new bind10 stderr message DDNS_STOPPED
|
||||
|
||||
# Test 7
|
||||
# Init should restart it
|
||||
And wait for new bind10 stderr message DDNS_STARTED
|
||||
|
||||
# Test 8
|
||||
When I use DDNS to set the SOA serial to 1238
|
||||
And wait for new bind10 stderr message AUTH_DATASRC_CLIENTS_BUILDER_LOAD_ZONE
|
||||
The DDNS response should be SUCCESS
|
||||
And the SOA serial for example.org should be 1238
|
||||
|
||||
When I use DDNS to set the SOA serial to 1239
|
||||
And wait for new bind10 stderr message AUTH_DATASRC_CLIENTS_BUILDER_LOAD_ZONE
|
||||
The DDNS response should be SUCCESS
|
||||
And the SOA serial for example.org should be 1239
|
||||
|
||||
# Test 9
|
||||
When I send bind10 the command Auth shutdown
|
||||
And wait for new bind10 stderr message AUTH_SHUTDOWN
|
||||
# Init should restart it automatically
|
||||
And wait for new bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
# Test 10
|
||||
When I use DDNS to set the SOA serial to 1240
|
||||
And wait for new bind10 stderr message AUTH_DATASRC_CLIENTS_BUILDER_LOAD_ZONE
|
||||
The DDNS response should be SUCCESS
|
||||
And the SOA serial for example.org should be 1240
|
||||
|
||||
# Test 11
|
||||
When I configure BIND10 to stop running DDNS
|
||||
And wait for new bind10 stderr message DDNS_STOPPED
|
||||
|
||||
bind10 module DDNS should not be running
|
||||
|
||||
# Test 12
|
||||
When I use DDNS to set the SOA serial to 1241
|
||||
# should this be REFUSED again?
|
||||
The DDNS response should be NOTIMP
|
||||
And the SOA serial for example.org should be 1240
|
||||
|
||||
Scenario: ACL
|
||||
Given I have bind10 running with configuration ddns/ddns.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message DDNS_STARTED
|
||||
|
||||
# Sanity check
|
||||
A query for new1.example.org should have rcode NXDOMAIN
|
||||
A query for new2.example.org should have rcode NXDOMAIN
|
||||
A query for new3.example.org should have rcode NXDOMAIN
|
||||
The SOA serial for example.org should be 1234
|
||||
|
||||
# Test 1
|
||||
When I use DDNS to add a record new1.example.org. 3600 IN A 192.0.2.1
|
||||
The DDNS response should be SUCCESS
|
||||
A query for new1.example.org should have rcode NOERROR
|
||||
The SOA serial for example.org should be 1235
|
||||
|
||||
# Test 2
|
||||
When I set DDNS ACL 0 for 127.0.0.1 to REJECT
|
||||
Then use DDNS to add a record new2.example.org. 3600 IN A 192.0.2.2
|
||||
The DDNS response should be REFUSED
|
||||
A query for new2.example.org should have rcode NXDOMAIN
|
||||
The SOA serial for example.org should be 1235
|
||||
|
||||
# Test 3
|
||||
When I set DDNS ACL 0 for 127.0.0.1 to ACCEPT
|
||||
Then use DDNS to add a record new3.example.org. 3600 IN A 192.0.2.3
|
||||
The DDNS response should be SUCCESS
|
||||
A query for new3.example.org should have rcode NOERROR
|
||||
The SOA serial for example.org should be 1236
|
||||
|
||||
Scenario: Zone validation check
|
||||
Given I have bind10 running with configuration ddns/ddns.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message DDNS_STARTED
|
||||
|
||||
# Sanity check
|
||||
A query for example.org type NS should have rcode NOERROR
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
example.org. 3600 IN NS ns1.example.org.
|
||||
example.org. 3600 IN NS ns2.example.org.
|
||||
example.org. 3600 IN NS ns3.example.org.
|
||||
"""
|
||||
The SOA serial for example.org should be 1234
|
||||
|
||||
# Test failed validation. Here, example.org has ns1.example.org
|
||||
# configured as a name server. CNAME records cannot be added for
|
||||
# ns1.example.org.
|
||||
When I use DDNS to add a record ns1.example.org. 3600 IN CNAME ns3.example.org.
|
||||
The DDNS response should be REFUSED
|
||||
A query for ns1.example.org type CNAME should have rcode NXDOMAIN
|
||||
The SOA serial for example.org should be 1234
|
||||
|
||||
# Test passed validation. Here, example.org does not have
|
||||
# ns4.example.org configured as a name server. CNAME records can
|
||||
# be added for ns4.example.org.
|
||||
When I use DDNS to add a record ns4.example.org. 3600 IN CNAME ns3.example.org.
|
||||
The DDNS response should be SUCCESS
|
||||
A query for ns4.example.org type CNAME should have rcode NOERROR
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
ns4.example.org. 3600 IN CNAME ns3.example.org.
|
||||
"""
|
||||
The SOA serial for example.org should be 1235
|
||||
|
||||
#Scenario: DDNS and Xfrout
|
||||
## Unfortunately, Xfrout can only notify to inzone slaves, and hence only
|
||||
## to port 53, which we do not want to use for Lettuce tests (for various
|
||||
## reasons). So for now this test is only an outline, the configs
|
||||
## themselves have not been set up yet
|
||||
# When I start bind10 with configuration ddns/primary.config as primary
|
||||
# And wait for primary stderr message AUTH_SERVER_STARTED
|
||||
# And wait for primary stderr message XFROUT_STARTED
|
||||
# And wait for primary stderr message DDNS_STARTED
|
||||
|
||||
# And I start bind10 with configuration example2.org.config with cmdctl port 56174 as secondary
|
||||
# And wait for secondary stderr message AUTH_SERVER_STARTED
|
||||
# And wait for secondary stderr message XFRIN_STARTED
|
||||
|
||||
# # Sanity check
|
||||
# The SOA serial for example.org should be 1234
|
||||
# The SOA serial for example.org at 127.0.0.1:56177 should be 1234
|
||||
|
||||
# When I use DDNS to set the SOA serial to 1235
|
||||
# The DDNS response should be SUCCESS
|
||||
|
||||
# The SOA serial for example.org should be 1235
|
||||
# The SOA serial for example.org at 127.0.0.1:56177 should be 1235
|
@@ -1,21 +0,0 @@
|
||||
Feature: default bind10 config
|
||||
Tests for the default configuration of bind10.
|
||||
|
||||
Scenario: Check that only the default components are running
|
||||
Given I have bind10 running with configuration default.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message STATS_STARTING
|
||||
|
||||
# These should be running
|
||||
bind10 module Init should be running
|
||||
And bind10 module Logging should be running
|
||||
And bind10 module Stats should be running
|
||||
|
||||
# These should not be running
|
||||
bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Auth should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
@@ -1,225 +0,0 @@
|
||||
Feature: Example feature
|
||||
This is an example Feature set. Is is mainly intended to show
|
||||
our use of the lettuce tool and our own framework for it
|
||||
The first scenario is to show what a simple test would look like, and
|
||||
is intentionally uncommented.
|
||||
The later scenarios have comments to show what the test steps do and
|
||||
support
|
||||
|
||||
Scenario: A simple example
|
||||
Given I have bind10 running with configuration example.org.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A query for www.example.org should have rcode NOERROR
|
||||
A query for www.doesnotexist.org should have rcode REFUSED
|
||||
The SOA serial for example.org should be 1234
|
||||
|
||||
Scenario: New database
|
||||
# This test checks whether a database file is automatically created
|
||||
# Underwater, we take advantage of our initialization routines so
|
||||
# that we are sure this file does not exist, see
|
||||
# features/terrain/terrain.py
|
||||
|
||||
# Standard check to test (non-)existence of a file.
|
||||
# This file is actually automatically created.
|
||||
The file data/test_nonexistent_db.sqlite3 should not exist
|
||||
|
||||
# In the first scenario, we used 'given I have bind10 running', which
|
||||
# is actually a compound step consisting of the following two
|
||||
# one to start the server
|
||||
When I start bind10 with configuration no_db_file.config
|
||||
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
# Now we use the first step again to see if the file has been created
|
||||
The file data/test_nonexistent_db.sqlite3 should exist
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
# This is a general step to stop a named process. By convention,
|
||||
# the default name for any process is the same as the one we
|
||||
# use in the start step (for bind 10, that is 'I start bind10 with')
|
||||
# See scenario 'Multiple instances' for more.
|
||||
Then stop process bind10
|
||||
|
||||
Scenario: example.org queries
|
||||
# This scenario performs a number of queries and inspects the results
|
||||
# Simple queries have already been show, but after we have sent a query,
|
||||
# we can also do more extensive checks on the result.
|
||||
# See querying.py for more information on these steps.
|
||||
|
||||
# note: lettuce can group similar checks by using tables, but we
|
||||
# intentionally do not make use of that here
|
||||
|
||||
# This is a compound statement that starts and waits for the
|
||||
# started message
|
||||
Given I have bind10 running with configuration example.org.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
# Some simple queries that is not examined further
|
||||
A query for www.example.com should have rcode REFUSED
|
||||
A query for www.example.org should have rcode NOERROR
|
||||
|
||||
# A query where we look at some of the result properties
|
||||
A query for www.example.org should have rcode NOERROR
|
||||
The last query response should have qdcount 1
|
||||
The last query response should have ancount 1
|
||||
The last query response should have nscount 3
|
||||
The last query response should have adcount 0
|
||||
# The answer section can be inspected in its entirety; in the future
|
||||
# we may add more granular inspection steps
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
www.example.org. 3600 IN A 192.0.2.1
|
||||
"""
|
||||
|
||||
A query for example.org type NS should have rcode NOERROR
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
example.org. 3600 IN NS ns1.example.org.
|
||||
example.org. 3600 IN NS ns2.example.org.
|
||||
example.org. 3600 IN NS ns3.example.org.
|
||||
"""
|
||||
|
||||
# We have a specific step for checking SOA serial numbers
|
||||
The SOA serial for example.org should be 1234
|
||||
|
||||
# Another query where we look at some of the result properties
|
||||
A query for doesnotexist.example.org should have rcode NXDOMAIN
|
||||
The last query response should have qdcount 1
|
||||
The last query response should have ancount 0
|
||||
The last query response should have nscount 1
|
||||
The last query response should have adcount 0
|
||||
# When checking flags, we must pass them exactly as they appear in
|
||||
# the output of dig.
|
||||
The last query response should have flags qr aa
|
||||
|
||||
A query for www.example.org type TXT should have rcode NOERROR
|
||||
The last query response should have ancount 0
|
||||
|
||||
# Some queries where we specify more details about what to send and
|
||||
# where
|
||||
A query for www.example.org class CH should have rcode REFUSED
|
||||
A query for www.example.org to 127.0.0.1 should have rcode NOERROR
|
||||
A query for www.example.org to 127.0.0.1:56176 should have rcode NOERROR
|
||||
A query for www.example.org type A class IN to 127.0.0.1:56176 should have rcode NOERROR
|
||||
|
||||
Scenario: example.org mixed-case query
|
||||
# This scenario performs a mixed-case query and checks that the
|
||||
# response has the name copied from the question exactly
|
||||
# (without any change in case). For why this is necessary, see
|
||||
# section 5.2 of:
|
||||
# http://tools.ietf.org/html/draft-vixie-dnsext-dns0x20-00
|
||||
|
||||
Given I have bind10 running with configuration example.org.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A query for wWw.eXaMpLe.Org should have rcode NOERROR
|
||||
The last query response should have qdcount 1
|
||||
The last query response should have ancount 1
|
||||
The last query response should have nscount 3
|
||||
The last query response should have adcount 0
|
||||
The question section of the last query response should exactly be
|
||||
"""
|
||||
;wWw.eXaMpLe.Org. IN A
|
||||
"""
|
||||
|
||||
Scenario: changing database
|
||||
# This scenario contains a lot of 'wait for' steps
|
||||
# If those are not present, the asynchronous nature of the application
|
||||
# can cause some of the things we send to be handled out of order;
|
||||
# for instance auth could still be serving the old zone when we send
|
||||
# the new query, or already respond from the new database.
|
||||
# Therefore we wait for specific log messages after each operation
|
||||
#
|
||||
# This scenario outlines every single step, and does not use
|
||||
# 'steps of steps' (e.g. Given I have bind10 running)
|
||||
# We can do that but as an example this is probably better to learn
|
||||
# the system
|
||||
|
||||
When I start bind10 with configuration example.org.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A query for www.example.org should have rcode NOERROR
|
||||
Wait for new bind10 stderr message AUTH_SEND_NORMAL_RESPONSE
|
||||
Then set bind10 configuration data_sources/classes/IN[0]/params to {"database_file": "data/empty_db.sqlite3"}
|
||||
# The 'not missing placeholder' check is for #2743
|
||||
And wait for new bind10 stderr message DATASRC_SQLITE_CONNOPEN not Missing placeholder
|
||||
A query for www.example.org should have rcode REFUSED
|
||||
Wait for new bind10 stderr message AUTH_SEND_NORMAL_RESPONSE
|
||||
Then set bind10 configuration data_sources/classes/IN[0]/params to {"database_file": "data/example.org.sqlite3"}
|
||||
# The 'not missing placeholder' check is for #2743
|
||||
And wait for new bind10 stderr message DATASRC_SQLITE_CONNOPEN not Missing placeholder
|
||||
A query for www.example.org should have rcode NOERROR
|
||||
|
||||
Scenario: two bind10 instances
|
||||
# This is more a test of the test system, start 2 bind10's
|
||||
When I start bind10 with configuration example.org.config as bind10_one
|
||||
And wait for bind10_one stderr message BIND10_STARTED_CC
|
||||
And wait for bind10_one stderr message CMDCTL_STARTED
|
||||
And wait for bind10_one stderr message AUTH_SERVER_STARTED
|
||||
|
||||
And I start bind10 with configuration example2.org.config with cmdctl port 56174 as bind10_two
|
||||
And wait for bind10_two stderr message BIND10_STARTED_CC
|
||||
And wait for bind10_two stderr message CMDCTL_STARTED
|
||||
And wait for bind10_two stderr message AUTH_SERVER_STARTED
|
||||
|
||||
A query for www.example.org to 127.0.0.1:56176 should have rcode NOERROR
|
||||
A query for www.example.org to [::1]:56177 should have rcode NOERROR
|
||||
The SOA serial for example.org should be 1234
|
||||
The SOA serial for example.org at 127.0.0.1:56176 should be 1234
|
||||
The SOA serial for example.org at ::1:56177 should be 1234
|
||||
|
||||
Then set bind10 configuration data_sources/classes/IN[0]/params to {"database_file": "data/empty_db.sqlite3"}
|
||||
And wait for bind10_one stderr message DATASRC_SQLITE_CONNOPEN
|
||||
|
||||
A query for www.example.org to 127.0.0.1:56176 should have rcode REFUSED
|
||||
A query for www.example.org to [::1]:56177 should have rcode NOERROR
|
@@ -1,43 +0,0 @@
|
||||
Feature: In-memory zone using SQLite3 backend
|
||||
This feature tests the authoritative server configured with an in-memory
|
||||
data source that uses the SQLite3 data source as the backend, and tests
|
||||
scenarios that update the zone via incoming zone transfers.
|
||||
|
||||
Scenario: 1. Load and response
|
||||
Given I have bind10 running with configuration inmemory_over_sqlite3/secondary.conf
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
A query for www.example.org should have rcode NOERROR
|
||||
The SOA serial for example.org should be 1234
|
||||
|
||||
Scenario: 2. In-memory datasource backed by sqlite3
|
||||
Given I have bind10 running with configuration xfrin/retransfer_master.conf with cmdctl port 56174 as master
|
||||
And wait for master stderr message BIND10_STARTED_CC
|
||||
And wait for master stderr message CMDCTL_STARTED
|
||||
And wait for master stderr message AUTH_SERVER_STARTED
|
||||
And wait for master stderr message XFROUT_STARTED
|
||||
And wait for master stderr message ZONEMGR_STARTED
|
||||
|
||||
And I have bind10 running with configuration xfrin/inmem_slave.conf
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message XFRIN_STARTED
|
||||
And wait for bind10 stderr message ZONEMGR_STARTED
|
||||
|
||||
A query for www.example.org to [::1]:56176 should have rcode NOERROR
|
||||
"""
|
||||
www.example.org. 3600 IN A 192.0.2.63
|
||||
"""
|
||||
A query for mail.example.org to [::1]:56176 should have rcode NXDOMAIN
|
||||
When I send bind10 the command Xfrin retransfer example.org IN ::1 56177
|
||||
Then wait for new bind10 stderr message XFRIN_TRANSFER_SUCCESS not XFRIN_XFR_PROCESS_FAILURE
|
||||
Then wait for new bind10 stderr message AUTH_DATASRC_CLIENTS_BUILDER_LOAD_ZONE
|
||||
|
||||
A query for www.example.org to [::1]:56177 should have rcode NOERROR
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
www.example.org. 3600 IN A 192.0.2.1
|
||||
"""
|
||||
A query for mail.example.org to [::1]:56176 should have rcode NOERROR
|
@@ -1,209 +0,0 @@
|
||||
Feature: IXFR out
|
||||
Tests for IXFR-out, specific for BIND 10 behaviour.
|
||||
These are (part of) the tests as described on
|
||||
http://bind10.isc.org/wiki/IxfrSystemTests
|
||||
|
||||
# A lot of these tests test specific UDP behaviour.
|
||||
#
|
||||
# Where possible, we use the TCP equivalent. Some of the behaviour
|
||||
# tested is UDP-specific though. In either case, a comment above
|
||||
# the test shows how and why it differs from the test specification,
|
||||
# or why it is commented out for now.
|
||||
# When we do implement UDP IXFR, we should probably keep the TCP
|
||||
# tests, and add them to the test specification, so we still have a
|
||||
# 1-to-1 mapping between these tests and the specification document.
|
||||
#
|
||||
# These tests use a zone with just a few records, the first serial
|
||||
# is 2, and it is incremented in steps of 2, up to serial 22.
|
||||
# Each updates either deletes or adds the www.example.com A record.
|
||||
# Version 2 has the record, then the update to version 4 deletes it,
|
||||
# the update to 6 adds it again, and so on, until version 22 (where
|
||||
# the last update has added it again)
|
||||
#
|
||||
# Some of the tests (scenario 1 tests 3 and 4, and scenario 2 tests 1 and
|
||||
# 2 may still not work if we replicate BIND 9's behaviour; it always
|
||||
# responds to UDP IXFR requests with just the SOA, and it does not do
|
||||
# AXFR-style IXFR if the number of changes exceeds the size of the zone)
|
||||
#
|
||||
# So in effect, there is only one test that is currently active (scenario
|
||||
# 1 test 7)
|
||||
|
||||
|
||||
Scenario: Test Set 1
|
||||
Given I have bind10 running with configuration ixfr-out/testset1-config.db
|
||||
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message XFROUT_STARTED
|
||||
And wait for bind10 stderr message XFRIN_STARTED
|
||||
And wait for bind10 stderr message ZONEMGR_STARTED
|
||||
|
||||
The SOA serial for example.com should be 22
|
||||
|
||||
#
|
||||
# Test 1
|
||||
#
|
||||
# We don't support UDP yet, and for TCP we currently return full zone,
|
||||
# so this test is currently skipped
|
||||
#
|
||||
#When I do an IXFR transfer of example.com 123 over udp
|
||||
#The transfer result should have 1 RRs
|
||||
#The full result of the last transfer should be
|
||||
#"""
|
||||
#example.com. 3600 IN SOA ns.example.com. admin.example.com. 22 28800 7200 604800 18000
|
||||
#"""
|
||||
|
||||
#
|
||||
# Test 2
|
||||
#
|
||||
# Original test specification was for UDP, using TCP for now
|
||||
#
|
||||
#When I do an IXFR transfer of example.com 22 over udp
|
||||
When I do an IXFR transfer of example.com 22 over tcp
|
||||
The transfer result should have 1 RRs
|
||||
The full result of the last transfer should be
|
||||
"""
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 22 28800 7200 604800 18000
|
||||
"""
|
||||
|
||||
#
|
||||
# Test 3
|
||||
#
|
||||
# Original test specification was for UDP, using TCP for now
|
||||
#
|
||||
#When I do an IXFR transfer of example.com 20 over udp
|
||||
When I do an IXFR transfer of example.com 20 over tcp
|
||||
The transfer result should have 5 RRs
|
||||
The full result of the last transfer should be
|
||||
"""
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 22 28800 7200 604800 18000
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 20 28800 7200 604800 18000
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 22 28800 7200 604800 18000
|
||||
www.example.com. 3600 IN A 192.0.2.1
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 22 28800 7200 604800 18000
|
||||
"""
|
||||
|
||||
#
|
||||
# Test 4
|
||||
#
|
||||
# Original test specification was for UDP, using TCP for now
|
||||
#
|
||||
#When I do an IXFR transfer of example.com 18 over udp
|
||||
When I do an IXFR transfer of example.com 18 over tcp
|
||||
The transfer result should have 8 RRs
|
||||
The full result of the last transfer should be
|
||||
"""
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 22 28800 7200 604800 18000
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 18 28800 7200 604800 18000
|
||||
www.example.com. 3600 IN A 192.0.2.1
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 20 28800 7200 604800 18000
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 20 28800 7200 604800 18000
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 22 28800 7200 604800 18000
|
||||
www.example.com. 3600 IN A 192.0.2.1
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 22 28800 7200 604800 18000
|
||||
"""
|
||||
|
||||
#
|
||||
# Test 5
|
||||
#
|
||||
# This test does not have a TCP equivalent, so it is skipped.
|
||||
#
|
||||
#When I do an IXFR transfer of example.com 2 over udp
|
||||
#The transfer result should have 1 RRs
|
||||
#The full result of the last transfer should be
|
||||
#"""
|
||||
#example.com. 3600 IN SOA ns.example.com. admin.example.com. 22 28800 7200 604800 18000
|
||||
#"""
|
||||
|
||||
#
|
||||
# Test 6
|
||||
#
|
||||
# This test does not have a TCP equivalent, so it is skipped.
|
||||
#
|
||||
#When I do an IXFR transfer of example.com 5 over udp
|
||||
#The transfer result should have 1 RRs
|
||||
#The full result of the last transfer should be
|
||||
#"""
|
||||
#example.com. 3600 IN SOA ns.example.com. admin.example.com. 22 28800 7200 604800 18000
|
||||
#"""
|
||||
|
||||
#
|
||||
# Test 7
|
||||
#
|
||||
When I do an IXFR transfer of example.com 14 over tcp
|
||||
The transfer result should have 14 RRs
|
||||
The full result of the last transfer should be
|
||||
"""
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 22 28800 7200 604800 18000
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 14 28800 7200 604800 18000
|
||||
www.example.com. 3600 IN A 192.0.2.1
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 16 28800 7200 604800 18000
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 16 28800 7200 604800 18000
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 18 28800 7200 604800 18000
|
||||
www.example.com. 3600 IN A 192.0.2.1
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 18 28800 7200 604800 18000
|
||||
www.example.com. 3600 IN A 192.0.2.1
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 20 28800 7200 604800 18000
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 20 28800 7200 604800 18000
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 22 28800 7200 604800 18000
|
||||
www.example.com. 3600 IN A 192.0.2.1
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 22 28800 7200 604800 18000
|
||||
"""
|
||||
|
||||
Scenario: Test Set 2
|
||||
Given I have bind10 running with configuration ixfr-out/testset1-config.db
|
||||
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message XFROUT_STARTED
|
||||
And wait for bind10 stderr message XFRIN_STARTED
|
||||
And wait for bind10 stderr message ZONEMGR_STARTED
|
||||
|
||||
The SOA serial for example.com should be 22
|
||||
|
||||
#
|
||||
# Test 1
|
||||
#
|
||||
# Original test specification was for UDP, using TCP for now
|
||||
#
|
||||
#When I do an IXFR transfer of example.com 19 over udp
|
||||
When I do an IXFR transfer of example.com 19 over tcp
|
||||
The transfer result should have 5 RRs
|
||||
The full result of the last transfer should be
|
||||
"""
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 22 28800 7200 604800 18000
|
||||
example.com. 3600 IN NS ns.example.com.
|
||||
ns.example.com. 3600 IN A 192.0.2.1
|
||||
www.example.com. 3600 IN A 192.0.2.1
|
||||
example.com. 3600 IN SOA ns.example.com. admin.example.com. 22 28800 7200 604800 18000
|
||||
"""
|
||||
|
||||
#
|
||||
# Test 2
|
||||
#
|
||||
# This test has no TCP equivalent
|
||||
#
|
||||
#When I do an IXFR transfer of example.com 6 over udp
|
||||
#The transfer result should have 5 RRs
|
||||
#The full result of the last transfer should be
|
||||
#"""
|
||||
#example.com. 3600 IN SOA ns.example.com. admin.example.com. 22 28800 7200 604800 18000
|
||||
#example.com. 3600 IN NS ns.example.com.
|
||||
#ns.example.com. 3600 IN A 192.0.2.1
|
||||
#www.example.com. 3600 IN A 192.0.2.1
|
||||
#example.com. 3600 IN SOA ns.example.com. admin.example.com. 22 28800 7200 604800 18000
|
||||
#"""
|
||||
|
||||
#
|
||||
# Test 3
|
||||
#
|
||||
# This test has no TCP equivalent
|
||||
#
|
||||
#When I do an IXFR transfer of example.com 2 over udp
|
||||
#The transfer result should have 1 RRs
|
||||
#The full result of the last transfer should be
|
||||
#"""
|
||||
#example.com. 3600 IN SOA ns.example.com. admin.example.com. 22 28800 7200 604800 18000
|
||||
#"""
|
@@ -1,50 +0,0 @@
|
||||
Feature: Master loader feature
|
||||
This feature is a collection of tests for the zone file loader in
|
||||
BIND 10.
|
||||
|
||||
Scenario: $GENERATE support
|
||||
Given I have bind10 running with configuration generate.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A query for www.example.org should have rcode NXDOMAIN
|
||||
The SOA serial for example.org should be 12341
|
||||
|
||||
A query for host0.example.org should have rcode NXDOMAIN
|
||||
A query for host1.example.org should have rcode NOERROR
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
host1.example.org. 3600 IN A 192.0.2.1
|
||||
"""
|
||||
A query for host2.example.org should have rcode NOERROR
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
host2.example.org. 3600 IN A 192.0.2.2
|
||||
"""
|
||||
A query for host3.example.org should have rcode NOERROR
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
host3.example.org. 3600 IN A 192.0.2.3
|
||||
"""
|
||||
A query for host4.example.org should have rcode NOERROR
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
host4.example.org. 3600 IN A 192.0.2.4
|
||||
"""
|
||||
A query for host5.example.org should have rcode NXDOMAIN
|
||||
|
||||
A query for example.org type NS should have rcode NOERROR
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
example.org. 3600 IN NS ns1.example.org.
|
||||
example.org. 3600 IN NS ns2.example.org.
|
||||
"""
|
@@ -1,18 +0,0 @@
|
||||
Feature: Message queue tests
|
||||
Tests for the message queue daemon.
|
||||
|
||||
Scenario: logging
|
||||
# We check the message queue logs.
|
||||
Given I have bind10 running with configuration default.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message MSGQ_START
|
||||
And wait for bind10 stderr message MSGQ_LISTENER_STARTED
|
||||
And wait for bind10 stderr message MSGQ_CFGMGR_SUBSCRIBED
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
|
||||
# Check it handles configuration. The configuration is invalid,
|
||||
# but it should get there anyway and we abuse it.
|
||||
# TODO: Once it has any kind of real command or configuration
|
||||
# value, use that instead.
|
||||
Then set bind10 configuration Msgq to {"nonsense": 1}
|
||||
And wait for bind10 stderr message MSGQ_CONFIG_DATA
|
@@ -1,59 +0,0 @@
|
||||
Feature: Multiple instances
|
||||
This feature tests whether multiple instances can be run, and whether
|
||||
removing them does not affect the running of other instances
|
||||
|
||||
Scenario: Multiple instances of Auth
|
||||
# Standard check to test (non-)existence of a file
|
||||
# This file is actually automatically
|
||||
The file data/test_nonexistent_db.sqlite3 should not exist
|
||||
|
||||
# This config should have two running instances
|
||||
Given I have bind10 running with configuration multi_instance/multi_auth.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
|
||||
# This is a hack. We should actually check if b10-auth and
|
||||
# b10-auth-2 are started by name. But there's currently no way
|
||||
# for a component to find out its name and log it.
|
||||
And wait 2 times for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
# Now we use the first step again to see if the file has been created
|
||||
The file data/test_nonexistent_db.sqlite3 should exist
|
||||
|
||||
A query for example.com should have rcode REFUSED
|
||||
|
||||
# this also checks whether the process is running
|
||||
If I remember the pid of process b10-auth
|
||||
And remember the pid of process b10-auth-2
|
||||
|
||||
When I remove bind10 configuration Init/components value b10-auth-2
|
||||
And wait for new bind10 stderr message BIND10_PROCESS_ENDED
|
||||
|
||||
Then the pid of process b10-auth should not have changed
|
||||
And a query for example.com should have rcode REFUSED
|
||||
|
||||
When I send bind10 the following commands
|
||||
"""
|
||||
config add Init/components b10-auth-2
|
||||
config set Init/components/b10-auth-2/special auth
|
||||
config set Init/components/b10-auth-2/kind needed
|
||||
config commit
|
||||
"""
|
||||
And wait for new bind10 stderr message AUTH_SERVER_STARTED
|
||||
And remember the pid of process b10-auth-2
|
||||
|
||||
Then the pid of process b10-auth should not have changed
|
||||
A query for example.com should have rcode REFUSED
|
||||
|
||||
When I remove bind10 configuration Init/components value b10-auth
|
||||
And wait for new bind10 stderr message BIND10_PROCESS_ENDED
|
||||
Then the pid of process b10-auth-2 should not have changed
|
||||
A query for example.com should have rcode REFUSED
|
@@ -1,466 +0,0 @@
|
||||
Feature: NSEC3 Authoritative service
|
||||
This feature tests NSEC3 as defined in RFC5155, using the example
|
||||
zone from appendix A and testing the example responses from appendix B.
|
||||
Additional tests can be added as well.
|
||||
|
||||
# Response section data is taken directly from RFC5155
|
||||
# It has been modified slightly; it has been 'flattened' (i.e. converted
|
||||
# to 1-line RRs with TTL and class data), and whitespace has been added
|
||||
# in the places where dig adds them too.
|
||||
# Any other changes from the specific example data are added as inline
|
||||
# comments.
|
||||
|
||||
Scenario: B.1. Name Error
|
||||
Given I have bind10 running with configuration nsec3/nsec3_auth.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A dnssec query for a.c.x.w.example. should have rcode NXDOMAIN
|
||||
The last query response should have flags qr aa
|
||||
The last query response should have edns_flags do
|
||||
The last query response should have ancount 0
|
||||
The last query response should have nscount 8
|
||||
The last query response should have adcount 1
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example. 3600 IN SOA ns1.example. bugs.x.w.example. 1 3600 300 3600000 3600
|
||||
example. 3600 IN RRSIG SOA 7 1 3600 20150420235959 20051021000000 40430 example. Hu25UIyNPmvPIVBrldN+9Mlp9Zql39qaUd8iq4ZLlYWfUUbbAS41pG+6 8z81q1xhkYAcEyHdVI2LmKusbZsT0Q==
|
||||
0p9mhaveqvm6t7vbl5lop2u3t2rp3tom.example. 3600 IN NSEC3 1 1 12 aabbccdd 2t7b4g4vsa5smi47k61mv5bv1a22bojr NS SOA MX RRSIG DNSKEY NSEC3PARAM
|
||||
0p9mhaveqvm6t7vbl5lop2u3t2rp3tom.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. OSgWSm26B+cS+dDL8b5QrWr/dEWhtCsKlwKLIBHYH6blRxK9rC0bMJPw Q4mLIuw85H2EY762BOCXJZMnpuwhpA==
|
||||
b4um86eghhds6nea196smvmlo4ors995.example. 3600 IN NSEC3 1 1 12 aabbccdd gjeqe526plbf1g8mklp59enfd789njgi MX RRSIG
|
||||
b4um86eghhds6nea196smvmlo4ors995.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. ZkPG3M32lmoHM6pa3D6gZFGB/rhL//Bs3Omh5u4m/CUiwtblEVOaAKKZ d7S959OeiX43aLX3pOv0TSTyiTxIZg==
|
||||
35mthgpgcu1qg68fab165klnsnk3dpvl.example. 3600 IN NSEC3 1 1 12 aabbccdd b4um86eghhds6nea196smvmlo4ors995 NS DS RRSIG
|
||||
35mthgpgcu1qg68fab165klnsnk3dpvl.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. g6jPUUpduAJKRljUsN8gB4UagAX0NxY9shwQAynzo8EUWH+z6hEIBlUT PGj15eZll6VhQqgZXtAIR3chwgW+SA==
|
||||
"""
|
||||
|
||||
Scenario: B.2. No Data Error
|
||||
Given I have bind10 running with configuration nsec3/nsec3_auth.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A dnssec query for ns1.example. type MX should have rcode NOERROR
|
||||
The last query response should have flags qr aa
|
||||
The last query response should have edns_flags do
|
||||
The last query response should have ancount 0
|
||||
The last query response should have nscount 4
|
||||
The last query response should have adcount 1
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example. 3600 IN SOA ns1.example. bugs.x.w.example. 1 3600 300 3600000 3600
|
||||
example. 3600 IN RRSIG SOA 7 1 3600 20150420235959 20051021000000 40430 example. Hu25UIyNPmvPIVBrldN+9Mlp9Zql39qaUd8iq4ZLlYWfUUbbAS41pG+6 8z81q1xhkYAcEyHdVI2LmKusbZsT0Q==
|
||||
2t7b4g4vsa5smi47k61mv5bv1a22bojr.example. 3600 IN NSEC3 1 1 12 aabbccdd 2vptu5timamqttgl4luu9kg21e0aor3s A RRSIG
|
||||
2t7b4g4vsa5smi47k61mv5bv1a22bojr.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. OmBvJ1Vgg1hCKMXHFiNeIYHK9XVW0iLDLwJN4TFoNxZuP03gAXEI634Y wOc4YBNITrj413iqNI6mRk/r1dOSUw==
|
||||
"""
|
||||
|
||||
Scenario: B2.1. No Data Error, Empty Non-Terminal
|
||||
Given I have bind10 running with configuration nsec3/nsec3_auth.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A dnssec query for y.w.example. should have rcode NOERROR
|
||||
The last query response should have flags qr aa
|
||||
The last query response should have edns_flags do
|
||||
The last query response should have ancount 0
|
||||
The last query response should have nscount 4
|
||||
The last query response should have adcount 1
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example. 3600 IN SOA ns1.example. bugs.x.w.example. 1 3600 300 3600000 3600
|
||||
example. 3600 IN RRSIG SOA 7 1 3600 20150420235959 20051021000000 40430 example. Hu25UIyNPmvPIVBrldN+9Mlp9Zql39qaUd8iq4ZLlYWfUUbbAS41pG+6 8z81q1xhkYAcEyHdVI2LmKusbZsT0Q==
|
||||
ji6neoaepv8b5o6k4ev33abha8ht9fgc.example. 3600 IN NSEC3 1 1 12 aabbccdd k8udemvp1j2f7eg6jebps17vp3n8i58h
|
||||
ji6neoaepv8b5o6k4ev33abha8ht9fgc.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. gPkFp1s2QDQ6wQzcg1uSebZ61W33rUBDcTj72F3kQ490fEdp7k1BUIfb cZtPbX3YCpE+sIt0MpzVSKfTwx4uYA==
|
||||
"""
|
||||
|
||||
Scenario: B.3. Referral to an Opt-Out Unsigned Zone
|
||||
Given I have bind10 running with configuration nsec3/nsec3_auth.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A dnssec query for mc.c.example. type MX should have rcode NOERROR
|
||||
The last query response should have flags qr
|
||||
The last query response should have edns_flags do
|
||||
The last query response should have ancount 0
|
||||
The last query response should have nscount 6
|
||||
The last query response should have adcount 3
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
c.example. 3600 IN NS ns1.c.example.
|
||||
c.example. 3600 IN NS ns2.c.example.
|
||||
35mthgpgcu1qg68fab165klnsnk3dpvl.example. 3600 IN NSEC3 1 1 12 aabbccdd b4um86eghhds6nea196smvmlo4ors995 NS DS RRSIG
|
||||
35mthgpgcu1qg68fab165klnsnk3dpvl.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. g6jPUUpduAJKRljUsN8gB4UagAX0NxY9shwQAynzo8EUWH+z6hEIBlUT PGj15eZll6VhQqgZXtAIR3chwgW+SA==
|
||||
0p9mhaveqvm6t7vbl5lop2u3t2rp3tom.example. 3600 IN NSEC3 1 1 12 aabbccdd 2t7b4g4vsa5smi47k61mv5bv1a22bojr NS SOA MX RRSIG DNSKEY NSEC3PARAM
|
||||
0p9mhaveqvm6t7vbl5lop2u3t2rp3tom.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. OSgWSm26B+cS+dDL8b5QrWr/dEWhtCsKlwKLIBHYH6blRxK9rC0bMJPw Q4mLIuw85H2EY762BOCXJZMnpuwhpA==
|
||||
"""
|
||||
The additional section of the last query response should be
|
||||
"""
|
||||
ns1.c.example. 3600 IN A 192.0.2.7
|
||||
ns2.c.example. 3600 IN A 192.0.2.8
|
||||
"""
|
||||
|
||||
Scenario: B.4. Wildcard Expansion
|
||||
Given I have bind10 running with configuration nsec3/nsec3_auth.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A dnssec query for a.z.w.example. type MX should have rcode NOERROR
|
||||
The last query response should have flags qr aa
|
||||
The last query response should have edns_flags do
|
||||
The last query response should have ancount 2
|
||||
The last query response should have nscount 5
|
||||
The last query response should have adcount 9
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
a.z.w.example. 3600 IN MX 1 ai.example.
|
||||
a.z.w.example. 3600 IN RRSIG MX 7 2 3600 20150420235959 20051021000000 40430 example. CikebjQwGQPwijVcxgcZcSJKtfynugtlBiKb9FcBTrmOoyQ4InoWVudh CWsh/URX3lc4WRUMivEBP6+4KS3ldA==
|
||||
"""
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example. 3600 IN NS ns1.example.
|
||||
example. 3600 IN NS ns2.example.
|
||||
example. 3600 IN RRSIG NS 7 1 3600 20150420235959 20051021000000 40430 example. PVOgtMK1HHeSTau+HwDWC8Ts+6C8qtqd4pQJqOtdEVgg+MA+ai4fWDEh u3qHJyLcQ9tbD2vvCnMXjtz6SyObxA==
|
||||
q04jkcevqvmu85r014c7dkba38o0ji5r.example. 3600 IN NSEC3 1 1 12 aabbccdd r53bq7cc2uvmubfu5ocmm6pers9tk9en A RRSIG
|
||||
q04jkcevqvmu85r014c7dkba38o0ji5r.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. hV5I89b+4FHJDATp09g4bbN0R1F845CaXpL3ZxlMKimoPAyqletMlEWw LfFia7sdpSzn+ZlNNlkxWcLsIlMmUg==
|
||||
"""
|
||||
# This is slightly different from the example in RFC5155; there are
|
||||
# more RRs in the additional section.
|
||||
The additional section of the last query response should be
|
||||
"""
|
||||
ai.example. 3600 IN A 192.0.2.9
|
||||
ai.example. 3600 IN AAAA 2001:db8::f00:baa9
|
||||
ns1.example. 3600 IN A 192.0.2.1
|
||||
ns2.example. 3600 IN A 192.0.2.2
|
||||
ai.example. 3600 IN RRSIG A 7 2 3600 20150420235959 20051021000000 40430 example. hVe+wKYMlObTRPhX0NL67GxeZfdxqr/QeR6FtfdAj5+FgYxyzPEjIzvK Wy00hWIl6wD3Vws+rznEn8sQ64UdqA==
|
||||
ai.example. 3600 IN RRSIG AAAA 7 2 3600 20150420235959 20051021000000 40430 example. LcdxKaCB5bGZwPDg+3JJ4O02zoMBrjxqlf6WuaHQZZfTUpb9Nf2nxFGe 2XRPfR5tpJT6GdRGcHueLuXkMjBArQ==
|
||||
ns1.example. 3600 IN RRSIG A 7 2 3600 20150420235959 20051021000000 40430 example. bu6kx73n6XEunoVGuRfAgY7EF/AJqHy7hj0jkiqJjB0dOrx3wuz9SaBe GfqWIdn/uta3SavN4FRvZR9SCFHF5Q==
|
||||
ns2.example. 3600 IN RRSIG A 7 2 3600 20150420235959 20051021000000 40430 example. ktQ3TqE0CfRfki0Rb/Ip5BM0VnxelbuejCC4zpLbFKA/7eD7UNAwxMgx JPtbdST+syjYSJaj4IHfeX6n8vfoGA==
|
||||
"""
|
||||
|
||||
Scenario: B.5. Wildcard No Data Error
|
||||
Given I have bind10 running with configuration nsec3/nsec3_auth.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A dnssec query for a.z.w.example. type AAAA should have rcode NOERROR
|
||||
The last query response should have flags qr aa
|
||||
The last query response should have edns_flags do
|
||||
The last query response should have ancount 0
|
||||
The last query response should have nscount 8
|
||||
The last query response should have adcount 1
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example. 3600 IN SOA ns1.example. bugs.x.w.example. 1 3600 300 3600000 3600
|
||||
example. 3600 IN RRSIG SOA 7 1 3600 20150420235959 20051021000000 40430 example. Hu25UIyNPmvPIVBrldN+9Mlp9Zql39qaUd8iq4ZLlYWfUUbbAS41pG+6 8z81q1xhkYAcEyHdVI2LmKusbZsT0Q==
|
||||
k8udemvp1j2f7eg6jebps17vp3n8i58h.example. 3600 IN NSEC3 1 1 12 aabbccdd kohar7mbb8dc2ce8a9qvl8hon4k53uhi
|
||||
k8udemvp1j2f7eg6jebps17vp3n8i58h.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. FtXGbvF0+wf8iWkyo73enAuVx03klN+pILBKS6qCcftVtfH4yVzsEZqu J27NHR7ruxJWDNMtOtx7w9WfcIg62A==
|
||||
q04jkcevqvmu85r014c7dkba38o0ji5r.example. 3600 IN NSEC3 1 1 12 aabbccdd r53bq7cc2uvmubfu5ocmm6pers9tk9en A RRSIG
|
||||
q04jkcevqvmu85r014c7dkba38o0ji5r.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. hV5I89b+4FHJDATp09g4bbN0R1F845CaXpL3ZxlMKimoPAyqletMlEWw LfFia7sdpSzn+ZlNNlkxWcLsIlMmUg==
|
||||
r53bq7cc2uvmubfu5ocmm6pers9tk9en.example. 3600 IN NSEC3 1 1 12 aabbccdd t644ebqk9bibcna874givr6joj62mlhv MX RRSIG
|
||||
r53bq7cc2uvmubfu5ocmm6pers9tk9en.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. aupviViruXs4bDg9rCbezzBMf9h1ZlDvbW/CZFKulIGXXLj8B/fsDJar XVDA9bnUoRhEbKp+HF1FWKW7RIJdtQ==
|
||||
"""
|
||||
|
||||
Scenario: B.6. DS Child Zone No Data Error
|
||||
Given I have bind10 running with configuration nsec3/nsec3_auth.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A dnssec query for example. type DS should have rcode NOERROR
|
||||
The last query response should have flags qr aa
|
||||
The last query response should have edns_flags do
|
||||
The last query response should have ancount 0
|
||||
The last query response should have nscount 4
|
||||
The last query response should have adcount 1
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example. 3600 IN SOA ns1.example. bugs.x.w.example. 1 3600 300 3600000 3600
|
||||
example. 3600 IN RRSIG SOA 7 1 3600 20150420235959 20051021000000 40430 example. Hu25UIyNPmvPIVBrldN+9Mlp9Zql39qaUd8iq4ZLlYWfUUbbAS41pG+6 8z81q1xhkYAcEyHdVI2LmKusbZsT0Q==
|
||||
0p9mhaveqvm6t7vbl5lop2u3t2rp3tom.example. 3600 IN NSEC3 1 1 12 aabbccdd 2t7b4g4vsa5smi47k61mv5bv1a22bojr NS SOA MX RRSIG DNSKEY NSEC3PARAM
|
||||
0p9mhaveqvm6t7vbl5lop2u3t2rp3tom.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. OSgWSm26B+cS+dDL8b5QrWr/dEWhtCsKlwKLIBHYH6blRxK9rC0bMJPw Q4mLIuw85H2EY762BOCXJZMnpuwhpA==
|
||||
"""
|
||||
|
||||
#
|
||||
# Below are additional tests, not explicitly stated in RFC5155
|
||||
#
|
||||
|
||||
Scenario: 7.2.2 other; Name Error where one NSEC3 covers multiple parts of proof (closest encloser)
|
||||
Given I have bind10 running with configuration nsec3/nsec3_auth.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A dnssec query for b.x.w.example. should have rcode NXDOMAIN
|
||||
The last query response should have flags qr aa
|
||||
The last query response should have edns_flags do
|
||||
The last query response should have ancount 0
|
||||
The last query response should have nscount 6
|
||||
The last query response should have adcount 1
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example. 3600 IN SOA ns1.example. bugs.x.w.example. 1 3600 300 3600000 3600
|
||||
example. 3600 IN RRSIG SOA 7 1 3600 20150420235959 20051021000000 40430 example. Hu25UIyNPmvPIVBrldN+9Mlp9Zql39qaUd8iq4ZLlYWfUUbbAS41pG+6 8z81q1xhkYAcEyHdVI2LmKusbZsT0Q==
|
||||
b4um86eghhds6nea196smvmlo4ors995.example. 3600 IN NSEC3 1 1 12 aabbccdd gjeqe526plbf1g8mklp59enfd789njgi MX RRSIG
|
||||
b4um86eghhds6nea196smvmlo4ors995.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. ZkPG3M32lmoHM6pa3D6gZFGB/rhL//Bs3Omh5u4m/CUiwtblEVOaAKKZ d7S959OeiX43aLX3pOv0TSTyiTxIZg==
|
||||
35mthgpgcu1qg68fab165klnsnk3dpvl.example. 3600 IN NSEC3 1 1 12 aabbccdd b4um86eghhds6nea196smvmlo4ors995 NS DS RRSIG
|
||||
35mthgpgcu1qg68fab165klnsnk3dpvl.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. g6jPUUpduAJKRljUsN8gB4UagAX0NxY9shwQAynzo8EUWH+z6hEIBlUT PGj15eZll6VhQqgZXtAIR3chwgW+SA==
|
||||
"""
|
||||
|
||||
Scenario: 7.2.2 other; Name Error where one NSEC3 covers multiple parts of proof (wildcard)
|
||||
Given I have bind10 running with configuration nsec3/nsec3_auth.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A dnssec query for a.w.example. should have rcode NOERROR
|
||||
The last query response should have flags qr aa
|
||||
The last query response should have edns_flags do
|
||||
The last query response should have ancount 0
|
||||
The last query response should have nscount 6
|
||||
The last query response should have adcount 1
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example. 3600 IN SOA ns1.example. bugs.x.w.example. 1 3600 300 3600000 3600
|
||||
example. 3600 IN RRSIG SOA 7 1 3600 20150420235959 20051021000000 40430 example. Hu25UIyNPmvPIVBrldN+9Mlp9Zql39qaUd8iq4ZLlYWfUUbbAS41pG+6 8z81q1xhkYAcEyHdVI2LmKusbZsT0Q==
|
||||
k8udemvp1j2f7eg6jebps17vp3n8i58h.example. 3600 IN NSEC3 1 1 12 AABBCCDD KOHAR7MBB8DC2CE8A9QVL8HON4K53UHI
|
||||
k8udemvp1j2f7eg6jebps17vp3n8i58h.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. FtXGbvF0+wf8iWkyo73enAuVx03klN+pILBKS6qCcftVtfH4yVzsEZqu J27NHR7ruxJWDNMtOtx7w9WfcIg62A==
|
||||
r53bq7cc2uvmubfu5ocmm6pers9tk9en.example. 3600 IN NSEC3 1 1 12 AABBCCDD T644EBQK9BIBCNA874GIVR6JOJ62MLHV MX RRSIG
|
||||
r53bq7cc2uvmubfu5ocmm6pers9tk9en.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. aupviViruXs4bDg9rCbezzBMf9h1ZlDvbW/CZFKulIGXXLj8B/fsDJar XVDA9bnUoRhEbKp+HF1FWKW7RIJdtQ==
|
||||
"""
|
||||
|
||||
Scenario: Wildcard other: Wildcard name itself
|
||||
Given I have bind10 running with configuration nsec3/nsec3_auth.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A dnssec query for *.w.example. type MX should have rcode NOERROR
|
||||
The last query response should have flags qr aa
|
||||
The last query response should have edns_flags do
|
||||
The last query response should have ancount 2
|
||||
The last query response should have nscount 3
|
||||
The last query response should have adcount 9
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
*.w.example. 3600 IN MX 1 ai.example.
|
||||
*.w.example. 3600 IN RRSIG MX 7 2 3600 20150420235959 20051021000000 40430 example. CikebjQwGQPwijVcxgcZcSJKtfynugtlBiKb9FcBTrmOoyQ4InoWVudh CWsh/URX3lc4WRUMivEBP6+4KS3ldA==
|
||||
"""
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example. 3600 IN NS ns1.example.
|
||||
example. 3600 IN NS ns2.example.
|
||||
example. 3600 IN RRSIG NS 7 1 3600 20150420235959 20051021000000 40430 example. PVOgtMK1HHeSTau+HwDWC8Ts+6C8qtqd4pQJqOtdEVgg+MA+ai4fWDEh u3qHJyLcQ9tbD2vvCnMXjtz6SyObxA==
|
||||
"""
|
||||
The additional section of the last query response should be
|
||||
"""
|
||||
ai.example. 3600 IN A 192.0.2.9
|
||||
ai.example. 3600 IN AAAA 2001:db8::f00:baa9
|
||||
ns1.example. 3600 IN A 192.0.2.1
|
||||
ns2.example. 3600 IN A 192.0.2.2
|
||||
ai.example. 3600 IN RRSIG A 7 2 3600 20150420235959 20051021000000 40430 example. hVe+wKYMlObTRPhX0NL67GxeZfdxqr/QeR6FtfdAj5+FgYxyzPEjIzvK Wy00hWIl6wD3Vws+rznEn8sQ64UdqA==
|
||||
ai.example. 3600 IN RRSIG AAAA 7 2 3600 20150420235959 20051021000000 40430 example. LcdxKaCB5bGZwPDg+3JJ4O02zoMBrjxqlf6WuaHQZZfTUpb9Nf2nxFGe 2XRPfR5tpJT6GdRGcHueLuXkMjBArQ==
|
||||
ns1.example. 3600 IN RRSIG A 7 2 3600 20150420235959 20051021000000 40430 example. bu6kx73n6XEunoVGuRfAgY7EF/AJqHy7hj0jkiqJjB0dOrx3wuz9SaBe GfqWIdn/uta3SavN4FRvZR9SCFHF5Q==
|
||||
ns2.example. 3600 IN RRSIG A 7 2 3600 20150420235959 20051021000000 40430 example. ktQ3TqE0CfRfki0Rb/Ip5BM0VnxelbuejCC4zpLbFKA/7eD7UNAwxMgx JPtbdST+syjYSJaj4IHfeX6n8vfoGA==
|
||||
"""
|
||||
|
||||
Scenario: Wildcard other: Wildcard name itself nodata
|
||||
Given I have bind10 running with configuration nsec3/nsec3_auth.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A dnssec query for *.w.example. type A should have rcode NOERROR
|
||||
The last query response should have flags qr aa
|
||||
The last query response should have edns_flags do
|
||||
The last query response should have ancount 0
|
||||
The last query response should have nscount 4
|
||||
The last query response should have adcount 1
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example. 3600 IN SOA ns1.example. bugs.x.w.example. 1 3600 300 3600000 3600
|
||||
example. 3600 IN RRSIG SOA 7 1 3600 20150420235959 20051021000000 40430 example. Hu25UIyNPmvPIVBrldN+9Mlp9Zql39qaUd8iq4ZLlYWfUUbbAS41pG+6 8z81q1xhkYAcEyHdVI2LmKusbZsT0Q==
|
||||
r53bq7cc2uvmubfu5ocmm6pers9tk9en.example. 3600 IN NSEC3 1 1 12 AABBCCDD T644EBQK9BIBCNA874GIVR6JOJ62MLHV MX RRSIG
|
||||
r53bq7cc2uvmubfu5ocmm6pers9tk9en.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. aupviViruXs4bDg9rCbezzBMf9h1ZlDvbW/CZFKulIGXXLj8B/fsDJar XVDA9bnUoRhEbKp+HF1FWKW7RIJdtQ==
|
||||
"""
|
||||
|
||||
Scenario: Direct query for NSEC3 record
|
||||
Given I have bind10 running with configuration nsec3/nsec3_auth.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A dnssec query for 0p9mhaveqvm6t7vbl5lop2u3t2rp3tom.example. type NSEC3 should have rcode NXDOMAIN
|
||||
The last query response should have flags qr aa
|
||||
The last query response should have edns_flags do
|
||||
The last query response should have ancount 0
|
||||
The last query response should have nscount 8
|
||||
The last query response should have adcount 1
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example. 3600 IN SOA ns1.example. bugs.x.w.example. 1 3600 300 3600000 3600
|
||||
example. 3600 IN RRSIG SOA 7 1 3600 20150420235959 20051021000000 40430 example. Hu25UIyNPmvPIVBrldN+9Mlp9Zql39qaUd8iq4ZLlYWfUUbbAS41pG+6 8z81q1xhkYAcEyHdVI2LmKusbZsT0Q==
|
||||
0p9mhaveqvm6t7vbl5lop2u3t2rp3tom.example. 3600 IN NSEC3 1 1 12 AABBCCDD 2T7B4G4VSA5SMI47K61MV5BV1A22BOJR NS SOA MX RRSIG DNSKEY NSEC3PARAM
|
||||
0p9mhaveqvm6t7vbl5lop2u3t2rp3tom.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. OSgWSm26B+cS+dDL8b5QrWr/dEWhtCsKlwKLIBHYH6blRxK9rC0bMJPw Q4mLIuw85H2EY762BOCXJZMnpuwhpA==
|
||||
q04jkcevqvmu85r014c7dkba38o0ji5r.example. 3600 IN NSEC3 1 1 12 AABBCCDD R53BQ7CC2UVMUBFU5OCMM6PERS9TK9EN A RRSIG
|
||||
q04jkcevqvmu85r014c7dkba38o0ji5r.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. hV5I89b+4FHJDATp09g4bbN0R1F845CaXpL3ZxlMKimoPAyqletMlEWw LfFia7sdpSzn+ZlNNlkxWcLsIlMmUg==
|
||||
gjeqe526plbf1g8mklp59enfd789njgi.example. 3600 IN NSEC3 1 1 12 AABBCCDD JI6NEOAEPV8B5O6K4EV33ABHA8HT9FGC A HINFO AAAA RRSIG
|
||||
gjeqe526plbf1g8mklp59enfd789njgi.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. IVnezTJ9iqblFF97vPSmfXZ5Zozngx3KX3byLTZC4QBH2dFWhf6scrGF ZB980AfCxoD9qbbKDy+rdGIeRSVNyw==
|
||||
"""
|
||||
|
||||
Scenario: No data, type DS, in-zone
|
||||
Given I have bind10 running with configuration nsec3/nsec3_auth.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A dnssec query for ai.example. type DS should have rcode NOERROR
|
||||
The last query response should have flags qr aa
|
||||
The last query response should have edns_flags do
|
||||
The last query response should have ancount 0
|
||||
The last query response should have nscount 4
|
||||
The last query response should have adcount 1
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example. 3600 IN SOA ns1.example. bugs.x.w.example. 1 3600 300 3600000 3600
|
||||
example. 3600 IN RRSIG SOA 7 1 3600 20150420235959 20051021000000 40430 example. Hu25UIyNPmvPIVBrldN+9Mlp9Zql39qaUd8iq4ZLlYWfUUbbAS41pG+6 8z81q1xhkYAcEyHdVI2LmKusbZsT0Q==
|
||||
gjeqe526plbf1g8mklp59enfd789njgi.example. 3600 IN NSEC3 1 1 12 AABBCCDD JI6NEOAEPV8B5O6K4EV33ABHA8HT9FGC A HINFO AAAA RRSIG
|
||||
gjeqe526plbf1g8mklp59enfd789njgi.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. IVnezTJ9iqblFF97vPSmfXZ5Zozngx3KX3byLTZC4QBH2dFWhf6scrGF ZB980AfCxoD9qbbKDy+rdGIeRSVNyw==
|
||||
"""
|
||||
|
||||
Scenario: No data, type DS, optout delegation
|
||||
Given I have bind10 running with configuration nsec3/nsec3_auth.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A dnssec query for c.example. type DS should have rcode NOERROR
|
||||
The last query response should have flags qr aa
|
||||
The last query response should have edns_flags do
|
||||
The last query response should have ancount 0
|
||||
The last query response should have nscount 6
|
||||
The last query response should have adcount 1
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example. 3600 IN SOA ns1.example. bugs.x.w.example. 1 3600 300 3600000 3600
|
||||
example. 3600 IN RRSIG SOA 7 1 3600 20150420235959 20051021000000 40430 example. Hu25UIyNPmvPIVBrldN+9Mlp9Zql39qaUd8iq4ZLlYWfUUbbAS41pG+6 8z81q1xhkYAcEyHdVI2LmKusbZsT0Q==
|
||||
0p9mhaveqvm6t7vbl5lop2u3t2rp3tom.example. 3600 IN NSEC3 1 1 12 AABBCCDD 2T7B4G4VSA5SMI47K61MV5BV1A22BOJR NS SOA MX RRSIG DNSKEY NSEC3PARAM
|
||||
0p9mhaveqvm6t7vbl5lop2u3t2rp3tom.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. OSgWSm26B+cS+dDL8b5QrWr/dEWhtCsKlwKLIBHYH6blRxK9rC0bMJPw Q4mLIuw85H2EY762BOCXJZMnpuwhpA==
|
||||
35mthgpgcu1qg68fab165klnsnk3dpvl.example. 3600 IN NSEC3 1 1 12 AABBCCDD B4UM86EGHHDS6NEA196SMVMLO4ORS995 NS DS RRSIG
|
||||
35mthgpgcu1qg68fab165klnsnk3dpvl.example. 3600 IN RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 40430 example. g6jPUUpduAJKRljUsN8gB4UagAX0NxY9shwQAynzo8EUWH+z6hEIBlUT PGj15eZll6VhQqgZXtAIR3chwgW+SA==
|
||||
"""
|
@@ -1,494 +0,0 @@
|
||||
Feature: Querying feature
|
||||
This feature is a collection of non-specific querying tests;
|
||||
for instance whether multiple queries in a row return consistent
|
||||
answers.
|
||||
|
||||
Scenario: Glue
|
||||
# Check the auth server returns the correct glue when asked for it.
|
||||
Given I have bind10 running with configuration glue.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
# This query should result in a delegation with two NS; one in the
|
||||
# delegated zone and one in a so called out-of-bailiwick zone for which
|
||||
# the auth server has authority, too. For the former, the server
|
||||
# should return glue in the parent zone. For the latter, BIND 9 and
|
||||
# BIND 10 behave differently; BIND 9 uses "glue" in the parent zone
|
||||
# (since this is the root zone everything can be considered a valid
|
||||
# glue). BIND 10 (using sqlite3 data source) searches the other zone
|
||||
# and uses the authoritative data in that zone (which is intentionally
|
||||
# different from the glue in the root zone).
|
||||
A query for foo.bar.example type A should have rcode NOERROR
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
"""
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example. 172800 IN NS NS1.example.COM.
|
||||
example. 172800 IN NS NS.example.
|
||||
"""
|
||||
The additional section of the last query response should be
|
||||
"""
|
||||
NS.example. 172800 IN A 192.0.2.1
|
||||
NS.example. 172800 IN A 192.0.2.2
|
||||
NS1.example.COM. 172800 IN A 192.0.2.3
|
||||
"""
|
||||
# Test we don't get out-of-zone glue
|
||||
A query for example.net type A should have rcode NOERROR
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
"""
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example.net. 300 IN NS ns2.example.info.
|
||||
example.net. 300 IN NS ns1.example.info.
|
||||
"""
|
||||
The additional section of the last query response should be
|
||||
"""
|
||||
"""
|
||||
|
||||
Scenario: Repeated queries
|
||||
Given I have bind10 running with configuration example.org.inmem.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
# DATASRC_LIBRARY_ERROR must be generated due to
|
||||
# "broken_libraries_should_be_skipped" in
|
||||
# example.org.inmem.config
|
||||
And wait for bind10 stderr message DATASRC_LIBRARY_ERROR
|
||||
|
||||
And wait for bind10 stderr message STATS_STARTING
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Stats should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
When I wait for new bind10 stderr message STATS_SEND_STATISTICS_REQUEST
|
||||
# make sure Auth module receives a command
|
||||
And wait for new bind10 stderr message AUTH_RECEIVED_COMMAND
|
||||
# make sure Auth module replied to the command
|
||||
And wait for new bind10 stderr message CC_REPLY
|
||||
# make sure the response is for 'getstats'
|
||||
And wait for new bind10 stderr message v4
|
||||
Then I query statistics zones of bind10 module Auth
|
||||
And last bindctl output should not contain "error"
|
||||
The statistics counters are 0 in category .Auth.zones._SERVER_
|
||||
|
||||
A query for www.example.org should have rcode NOERROR
|
||||
The last query response should have flags qr aa
|
||||
The last query response should have ancount 1
|
||||
The last query response should have nscount 2
|
||||
The last query response should have adcount 2
|
||||
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
www.example.org. 3600 IN A 192.0.2.1
|
||||
"""
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example.org. 3600 IN NS ns1.example.org.
|
||||
example.org. 3600 IN NS ns2.example.org.
|
||||
"""
|
||||
The additional section of the last query response should be
|
||||
"""
|
||||
ns1.example.org. 3600 IN A 192.0.2.3
|
||||
ns2.example.org. 3600 IN A 192.0.2.4
|
||||
"""
|
||||
|
||||
# Make sure handling statistics command handling checked below is
|
||||
# after this query
|
||||
And wait for bind10 stderr message AUTH_SEND_NORMAL_RESPONSE
|
||||
|
||||
When I wait for new bind10 stderr message STATS_SEND_STATISTICS_REQUEST
|
||||
# make sure Auth module receives a command
|
||||
And wait for new bind10 stderr message AUTH_RECEIVED_COMMAND
|
||||
# make sure Auth module replied to the command
|
||||
And wait for new bind10 stderr message CC_REPLY
|
||||
# make sure the response is for 'getstats'
|
||||
And wait for new bind10 stderr message v4
|
||||
Then I query statistics zones of bind10 module Auth
|
||||
And last bindctl output should not contain "error"
|
||||
The statistics counters are 0 in category .Auth.zones._SERVER_ except for the following items
|
||||
| item_name | item_value |
|
||||
| request.v4 | 1 |
|
||||
| request.udp | 1 |
|
||||
| opcode.query | 1 |
|
||||
| responses | 1 |
|
||||
| qrysuccess | 1 |
|
||||
| qryauthans | 1 |
|
||||
| rcode.noerror | 1 |
|
||||
|
||||
|
||||
# Repeat of the above
|
||||
A query for www.example.org should have rcode NOERROR
|
||||
The last query response should have flags qr aa
|
||||
The last query response should have ancount 1
|
||||
The last query response should have nscount 2
|
||||
The last query response should have adcount 2
|
||||
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
www.example.org. 3600 IN A 192.0.2.1
|
||||
"""
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example.org. 3600 IN NS ns1.example.org.
|
||||
example.org. 3600 IN NS ns2.example.org.
|
||||
"""
|
||||
The additional section of the last query response should be
|
||||
"""
|
||||
ns1.example.org. 3600 IN A 192.0.2.3
|
||||
ns2.example.org. 3600 IN A 192.0.2.4
|
||||
"""
|
||||
|
||||
# Make sure handling statistics command handling checked below is
|
||||
# after this query
|
||||
And wait for new bind10 stderr message AUTH_SEND_NORMAL_RESPONSE
|
||||
|
||||
When I wait for new bind10 stderr message STATS_SEND_STATISTICS_REQUEST
|
||||
# make sure Auth module receives a command
|
||||
And wait for new bind10 stderr message AUTH_RECEIVED_COMMAND
|
||||
# make sure Auth module replied to the command
|
||||
And wait for new bind10 stderr message CC_REPLY
|
||||
# make sure the response is for 'getstats'
|
||||
And wait for new bind10 stderr message v4
|
||||
Then I query statistics zones of bind10 module Auth
|
||||
And last bindctl output should not contain "error"
|
||||
The statistics counters are 0 in category .Auth.zones._SERVER_ except for the following items
|
||||
| item_name | item_value |
|
||||
| request.v4 | 2 |
|
||||
| request.udp | 2 |
|
||||
| opcode.query | 2 |
|
||||
| responses | 2 |
|
||||
| qrysuccess | 2 |
|
||||
| qryauthans | 2 |
|
||||
| rcode.noerror | 2 |
|
||||
|
||||
# And now query something completely different
|
||||
A recursive query for nosuchname.example.org should have rcode NXDOMAIN
|
||||
The last query response should have flags qr aa rd
|
||||
The last query response should have ancount 0
|
||||
The last query response should have nscount 1
|
||||
The last query response should have adcount 0
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
example.org. 3600 IN SOA ns1.example.org. admin.example.org. 1234 3600 1800 2419200 7200
|
||||
"""
|
||||
|
||||
# Make sure handling statistics command handling checked below is
|
||||
# after this query
|
||||
And wait for new bind10 stderr message AUTH_SEND_NORMAL_RESPONSE
|
||||
|
||||
When I wait for new bind10 stderr message STATS_SEND_STATISTICS_REQUEST
|
||||
# make sure Auth module receives a command
|
||||
And wait for new bind10 stderr message AUTH_RECEIVED_COMMAND
|
||||
# make sure Auth module replied to the command
|
||||
And wait for new bind10 stderr message CC_REPLY
|
||||
# make sure the response is for 'getstats'
|
||||
And wait for new bind10 stderr message v4
|
||||
Then I query statistics zones of bind10 module Auth
|
||||
And last bindctl output should not contain "error"
|
||||
The statistics counters are 0 in category .Auth.zones._SERVER_ except for the following items
|
||||
| item_name | item_value |
|
||||
| request.v4 | 3 |
|
||||
| request.udp | 3 |
|
||||
| opcode.query | 3 |
|
||||
| responses | 3 |
|
||||
| qrysuccess | 2 |
|
||||
| qryauthans | 3 |
|
||||
| qryrecursion | 1 |
|
||||
| rcode.noerror | 2 |
|
||||
| rcode.nxdomain | 1 |
|
||||
|
||||
Scenario: ANY query
|
||||
Given I have bind10 running with configuration example.org.inmem.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Stats should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
When I wait for new bind10 stderr message STATS_SEND_STATISTICS_REQUEST
|
||||
# make sure Auth module receives a command
|
||||
And wait for new bind10 stderr message AUTH_RECEIVED_COMMAND
|
||||
# make sure Auth module replied to the command
|
||||
And wait for new bind10 stderr message CC_REPLY
|
||||
# make sure the response is for 'getstats'
|
||||
And wait for new bind10 stderr message v4
|
||||
Then I query statistics zones of bind10 module Auth
|
||||
And last bindctl output should not contain "error"
|
||||
The statistics counters are 0 in category .Auth.zones._SERVER_
|
||||
|
||||
A query for example.org type ANY should have rcode NOERROR
|
||||
The last query response should have flags qr aa
|
||||
The last query response should have ancount 4
|
||||
The last query response should have nscount 0
|
||||
The last query response should have adcount 3
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
example.org. 3600 IN NS ns1.example.org.
|
||||
example.org. 3600 IN NS ns2.example.org.
|
||||
example.org. 3600 IN SOA ns1.example.org. admin.example.org. 1234 3600 1800 2419200 7200
|
||||
example.org. 3600 IN MX 10 mail.example.org.
|
||||
"""
|
||||
The additional section of the last query response should be
|
||||
"""
|
||||
ns1.example.org. 3600 IN A 192.0.2.3
|
||||
ns2.example.org. 3600 IN A 192.0.2.4
|
||||
mail.example.org. 3600 IN A 192.0.2.10
|
||||
"""
|
||||
|
||||
# Make sure handling statistics command handling checked below is
|
||||
# after this query
|
||||
And wait for bind10 stderr message AUTH_SEND_NORMAL_RESPONSE
|
||||
|
||||
When I wait for new bind10 stderr message STATS_SEND_STATISTICS_REQUEST
|
||||
# make sure Auth module receives a command
|
||||
And wait for new bind10 stderr message AUTH_RECEIVED_COMMAND
|
||||
# make sure Auth module replied to the command
|
||||
And wait for new bind10 stderr message CC_REPLY
|
||||
# make sure the response is for 'getstats'
|
||||
And wait for new bind10 stderr message v4
|
||||
Then I query statistics zones of bind10 module Auth
|
||||
And last bindctl output should not contain "error"
|
||||
The statistics counters are 0 in category .Auth.zones._SERVER_ except for the following items
|
||||
| item_name | item_value |
|
||||
| request.v4 | 1 |
|
||||
| request.udp | 1 |
|
||||
| opcode.query | 1 |
|
||||
| responses | 1 |
|
||||
| qrysuccess | 1 |
|
||||
| qryauthans | 1 |
|
||||
| rcode.noerror | 1 |
|
||||
|
||||
Scenario: Delegation query for unsigned child zone
|
||||
Given I have bind10 running with configuration example.org.inmem.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
When I wait for new bind10 stderr message STATS_SEND_STATISTICS_REQUEST
|
||||
# make sure Auth module receives a command
|
||||
And wait for new bind10 stderr message AUTH_RECEIVED_COMMAND
|
||||
# make sure Auth module replied to the command
|
||||
And wait for new bind10 stderr message CC_REPLY
|
||||
# make sure the response is for 'getstats'
|
||||
And wait for new bind10 stderr message v4
|
||||
Then I query statistics zones of bind10 module Auth
|
||||
And last bindctl output should not contain "error"
|
||||
The statistics counters are 0 in category .Auth.zones._SERVER_
|
||||
|
||||
A dnssec query for www.sub.example.org type AAAA should have rcode NOERROR
|
||||
The last query response should have flags qr
|
||||
The last query response should have edns_flags do
|
||||
The last query response should have ancount 0
|
||||
The last query response should have nscount 1
|
||||
The last query response should have adcount 2
|
||||
The authority section of the last query response should be
|
||||
"""
|
||||
sub.example.org. 3600 IN NS ns.sub.example.org.
|
||||
"""
|
||||
The additional section of the last query response should be
|
||||
"""
|
||||
ns.sub.example.org. 3600 IN A 192.0.2.101
|
||||
"""
|
||||
|
||||
# Make sure handling statistics command handling checked below is
|
||||
# after this query
|
||||
And wait for bind10 stderr message AUTH_SEND_NORMAL_RESPONSE
|
||||
|
||||
When I wait for new bind10 stderr message STATS_SEND_STATISTICS_REQUEST
|
||||
# make sure Auth module receives a command
|
||||
And wait for new bind10 stderr message AUTH_RECEIVED_COMMAND
|
||||
# make sure Auth module replied to the command
|
||||
And wait for new bind10 stderr message CC_REPLY
|
||||
# make sure the response is for 'getstats'
|
||||
And wait for new bind10 stderr message v4
|
||||
Then I query statistics zones of bind10 module Auth
|
||||
And last bindctl output should not contain "error"
|
||||
The statistics counters are 0 in category .Auth.zones._SERVER_ except for the following items
|
||||
| item_name | item_value |
|
||||
| request.v4 | 1 |
|
||||
| request.udp | 1 |
|
||||
| request.edns0 | 1 |
|
||||
| request.dnssec_ok | 1 |
|
||||
| opcode.query | 1 |
|
||||
| responses | 1 |
|
||||
| response.edns0 | 1 |
|
||||
| qrynoauthans | 1 |
|
||||
| qryreferral | 1 |
|
||||
| rcode.noerror | 1 |
|
||||
|
||||
Scenario: RRSIG query
|
||||
# Directly querying for RRSIGs should result in rcode=REFUSED.
|
||||
Given I have bind10 running with configuration nsec3/nsec3_auth.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A dnssec query for example. type RRSIG should have rcode REFUSED
|
||||
The last query response should have flags qr aa
|
||||
The last query response should have edns_flags do
|
||||
The last query response should have ancount 0
|
||||
The last query response should have nscount 0
|
||||
The last query response should have adcount 1
|
||||
|
||||
Scenario: SSHFP query
|
||||
# We are testing one more RR type for a normal successful case
|
||||
Given I have bind10 running with configuration example.org.inmem.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Stats should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
When I wait for new bind10 stderr message STATS_SEND_STATISTICS_REQUEST
|
||||
# make sure Auth module receives a command
|
||||
And wait for new bind10 stderr message AUTH_RECEIVED_COMMAND
|
||||
# make sure Auth module replied to the command
|
||||
And wait for new bind10 stderr message CC_REPLY
|
||||
# make sure the response is for 'getstats'
|
||||
And wait for new bind10 stderr message v4
|
||||
Then I query statistics zones of bind10 module Auth
|
||||
And last bindctl output should not contain "error"
|
||||
The statistics counters are 0 in category .Auth.zones._SERVER_
|
||||
|
||||
A query for example.org type SSHFP should have rcode NOERROR
|
||||
The last query response should have ancount 0
|
||||
|
||||
# Make sure handling statistics command handling checked below is
|
||||
# after this query
|
||||
And wait for bind10 stderr message AUTH_SEND_NORMAL_RESPONSE
|
||||
|
||||
When I wait for new bind10 stderr message STATS_SEND_STATISTICS_REQUEST
|
||||
# make sure Auth module receives a command
|
||||
And wait for new bind10 stderr message AUTH_RECEIVED_COMMAND
|
||||
# make sure Auth module replied to the command
|
||||
And wait for new bind10 stderr message CC_REPLY
|
||||
# make sure the response is for 'getstats'
|
||||
And wait for new bind10 stderr message v4
|
||||
Then I query statistics zones of bind10 module Auth
|
||||
And last bindctl output should not contain "error"
|
||||
The statistics counters are 0 in category .Auth.zones._SERVER_ except for the following items
|
||||
| item_name | item_value |
|
||||
| request.v4 | 1 |
|
||||
| request.udp | 1 |
|
||||
| opcode.query | 1 |
|
||||
| responses | 1 |
|
||||
| qryauthans | 1 |
|
||||
| qrynxrrset | 1 |
|
||||
| rcode.noerror | 1 |
|
||||
|
||||
A query for shell.example.org type SSHFP should have rcode NOERROR
|
||||
The last query response should have ancount 1
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
shell.example.org. 3600 IN SSHFP 2 1 123456789abcdef67890123456789abcdef67890
|
||||
"""
|
||||
# Make sure handling statistics command handling checked below is
|
||||
# after this query
|
||||
And wait for bind10 stderr message AUTH_SEND_NORMAL_RESPONSE
|
||||
|
||||
When I wait for new bind10 stderr message STATS_SEND_STATISTICS_REQUEST
|
||||
# make sure Auth module receives a command
|
||||
And wait for new bind10 stderr message AUTH_RECEIVED_COMMAND
|
||||
# make sure Auth module replied to the command
|
||||
And wait for new bind10 stderr message CC_REPLY
|
||||
# make sure the response is for 'getstats'
|
||||
And wait for new bind10 stderr message v4
|
||||
Then I query statistics zones of bind10 module Auth
|
||||
And last bindctl output should not contain "error"
|
||||
The statistics counters are 0 in category .Auth.zones._SERVER_ except for the following items
|
||||
| item_name | item_value |
|
||||
| request.v4 | 2 |
|
||||
| request.udp | 2 |
|
||||
| opcode.query | 2 |
|
||||
| responses | 2 |
|
||||
| qrysuccess | 1 |
|
||||
| qryauthans | 2 |
|
||||
| qrynxrrset | 1 |
|
||||
| rcode.noerror | 2 |
|
||||
|
||||
Scenario: Querying non-existing name in root zone from sqlite3 should work
|
||||
Given I have bind10 running with configuration root.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Stats should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A query for . type SOA should have rcode NOERROR
|
||||
A query for nonexistent. type A should have rcode NXDOMAIN
|
||||
Then wait for bind10 stderr message AUTH_SEND_NORMAL_RESPONSE not AUTH_PROCESS_FAIL
|
||||
|
||||
Scenario: CH class static zone query
|
||||
# We are testing one more RR type for a normal successful case
|
||||
Given I have bind10 running with configuration static.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
|
||||
bind10 module Auth should be running
|
||||
And bind10 module Stats should be running
|
||||
And bind10 module Resolver should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
A query for version.bind. type TXT class CH should have rcode REFUSED
|
||||
|
||||
When I send bind10 the following commands
|
||||
"""
|
||||
config add data_sources/classes/CH
|
||||
config set data_sources/classes/CH[0]/type MasterFiles
|
||||
config set data_sources/classes/CH[0]/cache-enable true
|
||||
config set data_sources/classes/CH[0]/params {"BIND": "data/static.zone"}
|
||||
config commit
|
||||
"""
|
||||
|
||||
And wait for new bind10 stderr message AUTH_DATASRC_CLIENTS_BUILDER_RECONFIGURE_SUCCESS
|
||||
|
||||
A query for version.bind. type TXT class CH should have rcode NOERROR
|
||||
The last query response should have ancount 1
|
||||
|
||||
# NOTE: The double double-quote characters trailing 10 in the
|
||||
# response below are required due to a lettuce bug in reading
|
||||
# multi-line strings with embedded double-quotes.
|
||||
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
version.bind. 3600 CH TXT "10""
|
||||
"""
|
@@ -1,36 +0,0 @@
|
||||
Feature: Basic Resolver
|
||||
This feature set is just testing the execution of the b10-resolver
|
||||
module. It sees whether it starts up, takes configuration, and
|
||||
answers queries.
|
||||
|
||||
Scenario: Listen for and answer query
|
||||
# This scenario starts a server that runs a real resolver.
|
||||
# In order not to send out queries into the wild, we only
|
||||
# query for something known to be hardcoded at this moment.
|
||||
# NOTE: once real priming has been implemented, this test needs
|
||||
# to be revised (as it would then leak, which is probably true
|
||||
# for any resolver system test)
|
||||
When I start bind10 with configuration resolver/resolver_basic.config
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message RESOLVER_STARTED
|
||||
|
||||
bind10 module Resolver should be running
|
||||
And bind10 module Auth should not be running
|
||||
And bind10 module Xfrout should not be running
|
||||
And bind10 module Zonemgr should not be running
|
||||
And bind10 module Xfrin should not be running
|
||||
And bind10 module Stats should not be running
|
||||
And bind10 module StatsHttpd should not be running
|
||||
|
||||
# The ACL is set to reject any queries
|
||||
A recursive query for l.root-servers.net. should have rcode REFUSED
|
||||
|
||||
# Test whether acl ACCEPT works
|
||||
When I set bind10 configuration Resolver/query_acl[0] to {"action": "ACCEPT", "from": "127.0.0.1"}
|
||||
# This address is currently hardcoded, so shouldn't cause outside traffic
|
||||
A recursive query for l.root-servers.net. should have rcode NOERROR
|
||||
|
||||
# Check whether setting the ACL to reject again works
|
||||
When I set bind10 configuration Resolver/query_acl[0] to {"action": "REJECT", "from": "127.0.0.1"}
|
||||
A recursive query for l.root-servers.net. should have rcode REFUSED
|
@@ -1,16 +0,0 @@
|
||||
Feature: b10-stats-httpd module
|
||||
Tests the stats httpd module
|
||||
|
||||
Scenario: Check that the module logs and responds to requests
|
||||
Given I have bind10 running with configuration bindctl_commands.config
|
||||
And wait for bind10 stderr message STATSHTTPD_STARTED
|
||||
|
||||
When I request the URL http://127.0.0.1:47811/
|
||||
# Should result in redirect, so two query logs
|
||||
And wait for new bind10 stderr message "GET / HTTP/1.0" 302 -
|
||||
And wait for new bind10 stderr message "GET /bind10/statistics/xml/ HTTP/1.0" 200 -
|
||||
The last http response status code should be 200
|
||||
|
||||
When I request the URL http://127.0.0.1:47811/no_such_url
|
||||
And wait for new bind10 stderr message "GET /no_such_url HTTP/1.0" 404 -
|
||||
The last http response status code should be 404
|
1
tests/lettuce/features/terrain/.gitignore
vendored
1
tests/lettuce/features/terrain/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
*.pyc
|
@@ -1,479 +0,0 @@
|
||||
# Copyright (C) 2011-2012 Internet Systems Consortium.
|
||||
#
|
||||
# Permission to use, copy, modify, and distribute this software for any
|
||||
# purpose with or without fee is hereby granted, provided that the above
|
||||
# copyright notice and this permission notice appear in all copies.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
|
||||
# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
|
||||
# INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
|
||||
# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
from lettuce import *
|
||||
import time
|
||||
import subprocess
|
||||
import re
|
||||
import json
|
||||
|
||||
@step('sleep for (\d+) seconds')
|
||||
def wait_seconds(step, seconds):
|
||||
"""Sleep for some seconds.
|
||||
Parameters:
|
||||
seconds number of seconds to sleep for.
|
||||
"""
|
||||
time.sleep(float(seconds))
|
||||
|
||||
@step('start bind10(?: with configuration (\S+))?' +\
|
||||
'(?: with cmdctl port (\d+))?' +\
|
||||
'(?: with msgq socket file (\S+))?' +\
|
||||
'(?: as (\S+))?')
|
||||
def start_bind10(step, config_file, cmdctl_port, msgq_sockfile, process_name):
|
||||
"""
|
||||
Start BIND 10 with the given optional config file, cmdctl port, and
|
||||
store the running process in world with the given process name.
|
||||
Parameters:
|
||||
config_file ('with configuration <file>', optional): this configuration
|
||||
will be used. The path is relative to the base lettuce
|
||||
directory.
|
||||
cmdctl_port ('with cmdctl port <portnr>', optional): The port on which
|
||||
b10-cmdctl listens for bindctl commands. Defaults to 56175.
|
||||
msgq_sockfile ('with msgq socket file', optional): The msgq socket file
|
||||
that will be used for internal communication
|
||||
process_name ('as <name>', optional). This is the name that can be used
|
||||
in the following steps of the scenario to refer to this
|
||||
BIND 10 instance. Defaults to 'bind10'.
|
||||
This call will block until BIND10_STARTUP_COMPLETE or BIND10_STARTUP_ERROR
|
||||
is logged. In the case of the latter, or if it times out, the step (and
|
||||
scenario) will fail.
|
||||
It will also fail if there is a running process with the given process_name
|
||||
already.
|
||||
"""
|
||||
args = [ 'bind10', '-v' ]
|
||||
if config_file is not None:
|
||||
args.append('-p')
|
||||
args.append("configurations/")
|
||||
args.append('-c')
|
||||
args.append(config_file)
|
||||
if cmdctl_port is None:
|
||||
args.append('--cmdctl-port=56175')
|
||||
else:
|
||||
args.append('--cmdctl-port=' + cmdctl_port)
|
||||
if process_name is None:
|
||||
process_name = "bind10"
|
||||
else:
|
||||
args.append('-m')
|
||||
args.append(process_name + '_msgq.socket')
|
||||
|
||||
world.processes.add_process(step, process_name, args)
|
||||
|
||||
# check output to know when startup has been completed
|
||||
(message, line) = world.processes.wait_for_stderr_str(process_name,
|
||||
["BIND10_STARTUP_COMPLETE",
|
||||
"BIND10_STARTUP_ERROR"])
|
||||
assert message == "BIND10_STARTUP_COMPLETE", "Got: " + str(line)
|
||||
|
||||
@step('wait for bind10 auth (?:of (\w+) )?to start')
|
||||
def wait_for_auth(step, process_name):
|
||||
"""Wait for b10-auth to run. This is done by blocking until the message
|
||||
AUTH_SERVER_STARTED is logged.
|
||||
Parameters:
|
||||
process_name ('of <name', optional): The name of the BIND 10 instance
|
||||
to wait for. Defaults to 'bind10'.
|
||||
"""
|
||||
if process_name is None:
|
||||
process_name = "bind10"
|
||||
world.processes.wait_for_stderr_str(process_name, ['AUTH_SERVER_STARTED'],
|
||||
False)
|
||||
|
||||
@step('wait for bind10 xfrout (?:of (\w+) )?to start')
|
||||
def wait_for_xfrout(step, process_name):
|
||||
"""Wait for b10-xfrout to run. This is done by blocking until the message
|
||||
XFROUT_NEW_CONFIG_DONE is logged.
|
||||
Parameters:
|
||||
process_name ('of <name', optional): The name of the BIND 10 instance
|
||||
to wait for. Defaults to 'bind10'.
|
||||
"""
|
||||
if process_name is None:
|
||||
process_name = "bind10"
|
||||
world.processes.wait_for_stderr_str(process_name,
|
||||
['XFROUT_NEW_CONFIG_DONE'],
|
||||
False)
|
||||
|
||||
@step('have bind10 running(?: with configuration ([\S]+))?' +\
|
||||
'(?: with cmdctl port (\d+))?' +\
|
||||
'(?: as ([\S]+))?')
|
||||
def have_bind10_running(step, config_file, cmdctl_port, process_name):
|
||||
"""
|
||||
Compound convenience step for running bind10, which consists of
|
||||
start_bind10.
|
||||
Currently only supports the 'with configuration' option.
|
||||
"""
|
||||
start_step = 'start bind10 with configuration ' + config_file
|
||||
if cmdctl_port is not None:
|
||||
start_step += ' with cmdctl port ' + str(cmdctl_port)
|
||||
if process_name is not None:
|
||||
start_step += ' as ' + process_name
|
||||
step.given(start_step)
|
||||
|
||||
# function to send lines to bindctl, and store the result
|
||||
def run_bindctl(commands, cmdctl_port=None, ignore_failure=False):
|
||||
"""Run bindctl.
|
||||
Parameters:
|
||||
commands: a sequence of strings which will be sent.
|
||||
cmdctl_port: a port number on which cmdctl is listening, is converted
|
||||
to string if necessary. If not provided, or None, defaults
|
||||
to 56175
|
||||
ignore_failure(bool): if set to True, don't examin the result code
|
||||
of bindctl and assert it succeeds.
|
||||
|
||||
bindctl's stdout and stderr streams are stored (as one multiline string
|
||||
in world.last_bindctl_stdout/stderr.
|
||||
Fails if the return code is not 0
|
||||
"""
|
||||
if cmdctl_port is None:
|
||||
cmdctl_port = 56175
|
||||
|
||||
args = ['bindctl', '-p', str(cmdctl_port), '--csv-file-dir=configurations/' ]
|
||||
bindctl = subprocess.Popen(args, 1, None, subprocess.PIPE,
|
||||
subprocess.PIPE, None)
|
||||
for line in commands:
|
||||
bindctl.stdin.write(line + "\n")
|
||||
(stdout, stderr) = bindctl.communicate()
|
||||
if ignore_failure:
|
||||
return
|
||||
result = bindctl.returncode
|
||||
world.last_bindctl_stdout = stdout
|
||||
world.last_bindctl_stderr = stderr
|
||||
assert result == 0, "bindctl exit code: " + str(result) +\
|
||||
"\nstdout:\n" + str(stdout) +\
|
||||
"stderr:\n" + str(stderr)
|
||||
|
||||
|
||||
@step('last bindctl( stderr)? output should( not)? contain (\S+)( exactly)?')
|
||||
def check_bindctl_output(step, stderr, notv, string, exactly):
|
||||
"""Checks the stdout (or stderr) stream of the last run of bindctl,
|
||||
fails if the given string is not found in it (or fails if 'not' was
|
||||
set and it is found
|
||||
Parameters:
|
||||
stderr ('stderr'): Check stderr instead of stdout output
|
||||
notv ('not'): reverse the check (fail if string is found)
|
||||
string ('contain <string>') string to look for
|
||||
exactly ('exactly'): Make an exact match delimited by whitespace
|
||||
"""
|
||||
if stderr is None:
|
||||
output = world.last_bindctl_stdout
|
||||
else:
|
||||
output = world.last_bindctl_stderr
|
||||
found = False
|
||||
if exactly is None:
|
||||
if string in output:
|
||||
found = True
|
||||
else:
|
||||
if re.search(r'^\s+' + string + r'\s+', output, re.IGNORECASE | re.MULTILINE) is not None:
|
||||
found = True
|
||||
if notv is None:
|
||||
assert found == True, "'" + string +\
|
||||
"' was not found in bindctl output:\n" +\
|
||||
output
|
||||
else:
|
||||
assert not found, "'" + string +\
|
||||
"' was found in bindctl output:\n" +\
|
||||
output
|
||||
|
||||
def parse_bindctl_output_as_data_structure():
|
||||
"""Helper function for data-related command tests: evaluates the
|
||||
last output of bindctl as a data structure that can then be
|
||||
inspected.
|
||||
If the bindctl output is not valid (json) data, this call will
|
||||
fail with an assertion failure.
|
||||
If it is valid, it is parsed and returned as whatever data
|
||||
structure it represented.
|
||||
"""
|
||||
# strip any extra output after a character that commonly terminates a valid
|
||||
# JSON expression, i.e., ']', '}' and '"'. (The extra output would
|
||||
# contain 'Exit from bindctl' message, and depending on environment some
|
||||
# other control-like characters...but why is this message even there?)
|
||||
# Note that this filter is not perfect. For example, it cannot recognize
|
||||
# a simple expression of true/false/null.
|
||||
output = re.sub("(.*)([^]}\"]*$)", r"\1", world.last_bindctl_stdout)
|
||||
try:
|
||||
return json.loads(output)
|
||||
except ValueError as ve:
|
||||
assert False, "Last bindctl output does not appear to be a " +\
|
||||
"parseable data structure: '" + output + "': " + str(ve)
|
||||
|
||||
def find_process_pid(step, process_name):
|
||||
"""Helper function to request the running processes from Init, and
|
||||
return the pid of the process with the given process_name.
|
||||
Fails with an assert if the response from b10-init is not valid JSON,
|
||||
or if the process with the given name is not found.
|
||||
"""
|
||||
# show_processes output is a list of lists, where the inner lists
|
||||
# are of the form [ pid, "name" ]
|
||||
# Not checking data form; errors will show anyway (if these turn
|
||||
# out to be too vague, we can change this)
|
||||
step.given('send bind10 the command Init show_processes')
|
||||
running_processes = parse_bindctl_output_as_data_structure()
|
||||
|
||||
for process in running_processes:
|
||||
if process[1] == process_name:
|
||||
return process[0]
|
||||
assert False, "Process named " + process_name +\
|
||||
" not found in output of Init show_processes";
|
||||
|
||||
@step("remember the pid of process ([\S]+)")
|
||||
def remember_pid(step, process_name):
|
||||
"""Stores the PID of the process with the given name as returned by
|
||||
Init show_processes command.
|
||||
Fails if the process with the given name does not appear to exist.
|
||||
Stores the component_name->pid value in the dict world.process_pids.
|
||||
This should only be used by the related step
|
||||
'the pid of process <name> should (not) have changed'
|
||||
Arguments:
|
||||
process name ('process <name>') the name of the component to store
|
||||
the pid of.
|
||||
"""
|
||||
if world.process_pids is None:
|
||||
world.process_pids = {}
|
||||
world.process_pids[process_name] = find_process_pid(step, process_name)
|
||||
|
||||
@step('pid of process ([\S]+) should not have changed')
|
||||
def check_pid(step, process_name):
|
||||
"""Checks the PID of the process with the given name as returned by
|
||||
Init show_processes command.
|
||||
Fails if the process with the given name does not appear to exist.
|
||||
Fails if the process with the given name exists, but has a different
|
||||
pid than it had when the step 'remember the pid of process' was
|
||||
called.
|
||||
Fails if that step has not been called (since world.process_pids
|
||||
does not exist).
|
||||
"""
|
||||
assert world.process_pids is not None, "No process pids stored"
|
||||
assert process_name in world.process_pids, "Process named " +\
|
||||
process_name +\
|
||||
" was not stored"
|
||||
pid = find_process_pid(step, process_name)
|
||||
assert world.process_pids[process_name] == pid,\
|
||||
"Expected pid: " + str(world.process_pids[process_name]) +\
|
||||
" Got pid: " + str(pid)
|
||||
|
||||
@step('set bind10 configuration (\S+) to (.*)(?: with cmdctl port (\d+))?')
|
||||
def config_set_command(step, name, value, cmdctl_port):
|
||||
"""
|
||||
Run bindctl, set the given configuration to the given value, and commit it.
|
||||
Parameters:
|
||||
name ('configuration <name>'): Identifier of the configuration to set
|
||||
value ('to <value>'): value to set it to.
|
||||
cmdctl_port ('with cmdctl port <portnr>', optional): cmdctl port to send
|
||||
the command to. Defaults to 56175.
|
||||
Fails if cmdctl does not exit with status code 0.
|
||||
"""
|
||||
commands = ["config set " + name + " " + value,
|
||||
"config commit",
|
||||
"quit"]
|
||||
run_bindctl(commands, cmdctl_port)
|
||||
|
||||
@step('send bind10 the following commands(?: with cmdctl port (\d+))?')
|
||||
def send_multiple_commands(step, cmdctl_port):
|
||||
"""
|
||||
Run bindctl, and send it the given multiline set of commands.
|
||||
A quit command is always appended.
|
||||
cmdctl_port ('with cmdctl port <portnr>', optional): cmdctl port to send
|
||||
the command to. Defaults to 56175.
|
||||
Fails if cmdctl does not exit with status code 0.
|
||||
"""
|
||||
commands = step.multiline.split("\n")
|
||||
# Always add quit
|
||||
commands.append("quit")
|
||||
run_bindctl(commands, cmdctl_port)
|
||||
|
||||
@step('remove bind10 configuration (\S+)(?: value (\S+))?(?: with cmdctl port (\d+))?')
|
||||
def config_remove_command(step, name, value, cmdctl_port):
|
||||
"""
|
||||
Run bindctl, remove the given configuration item, and commit it.
|
||||
Parameters:
|
||||
name ('configuration <name>'): Identifier of the configuration to remove
|
||||
value ('value <value>'): if name is a named set, use value to identify
|
||||
item to remove
|
||||
cmdctl_port ('with cmdctl port <portnr>', optional): cmdctl port to send
|
||||
the command to. Defaults to 56175.
|
||||
Fails if cmdctl does not exit with status code 0.
|
||||
"""
|
||||
cmd = "config remove " + name
|
||||
if value is not None:
|
||||
cmd = cmd + " " + value
|
||||
commands = [cmd,
|
||||
"config commit",
|
||||
"quit"]
|
||||
run_bindctl(commands, cmdctl_port)
|
||||
|
||||
@step('send bind10(?: with cmdctl port (\d+))?( ignoring failure)? the command (.+)')
|
||||
def send_command(step, cmdctl_port, ignore_failure, command):
|
||||
"""
|
||||
Run bindctl, send the given command, and exit bindctl.
|
||||
Parameters:
|
||||
command ('the command <command>'): The command to send.
|
||||
cmdctl_port ('with cmdctl port <portnr>', optional): cmdctl port to send
|
||||
the command to. Defaults to 56175.
|
||||
ignore_failure ('ignoring failure', optional): set to None if bindctl
|
||||
is expected to succeed (normal case, which is the default); if it is
|
||||
not None, it means bindctl is expected to fail (and it's acceptable).
|
||||
|
||||
Fails if bindctl does not exit with status code 0 and ignore_failure
|
||||
is not None.
|
||||
|
||||
"""
|
||||
commands = [command,
|
||||
"quit"]
|
||||
run_bindctl(commands, cmdctl_port, ignore_failure is not None)
|
||||
|
||||
@step('bind10 module (\S+) should( not)? be running')
|
||||
def module_is_running(step, name, not_str):
|
||||
"""
|
||||
Convenience step to check if a module is running; can only work with
|
||||
default cmdctl port; sends a 'help' command with bindctl, then
|
||||
checks if the output contains the given name.
|
||||
Parameters:
|
||||
name ('module <name>'): The name of the module (case sensitive!)
|
||||
not ('not'): Reverse the check (fail if it is running)
|
||||
"""
|
||||
if not_str is None:
|
||||
not_str = ""
|
||||
step.given('send bind10 the command help')
|
||||
step.given('last bindctl output should' + not_str + ' contain ' + name + ' exactly')
|
||||
|
||||
@step('Configure BIND10 to run DDNS')
|
||||
def configure_ddns_on(step):
|
||||
"""
|
||||
Convenience compound step to enable the b10-ddns module.
|
||||
"""
|
||||
step.behave_as("""
|
||||
When I send bind10 the following commands
|
||||
\"\"\"
|
||||
config add Init/components b10-ddns
|
||||
config set Init/components/b10-ddns/kind dispensable
|
||||
config set Init/components/b10-ddns/address DDNS
|
||||
config commit
|
||||
\"\"\"
|
||||
""")
|
||||
|
||||
@step('Configure BIND10 to stop running DDNS')
|
||||
def configure_ddns_off(step):
|
||||
"""
|
||||
Convenience compound step to disable the b10-ddns module.
|
||||
"""
|
||||
step.behave_as("""
|
||||
When I send bind10 the following commands
|
||||
\"\"\"
|
||||
config remove Init/components b10-ddns
|
||||
config commit
|
||||
\"\"\"
|
||||
""")
|
||||
|
||||
@step('query statistics(?: (\S+))? of bind10 module (\S+)(?: with cmdctl port (\d+))?')
|
||||
def query_statistics(step, statistics, name, cmdctl_port):
|
||||
"""
|
||||
query statistics data via bindctl.
|
||||
Parameters:
|
||||
statistics ('statistics <statistics>', optional) : The queried statistics name.
|
||||
name ('module <name>'): The name of the module (case sensitive!)
|
||||
cmdctl_port ('with cmdctl port <portnr>', optional): cmdctl port to send
|
||||
the command to.
|
||||
"""
|
||||
port_str = ' with cmdctl port %s' % cmdctl_port \
|
||||
if cmdctl_port else ''
|
||||
step.given('send bind10%s the command Stats show owner=%s%s'\
|
||||
% (port_str, name,\
|
||||
' name=%s' % statistics if statistics else ''))
|
||||
|
||||
@step('statistics counters are 0 in category (\S+)( except for the' + \
|
||||
' following items)?')
|
||||
def check_statistics_items(step, category, has_except_for):
|
||||
"""
|
||||
check the output of bindctl for statistics of specified counter.
|
||||
Parameters:
|
||||
category ('category <category>'): The category of counter.
|
||||
has_except_for ('except for the following items'): checks values of items
|
||||
with the multiline part.
|
||||
|
||||
Expected values of items are taken from the multiline part of the step in
|
||||
the scenario. The multiline part has at most four columns: item_name,
|
||||
item_value, min_value, and max_value. item_name is a relative name
|
||||
to category. item_value is an expected value for
|
||||
item_name. min_value and max_value are expected to be used when
|
||||
item_value cannot be specified to be item_value. min_value is the
|
||||
minimum value in the expected range, and max_value is the maximum
|
||||
value in the expected range. Values would be examined if they are
|
||||
in columns corresponding to these.
|
||||
"""
|
||||
|
||||
def flatten(dictionary, prefix=''):
|
||||
h = {}
|
||||
for k, v in dictionary.items():
|
||||
if type(v) is dict:
|
||||
h.update(flatten(v, prefix+'.'+k))
|
||||
else:
|
||||
h[prefix+'.'+k] = v
|
||||
return h
|
||||
|
||||
stats = flatten(parse_bindctl_output_as_data_structure())
|
||||
if has_except_for:
|
||||
# fetch step tables in the scnario as hashes
|
||||
for item in step.hashes:
|
||||
name = category+'.'+item['item_name']
|
||||
assert stats.has_key(name), \
|
||||
'Statistics item %s was not found' % (name)
|
||||
found = stats[name]
|
||||
if 'item_value' in item and item['item_value']:
|
||||
value = item['item_value']
|
||||
assert int(found) == int(value), \
|
||||
'Statistics item %s has unexpected value %s (expect %s)' % \
|
||||
(name, found, value)
|
||||
if 'min_value' in item and item['min_value']:
|
||||
value = item['min_value']
|
||||
assert float(value) <= float(found), \
|
||||
'Statistics item %s has unexpected value %s (expect %s or greater than)' % \
|
||||
(name, found, value)
|
||||
if 'max_value' in item and item['max_value']:
|
||||
value = item['max_value']
|
||||
assert float(found) <= float(value), \
|
||||
'Statistics item %s has unexpected value %s (expect %s or less than)' % \
|
||||
(name, found, value)
|
||||
del(stats[name])
|
||||
for name, found in stats.items():
|
||||
assert int(found) == 0, \
|
||||
'Statistics item %s has unexpected value %s (expect %s)' % \
|
||||
(name, found, 0)
|
||||
|
||||
@step('check initial statistics(?:( not)? containing (\S+))? for (\S+)'
|
||||
'( with cmdctl port \d+)?( except for the following items)?')
|
||||
def check_init_statistics(step, notv, string, name, cmdctl_port, has_except_for):
|
||||
"""Checks the initial statistics for the module. Also checks a
|
||||
string is contained or not contained in them. Statistics counters
|
||||
other than zero can follow below.
|
||||
Parameters:
|
||||
notv ('not'): reverse the check (fail if string is found)
|
||||
string ('containing <string>') string to look for
|
||||
name ('module <name>'): The name of the module (case sensitive!)
|
||||
cmdctl_port ('with cmdctl port <portnr>', optional): cmdctl port to send
|
||||
the command to.
|
||||
has_except_for ('except for the following items'): checks values of items
|
||||
with the multiline part.
|
||||
"""
|
||||
query_str = 'query statistics of bind10 module ' + name
|
||||
if cmdctl_port:
|
||||
query_str = query_str + cmdctl_port
|
||||
notcontain_str = 'last bindctl output should%s contain "%s"'
|
||||
check_str = 'statistics counters are 0 in category .' + name
|
||||
if has_except_for:
|
||||
check_str = check_str + has_except_for + "\n" \
|
||||
+ step.represent_hashes()
|
||||
step.given(query_str)
|
||||
step.given(notcontain_str % (' not', 'error'))
|
||||
if string is not None:
|
||||
step.given(notcontain_str % (notv, string))
|
||||
step.given(check_str)
|
@@ -1,41 +0,0 @@
|
||||
# Copyright (C) 2013 Internet Systems Consortium.
|
||||
#
|
||||
# Permission to use, copy, modify, and distribute this software for any
|
||||
# purpose with or without fee is hereby granted, provided that the above
|
||||
# copyright notice and this permission notice appear in all copies.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
|
||||
# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
|
||||
# INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
|
||||
# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
from lettuce import *
|
||||
import urllib
|
||||
|
||||
# Basic request
|
||||
@step('request the URL (.*)')
|
||||
def request_url(step, url):
|
||||
"""
|
||||
Performs one basic HTTP GET request. The resulting HTTPResponse object
|
||||
will we placed in world.last_http_response
|
||||
Parameters:
|
||||
url: the full URL to query
|
||||
"""
|
||||
world.last_http_response = urllib.urlopen(url)
|
||||
|
||||
@step('last http response status code should be ([0-9]+)')
|
||||
def check_last_response_code(step, code):
|
||||
"""
|
||||
Checks whether the last call to request_url resulted in a response
|
||||
with the given (numeric) status code
|
||||
Fails if it does not, or if there never was a complete request_url
|
||||
operation
|
||||
"""
|
||||
assert world.last_http_response != None, "No HTTP request made yet"
|
||||
assert int(code) == world.last_http_response.getcode(),\
|
||||
code + " != " +\
|
||||
str(world.last_http_response.getcode())
|
@@ -1,106 +0,0 @@
|
||||
# Copyright (C) 2013 Internet Systems Consortium.
|
||||
#
|
||||
# Permission to use, copy, modify, and distribute this software for any
|
||||
# purpose with or without fee is hereby granted, provided that the above
|
||||
# copyright notice and this permission notice appear in all copies.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
|
||||
# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
|
||||
# INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
|
||||
# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
from lettuce import *
|
||||
import subprocess
|
||||
import tempfile
|
||||
|
||||
def run_loadzone(zone, zone_file, db_file):
|
||||
"""Run b10-loadzone.
|
||||
|
||||
It currently only works for an SQLite3-based data source, and takes
|
||||
its DB file as a parameter.
|
||||
|
||||
Parameters:
|
||||
zone (str): the zone name
|
||||
zone_file (str): master zone file for the zone; can be None to make an
|
||||
empty zone.
|
||||
db_file (str): SQLite3 DB file to load the zone into
|
||||
|
||||
"""
|
||||
sqlite_datasrc_cfg = '{"database_file": "' + db_file + '"}'
|
||||
if zone_file is not None:
|
||||
args = ['b10-loadzone', '-c', sqlite_datasrc_cfg, zone, zone_file]
|
||||
else:
|
||||
args = ['b10-loadzone', '-c', sqlite_datasrc_cfg, '-e', zone]
|
||||
loadzone = subprocess.Popen(args, 1, None, None,
|
||||
subprocess.PIPE, subprocess.PIPE)
|
||||
(stdout, stderr) = loadzone.communicate()
|
||||
result = loadzone.returncode
|
||||
world.last_loadzone_stdout = stdout
|
||||
world.last_loadzone_stderr = stderr
|
||||
assert result == 0, "loadzone exit code: " + str(result) +\
|
||||
"\nstdout:\n" + str(stdout) +\
|
||||
"stderr:\n" + str(stderr)
|
||||
|
||||
@step('load zone (\S+) to DB file (\S+) from (\S+)')
|
||||
def load_zone_to_dbfile(step, zone, db_file, zone_file):
|
||||
"""Load a zone into a data source from a zone file.
|
||||
|
||||
It currently only works for an SQLite3-based data source. Its
|
||||
DB file name should be specified.
|
||||
|
||||
Step definition:
|
||||
load zone <zone_name> to DB file <db_file> from <zone_file>
|
||||
|
||||
"""
|
||||
run_loadzone(zone, zone_file, db_file)
|
||||
|
||||
@step('make empty zone (\S+) in DB file (\S+)')
|
||||
def make_empty_zone_to_dbfile(step, zone, db_file):
|
||||
"""Make an empty zone into a data source.
|
||||
|
||||
If a non-empty zone already exists in the data source, it will be emptied;
|
||||
otherwise, a new empty zone will be created.
|
||||
|
||||
It currently only works for an SQLite3-based data source. Its
|
||||
DB file name should be specified.
|
||||
|
||||
Step definition:
|
||||
make empty zone <zone_name> to DB file <db_file>
|
||||
|
||||
"""
|
||||
run_loadzone(zone, None, db_file)
|
||||
|
||||
@step('load (\d+) records for zone (\S+) to DB file (\S+)')
|
||||
def load_zone_rr_to_dbfile(step, num_records, zone, db_file):
|
||||
"""Load a zone with a specified number of RRs into a data source.
|
||||
|
||||
It currently only works for an SQLite3-based data source. Its
|
||||
DB file name should be specified.
|
||||
|
||||
It creates the content of the zone dynamically so the total number of
|
||||
RRs of the zone is the specified number, including mandatory SOA and NS.
|
||||
|
||||
Step definition:
|
||||
load zone <zone_name> to DB file <db_file> from <zone_file>
|
||||
|
||||
"""
|
||||
num_records = int(num_records)
|
||||
assert num_records >= 2, 'zone must have at least 2 RRs: SOA and NS'
|
||||
num_records -= 2
|
||||
with tempfile.NamedTemporaryFile(mode='w', prefix='zone-file',
|
||||
dir='data/', delete=True) as f:
|
||||
filename = f.name
|
||||
f.write('$TTL 3600\n')
|
||||
f.write('$ORIGIN .\n') # so it'll work whether or not zone ends with .
|
||||
f.write(zone + ' IN SOA . . 0 0 0 0 0\n')
|
||||
f.write(zone + ' IN NS 0.' + zone + '\n')
|
||||
count = 0
|
||||
while count < num_records:
|
||||
f.write(str(count) + '.' + zone + ' IN A 192.0.2.1\n')
|
||||
count += 1
|
||||
f.flush()
|
||||
run_loadzone(zone, f.name, db_file)
|
@@ -1,168 +0,0 @@
|
||||
# Copyright (C) 2012 Internet Systems Consortium.
|
||||
#
|
||||
# Permission to use, copy, modify, and distribute this software for any
|
||||
# purpose with or without fee is hereby granted, provided that the above
|
||||
# copyright notice and this permission notice appear in all copies.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
|
||||
# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
|
||||
# INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
|
||||
# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
from lettuce import *
|
||||
import subprocess
|
||||
import re
|
||||
|
||||
def run_nsupdate(commands):
|
||||
"""Run nsupdate.
|
||||
Parameters:
|
||||
commands: a sequence of strings which will be sent.
|
||||
update_address: address to send the update to
|
||||
update_port: port to send the update to
|
||||
zone: zone to update
|
||||
|
||||
Appends 'send' and 'quit' as final commands.
|
||||
|
||||
nsupdate's stdout and stderr streams are stored (as one multiline string
|
||||
in world.last_nsupdate_stdout/stderr.
|
||||
|
||||
The return code is stored in world.last_nsupdate_returncode
|
||||
(it is not checked here, since a number of tests intentionally
|
||||
result in a non-zero return code).
|
||||
"""
|
||||
commands.append('send')
|
||||
commands.append('quit')
|
||||
args = ['nsupdate' ]
|
||||
nsupdate = subprocess.Popen(args, 1, None, subprocess.PIPE,
|
||||
subprocess.PIPE, subprocess.PIPE)
|
||||
for line in commands:
|
||||
nsupdate.stdin.write(line + "\n")
|
||||
(stdout, stderr) = nsupdate.communicate()
|
||||
world.last_nsupdate_returncode = nsupdate.returncode
|
||||
world.last_nsupdate_stdout = stdout
|
||||
world.last_nsupdate_stderr = stderr
|
||||
|
||||
@step('send a DDNS update for (\S+) with the following commands:')
|
||||
def send_multiple_commands(step, zone):
|
||||
"""
|
||||
Run nsupdate, and send it the given multiline set of commands.
|
||||
A send and quit command is always appended.
|
||||
|
||||
This is the most 'raw' wrapper around the nsupdate call; every
|
||||
command except the final send needs to be specified. Intended
|
||||
for those tests that have unique properties.
|
||||
"""
|
||||
commands = step.multiline.split("\n")
|
||||
run_nsupdate(commands, zone)
|
||||
|
||||
@step('DDNS response should be ([A-Z]+)')
|
||||
def check_ddns_response(step, response):
|
||||
"""
|
||||
Checks the result of the last call to nsupdate.
|
||||
|
||||
If the given response argument is SUCCESS, it simply checks whether
|
||||
the return code from nsupdate is 0 (there is no output in that case).
|
||||
If not, it checks whether it is not 0, and if the given response string
|
||||
matches a line 'update failed: <response>' in the stderr output of
|
||||
nsupdate.
|
||||
|
||||
Prints exit code, stdout and stderr streams of nsupdate if it fails.
|
||||
"""
|
||||
# For success, nsupdate is silent, only check result code 0
|
||||
if response == "SUCCESS":
|
||||
assert 0 == world.last_nsupdate_returncode,\
|
||||
"nsupdate exit code: " + str(world.last_nsupdate_returncode) +\
|
||||
"\nstdout:\n" + str(world.last_nsupdate_stdout) +\
|
||||
"stderr:\n" + str(world.last_nsupdate_stderr)
|
||||
else:
|
||||
found = False
|
||||
for line in world.last_nsupdate_stderr.split('\n'):
|
||||
if line == "update failed: " + response:
|
||||
found = True
|
||||
assert found and (0 != world.last_nsupdate_returncode),\
|
||||
"Response " + response + " not found in nsupdate output\n" +\
|
||||
"nsupdate exit code: " + str(world.last_nsupdate_returncode) +\
|
||||
"\nstdout:\n" + str(world.last_nsupdate_stdout) +\
|
||||
"stderr:\n" + str(world.last_nsupdate_stderr)
|
||||
|
||||
|
||||
# Individual steps to create a DDNS update packet through nsupdate
|
||||
@step('Prepare a DDNS update(?: for (\S+))?(?: to (\S+)(?: port ([0-9]+)))?')
|
||||
def prepare_update(step, zone, server, port):
|
||||
"""
|
||||
Prepares an nsupdate command that sets up an update to a server
|
||||
for a zone. The update is not sent yet, but the commands
|
||||
are stored in world.nsupdate_commands.
|
||||
"""
|
||||
commands = []
|
||||
if server is not None:
|
||||
commands.append("server " + server)
|
||||
else:
|
||||
commands.append("server 127.0.0.1")
|
||||
if port is not None:
|
||||
commands[0] = commands[0] + " " + port
|
||||
else:
|
||||
commands[0] = commands[0] + " 56176"
|
||||
if zone is not None:
|
||||
commands.append("zone " + zone)
|
||||
world.nsupdate_commands = commands
|
||||
|
||||
@step('Add to the DDNS update: (.*)')
|
||||
def add_line_to_ddns_update(step, line):
|
||||
"""
|
||||
Adds a single line to the prepared nsupdate. It is not sent yet.
|
||||
The line must conform to nsupdate syntax.
|
||||
"""
|
||||
world.nsupdate_commands.append(line)
|
||||
|
||||
@step('Add the following lines to the DDNS update:')
|
||||
def add_lines_to_ddns_update(step, line):
|
||||
"""
|
||||
Adds multiple lines to the prepared nsupdate. It is not sent yet.
|
||||
The lines must conform to nsupdate syntax.
|
||||
"""
|
||||
world.nsupdate_commands.extend(step.multiline.split('\n'))
|
||||
|
||||
@step('Send the DDNS update')
|
||||
def run_ddns_update(step):
|
||||
"""
|
||||
Runs the prepared nsupdate, see run_nsupdate() for more information.
|
||||
"""
|
||||
run_nsupdate(world.nsupdate_commands)
|
||||
|
||||
@step('use DDNS to set the SOA SERIAL to ([0-9]+)')
|
||||
def set_serial_to(step, new_serial):
|
||||
"""
|
||||
Convenience compound step; prepare an update for example.org,
|
||||
which sets the SERIAL to the given value, and send it.
|
||||
It makes no other changes, and has hardcoded values for the other
|
||||
SOA rdata fields.
|
||||
"""
|
||||
step.given('Prepare a DDNS update')
|
||||
step.given('add to the DDNS update: update add example.org 3600 IN SOA ns1.example.org. admin.example.org. ' + new_serial + ' 3600 1800 2419200 7200')
|
||||
step.given('Send the DDNS update')
|
||||
|
||||
@step('use DDNS to add a record (.*)')
|
||||
def add_record(step, new_record):
|
||||
"""
|
||||
Convenience compound step; prepare an update for example.org,
|
||||
which adds one record, then send it.
|
||||
Apart from the update addition, the update will not contain anything else.
|
||||
"""
|
||||
step.given('Prepare a DDNS update')
|
||||
step.given('add to the DDNS update: update add ' + new_record)
|
||||
step.given('Send the DDNS update')
|
||||
|
||||
@step('set DDNS ACL ([0-9]+) for ([0-9.]+) to ([A-Z]+)')
|
||||
def set_ddns_acl_to(step, nr, address, action):
|
||||
"""
|
||||
Convenience step to update a single ACL for DDNS.
|
||||
Replaces the ACL at the given index for the given
|
||||
address, to the given action
|
||||
"""
|
||||
step.given('set bind10 configuration DDNS/zones[' + nr + ']/update_acl to [{"action": "' + action + '", "from": "' + address + '"}]')
|
||||
step.given('last bindctl output should not contain Error')
|
@@ -1,349 +0,0 @@
|
||||
# Copyright (C) 2011 Internet Systems Consortium.
|
||||
#
|
||||
# Permission to use, copy, modify, and distribute this software for any
|
||||
# purpose with or without fee is hereby granted, provided that the above
|
||||
# copyright notice and this permission notice appear in all copies.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
|
||||
# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
|
||||
# INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
|
||||
# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
# This script provides querying functionality
|
||||
# The most important step is
|
||||
#
|
||||
# query for <name> [type X] [class X] [to <addr>[:port]] should have rcode <rc>
|
||||
#
|
||||
# By default, it will send queries to 127.0.0.1:56176 unless specified
|
||||
# otherwise. The rcode is always checked. If the result is not NO_ANSWER,
|
||||
# the result will be stored in last_query_result, which can then be inspected
|
||||
# more closely, for instance with the step
|
||||
#
|
||||
# "the last query response should have <property> <value>"
|
||||
#
|
||||
# Also see example.feature for some examples
|
||||
|
||||
from lettuce import *
|
||||
import subprocess
|
||||
import re
|
||||
|
||||
#
|
||||
# define a class to easily access different parts
|
||||
# We may consider using our full library for this, but for now
|
||||
# simply store several parts of the response as text values in
|
||||
# this structure.
|
||||
# (this actually has the advantage of not relying on our own libraries
|
||||
# to test our own, well, libraries)
|
||||
#
|
||||
# The following attributes are 'parsed' from the response, all as strings,
|
||||
# and end up as direct attributes of the QueryResult object:
|
||||
# opcode, rcode, id, flags, qdcount, ancount, nscount, adcount,
|
||||
# edns_version, edns_flags, and edns_udp_size
|
||||
# (flags and edns_flags are both one string with all flags, in the order
|
||||
# in which they appear in the response message.)
|
||||
#
|
||||
# this will set 'rcode' as the result code, we 'define' one additional
|
||||
# rcode, "NO_ANSWER", if the dig process returned an error code itself
|
||||
# In this case none of the other attributes will be set.
|
||||
#
|
||||
# The different sections will be lists of strings, one for each RR in the
|
||||
# section. The question section will start with ';', as per dig output
|
||||
#
|
||||
# See server_from_sqlite3.feature for various examples to perform queries
|
||||
class QueryResult(object):
|
||||
status_re = re.compile("opcode: ([A-Z])+, status: ([A-Z]+), id: ([0-9]+)")
|
||||
edns_re = re.compile("; EDNS: version: ([0-9]+), flags: ([a-z ]*); udp: ([0-9]+)")
|
||||
flags_re = re.compile("flags: ([a-z ]+); QUERY: ([0-9]+), ANSWER: " +
|
||||
"([0-9]+), AUTHORITY: ([0-9]+), ADDITIONAL: ([0-9]+)")
|
||||
|
||||
def __init__(self, name, qtype, qclass, address, port,
|
||||
additional_args=None):
|
||||
"""
|
||||
Constructor. This fires of a query using dig.
|
||||
Parameters:
|
||||
name: The domain name to query
|
||||
qtype: The RR type to query. Defaults to A if it is None.
|
||||
qclass: The RR class to query. Defaults to IN if it is None.
|
||||
address: The IP address to send the query to.
|
||||
port: The port number to send the query to.
|
||||
additional_args: List of additional arguments (e.g. '+dnssec').
|
||||
All parameters must be either strings or have the correct string
|
||||
representation.
|
||||
Only one query attempt will be made.
|
||||
"""
|
||||
args = [ 'dig', '+tries=1', '@' + str(address), '-p', str(port) ]
|
||||
if qtype is not None:
|
||||
args.append('-t')
|
||||
args.append(str(qtype))
|
||||
if qclass is not None:
|
||||
args.append('-c')
|
||||
args.append(str(qclass))
|
||||
if additional_args is not None:
|
||||
args.extend(additional_args)
|
||||
args.append(name)
|
||||
dig_process = subprocess.Popen(args, 1, None, None, subprocess.PIPE,
|
||||
None)
|
||||
result = dig_process.wait()
|
||||
if result != 0:
|
||||
self.rcode = "NO_ANSWER"
|
||||
else:
|
||||
self.rcode = None
|
||||
parsing = "HEADER"
|
||||
self.question_section = []
|
||||
self.answer_section = []
|
||||
self.authority_section = []
|
||||
self.additional_section = []
|
||||
self.line_handler = self.parse_header
|
||||
for out in dig_process.stdout:
|
||||
self.line_handler(out)
|
||||
|
||||
def _check_next_header(self, line):
|
||||
"""
|
||||
Returns true if we found a next header, and sets the internal
|
||||
line handler to the appropriate value.
|
||||
"""
|
||||
if line == ";; ANSWER SECTION:\n":
|
||||
self.line_handler = self.parse_answer
|
||||
elif line == ";; OPT PSEUDOSECTION:\n":
|
||||
self.line_handler = self.parse_opt
|
||||
elif line == ";; QUESTION SECTION:\n":
|
||||
self.line_handler = self.parse_question
|
||||
elif line == ";; AUTHORITY SECTION:\n":
|
||||
self.line_handler = self.parse_authority
|
||||
elif line == ";; ADDITIONAL SECTION:\n":
|
||||
self.line_handler = self.parse_additional
|
||||
elif line.startswith(";; Query time"):
|
||||
self.line_handler = self.parse_footer
|
||||
else:
|
||||
return False
|
||||
return True
|
||||
|
||||
def parse_header(self, line):
|
||||
"""
|
||||
Parse the header lines of the query response.
|
||||
Parameters:
|
||||
line: The current line of the response.
|
||||
"""
|
||||
if not self._check_next_header(line):
|
||||
status_match = self.status_re.search(line)
|
||||
flags_match = self.flags_re.search(line)
|
||||
if status_match is not None:
|
||||
self.opcode = status_match.group(1)
|
||||
self.rcode = status_match.group(2)
|
||||
elif flags_match is not None:
|
||||
self.flags = flags_match.group(1)
|
||||
self.qdcount = flags_match.group(2)
|
||||
self.ancount = flags_match.group(3)
|
||||
self.nscount = flags_match.group(4)
|
||||
self.adcount = flags_match.group(5)
|
||||
|
||||
def parse_opt(self, line):
|
||||
"""
|
||||
Parse the header lines of the query response.
|
||||
Parameters:
|
||||
line: The current line of the response.
|
||||
"""
|
||||
if not self._check_next_header(line):
|
||||
edns_match = self.edns_re.search(line)
|
||||
if edns_match is not None:
|
||||
self.edns_version = edns_match.group(1)
|
||||
self.edns_flags = edns_match.group(2)
|
||||
self.edns_udp_size = edns_match.group(3)
|
||||
|
||||
def parse_question(self, line):
|
||||
"""
|
||||
Parse the question section lines of the query response.
|
||||
Parameters:
|
||||
line: The current line of the response.
|
||||
"""
|
||||
if not self._check_next_header(line):
|
||||
if line != "\n":
|
||||
self.question_section.append(line.strip())
|
||||
|
||||
def parse_answer(self, line):
|
||||
"""
|
||||
Parse the answer section lines of the query response.
|
||||
Parameters:
|
||||
line: The current line of the response.
|
||||
"""
|
||||
if not self._check_next_header(line):
|
||||
if line != "\n":
|
||||
self.answer_section.append(line.strip())
|
||||
|
||||
def parse_authority(self, line):
|
||||
"""
|
||||
Parse the authority section lines of the query response.
|
||||
Parameters:
|
||||
line: The current line of the response.
|
||||
"""
|
||||
if not self._check_next_header(line):
|
||||
if line != "\n":
|
||||
self.authority_section.append(line.strip())
|
||||
|
||||
def parse_additional(self, line):
|
||||
"""
|
||||
Parse the additional section lines of the query response.
|
||||
Parameters:
|
||||
line: The current line of the response.
|
||||
"""
|
||||
if not self._check_next_header(line):
|
||||
if line != "\n":
|
||||
self.additional_section.append(line.strip())
|
||||
|
||||
def parse_footer(self, line):
|
||||
"""
|
||||
Parse the footer lines of the query response.
|
||||
Parameters:
|
||||
line: The current line of the response.
|
||||
"""
|
||||
pass
|
||||
|
||||
@step('A (dnssec )?(recursive )?query for ([\S]+) (?:type ([A-Z0-9]+) )?' +
|
||||
'(?:class ([A-Z]+) )?(?:to ([^:]+|\[[0-9a-fA-F:]+\])(?::([0-9]+))? )?' +
|
||||
'should have rcode ([\w.]+)')
|
||||
def query(step, dnssec, recursive, query_name, qtype, qclass, addr, port,
|
||||
rcode):
|
||||
"""
|
||||
Run a query, check the rcode of the response, and store the query
|
||||
result in world.last_query_result.
|
||||
Parameters:
|
||||
dnssec ('dnssec'): DO bit is set in the query.
|
||||
Defaults to unset (no DNSSEC).
|
||||
recursive ('recursive'): RD bit is set in the query.
|
||||
Defaults to unset (no recursion).
|
||||
query_name ('query for <name>'): The domain name to query.
|
||||
qtype ('type <type>', optional): The RR type to query. Defaults to A.
|
||||
qclass ('class <class>', optional): The RR class to query. Defaults to IN.
|
||||
addr ('to <address>', optional): The IP address of the nameserver to query.
|
||||
Defaults to 127.0.0.1.
|
||||
port (':<port>', optional): The port number of the nameserver to query.
|
||||
Defaults to 56176.
|
||||
rcode ('should have rcode <rcode>'): The expected rcode of the answer.
|
||||
"""
|
||||
if qtype is None:
|
||||
qtype = "A"
|
||||
if qclass is None:
|
||||
qclass = "IN"
|
||||
if addr is None:
|
||||
addr = "127.0.0.1"
|
||||
addr = re.sub(r"\[(.+)\]", r"\1", addr) # convert [IPv6_addr] to IPv6_addr
|
||||
if port is None:
|
||||
port = 56176
|
||||
additional_arguments = []
|
||||
if dnssec is not None:
|
||||
additional_arguments.append("+dnssec")
|
||||
else:
|
||||
# some builds of dig add edns0 by default. This could muck up
|
||||
# additional counts, so unless we need dnssec, explicitly
|
||||
# disable edns0
|
||||
additional_arguments.append("+noedns")
|
||||
# dig sets RD bit by default.
|
||||
if recursive is None:
|
||||
additional_arguments.append("+norecurse")
|
||||
query_result = QueryResult(query_name, qtype, qclass, addr, port,
|
||||
additional_arguments)
|
||||
assert query_result.rcode == rcode,\
|
||||
"Expected: " + rcode + ", got " + query_result.rcode
|
||||
world.last_query_result = query_result
|
||||
|
||||
@step('The SOA serial for ([\S.]+) (?:at (\S+)(?::([0-9]+)) )?should be ([0-9]+)')
|
||||
def query_soa(step, query_name, address, port, serial=None):
|
||||
"""
|
||||
Convenience function to check the SOA SERIAL value of the given zone at
|
||||
the nameserver at the default address (127.0.0.1:56176).
|
||||
Parameters:
|
||||
query_name ('for <name>'): The zone to find the SOA record for.
|
||||
serial ('should be <number>'): The expected value of the SOA SERIAL.
|
||||
If the rcode is not NOERROR, or the answer section does not contain the
|
||||
SOA record, this step fails.
|
||||
"""
|
||||
if address is None:
|
||||
address = "127.0.0.1"
|
||||
if port is None:
|
||||
port = "56176"
|
||||
query_result = QueryResult(query_name, "SOA", "IN", address, port)
|
||||
assert "NOERROR" == query_result.rcode,\
|
||||
"Got " + query_result.rcode + ", expected NOERROR"
|
||||
assert len(query_result.answer_section) == 1,\
|
||||
"Too few or too many answers in SOA response"
|
||||
soa_parts = query_result.answer_section[0].split()
|
||||
assert serial == soa_parts[6],\
|
||||
"Got SOA serial " + soa_parts[6] + ", expected " + serial
|
||||
|
||||
@step('last query response should have (\S+) (.+)')
|
||||
def check_last_query(step, item, value):
|
||||
"""
|
||||
Check a specific value in the reponse from the last successful query sent.
|
||||
Parameters:
|
||||
item: The item to check the value of
|
||||
value: The expected value.
|
||||
This performs a very simple direct string comparison of the QueryResult
|
||||
member with the given item name and the given value.
|
||||
Fails if the item is unknown, or if its value does not match the expected
|
||||
value.
|
||||
"""
|
||||
assert world.last_query_result is not None
|
||||
assert item in world.last_query_result.__dict__
|
||||
lq_val = world.last_query_result.__dict__[item]
|
||||
assert str(value) == str(lq_val),\
|
||||
"Got: " + str(lq_val) + ", expected: " + str(value)
|
||||
|
||||
@step('([a-zA-Z]+) section of the last query response should (exactly )?be')
|
||||
def check_last_query_section(step, section, exact):
|
||||
"""
|
||||
Check the entire contents of the given section of the response of the last
|
||||
query.
|
||||
Parameters:
|
||||
section ('<section> section'): The name of the section (QUESTION, ANSWER,
|
||||
AUTHORITY or ADDITIONAL).
|
||||
The expected response is taken from the multiline part of the step in the
|
||||
scenario. Differing whitespace is ignored, the order of the lines is
|
||||
ignored, and the comparison is case insensitive.
|
||||
Fails if they do not match.
|
||||
WARNING: Case insensitivity is not strictly correct; for instance the
|
||||
data of TXT RRs would be case sensitive. But most other output is, so
|
||||
currently the checks are always case insensitive. Should we decide
|
||||
these checks do need to be case sensitive, we can either remove it
|
||||
or make it optional (for the former, we'll need to update a number of
|
||||
tests).
|
||||
"""
|
||||
response_string = None
|
||||
if section.lower() == 'question':
|
||||
response_string = "\n".join(world.last_query_result.question_section)
|
||||
elif section.lower() == 'answer':
|
||||
response_string = "\n".join(world.last_query_result.answer_section)
|
||||
elif section.lower() == 'authority':
|
||||
response_string = "\n".join(world.last_query_result.authority_section)
|
||||
elif section.lower() == 'additional':
|
||||
response_string = "\n".join(world.last_query_result.additional_section)
|
||||
else:
|
||||
assert False, "Unknown section " + section
|
||||
|
||||
# Now mangle the data for 'conformance'
|
||||
# This could be done more efficiently, but is done one
|
||||
# by one on a copy of the original data, so it is clear
|
||||
# what is done. Final error output is currently still the
|
||||
# original unchanged multiline strings
|
||||
|
||||
# replace whitespace of any length by one space
|
||||
response_string = re.sub("[ \t]+", " ", response_string)
|
||||
expect = re.sub("[ \t]+", " ", step.multiline)
|
||||
# lowercase them unless we need to do an exact match
|
||||
if exact is None:
|
||||
response_string = response_string.lower()
|
||||
expect = expect.lower()
|
||||
# sort them
|
||||
response_string_parts = response_string.split("\n")
|
||||
response_string_parts.sort()
|
||||
response_string = "\n".join(response_string_parts)
|
||||
expect_parts = expect.split("\n")
|
||||
expect_parts.sort()
|
||||
expect = "\n".join(expect_parts)
|
||||
|
||||
assert response_string.strip() == expect.strip(),\
|
||||
"Got:\n'" + response_string + "'\nExpected:\n'" + step.multiline +"'"
|
||||
|
@@ -1,95 +0,0 @@
|
||||
# Copyright (C) 2011 Internet Systems Consortium.
|
||||
#
|
||||
# Permission to use, copy, modify, and distribute this software for any
|
||||
# purpose with or without fee is hereby granted, provided that the above
|
||||
# copyright notice and this permission notice appear in all copies.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
|
||||
# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
|
||||
# INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
|
||||
# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
#
|
||||
# This file contains a number of common steps that are general and may be used
|
||||
# By a lot of feature files.
|
||||
#
|
||||
|
||||
from lettuce import *
|
||||
import os
|
||||
|
||||
@step('stop process (\w+)')
|
||||
def stop_a_named_process(step, process_name):
|
||||
"""
|
||||
Stop the process with the given name.
|
||||
Parameters:
|
||||
process_name ('process <name>'): Name of the process to stop.
|
||||
"""
|
||||
world.processes.stop_process(process_name)
|
||||
|
||||
@step('wait (?:(\d+) times )?for (new )?(\w+) stderr message (\S+)(?: not (\S+))?')
|
||||
def wait_for_stderr_message(step, times, new, process_name, message, not_message):
|
||||
"""
|
||||
Block until the given message is printed to the given process's stderr
|
||||
output.
|
||||
Parameter:
|
||||
times: Check for the string this many times.
|
||||
new: (' new', optional): Only check the output from the process that has
|
||||
not been covered in previous calls to this
|
||||
function. See RunningProcess._wait_for_output_str
|
||||
for details.
|
||||
process_name ('<name> stderr'): Name of the process to check the output of.
|
||||
message ('message <message>'): Output (part) to wait for.
|
||||
not_message ('not <message>'): Output (part) to wait for, and fail
|
||||
Fails if the message is not found after 10 seconds.
|
||||
"""
|
||||
strings = [message]
|
||||
if not_message is not None:
|
||||
strings.append(not_message)
|
||||
if times is None:
|
||||
times = 1
|
||||
(found, line) = world.processes.wait_for_stderr_str(process_name, strings, new, int(times))
|
||||
if not_message is not None:
|
||||
assert found != not_message, line
|
||||
|
||||
@step('wait (?:(\d+) times )?for (new )?(\w+) stdout message (\w+)(?: not (\w+))?')
|
||||
def wait_for_stdout_message(step, times, new, process_name, message, not_message):
|
||||
"""
|
||||
Block until the given message is printed to the given process's stdout
|
||||
output.
|
||||
Parameter:
|
||||
times: Check for the string this many times.
|
||||
new: (' new', optional): Only check the output from the process that has
|
||||
not been covered in previous calls to this
|
||||
function. See RunningProcess._wait_for_output_str
|
||||
for details.
|
||||
process_name ('<name> stderr'): Name of the process to check the output of.
|
||||
message ('message <message>'): Output (part) to wait for, and succeed.
|
||||
not_message ('not <message>'): Output (part) to wait for, and fail
|
||||
Fails if the message is not found after 10 seconds.
|
||||
"""
|
||||
strings = [message]
|
||||
if not_message is not None:
|
||||
strings.append(not_message)
|
||||
if times is None:
|
||||
times = 1
|
||||
(found, line) = world.processes.wait_for_stdout_str(process_name, strings, new, int(times))
|
||||
if not_message is not None:
|
||||
assert found != not_message, line
|
||||
|
||||
@step('the file (\S+) should (not )?exist')
|
||||
def check_existence(step, file_name, should_not_exist):
|
||||
"""
|
||||
Check the existence of the given file.
|
||||
Parameters:
|
||||
file_name ('file <name>'): File to check existence of.
|
||||
should_not_exist ('not', optional): Whether it should or should not exist.
|
||||
Fails if the file should exist and does not, or vice versa.
|
||||
"""
|
||||
if should_not_exist is None:
|
||||
assert os.path.exists(file_name), file_name + " does not exist"
|
||||
else:
|
||||
assert not os.path.exists(file_name), file_name + " exists"
|
@@ -1,460 +0,0 @@
|
||||
# Copyright (C) 2011-2014 Internet Systems Consortium.
|
||||
#
|
||||
# Permission to use, copy, modify, and distribute this software for any
|
||||
# purpose with or without fee is hereby granted, provided that the above
|
||||
# copyright notice and this permission notice appear in all copies.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
|
||||
# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
|
||||
# INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
|
||||
# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
#
|
||||
# This is the 'terrain' in which the lettuce lives. By convention, this is
|
||||
# where global setup and teardown is defined.
|
||||
#
|
||||
# We declare some attributes of the global 'world' variables here, so the
|
||||
# tests can safely assume they are present.
|
||||
#
|
||||
# We also use it to provide scenario invariants, such as resetting data.
|
||||
#
|
||||
|
||||
from lettuce import *
|
||||
import subprocess
|
||||
import os
|
||||
import shutil
|
||||
import re
|
||||
import sys
|
||||
import time
|
||||
|
||||
# lettuce cannot directly pass commands to the terrain, so we need to
|
||||
# use environment variables to influence behaviour
|
||||
KEEP_OUTPUT = 'LETTUCE_KEEP_OUTPUT'
|
||||
|
||||
# In order to make sure we start all tests with a 'clean' environment,
|
||||
# We perform a number of initialization steps, like restoring configuration
|
||||
# files, and removing generated data files.
|
||||
|
||||
# This approach may not scale; if so we should probably provide specific
|
||||
# initialization steps for scenarios. But until that is shown to be a problem,
|
||||
# It will keep the scenarios cleaner.
|
||||
|
||||
# This is a list of files that are freshly copied before each scenario
|
||||
# The first element is the original, the second is the target that will be
|
||||
# used by the tests that need them
|
||||
copylist = [
|
||||
["configurations/bindctl_commands.config.orig",
|
||||
"configurations/bindctl_commands.config"],
|
||||
["configurations/example.org.config.orig",
|
||||
"configurations/example.org.config"],
|
||||
["configurations/generate.config.orig",
|
||||
"configurations/generate.config"],
|
||||
["configurations/bindctl/bindctl.config.orig",
|
||||
"configurations/bindctl/bindctl.config"],
|
||||
["configurations/auth/auth_basic.config.orig",
|
||||
"configurations/auth/auth_basic.config"],
|
||||
["configurations/auth/auth_badzone.config.orig",
|
||||
"configurations/auth/auth_badzone.config"],
|
||||
["configurations/resolver/resolver_basic.config.orig",
|
||||
"configurations/resolver/resolver_basic.config"],
|
||||
["configurations/multi_instance/multi_auth.config.orig",
|
||||
"configurations/multi_instance/multi_auth.config"],
|
||||
["configurations/ddns/ddns.config.orig",
|
||||
"configurations/ddns/ddns.config"],
|
||||
["configurations/ddns/noddns.config.orig",
|
||||
"configurations/ddns/noddns.config"],
|
||||
["configurations/xfrin/retransfer_master.conf.orig",
|
||||
"configurations/xfrin/retransfer_master.conf"],
|
||||
["configurations/xfrin/retransfer_master_v4.conf.orig",
|
||||
"configurations/xfrin/retransfer_master_v4.conf"],
|
||||
["configurations/xfrin/retransfer_master_nons.conf.orig",
|
||||
"configurations/xfrin/retransfer_master_nons.conf"],
|
||||
["configurations/xfrin/retransfer_slave.conf.orig",
|
||||
"configurations/xfrin/retransfer_slave.conf"],
|
||||
["configurations/xfrin/retransfer_slave_notify.conf.orig",
|
||||
"configurations/xfrin/retransfer_slave_notify.conf"],
|
||||
["configurations/root.config.orig",
|
||||
"configurations/root.config"],
|
||||
["configurations/static.config.orig",
|
||||
"configurations/static.config"],
|
||||
["data/inmem-xfrin.sqlite3.orig",
|
||||
"data/inmem-xfrin.sqlite3"],
|
||||
["data/root.sqlite3.orig",
|
||||
"data/root.sqlite3"],
|
||||
["data/xfrin-before-diffs.sqlite3.orig",
|
||||
"data/xfrin-before-diffs.sqlite3"],
|
||||
["data/xfrin-notify.sqlite3.orig",
|
||||
"data/xfrin-notify.sqlite3"],
|
||||
["data/ddns/example.org.sqlite3.orig",
|
||||
"data/ddns/example.org.sqlite3"],
|
||||
["data/empty_db.sqlite3",
|
||||
"data/xfrout.sqlite3"]
|
||||
]
|
||||
|
||||
# This is a list of files that, if present, will be removed before a scenario
|
||||
removelist = [
|
||||
"data/test_nonexistent_db.sqlite3"
|
||||
]
|
||||
|
||||
# When waiting for output data of a running process, use OUTPUT_WAIT_INTERVAL
|
||||
# as the interval in which to check again if it has not been found yet.
|
||||
# If we have waited OUTPUT_WAIT_MAX_INTERVALS times, we will abort with an
|
||||
# error (so as not to hang indefinitely)
|
||||
OUTPUT_WAIT_INTERVAL = 0.5
|
||||
OUTPUT_WAIT_MAX_INTERVALS = 120
|
||||
|
||||
# class that keeps track of one running process and the files
|
||||
# we created for it.
|
||||
class RunningProcess:
|
||||
def __init__(self, step, process_name, args):
|
||||
# set it to none first so destructor won't error if initializer did
|
||||
"""
|
||||
Initialize the long-running process structure, and start the process.
|
||||
Parameters:
|
||||
step: The scenario step it was called from. This is used for
|
||||
determining the output files for redirection of stdout
|
||||
and stderr.
|
||||
process_name: The name to refer to this running process later.
|
||||
args: Array of arguments to pass to Popen().
|
||||
"""
|
||||
self.process = None
|
||||
self.step = step
|
||||
self.process_name = process_name
|
||||
self.remove_files_on_exit = (os.environ.get(KEEP_OUTPUT) != '1')
|
||||
self._check_output_dir()
|
||||
self._create_filenames()
|
||||
self._start_process(args)
|
||||
|
||||
# used in _wait_for_output_str, map from (filename, (strings))
|
||||
# to a file offset.
|
||||
self.__file_offsets = {}
|
||||
|
||||
def _start_process(self, args):
|
||||
"""
|
||||
Start the process.
|
||||
Parameters:
|
||||
args:
|
||||
Array of arguments to pass to Popen().
|
||||
"""
|
||||
stderr_write = open(self.stderr_filename, "w")
|
||||
stdout_write = open(self.stdout_filename, "w")
|
||||
self.process = subprocess.Popen(args, 0, None, subprocess.PIPE,
|
||||
stdout_write, stderr_write)
|
||||
# open them again, this time for reading
|
||||
self.stderr = open(self.stderr_filename, "r")
|
||||
self.stdout = open(self.stdout_filename, "r")
|
||||
|
||||
def mangle_filename(self, filebase, extension):
|
||||
"""
|
||||
Remove whitespace and non-default characters from a base string,
|
||||
and return the substituted value. Whitespace is replaced by an
|
||||
underscore. Any other character that is not an ASCII letter, a
|
||||
number, a dot, or a hyphen or underscore is removed.
|
||||
Parameter:
|
||||
filebase: The string to perform the substitution and removal on
|
||||
extension: An extension to append to the result value
|
||||
Returns the modified filebase with the given extension
|
||||
"""
|
||||
filebase = re.sub("\s+", "_", filebase)
|
||||
filebase = re.sub("[^a-zA-Z0-9.\-_]", "", filebase)
|
||||
return filebase + "." + extension
|
||||
|
||||
def _check_output_dir(self):
|
||||
# We may want to make this overridable by the user, perhaps
|
||||
# through an environment variable. Since we currently expect
|
||||
# lettuce to be run from our lettuce dir, we shall just use
|
||||
# the relative path 'output/'
|
||||
"""
|
||||
Make sure the output directory for stdout/stderr redirection
|
||||
exists.
|
||||
Fails if it exists but is not a directory, or if it does not
|
||||
and we are unable to create it.
|
||||
"""
|
||||
self._output_dir = os.getcwd() + os.sep + "output"
|
||||
if not os.path.exists(self._output_dir):
|
||||
os.mkdir(self._output_dir)
|
||||
assert os.path.isdir(self._output_dir),\
|
||||
self._output_dir + " is not a directory."
|
||||
|
||||
def _create_filenames(self):
|
||||
"""
|
||||
Derive the filenames for stdout/stderr redirection from the
|
||||
feature, scenario, and process name. The base will be
|
||||
"<Feature>-<Scenario>-<process name>.[stdout|stderr]"
|
||||
"""
|
||||
filebase = self.step.scenario.feature.name + "-" +\
|
||||
self.step.scenario.name + "-" + self.process_name
|
||||
self.stderr_filename = self._output_dir + os.sep +\
|
||||
self.mangle_filename(filebase, "stderr")
|
||||
self.stdout_filename = self._output_dir + os.sep +\
|
||||
self.mangle_filename(filebase, "stdout")
|
||||
|
||||
def stop_process(self):
|
||||
"""
|
||||
Stop this process by calling terminate(). Blocks until process has
|
||||
exited. If remove_files_on_exit is True, redirected output files
|
||||
are removed.
|
||||
"""
|
||||
if self.process is not None:
|
||||
self.process.terminate()
|
||||
self.process.wait()
|
||||
self.process = None
|
||||
if self.remove_files_on_exit:
|
||||
self._remove_files()
|
||||
|
||||
def _remove_files(self):
|
||||
"""
|
||||
Remove the files created for redirection of stdout/stderr output.
|
||||
"""
|
||||
os.remove(self.stderr_filename)
|
||||
os.remove(self.stdout_filename)
|
||||
|
||||
def _wait_for_output_str(self, filename, running_file, strings, only_new,
|
||||
matches=1):
|
||||
"""
|
||||
Wait for a line of output in this process. This will (if
|
||||
only_new is False) check all output from the process including
|
||||
that may have been checked before. If only_new is True, it
|
||||
only checks output that has not been covered in previous calls
|
||||
to this method for the file (if there was no such previous call to
|
||||
this method, it works same as the case of only_new=False).
|
||||
|
||||
Care should be taken if only_new is to be set to True, as it may cause
|
||||
counter-intuitive results. For example, assume the file is expected
|
||||
to contain a line that has XXX and another line has YYY, but the
|
||||
ordering is not predictable. If this method is called with XXX as
|
||||
the search string, but the line containing YYY appears before the
|
||||
target line, this method remembers the point in the file beyond
|
||||
the line that has XXX. If a next call to this method specifies
|
||||
YYY as the search string with only_new being True, the search will
|
||||
fail. If the same string is expected to appear multiple times
|
||||
and you want to catch the latest one, a more reliable way is to
|
||||
specify the match number and set only_new to False, if the number
|
||||
of matches is predictable.
|
||||
|
||||
For each line in the output, the given strings array is checked. If
|
||||
any output lines checked contains one of the strings in the strings
|
||||
array, that string (not the line!) is returned.
|
||||
Parameters:
|
||||
filename: The filename to read previous output from, if applicable.
|
||||
running_file: The open file to read new output from.
|
||||
strings: Array of strings to look for.
|
||||
only_new: See above.
|
||||
matches: Check for the string this many times.
|
||||
Returns a tuple containing the matched string, and the complete line
|
||||
it was found in.
|
||||
Fails if none of the strings was read after 10 seconds
|
||||
(OUTPUT_WAIT_INTERVAL * OUTPUT_WAIT_MAX_INTERVALS).
|
||||
"""
|
||||
# Identify the start offset of search. if only_new=True, start from
|
||||
# the farthest point we've reached in the file; otherwise start from
|
||||
# the beginning.
|
||||
if not filename in self.__file_offsets:
|
||||
self.__file_offsets[filename] = 0
|
||||
offset = self.__file_offsets[filename] if only_new else 0
|
||||
running_file.seek(offset)
|
||||
|
||||
match_count = 0
|
||||
wait_count = 0
|
||||
while wait_count < OUTPUT_WAIT_MAX_INTERVALS:
|
||||
line = running_file.readline()
|
||||
where = running_file.tell()
|
||||
if line:
|
||||
for string in strings:
|
||||
if line.find(string) != -1:
|
||||
match_count += 1
|
||||
if match_count >= matches:
|
||||
# If we've gone further, update the recorded offset
|
||||
if where > self.__file_offsets[filename]:
|
||||
self.__file_offsets[filename] = where
|
||||
return (string, line)
|
||||
else:
|
||||
wait_count += 1
|
||||
time.sleep(OUTPUT_WAIT_INTERVAL)
|
||||
running_file.seek(where)
|
||||
assert False, "Timeout waiting for process output: " + str(strings)
|
||||
|
||||
def wait_for_stderr_str(self, strings, only_new = True, matches = 1):
|
||||
"""
|
||||
Wait for one of the given strings in this process's stderr output.
|
||||
Parameters:
|
||||
strings: Array of strings to look for.
|
||||
only_new: See _wait_for_output_str.
|
||||
matches: Check for the string this many times.
|
||||
Returns a tuple containing the matched string, and the complete line
|
||||
it was found in.
|
||||
Fails if none of the strings was read after 10 seconds
|
||||
(OUTPUT_WAIT_INTERVAL * OUTPUT_WAIT_MAX_INTERVALS).
|
||||
"""
|
||||
return self._wait_for_output_str(self.stderr_filename, self.stderr,
|
||||
strings, only_new, matches)
|
||||
|
||||
def wait_for_stdout_str(self, strings, only_new = True, matches = 1):
|
||||
"""
|
||||
Wait for one of the given strings in this process's stdout output.
|
||||
Parameters:
|
||||
strings: Array of strings to look for.
|
||||
only_new: See _wait_for_output_str.
|
||||
matches: Check for the string this many times.
|
||||
Returns a tuple containing the matched string, and the complete line
|
||||
it was found in.
|
||||
Fails if none of the strings was read after 10 seconds
|
||||
(OUTPUT_WAIT_INTERVAL * OUTPUT_WAIT_MAX_INTERVALS).
|
||||
"""
|
||||
return self._wait_for_output_str(self.stdout_filename, self.stdout,
|
||||
strings, only_new, matches)
|
||||
|
||||
# Container class for a number of running processes
|
||||
# i.e. servers like bind10, etc
|
||||
# one-shot programs like dig or bindctl are started and closed separately
|
||||
class RunningProcesses:
|
||||
def __init__(self):
|
||||
"""
|
||||
Initialize with no running processes.
|
||||
"""
|
||||
self.processes = {}
|
||||
|
||||
def add_process(self, step, process_name, args):
|
||||
"""
|
||||
Start a process with the given arguments, and store it under the given
|
||||
name.
|
||||
Parameters:
|
||||
step: The scenario step it was called from. This is used for
|
||||
determining the output files for redirection of stdout
|
||||
and stderr.
|
||||
process_name: The name to refer to this running process later.
|
||||
args: Array of arguments to pass to Popen().
|
||||
Fails if a process with the given name is already running.
|
||||
"""
|
||||
assert process_name not in self.processes,\
|
||||
"Process " + process_name + " already running"
|
||||
self.processes[process_name] = RunningProcess(step, process_name, args)
|
||||
|
||||
def get_process(self, process_name):
|
||||
"""
|
||||
Return the Process with the given process name.
|
||||
Parameters:
|
||||
process_name: The name of the process to return.
|
||||
Fails if the process is not running.
|
||||
"""
|
||||
assert process_name in self.processes,\
|
||||
"Process " + name + " unknown"
|
||||
return self.processes[process_name]
|
||||
|
||||
def stop_process(self, process_name):
|
||||
"""
|
||||
Stop the Process with the given process name.
|
||||
Parameters:
|
||||
process_name: The name of the process to return.
|
||||
Fails if the process is not running.
|
||||
"""
|
||||
assert process_name in self.processes,\
|
||||
"Process " + name + " unknown"
|
||||
self.processes[process_name].stop_process()
|
||||
del self.processes[process_name]
|
||||
|
||||
def stop_all_processes(self):
|
||||
"""
|
||||
Stop all running processes.
|
||||
"""
|
||||
for process in self.processes.values():
|
||||
process.stop_process()
|
||||
|
||||
def keep_files(self):
|
||||
"""
|
||||
Keep the redirection files for stdout/stderr output of all processes
|
||||
instead of removing them when they are stopped later.
|
||||
"""
|
||||
for process in self.processes.values():
|
||||
process.remove_files_on_exit = False
|
||||
|
||||
def wait_for_stderr_str(self, process_name, strings, only_new = True, matches = 1):
|
||||
"""
|
||||
Wait for one of the given strings in the given process's stderr output.
|
||||
Parameters:
|
||||
process_name: The name of the process to check the stderr output of.
|
||||
strings: Array of strings to look for.
|
||||
only_new: See _wait_for_output_str.
|
||||
matches: Check for the string this many times.
|
||||
Returns the matched string.
|
||||
Fails if none of the strings was read after 10 seconds
|
||||
(OUTPUT_WAIT_INTERVAL * OUTPUT_WAIT_MAX_INTERVALS).
|
||||
Fails if the process is unknown.
|
||||
"""
|
||||
assert process_name in self.processes,\
|
||||
"Process " + process_name + " unknown"
|
||||
return self.processes[process_name].wait_for_stderr_str(strings,
|
||||
only_new,
|
||||
matches)
|
||||
|
||||
def wait_for_stdout_str(self, process_name, strings, only_new = True, matches = 1):
|
||||
"""
|
||||
Wait for one of the given strings in the given process's stdout output.
|
||||
Parameters:
|
||||
process_name: The name of the process to check the stdout output of.
|
||||
strings: Array of strings to look for.
|
||||
only_new: See _wait_for_output_str.
|
||||
matches: Check for the string this many times.
|
||||
Returns the matched string.
|
||||
Fails if none of the strings was read after 10 seconds
|
||||
(OUTPUT_WAIT_INTERVAL * OUTPUT_WAIT_MAX_INTERVALS).
|
||||
Fails if the process is unknown.
|
||||
"""
|
||||
assert process_name in self.processes,\
|
||||
"Process " + process_name + " unknown"
|
||||
return self.processes[process_name].wait_for_stdout_str(strings,
|
||||
only_new,
|
||||
matches)
|
||||
|
||||
@before.each_scenario
|
||||
def initialize(scenario):
|
||||
"""
|
||||
Global initialization for each scenario.
|
||||
"""
|
||||
# Keep track of running processes
|
||||
world.processes = RunningProcesses()
|
||||
|
||||
# Convenience variable to access the last query result from querying.py
|
||||
world.last_query_result = None
|
||||
|
||||
# Convenience variable to access the last HTTP response from http.py
|
||||
world.last_http_response = None
|
||||
|
||||
# For slightly better errors, initialize a process_pids for the relevant
|
||||
# steps
|
||||
world.process_pids = None
|
||||
|
||||
# Some tests can modify the settings. If the tests fail half-way, or
|
||||
# don't clean up, this can leave configurations or data in a bad state,
|
||||
# so we copy them from originals before each scenario
|
||||
for item in copylist:
|
||||
shutil.copy(item[0], item[1])
|
||||
|
||||
for item in removelist:
|
||||
if os.path.exists(item):
|
||||
os.remove(item)
|
||||
|
||||
@after.each_scenario
|
||||
def cleanup(scenario):
|
||||
"""
|
||||
Global cleanup for each scenario.
|
||||
"""
|
||||
# Keep output files if the scenario failed
|
||||
if not scenario.passed:
|
||||
world.processes.keep_files()
|
||||
# Stop any running processes we may have had around
|
||||
world.processes.stop_all_processes()
|
||||
|
||||
# Environment check
|
||||
# Checks if LETTUCE_SETUP_COMPLETED is set in the environment
|
||||
# If not, abort with an error to use the run-script
|
||||
if 'LETTUCE_SETUP_COMPLETED' not in os.environ:
|
||||
print("Environment check failure; LETTUCE_SETUP_COMPLETED not set")
|
||||
print("Please use the run_lettuce.sh script. If you want to test an")
|
||||
print("installed version of bind10 with these tests, use")
|
||||
print("run_lettuce.sh -I [lettuce arguments]")
|
||||
sys.exit(1)
|
@@ -1,195 +0,0 @@
|
||||
# Copyright (C) 2011 Internet Systems Consortium.
|
||||
#
|
||||
# Permission to use, copy, modify, and distribute this software for any
|
||||
# purpose with or without fee is hereby granted, provided that the above
|
||||
# copyright notice and this permission notice appear in all copies.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
|
||||
# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
|
||||
# INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
|
||||
# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
# This script provides transfer (ixfr/axfr) test functionality
|
||||
# It provides steps to perform the client side of a transfer,
|
||||
# and inspect the results.
|
||||
#
|
||||
# Like querying.py, it uses dig to do the transfers, and
|
||||
# places its output in a result structure. It also uses a custom client
|
||||
# implementation for less normal operations.
|
||||
#
|
||||
# This is done in a different file with different steps than
|
||||
# querying, because the format of dig's output is
|
||||
# very different than that of normal queries
|
||||
|
||||
from lettuce import *
|
||||
import subprocess
|
||||
import re
|
||||
|
||||
class TransferResult(object):
|
||||
"""This object stores transfer results, which is essentially simply
|
||||
a list of RR strings. These are stored, as read from dig's output,
|
||||
in the list 'records'. So for an IXFR transfer it contains
|
||||
the exact result as returned by the server.
|
||||
If this list is empty, the transfer failed for some reason (dig
|
||||
does not really show error results well, unfortunately).
|
||||
We may add some smarter inspection functionality to this class
|
||||
later.
|
||||
"""
|
||||
def __init__(self, args):
|
||||
"""Perform the transfer by calling dig, and store the results.
|
||||
args is the array of arguments to pass to Popen(), this
|
||||
is passed as is since for IXFR and AXFR there can be very
|
||||
different options"""
|
||||
self.records = []
|
||||
|
||||
# Technically, using a pipe here can fail; since we don't expect
|
||||
# large output right now, this works, but should we get a test
|
||||
# where we do have a lot of output, this could block, and we will
|
||||
# need to read the output in a different way.
|
||||
dig_process = subprocess.Popen(args, 1, None, None, subprocess.PIPE,
|
||||
None)
|
||||
result = dig_process.wait()
|
||||
assert result == 0
|
||||
for l in dig_process.stdout:
|
||||
line = l.strip()
|
||||
if len(line) > 0 and line[0] != ';':
|
||||
self.records.append(line)
|
||||
|
||||
def parse_addr_port(address, port):
|
||||
if address is None:
|
||||
address = "::1" # default address
|
||||
# convert [IPv6_addr] to IPv6_addr:
|
||||
address = re.sub(r"\[(.+)\]", r"\1", address)
|
||||
if port is None:
|
||||
port = 56176 # default port
|
||||
return (address, port)
|
||||
|
||||
@step('An AXFR transfer of ([\w.]+)(?: from ([\d.]+|\[[0-9a-fA-F:]+\])(?::([0-9]+))?)?')
|
||||
def perform_axfr(step, zone_name, address, port):
|
||||
"""
|
||||
Perform an AXFR transfer, and store the result as an instance of
|
||||
TransferResult in world.transfer_result.
|
||||
|
||||
Step definition:
|
||||
An AXFR transfer of <zone_name> [from <address>:<port>]
|
||||
|
||||
Address defaults to ::1
|
||||
Port defaults to 56176
|
||||
"""
|
||||
(address, port) = parse_addr_port(address, port)
|
||||
args = [ 'dig', 'AXFR', '@' + str(address), '-p', str(port), zone_name ]
|
||||
world.transfer_result = TransferResult(args)
|
||||
|
||||
@step('A customized AXFR transfer of ([\w.]+)(?: from ([\d.]+|\[[0-9a-fA-F:]+\])(?::([0-9]+))?)?(?: with pause of (\d+) seconds?)?')
|
||||
def perform_custom_axfr(step, zone_name, address, port, delay):
|
||||
"""Checks AXFR transfer, and store the result in the form of internal
|
||||
CustomTransferResult class, which is compatible with TransferResult.
|
||||
|
||||
Step definition:
|
||||
A customized AXFR transfer of <zone_name> [from <address>:<port>] [with pause of <delay> second]
|
||||
|
||||
If optional delay is specified (not None), it waits for the specified
|
||||
seconds after sending the AXFR query before starting receiving
|
||||
responses. This emulates a slower AXFR client.
|
||||
|
||||
"""
|
||||
|
||||
class CustomTransferResult:
|
||||
"""Store transfer result only on the number of received answer RRs.
|
||||
|
||||
To be compatible with TransferResult it stores the result in the
|
||||
'records' attribute, which is a list. But its content is
|
||||
meaningless; its only use is to be used with
|
||||
check_transfer_result_count where its length is of concern.
|
||||
|
||||
"""
|
||||
def __init__(self):
|
||||
self.records = []
|
||||
|
||||
# Build arguments and run xfr-client.py. On success, it simply dumps
|
||||
# the number of received answer RRs to stdout.
|
||||
(address, port) = parse_addr_port(address, port)
|
||||
args = ['/bin/sh', 'run_python-tool.sh', 'tools/xfr-client.py',
|
||||
'-s', address, '-p', str(port)]
|
||||
if delay is not None:
|
||||
args.extend(['-d', delay])
|
||||
args.append(zone_name)
|
||||
client = subprocess.Popen(args, 1, None, None, subprocess.PIPE,
|
||||
subprocess.PIPE)
|
||||
(stdout, stderr) = client.communicate()
|
||||
result = client.returncode
|
||||
world.last_client_stdout = stdout
|
||||
world.last_client_stderr = stderr
|
||||
assert result == 0, "xfr-client exit code: " + str(result) +\
|
||||
"\nstdout:\n" + str(stdout) +\
|
||||
"stderr:\n" + str(stderr)
|
||||
num_rrs = int(stdout.strip())
|
||||
|
||||
# Make the result object, storing dummy value (None) for the number of
|
||||
# answer RRs in the records list.
|
||||
world.transfer_result = CustomTransferResult()
|
||||
world.transfer_result.records = [None for _ in range(0, num_rrs)]
|
||||
|
||||
@step('An IXFR transfer of ([\w.]+) (\d+)(?: from ([^:]+)(?::([0-9]+))?)?(?: over (tcp|udp))?')
|
||||
def perform_ixfr(step, zone_name, serial, address, port, protocol):
|
||||
"""
|
||||
Perform an IXFR transfer, and store the result as an instance of
|
||||
TransferResult in world.transfer_result.
|
||||
|
||||
Step definition:
|
||||
An IXFR transfer of <zone_name> <serial> [from <address>:port] [over <tcp|udp>]
|
||||
|
||||
Address defaults to 127.0.0.1
|
||||
Port defaults to 56176
|
||||
If either tcp or udp is specified, only this protocol will be used.
|
||||
"""
|
||||
if address is None:
|
||||
address = "127.0.0.1"
|
||||
if port is None:
|
||||
port = 56176
|
||||
args = [ 'dig', 'IXFR=' + str(serial), '@' + str(address), '-p', str(port), zone_name ]
|
||||
if protocol is not None:
|
||||
assert protocol == 'tcp' or protocol == 'udp', "Unknown protocol: " + protocol
|
||||
if protocol == 'tcp':
|
||||
args.append('+tcp')
|
||||
elif protocol == 'udp':
|
||||
args.append('+notcp')
|
||||
world.transfer_result = TransferResult(args)
|
||||
|
||||
@step('transfer result should have (\d+) rrs?')
|
||||
def check_transfer_result_count(step, number_of_rrs):
|
||||
"""
|
||||
Check the number of rrs in the transfer result object created by
|
||||
the AXFR transfer or IXFR transfer step.
|
||||
|
||||
Step definition:
|
||||
transfer result should have <number> rr[s]
|
||||
|
||||
Fails if the number of RRs is not equal to number
|
||||
"""
|
||||
assert int(number_of_rrs) == len(world.transfer_result.records),\
|
||||
"Got " + str(len(world.transfer_result.records)) +\
|
||||
" records, expected " + str(number_of_rrs)
|
||||
|
||||
@step('full result of the last transfer should be')
|
||||
def check_full_transfer_result(step):
|
||||
"""
|
||||
Check the complete output from the last transfer call.
|
||||
|
||||
Step definition:
|
||||
full result of the last transfer should be <multiline value>
|
||||
|
||||
Whitespace is normalized in both the multiline value and the
|
||||
output, but the order of the output is not.
|
||||
Fails if there is any difference between the two. Prints
|
||||
full output and expected value upon failure.
|
||||
"""
|
||||
records_string = "\n".join(world.transfer_result.records)
|
||||
records_string = re.sub("[ \t]+", " ", records_string)
|
||||
expect = re.sub("[ \t]+", " ", step.multiline)
|
||||
assert records_string.strip() == expect.strip(),\
|
||||
"Got:\n'" + records_string + "'\nExpected:\n'" + expect + "'"
|
@@ -1,204 +0,0 @@
|
||||
Feature: Xfrin
|
||||
Tests for Xfrin, specific for BIND 10 behaviour.
|
||||
|
||||
Scenario: Retransfer command
|
||||
# Standard check to test (non-)existence of a file.
|
||||
# This file is actually automatically created.
|
||||
The file data/test_nonexistent_db.sqlite3 should not exist
|
||||
|
||||
Given I have bind10 running with configuration xfrin/retransfer_master.conf with cmdctl port 56174 as master
|
||||
And wait for master stderr message BIND10_STARTED_CC
|
||||
And wait for master stderr message CMDCTL_STARTED
|
||||
And wait for master stderr message AUTH_SERVER_STARTED
|
||||
And wait for master stderr message XFROUT_STARTED
|
||||
And wait for master stderr message ZONEMGR_STARTED
|
||||
|
||||
And I have bind10 running with configuration xfrin/retransfer_slave.conf
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message XFRIN_STARTED
|
||||
And wait for bind10 stderr message ZONEMGR_STARTED
|
||||
|
||||
# Now we use the first step again to see if the file has been created.
|
||||
# The DB currently doesn't know anything about the zone, so we install
|
||||
# an empty zone for xfrin.
|
||||
The file data/test_nonexistent_db.sqlite3 should exist
|
||||
A query for www.example.org to [::1]:56176 should have rcode REFUSED
|
||||
Then make empty zone example.org in DB file data/test_nonexistent_db.sqlite3
|
||||
|
||||
When I send bind10 the command Xfrin retransfer example.org IN ::1 56177
|
||||
# The data we receive contain a NS RRset that refers to three names in the
|
||||
# example.org. zone. All these three are nonexistent in the data, producing
|
||||
# 3 separate warning messages in the log.
|
||||
And wait for new bind10 stderr message XFRIN_ZONE_WARN
|
||||
And wait for new bind10 stderr message XFRIN_ZONE_WARN
|
||||
And wait for new bind10 stderr message XFRIN_ZONE_WARN
|
||||
# But after complaining, the zone data should be accepted.
|
||||
Then wait for new bind10 stderr message XFRIN_TRANSFER_SUCCESS not XFRIN_XFR_PROCESS_FAILURE
|
||||
# there's no guarantee this is logged before XFRIN_TRANSFER_SUCCESS, so
|
||||
# we can't reliably use 'wait for new'. In this case this should be the
|
||||
# only occurrence of this message, so this should be okay.
|
||||
Then wait for bind10 stderr message ZONEMGR_RECEIVE_XFRIN_SUCCESS
|
||||
A query for www.example.org to [::1]:56176 should have rcode NOERROR
|
||||
|
||||
# The transferred zone should have 11 non-NSEC3 RRs and 1 NSEC3 RR.
|
||||
# The following check will get these by AXFR, so the total # of RRs
|
||||
# should be 13, counting the duplicated SOA.
|
||||
# At this point we can confirm both in and out of AXFR for a zone
|
||||
# containing an NSEC3 RR.
|
||||
# We don't have to specify the address/port here; the defaults will work.
|
||||
When I do an AXFR transfer of example.org
|
||||
Then transfer result should have 13 rrs
|
||||
|
||||
# Now try to offer another update. However, the validation of
|
||||
# data should fail. The old version shoud still be available.
|
||||
When I send bind10 the following commands with cmdctl port 56174:
|
||||
"""
|
||||
config set data_sources/classes/IN[0]/params/database_file data/example.org-nons.sqlite3
|
||||
config set Auth/database_file data/example.org-nons.sqlite3
|
||||
config commit
|
||||
"""
|
||||
Then I send bind10 the command Xfrin retransfer example.org IN ::1 56177
|
||||
And wait for new bind10 stderr message XFRIN_ZONE_INVALID
|
||||
And wait for new bind10 stderr message XFRIN_INVALID_ZONE_DATA
|
||||
# We can't use 'wait for new' here; see above.
|
||||
Then wait for bind10 stderr message ZONEMGR_RECEIVE_XFRIN_FAILED
|
||||
A query for example.org type NS to [::1]:56176 should have rcode NOERROR
|
||||
And transfer result should have 13 rrs
|
||||
|
||||
Scenario: Transfer with TSIG
|
||||
# Similar setup to the test above, but this time, we add TSIG configuration
|
||||
|
||||
# In order to check that the tests don't give false positives because config
|
||||
# happens to be right (like no TSIG on either side), we take an existing
|
||||
# non-TSIG config, add TSIG on the master side, see it fail, add TSIG
|
||||
# on the slave side, then check again.
|
||||
|
||||
Given I have bind10 running with configuration xfrin/retransfer_master.conf with cmdctl port 56174 as master
|
||||
And wait for master stderr message AUTH_SERVER_STARTED
|
||||
And wait for master stderr message XFROUT_STARTED
|
||||
|
||||
And I have bind10 running with configuration xfrin/retransfer_slave.conf
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message XFRIN_STARTED
|
||||
|
||||
# For xfrin make the data source aware of the zone (with empty data)
|
||||
Then make empty zone example.org in DB file data/test_nonexistent_db.sqlite3
|
||||
|
||||
# Set slave config for 'automatic' xfrin
|
||||
When I set bind10 configuration Xfrin/zones to [{"master_port": 56176, "name": "example.org", "master_addr": "::1"}]
|
||||
|
||||
# Make sure it is fully open
|
||||
When I send bind10 the command Xfrin retransfer example.org
|
||||
Then wait for new bind10 stderr message XFRIN_TRANSFER_SUCCESS not XFRIN_XFR_PROCESS_FAILURE
|
||||
# this can't be 'wait for new'; see above.
|
||||
And wait for bind10 stderr message ZONEMGR_RECEIVE_XFRIN_SUCCESS
|
||||
|
||||
# First to master, a transfer should then fail
|
||||
When I send bind10 the following commands with cmdctl port 56174:
|
||||
"""
|
||||
config add tsig_keys/keys "example.key.:c2VjcmV0"
|
||||
config set Xfrout/zone_config[0]/transfer_acl [{"action": "ACCEPT", "from": "::1", "key": "example.key."}]
|
||||
config commit
|
||||
"""
|
||||
|
||||
# Transfer should fail
|
||||
When I send bind10 the command Xfrin retransfer example.org
|
||||
Then wait for new bind10 stderr message XFRIN_XFR_TRANSFER_PROTOCOL_VIOLATION not XFRIN_TRANSFER_SUCCESS
|
||||
# Set client to use TSIG as well
|
||||
When I send bind10 the following commands:
|
||||
"""
|
||||
config add tsig_keys/keys "example.key.:c2VjcmV0"
|
||||
config set Xfrin/zones[0]/tsig_key "example.key."
|
||||
config commit
|
||||
"""
|
||||
|
||||
# Transwer should succeed now
|
||||
When I send bind10 the command Xfrin retransfer example.org
|
||||
Then wait for new bind10 stderr message XFRIN_TRANSFER_SUCCESS not XFRIN_XFR_PROCESS_FAILURE
|
||||
|
||||
Scenario: Validation fails
|
||||
# In this test, the source data of the XFR is invalid (missing NS record
|
||||
# at the origin). We check it is rejected after the transfer.
|
||||
#
|
||||
# We use abuse the fact that we do not check data when we read it from
|
||||
# the sqlite3 database (unless we load into in-memory, which we don't
|
||||
# do here).
|
||||
The file data/test_nonexistent_db.sqlite3 should not exist
|
||||
|
||||
Given I have bind10 running with configuration xfrin/retransfer_master_nons.conf with cmdctl port 56174 as master
|
||||
And wait for master stderr message BIND10_STARTED_CC
|
||||
And wait for master stderr message CMDCTL_STARTED
|
||||
And wait for master stderr message AUTH_SERVER_STARTED
|
||||
And wait for master stderr message XFROUT_STARTED
|
||||
And wait for master stderr message ZONEMGR_STARTED
|
||||
|
||||
And I have bind10 running with configuration xfrin/retransfer_slave.conf
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message XFRIN_STARTED
|
||||
And wait for bind10 stderr message ZONEMGR_STARTED
|
||||
|
||||
# Now we use the first step again to see if the file has been created,
|
||||
# then install empty zone data
|
||||
The file data/test_nonexistent_db.sqlite3 should exist
|
||||
A query for www.example.org to [::1]:56176 should have rcode REFUSED
|
||||
Then make empty zone example.org in DB file data/test_nonexistent_db.sqlite3
|
||||
|
||||
When I send bind10 the command Xfrin retransfer example.org IN ::1 56177
|
||||
# It should complain once about invalid data, then again that the whole
|
||||
# zone is invalid and then reject it.
|
||||
And wait for new bind10 stderr message XFRIN_ZONE_INVALID
|
||||
And wait for new bind10 stderr message XFRIN_INVALID_ZONE_DATA
|
||||
# This can't be 'wait for new'
|
||||
Then wait for bind10 stderr message ZONEMGR_RECEIVE_XFRIN_FAILED
|
||||
# The zone still doesn't exist as it is rejected.
|
||||
# FIXME: This step fails. Probably an empty zone is created in the data
|
||||
# source :-|. This should be REFUSED, not SERVFAIL.
|
||||
A query for www.example.org to [::1]:56176 should have rcode SERVFAIL
|
||||
|
||||
# TODO:
|
||||
# * IXFR - generate an sqlite db that contains the journal. Check it was
|
||||
# IXFR by logs.
|
||||
# * IXFR->AXFR fallback if IXFR is not available (even rejected or
|
||||
# something, not just the differences missing).
|
||||
# * Retransfer with short refresh time (without notify).
|
||||
Scenario: With differences
|
||||
# We transfer from one bind10 to other, just like in the Retransfer command
|
||||
# scenario. Just this time, the master contains the differences table
|
||||
# and the slave has a previous version of the zone, so we use the IXFR.
|
||||
|
||||
Given I have bind10 running with configuration xfrin/retransfer_master_diffs.conf with cmdctl port 56174 as master
|
||||
And wait for master stderr message BIND10_STARTED_CC
|
||||
And wait for master stderr message CMDCTL_STARTED
|
||||
And wait for master stderr message AUTH_SERVER_STARTED
|
||||
And wait for master stderr message XFROUT_STARTED
|
||||
And wait for master stderr message ZONEMGR_STARTED
|
||||
|
||||
And I have bind10 running with configuration xfrin/retransfer_slave_diffs.conf
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message XFRIN_STARTED
|
||||
And wait for bind10 stderr message ZONEMGR_STARTED
|
||||
|
||||
A query for example. type SOA to [::1]:56176 should have rcode NOERROR
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
example. 3600 IN SOA ns1.example. hostmaster.example. 94 3600 900 7200 300
|
||||
"""
|
||||
|
||||
# To invoke IXFR we need to use refresh command
|
||||
When I send bind10 the command Xfrin refresh example. IN ::1 56177
|
||||
Then wait for new bind10 stderr message XFRIN_GOT_INCREMENTAL_RESP
|
||||
Then wait for new bind10 stderr message XFRIN_IXFR_TRANSFER_SUCCESS not XFRIN_XFR_PROCESS_FAILURE
|
||||
# This can't be 'wait for new'
|
||||
Then wait for bind10 stderr message ZONEMGR_RECEIVE_XFRIN_SUCCESS
|
||||
|
||||
A query for example. type SOA to [::1]:56176 should have rcode NOERROR
|
||||
The answer section of the last query response should be
|
||||
"""
|
||||
example. 3600 IN SOA ns1.example. hostmaster.example. 100 3600 900 7200 300
|
||||
"""
|
@@ -1,680 +0,0 @@
|
||||
Feature: Xfrin incoming notify handling
|
||||
Tests for Xfrin incoming notify handling. They also test
|
||||
statistics counters incremented, which are related to notifying
|
||||
and transferring by Xfrout and receiveing by Xfrin. Some cases are
|
||||
considered: Transferring is done via IPv4 or IPv6 transport. A
|
||||
transfer request from Xfrin is rejected by Xfrout. The master
|
||||
server or slave server is unreachable.
|
||||
|
||||
Scenario: Handle incoming notify
|
||||
Given I have bind10 running with configuration xfrin/retransfer_master.conf with cmdctl port 56174 as master
|
||||
And wait for master stderr message BIND10_STARTED_CC
|
||||
And wait for master stderr message CMDCTL_STARTED
|
||||
And wait for master stderr message AUTH_SERVER_STARTED
|
||||
And wait for master stderr message XFROUT_STARTED
|
||||
And wait for master stderr message ZONEMGR_STARTED
|
||||
And wait for master stderr message STATS_STARTING
|
||||
|
||||
And I have bind10 running with configuration xfrin/retransfer_slave_notify.conf
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message XFRIN_STARTED
|
||||
And wait for bind10 stderr message ZONEMGR_STARTED
|
||||
|
||||
A query for www.example.org to [::1]:56176 should have rcode NXDOMAIN
|
||||
|
||||
#
|
||||
# Test1 for Xfrout statistics
|
||||
#
|
||||
check initial statistics not containing example.org for Xfrout with cmdctl port 56174 except for the following items
|
||||
| item_name | min_value | max_value |
|
||||
| socket.unixdomain.open | 0 | 1 |
|
||||
# Note: .Xfrout.socket.unixdomain.open can be either expected to
|
||||
# be 0 or 1 here. The reason is: if b10-xfrout has started up and is
|
||||
# ready for a request from b10-stats, then b10-stats does request
|
||||
# to b10-xfrout and the value results in 1. Otherwise if
|
||||
# b10-xfrout is starting and isn't yet ready, then b10-stats
|
||||
# doesn't request to b10-xfrout and the value still remains to be the
|
||||
# default value(0).
|
||||
|
||||
#
|
||||
# Test2 for Xfrin statistics
|
||||
#
|
||||
check initial statistics not containing example.org for Xfrin except for the following items
|
||||
| item_name | min_value | max_value |
|
||||
| soa_in_progress | 0 | 1 |
|
||||
| axfr_running | 0 | 1 |
|
||||
# Note: soa_in_progress and axfr_running cannot be always a fixed value. The
|
||||
# reason is same as the case of .Xfrout.socket.unixdomain.open. as described
|
||||
# above.
|
||||
|
||||
When I send bind10 with cmdctl port 56174 the command Xfrout notify example.org IN
|
||||
Then wait for new master stderr message XFROUT_NOTIFY_COMMAND
|
||||
Then wait for new bind10 stderr message AUTH_RECEIVED_NOTIFY
|
||||
Then wait for new bind10 stderr message ZONEMGR_RECEIVE_NOTIFY
|
||||
# Note: The following waits should be for *new* log messages, or
|
||||
# they will match older log messages that were generated by AXFR
|
||||
# during startup.
|
||||
Then wait for new bind10 stderr message XFRIN_XFR_TRANSFER_STARTED
|
||||
Then wait for new bind10 stderr message XFRIN_TRANSFER_SUCCESS not XFRIN_XFR_PROCESS_FAILURE
|
||||
Then wait for new bind10 stderr message ZONEMGR_RECEIVE_XFRIN_SUCCESS
|
||||
Then wait for new master stderr message NOTIFY_OUT_REPLY_RECEIVED
|
||||
|
||||
A query for www.example.org to [::1]:56176 should have rcode NOERROR
|
||||
# Make sure handling statistics command handling checked below is
|
||||
# after this query
|
||||
And wait for bind10 stderr message AUTH_SEND_NORMAL_RESPONSE
|
||||
|
||||
#
|
||||
# Test3 for Xfrout statistics
|
||||
#
|
||||
# check statistics change
|
||||
#
|
||||
|
||||
# wait until the last stats requesting is finished
|
||||
When I query statistics zones of bind10 module Xfrout with cmdctl port 56174
|
||||
# note that this does not 100% guarantee the stats updated Xfrout
|
||||
# statistics. But there doesn't seem to be a better log message that
|
||||
# suggests this event.
|
||||
wait for new master stderr message XFROUT_RECEIVED_GETSTATS_COMMAND
|
||||
last bindctl output should not contain "error"
|
||||
|
||||
When I query statistics zones of bind10 module Xfrout with cmdctl port 56174
|
||||
The statistics counters are 0 in category .Xfrout.zones.IN except for the following items
|
||||
| item_name | item_value |
|
||||
| _SERVER_.notifyoutv6 | 1 |
|
||||
| _SERVER_.xfrreqdone | 1 |
|
||||
| example.org..notifyoutv6 | 1 |
|
||||
| example.org..xfrreqdone | 1 |
|
||||
|
||||
When I query statistics socket of bind10 module Xfrout with cmdctl port 56174
|
||||
The statistics counters are 0 in category .Xfrout.socket.unixdomain except for the following items
|
||||
| item_name | item_value |
|
||||
| open | 1 |
|
||||
| accept | 1 |
|
||||
|
||||
#
|
||||
# Test4 for Xfrin statistics
|
||||
#
|
||||
# check statistics change
|
||||
#
|
||||
|
||||
# wait until the last stats requesting is finished
|
||||
When I query statistics zones of bind10 module Xfrin with cmdctl
|
||||
wait for new bind10 stderr message XFRIN_RECEIVED_COMMAND
|
||||
last bindctl output should not contain "error"
|
||||
|
||||
When I query statistics of bind10 module Xfrin with cmdctl
|
||||
The statistics counters are 0 in category .Xfrin except for the following items
|
||||
| item_name | item_value | min_value |
|
||||
| zones.IN._SERVER_.soaoutv6 | 1 | |
|
||||
| zones.IN._SERVER_.axfrreqv6 | 1 | |
|
||||
| zones.IN._SERVER_.xfrsuccess | 1 | |
|
||||
| zones.IN._SERVER_.last_axfr_duration | | 0.0 |
|
||||
| zones.IN.example.org..soaoutv6 | 1 | |
|
||||
| zones.IN.example.org..axfrreqv6 | 1 | |
|
||||
| zones.IN.example.org..xfrsuccess | 1 | |
|
||||
| zones.IN.example.org..last_axfr_duration | | 0.0 |
|
||||
| soa_in_progress | 0 | |
|
||||
| axfr_running | 0 | |
|
||||
| socket.ipv6.tcp.open | | 1 |
|
||||
| socket.ipv6.tcp.close | | 1 |
|
||||
| socket.ipv6.tcp.conn | | 1 |
|
||||
| socket.ipv6.tcp.connfail | 0 | |
|
||||
|
||||
#
|
||||
# Test for handling incoming notify only in IPv4
|
||||
#
|
||||
Scenario: Handle incoming notify (IPv4)
|
||||
Given I have bind10 running with configuration xfrin/retransfer_master_v4.conf with cmdctl port 56174 as master
|
||||
And wait for master stderr message BIND10_STARTED_CC
|
||||
And wait for master stderr message CMDCTL_STARTED
|
||||
And wait for master stderr message AUTH_SERVER_STARTED
|
||||
And wait for master stderr message XFROUT_STARTED
|
||||
And wait for master stderr message ZONEMGR_STARTED
|
||||
And wait for master stderr message STATS_STARTING
|
||||
|
||||
And I have bind10 running with configuration xfrin/retransfer_slave_notify_v4.conf
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message XFRIN_STARTED
|
||||
And wait for bind10 stderr message ZONEMGR_STARTED
|
||||
|
||||
A query for www.example.org to 127.0.0.1:56176 should have rcode NXDOMAIN
|
||||
|
||||
#
|
||||
# Test1 for Xfrout statistics
|
||||
#
|
||||
check initial statistics not containing example.org for Xfrout with cmdctl port 56174 except for the following items
|
||||
| item_name | min_value | max_value |
|
||||
| socket.unixdomain.open | 0 | 1 |
|
||||
# Note: See above about .Xfrout.socket.unixdomain.open.
|
||||
|
||||
#
|
||||
# Test2 for Xfrin statistics
|
||||
#
|
||||
check initial statistics not containing example.org for Xfrin except for the following items
|
||||
| item_name | min_value | max_value |
|
||||
| soa_in_progress | 0 | 1 |
|
||||
| axfr_running | 0 | 1 |
|
||||
# Note: See above about soa_in_progress and axfr_running of Xfrin
|
||||
|
||||
When I send bind10 with cmdctl port 56174 the command Xfrout notify example.org IN
|
||||
Then wait for new master stderr message XFROUT_NOTIFY_COMMAND
|
||||
Then wait for new bind10 stderr message AUTH_RECEIVED_NOTIFY
|
||||
Then wait for new bind10 stderr message ZONEMGR_RECEIVE_NOTIFY
|
||||
# Note: The following waits should be for *new* log messages, or
|
||||
# they will match older log messages that were generated by AXFR
|
||||
# during startup.
|
||||
Then wait for new bind10 stderr message XFRIN_XFR_TRANSFER_STARTED
|
||||
Then wait for new bind10 stderr message XFRIN_TRANSFER_SUCCESS not XFRIN_XFR_PROCESS_FAILURE
|
||||
Then wait for new bind10 stderr message ZONEMGR_RECEIVE_XFRIN_SUCCESS
|
||||
Then wait for new master stderr message NOTIFY_OUT_REPLY_RECEIVED
|
||||
|
||||
A query for www.example.org to 127.0.0.1:56176 should have rcode NOERROR
|
||||
# Make sure handling statistics command handling checked below is
|
||||
# after this query
|
||||
And wait for bind10 stderr message AUTH_SEND_NORMAL_RESPONSE
|
||||
|
||||
#
|
||||
# Test3 for Xfrout statistics
|
||||
#
|
||||
# check statistics change
|
||||
#
|
||||
|
||||
# wait until the last stats requesting is finished
|
||||
When I query statistics zones of bind10 module Xfrout with cmdctl port 56174
|
||||
# note that this does not 100% guarantee the stats updated Xfrout
|
||||
# statistics. But there doesn't seem to be a better log message that
|
||||
# suggests this event.
|
||||
wait for new master stderr message XFROUT_RECEIVED_GETSTATS_COMMAND
|
||||
last bindctl output should not contain "error"
|
||||
|
||||
When I query statistics zones of bind10 module Xfrout with cmdctl port 56174
|
||||
The statistics counters are 0 in category .Xfrout.zones.IN except for the following items
|
||||
| item_name | item_value |
|
||||
| _SERVER_.notifyoutv4 | 1 |
|
||||
| _SERVER_.xfrreqdone | 1 |
|
||||
| example.org..notifyoutv4 | 1 |
|
||||
| example.org..xfrreqdone | 1 |
|
||||
|
||||
When I query statistics socket of bind10 module Xfrout with cmdctl port 56174
|
||||
The statistics counters are 0 in category .Xfrout.socket.unixdomain except for the following items
|
||||
| item_name | item_value |
|
||||
| open | 1 |
|
||||
| accept | 1 |
|
||||
|
||||
#
|
||||
# Test4 for Xfrin statistics
|
||||
#
|
||||
# check statistics change
|
||||
#
|
||||
|
||||
# wait until the last stats requesting is finished
|
||||
When I query statistics zones of bind10 module Xfrin with cmdctl
|
||||
wait for new bind10 stderr message XFRIN_RECEIVED_COMMAND
|
||||
last bindctl output should not contain "error"
|
||||
|
||||
When I query statistics of bind10 module Xfrin with cmdctl
|
||||
The statistics counters are 0 in category .Xfrin except for the following items
|
||||
| item_name | item_value | min_value |
|
||||
| zones.IN._SERVER_.soaoutv4 | 1 | |
|
||||
| zones.IN._SERVER_.axfrreqv4 | 1 | |
|
||||
| zones.IN._SERVER_.xfrsuccess | 1 | |
|
||||
| zones.IN._SERVER_.last_axfr_duration | | 0.0 |
|
||||
| zones.IN.example.org..soaoutv4 | 1 | |
|
||||
| zones.IN.example.org..axfrreqv4 | 1 | |
|
||||
| zones.IN.example.org..xfrsuccess | 1 | |
|
||||
| zones.IN.example.org..last_axfr_duration | | 0.0 |
|
||||
| soa_in_progress | 0 | |
|
||||
| axfr_running | 0 | |
|
||||
| socket.ipv4.tcp.open | | 1 |
|
||||
| socket.ipv4.tcp.close | | 1 |
|
||||
| socket.ipv4.tcp.conn | | 1 |
|
||||
| socket.ipv4.tcp.connfail | 0 | |
|
||||
|
||||
#
|
||||
# Test for Xfr request rejected
|
||||
#
|
||||
Scenario: Handle incoming notify (XFR request rejected)
|
||||
Given I have bind10 running with configuration xfrin/retransfer_master.conf with cmdctl port 56174 as master
|
||||
And wait for master stderr message BIND10_STARTED_CC
|
||||
And wait for master stderr message CMDCTL_STARTED
|
||||
And wait for master stderr message AUTH_SERVER_STARTED
|
||||
And wait for master stderr message XFROUT_STARTED
|
||||
And wait for master stderr message ZONEMGR_STARTED
|
||||
And wait for master stderr message STATS_STARTING
|
||||
|
||||
And I have bind10 running with configuration xfrin/retransfer_slave_notify.conf
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message XFRIN_STARTED
|
||||
And wait for bind10 stderr message ZONEMGR_STARTED
|
||||
|
||||
A query for www.example.org to [::1]:56176 should have rcode NXDOMAIN
|
||||
|
||||
#
|
||||
# Test1 for Xfrout statistics
|
||||
#
|
||||
check initial statistics not containing example.org for Xfrout with cmdctl port 56174 except for the following items
|
||||
| item_name | min_value | max_value |
|
||||
| socket.unixdomain.open | 0 | 1 |
|
||||
# Note: See above about .Xfrout.socket.unixdomain.open.
|
||||
|
||||
#
|
||||
# Test2 for Xfrin statistics
|
||||
#
|
||||
check initial statistics not containing example.org for Xfrin except for the following items
|
||||
| item_name | min_value | max_value |
|
||||
| soa_in_progress | 0 | 1 |
|
||||
| axfr_running | 0 | 1 |
|
||||
# Note: See above about soa_in_progress and axfr_running of Xfrin
|
||||
|
||||
#
|
||||
# set transfer_acl rejection
|
||||
# Local xfr requests from Xfrin module would be rejected here.
|
||||
#
|
||||
When I send bind10 the following commands with cmdctl port 56174
|
||||
"""
|
||||
config set Xfrout/zone_config[0]/transfer_acl [{"action": "REJECT", "from": "::1"}]
|
||||
config commit
|
||||
"""
|
||||
last bindctl output should not contain Error
|
||||
Then wait for new master stderr message XFROUT_NEW_CONFIG_DONE
|
||||
|
||||
When I send bind10 with cmdctl port 56174 the command Xfrout notify example.org IN
|
||||
Then wait for new master stderr message XFROUT_NOTIFY_COMMAND
|
||||
Then wait for new bind10 stderr message AUTH_RECEIVED_NOTIFY
|
||||
Then wait for new bind10 stderr message ZONEMGR_RECEIVE_NOTIFY
|
||||
# Note: The following waits should be for *new* log messages, or
|
||||
# they will match older log messages that were generated by AXFR
|
||||
# during startup.
|
||||
Then wait for new bind10 stderr message XFRIN_XFR_TRANSFER_STARTED
|
||||
Then wait for new bind10 stderr message XFRIN_XFR_TRANSFER_PROTOCOL_VIOLATION not XFRIN_TRANSFER_SUCCESS
|
||||
Then wait for new bind10 stderr message ZONEMGR_RECEIVE_XFRIN_FAILED not ZONEMGR_RECEIVE_XFRIN_SUCCESS
|
||||
Then wait for new master stderr message NOTIFY_OUT_REPLY_RECEIVED
|
||||
|
||||
A query for www.example.org to [::1]:56176 should have rcode NXDOMAIN
|
||||
|
||||
#
|
||||
# Test3 for Xfrout statistics
|
||||
#
|
||||
# check statistics change
|
||||
#
|
||||
|
||||
# wait until the last stats requesting is finished
|
||||
When I query statistics zones of bind10 module Xfrout with cmdctl port 56174
|
||||
wait for new master stderr message XFROUT_RECEIVED_GETSTATS_COMMAND
|
||||
last bindctl output should not contain "error"
|
||||
|
||||
When I query statistics zones of bind10 module Xfrout with cmdctl port 56174
|
||||
The statistics counters are 0 in category .Xfrout.zones.IN except for the following items
|
||||
| item_name | item_value | min_value | max_value |
|
||||
| _SERVER_.notifyoutv6 | 1 | | |
|
||||
| _SERVER_.xfrrej | | 1 | 3 |
|
||||
| example.org..notifyoutv6 | 1 | | |
|
||||
| example.org..xfrrej | | 1 | 3 |
|
||||
# Note: The above rejection counters might sometimes be increased
|
||||
# up to 3. See this for details
|
||||
# http://git.bind10.isc.org/~tester/builder/BIND10-lettuce/20120918210000-MacOS/logs/lettuce.out
|
||||
|
||||
When I query statistics socket of bind10 module Xfrout with cmdctl port 56174
|
||||
The statistics counters are 0 in category .Xfrout.socket.unixdomain except for the following items
|
||||
| item_name | item_value |
|
||||
| open | 1 |
|
||||
| accept | 1 |
|
||||
|
||||
#
|
||||
# Test4 for Xfrin statistics
|
||||
#
|
||||
# check statistics change
|
||||
#
|
||||
|
||||
# wait until the last stats requesting is finished
|
||||
When I query statistics zones of bind10 module Xfrin with cmdctl
|
||||
wait for new bind10 stderr message XFRIN_RECEIVED_COMMAND
|
||||
last bindctl output should not contain "error"
|
||||
|
||||
When I query statistics of bind10 module Xfrin with cmdctl
|
||||
The statistics counters are 0 in category .Xfrin except for the following items
|
||||
| item_name | item_value | min_value |
|
||||
| zones.IN._SERVER_.soaoutv6 | | 1 |
|
||||
| zones.IN._SERVER_.axfrreqv6 | | 1 |
|
||||
| zones.IN._SERVER_.xfrfail | | 1 |
|
||||
| zones.IN.example.org..soaoutv6 | | 1 |
|
||||
| zones.IN.example.org..axfrreqv6 | | 1 |
|
||||
| zones.IN.example.org..xfrfail | | 1 |
|
||||
| soa_in_progress | | 0 |
|
||||
| axfr_running | | 0 |
|
||||
| socket.ipv6.tcp.open | | 1 |
|
||||
| socket.ipv6.tcp.close | | 1 |
|
||||
| socket.ipv6.tcp.conn | | 1 |
|
||||
| socket.ipv6.tcp.connfail | 0 | |
|
||||
|
||||
#
|
||||
# Test for Xfr request rejected in IPv4
|
||||
#
|
||||
Scenario: Handle incoming notify (XFR request rejected in IPv4)
|
||||
Given I have bind10 running with configuration xfrin/retransfer_master_v4.conf with cmdctl port 56174 as master
|
||||
And wait for master stderr message BIND10_STARTED_CC
|
||||
And wait for master stderr message CMDCTL_STARTED
|
||||
And wait for master stderr message AUTH_SERVER_STARTED
|
||||
And wait for master stderr message XFROUT_STARTED
|
||||
And wait for master stderr message ZONEMGR_STARTED
|
||||
And wait for master stderr message STATS_STARTING
|
||||
|
||||
And I have bind10 running with configuration xfrin/retransfer_slave_notify_v4.conf
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message XFRIN_STARTED
|
||||
And wait for bind10 stderr message ZONEMGR_STARTED
|
||||
|
||||
A query for www.example.org to 127.0.0.1:56176 should have rcode NXDOMAIN
|
||||
|
||||
#
|
||||
# Test1 for Xfrout statistics
|
||||
#
|
||||
check initial statistics not containing example.org for Xfrout with cmdctl port 56174 except for the following items
|
||||
| item_name | min_value | max_value |
|
||||
| socket.unixdomain.open | 0 | 1 |
|
||||
# Note: See above about .Xfrout.socket.unixdomain.open.
|
||||
|
||||
#
|
||||
# Test2 for Xfrin statistics
|
||||
#
|
||||
check initial statistics not containing example.org for Xfrin except for the following items
|
||||
| item_name | min_value | max_value |
|
||||
| soa_in_progress | 0 | 1 |
|
||||
| axfr_running | 0 | 1 |
|
||||
# Note: See above about soa_in_progress and axfr_running of Xfrin
|
||||
|
||||
#
|
||||
# set transfer_acl rejection
|
||||
# Local xfr requests from Xfrin module would be rejected here.
|
||||
#
|
||||
When I send bind10 the following commands with cmdctl port 56174
|
||||
"""
|
||||
config set Xfrout/zone_config[0]/transfer_acl [{"action": "REJECT", "from": "127.0.0.1"}]
|
||||
config commit
|
||||
"""
|
||||
last bindctl output should not contain Error
|
||||
Then wait for new master stderr message XFROUT_NEW_CONFIG_DONE
|
||||
|
||||
When I send bind10 with cmdctl port 56174 the command Xfrout notify example.org IN
|
||||
Then wait for new master stderr message XFROUT_NOTIFY_COMMAND
|
||||
Then wait for new bind10 stderr message AUTH_RECEIVED_NOTIFY
|
||||
Then wait for new bind10 stderr message ZONEMGR_RECEIVE_NOTIFY
|
||||
# Note: The following waits should be for *new* log messages, or
|
||||
# they will match older log messages that were generated by AXFR
|
||||
# during startup.
|
||||
Then wait for new bind10 stderr message XFRIN_XFR_TRANSFER_STARTED
|
||||
Then wait for new bind10 stderr message XFRIN_XFR_TRANSFER_PROTOCOL_VIOLATION not XFRIN_TRANSFER_SUCCESS
|
||||
Then wait for new bind10 stderr message ZONEMGR_RECEIVE_XFRIN_FAILED not ZONEMGR_RECEIVE_XFRIN_SUCCESS
|
||||
Then wait for new master stderr message NOTIFY_OUT_REPLY_RECEIVED
|
||||
|
||||
A query for www.example.org to 127.0.0.1:56176 should have rcode NXDOMAIN
|
||||
|
||||
#
|
||||
# Test3 for Xfrout statistics
|
||||
#
|
||||
# check statistics change
|
||||
#
|
||||
|
||||
When I query statistics zones of bind10 module Xfrout with cmdctl port 56174
|
||||
# wait until stats request at least after NOTIFY_OUT_REPLY_RECEIVED
|
||||
wait for new master stderr message XFROUT_RECEIVED_GETSTATS_COMMAND
|
||||
last bindctl output should not contain "error"
|
||||
|
||||
When I query statistics zones of bind10 module Xfrout with cmdctl port 56174
|
||||
The statistics counters are 0 in category .Xfrout.zones.IN except for the following items
|
||||
| item_name | item_value | min_value | max_value |
|
||||
| _SERVER_.notifyoutv4 | 1 | | |
|
||||
| _SERVER_.xfrrej | | 1 | 3 |
|
||||
| example.org..notifyoutv4 | 1 | | |
|
||||
| example.org..xfrrej | | 1 | 3 |
|
||||
# Note: The above rejection counters might sometimes be increased
|
||||
# up to 3. See this for details
|
||||
# http://git.bind10.isc.org/~tester/builder/BIND10-lettuce/20120918210000-MacOS/logs/lettuce.out
|
||||
|
||||
When I query statistics socket of bind10 module Xfrout with cmdctl port 56174
|
||||
The statistics counters are 0 in category .Xfrout.socket.unixdomain except for the following items
|
||||
| item_name | item_value |
|
||||
| open | 1 |
|
||||
| accept | 1 |
|
||||
|
||||
#
|
||||
# Test4 for Xfrin statistics
|
||||
#
|
||||
# check statistics change
|
||||
#
|
||||
|
||||
# wait until the last stats requesting is finished
|
||||
When I query statistics zones of bind10 module Xfrin with cmdctl
|
||||
wait for new bind10 stderr message XFRIN_RECEIVED_COMMAND
|
||||
last bindctl output should not contain "error"
|
||||
|
||||
When I query statistics of bind10 module Xfrin with cmdctl
|
||||
The statistics counters are 0 in category .Xfrin except for the following items
|
||||
| item_name | item_value | min_value |
|
||||
| zones.IN._SERVER_.soaoutv4 | | 1 |
|
||||
| zones.IN._SERVER_.axfrreqv4 | | 1 |
|
||||
| zones.IN._SERVER_.xfrfail | | 1 |
|
||||
| zones.IN.example.org..soaoutv4 | | 1 |
|
||||
| zones.IN.example.org..axfrreqv4 | | 1 |
|
||||
| zones.IN.example.org..xfrfail | | 1 |
|
||||
| soa_in_progress | | 0 |
|
||||
| axfr_running | | 0 |
|
||||
| socket.ipv4.tcp.open | | 1 |
|
||||
| socket.ipv4.tcp.close | | 1 |
|
||||
| socket.ipv4.tcp.conn | | 1 |
|
||||
| socket.ipv4.tcp.connfail | 0 | |
|
||||
|
||||
#
|
||||
# Test for unreachable slave
|
||||
#
|
||||
Scenario: Handle incoming notify (unreachable slave)
|
||||
Given I have bind10 running with configuration xfrin/retransfer_master.conf with cmdctl port 56174 as master
|
||||
And wait for master stderr message BIND10_STARTED_CC
|
||||
And wait for master stderr message CMDCTL_STARTED
|
||||
And wait for master stderr message AUTH_SERVER_STARTED
|
||||
And wait for master stderr message XFROUT_STARTED
|
||||
And wait for master stderr message ZONEMGR_STARTED
|
||||
And wait for master stderr message STATS_STARTING
|
||||
|
||||
When I send bind10 with cmdctl port 56174 the command Xfrout notify example.org IN
|
||||
Then wait for new master stderr message XFROUT_NOTIFY_COMMAND
|
||||
Then wait for new master stderr message NOTIFY_OUT_SENDING_NOTIFY
|
||||
Then wait for new master stderr message NOTIFY_OUT_TIMEOUT
|
||||
|
||||
#
|
||||
# Test1 for Xfrout statistics
|
||||
#
|
||||
# check statistics change
|
||||
#
|
||||
|
||||
When I query statistics zones of bind10 module Xfrout with cmdctl port 56174
|
||||
# wait until stats request at least after NOTIFY_OUT_TIMEOUT
|
||||
wait for new master stderr message XFROUT_RECEIVED_GETSTATS_COMMAND
|
||||
last bindctl output should not contain "error"
|
||||
|
||||
When I query statistics zones of bind10 module Xfrout with cmdctl port 56174
|
||||
The statistics counters are 0 in category .Xfrout.zones.IN except for the following items
|
||||
| item_name | min_value | max_value |
|
||||
| _SERVER_.notifyoutv6 | 1 | 5 |
|
||||
| example.org..notifyoutv6 | 1 | 5 |
|
||||
|
||||
When I query statistics socket of bind10 module Xfrout with cmdctl port 56174
|
||||
The statistics counters are 0 in category .Xfrout.socket.unixdomain except for the following items
|
||||
| item_name | item_value |
|
||||
| open | 1 |
|
||||
|
||||
#
|
||||
# Test for NOTIFY that would result in NOTAUTH
|
||||
#
|
||||
Scenario: Handle incoming notify that does match authoritative zones
|
||||
Given I have bind10 running with configuration xfrin/retransfer_master.conf with cmdctl port 56174 as master
|
||||
And wait for master stderr message BIND10_STARTED_CC
|
||||
And wait for master stderr message CMDCTL_STARTED
|
||||
And wait for master stderr message AUTH_SERVER_STARTED
|
||||
And wait for master stderr message XFROUT_STARTED
|
||||
And wait for master stderr message ZONEMGR_STARTED
|
||||
And wait for master stderr message STATS_STARTING
|
||||
|
||||
And I have bind10 running with configuration xfrin/retransfer_slave_notify.conf
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message XFRIN_STARTED
|
||||
And wait for bind10 stderr message ZONEMGR_STARTED
|
||||
|
||||
#
|
||||
# replace master's data source with unmatched zone for slave's zone.
|
||||
# we restart Xfrout to make it sure.
|
||||
#
|
||||
When I send bind10 the following commands with cmdctl port 56174
|
||||
"""
|
||||
config set data_sources/classes/IN[0]/params/database_file data/ixfr-out/zones.sqlite3
|
||||
config set Auth/database_file data/ixfr-out/zones.sqlite3
|
||||
config set Xfrout/zone_config[0]/origin example.com
|
||||
config commit
|
||||
Xfrout shutdown
|
||||
"""
|
||||
last bindctl output should not contain "error"
|
||||
And wait for new master stderr message XFROUT_STARTED
|
||||
|
||||
A query for www.example.com to [::1]:56176 should have rcode REFUSED
|
||||
|
||||
When I send bind10 with cmdctl port 56174 the command Xfrout notify example.com IN
|
||||
Then wait for new master stderr message XFROUT_NOTIFY_COMMAND
|
||||
Then wait for new bind10 stderr message AUTH_RECEIVED_NOTIFY_NOTAUTH
|
||||
Then wait for new master stderr message NOTIFY_OUT_REPLY_RECEIVED
|
||||
|
||||
A query for www.example.com to [::1]:56176 should have rcode REFUSED
|
||||
|
||||
#
|
||||
# Test for NOTIFY that's not in the secondaries list
|
||||
#
|
||||
Scenario: Handle incoming notify that is not in the secondaries list
|
||||
Given I have bind10 running with configuration xfrin/retransfer_master.conf with cmdctl port 56174 as master
|
||||
And wait for master stderr message BIND10_STARTED_CC
|
||||
And wait for master stderr message CMDCTL_STARTED
|
||||
And wait for master stderr message AUTH_SERVER_STARTED
|
||||
And wait for master stderr message XFROUT_STARTED
|
||||
And wait for master stderr message ZONEMGR_STARTED
|
||||
And wait for master stderr message STATS_STARTING
|
||||
|
||||
And I have bind10 running with configuration xfrin/retransfer_slave_notify.conf
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message XFRIN_STARTED
|
||||
And wait for bind10 stderr message ZONEMGR_STARTED
|
||||
|
||||
#
|
||||
# Empty slave's secondaries list, and restart zonemgr to make it sure
|
||||
#
|
||||
When I send bind10 the following commands with cmdctl
|
||||
"""
|
||||
config remove Zonemgr/secondary_zones[0]
|
||||
config commit
|
||||
Zonemgr shutdown
|
||||
"""
|
||||
last bindctl output should not contain "error"
|
||||
And wait for new bind10 stderr message ZONEMGR_STARTED
|
||||
|
||||
A query for www.example.org to [::1]:56176 should have rcode NXDOMAIN
|
||||
|
||||
When I send bind10 with cmdctl port 56174 the command Xfrout notify example.org IN
|
||||
Then wait for new master stderr message XFROUT_NOTIFY_COMMAND
|
||||
Then wait for new bind10 stderr message AUTH_RECEIVED_NOTIFY
|
||||
Then wait for new bind10 stderr message ZONEMGR_RECEIVE_NOTIFY
|
||||
Then wait for new bind10 stderr message ZONEMGR_ZONE_NOTIFY_NOT_SECONDARY
|
||||
Then wait for new master stderr message NOTIFY_OUT_REPLY_RECEIVED
|
||||
|
||||
A query for www.example.org to [::1]:56176 should have rcode NXDOMAIN
|
||||
|
||||
#
|
||||
# Test for NOTIFY when zonemgr is not running
|
||||
#
|
||||
Scenario: Handle incoming notify while zonemgr is not running
|
||||
Given I have bind10 running with configuration xfrin/retransfer_master.conf with cmdctl port 56174 as master
|
||||
And wait for master stderr message BIND10_STARTED_CC
|
||||
And wait for master stderr message CMDCTL_STARTED
|
||||
And wait for master stderr message AUTH_SERVER_STARTED
|
||||
And wait for master stderr message XFROUT_STARTED
|
||||
And wait for master stderr message ZONEMGR_STARTED
|
||||
And wait for master stderr message STATS_STARTING
|
||||
|
||||
And I have bind10 running with configuration xfrin/retransfer_slave_notify.conf
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message XFRIN_STARTED
|
||||
And wait for bind10 stderr message ZONEMGR_STARTED
|
||||
|
||||
# remove zonemgr from the system. a subsequent notify is ignored, but
|
||||
# an error message shouldn't be logged at auth.
|
||||
When I send bind10 the following commands with cmdctl
|
||||
"""
|
||||
config remove Init/components b10-zonemgr
|
||||
config commit
|
||||
"""
|
||||
last bindctl output should not contain "error"
|
||||
And wait for new bind10 stderr message BIND10_PROCESS_ENDED
|
||||
|
||||
A query for www.example.org to [::1]:56176 should have rcode NXDOMAIN
|
||||
|
||||
When I send bind10 with cmdctl port 56174 the command Xfrout notify example.org IN
|
||||
Then wait for master stderr message XFROUT_NOTIFY_COMMAND
|
||||
Then wait for new bind10 stderr message AUTH_RECEIVED_NOTIFY
|
||||
Then wait for new bind10 stderr message AUTH_ZONEMGR_NOTEXIST not AUTH_ZONEMGR_ERROR
|
||||
Then wait for master stderr message NOTIFY_OUT_TIMEOUT not NOTIFY_OUT_REPLY_RECEIVED
|
||||
|
||||
A query for www.example.org to [::1]:56176 should have rcode NXDOMAIN
|
||||
|
||||
#
|
||||
# Test for unreachable master
|
||||
#
|
||||
Scenario: Handle incoming notify (unreachable master)
|
||||
|
||||
And I have bind10 running with configuration xfrin/retransfer_slave_notify.conf
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message XFRIN_STARTED
|
||||
And wait for bind10 stderr message ZONEMGR_STARTED
|
||||
|
||||
A query for www.example.org to [::1]:56176 should have rcode NXDOMAIN
|
||||
|
||||
#
|
||||
# Test1 for Xfrin statistics
|
||||
#
|
||||
check initial statistics not containing example.org for Xfrin
|
||||
|
||||
#
|
||||
# execute reftransfer for Xfrin
|
||||
#
|
||||
When I send bind10 the command Xfrin retransfer example.org IN
|
||||
Then wait for new bind10 stderr message XFRIN_CONNECT_MASTER
|
||||
Then wait for new bind10 stderr message ZONEMGR_RECEIVE_XFRIN_FAILED
|
||||
|
||||
#
|
||||
# Test2 for Xfrin statistics
|
||||
#
|
||||
# check initial statistics
|
||||
#
|
||||
|
||||
# wait until the last stats requesting is finished
|
||||
wait for new bind10 stderr message STATS_SEND_STATISTICS_REQUEST
|
||||
wait for new bind10 stderr message XFRIN_RECEIVED_COMMAND
|
||||
|
||||
When I query statistics socket of bind10 module Xfrin with cmdctl
|
||||
The statistics counters are 0 in category .Xfrin.socket.ipv6.tcp except for the following items
|
||||
| item_name | min_value |
|
||||
| open | 1 |
|
||||
| close | 1 |
|
||||
| connfail | 1 |
|
@@ -1,39 +0,0 @@
|
||||
Feature: Xfrout
|
||||
Tests for Xfrout, specific for BIND 10 behaviour.
|
||||
|
||||
Scenario: normal transfer with a moderate number of RRs
|
||||
|
||||
Load 100 records for zone example.org to DB file data/xfrout.sqlite3
|
||||
|
||||
Given I have bind10 running with configuration xfrout_master.conf
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message XFROUT_STARTED
|
||||
And wait for bind10 stderr message ZONEMGR_STARTED
|
||||
|
||||
# The transferred zone should have the generated 100 RRs plush one
|
||||
# trailing SOA.
|
||||
When I do a customized AXFR transfer of example.org
|
||||
Then transfer result should have 101 rrs
|
||||
|
||||
# Similar to the previous one, but using a much larger zone, and with
|
||||
# a small delay at the client side. It should still succeed.
|
||||
# The specific delay (5 seconds) was chosen for an environment that
|
||||
# revealed a bug which is now fixed to reproduce the issue; shorter delays
|
||||
# didn't trigger the problem. Depending on the OS implementation, machine
|
||||
# speed, etc, the same delay may be too long or too short, but in any case
|
||||
# the test should succeed now.
|
||||
Scenario: transfer a large zone
|
||||
|
||||
Load 50000 records for zone example.org to DB file data/xfrout.sqlite3
|
||||
|
||||
Given I have bind10 running with configuration xfrout_master.conf
|
||||
And wait for bind10 stderr message BIND10_STARTED_CC
|
||||
And wait for bind10 stderr message CMDCTL_STARTED
|
||||
And wait for bind10 stderr message AUTH_SERVER_STARTED
|
||||
And wait for bind10 stderr message XFROUT_STARTED
|
||||
And wait for bind10 stderr message ZONEMGR_STARTED
|
||||
|
||||
When I do a customized AXFR transfer of example.org from [::1]:56176 with pause of 5 seconds
|
||||
Then transfer result should have 50001 rrs
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user