mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
* so it begins * add clarification to /dequeue, change response to list to future proof * Specify that runner endpoints are also under /v1 * Add a flag to choose operation mode (node type). This is specified using the `FN_NODE_TYPE` environment variable. The default is the existing behaviour, where the server supports all operations (full API plus asynchronous and synchronous runners). The additional modes are: * API - the full API is available, but no functions are executed by the node. Async calls are placed into a message queue, and synchronous calls are not supported (invoking them results in an API error). * Runner - only the invocation/route API is present. Asynchronous and synchronous invocation requests are supported, but asynchronous requests are placed onto the message queue, so might be handled by another runner. * Add agent type and checks on Submit * Sketch of a factored out data access abstraction for api/runner agents * Fix tests, adding node/agent types to constructors * Add tests for full, API, and runner server modes. * Added atomic UpdateCall to datastore * adds in server side endpoints * Made ServerNodeType public because tests use it * Made ServerNodeType public because tests use it * fix test build * add hybrid runner client pretty simple go api client that covers surface area needed for hybrid, returning structs from models that the agent can use directly. not exactly sure where to put this, so put it in `/clients/hybrid` but maybe we should make `/api/runner/client` or something and shove it in there. want to get integration tests set up and use the real endpoints next and then wrap this up in the DataAccessLayer stuff. * gracefully handles errors from fn * handles backoff & retry on 500s * will add to existing spans for debuggo action * minor fixes * meh
78 lines
3.6 KiB
Go
78 lines
3.6 KiB
Go
package models
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/jmoiron/sqlx"
|
|
)
|
|
|
|
type Datastore interface {
|
|
// GetApp gets an App by name.
|
|
// Returns ErrDatastoreEmptyAppName for empty appName.
|
|
// Returns ErrAppsNotFound if no app is found.
|
|
GetApp(ctx context.Context, appName string) (*App, error)
|
|
|
|
// GetApps gets a slice of Apps, optionally filtered by name.
|
|
// Missing filter or empty name will match all Apps.
|
|
GetApps(ctx context.Context, filter *AppFilter) ([]*App, error)
|
|
|
|
// InsertApp inserts an App. Returns ErrDatastoreEmptyApp when app is nil, and
|
|
// ErrDatastoreEmptyAppName when app.Name is empty.
|
|
// Returns ErrAppsAlreadyExists if an App by the same name already exists.
|
|
InsertApp(ctx context.Context, app *App) (*App, error)
|
|
|
|
// UpdateApp updates an App's Config. Returns ErrDatastoreEmptyApp when app is nil, and
|
|
// ErrDatastoreEmptyAppName when app.Name is empty.
|
|
// Returns ErrAppsNotFound if an App is not found.
|
|
UpdateApp(ctx context.Context, app *App) (*App, error)
|
|
|
|
// RemoveApp removes the App named appName. Returns ErrDatastoreEmptyAppName if appName is empty.
|
|
// Returns ErrAppsNotFound if an App is not found.
|
|
RemoveApp(ctx context.Context, appName string) error
|
|
|
|
// GetRoute looks up a matching Route for appName and the literal request route routePath.
|
|
// Returns ErrDatastoreEmptyAppName when appName is empty, and ErrDatastoreEmptyRoutePath when
|
|
// routePath is empty.
|
|
// Returns ErrRoutesNotFound when no matching route is found.
|
|
GetRoute(ctx context.Context, appName, routePath string) (*Route, error)
|
|
|
|
// GetRoutesByApp gets a slice of routes for a appName, optionally filtering on filter (filter.AppName is ignored).
|
|
// Returns ErrDatastoreEmptyAppName if appName is empty.
|
|
GetRoutesByApp(ctx context.Context, appName string, filter *RouteFilter) ([]*Route, error)
|
|
|
|
// InsertRoute inserts a route. Returns ErrDatastoreEmptyRoute when route is nil, and ErrDatastoreEmptyAppName
|
|
// or ErrDatastoreEmptyRoutePath for empty AppName or Path.
|
|
// Returns ErrRoutesAlreadyExists if the exact route.Path already exists
|
|
InsertRoute(ctx context.Context, route *Route) (*Route, error)
|
|
|
|
// UpdateRoute updates route's Config and Header fields. Returns ErrDatastoreEmptyRoute when route is nil, and
|
|
// ErrDatastoreEmptyAppName or ErrDatastoreEmptyRoutePath for empty AppName or Path.
|
|
UpdateRoute(ctx context.Context, route *Route) (*Route, error)
|
|
|
|
// RemoveRoute removes a route. Returns ErrDatastoreEmptyAppName when appName is empty, and
|
|
// ErrDatastoreEmptyRoutePath when routePath is empty. Returns ErrRoutesNotFound when no route exists.
|
|
RemoveRoute(ctx context.Context, appName, routePath string) error
|
|
|
|
// InsertCall inserts a call into the datastore, it will error if the call already
|
|
// exists.
|
|
InsertCall(ctx context.Context, call *Call) error
|
|
|
|
// UpdateCall atomically updates a call into the datastore to the "to" value if it finds an existing call equivalent
|
|
// to "from", otherwise it will error. ErrCallNotFound is returned if the call was not found, and
|
|
// ErrDatastoreCannotUpdateCall is returned if a call with the right AppName/ID exists but is different from "from".
|
|
UpdateCall(ctx context.Context, from *Call, to *Call) error
|
|
|
|
// GetCall returns a call at a certain id and app name.
|
|
GetCall(ctx context.Context, appName, callID string) (*Call, error)
|
|
|
|
// GetCalls returns a list of calls that satisfy the given CallFilter. If no
|
|
// calls exist, an empty list and a nil error are returned.
|
|
GetCalls(ctx context.Context, filter *CallFilter) ([]*Call, error)
|
|
|
|
// Implement LogStore methods for convenience
|
|
LogStore
|
|
|
|
// GetDatabase returns the underlying sqlx database implementation
|
|
GetDatabase() *sqlx.DB
|
|
}
|