Skip to content

Commit fc2fda0

Browse files
committed
apigatewayutils -> lambdautils, better name for MultiEventTypeHandler & move it to lambdautils
1 parent 7ce3a5b commit fc2fda0

File tree

4 files changed

+47
-37
lines changed

4 files changed

+47
-37
lines changed

cmd/alertmanager/lambdahandler.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"errors"
77
"github.com/aws/aws-lambda-go/events"
88
"github.com/aws/aws-lambda-go/lambda"
9+
"github.com/function61/lambda-alertmanager/pkg/lambdautils"
910
)
1011

1112
func lambdaHandler() {
@@ -24,7 +25,7 @@ func lambdaHandler() {
2425
return asJson, err
2526
}
2627

27-
lambda.StartHandler(multiLambdaEventTypeDispatcher{func(ctx context.Context, polymorphicEvent interface{}) ([]byte, error) {
28+
handler := func(ctx context.Context, polymorphicEvent interface{}) ([]byte, error) {
2829
switch event := polymorphicEvent.(type) {
2930
case *events.CloudWatchEvent:
3031
return nil, handleCloudwatchScheduledEvent(ctx, event.Time)
@@ -37,5 +38,7 @@ func lambdaHandler() {
3738
default:
3839
return nil, errors.New("cannot identify type of request")
3940
}
40-
}})
41+
}
42+
43+
lambda.StartHandler(lambdautils.NewMultiEventTypeHandler(handler))
4144
}

cmd/alertmanager/restapi.go

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ import (
88
"github.com/function61/gokit/jsonfile"
99
"github.com/function61/lambda-alertmanager/pkg/alertmanagertypes"
1010
"github.com/function61/lambda-alertmanager/pkg/amstate"
11-
"github.com/function61/lambda-alertmanager/pkg/apigatewayutils"
11+
"github.com/function61/lambda-alertmanager/pkg/lambdautils"
1212
"os"
1313
"time"
1414
)
1515

1616
func handleRestCall(ctx context.Context, req events.APIGatewayProxyRequest) (*events.APIGatewayProxyResponse, error) {
1717
app, err := getApp(ctx)
1818
if err != nil {
19-
return apigatewayutils.InternalServerError(err.Error()), nil
19+
return lambdautils.InternalServerError(err.Error()), nil
2020
}
2121

2222
synopsis := req.HTTPMethod + " " + req.Path
@@ -29,26 +29,26 @@ func handleRestCall(ctx context.Context, req events.APIGatewayProxyRequest) (*ev
2929
// pragmatic here because we want acks to be ack-able from emails
3030
id := req.QueryStringParameters["id"]
3131
if id == "" {
32-
return apigatewayutils.BadRequest("id not specified"), nil
32+
return lambdautils.BadRequest("id not specified"), nil
3333
}
3434

3535
return handleAcknowledgeAlert(ctx, id)
3636
case "POST /alerts/ingest":
3737
alert := amstate.Alert{}
3838
if err := jsonfile.Unmarshal(bytes.NewBufferString(req.Body), &alert, true); err != nil {
39-
return apigatewayutils.BadRequest(err.Error()), nil
39+
return lambdautils.BadRequest(err.Error()), nil
4040
}
4141
alert.Id = amstate.NewAlertId()
4242

4343
created, err := ingestAlertsAndReturnCreatedFlag(ctx, []amstate.Alert{alert}, app)
4444
if err != nil {
45-
return apigatewayutils.InternalServerError(err.Error()), nil
45+
return lambdautils.InternalServerError(err.Error()), nil
4646
}
4747

4848
if created {
49-
return apigatewayutils.Created(), nil
49+
return lambdautils.Created(), nil
5050
} else {
51-
return apigatewayutils.NoContent(), nil
51+
return lambdautils.NoContent(), nil
5252
}
5353
case "GET /deadmansswitch/checkin": // /deadmansswitch/checkin?subject=ubackup_done&ttl=24h30m
5454
// same semantic hack here as acknowledge endpoint
@@ -59,16 +59,16 @@ func handleRestCall(ctx context.Context, req events.APIGatewayProxyRequest) (*ev
5959
case "POST /deadmansswitch/checkin": // {"subject":"ubackup_done","ttl":"24h30m"}
6060
checkin := alertmanagertypes.DeadMansSwitchCheckinRequest{}
6161
if err := jsonfile.Unmarshal(bytes.NewBufferString(req.Body), &checkin, true); err != nil {
62-
return apigatewayutils.BadRequest(err.Error()), nil
62+
return lambdautils.BadRequest(err.Error()), nil
6363
}
6464

6565
return handleDeadMansSwitchCheckin(ctx, checkin)
6666
case "GET /deadmansswitches":
6767
return handleGetDeadMansSwitches(ctx, app)
6868
case "POST /prometheus-alertmanager/api/v1/alerts":
69-
return apigatewayutils.InternalServerError("not implemented yet"), nil
69+
return lambdautils.InternalServerError("not implemented yet"), nil
7070
default:
71-
return apigatewayutils.BadRequest(fmt.Sprintf("unknown endpoint: %s", synopsis)), nil
71+
return lambdautils.BadRequest(fmt.Sprintf("unknown endpoint: %s", synopsis)), nil
7272
}
7373
}
7474

@@ -77,46 +77,46 @@ func handleGetAlerts(
7777
req events.APIGatewayProxyRequest,
7878
app *amstate.App,
7979
) (*events.APIGatewayProxyResponse, error) {
80-
return apigatewayutils.RespondJson(app.State.ActiveAlerts())
80+
return lambdautils.RespondJson(app.State.ActiveAlerts())
8181
}
8282

8383
func handleAcknowledgeAlert(ctx context.Context, id string) (*events.APIGatewayProxyResponse, error) {
8484
if err := alertAck(ctx, id); err != nil {
85-
return apigatewayutils.InternalServerError(err.Error()), nil
85+
return lambdautils.InternalServerError(err.Error()), nil
8686
}
8787

88-
return apigatewayutils.OkText(fmt.Sprintf("Ack ok for %s", id))
88+
return lambdautils.OkText(fmt.Sprintf("Ack ok for %s", id))
8989
}
9090

9191
func handleGetDeadMansSwitches(
9292
ctx context.Context,
9393
app *amstate.App,
9494
) (*events.APIGatewayProxyResponse, error) {
95-
return apigatewayutils.RespondJson(app.State.DeadMansSwitches())
95+
return lambdautils.RespondJson(app.State.DeadMansSwitches())
9696
}
9797

9898
func handleDeadMansSwitchCheckin(ctx context.Context, raw alertmanagertypes.DeadMansSwitchCheckinRequest) (*events.APIGatewayProxyResponse, error) {
9999
if raw.Subject == "" || raw.TTL == "" {
100-
return apigatewayutils.BadRequest("subject or ttl empty"), nil
100+
return lambdautils.BadRequest("subject or ttl empty"), nil
101101
}
102102

103103
now := time.Now()
104104

105105
ttl, err := parseTtlSpec(raw.TTL, now)
106106
if err != nil {
107-
return apigatewayutils.BadRequest(err.Error()), nil
107+
return lambdautils.BadRequest(err.Error()), nil
108108
}
109109

110110
alertAcked, err := deadmansswitchCheckin(ctx, raw.Subject, ttl)
111111
if err != nil {
112-
return apigatewayutils.InternalServerError(err.Error()), nil
112+
return lambdautils.InternalServerError(err.Error()), nil
113113
}
114114

115115
if alertAcked {
116-
return apigatewayutils.OkText("Check-in noted; alert that was firing for this dead mans's switch was acked")
116+
return lambdautils.OkText("Check-in noted; alert that was firing for this dead mans's switch was acked")
117117
}
118118

119-
return apigatewayutils.OkText("Check-in noted")
119+
return lambdautils.OkText("Check-in noted")
120120
}
121121

122122
func ackLink(alert amstate.Alert) string {

pkg/apigatewayutils/apigatewayutils.go renamed to pkg/lambdautils/apigatewayutils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package apigatewayutils
1+
package lambdautils
22

33
import (
44
"encoding/json"

cmd/alertmanager/multilambdaeventtypedispatcher.go renamed to pkg/lambdautils/multieventtypehandler.go

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package main
1+
package lambdautils
22

33
// This design is not pretty.. https://stackoverflow.com/a/52572943
44

@@ -8,8 +8,29 @@ import (
88
"errors"
99
"fmt"
1010
"github.com/aws/aws-lambda-go/events"
11+
"github.com/aws/aws-lambda-go/lambda"
1112
)
1213

14+
type multiEventTypeHandlerFn func(ctx context.Context, polymorphicEvent interface{}) ([]byte, error)
15+
16+
type multiEventTypeHandler struct {
17+
fn multiEventTypeHandlerFn
18+
}
19+
20+
func NewMultiEventTypeHandler(fn multiEventTypeHandlerFn) lambda.Handler {
21+
return &multiEventTypeHandler{fn}
22+
}
23+
24+
func (m *multiEventTypeHandler) Invoke(ctx context.Context, reqRaw []byte) ([]byte, error) {
25+
probe := &eventTypeProbe{}
26+
polymorphicEvent, err := probe.IdentifyAndUnmarshal(reqRaw)
27+
if err != nil {
28+
return nil, err
29+
}
30+
31+
return m.fn(ctx, polymorphicEvent)
32+
}
33+
1334
// we introduce just enough fields to determine what type of trigger this is, so we can
1435
// deserialize JSON with proper type
1536
type eventTypeProbe struct {
@@ -63,17 +84,3 @@ func (e *eventTypeProbe) IdentifyAndUnmarshal(reqRaw []byte) (interface{}, error
6384

6485
return typeOfRequest, nil
6586
}
66-
67-
type multiLambdaEventTypeDispatcher struct {
68-
fn func(ctx context.Context, polymorphicEvent interface{}) ([]byte, error)
69-
}
70-
71-
func (h multiLambdaEventTypeDispatcher) Invoke(ctx context.Context, reqRaw []byte) ([]byte, error) {
72-
probe := &eventTypeProbe{}
73-
polymorphicEvent, err := probe.IdentifyAndUnmarshal(reqRaw)
74-
if err != nil {
75-
return nil, err
76-
}
77-
78-
return h.fn(ctx, polymorphicEvent)
79-
}

0 commit comments

Comments
 (0)