RIFT OSM R1 Initial Submission

Signed-off-by: Jeremy Mordkoff <jeremy.mordkoff@riftio.com>
diff --git a/rwlaunchpad/test/launchpad b/rwlaunchpad/test/launchpad
new file mode 100644
index 0000000..6e423ac
--- /dev/null
+++ b/rwlaunchpad/test/launchpad
@@ -0,0 +1,145 @@
+#!/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:])
\ No newline at end of file