| #!/usr/bin/env python3 |
| |
| import argparse |
| import contextlib |
| import os |
| import signal |
| import subprocess |
| import sys |
| |
| import gi |
| gi.require_version('RwcalYang', '1.0') |
| gi.require_version('RwCal', '1.0') |
| gi.require_version('RwLog', '1.0') |
| |
| |
| TEST_PARSER = "test" |
| |
| |
| class PyTestRunner: |
| SYS_CMD = "demos/launchpad.py -m ethsim --skip-prepare-vm -c" |
| CLOUDSIM_CMD = "cloudsim start" |
| |
| @property |
| def rift_install(self): |
| return os.getenv('RIFT_INSTALL') |
| |
| @property |
| def account_script(self): |
| return os.path.join( |
| self.rift_install, |
| "usr/rift/systemtest/pytest/mission_control/test_mission_control.py") |
| |
| @property |
| def onboard_script(self): |
| return os.path.join( |
| self.rift_install, |
| "usr/rift/systemtest/pytest/mission_control/pingpong_vnf/test_onboard_vnf.py") |
| |
| @property |
| def records_script(self): |
| return os.path.join( |
| self.rift_install, |
| "usr/rift/systemtest/pytest/mission_control/pingpong_vnf/test_records.py") |
| |
| def run_cmd(self, scripts=None, cal_account="mock"): |
| scripts = scripts or [self.account_script, self.onboard_script] |
| |
| cmd = "py.test -v " |
| |
| # In mock-cal mode we don't need the images. |
| if cal_account == "mock": |
| cmd += "--{} --lp-standalone --network-service pingpong_noimg ".format(cal_account) |
| else: |
| cmd += "--{} --lp-standalone --network-service pingpong ".format(cal_account) |
| |
| cmd += " ".join(scripts) |
| subprocess.call(cmd, shell=True) |
| |
| @contextlib.contextmanager |
| def system_start(self, debug_mode=False, cal_account="mock"): |
| |
| |
| os.environ['LD_PRELOAD'] = os.path.join( |
| self.rift_install, |
| "usr/lib/rift/preloads/librwxercespreload.so") |
| |
| sys_cmd = os.path.join(self.rift_install, self.SYS_CMD) |
| if debug_mode: |
| sys_cmd += " --mock-cli" |
| |
| process = subprocess.Popen( |
| sys_cmd, |
| shell=True, |
| preexec_fn=os.setsid) |
| |
| cloudsim_process = None |
| if cal_account == "lxc": |
| # If in LXC start the cloudsim server. |
| cloudsim_process = subprocess.Popen( |
| PyTestRunner.CLOUDSIM_CMD, |
| shell=True, |
| preexec_fn=os.setsid) |
| |
| def kill(): |
| os.killpg(process.pid, signal.SIGTERM) |
| if cloudsim_process: |
| os.killpg(cloudsim_process.pid, signal.SIGTERM) |
| cloudsim_process.wait() |
| |
| process.wait() |
| |
| signal.signal(signal.SIGHUP, kill) |
| signal.signal(signal.SIGTERM, kill) |
| |
| yield |
| |
| kill() |
| |
| |
| def test_launchpad(args): |
| pytest = PyTestRunner() |
| |
| scripts = None |
| if args.cal == "lxc": |
| scripts = [pytest.account_script, pytest.onboard_script, pytest.records_script] |
| |
| with pytest.system_start(cal_account=args.cal): |
| pytest.run_cmd(scripts=scripts, cal_account=args.cal) |
| |
| |
| def parse(arguments): |
| parser = argparse.ArgumentParser(description=__doc__, |
| formatter_class=argparse.RawDescriptionHelpFormatter) |
| parser.add_argument( |
| '--log-level', '-l', |
| default="WARNING", |
| type=str, |
| choices=["INFO", "DEBUG", "WARNING", "ERROR"], |
| help="Set log level, defaults to warning and above.") |
| |
| subparsers = parser.add_subparsers() |
| |
| start_parser = subparsers.add_parser(TEST_PARSER, help="Test the LP") |
| start_parser.add_argument( |
| '--cal', "-c", |
| help="Run the server in the foreground. The logs are sent to console.", |
| default="mock", |
| choices=["lxc", "mock"]) |
| start_parser.set_defaults(which=TEST_PARSER) |
| |
| args = parser.parse_args(arguments) |
| |
| return args |
| |
| |
| def main(args): |
| |
| args = parse(args) |
| |
| if args.which == TEST_PARSER: |
| test_launchpad(args) |
| |
| |
| if __name__ == "__main__": |
| main(sys.argv[1:]) |