1
+ #! /bin/bash
2
+ set -euo pipefail
3
+
4
+ PROJECT_ID=$( gcloud config get-value project)
5
+ SERVICE_ACCOUNT_NAME=" ikanse-gcp-wif-mono-sa"
6
+ GCS_KEY_FILE=" /tmp/gcp-wif-mono.json"
7
+ BUCKET_NAME=" ikanse-gcp-wif-mono"
8
+
9
+ # Create GCP service account
10
+ SERVICE_ACCOUNT_EMAIL=$( gcloud iam service-accounts create " $SERVICE_ACCOUNT_NAME " \
11
+ --display-name=" TempoMonolithic Account" \
12
+ --project " $PROJECT_ID " \
13
+ --format=' value(email)' \
14
+ --quiet)
15
+
16
+ # Wait for the service account to be ready
17
+ echo " Waiting for service account $SERVICE_ACCOUNT_EMAIL to be ready..."
18
+ MAX_RETRIES=10
19
+ RETRY_COUNT=0
20
+ while ! gcloud iam service-accounts describe " $SERVICE_ACCOUNT_EMAIL " --project " $PROJECT_ID " & > /dev/null; do
21
+ if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then
22
+ echo " Error: Service account $SERVICE_ACCOUNT_EMAIL not found after $MAX_RETRIES retries. Exiting."
23
+ exit 1
24
+ fi
25
+ echo " Service account not yet available. Retrying in 5 seconds..."
26
+ sleep 5
27
+ RETRY_COUNT=$(( RETRY_COUNT + 1 ))
28
+ done
29
+ echo " Service account $SERVICE_ACCOUNT_EMAIL is ready."
30
+
31
+ # Set the GCP and TempoStack vars
32
+ TEMPO_NAME=" gcpwifmn"
33
+ TEMPO_NAMESPACE=" chainsaw-gcpwif-mono"
34
+ PROJECT_NUMBER=$( gcloud projects describe " $PROJECT_ID " --format=' value(projectNumber)' )
35
+ OIDC_ISSUER=$( oc get authentication.config cluster -o jsonpath=' {.spec.serviceAccountIssuer}' )
36
+ POOL_ID=$( echo " $OIDC_ISSUER " | awk -F' /' ' {print $NF}' | sed ' s/-oidc$//' )
37
+
38
+ # Bind the required GCP roles to the created SA at the project level
39
+ gcloud projects add-iam-policy-binding " $PROJECT_ID " \
40
+ --member=" serviceAccount:$SERVICE_ACCOUNT_EMAIL " \
41
+ --role=" roles/storage.objectAdmin" \
42
+ --format=none \
43
+ --quiet
44
+
45
+ # Workload Identity Bindings: Allow Kubernetes Service Accounts to impersonate the Google Service Account
46
+ gcloud iam service-accounts add-iam-policy-binding " $SERVICE_ACCOUNT_EMAIL " \
47
+ --role=" roles/iam.workloadIdentityUser" \
48
+ --member=" principal://iam.googleapis.com/projects/$PROJECT_NUMBER /locations/global/workloadIdentityPools/$POOL_ID /subject/system:serviceaccount:${TEMPO_NAMESPACE} :tempo-${TEMPO_NAME} " \
49
+ --project=" $PROJECT_ID " \
50
+ --quiet
51
+
52
+ gcloud iam service-accounts add-iam-policy-binding " $SERVICE_ACCOUNT_EMAIL " \
53
+ --role=" roles/iam.workloadIdentityUser" \
54
+ --member=" principal://iam.googleapis.com/projects/$PROJECT_NUMBER /locations/global/workloadIdentityPools/$POOL_ID /subject/system:serviceaccount:${TEMPO_NAMESPACE} :tempo-${TEMPO_NAME} -query-frontend" \
55
+ --project=" $PROJECT_ID " \
56
+ --quiet
57
+
58
+ # Get provider ID from GCP
59
+ PROVIDER_ID=$( gcloud iam workload-identity-pools providers list \
60
+ --project=" $PROJECT_ID " \
61
+ --location=" global" \
62
+ --workload-identity-pool=" $POOL_ID " \
63
+ --filter=" displayName:$POOL_ID " \
64
+ --format=" value(name)" | awk -F' /' ' {print $NF}' )
65
+
66
+ # Create a credentials configuration file for the managed identity to be used by TempoStack
67
+ gcloud iam workload-identity-pools create-cred-config \
68
+ " projects/$PROJECT_NUMBER /locations/global/workloadIdentityPools/$POOL_ID /providers/$PROVIDER_ID " \
69
+ --service-account=" $SERVICE_ACCOUNT_EMAIL " \
70
+ --credential-source-file=/var/run/secrets/storage/serviceaccount/token \
71
+ --credential-source-type=text \
72
+ --output-file=" $GCS_KEY_FILE "
73
+
74
+ echo " Checking if bucket $BUCKET_NAME exists..."
75
+ if gsutil ls " gs://$BUCKET_NAME " > /dev/null 2>&1 ; then
76
+ echo " Bucket $BUCKET_NAME found. Attempting to remove..."
77
+ gcloud alpha storage rm --recursive " gs://$BUCKET_NAME "
78
+ if [ $? -ne 0 ]; then
79
+ echo " Failed to remove bucket $BUCKET_NAME ."
80
+ exit 1
81
+ fi
82
+ echo " Bucket $BUCKET_NAME removed successfully."
83
+ else
84
+ echo " Bucket $BUCKET_NAME does not exist (as expected). Proceeding to create."
85
+ fi
86
+
87
+ echo " Waiting for the bucket to be confirmed deleted (if it was removed)."
88
+ BUCKET_DELETION_RETRIES=6
89
+ DELETE_RETRY_COUNT=0
90
+ while gsutil ls " gs://$BUCKET_NAME " > /dev/null 2>&1 && [ $DELETE_RETRY_COUNT -lt $BUCKET_DELETION_RETRIES ]; do
91
+ echo " Bucket $BUCKET_NAME still detected. Waiting 5 seconds for deletion..."
92
+ sleep 5
93
+ DELETE_RETRY_COUNT=$(( DELETE_RETRY_COUNT + 1 ))
94
+ done
95
+
96
+ if [ $DELETE_RETRY_COUNT -ge $BUCKET_DELETION_RETRIES ]; then
97
+ echo " Warning: Bucket $BUCKET_NAME still exists after waiting period. This might cause issues for creation."
98
+ fi
99
+
100
+ echo " Attempting to create a new bucket: gs://$BUCKET_NAME in us-central1..."
101
+ gsutil mb -l us-central1 -p " $PROJECT_ID " " gs://$BUCKET_NAME "
102
+ if [ $? -ne 0 ]; then
103
+ echo " Failed to create bucket $BUCKET_NAME ."
104
+ exit 1
105
+ fi
106
+ echo " Bucket $BUCKET_NAME created successfully."
107
+
108
+ echo " Grant access to the bucket by service account."
109
+ gcloud storage buckets add-iam-policy-binding " gs://$BUCKET_NAME " \
110
+ --role=" roles/storage.admin" \
111
+ --member=" serviceAccount:$SERVICE_ACCOUNT_EMAIL " \
112
+ --condition=None
113
+
114
+ PROVIDER_NAME=" projects/$PROJECT_NUMBER /locations/global/workloadIdentityPools/$POOL_ID /providers/$PROVIDER_ID "
115
+ AUDIENCE=$( gcloud iam workload-identity-pools providers describe " $PROVIDER_NAME " --format=' value(oidc.allowedAudiences[0])' )
116
+
117
+ # Create Kubernetes secret to be used with TempoStack
118
+ kubectl -n " $TEMPO_NAMESPACE " create secret generic gcs-secret \
119
+ --from-literal=bucketname=" $BUCKET_NAME " \
120
+ --from-literal=audience=" $AUDIENCE " \
121
+ --from-file=key.json=" $GCS_KEY_FILE "
122
+ if [ $? -ne 0 ]; then
123
+ echo " Failed to create secret"
124
+ exit 1
125
+ fi
0 commit comments