Skip to content

Commit fb34c79

Browse files
committed
feat: add router and ensembler webhook
1 parent 358bea8 commit fb34c79

18 files changed

+725
-56
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
.DS_Store
22
config-dev-w-creds.yaml
33
environments-dev-w-creds.yaml
4+
.idea/

api/go.mod

+5-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ require (
88
github.com/GoogleCloudPlatform/spark-on-k8s-operator v0.0.0-20221025152940-c261df66a006
99
github.com/antihax/optional v1.0.0
1010
github.com/caraml-dev/merlin v0.0.0
11-
github.com/caraml-dev/mlp v1.12.0
11+
github.com/caraml-dev/mlp v1.13.2-rc2
1212
github.com/caraml-dev/turing/engines/experiment v0.0.0
1313
github.com/caraml-dev/turing/engines/router v0.0.0
1414
github.com/caraml-dev/universal-prediction-interface v0.3.6
@@ -33,7 +33,7 @@ require (
3333
github.com/pkg/errors v0.9.1
3434
github.com/rs/cors v1.8.2
3535
github.com/spf13/viper v1.13.0
36-
github.com/stretchr/testify v1.8.4
36+
github.com/stretchr/testify v1.9.0
3737
github.com/xanzy/go-gitlab v0.32.0
3838
go.uber.org/zap v1.26.0
3939
golang.org/x/oauth2 v0.18.0
@@ -66,6 +66,7 @@ require (
6666
github.com/VividCortex/ewma v1.2.0 // indirect
6767
github.com/ajg/form v1.5.1 // indirect
6868
github.com/andybalholm/brotli v1.0.5 // indirect
69+
github.com/avast/retry-go/v4 v4.6.0 // indirect
6970
github.com/beorn7/perks v1.0.1 // indirect
7071
github.com/blendle/zapdriver v1.3.1 // indirect
7172
github.com/buger/jsonparser v1.1.1 // indirect
@@ -185,7 +186,7 @@ require (
185186
github.com/spf13/cobra v1.8.0 // indirect
186187
github.com/spf13/jwalterweatherman v1.1.0 // indirect
187188
github.com/spf13/pflag v1.0.5 // indirect
188-
github.com/stretchr/objx v0.5.0 // indirect
189+
github.com/stretchr/objx v0.5.2 // indirect
189190
github.com/subosito/gotenv v1.4.1 // indirect
190191
github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect
191192
github.com/uber/jaeger-lib v2.4.0+incompatible // indirect
@@ -251,6 +252,7 @@ replace (
251252

252253
github.com/caraml-dev/turing/engines/experiment => ../engines/experiment
253254
github.com/caraml-dev/turing/engines/router => ../engines/router
255+
github.com/go-gota/gota => github.com/gojekfarm/gota v0.12.1-0.20230221101638-6cd9260bd598
254256

255257
k8s.io/klog/v2 => k8s.io/klog/v2 v2.120.1
256258
knative.dev/pkg => knative.dev/pkg v0.0.0-20240116073220-b488e7be5902

api/go.sum

+8-5
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwc
7272
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
7373
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
7474
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
75+
github.com/avast/retry-go/v4 v4.6.0 h1:K9xNA+KeB8HHc2aWFuLb25Offp+0iVRXEvFx8IinRJA=
76+
github.com/avast/retry-go/v4 v4.6.0/go.mod h1:gvWlPhBVsvBbLkVGDg/KwvBv0bEkCOLRRSHKIr2PyOE=
7577
github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
7678
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
7779
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
@@ -84,8 +86,8 @@ github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMU
8486
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
8587
github.com/caraml-dev/merlin/api v0.0.0-20240313065547-6778bd14c119 h1:8zt/6B7ySOokLa7WDpjaybBOL8x5C35nbMIrKFMsZcg=
8688
github.com/caraml-dev/merlin/api v0.0.0-20240313065547-6778bd14c119/go.mod h1:b2MbvZaVUSJQaoF0AuEgwTVVYK8lPHCIvnYpfvnjkQY=
87-
github.com/caraml-dev/mlp v1.12.0 h1:yb/EgMh+83oKj0C1AhH3R6xt0eSd9GX+incZEOwM7oo=
88-
github.com/caraml-dev/mlp v1.12.0/go.mod h1:Zdz4bALO9WOHXhOgsoLmCjMCJnDVEZEnQFg8rk+u2cE=
89+
github.com/caraml-dev/mlp v1.13.2-rc2 h1:Zmyoy3OTPv2fU+42rxMwUt9erS9J6QA0nlZQy/xCPtk=
90+
github.com/caraml-dev/mlp v1.13.2-rc2/go.mod h1:jKfnUEpCcARv/aJF6qH7vT7VMKICDVOq/pDFvj6V3vQ=
8991
github.com/caraml-dev/universal-prediction-interface v0.3.6 h1:G/D4aukfjLECl8armJqFy/R2+0u/f4AiurSFqAo33uQ=
9092
github.com/caraml-dev/universal-prediction-interface v0.3.6/go.mod h1:e0qmFOXQxx8HFg5ObYyQO3WVnrqsr5v5JApFmeF7eJo=
9193
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@@ -692,8 +694,9 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
692694
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
693695
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
694696
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
695-
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
696697
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
698+
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
699+
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
697700
github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
698701
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
699702
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
@@ -705,8 +708,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
705708
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
706709
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
707710
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
708-
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
709-
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
711+
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
712+
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
710713
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
711714
github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs=
712715
github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=

api/turing/api/base_controller.go

+10-6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
val "github.com/go-playground/validator/v10"
66
"github.com/gorilla/schema"
77

8+
"github.com/caraml-dev/turing/api/turing/webhook"
9+
810
"github.com/caraml-dev/turing/api/turing/models"
911
)
1012

@@ -16,19 +18,21 @@ type Controller interface {
1618
// BaseController implements common methods that may be shared by all API controllers
1719
type BaseController struct {
1820
*AppContext
19-
decoder *schema.Decoder
20-
validator *val.Validate
21+
decoder *schema.Decoder
22+
validator *val.Validate
23+
webhookClient webhook.Client
2124
}
2225

2326
// NewBaseController returns a new instance of BaseController
24-
func NewBaseController(ctx *AppContext, validator *val.Validate) BaseController {
27+
func NewBaseController(ctx *AppContext, validator *val.Validate, webhookClient webhook.Client) BaseController {
2528
decoder := schema.NewDecoder()
2629
decoder.IgnoreUnknownKeys(true)
2730

2831
return BaseController{
29-
AppContext: ctx,
30-
decoder: decoder,
31-
validator: validator,
32+
AppContext: ctx,
33+
decoder: decoder,
34+
validator: validator,
35+
webhookClient: webhookClient,
3236
}
3337
}
3438

api/turing/api/ensembler_images_api_test.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ import (
77
"testing"
88

99
"github.com/caraml-dev/mlp/api/client"
10+
"github.com/stretchr/testify/mock"
11+
1012
"github.com/caraml-dev/turing/api/turing/api/request"
1113
"github.com/caraml-dev/turing/api/turing/imagebuilder"
1214
"github.com/caraml-dev/turing/api/turing/models"
1315
"github.com/caraml-dev/turing/api/turing/service"
1416
"github.com/caraml-dev/turing/api/turing/service/mocks"
1517
"github.com/caraml-dev/turing/api/turing/validation"
16-
"github.com/stretchr/testify/mock"
18+
webhookMock "github.com/caraml-dev/turing/api/turing/webhook/mocks"
1719
)
1820

1921
func TestEnsemblerImagesController_ListImages(t *testing.T) {
@@ -477,6 +479,7 @@ func TestEnsemblerImagesController_ListImages(t *testing.T) {
477479
for _, tt := range tests {
478480
t.Run(tt.name, func(t *testing.T) {
479481
validator, _ := validation.NewValidator(nil)
482+
mockWebhookClient := webhookMock.NewClient(t)
480483

481484
c := EnsemblerImagesController{
482485
BaseController: NewBaseController(
@@ -486,6 +489,7 @@ func TestEnsemblerImagesController_ListImages(t *testing.T) {
486489
EnsemblerImagesService: tt.ensemblerImageService(),
487490
},
488491
validator,
492+
mockWebhookClient,
489493
),
490494
}
491495
if got := c.ListImages(tt.args.in0, tt.args.vars, tt.args.in2); !reflect.DeepEqual(got, tt.want) {
@@ -818,6 +822,7 @@ func TestEnsemblerImagesController_BuildImage(t *testing.T) {
818822
for _, tt := range tests {
819823
t.Run(tt.name, func(t *testing.T) {
820824
validator, _ := validation.NewValidator(nil)
825+
mockWebhookClient := webhookMock.NewClient(t)
821826

822827
c := EnsemblerImagesController{
823828
BaseController: NewBaseController(
@@ -827,6 +832,7 @@ func TestEnsemblerImagesController_BuildImage(t *testing.T) {
827832
EnsemblerImagesService: tt.ensemblerImageService(),
828833
},
829834
validator,
835+
mockWebhookClient,
830836
),
831837
}
832838
if got := c.BuildImage(tt.args.in0, tt.args.vars, tt.args.body); !reflect.DeepEqual(got, tt.want) {

api/turing/api/ensemblers_api.go

+28-5
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ import (
99
mlp "github.com/caraml-dev/mlp/api/client"
1010

1111
"github.com/caraml-dev/turing/api/turing/api/request"
12+
"github.com/caraml-dev/turing/api/turing/log"
1213
"github.com/caraml-dev/turing/api/turing/models"
1314
"github.com/caraml-dev/turing/api/turing/service"
15+
"github.com/caraml-dev/turing/api/turing/webhook"
1416
)
1517

1618
type EnsemblersController struct {
@@ -62,12 +64,16 @@ func (c EnsemblersController) GetEnsembler(
6264
}
6365

6466
func (c EnsemblersController) CreateEnsembler(
65-
_ *http.Request,
67+
req *http.Request,
6668
vars RequestVars,
6769
body interface{},
6870
) *Response {
69-
var errResp *Response
70-
var project *mlp.Project
71+
var (
72+
ctx = req.Context()
73+
errResp *Response
74+
project *mlp.Project
75+
)
76+
7177
if project, errResp = c.getProjectFromRequestVars(vars); errResp != nil {
7278
return errResp
7379
}
@@ -80,14 +86,20 @@ func (c EnsemblersController) CreateEnsembler(
8086
return InternalServerError("unable to save the ensembler", err.Error())
8187
}
8288

89+
// call webhook for ensembler creation event
90+
if errWebhook := c.webhookClient.TriggerEnsemblerEvent(ctx, webhook.OnEnsemblerCreated, ensembler); errWebhook != nil {
91+
log.Warnf("Error triggering webhook for event %s, %v", webhook.OnEnsemblerCreated, errWebhook)
92+
}
93+
8394
return Created(ensembler)
8495
}
8596

8697
func (c EnsemblersController) UpdateEnsembler(
87-
_ *http.Request,
98+
req *http.Request,
8899
vars RequestVars,
89100
body interface{},
90101
) *Response {
102+
ctx := req.Context()
91103
options := EnsemblersPathOptions{}
92104

93105
if err := c.ParseVars(&options, vars); err != nil {
@@ -149,14 +161,20 @@ func (c EnsemblersController) UpdateEnsembler(
149161
}
150162
}
151163

164+
// call webhook for ensembler update event
165+
if errWebhook := c.webhookClient.TriggerEnsemblerEvent(ctx, webhook.OnEnsemblerUpdated, ensembler); errWebhook != nil {
166+
log.Warnf("Error triggering webhook for event %s, %v", webhook.OnEnsemblerUpdated, errWebhook)
167+
}
168+
152169
return Ok(ensembler)
153170
}
154171

155172
func (c EnsemblersController) DeleteEnsembler(
156-
_ *http.Request,
173+
req *http.Request,
157174
vars RequestVars,
158175
_ interface{},
159176
) *Response {
177+
ctx := req.Context()
160178
options := EnsemblersPathOptions{}
161179

162180
if err := c.ParseVars(&options, vars); err != nil {
@@ -213,6 +231,11 @@ func (c EnsemblersController) DeleteEnsembler(
213231
return Error(httpStatus, "failed to delete the ensembler", err.Error())
214232
}
215233

234+
// call webhook for ensembler deletion event
235+
if errWebhook := c.webhookClient.TriggerEnsemblerEvent(ctx, webhook.OnEnsemblerDeleted, ensembler); errWebhook != nil {
236+
log.Warnf("Error triggering webhook for event %s, %v", webhook.OnEnsemblerDeleted, errWebhook)
237+
}
238+
216239
return Ok(map[string]int{"id": int(ensembler.GetID())})
217240
}
218241

0 commit comments

Comments
 (0)