Skip to content

Commit

Permalink
feat: add router and ensembler webhook
Browse files Browse the repository at this point in the history
  • Loading branch information
bayu-aditya committed Oct 9, 2024
1 parent 358bea8 commit c879cee
Show file tree
Hide file tree
Showing 18 changed files with 752 additions and 56 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.DS_Store
config-dev-w-creds.yaml
environments-dev-w-creds.yaml
.idea/
8 changes: 5 additions & 3 deletions api/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ require (
github.com/GoogleCloudPlatform/spark-on-k8s-operator v0.0.0-20221025152940-c261df66a006
github.com/antihax/optional v1.0.0
github.com/caraml-dev/merlin v0.0.0
github.com/caraml-dev/mlp v1.12.0
github.com/caraml-dev/mlp v1.13.2-rc2
github.com/caraml-dev/turing/engines/experiment v0.0.0
github.com/caraml-dev/turing/engines/router v0.0.0
github.com/caraml-dev/universal-prediction-interface v0.3.6
Expand All @@ -33,7 +33,7 @@ require (
github.com/pkg/errors v0.9.1
github.com/rs/cors v1.8.2
github.com/spf13/viper v1.13.0
github.com/stretchr/testify v1.8.4
github.com/stretchr/testify v1.9.0
github.com/xanzy/go-gitlab v0.32.0
go.uber.org/zap v1.26.0
golang.org/x/oauth2 v0.18.0
Expand Down Expand Up @@ -66,6 +66,7 @@ require (
github.com/VividCortex/ewma v1.2.0 // indirect
github.com/ajg/form v1.5.1 // indirect
github.com/andybalholm/brotli v1.0.5 // indirect
github.com/avast/retry-go/v4 v4.6.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/blendle/zapdriver v1.3.1 // indirect
github.com/buger/jsonparser v1.1.1 // indirect
Expand Down Expand Up @@ -185,7 +186,7 @@ require (
github.com/spf13/cobra v1.8.0 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/stretchr/objx v0.5.0 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/subosito/gotenv v1.4.1 // indirect
github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect
github.com/uber/jaeger-lib v2.4.0+incompatible // indirect
Expand Down Expand Up @@ -251,6 +252,7 @@ replace (

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

k8s.io/klog/v2 => k8s.io/klog/v2 v2.120.1
knative.dev/pkg => knative.dev/pkg v0.0.0-20240116073220-b488e7be5902
Expand Down
13 changes: 8 additions & 5 deletions api/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwc
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/avast/retry-go/v4 v4.6.0 h1:K9xNA+KeB8HHc2aWFuLb25Offp+0iVRXEvFx8IinRJA=
github.com/avast/retry-go/v4 v4.6.0/go.mod h1:gvWlPhBVsvBbLkVGDg/KwvBv0bEkCOLRRSHKIr2PyOE=
github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
Expand All @@ -84,8 +86,8 @@ github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMU
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
github.com/caraml-dev/merlin/api v0.0.0-20240313065547-6778bd14c119 h1:8zt/6B7ySOokLa7WDpjaybBOL8x5C35nbMIrKFMsZcg=
github.com/caraml-dev/merlin/api v0.0.0-20240313065547-6778bd14c119/go.mod h1:b2MbvZaVUSJQaoF0AuEgwTVVYK8lPHCIvnYpfvnjkQY=
github.com/caraml-dev/mlp v1.12.0 h1:yb/EgMh+83oKj0C1AhH3R6xt0eSd9GX+incZEOwM7oo=
github.com/caraml-dev/mlp v1.12.0/go.mod h1:Zdz4bALO9WOHXhOgsoLmCjMCJnDVEZEnQFg8rk+u2cE=
github.com/caraml-dev/mlp v1.13.2-rc2 h1:Zmyoy3OTPv2fU+42rxMwUt9erS9J6QA0nlZQy/xCPtk=
github.com/caraml-dev/mlp v1.13.2-rc2/go.mod h1:jKfnUEpCcARv/aJF6qH7vT7VMKICDVOq/pDFvj6V3vQ=
github.com/caraml-dev/universal-prediction-interface v0.3.6 h1:G/D4aukfjLECl8armJqFy/R2+0u/f4AiurSFqAo33uQ=
github.com/caraml-dev/universal-prediction-interface v0.3.6/go.mod h1:e0qmFOXQxx8HFg5ObYyQO3WVnrqsr5v5JApFmeF7eJo=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
Expand Down Expand Up @@ -692,8 +694,9 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
Expand All @@ -705,8 +708,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs=
github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
Expand Down
16 changes: 10 additions & 6 deletions api/turing/api/base_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import (
val "github.com/go-playground/validator/v10"
"github.com/gorilla/schema"

"github.com/caraml-dev/turing/api/turing/webhook"

"github.com/caraml-dev/turing/api/turing/models"
)

Expand All @@ -16,19 +18,21 @@ type Controller interface {
// BaseController implements common methods that may be shared by all API controllers
type BaseController struct {
*AppContext
decoder *schema.Decoder
validator *val.Validate
decoder *schema.Decoder
validator *val.Validate
webhookClient webhook.Client
}

// NewBaseController returns a new instance of BaseController
func NewBaseController(ctx *AppContext, validator *val.Validate) BaseController {
func NewBaseController(ctx *AppContext, validator *val.Validate, webhookClient webhook.Client) BaseController {
decoder := schema.NewDecoder()
decoder.IgnoreUnknownKeys(true)

return BaseController{
AppContext: ctx,
decoder: decoder,
validator: validator,
AppContext: ctx,
decoder: decoder,
validator: validator,
webhookClient: webhookClient,
}
}

Expand Down
8 changes: 7 additions & 1 deletion api/turing/api/ensembler_images_api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@ import (
"testing"

"github.com/caraml-dev/mlp/api/client"
"github.com/stretchr/testify/mock"

"github.com/caraml-dev/turing/api/turing/api/request"
"github.com/caraml-dev/turing/api/turing/imagebuilder"
"github.com/caraml-dev/turing/api/turing/models"
"github.com/caraml-dev/turing/api/turing/service"
"github.com/caraml-dev/turing/api/turing/service/mocks"
"github.com/caraml-dev/turing/api/turing/validation"
"github.com/stretchr/testify/mock"
webhookMock "github.com/caraml-dev/turing/api/turing/webhook/mocks"
)

func TestEnsemblerImagesController_ListImages(t *testing.T) {
Expand Down Expand Up @@ -477,6 +479,7 @@ func TestEnsemblerImagesController_ListImages(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
validator, _ := validation.NewValidator(nil)
mockWebhookClient := webhookMock.NewClient(t)

c := EnsemblerImagesController{
BaseController: NewBaseController(
Expand All @@ -486,6 +489,7 @@ func TestEnsemblerImagesController_ListImages(t *testing.T) {
EnsemblerImagesService: tt.ensemblerImageService(),
},
validator,
mockWebhookClient,
),
}
if got := c.ListImages(tt.args.in0, tt.args.vars, tt.args.in2); !reflect.DeepEqual(got, tt.want) {
Expand Down Expand Up @@ -818,6 +822,7 @@ func TestEnsemblerImagesController_BuildImage(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
validator, _ := validation.NewValidator(nil)
mockWebhookClient := webhookMock.NewClient(t)

c := EnsemblerImagesController{
BaseController: NewBaseController(
Expand All @@ -827,6 +832,7 @@ func TestEnsemblerImagesController_BuildImage(t *testing.T) {
EnsemblerImagesService: tt.ensemblerImageService(),
},
validator,
mockWebhookClient,
),
}
if got := c.BuildImage(tt.args.in0, tt.args.vars, tt.args.body); !reflect.DeepEqual(got, tt.want) {
Expand Down
33 changes: 28 additions & 5 deletions api/turing/api/ensemblers_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@ import (
mlp "github.com/caraml-dev/mlp/api/client"

"github.com/caraml-dev/turing/api/turing/api/request"
"github.com/caraml-dev/turing/api/turing/log"
"github.com/caraml-dev/turing/api/turing/models"
"github.com/caraml-dev/turing/api/turing/service"
"github.com/caraml-dev/turing/api/turing/webhook"
)

type EnsemblersController struct {
Expand Down Expand Up @@ -62,12 +64,16 @@ func (c EnsemblersController) GetEnsembler(
}

func (c EnsemblersController) CreateEnsembler(
_ *http.Request,
req *http.Request,
vars RequestVars,
body interface{},
) *Response {
var errResp *Response
var project *mlp.Project
var (
ctx = req.Context()
errResp *Response
project *mlp.Project
)

if project, errResp = c.getProjectFromRequestVars(vars); errResp != nil {
return errResp
}
Expand All @@ -80,14 +86,20 @@ func (c EnsemblersController) CreateEnsembler(
return InternalServerError("unable to save the ensembler", err.Error())
}

// call webhook for ensembler creation event
if errWebhook := c.webhookClient.TriggerEnsemblerEvent(ctx, webhook.OnEnsemblerCreated, ensembler); errWebhook != nil {
log.Warnf("Error triggering webhook for event %s, %v", webhook.OnEnsemblerCreated, errWebhook)
}

return Created(ensembler)
}

func (c EnsemblersController) UpdateEnsembler(
_ *http.Request,
req *http.Request,
vars RequestVars,
body interface{},
) *Response {
ctx := req.Context()
options := EnsemblersPathOptions{}

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

// call webhook for ensembler update event
if errWebhook := c.webhookClient.TriggerEnsemblerEvent(ctx, webhook.OnEnsemblerUpdated, ensembler); errWebhook != nil {
log.Warnf("Error triggering webhook for event %s, %v", webhook.OnEnsemblerUpdated, errWebhook)
}

return Ok(ensembler)
}

func (c EnsemblersController) DeleteEnsembler(
_ *http.Request,
req *http.Request,
vars RequestVars,
_ interface{},
) *Response {
ctx := req.Context()
options := EnsemblersPathOptions{}

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

// call webhook for ensembler deletion event
if errWebhook := c.webhookClient.TriggerEnsemblerEvent(ctx, webhook.OnEnsemblerDeleted, ensembler); errWebhook != nil {
log.Warnf("Error triggering webhook for event %s, %v", webhook.OnEnsemblerDeleted, errWebhook)
}

return Ok(map[string]int{"id": int(ensembler.GetID())})
}

Expand Down
Loading

0 comments on commit c879cee

Please sign in to comment.