(ns toaster.jobs (:require [clojure.string :as str] [clojure.java.io :as io] [clj-time.core :as time] [clj-time.coerce :as tc] [clj-storage.db.mongo :refer [create-mongo-store]] [clj-storage.core :as db] [failjure.core :as f] [taoensso.timbre :as log :refer [debug]] [me.raynes.conch :as sh :refer [with-programs]] [toaster.config :refer :all] [toaster.ring :refer [jobs]] [hiccup.form :as hf])) ;; list of arm targets to chose from ;"beagleboneblack" ;"chromeacer" ;"chromeveyron" ;"droid4" ;"n900" ;"odroidxu4" ;"odroidxu" ;"ouya" ;"raspi1" ;"raspi2" ;"raspi3" ;"rock64" ;"sunxi" ;"turbox-twister" (defn- ssh-host [config] (str (q config [:jenkins :user]) "@" (q config [:jenkins :host]))) (defn sync_jobs [config arg1 arg2] (with-programs [ssh] (try (-> (ssh "-i" (q config [:jenkins :key]) (ssh-host config) "sync_jobs.py" arg1 arg2) (str/split #"\n")) (catch Exception e (f/fail (str "ERROR in sync_jobs.py " arg1 " " arg2 " - " (.getMessage e))))))) (defn- dockerlint [path] (with-programs [node] (try (node "node_modules/dockerlint/bin/dockerlint.js" path) (catch Exception e (f/fail (str "ERROR in dockerlint - " (.getMessage e))))))) (defn add [path config account] (with-programs [ssh scp node] (let [tstamp (tc/to-long (time/now)) jobname (str (:email account) "-vm_amd64_ascii-" tstamp) jobdir (str "/srv/toaster/" jobname)] (f/attempt-all [r_lint (dockerlint path) r_mkdir (ssh "-i" (q config [:jenkins :key]) (ssh-host config) "mkdir" "-p" jobdir) r_scp (scp "-i" (q config [:jenkins :key]) path (str (ssh-host config) ":" jobdir "/Dockerfile")) r_job (sync_jobs config "-a" jobname) r_store (db/store! @jobs :jobid {:jobid jobname :email (:email account) :account (dissoc account :password :activation-link) :lint (if (.contains r_lint "is OK") true false) :timestamp tstamp :type "vm_amd64_ascii" :dockerfile (slurp path)})] {:lint r_lint :job r_job} (f/when-failed [e] (f/fail (str "Job add '" jobname "' failure: " (f/message e))))))))