blob: 6e423ac1b13ed5292cf61adf12ad51cb18199454 [file] [log] [blame]
#!/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:])