mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
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:
@@ -6,7 +6,6 @@ import (
|
||||
"go.opencensus.io/trace"
|
||||
|
||||
"github.com/fnproject/fn/api/models"
|
||||
"github.com/jmoiron/sqlx"
|
||||
)
|
||||
|
||||
func MetricDS(ds models.Datastore) models.Datastore {
|
||||
@@ -83,8 +82,66 @@ func (m *metricds) RemoveRoute(ctx context.Context, appID string, routePath stri
|
||||
return m.ds.RemoveRoute(ctx, appID, routePath)
|
||||
}
|
||||
|
||||
// instant & no context ;)
|
||||
func (m *metricds) GetDatabase() *sqlx.DB { return m.ds.GetDatabase() }
|
||||
func (m *metricds) InsertTrigger(ctx context.Context, trigger *models.Trigger) (*models.Trigger, error) {
|
||||
ctx, span := trace.StartSpan(ctx, "ds_insert_trigger")
|
||||
defer span.End()
|
||||
return m.ds.InsertTrigger(ctx, trigger)
|
||||
|
||||
}
|
||||
|
||||
func (m *metricds) UpdateTrigger(ctx context.Context, trigger *models.Trigger) (*models.Trigger, error) {
|
||||
ctx, span := trace.StartSpan(ctx, "ds_update_trigger")
|
||||
defer span.End()
|
||||
return m.ds.UpdateTrigger(ctx, trigger)
|
||||
}
|
||||
|
||||
func (m *metricds) RemoveTrigger(ctx context.Context, triggerID string) error {
|
||||
ctx, span := trace.StartSpan(ctx, "ds_remove_trigger")
|
||||
defer span.End()
|
||||
return m.ds.RemoveTrigger(ctx, triggerID)
|
||||
}
|
||||
|
||||
func (m *metricds) GetTriggerByID(ctx context.Context, triggerID string) (*models.Trigger, error) {
|
||||
ctx, span := trace.StartSpan(ctx, "ds_get_trigger_by_id")
|
||||
defer span.End()
|
||||
return m.ds.GetTriggerByID(ctx, triggerID)
|
||||
}
|
||||
|
||||
func (m *metricds) GetTriggers(ctx context.Context, filter *models.TriggerFilter) ([]*models.Trigger, error) {
|
||||
ctx, span := trace.StartSpan(ctx, "ds_get_triggers")
|
||||
defer span.End()
|
||||
return m.ds.GetTriggers(ctx, filter)
|
||||
}
|
||||
|
||||
func (m *metricds) InsertFn(ctx context.Context, fn *models.Fn) (*models.Fn, error) {
|
||||
ctx, span := trace.StartSpan(ctx, "ds_insert_func")
|
||||
defer span.End()
|
||||
return m.ds.InsertFn(ctx, fn)
|
||||
}
|
||||
|
||||
func (m *metricds) UpdateFn(ctx context.Context, fn *models.Fn) (*models.Fn, error) {
|
||||
ctx, span := trace.StartSpan(ctx, "ds_insert_func")
|
||||
defer span.End()
|
||||
return m.ds.UpdateFn(ctx, fn)
|
||||
}
|
||||
|
||||
func (m *metricds) GetFns(ctx context.Context, filter *models.FnFilter) ([]*models.Fn, error) {
|
||||
ctx, span := trace.StartSpan(ctx, "ds_get_funcs")
|
||||
defer span.End()
|
||||
return m.ds.GetFns(ctx, filter)
|
||||
}
|
||||
|
||||
func (m *metricds) GetFnByID(ctx context.Context, fnID string) (*models.Fn, error) {
|
||||
ctx, span := trace.StartSpan(ctx, "ds_get_func")
|
||||
defer span.End()
|
||||
return m.ds.GetFnByID(ctx, fnID)
|
||||
}
|
||||
|
||||
func (m *metricds) RemoveFn(ctx context.Context, fnID string) error {
|
||||
ctx, span := trace.StartSpan(ctx, "ds_remove_func")
|
||||
defer span.End()
|
||||
return m.ds.RemoveFn(ctx, fnID)
|
||||
}
|
||||
|
||||
// Close calls Close on the underlying Datastore
|
||||
func (m *metricds) Close() error {
|
||||
|
||||
@@ -2,8 +2,7 @@ package datastoreutil
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/jmoiron/sqlx"
|
||||
"time"
|
||||
|
||||
"github.com/fnproject/fn/api/models"
|
||||
)
|
||||
@@ -26,7 +25,7 @@ func (v *validator) GetAppID(ctx context.Context, appName string) (string, error
|
||||
|
||||
func (v *validator) GetAppByID(ctx context.Context, appID string) (*models.App, error) {
|
||||
if appID == "" {
|
||||
return nil, models.ErrDatastoreEmptyAppID
|
||||
return nil, models.ErrAppsMissingID
|
||||
}
|
||||
|
||||
return v.Datastore.GetAppByID(ctx, appID)
|
||||
@@ -41,8 +40,9 @@ func (v *validator) InsertApp(ctx context.Context, app *models.App) (*models.App
|
||||
if app == nil {
|
||||
return nil, models.ErrDatastoreEmptyApp
|
||||
}
|
||||
|
||||
app.SetDefaults()
|
||||
if app.ID != "" {
|
||||
return nil, models.ErrAppIDProvided
|
||||
}
|
||||
if err := app.Validate(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -56,7 +56,7 @@ func (v *validator) UpdateApp(ctx context.Context, app *models.App) (*models.App
|
||||
return nil, models.ErrDatastoreEmptyApp
|
||||
}
|
||||
if app.ID == "" {
|
||||
return nil, models.ErrDatastoreEmptyAppID
|
||||
return nil, models.ErrAppsMissingID
|
||||
}
|
||||
|
||||
return v.Datastore.UpdateApp(ctx, app)
|
||||
@@ -65,7 +65,7 @@ func (v *validator) UpdateApp(ctx context.Context, app *models.App) (*models.App
|
||||
// name will never be empty.
|
||||
func (v *validator) RemoveApp(ctx context.Context, appID string) error {
|
||||
if appID == "" {
|
||||
return models.ErrDatastoreEmptyAppID
|
||||
return models.ErrAppsMissingID
|
||||
}
|
||||
|
||||
return v.Datastore.RemoveApp(ctx, appID)
|
||||
@@ -74,7 +74,7 @@ func (v *validator) RemoveApp(ctx context.Context, appID string) error {
|
||||
// appName and routePath will never be empty.
|
||||
func (v *validator) GetRoute(ctx context.Context, appID, routePath string) (*models.Route, error) {
|
||||
if appID == "" {
|
||||
return nil, models.ErrDatastoreEmptyAppID
|
||||
return nil, models.ErrRoutesMissingAppID
|
||||
}
|
||||
if routePath == "" {
|
||||
return nil, models.ErrRoutesMissingPath
|
||||
@@ -86,7 +86,7 @@ func (v *validator) GetRoute(ctx context.Context, appID, routePath string) (*mod
|
||||
// appName will never be empty
|
||||
func (v *validator) GetRoutesByApp(ctx context.Context, appID string, routeFilter *models.RouteFilter) (routes []*models.Route, err error) {
|
||||
if appID == "" {
|
||||
return nil, models.ErrDatastoreEmptyAppID
|
||||
return nil, models.ErrRoutesMissingAppID
|
||||
}
|
||||
|
||||
return v.Datastore.GetRoutesByApp(ctx, appID, routeFilter)
|
||||
@@ -98,7 +98,6 @@ func (v *validator) InsertRoute(ctx context.Context, route *models.Route) (*mode
|
||||
return nil, models.ErrDatastoreEmptyRoute
|
||||
}
|
||||
|
||||
route.SetDefaults()
|
||||
if err := route.Validate(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -123,7 +122,7 @@ func (v *validator) UpdateRoute(ctx context.Context, newroute *models.Route) (*m
|
||||
// appName and routePath will never be empty.
|
||||
func (v *validator) RemoveRoute(ctx context.Context, appID string, routePath string) error {
|
||||
if appID == "" {
|
||||
return models.ErrDatastoreEmptyAppID
|
||||
return models.ErrRoutesMissingAppID
|
||||
}
|
||||
if routePath == "" {
|
||||
return models.ErrRoutesMissingPath
|
||||
@@ -132,7 +131,82 @@ func (v *validator) RemoveRoute(ctx context.Context, appID string, routePath str
|
||||
return v.Datastore.RemoveRoute(ctx, appID, routePath)
|
||||
}
|
||||
|
||||
// GetDatabase returns the underlying sqlx database implementation
|
||||
func (v *validator) GetDatabase() *sqlx.DB {
|
||||
return v.Datastore.GetDatabase()
|
||||
func (v *validator) InsertTrigger(ctx context.Context, t *models.Trigger) (*models.Trigger, error) {
|
||||
|
||||
if t.ID != "" {
|
||||
return nil, models.ErrTriggerIDProvided
|
||||
}
|
||||
|
||||
if !time.Time(t.CreatedAt).IsZero() {
|
||||
return nil, models.ErrCreatedAtProvided
|
||||
}
|
||||
if !time.Time(t.UpdatedAt).IsZero() {
|
||||
return nil, models.ErrUpdatedAtProvided
|
||||
}
|
||||
|
||||
return v.Datastore.InsertTrigger(ctx, t)
|
||||
}
|
||||
|
||||
func (v *validator) UpdateTrigger(ctx context.Context, trigger *models.Trigger) (*models.Trigger, error) {
|
||||
return v.Datastore.UpdateTrigger(ctx, trigger)
|
||||
}
|
||||
|
||||
func (v *validator) GetTriggers(ctx context.Context, filter *models.TriggerFilter) ([]*models.Trigger, error) {
|
||||
|
||||
if filter.AppID == "" {
|
||||
return nil, models.ErrTriggerMissingAppID
|
||||
}
|
||||
|
||||
return v.Datastore.GetTriggers(ctx, filter)
|
||||
}
|
||||
func (v *validator) RemoveTrigger(ctx context.Context, triggerID string) error {
|
||||
if triggerID == "" {
|
||||
return models.ErrMissingID
|
||||
}
|
||||
|
||||
return v.Datastore.RemoveTrigger(ctx, triggerID)
|
||||
}
|
||||
|
||||
func (v *validator) InsertFn(ctx context.Context, fn *models.Fn) (*models.Fn, error) {
|
||||
if fn == nil {
|
||||
return nil, models.ErrDatastoreEmptyFn
|
||||
}
|
||||
if fn.ID != "" {
|
||||
return nil, models.ErrFnsIDProvided
|
||||
}
|
||||
if fn.AppID == "" {
|
||||
return nil, models.ErrFnsMissingAppID
|
||||
}
|
||||
if fn.Name == "" {
|
||||
return nil, models.ErrFnsMissingName
|
||||
}
|
||||
return v.Datastore.InsertFn(ctx, fn)
|
||||
}
|
||||
|
||||
func (v *validator) UpdateFn(ctx context.Context, fn *models.Fn) (*models.Fn, error) {
|
||||
return v.Datastore.UpdateFn(ctx, fn)
|
||||
}
|
||||
|
||||
func (v *validator) GetFnByID(ctx context.Context, fnID string) (*models.Fn, error) {
|
||||
if fnID == "" {
|
||||
return nil, models.ErrDatastoreEmptyFnID
|
||||
}
|
||||
|
||||
return v.Datastore.GetFnByID(ctx, fnID)
|
||||
}
|
||||
|
||||
func (v *validator) GetFns(ctx context.Context, filter *models.FnFilter) ([]*models.Fn, error) {
|
||||
|
||||
if filter.AppID == "" {
|
||||
return nil, models.ErrFnsMissingAppID
|
||||
}
|
||||
|
||||
return v.Datastore.GetFns(ctx, filter)
|
||||
}
|
||||
|
||||
func (v *validator) RemoveFn(ctx context.Context, fnID string) error {
|
||||
if fnID == "" {
|
||||
return models.ErrDatastoreEmptyFnID
|
||||
}
|
||||
return v.Datastore.RemoveFn(ctx, fnID)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user