charts/osdu-developer-init/templates/schema-init.yaml (140 lines of code) (raw):

{{- $enabled := eq (include "osdu-developer-init.isEnabled" .) "1" -}} {{- $namespace := .Release.Namespace -}} {{- if and $enabled .Values.jobs.schemaInit }} --- apiVersion: batch/v1 kind: Job metadata: name: schema-init namespace: {{ $namespace }} spec: ttlSecondsAfterFinished: 120 template: metadata: labels: azure.workload.identity/use: "true" spec: serviceAccountName: workload-identity-sa volumes: - name: script configMap: name: schema-init-script defaultMode: 0777 - name: token configMap: name: schema-init-script defaultMode: 0777 initContainers: - name: data-seed image: community.opengroup.org:5555/osdu/platform/system/schema-service/schema-service-schema-load-release-0-27:beb6f65c1d9c303e86a6047adc93b2192d0c62ba volumeMounts: - name: script mountPath: "/home/osdu/deployments/scripts/azure/bootstrap.sh" subPath: init.sh - name: token mountPath: "/home/osdu/deployments/scripts/azure/Token.py" subPath: token.py env: - name: DATA_PARTITION value: {{ .Values.partition | quote }} - name: AZURE_AD_APP_RESOURCE_ID value: {{ .Values.clientId | quote }} - name: AZURE_TENANT_ID value: {{ .Values.tenantId | quote }} containers: - name: sleep image: istio/base command: ["/bin/sleep", "10"] restartPolicy: Never --- apiVersion: v1 kind: ConfigMap metadata: name: schema-init-script namespace: {{ $namespace }} data: init.sh: | #!/usr/bin/env sh # Cleanup function cleanup() { echo "Terminating istio sidecar" curl -X POST "http://localhost:15020/quitquitquit" exit } trap cleanup EXIT if [[ -z "${NAMESPACE}" ]]; then NAMESPACE="osdu-core" fi export AZURE_SCHEMA_URL="http://schema.osdu-core.svc.cluster.local/api/schema-service/v1/schemas/system" currentStatus="success" currentMessage="All schemas uploaded successfully" BEARER_TOKEN=`python $AZURE_DEPLOYMENTS_SUBDIR/Token.py` export BEARER_TOKEN=$BEARER_TOKEN python $AZURE_DEPLOYMENTS_SCRIPTS_SUBDIR/DeploySharedSchemas.py -u $AZURE_SCHEMA_URL ret=$? echo "Return value is $ret" if [[ $ret -ne 0 ]]; then currentStatus="failure" currentMessage="Schema loading failed. Please check error logs for more details." fi if [ ! -z "$CONFIG_MAP_NAME" -a "$CONFIG_MAP_NAME" != " " ]; then echo "==================================================================" echo " Logging in using Workload Identity" echo "==================================================================" # Login using the federated token from the environment variable az login --federated-token "$(cat ${AZURE_FEDERATED_TOKEN_FILE})" \ --service-principal \ -u ${AZURE_CLIENT_ID} \ -t ${AZURE_TENANT_ID} ENV_AKS=$(az aks list --resource-group $RESOURCE_GROUP_NAME --query [].name -otsv) az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $ENV_AKS kubectl config set-context $RESOURCE_GROUP_NAME --cluster $ENV_AKS Status=$(kubectl get configmap $CONFIG_MAP_NAME -o jsonpath='{.data.status}') Message=$(kubectl get configmap $CONFIG_MAP_NAME -o jsonpath='{.data.message}') Message="${Message}Schema load Message: ${currentMessage}. " ## Update ConfigMap kubectl create configmap $CONFIG_MAP_NAME \ --from-literal=status="$currentStatus" \ --from-literal=message="$Message" \ -o yaml --dry-run=client | kubectl replace -f - fi if [[ ${currentStatus} == "success" ]]; then exit 0 else exit 1 fi token.py: | import os import msal class AzureToken(object): def get_azure_id_token(self): tenant_id = os.getenv('AZURE_TENANT_ID') client_id = os.getenv('AZURE_CLIENT_ID') # Read the federated token provided by workload identity token_path = os.getenv('AZURE_FEDERATED_TOKEN_FILE', '/var/run/secrets/azure/tokens/azure-identity-token') if not all([tenant_id, client_id]): print('Missing required environment variables: AZURE_TENANT_ID and AZURE_CLIENT_ID are required') exit(1) try: # Read the federated token with open(token_path, 'r') as f: federated_token = f.read().strip() authority_host_uri = 'https://login.microsoftonline.com' authority_uri = authority_host_uri + '/' + tenant_id # Configure MSAL for federated token exchange app = msal.ConfidentialClientApplication( client_id=client_id, authority=authority_uri, client_credential={ "client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer", "client_assertion": federated_token } ) # Use the same scope as az cli would use scopes = ["https://management.azure.com/.default"] result = app.acquire_token_for_client(scopes=scopes) if 'access_token' in result: token = 'Bearer ' + result['access_token'] print(token) return token else: print(f"Error getting token: {result.get('error_description', 'Unknown error')}") exit(1) except Exception as e: print(f"Error: {str(e)}") exit(1) if __name__ == '__main__': AzureToken().get_azure_id_token() {{- end }}