Squashed 'yocto-poky/' content from commit ea562de

git-subtree-dir: yocto-poky
git-subtree-split: ea562de57590c966cd5a75fda8defecd397e6436
diff --git a/bitbake/lib/toaster/contrib/tts/launcher.py b/bitbake/lib/toaster/contrib/tts/launcher.py
new file mode 100755
index 0000000..e5794c1
--- /dev/null
+++ b/bitbake/lib/toaster/contrib/tts/launcher.py
@@ -0,0 +1,101 @@
+#!/usr/bin/python
+
+# ex:ts=4:sw=4:sts=4:et
+# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
+#
+# Copyright (C) 2015 Alexandru Damian for Intel Corp.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+# Program to run the next task listed from the backlog.txt; designed to be
+# run from crontab.
+
+from __future__ import print_function
+import sys, os, config, shellutils
+from shellutils import ShellCmdException
+
+# Import smtplib for the actual sending function
+import smtplib
+
+# Import the email modules we'll need
+from email.mime.text import MIMEText
+
+def _take_lockfile():
+    return shellutils.lockfile(shellutils.mk_lock_filename())
+
+
+def read_next_task_by_state(task_state, task_name=None):
+    if not os.path.exists(os.path.join(os.path.dirname(__file__), config.BACKLOGFILE)):
+        return None
+    os.rename(config.BACKLOGFILE, config.BACKLOGFILE + ".tmp")
+    task = None
+    with open(config.BACKLOGFILE + ".tmp", "r") as f_in:
+        with open(config.BACKLOGFILE, "w") as f_out:
+            for line in f_in.readlines():
+                if task is None:
+                    fields = line.strip().split("|", 2)
+                    if fields[1] == task_state:
+                        if task_name is None or task_name == fields[0]:
+                            task = fields[0]
+                            print("Updating %s %s to %s" % (task, task_state, config.TASKS.next_task(task_state)))
+                            line = "%s|%s\n" % (task, config.TASKS.next_task(task_state))
+                f_out.write(line)
+    os.remove(config.BACKLOGFILE + ".tmp")
+    return task
+
+def send_report(task_name, plaintext, errtext=None):
+    if errtext is None:
+        msg = MIMEText(plaintext)
+    else:
+        if plaintext is None:
+            plaintext = ""
+        msg = MIMEText("--STDOUT dump--\n\n%s\n\n--STDERR dump--\n\n%s" % (plaintext, errtext))
+
+    msg['Subject'] = "[review-request] %s - smoke test results" % task_name
+    msg['From'] = config.OWN_EMAIL_ADDRESS
+    msg['To'] = config.REPORT_EMAIL_ADDRESS
+
+    smtp_connection = smtplib.SMTP("localhost")
+    smtp_connection.sendmail(config.OWN_EMAIL_ADDRESS, [config.REPORT_EMAIL_ADDRESS], msg.as_string())
+    smtp_connection.quit()
+
+def main():
+    # we don't do anything if we have another instance of us running
+    lock_file = _take_lockfile()
+
+    if lock_file is None:
+        if config.DEBUG:
+            print("Concurrent script in progress, exiting")
+        sys.exit(1)
+
+    next_task = read_next_task_by_state(config.TASKS.PENDING)
+    if next_task is not None:
+        print("Next task is", next_task)
+        errtext = None
+        out = None
+        try:
+            out = shellutils.run_shell_cmd("%s %s" % (os.path.join(os.path.dirname(__file__), "runner.py"), next_task))
+        except ShellCmdException as exc:
+            print("Failed while running the test runner: %s", exc)
+            errtext = exc.__str__()
+        send_report(next_task, out, errtext)
+        read_next_task_by_state(config.TASKS.INPROGRESS, next_task)
+    else:
+        print("No task")
+
+    shellutils.unlockfile(lock_file)
+
+
+if __name__ == "__main__":
+    main()