grafana-operator
grafana-operator copied to clipboard
Implement `spec.uid` for `GrafanaDashboard`
Followed the same pattern as #1686 for the CustomUID.
As discussed in the weekly sync, spec.uid
or metadata.uid
will always overwrite dashboardModel.uid
.
Thanks to the existing Status.UID
update detection, existing dashboards are automatically migrated to using metadata.uid
by the operator.
Local procedure for testing
Chainsaw tests
make e2e-local-gh-actions TESTS=immutable_uids
Manual
make start-kind
make deploy
kind export kubeconfig --name kind-grafana
# Test resources
kubectl apply -f https://raw.githubusercontent.com/grafana-operator/grafana-operator/master/examples/basic/resources.yaml
kubectl apply -f ../test-dashboard.yaml
# Check status:
# dashboards
# - default/dashboard-uid/dashUID
kubectl get grafanas -A -o yaml
# Build and apply image to cluster
make ko-build-kind
IMG=ko.local/grafana/grafana-operator make deploy
kubectl patch deploy -n grafana-operator-system grafana-operator-controller-manager-v5 --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/imagePullPolicy", "value":"IfNotPresent"}]'
# Check status:
# dashboards
# - default/dashboard-uid/dashUID -> specUID
kubectl get grafanas -A -o yaml
../test-dashboard.yaml
apiVersion: grafana.integreatly.org/v1beta1
kind: GrafanaDashboard
metadata:
name: dashboard-uid
spec:
instanceSelector:
matchLabels:
dashboards: "grafana"
uid: specUID
resyncPeriod: 10s
json: >
{
"id": null,
"uid": "dashUID",
"title": "Simple Dashboard",
"tags": [],
"style": "dark",
"timezone": "browser",
"editable": true,
"hideControls": false,
"graphTooltip": 1,
"panels": [],
"time": {
"from": "now-6h",
"to": "now"
},
"timepicker": {
"time_options": [],
"refresh_intervals": []
},
"templating": {
"list": []
},
"annotations": {
"list": []
},
"refresh": "5s",
"schemaVersion": 17,
"version": 0,
"links": []
}
- [x] Chainsaw tests for immutability of
spec.uid
- [x] Chainsaw tests for expected status on Grafana instance
- [ ] Update dashboard UID documentation