import json with open("homelab-gitops-repo/manifests/aerodrome/grafana/ai-stack-dashboard.json") as f: dashboard_json = f.read() with open("homelab-gitops-repo/manifests/aerodrome/grafana/grafana.yaml") as f: content = f.read() # Replace volumeMounts old_mounts = """ volumeMounts: - mountPath: /etc/grafana/grafana.ini name: config subPath: grafana.ini - mountPath: /var/lib/grafana name: storage""" new_mounts = """ volumeMounts: - mountPath: /etc/grafana/grafana.ini name: config subPath: grafana.ini - mountPath: /var/lib/grafana name: storage - mountPath: /etc/grafana/provisioning/datasources/datasources.yaml name: datasources-config subPath: datasources.yaml - mountPath: /etc/grafana/provisioning/dashboards/dashboards.yaml name: dashboards-provider-config subPath: dashboards.yaml - mountPath: /var/lib/grafana-dashboards/ai-stack-dashboard.json name: ai-stack-dashboard subPath: ai-stack-dashboard.json""" assert old_mounts in content, "old_mounts not found" content = content.replace(old_mounts, new_mounts) # Replace volumes old_vols = """ volumes: - configMap: defaultMode: 420 name: grafana name: config - name: storage persistentVolumeClaim: claimName: grafana""" new_vols = """ volumes: - configMap: defaultMode: 420 name: grafana name: config - name: storage persistentVolumeClaim: claimName: grafana - configMap: defaultMode: 420 name: grafana-datasources name: datasources-config - configMap: defaultMode: 420 name: grafana-dashboards-provider name: dashboards-provider-config - configMap: defaultMode: 420 name: grafana-dashboard-ai-stack name: ai-stack-dashboard""" assert old_vols in content, "old_vols not found" content = content.replace(old_vols, new_vols) # Append ConfigMaps at the bottom extra_cms = f"""--- apiVersion: v1 kind: ConfigMap metadata: name: grafana-datasources namespace: default labels: app.kubernetes.io/name: grafana data: datasources.yaml: | apiVersion: 1 datasources: - name: Prometheus type: prometheus access: proxy url: http://prometheus:9090 isDefault: true jsonData: timeInterval: 15s --- apiVersion: v1 kind: ConfigMap metadata: name: grafana-dashboards-provider namespace: default labels: app.kubernetes.io/name: grafana data: dashboards.yaml: | apiVersion: 1 providers: - name: 'ai-stack-provider' orgId: 1 folder: 'AI Stack & Inference' type: file disableDeletion: false editable: true options: path: /var/lib/grafana-dashboards --- apiVersion: v1 kind: ConfigMap metadata: name: grafana-dashboard-ai-stack namespace: default labels: app.kubernetes.io/name: grafana data: ai-stack-dashboard.json: | {chr(10).join(' ' + line for line in dashboard_json.splitlines())} """ content = content.rstrip() + "\n" + extra_cms with open("homelab-gitops-repo/manifests/aerodrome/grafana/grafana.yaml", "w") as f: f.write(content) print("Updated grafana.yaml successfully!")