charts/osdu-developer-init/templates/elastic-init.yaml (150 lines of code) (raw):
{{- $namespace := .Release.Namespace -}}
{{- if .Values.jobs.elasticInit }}
---
apiVersion: batch/v1
kind: Job
metadata:
name: init-elastic
namespace: {{ $namespace }}
annotations:
sidecar.istio.io/inject: "false" # Disable Istio sidecar injection
spec:
ttlSecondsAfterFinished: 120
activeDeadlineSeconds: 600 # Timeout set to 10 minutes
backoffLimit: 2 # Job will fail after 2 unsuccessful retries
template:
metadata:
annotations:
sidecar.istio.io/inject: "false" # Disable Istio sidecar injection
spec:
serviceAccountName: workload-identity-sa # Specify the service account here
initContainers:
- name: health-check
image: mcr.microsoft.com/cbl-mariner/base/core:2.0
command: ["/bin/sh"]
args:
- -c
- |
tdnf install -y curl jq && \
while true; do
health_status=$(curl -u "elastic:$(cat /mnt/elasticsearch-es-elastic-user/elastic)" -k -s "http://elasticsearch-es-http.${NAMESPACE}.svc.cluster.local:9200/_cluster/health" | jq -r '.status')
if [ "$health_status" = "green" ]; then
echo "Cluster health is green."
exit 0
fi
echo "Cluster health is $health_status. Waiting for it to be green..."
sleep 30
done
env:
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
volumeMounts:
- name: es-basic-auth
mountPath: /mnt/elasticsearch-es-elastic-user
containers:
- name: elastic-user
image: mcr.microsoft.com/cbl-mariner/base/core:2.0
command: ["/bin/sh"]
args:
- -c
- |
sh /mnt/scripts/user-setup.sh
env:
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
volumeMounts:
- name: script-config
mountPath: /mnt/scripts
- name: azure-keyvault
mountPath: /mnt/azure-keyvault
- name: es-basic-auth
mountPath: /mnt/elasticsearch-es-elastic-user
restartPolicy: Never
volumes:
- name: es-basic-auth
secret:
secretName: elasticsearch-es-elastic-user
- name: azure-keyvault
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: keyvault-credentials-keyvault
- name: script-config
configMap:
name: user-setup
---
apiVersion: v1
kind: ConfigMap
metadata:
name: user-setup
namespace: {{ $namespace }}
data:
user-setup.sh: |
#!/bin/sh
# Read the new user's username and password from Azure KeyVault
NEW_USERNAME=$(cat /mnt/azure-keyvault/opendes-elastic-username)
NEW_PASSWORD=$(cat /mnt/azure-keyvault/opendes-elastic-password)
# Define the custom role and user creation JSON payloads
CUSTOM_ELASTIC_ROLE="service-role"
ROLE_JSON="{\"cluster\":[\"all\"],\"indices\":[{\"names\":[\"*\"],\"privileges\":[\"read\",\"write\",\"create\",\"delete\",\"index\",\"monitor\",\"create_index\",\"delete_index\",\"view_index_metadata\",\"manage\"]}]}"
USER_JSON="{\"password\":\"$NEW_PASSWORD\",\"roles\":[\"$CUSTOM_ELASTIC_ROLE\"]}"
# Elasticsearch service URL
ES_SERVICE_URL="http://elasticsearch-es-http.${NAMESPACE}.svc.cluster.local:9200"
# Check if the custom role already exists
role_response=$(curl -s -k -o /dev/null -w "%{http_code}" -u "elastic:$(cat /mnt/elasticsearch-es-elastic-user/elastic)" \
"${ES_SERVICE_URL}/_security/role/$CUSTOM_ELASTIC_ROLE")
if [ "$role_response" -eq 200 ]; then
echo "Role $CUSTOM_ELASTIC_ROLE already exists."
else
# Create the custom role
create_role_response=$(curl -s -k -o /dev/null -w "%{http_code}" -X POST "${ES_SERVICE_URL}/_security/role/$CUSTOM_ELASTIC_ROLE" \
-u "elastic:$(cat /mnt/elasticsearch-es-elastic-user/elastic)" \
-H "Content-Type: application/json" \
-d "$ROLE_JSON")
if [ "$create_role_response" -eq 200 ]; then
echo "Successfully created the custom role $CUSTOM_ELASTIC_ROLE."
else
echo "Failed to create the custom role. HTTP status code: $create_role_response"
exit 1
fi
fi
# Check if the new user already exists
user_response=$(curl -s -k -o /dev/null -w "%{http_code}" -u "elastic:$(cat /mnt/elasticsearch-es-elastic-user/elastic)" \
"${ES_SERVICE_URL}/_security/user/$NEW_USERNAME")
if [ "$user_response" -eq 200 ]; then
echo "User $NEW_USERNAME already exists. Updating password."
# Update the existing user's password
update_password_response=$(curl -s -k -o /dev/null -w "%{http_code}" -X POST "${ES_SERVICE_URL}/_security/user/$NEW_USERNAME/_password" \
-u "elastic:$(cat /mnt/elasticsearch-es-elastic-user/elastic)" \
-H "Content-Type: application/json" \
-d "{\"password\":\"$NEW_PASSWORD\"}")
if [ "$update_password_response" -eq 200 ]; then
echo "Successfully updated the password for user $NEW_USERNAME."
# Test the new user credentials
test_response=$(curl -s -k -o /dev/null -w "%{http_code}" -u "$NEW_USERNAME:$NEW_PASSWORD" -k "${ES_SERVICE_URL}")
if [ "$test_response" -eq 200 ]; then
echo "Successfully authenticated with updated user credentials."
else
echo "Failed to authenticate with updated user credentials. HTTP status code: $test_response"
exit 1
fi
else
echo "Failed to update the password for user. HTTP status code: $update_password_response"
exit 1
fi
else
# Create the new user with the custom role
create_user_response=$(curl -s -k -o /dev/null -w "%{http_code}" -X POST "${ES_SERVICE_URL}/_security/user/$NEW_USERNAME" \
-u "elastic:$(cat /mnt/elasticsearch-es-elastic-user/elastic)" \
-H "Content-Type: application/json" \
-d "$USER_JSON")
if [ "$create_user_response" -eq 200 ]; then
echo "Successfully created the new user $NEW_USERNAME."
# Test the new user credentials
test_response=$(curl -s -k -o /dev/null -w "%{http_code}" -u "$NEW_USERNAME:$NEW_PASSWORD" -k "${ES_SERVICE_URL}")
if [ "$test_response" -eq 200 ]; then
echo "Successfully authenticated with new user credentials."
else
echo "Failed to authenticate with new user credentials. HTTP status code: $test_response"
exit 1
fi
else
echo "Failed to create the new user. HTTP status code: $create_user_response"
exit 1
fi
fi
{{- end }}