Skip to content
This repository was archived by the owner on Mar 26, 2020. It is now read-only.

Commit 2039f6f

Browse files
Madhu-1kshlm
authored andcommitted
implement webhook push handler
implement handler function to send events to registered webhook registered handle function will get called when the events happen. check origin UUID, if it is same as the peer ID send events to the registered webhook Signed-off-by: Madhu Rajanna <mrajanna@redhat.com>
1 parent 4f5fc8d commit 2039f6f

File tree

4 files changed

+77
-17
lines changed

4 files changed

+77
-17
lines changed

glusterd2/events/eventhandler.go

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package events
22

33
import (
4+
"encoding/json"
45
"fmt"
56
"net/http"
67
"sort"
@@ -11,6 +12,7 @@ import (
1112
"github.com/gluster/glusterd2/pkg/api"
1213
eventsapi "github.com/gluster/glusterd2/plugins/events/api"
1314

15+
jwt "github.com/dgrijalva/jwt-go"
1416
log "github.com/sirupsen/logrus"
1517
)
1618

@@ -161,14 +163,34 @@ func (h *handler) Events() []string {
161163
return h.events
162164
}
163165

164-
func getJWTToken(url string, secret string) string {
165-
//TODO generate the gwt token from the sceret
166-
return ""
166+
func getJWTToken(eventtype, secret string) string {
167+
claims := &jwt.StandardClaims{
168+
IssuedAt: time.Now().Unix(),
169+
ExpiresAt: time.Now().Add(time.Second * 10).Unix(),
170+
Subject: eventtype,
171+
}
172+
173+
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
174+
ss, err := token.SignedString([]byte(secret))
175+
if err != nil {
176+
return ""
177+
}
178+
return ss
167179
}
168180

169-
//SendWebhookMsg sends HTTP Post request to webhook URL
170-
func SendWebhookMsg(webhook *eventsapi.Webhook, message string) error {
171-
body := strings.NewReader(message)
181+
//WebhookPublish sends event to registered webhooks
182+
func WebhookPublish(webhook *eventsapi.Webhook, e *api.Event) error {
183+
message, err := json.Marshal(e)
184+
if err != nil {
185+
log.WithFields(log.Fields{
186+
"name": e.Name,
187+
"error": err.Error(),
188+
}).Error("failed to marshal event")
189+
return err
190+
}
191+
192+
body := strings.NewReader(string(message))
193+
172194
req, err := http.NewRequest("POST", webhook.URL, body)
173195
if err != nil {
174196
log.WithError(err).Error("error forming the request object")
@@ -180,7 +202,7 @@ func SendWebhookMsg(webhook *eventsapi.Webhook, message string) error {
180202
}
181203

182204
if webhook.Secret != "" {
183-
token := getJWTToken(webhook.URL, webhook.Secret)
205+
token := getJWTToken(e.Name, webhook.Secret)
184206
req.Header.Set("Authorization", "bearer "+token)
185207
}
186208

glusterd2/servers/eventlistener/handler.go

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,6 @@ func getWebhooks() []*eventsapi.Webhook {
2121
return webhooks
2222
}
2323

24-
func webhookPublish(webhook *eventsapi.Webhook, message string) {
25-
err := gd2events.SendWebhookMsg(webhook, message)
26-
if err != nil {
27-
log.WithError(err).Error("Error while publishing event to webhook")
28-
}
29-
30-
return
31-
}
32-
3324
func handleMessage(inMessage string, addr *net.UDPAddr) {
3425
data := strings.SplitN(inMessage, " ", 3)
3526
if len(data) != 3 {

plugins/events/hooks.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package events
2+
3+
import (
4+
gd2events "github.com/gluster/glusterd2/glusterd2/events"
5+
"github.com/gluster/glusterd2/glusterd2/gdctx"
6+
"github.com/gluster/glusterd2/pkg/api"
7+
eventsapi "github.com/gluster/glusterd2/plugins/events/api"
8+
"github.com/pborman/uuid"
9+
10+
log "github.com/sirupsen/logrus"
11+
)
12+
13+
type webhooksNotifier struct{}
14+
15+
func (w *webhooksNotifier) Handle(e *api.Event) {
16+
//send events only from originator node
17+
if !uuid.Equal(e.Origin, gdctx.MyUUID) {
18+
return
19+
}
20+
// Get the list of registered Webhooks
21+
webhooks, err := GetWebhookList()
22+
if err != nil {
23+
log.WithError(err).Error("error retriving webhook list from etcd")
24+
return
25+
}
26+
27+
for _, w := range webhooks {
28+
go func(e *api.Event, w *eventsapi.Webhook) {
29+
err = gd2events.WebhookPublish(w, e)
30+
if err != nil {
31+
log.WithError(err).Error("error in pushing data to webhook")
32+
}
33+
}(e, w)
34+
}
35+
36+
}
37+
38+
func (w *webhooksNotifier) Events() []string {
39+
return []string{}
40+
}
41+
42+
func init() {
43+
w := new(webhooksNotifier)
44+
gd2events.Register(w)
45+
}

plugins/events/rest.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,12 @@ func eventsListHandler(w http.ResponseWriter, r *http.Request) {
128128

129129
func checkConnection(c transaction.TxnCtx) error {
130130
var req eventsapi.Webhook
131+
131132
if err := c.Get("req", &req); err != nil {
132133
return err
133134
}
134-
return gd2events.SendWebhookMsg(&req, "")
135+
e := gd2events.New("TEST", map[string]string{}, false)
136+
return gd2events.WebhookPublish(&req, e)
135137
}
136138

137139
func registerWebhookTestStepFuncs() {

0 commit comments

Comments
 (0)