blob: 6e423ac1b13ed5292cf61adf12ad51cb18199454 [file] [log] [blame]
Jeremy Mordkoff6f07e6f2016-09-07 18:56:51 -04001#!/usr/bin/env python3
2
3import argparse
4import contextlib
5import os
6import signal
7import subprocess
8import sys
9
10import gi
11gi.require_version('RwcalYang', '1.0')
12gi.require_version('RwCal', '1.0')
13gi.require_version('RwLog', '1.0')
14
15
16TEST_PARSER = "test"
17
18
19class PyTestRunner:
20 SYS_CMD = "demos/launchpad.py -m ethsim --skip-prepare-vm -c"
21 CLOUDSIM_CMD = "cloudsim start"
22
23 @property
24 def rift_install(self):
25 return os.getenv('RIFT_INSTALL')
26
27 @property
28 def account_script(self):
29 return os.path.join(
30 self.rift_install,
31 "usr/rift/systemtest/pytest/mission_control/test_mission_control.py")
32
33 @property
34 def onboard_script(self):
35 return os.path.join(
36 self.rift_install,
37 "usr/rift/systemtest/pytest/mission_control/pingpong_vnf/test_onboard_vnf.py")
38
39 @property
40 def records_script(self):
41 return os.path.join(
42 self.rift_install,
43 "usr/rift/systemtest/pytest/mission_control/pingpong_vnf/test_records.py")
44
45 def run_cmd(self, scripts=None, cal_account="mock"):
46 scripts = scripts or [self.account_script, self.onboard_script]
47
48 cmd = "py.test -v "
49
50 # In mock-cal mode we don't need the images.
51 if cal_account == "mock":
52 cmd += "--{} --lp-standalone --network-service pingpong_noimg ".format(cal_account)
53 else:
54 cmd += "--{} --lp-standalone --network-service pingpong ".format(cal_account)
55
56 cmd += " ".join(scripts)
57 subprocess.call(cmd, shell=True)
58
59 @contextlib.contextmanager
60 def system_start(self, debug_mode=False, cal_account="mock"):
61
62
63 os.environ['LD_PRELOAD'] = os.path.join(
64 self.rift_install,
65 "usr/lib/rift/preloads/librwxercespreload.so")
66
67 sys_cmd = os.path.join(self.rift_install, self.SYS_CMD)
68 if debug_mode:
69 sys_cmd += " --mock-cli"
70
71 process = subprocess.Popen(
72 sys_cmd,
73 shell=True,
74 preexec_fn=os.setsid)
75
76 cloudsim_process = None
77 if cal_account == "lxc":
78 # If in LXC start the cloudsim server.
79 cloudsim_process = subprocess.Popen(
80 PyTestRunner.CLOUDSIM_CMD,
81 shell=True,
82 preexec_fn=os.setsid)
83
84 def kill():
85 os.killpg(process.pid, signal.SIGTERM)
86 if cloudsim_process:
87 os.killpg(cloudsim_process.pid, signal.SIGTERM)
88 cloudsim_process.wait()
89
90 process.wait()
91
92 signal.signal(signal.SIGHUP, kill)
93 signal.signal(signal.SIGTERM, kill)
94
95 yield
96
97 kill()
98
99
100def test_launchpad(args):
101 pytest = PyTestRunner()
102
103 scripts = None
104 if args.cal == "lxc":
105 scripts = [pytest.account_script, pytest.onboard_script, pytest.records_script]
106
107 with pytest.system_start(cal_account=args.cal):
108 pytest.run_cmd(scripts=scripts, cal_account=args.cal)
109
110
111def parse(arguments):
112 parser = argparse.ArgumentParser(description=__doc__,
113 formatter_class=argparse.RawDescriptionHelpFormatter)
114 parser.add_argument(
115 '--log-level', '-l',
116 default="WARNING",
117 type=str,
118 choices=["INFO", "DEBUG", "WARNING", "ERROR"],
119 help="Set log level, defaults to warning and above.")
120
121 subparsers = parser.add_subparsers()
122
123 start_parser = subparsers.add_parser(TEST_PARSER, help="Test the LP")
124 start_parser.add_argument(
125 '--cal', "-c",
126 help="Run the server in the foreground. The logs are sent to console.",
127 default="mock",
128 choices=["lxc", "mock"])
129 start_parser.set_defaults(which=TEST_PARSER)
130
131 args = parser.parse_args(arguments)
132
133 return args
134
135
136def main(args):
137
138 args = parse(args)
139
140 if args.which == TEST_PARSER:
141 test_launchpad(args)
142
143
144if __name__ == "__main__":
145 main(sys.argv[1:])