1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
#!/usr/bin/env python
# $Id$
#
# Copyright (C) 2013 Dragon Research Labs ("DRL")
#
# 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 DRL DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL DRL 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.
"""
Proof-of-concept test driver for RRDP code. Still fairly kludgy in places.
"""
import os
import sys
import glob
import time
import signal
import textwrap
import argparse
import subprocess
parser = argparse.ArgumentParser(description = __doc__)
parser.add_argument("--use-smoketest", action = "store_true")
parser.add_argument("--yaml-file", default = "smoketest.2.yaml")
parser.add_argument("--delay", type = int, default = 30)
parser.add_argument("--exhaustive", action = "store_true")
parser.add_argument("--skip-daemons", action = "store_true")
parser.add_argument("--dry-run", action = "store_true")
args = parser.parse_args()
def log(msg):
sys.stdout.write(msg + "\n")
sys.stdout.flush()
def run(*argv):
log("Running: " + " ".join(argv))
if not args.dry_run:
subprocess.check_call(argv)
def dataglob(pattern):
return glob.iglob(os.path.join(("smoketest.dir" if args.use_smoketest else "yamltest.dir/RIR"), pattern))
def snapshot_to_serial(fn):
return int(os.path.splitext(os.path.basename(fn))[0])
def delta_to_serial(fn):
return int(os.path.splitext(os.path.basename(fn))[0])
top = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), "..", ".."))
rrdp_test_tool = os.path.join(top, "potpourri/rrdp-test-tool")
rcynic = os.path.join(top, "rp/rcynic/rcynic")
rcynic_text = os.path.join(top, "rp/rcynic/rcynic-text")
with open("rcynic-rrdp.conf", "w") as f:
f.write(textwrap.dedent('''# Automatically generated for RRDP tests, do not edit.
[rcynic]
xml-summary = rcynic.xml
jitter = 0
use-links = yes
use-syslog = no
use-stderr = yes
log-level = log_debug
run-rsync = no
'''))
if args.use_smoketest:
f.write("trust-anchor = smoketest.dir/root.cer\n")
else:
f.write("trust-anchor = yamltest.dir/RIR/publication/RIR-root/root.cer\n")
if args.skip_daemons:
log("--skip-daemons specified, so running neither smoketest nor yamltest")
elif args.use_smoketest:
run("python", "smoketest.py", args.yaml_file)
else:
run("python", "sql-cleaner.py")
class GotSIGUSR1(Exception):
pass
def handle_sigusr1(signum, frame):
raise GotSIGUSR1
old_sigusr1 = signal.signal(signal.SIGUSR1, handle_sigusr1)
argv = ("python", "yamltest.py", args.yaml_file, "--notify-when-startup-complete", str(os.getpid()))
log("Running: " + " ".join(argv))
yamltest = subprocess.Popen(argv)
log("Waiting for SIGUSR1 from yamltest")
try:
while True:
signal.pause()
except GotSIGUSR1:
signal.signal(signal.SIGUSR1, old_sigusr1)
log("Sleeping %s" % args.delay)
time.sleep(args.delay)
yamltest.terminate()
snapshots = dict((snapshot_to_serial(fn), fn) for fn in dataglob("rrdp-publication/*/snapshot/*.xml"))
deltas = dict((delta_to_serial(fn), fn) for fn in dataglob("rrdp-publication/*/deltas/*.xml"))
for snapshot in sorted(snapshots):
time.sleep(1)
run("rm", "-rf", "rcynic-data")
run(rrdp_test_tool, snapshots[snapshot])
run(rcynic, "-c", "rcynic-rrdp.conf")
run(rcynic_text, "rcynic.xml")
for delta in sorted(deltas):
if delta > snapshot:
time.sleep(1)
run(rrdp_test_tool, deltas[delta])
run(rcynic, "-c", "rcynic-rrdp.conf")
run(rcynic_text, "rcynic.xml")
if not args.exhaustive:
break
|