diff --git a/api/agent/agent.go b/api/agent/agent.go index 201d92bba..af6b38d68 100644 --- a/api/agent/agent.go +++ b/api/agent/agent.go @@ -209,6 +209,11 @@ func (a *agent) Submit(callI Call) error { // to make this remove the container asynchronously? defer slot.Close() // notify our slot is free once we're done + err = a.fireBeforeCall(ctx, call.Model()) + if err != nil { + return fmt.Errorf("BeforeCall: %v", err) + } + // TODO Start is checking the timer now, we could do it here, too. err = call.Start(ctx, a) if err != nil { diff --git a/api/extenders/listeners.go b/api/extenders/listeners.go new file mode 100644 index 000000000..431267efb --- /dev/null +++ b/api/extenders/listeners.go @@ -0,0 +1,31 @@ +package extenders + +import ( + "context" + + "github.com/fnproject/fn/api/models" +) + +// AppListener is an interface used to inject custom code at key points in app lifecycle. +type AppListener interface { + // BeforeAppCreate called right before creating App in the database + BeforeAppCreate(ctx context.Context, app *models.App) error + // AfterAppCreate called after creating App in the database + AfterAppCreate(ctx context.Context, app *models.App) error + // BeforeAppUpdate called right before updating App in the database + BeforeAppUpdate(ctx context.Context, app *models.App) error + // AfterAppUpdate called after updating App in the database + AfterAppUpdate(ctx context.Context, app *models.App) error + // BeforeAppDelete called right before deleting App in the database + BeforeAppDelete(ctx context.Context, app *models.App) error + // AfterAppDelete called after deleting App in the database + AfterAppDelete(ctx context.Context, app *models.App) error +} + +// CallListener enables callbacks around Call events +type CallListener interface { + // BeforeCall called before a function is executed + BeforeCall(ctx context.Context, call *models.Call) error + // AfterCall called after a function completes + AfterCall(ctx context.Context, call *models.Call) error +} diff --git a/api/server/runner.go b/api/server/runner.go index 48237fe02..70bdb0263 100644 --- a/api/server/runner.go +++ b/api/server/runner.go @@ -86,6 +86,7 @@ func (s *Server) serve(c *gin.Context, appName, path string) { return } + err = doCall(call) err = s.Agent.Submit(call) if err != nil { // NOTE if they cancel the request then it will stop the call (kind of cool),