store: keep an in-memory index of routes, support lookup by path

Signed-off-by: Andrea Luzzardi <aluzzardi@gmail.com>
This commit is contained in:
Andrea Luzzardi
2021-03-25 19:08:52 -07:00
parent 1e8cef9ad0
commit e08e64b311
8 changed files with 329 additions and 111 deletions

View File

@@ -9,29 +9,91 @@ import (
"github.com/stretchr/testify/require"
)
func TestStore(t *testing.T) {
func TestStoreLoad(t *testing.T) {
ctx := context.TODO()
root, err := os.MkdirTemp(os.TempDir(), "dagger-*")
require.NoError(t, err)
store := NewStore(root)
store, err := NewStore(root)
require.NoError(t, err)
_, err = store.LookupRoute(ctx, "notexist", nil)
_, err = store.LookupRouteByName(ctx, "notexist")
require.Error(t, err)
require.True(t, errors.Is(err, os.ErrNotExist))
r, err := store.CreateRoute(ctx, "test", nil)
require.NoError(t, err)
require.NotNil(t, r)
require.Equal(t, "test", r.Name())
st := &RouteState{
Name: "test",
}
require.NoError(t, store.CreateRoute(ctx, st))
r, err = store.LookupRoute(ctx, "test", nil)
require.NoError(t, err)
require.NotNil(t, r)
require.Equal(t, "test", r.Name())
checkRoutes := func(store *Store) {
r, err := store.LookupRouteByID(ctx, st.ID)
require.NoError(t, err)
require.NotNil(t, r)
require.Equal(t, "test", r.Name)
routes, err := store.ListRoutes(ctx)
r, err = store.LookupRouteByName(ctx, "test")
require.NoError(t, err)
require.NotNil(t, r)
require.Equal(t, "test", r.Name)
routes, err := store.ListRoutes(ctx)
require.NoError(t, err)
require.Len(t, routes, 1)
require.Equal(t, "test", routes[0].Name)
}
checkRoutes(store)
// Reload the routes from disk and check again
newStore, err := NewStore(root)
require.NoError(t, err)
checkRoutes(newStore)
}
func TestStoreLookupByPath(t *testing.T) {
ctx := context.TODO()
root, err := os.MkdirTemp(os.TempDir(), "dagger-*")
require.NoError(t, err)
store, err := NewStore(root)
require.NoError(t, err)
st := &RouteState{
Name: "test",
}
require.NoError(t, st.AddInput("foo", DirInput("/test/path", []string{})))
require.NoError(t, store.CreateRoute(ctx, st))
// Lookup by path
r, err := store.LookupRouteByPath(ctx, "/test/path")
require.NoError(t, err)
require.NotNil(t, r)
require.Equal(t, st.ID, r.ID)
// Add a new path
require.NoError(t, st.AddInput("bar", DirInput("/test/anotherpath", []string{})))
require.NoError(t, store.UpdateRoute(ctx, st, nil))
// Lookup by the previous path
r, err = store.LookupRouteByPath(ctx, "/test/path")
require.NoError(t, err)
require.Equal(t, st.ID, r.ID)
// Lookup by the new path
r, err = store.LookupRouteByPath(ctx, "/test/anotherpath")
require.NoError(t, err)
require.Equal(t, st.ID, r.ID)
// Remove a path
require.NoError(t, st.RemoveInputs("foo"))
require.NoError(t, store.UpdateRoute(ctx, st, nil))
// Lookup by the removed path should fail
_, err = store.LookupRouteByPath(ctx, "/test/path")
require.Error(t, err)
// Lookup by the other path should still work
_, err = store.LookupRouteByPath(ctx, "/test/anotherpath")
require.NoError(t, err)
require.Len(t, routes, 1)
require.Equal(t, "test", routes[0])
}