mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
Added support for hooks to customize behavior.
This commit is contained in:
@@ -15,6 +15,7 @@ type BoltDatastore struct {
|
||||
routesBucket []byte
|
||||
appsBucket []byte
|
||||
logsBucket []byte
|
||||
extrasBucket []byte
|
||||
db *bolt.DB
|
||||
log logrus.FieldLogger
|
||||
}
|
||||
@@ -33,15 +34,17 @@ func New(url *url.URL) (models.Datastore, error) {
|
||||
log.WithError(err).Errorln("Error on bolt.Open")
|
||||
return nil, err
|
||||
}
|
||||
bucketPrefix := "funcs-"
|
||||
// I don't think we need a prefix here do we? Made it blank. If we do, we should call the query param "prefix" instead of bucket.
|
||||
bucketPrefix := ""
|
||||
if url.Query()["bucket"] != nil {
|
||||
bucketPrefix = url.Query()["bucket"][0]
|
||||
}
|
||||
routesBucketName := []byte(bucketPrefix + "routes")
|
||||
appsBucketName := []byte(bucketPrefix + "apps")
|
||||
logsBucketName := []byte(bucketPrefix + "logs")
|
||||
extrasBucketName := []byte(bucketPrefix + "extras") // todo: think of a better name
|
||||
err = db.Update(func(tx *bolt.Tx) error {
|
||||
for _, name := range [][]byte{routesBucketName, appsBucketName, logsBucketName} {
|
||||
for _, name := range [][]byte{routesBucketName, appsBucketName, logsBucketName, extrasBucketName} {
|
||||
_, err := tx.CreateBucketIfNotExists(name)
|
||||
if err != nil {
|
||||
log.WithError(err).WithFields(logrus.Fields{"name": name}).Error("create bucket")
|
||||
@@ -59,6 +62,7 @@ func New(url *url.URL) (models.Datastore, error) {
|
||||
routesBucket: routesBucketName,
|
||||
appsBucket: appsBucketName,
|
||||
logsBucket: logsBucketName,
|
||||
extrasBucket: extrasBucketName,
|
||||
db: db,
|
||||
log: log,
|
||||
}
|
||||
@@ -164,6 +168,7 @@ func (ds *BoltDatastore) GetApp(name string) (*models.App, error) {
|
||||
|
||||
func (ds *BoltDatastore) getRouteBucketForApp(tx *bolt.Tx, appName string) (*bolt.Bucket, error) {
|
||||
var err error
|
||||
// todo: should this be reversed? Make a bucket for each app that contains sub buckets for routes, etc
|
||||
bp := tx.Bucket(ds.routesBucket)
|
||||
b := bp.Bucket([]byte(appName))
|
||||
if b == nil {
|
||||
@@ -288,3 +293,22 @@ func (ds *BoltDatastore) GetRoutes(filter *models.RouteFilter) ([]*models.Route,
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func (ds *BoltDatastore) Put(key, value []byte) error {
|
||||
ds.db.Update(func(tx *bolt.Tx) error {
|
||||
b := tx.Bucket(ds.extrasBucket) // todo: maybe namespace by app?
|
||||
err := b.Put(key, value)
|
||||
return err
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ds *BoltDatastore) Get(key []byte) ([]byte, error) {
|
||||
var ret []byte
|
||||
ds.db.View(func(tx *bolt.Tx) error {
|
||||
b := tx.Bucket(ds.extrasBucket)
|
||||
ret = b.Get(key)
|
||||
return nil
|
||||
})
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
@@ -23,6 +23,11 @@ const appsTableCreate = `CREATE TABLE IF NOT EXISTS apps (
|
||||
name character varying(256) NOT NULL PRIMARY KEY
|
||||
);`
|
||||
|
||||
const extrasTableCreate = `CREATE TABLE IF NOT EXISTS extras (
|
||||
key character varying(256) NOT NULL PRIMARY KEY,
|
||||
value character varying(256) NOT NULL
|
||||
);`
|
||||
|
||||
const routeSelector = `SELECT app_name, path, image, headers FROM routes`
|
||||
|
||||
type rowScanner interface {
|
||||
@@ -56,7 +61,7 @@ func New(url *url.URL) (models.Datastore, error) {
|
||||
db: db,
|
||||
}
|
||||
|
||||
for _, v := range []string{routesTableCreate, appsTableCreate} {
|
||||
for _, v := range []string{routesTableCreate, appsTableCreate, extrasTableCreate} {
|
||||
_, err = db.Exec(v)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -158,14 +163,16 @@ func (ds *PostgresDatastore) StoreRoute(route *models.Route) (*models.Route, err
|
||||
|
||||
_, err = ds.db.Exec(`
|
||||
INSERT INTO routes (
|
||||
app_name, path, image,
|
||||
app_name,
|
||||
path,
|
||||
image,
|
||||
headers
|
||||
)
|
||||
VALUES ($1, $2, $3, $4, $5)
|
||||
VALUES ($1, $2, $3, $4)
|
||||
ON CONFLICT (name) DO UPDATE SET
|
||||
path = $1,
|
||||
image = $2,
|
||||
headers = $3;
|
||||
path = $2,
|
||||
image = $3,
|
||||
headers = $4;
|
||||
`,
|
||||
route.AppName,
|
||||
route.Path,
|
||||
@@ -274,3 +281,34 @@ func buildFilterQuery(filter *models.RouteFilter) string {
|
||||
|
||||
return filterQuery
|
||||
}
|
||||
|
||||
func (ds *PostgresDatastore) Put(key, value []byte) error {
|
||||
_, err := ds.db.Exec(`
|
||||
INSERT INTO extras (
|
||||
key,
|
||||
value
|
||||
)
|
||||
VALUES ($1, $2)
|
||||
ON CONFLICT (key) DO UPDATE SET
|
||||
value = $1;
|
||||
`, value)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ds *PostgresDatastore) Get(key []byte) ([]byte, error) {
|
||||
row := ds.db.QueryRow("SELECT value FROM extras WHERE key=$1", key)
|
||||
|
||||
var value []byte
|
||||
err := row.Scan(&value)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return value, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user