summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Bennée <alex.bennee@linaro.org>2014-07-09 11:31:54 +0100
committerAlex Bennée <alex.bennee@linaro.org>2014-07-09 11:31:54 +0100
commit3ba5965fba7111ae5596f4d0eb22bf2e20f7aa1e (patch)
tree2aef676b3b6654e9a20f738ca1d8e87201d811f9
parentd60700b86d05eab1e8aa731d263c0f0953e3c39e (diff)
lava-mode/jobs: add utility functions for finding jobs
This is exemplified by mustang-cloudimg-continue which can schedule a job against an already running job so we can "persist" to a degree over several boots.
-rw-r--r--examples/mustang-cloudimg-continue.json60
-rw-r--r--lava-jobs.el46
-rw-r--r--lava-mode.el13
3 files changed, 119 insertions, 0 deletions
diff --git a/examples/mustang-cloudimg-continue.json b/examples/mustang-cloudimg-continue.json
new file mode 100644
index 0000000..b3dafba
--- /dev/null
+++ b/examples/mustang-cloudimg-continue.json
@@ -0,0 +1,60 @@
+{
+ "target": "`(lava-mode-device-running-latest '("mustang-cloudimg-hacking-session" "mustang-cloudimg-continue"))`",
+ "job_name": "mustang-cloudimg-continue",
+ "timeout": 30000,
+ "actions": [
+ {
+ "command": "deploy_linaro_kernel",
+ "parameters": {
+ "dtb": "http://people.linaro.org/~alex.bennee/images/mustang/apm-mustang.dtb",
+ "kernel": "http://people.linaro.org/~alex.bennee/images/mustang/`(lava-mode-find-latest-file "~/public_html/images/mustang" "uImage")`",
+ "login_commands": [
+ "sleep 60; sudo -s"
+ ],
+ "login_prompt": "login:",
+ "password": "password",
+ "password_prompt": "Password",
+ "target_type": "ubuntu",
+ "username": "ubuntu"
+ }
+ },
+ {
+ "command": "boot_linaro_image",
+ "parameters": {
+ "boot_cmds": [
+ "setenv autoload no",
+ "setenv kernel_addr_r '{KERNEL_ADDR}'",
+ "setenv initrd_addr_r '{RAMDISK_ADDR}'",
+ "setenv fdt_addr_r '{DTB_ADDR}'",
+ "setenv loadstuff 'tftp ${kernel_addr_r} {KERNEL}; tftp ${initrd_addr_r} {RAMDISK}; tftp ${fdt_addr_r} {DTB}'",
+ "setenv bootargs console=ttyS0,115200 root=/dev/sda1 ip=dhcp",
+ "setenv bootcmd 'dhcp; setenv serverip {SERVER_IP}; run loadstuff; {BOOTX}'",
+ "boot"
+ ]
+ }
+ },
+ {
+ "command": "lava_test_shell",
+ "parameters": {
+ "testdef_repos": [
+ {
+ "git-repo": "http://git.linaro.org/people/alex.bennee/hacking-session.git",
+ "parameters": {
+ "IRC_USER": "ajb-linaro",
+ "PUB_KEY": `(format "\"%s\"" (s-trim (shell-command-to-string "cat ~/.ssh/id_rsa.pub")))`
+ },
+ "testdef": "hacking-session-debian.yaml"
+ }
+ ],
+ "timeout": `(format "%s" (lava-mode-end-of-day-timeout "18:00"))`
+ }
+ },
+ {
+ "command": "submit_results",
+ "parameters": {
+ "server": "http://validation.linaro.org/RPC2/",
+ "stream": "/anonymous/alex.bennee/"
+ }
+ }
+ ]
+}
diff --git a/lava-jobs.el b/lava-jobs.el
index f680e78..96b1fc3 100644
--- a/lava-jobs.el
+++ b/lava-jobs.el
@@ -28,8 +28,12 @@
;; manipulating the list of LAVA jobs used by the other modes.
;;
;;; Code:
+;; uncomment to debug
+;(setq debug-on-error t)
+;(setq edebug-all-defs t)
;; Require prerequisites
+(require 'dash)
;; Variables
@@ -75,6 +79,48 @@
(setq lava-job-info
(cons `(,index . ,hash) lava-job-info))))))
+(defun lava-jobs-get-field (job-id key)
+ "Return a given field or `NIL' for a given job-id"
+ (let ((info-hash (lava-jobs-get-hash job-id)))
+ (gethash key info-hash)))
+
+;; Some generic access functions
+
+(defun lava-jobs-get-actual-device (job-id)
+ "Return the actual device this job is running on, or nil"
+ (let ((hostcache (or (lava-jobs-get-field job-id
+ "_actual_device_cache")
+ (lava-jobs-get-field job-id "_requested_device_cache"))))
+ (if hostcache
+ (cdr (assoc "hostname" hostcache))
+ nil)))
+
+(defun lava-jobs-find-running-job-by-name (name)
+ "Return a list of running jobs that match the job description"
+ (-filter
+ (lambda (job)
+ (let ((info-hash (lava-jobs-get-hash job)))
+ (string-match-p name (gethash "description" info-hash))))
+ (-map 'car lava-job-info)))
+
+; (lava-jobs-find-running-job-by-name "mustang-cloudimg-hacking-session")
+
+(defun lava-jobs-filter-by-state (state list-of-jobs)
+ "Return a list of jobs in a given state"
+ (--filter (string-match-p state (lava-jobs-get-field it "job_status")) list-of-jobs))
+
+(defun lava-jobs-find-latest-running (list-of-jobs)
+ "Return the latest running job of a list of jobs"
+ (let ((running-jobs (lava-jobs-filter-by-state "Running"
+ list-of-jobs)))
+ (when running-jobs
+ (--max-by (let ((it-time (lava-jobs-get-field it "updated"))
+ (other-time (lava-jobs-get-field it "updated")))
+ (time-less-p other-time it-time))
+ running-jobs))))
+
+; (lava-jobs-find-latest-running (lava-jobs-find-running-job-by-name "mustang-cloudimg-hacking-session"))
+
(provide 'lava-jobs)
;;; lava-jobs.el ends here
diff --git a/lava-mode.el b/lava-mode.el
index eecab88..ee010ac 100644
--- a/lava-mode.el
+++ b/lava-mode.el
@@ -215,5 +215,18 @@ This is intended to ensure hacking sessions don't hang around for too
(not (time-less-p (nth 5 (file-attributes fileA))
(nth 5 (file-attributes fileB))))) all-files))))
+(defun lava-mode-device-running-latest (name-or-list-of-names)
+ "Return the device which is running the latest version of `NAME'"
+ (let* ((jobs
+ (if (stringp name-or-list-of-names)
+ (lava-jobs-find-running-job-by-name name-or-list-of-names)
+ (-mapcat 'lava-jobs-find-running-job-by-name name-or-list-of-names)))
+ (latest (lava-jobs-find-latest-running jobs)))
+ (when latest
+ (lava-jobs-get-actual-device latest))))
+
+; (lava-mode-device-running-latest "mustang-cloudimg-hacking-session")
+; (lava-mode-device-running-latest '("mustang-cloudimg-hacking-session" "mustang-cloudimg-continue"))
+
(provide 'lava-mode)
;;; lava-mode.el ends here