Shared Mysql fix

This commit is contained in:
Vaibhav Pathak 2026-02-23 14:04:54 +05:30
parent e0c81132d4
commit c5c5224206

View File

@ -36,6 +36,8 @@ spec:
value: '{}' value: '{}'
- name: helmExternalParams - name: helmExternalParams
value: '{}' value: '{}'
- name: sharedMysqlConfig
value: '[]'
entrypoint: provision-environment entrypoint: provision-environment
templates: templates:
- inputs: - inputs:
@ -50,6 +52,7 @@ spec:
- name: manualDependencyUrls - name: manualDependencyUrls
- name: valuesContentEdits - name: valuesContentEdits
- name: helmExternalParams - name: helmExternalParams
- name: sharedMysqlConfig
name: provision-environment name: provision-environment
steps: steps:
- - arguments: - - arguments:
@ -74,6 +77,8 @@ spec:
value: '{{inputs.parameters.valuesContentEdits}}' value: '{{inputs.parameters.valuesContentEdits}}'
- name: helmExternalParams - name: helmExternalParams
value: '{{inputs.parameters.helmExternalParams}}' value: '{{inputs.parameters.helmExternalParams}}'
- name: sharedMysqlConfig
value: '{{inputs.parameters.sharedMysqlConfig}}'
name: create-git-repo name: create-git-repo
template: create-repo template: create-repo
- - arguments: - - arguments:
@ -104,6 +109,7 @@ spec:
- name: manualDependencyUrls - name: manualDependencyUrls
- name: valuesContentEdits - name: valuesContentEdits
- name: helmExternalParams - name: helmExternalParams
- name: sharedMysqlConfig
name: create-repo name: create-repo
script: script:
command: command:
@ -158,6 +164,10 @@ spec:
{{inputs.parameters.helmExternalParams}} {{inputs.parameters.helmExternalParams}}
EOFPARAM EOFPARAM
) )
SHARED_MYSQL_CONFIG=$(cat <<'EOFPARAM'
{{inputs.parameters.sharedMysqlConfig}}
EOFPARAM
)
# Sanitize namespace name (replace spaces and special chars with hyphens) # Sanitize namespace name (replace spaces and special chars with hyphens)
NAMESPACE=$(echo "$NAMESPACE" | tr '[:upper:]' '[:lower:]' | tr ' _' '-' | sed 's/[^a-z0-9-]//g' | sed 's/--*/-/g' | sed 's/^-//;s/-$//') NAMESPACE=$(echo "$NAMESPACE" | tr '[:upper:]' '[:lower:]' | tr ' _' '-' | sed 's/[^a-z0-9-]//g' | sed 's/--*/-/g' | sed 's/^-//;s/-$//')
@ -252,6 +262,91 @@ spec:
kubernetes.io/metadata.name: argo-workflows kubernetes.io/metadata.name: argo-workflows
EOF EOF
# Create shared MySQL instances
echo "Processing shared MySQL instances..."
echo "$SHARED_MYSQL_CONFIG" | jq -c '.[]' 2>/dev/null | while read -r instance; do
INSTANCE_NAME=$(echo "$instance" | jq -r '.instanceName')
VERSION=$(echo "$instance" | jq -r '.version')
if [ -z "$INSTANCE_NAME" ] || [ "$INSTANCE_NAME" = "null" ]; then
continue
fi
echo "Creating shared MySQL instance: $INSTANCE_NAME (MySQL $VERSION)"
# Build SQL to create all databases and grant permissions
DB_INIT_SQL="-- Auto-generated database initialization"
for db in $(echo "$instance" | jq -c '.databases[]'); do
DB_NAME=$(echo "$db" | jq -r '.databaseName')
SERVICE_NAME=$(echo "$db" | jq -r '.serviceName')
DB_INIT_SQL="${DB_INIT_SQL}
-- Database for ${SERVICE_NAME}
CREATE DATABASE IF NOT EXISTS \`${DB_NAME}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON \`${DB_NAME}\`.* TO 'mysql_user'@'%';"
done
DB_INIT_SQL="${DB_INIT_SQL}
FLUSH PRIVILEGES;"
# Create ArgoCD Application for shared MySQL
cat > "manifests/${INSTANCE_NAME}-application.yaml" <<EOF
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: $NAMESPACE-$INSTANCE_NAME
namespace: argocd
labels:
environment: $NAMESPACE
provisioned-by: backstage
shared-mysql: "true"
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: default
source:
repoURL: https://charts.bitnami.com/bitnami
chart: mysql
targetRevision: "9.14.4"
helm:
values: |
image:
tag: "$VERSION"
auth:
rootPassword: "local-root-pass"
username: "mysql_user"
password: "local-mysql-pass"
fullnameOverride: "$INSTANCE_NAME"
primary:
persistence:
enabled: true
size: 8Gi
resources:
requests:
cpu: 250m
memory: 512Mi
configuration: |
[mysqld]
max_connections = 200
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_authentication_plugin=mysql_native_password
initdbScripts:
create-databases.sql: |
$(echo "$DB_INIT_SQL" | sed 's/^/ /')
destination:
server: https://kubernetes.default.svc
namespace: $NAMESPACE
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=false
- ServerSideApply=true
EOF
echo "Created ArgoCD Application for $INSTANCE_NAME"
done
# Create service manifests # Create service manifests
# Convert comma-separated services to space-separated for iteration # Convert comma-separated services to space-separated for iteration
SERVICES_LIST=$(echo "$SERVICES" | tr ',' ' ') SERVICES_LIST=$(echo "$SERVICES" | tr ',' ' ')
@ -291,9 +386,50 @@ spec:
# Component has Helm chart - create ArgoCD Application manifest # Component has Helm chart - create ArgoCD Application manifest
echo "Creating ArgoCD Application for Helm chart: $service" echo "Creating ArgoCD Application for Helm chart: $service"
# Check dependency preferences for MySQL # Check if this service uses a shared MySQL instance
SERVICE_MYSQL_INSTANCE=""
SERVICE_DB_NAME=""
SHARED_MYSQL_PARAMS=""
if [ -n "$SHARED_MYSQL_CONFIG" ] && [ "$SHARED_MYSQL_CONFIG" != "[]" ]; then
SERVICE_MYSQL_INSTANCE=$(echo "$SHARED_MYSQL_CONFIG" | jq -r ".[] | select(.databases[].serviceName == \"$service\") | .instanceName // empty" | head -1)
if [ -n "$SERVICE_MYSQL_INSTANCE" ]; then
SERVICE_DB_NAME=$(echo "$SHARED_MYSQL_CONFIG" | jq -r ".[] | .databases[] | select(.serviceName == \"$service\") | .databaseName")
fi
fi
if [ -n "$SERVICE_MYSQL_INSTANCE" ]; then
# Service uses shared MySQL - disable bundled MySQL
echo " Service $service will use shared MySQL: $SERVICE_MYSQL_INSTANCE (database: $SERVICE_DB_NAME)"
MYSQL_ENABLED="false"
# Add external database configuration to Helm parameters
# Note: mysql.enabled is already set to "false" via MYSQL_ENABLED variable
SHARED_MYSQL_PARAMS="
- name: externalDatabase.host
value: \"$SERVICE_MYSQL_INSTANCE\"
- name: externalDatabase.port
value: \"3306\"
- name: externalDatabase.database
value: \"$SERVICE_DB_NAME\"
- name: externalDatabase.username
value: \"mysql_user\"
- name: externalDatabase.password
value: \"local-mysql-pass\"
- name: database.host
value: \"$SERVICE_MYSQL_INSTANCE\"
- name: database.port
value: \"3306\"
- name: database.name
value: \"$SERVICE_DB_NAME\"
- name: database.username
value: \"mysql_user\"
- name: database.password
value: \"local-mysql-pass\""
else
# Original behavior - check dependency preferences for MySQL
MYSQL_ENABLED=$(echo "$DEPENDENCY_PREFS" | jq -r '.mysql // "true"') MYSQL_ENABLED=$(echo "$DEPENDENCY_PREFS" | jq -r '.mysql // "true"')
echo " MySQL enabled: $MYSQL_ENABLED" echo " MySQL enabled: $MYSQL_ENABLED"
fi
# Process dependency URL mappings # Process dependency URL mappings
DEPENDENCY_URL_PARAMS="" DEPENDENCY_URL_PARAMS=""
@ -422,7 +558,7 @@ spec:
- name: httpRoute.parentRefs[0].sectionName - name: httpRoute.parentRefs[0].sectionName
value: "https" value: "https"
- name: httpRoute.hostnames[0] - name: httpRoute.hostnames[0]
value: "$HTTPROUTE_HOST"$DEPENDENCY_URL_PARAMS$CUSTOM_HELM_PARAMS value: "$HTTPROUTE_HOST"$DEPENDENCY_URL_PARAMS$CUSTOM_HELM_PARAMS$SHARED_MYSQL_PARAMS
destination: destination:
server: https://kubernetes.default.svc server: https://kubernetes.default.svc
namespace: $NAMESPACE namespace: $NAMESPACE