From 3ba5965fba7111ae5596f4d0eb22bf2e20f7aa1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Benn=C3=A9e?= Date: Wed, 9 Jul 2014 11:31:54 +0100 Subject: 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. --- examples/mustang-cloudimg-continue.json | 60 +++++++++++++++++++++++++++++++++ lava-jobs.el | 46 +++++++++++++++++++++++++ lava-mode.el | 13 +++++++ 3 files changed, 119 insertions(+) create mode 100644 examples/mustang-cloudimg-continue.json 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 -- cgit v1.2.3