Add support for Function and Trigger domain objects (#1060)

Vast commit, includes:

 * Introduces the Trigger domain entity.
 * Introduces the Fns domain entity.
 * V2 of the API for interacting with the new entities in swaggerv2.yml
 * Adds v2 end points for Apps to support PUT updates.
 * Rewrites the datastore level tests into a new pattern.
 * V2 routes use entity ID over name as the path parameter.
This commit is contained in:
Tom Coupland
2018-06-25 15:37:06 +01:00
committed by GitHub
parent a5abecaafb
commit 3ebff051a4
76 changed files with 5820 additions and 892 deletions

View File

@@ -6,11 +6,13 @@ import (
"github.com/fnproject/fn/api/models"
)
func NewDatastore(ds models.Datastore, al AppListener, rl RouteListener) models.Datastore {
func NewDatastore(ds models.Datastore, al AppListener, rl RouteListener, fl FnListener, tl TriggerListener) models.Datastore {
return &extds{
Datastore: ds,
al: al,
rl: rl,
fl: fl,
tl: tl,
}
}
@@ -18,6 +20,53 @@ type extds struct {
models.Datastore
al AppListener
rl RouteListener
fl FnListener
tl TriggerListener
}
func (e *extds) InsertTrigger(ctx context.Context, trigger *models.Trigger) (*models.Trigger, error) {
err := e.tl.BeforeTriggerCreate(ctx, trigger)
if err != nil {
return nil, err
}
t, err := e.Datastore.InsertTrigger(ctx, trigger)
if err != nil {
return nil, err
}
err = e.tl.AfterTriggerCreate(ctx, t)
return t, err
}
func (e *extds) UpdateTrigger(ctx context.Context, trigger *models.Trigger) (*models.Trigger, error) {
err := e.tl.BeforeTriggerUpdate(ctx, trigger)
if err != nil {
return nil, err
}
t, err := e.Datastore.UpdateTrigger(ctx, trigger)
if err != nil {
return nil, err
}
err = e.tl.AfterTriggerUpdate(ctx, t)
return t, err
}
func (e *extds) RemoveTrigger(ctx context.Context, triggerID string) error {
err := e.tl.BeforeTriggerDelete(ctx, triggerID)
if err != nil {
return err
}
err = e.Datastore.RemoveTrigger(ctx, triggerID)
if err != nil {
return err
}
err = e.tl.AfterTriggerDelete(ctx, triggerID)
return err
}
func (e *extds) GetAppByID(ctx context.Context, appID string) (*models.App, error) {
@@ -126,14 +175,70 @@ func (e *extds) UpdateRoute(ctx context.Context, route *models.Route) (*models.R
return route, err
}
func (e *extds) RemoveRoute(ctx context.Context, appName string, routePath string) error {
err := e.rl.BeforeRouteDelete(ctx, appName, routePath)
func (e *extds) RemoveRoute(ctx context.Context, appId string, routePath string) error {
err := e.rl.BeforeRouteDelete(ctx, appId, routePath)
if err != nil {
return err
}
err = e.Datastore.RemoveRoute(ctx, appName, routePath)
err = e.Datastore.RemoveRoute(ctx, appId, routePath)
if err != nil {
return err
}
return e.rl.AfterRouteDelete(ctx, appName, routePath)
return e.rl.AfterRouteDelete(ctx, appId, routePath)
}
func (e *extds) InsertFn(ctx context.Context, fn *models.Fn) (*models.Fn, error) {
err := e.fl.BeforeFnCreate(ctx, fn)
if err != nil {
return nil, err
}
f, err := e.Datastore.InsertFn(ctx, fn)
if err != nil {
return nil, err
}
err = e.fl.AfterFnCreate(ctx, fn)
if err != nil {
return nil, err
}
return f, nil
}
func (e *extds) UpdateFn(ctx context.Context, fn *models.Fn) (*models.Fn, error) {
err := e.fl.BeforeFnUpdate(ctx, fn)
if err != nil {
return nil, err
}
f, err := e.Datastore.UpdateFn(ctx, fn)
if err != nil {
return nil, err
}
err = e.fl.AfterFnUpdate(ctx, fn)
if err != nil {
return nil, err
}
return f, nil
}
func (e *extds) RemoveFn(ctx context.Context, fnID string) error {
err := e.fl.BeforeFnDelete(ctx, fnID)
if err != nil {
return err
}
err = e.Datastore.RemoveFn(ctx, fnID)
if err != nil {
return err
}
err = e.fl.AfterFnDelete(ctx, fnID)
if err != nil {
return err
}
return nil
}

View File

@@ -51,9 +51,41 @@ type RouteListener interface {
// AfterRouteUpdate called after route updated in datastore
AfterRouteUpdate(ctx context.Context, route *models.Route) error
// BeforeRouteDelete called before route deleted from the datastore
BeforeRouteDelete(ctx context.Context, appName string, routePath string) error
BeforeRouteDelete(ctx context.Context, appId string, routePath string) error
// AfterRouteDelete called after route deleted from the datastore
AfterRouteDelete(ctx context.Context, appName string, routePath string) error
AfterRouteDelete(ctx context.Context, appId string, routePath string) error
}
// FnListener enables callbacks around Fn events
type FnListener interface {
// BeforeFnCreate called before fn created in the datastore
BeforeFnCreate(ctx context.Context, fn *models.Fn) error
// AfterFnCreate called after fn create in the datastore
AfterFnCreate(ctx context.Context, fn *models.Fn) error
// BeforeFnUpdate called before fn update in datastore
BeforeFnUpdate(ctx context.Context, fn *models.Fn) error
// AfterFnUpdate called after fn updated in datastore
AfterFnUpdate(ctx context.Context, fn *models.Fn) error
// BeforeFnDelete called before fn deleted from the datastore
BeforeFnDelete(ctx context.Context, fnID string) error
// AfterFnDelete called after fn deleted from the datastore
AfterFnDelete(ctx context.Context, fnID string) error
}
//// TriggerListener enables callbacks around Trigger events
type TriggerListener interface {
// BeforeTriggerCreate called before trigger created in the datastore
BeforeTriggerCreate(ctx context.Context, trigger *models.Trigger) error
// AfterTriggerCreate called after trigger create in the datastore
AfterTriggerCreate(ctx context.Context, trigger *models.Trigger) error
// BeforeTriggerUpdate called before trigger update in datastore
BeforeTriggerUpdate(ctx context.Context, trigger *models.Trigger) error
// AfterTriggerUpdate called after trigger updated in datastore
AfterTriggerUpdate(ctx context.Context, trigger *models.Trigger) error
// BeforeTriggerDelete called before trigger deleted from the datastore
BeforeTriggerDelete(ctx context.Context, triggerId string) error
// AfterTriggerDelete called after trigger deleted from the datastore
AfterTriggerDelete(ctx context.Context, triggerId string) error
}
// CallListener enables callbacks around Call events