bind10 module DDNS should not be running
# Test 1
- When I send a DDNS Update for example.org with the following commands:
- """
- update add example.org 3600 IN SOA ns1.example.org. admin.example.org. 1235 3600 1800 2419200 7200
- """
+ When I use DDNS to set the SOA serial to 1235
# Note: test spec says refused here, system returns SERVFAIL
#The DDNS response should be REFUSED
The DDNS response should be SERVFAIL
And the SOA serial for example.org should be 1234
# Test 2
- When I send bind10 the following commands
- """
- config add Boss/components b10-ddns
- config set Boss/components/b10-ddns/kind dispensable
- config commit
- """
+ When I configure bind10 to run DDNS
And wait for new bind10 stderr message DDNS_RUNNING
-
bind10 module DDNS should be running
# Test 3
- When I send a DDNS Update for example.org with the following commands:
- """
- update add example.org 3600 IN SOA ns1.example.org. admin.example.org. 1236 3600 1800 2419200 7200
- """
+ 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 5
- When I send a DDNS Update for example.org with the following commands:
- """
- update add example.org 3600 IN SOA ns1.example.org. admin.example.org. 1237 3600 1800 2419200 7200
- """
+ When I use DDNS to set the SOA serial to 1237
The DDNS response should be SUCCESS
And the SOA serial for example.org should be 1237
# Test 6
# XXX right after update, this fails?!
- #When I send bind10 the command DDNS shutdown
+ When I send bind10 the command DDNS shutdown
# Test 7
- #And wait for new bind10 stderr message DDNS_RUNNING
+ And wait for new bind10 stderr message DDNS_RUNNING
# Test 8
- When I send a DDNS Update for example.org with the following commands:
- """
- update add example.org 3600 IN SOA ns1.example.org. admin.example.org. 1238 3600 1800 2419200 7200
- """
+ When I use DDNS to set the SOA serial to 1238
The DDNS response should be SUCCESS
And the SOA serial for example.org should be 1238
# Test 9
+ When I send bind10 the command Auth shutdown
# Test 10
- When I send bind10 the following commands
- """
- config remove Boss/components b10-ddns
- config commit
- """
- # XXX same problem of nonresponsive ddns?
- #And wait for new bind10 stderr message DDNS_STOPPED
+ When I configure BIND10 to stop running DDNS
+ And wait for new bind10 stderr message DDNS_STOPPED
- #bind10 module DDNS should not be running
+ bind10 module DDNS should not be running
# Test 11
- When I send a DDNS Update for example.org with the following commands:
- """
- update add example.org 3600 IN SOA ns1.example.org. admin.example.org. 1239 3600 1800 2419200 7200
- """
- The DDNS response should be SERFVAIL
+ When I use DDNS to set the SOA serial to 1239
+ # should this be REFUSED again?
+ The DDNS response should be SERVFAIL
And the SOA serial for example.org should be 1238
-
-
-
--- /dev/null
+# 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.
+
+from lettuce import *
+import subprocess
+import re
+
+def run_nsupdate(commands, zone="example.org.", update_address="127.0.0.1",
+ update_port="47806"):
+ """Run nsupdate.
+ Parameters:
+ commands: a sequence of strings which will be sent.
+ update_address: adress to send the update to
+ update_port: port to send the update to
+ zone: zone to update
+
+ Automatically adds the command to set server
+ Appends 'send' as a final command.
+
+ nsupdate's stdout and stderr streams are stored (as one multiline string
+ in world.last_nsupdate_stdout/stderr.
+ Fails if the return code is not 0
+
+ """
+ #commands.insert(0, "server " + update_address + " " + update_port)
+ #commands.insert(0, "zone " + zone)
+ 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
+ #assert result == 0, "nsupdate exit code: " + str(result) +\
+ # "\nstdout:\n" + str(stdout) +\
+ # "stderr:\n" + str(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 quit command is always appended.
+ cmdctl_port ('with cmdctl port <portnr>', optional): cmdctl port to send
+ the command to. Defaults to 47805.
+ Fails if cmdctl does not exit with status code 0.
+ """
+ commands = step.multiline.split("\n")
+ run_nsupdate(commands, zone)
+
+@step('DDNS response should be ([A-Z]+)')
+def check_ddns_response(step, response):
+ # 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 (2 == 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] + " 47806"
+ 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):
+ world.nsupdate_commands.append(line)
+
+@step('Add the following lines to the DDNS update:')
+def add_lines_to_ddns_update(step, line):
+ world.nsupdate_commands.extend(step.multiline.split('\n'))
+
+@step('Run the DDNS update')
+def run_ddns_update(step):
+ '''
+ Executes nsupdate as prepared by the previous steps
+ '''
+ 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
+ '''
+ 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. 1235 3600 1800 2419200 7200')
+ step.given('Run the DDNS update')
+
+@step('Configure BIND10 to run DDNS')
+def configure_ddns_on(step):
+ step.behave_as("""
+ When I send bind10 the following commands
+ \"\"\"
+ config add Boss/components b10-ddns
+ config set Boss/components/b10-ddns/kind dispensable
+ config commit
+ \"\"\"
+ """)
+
+@step('Configure BIND10 to stop running DDNS')
+def configure_ddns_on(step):
+ step.behave_as("""
+ When I send bind10 the following commands
+ \"\"\"
+ config remove Boss/components b10-ddns
+ config commit
+ \"\"\"
+ """)
+