garage/script/jepsen.garage/src/jepsen/garage.clj

102 lines
3.7 KiB
Clojure
Raw Normal View History

2023-04-18 10:14:13 +00:00
(ns jepsen.garage
2023-04-19 12:14:22 +00:00
(:require
[clojure.string :as str]
[jepsen
[checker :as checker]
[cli :as cli]
[generator :as gen]
[nemesis :as nemesis]
[tests :as tests]]
[jepsen.os.debian :as debian]
[jepsen.garage
2023-10-18 14:30:45 +00:00
[daemon :as grg]
[nemesis :as grgNemesis]
[reg :as reg]
[set :as set]]))
2023-04-18 14:10:07 +00:00
2023-04-19 12:14:22 +00:00
(def workloads
"A map of workload names to functions that construct workloads, given opts."
{"reg1" reg/workload1
"reg2" reg/workload2
"set1" set/workload1
"set2" set/workload2})
2023-04-18 14:10:07 +00:00
(def scenari
"A map of scenari to the associated nemesis"
2023-10-24 09:39:45 +00:00
{"c" grgNemesis/scenario-c
"cp" grgNemesis/scenario-cp
"r" grgNemesis/scenario-r
"pr" grgNemesis/scenario-pr
"cpr" grgNemesis/scenario-cpr
2023-10-25 12:43:24 +00:00
"cdp" grgNemesis/scenario-cdp
"dpr" grgNemesis/scenario-dpr})
(def patches
"A map of patch names to Garage builds"
{"default" "v0.9.0"
"tsfix1" "d146cdd5b66ca1d3ed65ce93ca42c6db22defc09"
"tsfix2" "c82d91c6bccf307186332b6c5c6fc0b128b1b2b1"
"task3a" "d4df03424f1c7f3cc1eaba9e16d2e1d049131b97"})
2023-04-19 12:14:22 +00:00
(def cli-opts
"Additional command line options."
[["-p" "--patch NAME" "Garage patch to use"
:default "default"
:validate [patches (cli/one-of patches)]]
["-s" "--scenario NAME" "Nemesis scenario to run"
:default "cp"
:validate [scenari (cli/one-of scenari)]]
2023-04-19 12:14:22 +00:00
["-r" "--rate HZ" "Approximate number of requests per second, per thread."
:default 10
:parse-fn read-string
:validate [#(and (number? %) (pos? %)) "Must be a positive number"]]
[nil "--ops-per-key NUM" "Maximum number of operations on any given key."
:default 100
:parse-fn parse-long
:validate [pos? "Must be a positive integer."]]
["-w" "--workload NAME" "Workload of test to run"
:default "reg1"
2023-04-19 12:14:22 +00:00
:validate [workloads (cli/one-of workloads)]]])
2023-04-18 10:14:13 +00:00
(defn garage-test
"Given an options map from the command line runner (e.g. :nodes, :ssh,
:concurrency, ...), constructs a test map."
[opts]
(let [garage-version (get patches (:patch opts))
db (grg/db garage-version)
workload ((get workloads (:workload opts)) opts)
scenario ((get scenari (:scenario opts)) (assoc opts :db db))]
2023-04-19 12:14:22 +00:00
(merge tests/noop-test
opts
{:pure-generators true
:name (str "garage " (name (:workload opts)) " " (name (:scenario opts)) " " (name (:patch opts)))
2023-04-19 12:14:22 +00:00
:os debian/os
:db db
2023-04-19 12:14:22 +00:00
:client (:client workload)
:generator (gen/phases
(->>
(:generator workload)
(gen/stagger (/ (:rate opts)))
(gen/nemesis (:generator scenario))
(gen/time-limit (:time-limit opts)))
(gen/log "Healing cluster")
(gen/nemesis (:final-generator scenario))
(gen/log "Waiting for recovery")
(gen/sleep 10)
(gen/clients (:final-generator workload)))
:nemesis (:nemesis scenario)
2023-04-19 12:14:22 +00:00
:checker (checker/compose
{:perf (checker/perf (:perf scenario))
2023-04-19 12:14:22 +00:00
:workload (:checker workload)})
})))
2023-04-18 10:14:13 +00:00
(defn -main
"Handles command line arguments. Can either run a test, or a web server for
browsing results."
[& args]
2023-04-19 12:14:22 +00:00
(cli/run! (merge (cli/single-test-cmd {:test-fn garage-test
:opt-spec cli-opts})
2023-04-18 11:59:03 +00:00
(cli/serve-cmd))
2023-04-18 10:14:13 +00:00
args))