added ctx to datastore and improve mock (#329)

Added ctx to datastore and improved mock
This commit is contained in:
Pedro Nasser
2016-11-22 03:33:44 -02:00
committed by GitHub
parent 5e61d2b055
commit c14bc323f9
23 changed files with 292 additions and 229 deletions

View File

@@ -7,6 +7,8 @@ import (
"path/filepath"
"time"
"context"
"github.com/Sirupsen/logrus"
"github.com/boltdb/bolt"
"github.com/iron-io/functions/api/models"
@@ -72,7 +74,7 @@ func New(url *url.URL) (models.Datastore, error) {
return ds, nil
}
func (ds *BoltDatastore) InsertApp(app *models.App) (*models.App, error) {
func (ds *BoltDatastore) InsertApp(ctx context.Context, app *models.App) (*models.App, error) {
if app == nil {
return nil, models.ErrDatastoreEmptyApp
}
@@ -111,7 +113,7 @@ func (ds *BoltDatastore) InsertApp(app *models.App) (*models.App, error) {
return app, err
}
func (ds *BoltDatastore) UpdateApp(newapp *models.App) (*models.App, error) {
func (ds *BoltDatastore) UpdateApp(ctx context.Context, newapp *models.App) (*models.App, error) {
if newapp == nil {
return nil, models.ErrDatastoreEmptyApp
}
@@ -166,7 +168,7 @@ func (ds *BoltDatastore) UpdateApp(newapp *models.App) (*models.App, error) {
return app, err
}
func (ds *BoltDatastore) RemoveApp(appName string) error {
func (ds *BoltDatastore) RemoveApp(ctx context.Context, appName string) error {
if appName == "" {
return models.ErrDatastoreEmptyAppName
}
@@ -187,7 +189,7 @@ func (ds *BoltDatastore) RemoveApp(appName string) error {
return err
}
func (ds *BoltDatastore) GetApps(filter *models.AppFilter) ([]*models.App, error) {
func (ds *BoltDatastore) GetApps(ctx context.Context, filter *models.AppFilter) ([]*models.App, error) {
res := []*models.App{}
err := ds.db.View(func(tx *bolt.Tx) error {
b := tx.Bucket(ds.appsBucket)
@@ -211,7 +213,7 @@ func (ds *BoltDatastore) GetApps(filter *models.AppFilter) ([]*models.App, error
return res, nil
}
func (ds *BoltDatastore) GetApp(name string) (*models.App, error) {
func (ds *BoltDatastore) GetApp(ctx context.Context, name string) (*models.App, error) {
if name == "" {
return nil, models.ErrDatastoreEmptyAppName
}
@@ -250,7 +252,7 @@ func (ds *BoltDatastore) getRouteBucketForApp(tx *bolt.Tx, appName string) (*bol
return b, nil
}
func (ds *BoltDatastore) InsertRoute(route *models.Route) (*models.Route, error) {
func (ds *BoltDatastore) InsertRoute(ctx context.Context, route *models.Route) (*models.Route, error) {
if route == nil {
return nil, models.ErrDatastoreEmptyApp
}
@@ -293,7 +295,7 @@ func (ds *BoltDatastore) InsertRoute(route *models.Route) (*models.Route, error)
return route, nil
}
func (ds *BoltDatastore) UpdateRoute(newroute *models.Route) (*models.Route, error) {
func (ds *BoltDatastore) UpdateRoute(ctx context.Context, newroute *models.Route) (*models.Route, error) {
if newroute == nil {
return nil, models.ErrDatastoreEmptyRoute
}
@@ -369,7 +371,7 @@ func (ds *BoltDatastore) UpdateRoute(newroute *models.Route) (*models.Route, err
return route, nil
}
func (ds *BoltDatastore) RemoveRoute(appName, routePath string) error {
func (ds *BoltDatastore) RemoveRoute(ctx context.Context, appName, routePath string) error {
if appName == "" {
return models.ErrDatastoreEmptyAppName
}
@@ -396,7 +398,7 @@ func (ds *BoltDatastore) RemoveRoute(appName, routePath string) error {
return nil
}
func (ds *BoltDatastore) GetRoute(appName, routePath string) (*models.Route, error) {
func (ds *BoltDatastore) GetRoute(ctx context.Context, appName, routePath string) (*models.Route, error) {
if appName == "" {
return nil, models.ErrDatastoreEmptyAppName
}
@@ -421,7 +423,7 @@ func (ds *BoltDatastore) GetRoute(appName, routePath string) (*models.Route, err
return route, err
}
func (ds *BoltDatastore) GetRoutesByApp(appName string, filter *models.RouteFilter) ([]*models.Route, error) {
func (ds *BoltDatastore) GetRoutesByApp(ctx context.Context, appName string, filter *models.RouteFilter) ([]*models.Route, error) {
res := []*models.Route{}
err := ds.db.View(func(tx *bolt.Tx) error {
b, err := ds.getRouteBucketForApp(tx, appName)
@@ -455,7 +457,7 @@ func (ds *BoltDatastore) GetRoutesByApp(appName string, filter *models.RouteFilt
return res, nil
}
func (ds *BoltDatastore) GetRoutes(filter *models.RouteFilter) ([]*models.Route, error) {
func (ds *BoltDatastore) GetRoutes(ctx context.Context, filter *models.RouteFilter) ([]*models.Route, error) {
res := []*models.Route{}
err := ds.db.View(func(tx *bolt.Tx) error {
i := 0
@@ -492,7 +494,7 @@ func (ds *BoltDatastore) GetRoutes(filter *models.RouteFilter) ([]*models.Route,
return res, nil
}
func (ds *BoltDatastore) Put(key, value []byte) error {
func (ds *BoltDatastore) Put(ctx context.Context, 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)
@@ -501,7 +503,7 @@ func (ds *BoltDatastore) Put(key, value []byte) error {
return nil
}
func (ds *BoltDatastore) Get(key []byte) ([]byte, error) {
func (ds *BoltDatastore) Get(ctx context.Context, key []byte) ([]byte, error) {
var ret []byte
ds.db.View(func(tx *bolt.Tx) error {
b := tx.Bucket(ds.extrasBucket)

View File

@@ -2,6 +2,7 @@ package datastore
import (
"bytes"
"context"
"log"
"os"
"testing"
@@ -26,6 +27,8 @@ const tmpBolt = "/tmp/func_test_bolt.db"
func TestBolt(t *testing.T) {
buf := setLogBuffer()
ctx := context.Background()
os.Remove(tmpBolt)
ds, err := New("bolt://" + tmpBolt)
if err != nil {
@@ -43,31 +46,31 @@ func TestBolt(t *testing.T) {
}
// Testing insert app
_, err = ds.InsertApp(nil)
_, err = ds.InsertApp(ctx, nil)
if err != models.ErrDatastoreEmptyApp {
t.Log(buf.String())
t.Fatalf("Test InsertApp(nil): expected error `%v`, but it was `%v`", models.ErrDatastoreEmptyApp, err)
}
_, err = ds.InsertApp(&models.App{})
_, err = ds.InsertApp(ctx, &models.App{})
if err != models.ErrDatastoreEmptyAppName {
t.Log(buf.String())
t.Fatalf("Test InsertApp(nil): expected error `%v`, but it was `%v`", models.ErrDatastoreEmptyAppName, err)
}
_, err = ds.InsertApp(testApp)
_, err = ds.InsertApp(ctx, testApp)
if err != nil {
t.Log(buf.String())
t.Fatalf("Test InsertApp: error when Bolt was storing new app: %s", err)
}
_, err = ds.InsertApp(testApp)
_, err = ds.InsertApp(ctx, testApp)
if err != models.ErrAppsAlreadyExists {
t.Log(buf.String())
t.Fatalf("Test InsertApp duplicated: expected error `%v`, but it was `%v`", models.ErrAppsAlreadyExists, err)
}
_, err = ds.UpdateApp(&models.App{
_, err = ds.UpdateApp(ctx, &models.App{
Name: testApp.Name,
Config: map[string]string{
"TEST": "1",
@@ -79,13 +82,13 @@ func TestBolt(t *testing.T) {
}
// Testing get app
_, err = ds.GetApp("")
_, err = ds.GetApp(ctx, "")
if err != models.ErrDatastoreEmptyAppName {
t.Log(buf.String())
t.Fatalf("Test GetApp: expected error to be %v, but it was %s", models.ErrDatastoreEmptyAppName, err)
}
app, err := ds.GetApp(testApp.Name)
app, err := ds.GetApp(ctx, testApp.Name)
if err != nil {
t.Log(buf.String())
t.Fatalf("Test GetApp: error: %s", err)
@@ -96,7 +99,7 @@ func TestBolt(t *testing.T) {
}
// Testing list apps
apps, err := ds.GetApps(&models.AppFilter{})
apps, err := ds.GetApps(ctx, &models.AppFilter{})
if err != nil {
t.Log(buf.String())
t.Fatalf("Test GetApps: unexpected error %v", err)
@@ -110,18 +113,18 @@ func TestBolt(t *testing.T) {
}
// Testing app delete
err = ds.RemoveApp("")
err = ds.RemoveApp(ctx, "")
if err != models.ErrDatastoreEmptyAppName {
t.Log(buf.String())
t.Fatalf("Test RemoveApp: expected error `%v`, but it was `%v`", models.ErrDatastoreEmptyAppName, err)
}
err = ds.RemoveApp(testApp.Name)
err = ds.RemoveApp(ctx, testApp.Name)
if err != nil {
t.Log(buf.String())
t.Fatalf("Test RemoveApp: error: %s", err)
}
app, err = ds.GetApp(testApp.Name)
app, err = ds.GetApp(ctx, testApp.Name)
if err != nil {
t.Log(buf.String())
t.Fatalf("Test GetApp: error: %s", err)
@@ -132,7 +135,7 @@ func TestBolt(t *testing.T) {
}
// Test update inexistent app
_, err = ds.UpdateApp(&models.App{
_, err = ds.UpdateApp(ctx, &models.App{
Name: testApp.Name,
Config: map[string]string{
"TEST": "1",
@@ -144,47 +147,47 @@ func TestBolt(t *testing.T) {
}
// Insert app again to test routes
ds.InsertApp(testApp)
ds.InsertApp(ctx, testApp)
// Testing insert route
_, err = ds.InsertRoute(nil)
_, err = ds.InsertRoute(ctx, nil)
if err == models.ErrDatastoreEmptyRoute {
t.Log(buf.String())
t.Fatalf("Test InsertRoute(nil): expected error `%v`, but it was `%v`", models.ErrDatastoreEmptyRoute, err)
}
_, err = ds.InsertRoute(testRoute)
_, err = ds.InsertRoute(ctx, testRoute)
if err != nil {
t.Log(buf.String())
t.Fatalf("Test InsertRoute: error when Bolt was storing new route: %s", err)
}
_, err = ds.InsertRoute(testRoute)
_, err = ds.InsertRoute(ctx, testRoute)
if err != models.ErrRoutesAlreadyExists {
t.Log(buf.String())
t.Fatalf("Test InsertRoute duplicated: expected error to be `%v`, but it was `%v`", models.ErrRoutesAlreadyExists, err)
}
_, err = ds.UpdateRoute(testRoute)
_, err = ds.UpdateRoute(ctx, testRoute)
if err != nil {
t.Log(buf.String())
t.Fatalf("Test UpdateRoute: unexpected error: %v", err)
}
// Testing get
_, err = ds.GetRoute("a", "")
_, err = ds.GetRoute(ctx, "a", "")
if err != models.ErrDatastoreEmptyRoutePath {
t.Log(buf.String())
t.Fatalf("Test GetRoute(empty route path): expected error `%v`, but it was `%v`", models.ErrDatastoreEmptyRoutePath, err)
}
_, err = ds.GetRoute("", "a")
_, err = ds.GetRoute(ctx, "", "a")
if err != models.ErrDatastoreEmptyAppName {
t.Log(buf.String())
t.Fatalf("Test GetRoute(empty app name): expected error `%v`, but it was `%v`", models.ErrDatastoreEmptyAppName, err)
}
route, err := ds.GetRoute(testApp.Name, testRoute.Path)
route, err := ds.GetRoute(ctx, testApp.Name, testRoute.Path)
if err != nil {
t.Log(buf.String())
t.Fatalf("Test GetRoute: unexpected error %v", err)
@@ -195,7 +198,7 @@ func TestBolt(t *testing.T) {
}
// Testing list routes
routes, err := ds.GetRoutesByApp(testApp.Name, &models.RouteFilter{})
routes, err := ds.GetRoutesByApp(ctx, testApp.Name, &models.RouteFilter{})
if err != nil {
t.Log(buf.String())
t.Fatalf("Test GetRoutes: unexpected error %v", err)
@@ -209,7 +212,7 @@ func TestBolt(t *testing.T) {
}
// Testing list routes
routes, err = ds.GetRoutes(&models.RouteFilter{Image: testRoute.Image})
routes, err = ds.GetRoutes(ctx, &models.RouteFilter{Image: testRoute.Image})
if err != nil {
t.Log(buf.String())
t.Fatalf("Test GetRoutes: error: %s", err)
@@ -223,25 +226,25 @@ func TestBolt(t *testing.T) {
}
// Testing app delete
err = ds.RemoveRoute("", "")
err = ds.RemoveRoute(ctx, "", "")
if err != models.ErrDatastoreEmptyAppName {
t.Log(buf.String())
t.Fatalf("Test RemoveRoute(empty app name): expected error `%v`, but it was `%v`", models.ErrDatastoreEmptyAppName, err)
}
err = ds.RemoveRoute("a", "")
err = ds.RemoveRoute(ctx, "a", "")
if err != models.ErrDatastoreEmptyRoutePath {
t.Log(buf.String())
t.Fatalf("Test RemoveRoute(empty route path): expected error `%v`, but it was `%v`", models.ErrDatastoreEmptyRoutePath, err)
}
err = ds.RemoveRoute(testRoute.AppName, testRoute.Path)
err = ds.RemoveRoute(ctx, testRoute.AppName, testRoute.Path)
if err != nil {
t.Log(buf.String())
t.Fatalf("Test RemoveApp: unexpected error: %v", err)
}
_, err = ds.UpdateRoute(&models.Route{
_, err = ds.UpdateRoute(ctx, &models.Route{
AppName: testRoute.AppName,
Path: testRoute.Path,
Image: "test",
@@ -251,7 +254,7 @@ func TestBolt(t *testing.T) {
t.Fatalf("Test UpdateRoute inexistent: expected error to be `%v`, but it was `%v`", models.ErrRoutesNotFound, err)
}
route, err = ds.GetRoute(testRoute.AppName, testRoute.Path)
route, err = ds.GetRoute(ctx, testRoute.AppName, testRoute.Path)
if err != nil {
t.Log(buf.String())
t.Fatalf("Test GetRoute: error: %s", err)

View File

@@ -1,100 +1,141 @@
package datastore
import "github.com/iron-io/functions/api/models"
import (
"github.com/iron-io/functions/api/models"
"context"
)
type Mock struct {
FakeApp *models.App
FakeApps []*models.App
FakeRoute *models.Route
FakeRoutes []*models.Route
Apps []*models.App
Routes []*models.Route
}
func (m *Mock) GetApp(appName string) (*models.App, error) {
app := m.FakeApp
if app == nil && m.FakeApps != nil {
for _, a := range m.FakeApps {
if a.Name == appName {
app = a
}
func NewMock(apps []*models.App, routes []*models.Route) *Mock {
if apps == nil {
apps = []*models.App{}
}
if routes == nil {
routes = []*models.Route{}
}
return &Mock{apps, routes}
}
func (m *Mock) GetApp(ctx context.Context, appName string) (app *models.App, err error) {
for _, a := range m.Apps {
if a.Name == appName {
return a, nil
}
}
return nil, models.ErrAppsNotFound
}
func (m *Mock) GetApps(ctx context.Context, appFilter *models.AppFilter) ([]*models.App, error) {
return m.Apps, nil
}
func (m *Mock) InsertApp(ctx context.Context, app *models.App) (*models.App, error) {
if a, _ := m.GetApp(ctx, app.Name); a != nil {
return nil, models.ErrAppsAlreadyExists
}
m.Apps = append(m.Apps, app)
return app, nil
}
func (m *Mock) GetApps(appFilter *models.AppFilter) ([]*models.App, error) {
// TODO: improve this mock method
return m.FakeApps, nil
}
func (m *Mock) InsertApp(app *models.App) (*models.App, error) {
// TODO: improve this mock method
return m.FakeApp, nil
}
func (m *Mock) UpdateApp(app *models.App) (*models.App, error) {
// TODO: improve this mock method
return m.FakeApp, nil
}
func (m *Mock) RemoveApp(appName string) error {
// TODO: improve this mock method
return nil
}
func (m *Mock) GetRoute(appName, routePath string) (*models.Route, error) {
route := m.FakeRoute
if route == nil && m.FakeRoutes != nil {
for _, r := range m.FakeRoutes {
if r.AppName == appName && r.Path == routePath {
route = r
}
func (m *Mock) UpdateApp(ctx context.Context, app *models.App) (*models.App, error) {
a, err := m.GetApp(ctx, app.Name)
if err != nil {
return nil, err
}
if app.Config != nil {
if a.Config == nil {
a.Config = map[string]string{}
}
for k, v := range app.Config {
a.Config[k] = v
}
}
return a, nil
}
func (m *Mock) RemoveApp(ctx context.Context, appName string) error {
for i, a := range m.Apps {
if a.Name == appName {
m.Apps = append(m.Apps[:i], m.Apps[i+1:]...)
return nil
}
}
return models.ErrAppsNotFound
}
func (m *Mock) GetRoute(ctx context.Context, appName, routePath string) (*models.Route, error) {
for _, r := range m.Routes {
if r.AppName == appName && r.Path == routePath {
return r, nil
}
}
return nil, models.ErrRoutesNotFound
}
func (m *Mock) GetRoutes(ctx context.Context, routeFilter *models.RouteFilter) (routes []*models.Route, err error) {
for _, r := range m.Routes {
if models.ApplyRouteFilter(r, routeFilter) {
routes = append(routes, r)
}
}
return
}
func (m *Mock) GetRoutesByApp(ctx context.Context, appName string, routeFilter *models.RouteFilter) (routes []*models.Route, err error) {
for _, r := range m.Routes {
if r.AppName == appName && (routeFilter.Path == "" || r.Path == routeFilter.Path) && (routeFilter.AppName == "" || r.AppName == routeFilter.AppName) {
routes = append(routes, r)
}
}
return
}
func (m *Mock) InsertRoute(ctx context.Context, route *models.Route) (*models.Route, error) {
if r, _ := m.GetRoute(ctx, route.AppName, route.Path); r != nil {
return nil, models.ErrAppsAlreadyExists
}
m.Routes = append(m.Routes, route)
return route, nil
}
func (m *Mock) GetRoutes(routeFilter *models.RouteFilter) ([]*models.Route, error) {
// TODO: improve this mock method
return m.FakeRoutes, nil
}
func (m *Mock) GetRoutesByApp(appName string, routeFilter *models.RouteFilter) ([]*models.Route, error) {
var routes []*models.Route
route := m.FakeRoute
if route == nil && m.FakeRoutes != nil {
for _, r := range m.FakeRoutes {
if r.AppName == appName && (routeFilter.Path == "" || r.Path == routeFilter.Path) && (routeFilter.AppName == "" || r.AppName == routeFilter.AppName) {
routes = append(routes, r)
}
func (m *Mock) UpdateRoute(ctx context.Context, route *models.Route) (*models.Route, error) {
r, err := m.GetRoute(ctx, route.AppName, route.Path)
if err != nil {
return nil, err
}
if route.Config != nil {
if route.Config == nil {
r.Config = map[string]string{}
}
for k, v := range route.Config {
r.Config[k] = v
}
}
return routes, nil
return r, nil
}
func (m *Mock) InsertRoute(route *models.Route) (*models.Route, error) {
// TODO: improve this mock method
return m.FakeRoute, nil
func (m *Mock) RemoveRoute(ctx context.Context, appName, routePath string) error {
for i, r := range m.Routes {
if r.AppName == appName && r.Path == routePath {
m.Routes = append(m.Routes[:i], m.Routes[i+1:]...)
return nil
}
}
return models.ErrRoutesNotFound
}
func (m *Mock) UpdateRoute(route *models.Route) (*models.Route, error) {
// TODO: improve this mock method
return m.FakeRoute, nil
}
func (m *Mock) RemoveRoute(appName, routePath string) error {
func (m *Mock) Put(ctx context.Context, key, value []byte) error {
// TODO: improve this mock method
return nil
}
func (m *Mock) Put(key, value []byte) error {
// TODO: improve this mock method
return nil
}
func (m *Mock) Get(key []byte) ([]byte, error) {
func (m *Mock) Get(ctx context.Context, key []byte) ([]byte, error) {
// TODO: improve this mock method
return []byte{}, nil
}

View File

@@ -6,6 +6,8 @@ import (
"fmt"
"net/url"
"context"
"github.com/Sirupsen/logrus"
"github.com/iron-io/functions/api/models"
"github.com/lib/pq"
@@ -76,7 +78,7 @@ func New(url *url.URL) (models.Datastore, error) {
return pg, nil
}
func (ds *PostgresDatastore) InsertApp(app *models.App) (*models.App, error) {
func (ds *PostgresDatastore) InsertApp(ctx context.Context, app *models.App) (*models.App, error) {
var cbyte []byte
var err error
@@ -111,7 +113,7 @@ func (ds *PostgresDatastore) InsertApp(app *models.App) (*models.App, error) {
return app, nil
}
func (ds *PostgresDatastore) UpdateApp(app *models.App) (*models.App, error) {
func (ds *PostgresDatastore) UpdateApp(ctx context.Context, app *models.App) (*models.App, error) {
if app == nil {
return nil, models.ErrAppsNotFound
}
@@ -147,7 +149,7 @@ func (ds *PostgresDatastore) UpdateApp(app *models.App) (*models.App, error) {
return app, nil
}
func (ds *PostgresDatastore) RemoveApp(appName string) error {
func (ds *PostgresDatastore) RemoveApp(ctx context.Context, appName string) error {
if appName == "" {
return models.ErrDatastoreEmptyAppName
}
@@ -164,7 +166,7 @@ func (ds *PostgresDatastore) RemoveApp(appName string) error {
return nil
}
func (ds *PostgresDatastore) GetApp(name string) (*models.App, error) {
func (ds *PostgresDatastore) GetApp(ctx context.Context, name string) (*models.App, error) {
if name == "" {
return nil, models.ErrDatastoreEmptyAppName
}
@@ -208,7 +210,7 @@ func scanApp(scanner rowScanner, app *models.App) error {
return err
}
func (ds *PostgresDatastore) GetApps(filter *models.AppFilter) ([]*models.App, error) {
func (ds *PostgresDatastore) GetApps(ctx context.Context, filter *models.AppFilter) ([]*models.App, error) {
res := []*models.App{}
rows, err := ds.db.Query(`
@@ -239,7 +241,7 @@ func (ds *PostgresDatastore) GetApps(filter *models.AppFilter) ([]*models.App, e
return res, nil
}
func (ds *PostgresDatastore) InsertRoute(route *models.Route) (*models.Route, error) {
func (ds *PostgresDatastore) InsertRoute(ctx context.Context, route *models.Route) (*models.Route, error) {
if route == nil {
return nil, models.ErrDatastoreEmptyRoute
}
@@ -282,7 +284,7 @@ func (ds *PostgresDatastore) InsertRoute(route *models.Route) (*models.Route, er
return route, nil
}
func (ds *PostgresDatastore) UpdateRoute(route *models.Route) (*models.Route, error) {
func (ds *PostgresDatastore) UpdateRoute(ctx context.Context, route *models.Route) (*models.Route, error) {
if route == nil {
return nil, models.ErrDatastoreEmptyRoute
}
@@ -328,7 +330,7 @@ func (ds *PostgresDatastore) UpdateRoute(route *models.Route) (*models.Route, er
return route, nil
}
func (ds *PostgresDatastore) RemoveRoute(appName, routePath string) error {
func (ds *PostgresDatastore) RemoveRoute(ctx context.Context, appName, routePath string) error {
if appName == "" {
return models.ErrDatastoreEmptyAppName
}
@@ -381,7 +383,7 @@ func scanRoute(scanner rowScanner, route *models.Route) error {
return err
}
func (ds *PostgresDatastore) GetRoute(appName, routePath string) (*models.Route, error) {
func (ds *PostgresDatastore) GetRoute(ctx context.Context, appName, routePath string) (*models.Route, error) {
if appName == "" {
return nil, models.ErrDatastoreEmptyAppName
}
@@ -403,7 +405,7 @@ func (ds *PostgresDatastore) GetRoute(appName, routePath string) (*models.Route,
return &route, nil
}
func (ds *PostgresDatastore) GetRoutes(filter *models.RouteFilter) ([]*models.Route, error) {
func (ds *PostgresDatastore) GetRoutes(ctx context.Context, filter *models.RouteFilter) ([]*models.Route, error) {
res := []*models.Route{}
filterQuery := buildFilterQuery(filter)
rows, err := ds.db.Query(fmt.Sprintf("%s %s", routeSelector, filterQuery))
@@ -428,7 +430,7 @@ func (ds *PostgresDatastore) GetRoutes(filter *models.RouteFilter) ([]*models.Ro
return res, nil
}
func (ds *PostgresDatastore) GetRoutesByApp(appName string, filter *models.RouteFilter) ([]*models.Route, error) {
func (ds *PostgresDatastore) GetRoutesByApp(ctx context.Context, appName string, filter *models.RouteFilter) ([]*models.Route, error) {
res := []*models.Route{}
filter.AppName = appName
filterQuery := buildFilterQuery(filter)
@@ -481,7 +483,7 @@ func buildFilterQuery(filter *models.RouteFilter) string {
return filterQuery
}
func (ds *PostgresDatastore) Put(key, value []byte) error {
func (ds *PostgresDatastore) Put(ctx context.Context, key, value []byte) error {
_, err := ds.db.Exec(`
INSERT INTO extras (
key,
@@ -499,7 +501,7 @@ func (ds *PostgresDatastore) Put(key, value []byte) error {
return nil
}
func (ds *PostgresDatastore) Get(key []byte) ([]byte, error) {
func (ds *PostgresDatastore) Get(ctx context.Context, key []byte) ([]byte, error) {
row := ds.db.QueryRow("SELECT value FROM extras WHERE key=$1", key)
var value []byte

View File

@@ -1,6 +1,7 @@
package datastore
import (
"context"
"database/sql"
"fmt"
"os/exec"
@@ -41,6 +42,8 @@ func TestPostgres(t *testing.T) {
defer close()
buf := setLogBuffer()
ctx := context.Background()
ds, err := New(tmpPostgres)
if err != nil {
t.Fatalf("Error when creating datastore: %v", err)
@@ -57,31 +60,31 @@ func TestPostgres(t *testing.T) {
}
// Testing insert app
_, err = ds.InsertApp(nil)
_, err = ds.InsertApp(ctx, nil)
if err != models.ErrDatastoreEmptyApp {
t.Log(buf.String())
t.Fatalf("Test InsertApp(nil): expected error `%v`, but it was `%v`", models.ErrDatastoreEmptyApp, err)
}
_, err = ds.InsertApp(&models.App{})
_, err = ds.InsertApp(ctx, &models.App{})
if err != models.ErrDatastoreEmptyAppName {
t.Log(buf.String())
t.Fatalf("Test InsertApp(nil): expected error `%v`, but it was `%v`", models.ErrDatastoreEmptyAppName, err)
}
_, err = ds.InsertApp(testApp)
_, err = ds.InsertApp(ctx, testApp)
if err != nil {
t.Log(buf.String())
t.Fatalf("Test InsertApp: error when storing new app: %s", err)
}
_, err = ds.InsertApp(testApp)
_, err = ds.InsertApp(ctx, testApp)
if err != models.ErrAppsAlreadyExists {
t.Log(buf.String())
t.Fatalf("Test InsertApp duplicated: expected error `%v`, but it was `%v`", models.ErrAppsAlreadyExists, err)
}
_, err = ds.UpdateApp(&models.App{
_, err = ds.UpdateApp(ctx, &models.App{
Name: testApp.Name,
Config: map[string]string{
"TEST": "1",
@@ -93,13 +96,13 @@ func TestPostgres(t *testing.T) {
}
// Testing get app
_, err = ds.GetApp("")
_, err = ds.GetApp(ctx, "")
if err != models.ErrDatastoreEmptyAppName {
t.Log(buf.String())
t.Fatalf("Test GetApp: expected error to be %v, but it was %s", models.ErrDatastoreEmptyAppName, err)
}
app, err := ds.GetApp(testApp.Name)
app, err := ds.GetApp(ctx, testApp.Name)
if err != nil {
t.Log(buf.String())
t.Fatalf("Test GetApp: error: %s", err)
@@ -110,7 +113,7 @@ func TestPostgres(t *testing.T) {
}
// Testing list apps
apps, err := ds.GetApps(&models.AppFilter{})
apps, err := ds.GetApps(ctx, &models.AppFilter{})
if err != nil {
t.Log(buf.String())
t.Fatalf("Test GetApps: unexpected error %v", err)
@@ -124,18 +127,18 @@ func TestPostgres(t *testing.T) {
}
// Testing app delete
err = ds.RemoveApp("")
err = ds.RemoveApp(ctx, "")
if err != models.ErrDatastoreEmptyAppName {
t.Log(buf.String())
t.Fatalf("Test RemoveApp: expected error `%v`, but it was `%v`", models.ErrDatastoreEmptyAppName, err)
}
err = ds.RemoveApp(testApp.Name)
err = ds.RemoveApp(ctx, testApp.Name)
if err != nil {
t.Log(buf.String())
t.Fatalf("Test RemoveApp: error: %s", err)
}
app, err = ds.GetApp(testApp.Name)
app, err = ds.GetApp(ctx, testApp.Name)
if err != models.ErrAppsNotFound {
t.Log(buf.String())
t.Fatalf("Test GetApp(removed): expected error `%v`, but it was `%v`", models.ErrAppsNotFound, err)
@@ -146,7 +149,7 @@ func TestPostgres(t *testing.T) {
}
// Test update inexistent app
_, err = ds.UpdateApp(&models.App{
_, err = ds.UpdateApp(ctx, &models.App{
Name: testApp.Name,
Config: map[string]string{
"TEST": "1",
@@ -158,47 +161,47 @@ func TestPostgres(t *testing.T) {
}
// Insert app again to test routes
ds.InsertApp(testApp)
ds.InsertApp(ctx, testApp)
// Testing insert route
_, err = ds.InsertRoute(nil)
_, err = ds.InsertRoute(ctx, nil)
if err != models.ErrDatastoreEmptyRoute {
t.Log(buf.String())
t.Fatalf("Test InsertRoute(nil): expected error `%v`, but it was `%v`", models.ErrDatastoreEmptyRoute, err)
}
_, err = ds.InsertRoute(testRoute)
_, err = ds.InsertRoute(ctx, testRoute)
if err != nil {
t.Log(buf.String())
t.Fatalf("Test InsertRoute: error when storing new route: %s", err)
}
_, err = ds.InsertRoute(testRoute)
_, err = ds.InsertRoute(ctx, testRoute)
if err != models.ErrRoutesAlreadyExists {
t.Log(buf.String())
t.Fatalf("Test InsertRoute duplicated: expected error to be `%v`, but it was `%v`", models.ErrRoutesAlreadyExists, err)
}
_, err = ds.UpdateRoute(testRoute)
_, err = ds.UpdateRoute(ctx, testRoute)
if err != nil {
t.Log(buf.String())
t.Fatalf("Test UpdateRoute: unexpected error: %v", err)
}
// Testing get
_, err = ds.GetRoute("a", "")
_, err = ds.GetRoute(ctx, "a", "")
if err != models.ErrDatastoreEmptyRoutePath {
t.Log(buf.String())
t.Fatalf("Test GetRoute(empty route path): expected error `%v`, but it was `%v`", models.ErrDatastoreEmptyRoutePath, err)
}
_, err = ds.GetRoute("", "a")
_, err = ds.GetRoute(ctx, "", "a")
if err != models.ErrDatastoreEmptyAppName {
t.Log(buf.String())
t.Fatalf("Test GetRoute(empty app name): expected error `%v`, but it was `%v`", models.ErrDatastoreEmptyAppName, err)
}
route, err := ds.GetRoute(testApp.Name, testRoute.Path)
route, err := ds.GetRoute(ctx, testApp.Name, testRoute.Path)
if err != nil {
t.Log(buf.String())
t.Fatalf("Test GetRoute: unexpected error %v", err)
@@ -209,7 +212,7 @@ func TestPostgres(t *testing.T) {
}
// Testing list routes
routes, err := ds.GetRoutesByApp(testApp.Name, &models.RouteFilter{})
routes, err := ds.GetRoutesByApp(ctx, testApp.Name, &models.RouteFilter{})
if err != nil {
t.Log(buf.String())
t.Fatalf("Test GetRoutes: unexpected error %v", err)
@@ -223,7 +226,7 @@ func TestPostgres(t *testing.T) {
}
// Testing list routes
routes, err = ds.GetRoutes(&models.RouteFilter{Image: testRoute.Image})
routes, err = ds.GetRoutes(ctx, &models.RouteFilter{Image: testRoute.Image})
if err != nil {
t.Log(buf.String())
t.Fatalf("Test GetRoutes: error: %s", err)
@@ -237,25 +240,25 @@ func TestPostgres(t *testing.T) {
}
// Testing app delete
err = ds.RemoveRoute("", "")
err = ds.RemoveRoute(ctx, "", "")
if err != models.ErrDatastoreEmptyAppName {
t.Log(buf.String())
t.Fatalf("Test RemoveRoute(empty app name): expected error `%v`, but it was `%v`", models.ErrDatastoreEmptyAppName, err)
}
err = ds.RemoveRoute("a", "")
err = ds.RemoveRoute(ctx, "a", "")
if err != models.ErrDatastoreEmptyRoutePath {
t.Log(buf.String())
t.Fatalf("Test RemoveRoute(empty route path): expected error `%v`, but it was `%v`", models.ErrDatastoreEmptyRoutePath, err)
}
err = ds.RemoveRoute(testRoute.AppName, testRoute.Path)
err = ds.RemoveRoute(ctx, testRoute.AppName, testRoute.Path)
if err != nil {
t.Log(buf.String())
t.Fatalf("Test RemoveApp: unexpected error: %v", err)
}
_, err = ds.UpdateRoute(&models.Route{
_, err = ds.UpdateRoute(ctx, &models.Route{
AppName: testRoute.AppName,
Path: testRoute.Path,
Image: "test",
@@ -265,7 +268,7 @@ func TestPostgres(t *testing.T) {
t.Fatalf("Test UpdateRoute inexistent: expected error to be `%v`, but it was `%v`", models.ErrRoutesNotFound, err)
}
route, err = ds.GetRoute(testRoute.AppName, testRoute.Path)
route, err = ds.GetRoute(ctx, testRoute.AppName, testRoute.Path)
if err != models.ErrRoutesNotFound {
t.Log(buf.String())
t.Fatalf("Test GetRoute: expected error `%v`, but it was `%v`", models.ErrRoutesNotFound, err)