Files
loop-ops/db/bind.sh
T
2026-10-27 14:29:43 +03:00

31 lines
2.6 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# После cutover базы: прописать новую базу в визоре, иначе следующий sync вернёт CR на старую (так было с korica-team).
# loopctl db bind <куб> <loop id>
# Берёт MM_SQLSETTINGS_DATASOURCE(REPLICAS) из CR и кладёт в env визора через API,
# провайдер БД инстанса = ON_PREM-провайдер визора с тем же host:port.
set -euo pipefail
. "$(dirname "$0")/../lib/common.sh"
CTX=${1:?куб, например loop-3}; ID=${2:?loop id}
CR=$(kubectl --context "$CTX" -n loop get mattermost "$ID" -o json)
SRCENV=$(jq -c '[.spec.mattermostEnv[]|select(.name|test("^MM_SQLSETTINGS_DATASOURCE(REPLICAS)?$"))|{key:.name,value:.value}]' <<<"$CR")
DBHOST=$(jq -r '.[]|select(.key=="MM_SQLSETTINGS_DATASOURCE").value' <<<"$SRCENV" | sed -E 's#.*@([^/]+)/.*#\1#')
[ -n "$DBHOST" ] || { echo "в CR нет MM_SQLSETTINGS_DATASOURCE"; exit 1; }
PROVIDER=$(echo "select id||'|'||name from database_provider where vendor='ON_PREM' and host_name='${DBHOST%:*}' and host_port::text='${DBHOST##*:}';" | vsql)
[ "$(grep -c . <<<"$PROVIDER")" = 1 ] || { echo "в визоре не один ON_PREM-провайдер для $DBHOST: '$PROVIDER'"; exit 1; }
PNAME=${PROVIDER#*|}; PROVIDER=${PROVIDER%%|*}
FOUND=$(printf "select i.id||'|'||d.id from loop_instance i join database_instance d on d.id=i.database_instance_id where i.id like '%%%s' and i.deleted_at is null;\n" "${ID#loop}" | vsql)
[ "$(grep -c . <<<"$FOUND")" = 1 ] || { echo "в визоре не один инстанс: $FOUND"; exit 1; }
VID=${FOUND%%|*}; DBID=${FOUND#*|}
confirm "В визоре $ID: провайдер БД -> $PNAME ($DBHOST), env DATASOURCE* из CR на $CTX." || exit 1
ensure_token
echo "update database_instance set vendor='ON_PREM', database_provider_id='$PROVIDER' where id='$DBID';" | vsql
vapi "$VIZOR_API/$VID" | jq -c --argjson src "$SRCENV" \
'{environmentProperties: ([.environmentProperties[]|select(.key|test("^MM_SQLSETTINGS_DATASOURCE(REPLICAS)?$")|not)|{key,value}] + $src)}' \
| vapi -X PATCH "$VIZOR_API/$VID" -d @- -o /dev/null
# sync diff (эндпоинт есть не на всех версиях визора): env DATASOURCE* в визоре и в CR должны совпасть
D=$(vapi "$VIZOR_API/$VID/synchronization/diff" 2>/dev/null | jq -r '[..|objects|select((.path? // "")|startswith("env.MM_SQLSETTINGS_DATASOURCE"))]|length' 2>/dev/null) || D="diff недоступен"
echo "-- визор: провайдер $PNAME, env обновлены. Расхождений DATASOURCE в sync diff: ${D:-diff недоступен} (должно быть 0)"