forked from BasedHardware/omi
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeploy-backend-secrets.sh
More file actions
executable file
·134 lines (121 loc) · 3.9 KB
/
Copy pathdeploy-backend-secrets.sh
File metadata and controls
executable file
·134 lines (121 loc) · 3.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/env bash
set -euo pipefail
ENVIRONMENT="${ENVIRONMENT:-${ENV:-}}"
GCP_PROJECT_ID="${GCP_PROJECT_ID:-}"
GKE_CLUSTER="${GKE_CLUSTER:-}"
REGION="${REGION:-}"
BACKEND_SECRETS_GSA="${BACKEND_SECRETS_GSA:-}"
CHART_DIR="${CHART_DIR:-backend/charts/backend-secrets}"
VALUES_FILE="${VALUES_FILE:-}"
NAMESPACE="${NAMESPACE:-}"
RELEASE_NAME="${RELEASE_NAME:-}"
DRY_RUN="${DRY_RUN:-false}"
WAIT_EXTERNAL_SECRET="${WAIT_EXTERNAL_SECRET:-true}"
EXTERNAL_SECRET_WAIT_TIMEOUT_SECONDS="${EXTERNAL_SECRET_WAIT_TIMEOUT_SECONDS:-120}"
EXTERNAL_SECRET_NAME="${EXTERNAL_SECRET_NAME:-}"
TARGET_SECRET_NAME="${TARGET_SECRET_NAME:-}"
if [[ -z "$ENVIRONMENT" ]]; then
echo "ERROR: ENVIRONMENT or ENV is required" >&2
exit 2
fi
if [[ -z "$GCP_PROJECT_ID" ]]; then
echo "ERROR: GCP_PROJECT_ID is required" >&2
exit 2
fi
if [[ -z "$GKE_CLUSTER" ]]; then
echo "ERROR: GKE_CLUSTER is required" >&2
exit 2
fi
if [[ -z "$REGION" ]]; then
echo "ERROR: REGION is required" >&2
exit 2
fi
if [[ -z "$VALUES_FILE" ]]; then
VALUES_FILE="backend/charts/backend-secrets/${ENVIRONMENT}_omi_backend_secrets_values.yaml"
fi
if [[ -z "$NAMESPACE" ]]; then
NAMESPACE="${ENVIRONMENT}-omi-backend"
fi
if [[ -z "$RELEASE_NAME" ]]; then
RELEASE_NAME="${ENVIRONMENT}-omi-backend-secrets"
fi
if [[ -z "$BACKEND_SECRETS_GSA" ]]; then
BACKEND_SECRETS_GSA="${ENVIRONMENT}-omi-backend-eso-gsa@${GCP_PROJECT_ID}.iam.gserviceaccount.com"
fi
if [[ ! -f "$VALUES_FILE" ]]; then
echo "ERROR: backend-secrets values file not found: $VALUES_FILE" >&2
exit 2
fi
read_values_field() {
local field_path="$1"
python3 - "$VALUES_FILE" "$field_path" <<'PY'
from pathlib import Path
import sys
import yaml
values_path = Path(sys.argv[1])
field_path = sys.argv[2].split('.')
with values_path.open('r', encoding='utf-8') as handle:
value = yaml.safe_load(handle)
for part in field_path:
if not isinstance(value, dict):
value = None
break
value = value.get(part)
if value is None:
value = ''
print(value)
PY
}
if [[ -z "$EXTERNAL_SECRET_NAME" ]]; then
EXTERNAL_SECRET_NAME="$(read_values_field externalSecret.name)"
fi
if [[ -z "$TARGET_SECRET_NAME" ]]; then
TARGET_SECRET_NAME="$(read_values_field externalSecret.targetSecretName)"
fi
if [[ -z "$EXTERNAL_SECRET_NAME" ]]; then
echo "ERROR: externalSecret.name is required in $VALUES_FILE or EXTERNAL_SECRET_NAME" >&2
exit 2
fi
if [[ -z "$TARGET_SECRET_NAME" ]]; then
echo "ERROR: externalSecret.targetSecretName is required in $VALUES_FILE or TARGET_SECRET_NAME" >&2
exit 2
fi
HELM_ARGS=(
"$RELEASE_NAME"
"$CHART_DIR"
-f "$VALUES_FILE"
--set "gke.projectID=${GCP_PROJECT_ID}"
--set "gke.clusterLocation=${REGION}"
--set "gke.clusterName=${GKE_CLUSTER}"
--set "gsa.name=${BACKEND_SECRETS_GSA}"
)
verify_target_secret_keys() {
kubectl -n "$NAMESPACE" get secret "$TARGET_SECRET_NAME" -o json \
| python3 backend/scripts/verify_k8s_secret_keys.py "$VALUES_FILE"
}
helm template "${HELM_ARGS[@]}" >/dev/null
if [[ "$DRY_RUN" == "true" ]]; then
echo "backend-secrets render preflight OK for ${RELEASE_NAME} in ${NAMESPACE}"
exit 0
fi
helm -n "$NAMESPACE" upgrade --install --create-namespace "${HELM_ARGS[@]}"
force_sync_at="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
kubectl -n "$NAMESPACE" annotate externalsecret \
"$EXTERNAL_SECRET_NAME" \
force-sync="${force_sync_at}" --overwrite
if [[ "$WAIT_EXTERNAL_SECRET" == "true" ]]; then
wait_status=0
python3 backend/scripts/wait_external_secret_refresh.py \
--namespace "$NAMESPACE" \
--name "$EXTERNAL_SECRET_NAME" \
--min-refresh-time "${force_sync_at}" \
--timeout-seconds "$EXTERNAL_SECRET_WAIT_TIMEOUT_SECONDS" || wait_status=$?
if [[ "$wait_status" -eq 0 ]]; then
verify_target_secret_keys
elif [[ "$wait_status" -eq 2 ]]; then
echo "WARNING: ExternalSecret did not report a fresh refresh before timeout; verifying current target secret keys." >&2
verify_target_secret_keys
else
exit "$wait_status"
fi
fi