-
Notifications
You must be signed in to change notification settings - Fork 409
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Dynamic Notification Policy Routes #1800
Dynamic Notification Policy Routes #1800
Conversation
Adapted PROJECT to new go module version path and ran: ``` ./bin/operator-sdk create api --group grafana --version v1beta1 --kind GrafanaNotificationPolicyRoute --controller false ```
- during the reconcile loop in notificationpolicy_controller.go, we have to fetch all matching GrafanaNotificationPolicyRoutes for the currently reconciled GrafanaNotificationPolicy - this can be very easily achieved with a routeSelector, which will be a Kubernetes LabelSelector - if we would go with instanceSelector, we would have to fetch all available GrafanaNotificationPolicyRoutes and then do some filtering afterwards, to see if the instanceSelector matches, which would be both more inefficient and more complex
The GrafanaNotificationPolicy Controller now watches GrafanaNoticationPolicyRoutes instead of using ownerReferences, as ownerReferences do not support cross-namespace references. We now also emit a event on the GrafanaNotificationPolicyRoute to indicate that it has been merged into a specific policy.
This PR hasn't been updated for a while, marking as stale |
I have updated the draft PR with the latest discussions from #1789:
There are no checks for Another idea would be to solve this by implementing a ValidationWebhook. @theSuess do you have any thoughts on this? Results of updates SamplesAssembled ❮ kubectl get grafananotificationpolicy grafananotificationpolicy-sample -o jsonpath="{.status}" |jq {
"conditions": [
{
"lastTransitionTime": "2025-01-21T09:48:19Z",
"message": "Notification Policy was successfully applied to 1 instances",
"observedGeneration": 1,
"reason": "ApplySuccessful",
"status": "True",
"type": "NotificationPolicySynchronized"
}
],
"discoveredRoutes": [
"default/dynamic-e",
"grafana-crds/dynamic-c",
"default/dynamic-d"
]
} ❯ kubectl get events
LAST SEEN TYPE REASON OBJECT MESSAGE
20m Normal Merged grafananotificationpolicyroute/dynamic-d Route merged into NotificationPolicy default/grafananotificationpolicy-sample
20m Normal Merged grafananotificationpolicyroute/dynamic-d Route merged into NotificationPolicy default/grafananotificationpolicy-sample
20m Normal Merged grafananotificationpolicyroute/dynamic-e Route merged into NotificationPolicy default/grafananotificationpolicy-sample
20m Normal Merged grafananotificationpolicyroute/dynamic-e Route merged into NotificationPolicy default/grafananotificationpolicy-sample |
3da8a88
to
95a1fd8
Compare
I rebased on the latest master branch. Additionally I looked into the ValidationWebhook for ensuring that While the implementation of the logic is quite straight-forward, setting up webhooks is a bit more complex, especially bringing this to the Helm chart. I can certainly do this if you think this is the way forward, we can find another way to do the validation, or maybe skip this validation for now. Any thoughts? |
Sorry for the deleted comment, missed the part about api level validation rules in your previous note. We had some discussions around Validation Webhooks before and came to the conclusion that these are too finicky to get right. If the validation rules don't work, I'd just go for a status condition in the respective object when both values are set which tells the user that the dynamic matching takes priority and the |
Unfortunately, as far as I can see, the validation expressions will not work due to the Alternatively, I will go with the hint in the status condition as you suggested 👍 |
I hope I caught everything now, if not let me know! Thanks a lot for your support! I learned a lot and this was a really nice experience! |
} | ||
assembledNotificationPolicy, mergedRoutes, err = assembleNotificationPolicyRoutes(ctx, r.Client, namespace, assembledNotificationPolicy) | ||
r.Log.Info("assembled notification policy routes", "mergedRoutes", mergedRoutes) | ||
if err != nil { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The synchronize
condition is specifically used when talking about API calls to a Grafana instance.
For other errors, the plan is to re-use or create new shared conditions to use.
Or potentially look into publishing events as you have done here 😉.
Hence, putting it right after the apply/synchronize loop makes the most sense.
a simpler defer
is generally better also.
This also allows you to remove the applyError[globalApplyError]
which could confuse users that have a Grafana instance named global(Guilty)
As a side note, dissimilar to other projects' use of conditions, Grafana-Operator removes old conditions immediately rather than setting the status False
.
This avoids multiple conditions where you have to look for the ones that are True
@Baarsgaard I tried to adapt this in the latest commit 00ebd92
Thanks for your explanation. If the synchronized condition was built specifically for Grafana API errors, then of course it makes sense to adapt this. |
29f70cd
to
34c81f7
Compare
- reverted changes that moved building synchronized condition to defer - added a specific error type for loop detected errors - set condition for specific errors and emit events otherwise for assembly errors
34c81f7
to
00ebd92
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Huge fan of the changes to the Reconcile function, it's a lot simpler now :D
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks again for all the work on this! I've pushed a small cleanup commit and queued this for merging. Looks like the next release will be full of cool new features!
0ebdb21
to
2167f71
Compare
2167f71
to
56d4f5e
Compare
See #1789 for the related feature proposal.
This implementation is still work in progress for now and should support the feature proposal.
Updates on
GrafanaNotificationPolicyRoutes
are tracked via watches. I first tried to accomplish this via ownerReferences (see commits), but this is not supported cross-namespace.Example of how the sample policies in
hack/kind/resources/default/grafana-notification-policy.yaml
are rendered:Status updates on the
GrafanaNotificationPolicy
Events emitted for the merged routes: