Skip to content

Commit 1427239

Browse files
authored
Merge pull request #6 from fluxcd/alert-wildcard-selector
Add wildcard support
2 parents 85c8ac6 + 378f185 commit 1427239

File tree

5 files changed

+90
-12
lines changed

5 files changed

+90
-12
lines changed

config/samples/notification_v1alpha1_alert.yaml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ spec:
99
eventSeverity: info
1010
eventSources:
1111
- kind: GitRepository
12-
name: webapp
12+
name: '*'
1313
- kind: Kustomization
14-
name: webapp-frontend
15-
- kind: Kustomization
16-
name: webapp-backend
14+
name: '*'

docs/spec/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ spec:
7676
eventSeverity: info
7777
eventSources:
7878
- kind: GitRepository
79-
name: webapp
79+
name: '*'
8080
- kind: Kustomization
8181
name: webapp-frontend
8282
- kind: Kustomization

docs/spec/v1alpha1/alert.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,47 @@ const (
4747
ReadyCondition string = "Ready"
4848
)
4949
```
50+
51+
## Example
52+
53+
```yaml
54+
apiVersion: notification.fluxcd.io/v1alpha1
55+
kind: Alert
56+
metadata:
57+
name: webapp
58+
namespace: gitops-system
59+
spec:
60+
providerRef:
61+
name: on-call-slack
62+
eventSeverity: info
63+
eventSources:
64+
- kind: GitRepository
65+
name: webapp
66+
- kind: Kustomization
67+
name: webapp-backend
68+
- kind: Kustomization
69+
name: webapp-frontend
70+
```
71+
72+
The event severity can be set to `info` or `error`.
73+
74+
To target all resources of a particular kind in a namespace, you can use the `*` wildcard:
75+
76+
```yaml
77+
apiVersion: notification.fluxcd.io/v1alpha1
78+
kind: Alert
79+
metadata:
80+
name: all-kustomizations
81+
namespace: gitops-system
82+
spec:
83+
providerRef:
84+
name: dev-msteams
85+
eventSeverity: error
86+
eventSources:
87+
- kind: Kustomization
88+
namespace: gitops-system
89+
name: '*'
90+
suspend: false
91+
```
92+
93+
If you don't specify an event source namespace, the alert namespace will be used.

docs/spec/v1alpha1/provider.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,35 @@ const (
5858
ReadyCondition string = "Ready"
5959
)
6060
```
61+
62+
## Example
63+
64+
```yaml
65+
apiVersion: notification.fluxcd.io/v1alpha1
66+
kind: Provider
67+
metadata:
68+
name: slack
69+
namespace: gitops-system
70+
spec:
71+
type: slack
72+
channel: general
73+
# webhook address (ignored if secretRef is specified)
74+
address: https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK
75+
# secret containing the webhook address (optional)
76+
secretRef:
77+
name: webhook-url
78+
```
79+
80+
Webhook URL secret:
81+
82+
```sh
83+
kubectl -n gitops-system create secret generic webhook-url \
84+
--from-literal=address=https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK
85+
```
86+
87+
Note that the secret must contain an `address` field.
88+
89+
The provider type can be: `slack`, `msteams`, `rocket`, `discord` or `webhook`.
90+
91+
When type `webhook` is specified, the notification controller will post the
92+
incoming [event](event.md) in JSON format to the webhook address.

internal/server/handlers.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func (s *HTTPServer) handleEvent() func(w http.ResponseWriter, r *http.Request)
7373
if source.Namespace == "" {
7474
source.Namespace = alert.Namespace
7575
}
76-
if event.InvolvedObject.Name == source.Name &&
76+
if (source.Name == "*" || event.InvolvedObject.Name == source.Name) &&
7777
event.InvolvedObject.Namespace == source.Namespace &&
7878
event.InvolvedObject.Kind == source.Kind {
7979
if event.Severity == alert.Spec.EventSeverity ||
@@ -88,7 +88,7 @@ func (s *HTTPServer) handleEvent() func(w http.ResponseWriter, r *http.Request)
8888
alertProviders := make([]notifier.Interface, 0)
8989
if len(alerts) == 0 {
9090
s.logger.Info("Discarding event, no alerts found for the involved object",
91-
"object", event.InvolvedObject.Name)
91+
"object", event.InvolvedObject.Namespace+"/"+event.InvolvedObject.Name)
9292
w.WriteHeader(http.StatusAccepted)
9393
return
9494
}
@@ -101,7 +101,7 @@ func (s *HTTPServer) handleEvent() func(w http.ResponseWriter, r *http.Request)
101101
err = s.kubeClient.Get(ctx, providerName, &provider)
102102
if err != nil {
103103
s.logger.Error(err, "failed to read provider",
104-
"provider", providerName.Name)
104+
"provider", providerName)
105105
w.WriteHeader(http.StatusBadRequest)
106106
return
107107
}
@@ -114,7 +114,7 @@ func (s *HTTPServer) handleEvent() func(w http.ResponseWriter, r *http.Request)
114114
err = s.kubeClient.Get(ctx, secretName, &secret)
115115
if err != nil {
116116
s.logger.Error(err, "failed to read secret",
117-
"provider", providerName.Name,
117+
"provider", providerName,
118118
"secret", secretName.Name)
119119
w.WriteHeader(http.StatusBadRequest)
120120
return
@@ -124,7 +124,7 @@ func (s *HTTPServer) handleEvent() func(w http.ResponseWriter, r *http.Request)
124124
webhook = string(address)
125125
} else {
126126
s.logger.Error(err, "secret does not contain an address",
127-
"provider", providerName.Name,
127+
"provider", providerName,
128128
"secret", secretName.Name)
129129
w.WriteHeader(http.StatusBadRequest)
130130
return
@@ -133,7 +133,7 @@ func (s *HTTPServer) handleEvent() func(w http.ResponseWriter, r *http.Request)
133133

134134
if webhook == "" {
135135
s.logger.Error(nil, "provider has no address",
136-
"provider", providerName.Name)
136+
"provider", providerName)
137137
w.WriteHeader(http.StatusBadRequest)
138138
return
139139
}
@@ -142,7 +142,7 @@ func (s *HTTPServer) handleEvent() func(w http.ResponseWriter, r *http.Request)
142142
sender, err := factory.Notifier(provider.Spec.Type)
143143
if err != nil {
144144
s.logger.Error(err, "failed to initialise provider",
145-
"provider", providerName.Name,
145+
"provider", providerName,
146146
"type", provider.Spec.Type)
147147
w.WriteHeader(http.StatusBadRequest)
148148
return
@@ -151,6 +151,10 @@ func (s *HTTPServer) handleEvent() func(w http.ResponseWriter, r *http.Request)
151151
alertProviders = append(alertProviders, sender)
152152
}
153153

154+
s.logger.Info("Dispatching event",
155+
"object", event.InvolvedObject.Namespace+"/"+event.InvolvedObject.Name,
156+
"message", event.Message)
157+
154158
// send notifications in the background
155159
for _, provider := range alertProviders {
156160
go func(p notifier.Interface, e recorder.Event) {

0 commit comments

Comments
 (0)