This project started out a basic tool synchronizing collection configuration between Solr clusters (satrn.clj). From there, it grew along with a project bringing SRE and Continuous Delivery to Solr environments - minimalism and simplicity being key design elements.
Command line tools:
satrn.clj: Reconcile collections, configsets and aliases to desired state - the GitOps game. It may be helpful to know that this tool started out using a Solr server reprensenting desire state - not git. State, such as shard leaders or nodesets (creation) has no natural representation there. Hence, things have been stretched a bit and covered by tool configuration and more recently, metadata in the Solr Blob store.
Removal and destruction may be missing for some objects, but implementation should be fairly straight forward.
update_docs.clj: Read documents from stdin and update them in collection.
export_docs.clj : Export documents from collection to stdout.
clone.clj : Export and update - piped shortcut.
rnb.clj : Restore and backup collections.
dff.clj : Diff json files
cnt_qdff.clj : Compare counts for queries
rpc.clj : Read RPC style command sequence from stdin and send them to Solr. Safest way to try it out is ./src/rpc.clj <test/rpc-clusterstatus.edn (read only call).
logs.clj : Analyze/Visualize/Structure logs. Cloud Console/Shell is not enough.
Most of them have a --help option.
Unless explicitly set (e.g. using environment variables SOLR_BASE_URL/ SOLR_AUTH, LOG_LEVEL), the library assumes defaults http://localhost:8983 / solr:SolrRocks / info. Setting the log level to debug will log http call details.
Using babashka for portability and minimalism. asdf can be used to install babashka as follows:
asdf plugin add babashka
asdf plugin add k6 # if you want to try JavaScript InterOp Library
asdf installThere are various ways to use these tools (Script, Container, Library, Java Interop) - Don't get confused.
Run NREPL-server bb nrepl-server and jack in with your editor. This is the bare minimum. Visual Studio Code with Calva extension is a great editor.
Even though the Open Container Image only uses babashka (and not a full JVM), you might want to use deps.edn with a JVM for a better dev experience.
To quickly get your feet wet, you can spin up a Solr cluster using docker-compose:
# Spin up solrcloud single node
# docker-compose up
# Spin up solrcloud multi node
docker-compose -f docker-compose.yml -f docker-compose-multi-solr.yml up
# Set default solr:SolrRocks auth
# docker exec -i satrn_solr-1_1 sh -c 'cat >/tmp/security.json && solr zk cp /tmp/security.json zk:security.json -z zoo-1:2181' <assets/security.json
# Create a single shard collection with 3 (requires multi node version)
./src/rpc.clj <test/rpc-create-collection.edn
# Create a single shard collection with 1 replica (requires multi node version)
sed -e s/'replicationFactor.*'/'replicationFactor "1"'/g \
<test/rpc-create-collection.edn | ./src/rpc.clj Run sync application:
export config=config-default.edn
./src/satrn.clj sync # Run w/o argument to get help
Run the project's tests:
./test-runner.cljBuild uberscripts (bake relatated use cases into single files):
bb buildBuild AOT- uberjar (Java InterOp):
clj -T:build uberUsing rnb from Java main:
java -classpath target/satrn-*-standalone.jar satrn.RnBBuild Node Library (CommonJS InterOp - targeting k6):
clj -A:shadow-cljs release :libRunning basic k6 sample (using InterOp)
k6 run --http-debug=full -i 1 ./sample-k6.jsBuild and run an Open Container Image:
TAG=satrn:0
docker build -t ${TAG} .
docker run --rm ${TAG}
# Run with custom config
# docker run --rm -v `pwd`/config-sample.edn:/config-default.edn ${TAG}Use as a library from Clojure
clojure -Sdeps '{:deps {io.github.deas/satrn {:sha "..." }}}' \
-e "(require '[satrn.command :as c])(-> (c/cmd-cluster-status) c/execute c/response-map)"Run update on Kubernetes using image from private registry:
K8S_CTX=default
K8S_NS=search
K8S_IMAGE=ghcr.io/deas/satrn:latest
zcat collection.json.gz | \
kubectl --context $K8S_CTX run update-docs --rm -i --image $K8S_IMAGE \
--overrides='{"apiVersion": "v1", "spec": {"template": {"spec": { "imagePullSecrets": [{"name": "regcred"}]}}}}' \
-- bb /update_docs.clj -d '{:destination {:base-url "http://solr-ingress:8983", :basic-auth ["solr" "SolrRocks"]}}' collection- Solr 9 is expected to ship functionality around replica placement that may be worth checkout out
- Logging is configurable, but currently optimized for Google Cloud Platform
satrn.cljexposes Prometheus metrics
Refactor for use as a libraryLeveragebabashkatasks for build- Leverage github actions cache
- Beware:
config.ednin classpath still appears overlayconfigenvironment (->test) - Consistently use default at latest possible moment - not in CLIs (-> testing)
- Remove TODO: tags in code
- Refactor to use sub-commands (appears cli-matic/spec is fine with
babashkanow? Ordocopt.clj?) - Update credentials in
security.json Export config to folder/zip?Discover Solr server version and support recent (source) versionssatrn.cljConfig: Externalize secrets?- Clean up config maps/merging
- Improve test coverage
- Improve jvm interop
- Improve node-/
k6library target (Idea to leverage code fromk6came later so this is a bit of a retrofit) - Shim
k6/httpfor node repl exploration - Improve validation and error handling
- Leverage nested diagnostic context for collections.
satrn.clj: Suppport for stored querieslogs.cljStreaming :gcloud alpha logging tail/ raw Kubernetes support (likely needs timestamp sorting)- Release helm chart to github (pages?), probably https://github.com/helm/chart-releaser-action and/or https://github.com/helm/chart-releaser
- Migrate
asdf->nix - Try out Solr-9