From 441856198fc7fd6a843ffa8b57bdecb35a8e4d12 Mon Sep 17 00:00:00 2001 From: James Andariese Date: Fri, 11 Apr 2025 14:42:08 -0500 Subject: [PATCH] add generate_external_config generates a config based on the configmap and secrets in the cluster. this config is intended to be used to add an external node to the cluster. --- tools | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/tools b/tools index 4e93554..684562b 100755 --- a/tools +++ b/tools @@ -79,6 +79,69 @@ generate_layout() {( # generates a sample layout, (args are included verbatim, e done )} +generate_external_config() {( # generate a config for an external node + jq -rn \ + --argjson secret "$(kubectl -n "$GARAGE_NAMESPACE" get secret garage-secrets -o json)" \ + --argjson cm "$(kubectl -n "$GARAGE_NAMESPACE" get configmap garage-config -o json)" \ + --argjson peers "$(get_ids | jq -R | jq -s)" \ + ' + # FUNCTIONS + + def prettyjson: + if type != "array" then [tojson] else + if length < 2 then [tojson] else + [ (.[0] | "[\n \(tojson),\n") + , (.[1:-1][] | " \(tojson),\n") + , (.[-1] | " \(tojson)\n") + , "]" + ] + end + end | add; + + # gencfg: generates a toml line which will use a raw json value if possible or a string if not. + # to guarantee a string, double encode it. + def gencfg: + ( (.value | fromjson?) // .value) as $v + | (if .key == "bootstrap_peers" then ($v + $peers) else ($v) end) as $v + | "\(.key) = \($v | prettyjson)"; + + # secval: get the value of the $secret, base64 decoded. + # will emit 0 items (not an empty list!) if no matching key is found. + # try jq -n "[[][],1,[][]]" (and figure it out) for a more clear understanding. + def secval($k): $secret.data | to_entries[] | select(.key == $k) | .value | @base64d; + + # SETUP VARIABLES + [ $cm | .data | to_entries[] + , {"key": "rpc_secret", "value": secval("rpc-secret")} + , {"key": "admin.admin_token", "value": secval("admin-token")} + , {"key": "admin.metrics_token", "value": secval("metrics-token")} + ] | group_by(.key | test("[.]")) + as $asec + # data format now: [[{k,v},...],[{s.k,v},...]] + | $asec[0] + as $nsec + | [$asec[1][] | (.key | split(".")) as $k | {"section": $k[0], "key": $k[1], "value": .value}] + as $ysec + | [$ysec[] | .section] | unique + as $sections + + | [][] # EMIT DATA -- [][] is to allow all outputs to start with , + + # emit unsectioned data + ,( + $nsec[] | + gencfg + ) + # emit sectioned data + ,( + $sections[] as $section | ( + "\n[\($section)]" + , ($ysec[] | select(.section == $section) | gencfg) + ) + ) + ' +)} + make_bucket() { # make a bucket along with metadata in a namespace TARGETBUCKET="$1" TARGETKEYNAME="${2-$TARGETBUCKET}-app-key"