test(task): add test for reusing task names after deletion

pull/10616/head
Mark Rushakoff 2018-09-25 09:32:37 -07:00 committed by Mark Rushakoff
parent d910989677
commit 1524768aed
2 changed files with 31 additions and 5 deletions

View File

@ -3,13 +3,13 @@
// The data stored in bolt is structured as follows: // The data stored in bolt is structured as follows:
// //
// bucket(/tasks/v1/tasks) key(:task_id) -> Content of submitted task (i.e. flux code). // bucket(/tasks/v1/tasks) key(:task_id) -> Content of submitted task (i.e. flux code).
// bucket(/tasks/v1/task_meta) Key(:task_id) -> Protocol Buffer encoded backend.StoreTaskMeta, // bucket(/tasks/v1/task_meta) key(:task_id) -> Protocol Buffer encoded backend.StoreTaskMeta,
// so we have a consistent view of runs in progress and max concurrency. // so we have a consistent view of runs in progress and max concurrency.
// bucket(/tasks/v1/org_by_task_id) key(task_id) -> The organization ID (stored as encoded string) associated with given task. // bucket(/tasks/v1/org_by_task_id) key(task_id) -> The organization ID (stored as encoded string) associated with given task.
// bucket(/tasks/v1/user_by_task_id) key(:task_id) -> The user ID (stored as encoded string) associated with given task. // bucket(/tasks/v1/user_by_task_id) key(:task_id) -> The user ID (stored as encoded string) associated with given task.
// buket(/tasks/v1/name_by_task_id) key(:task_id) -> The user-supplied name of the script. // buket(/tasks/v1/name_by_task_id) key(:task_id) -> The user-supplied name of the script.
// bucket(/tasks/v1/name_by_org) key(:org_id) -> Task ID. This allows us to make task names unique for org // bucket(/tasks/v1/name_by_org).bucket(:org_id) key(:task_name) -> Task ID. This allows us to make task names unique for org.
// bucket(/tasks/v1/name_by_user) key(:user_id) -> Task ID. This allows us to make task names unique for user // bucket(/tasks/v1/name_by_user).bucket(:user_id) key(:task_name) -> Task ID. This allows us to make task names unique for user.
// bucket(/tasks/v1/run_ids) -> Counter for run IDs // bucket(/tasks/v1/run_ids) -> Counter for run IDs
// bucket(/tasks/v1/orgs).bucket(:org_id) key(:task_id) -> Empty content; presence of :task_id allows for lookup from org to tasks. // bucket(/tasks/v1/orgs).bucket(:org_id) key(:task_id) -> Empty content; presence of :task_id allows for lookup from org to tasks.
// bucket(/tasks/v1/users).bucket(:user_id) key(:task_id) -> Empty content; presence of :task_id allows for lookup from user to tasks. // bucket(/tasks/v1/users).bucket(:user_id) key(:task_id) -> Empty content; presence of :task_id allows for lookup from user to tasks.
@ -522,7 +522,7 @@ func (s *Store) DisableTask(ctx context.Context, id platform.ID) error {
}) })
} }
// DeleteTask deletes the task // DeleteTask deletes the task.
func (s *Store) DeleteTask(ctx context.Context, id platform.ID) (deleted bool, err error) { func (s *Store) DeleteTask(ctx context.Context, id platform.ID) (deleted bool, err error) {
paddedID := padID(id) paddedID := padID(id)
err = s.db.Batch(func(tx *bolt.Tx) error { err = s.db.Batch(func(tx *bolt.Tx) error {
@ -530,6 +530,8 @@ func (s *Store) DeleteTask(ctx context.Context, id platform.ID) (deleted bool, e
if check := b.Bucket(tasksPath).Get(paddedID); check == nil { if check := b.Bucket(tasksPath).Get(paddedID); check == nil {
return ErrNotFound return ErrNotFound
} }
name := b.Bucket(nameByTaskID).Get(paddedID)
if err := b.Bucket(taskMetaPath).Delete(paddedID); err != nil { if err := b.Bucket(taskMetaPath).Delete(paddedID); err != nil {
return err return err
} }
@ -541,6 +543,9 @@ func (s *Store) DeleteTask(ctx context.Context, id platform.ID) (deleted bool, e
if err := b.Bucket(usersPath).Bucket(user).Delete(paddedID); err != nil { if err := b.Bucket(usersPath).Bucket(user).Delete(paddedID); err != nil {
return err return err
} }
if err := b.Bucket(nameByUser).Bucket(user).Delete(name); err != nil {
return err
}
} }
if err := b.Bucket(userByTaskID).Delete(paddedID); err != nil { if err := b.Bucket(userByTaskID).Delete(paddedID); err != nil {
return err return err
@ -554,6 +559,9 @@ func (s *Store) DeleteTask(ctx context.Context, id platform.ID) (deleted bool, e
if err := b.Bucket(orgsPath).Bucket(org).Delete(paddedID); err != nil { if err := b.Bucket(orgsPath).Bucket(org).Delete(paddedID); err != nil {
return err return err
} }
if err := b.Bucket(nameByOrg).Bucket(org).Delete(name); err != nil {
return err
}
} }
return b.Bucket(orgByTaskID).Delete(paddedID) return b.Bucket(orgByTaskID).Delete(paddedID)
}) })

View File

@ -11,9 +11,12 @@ import (
"time" "time"
"github.com/influxdata/platform" "github.com/influxdata/platform"
"github.com/influxdata/platform/snowflake"
"github.com/influxdata/platform/task/backend" "github.com/influxdata/platform/task/backend"
) )
var idGen = snowflake.NewIDGenerator()
type CreateStoreFunc func(*testing.T) backend.Store type CreateStoreFunc func(*testing.T) backend.Store
type DestroyStoreFunc func(*testing.T, backend.Store) type DestroyStoreFunc func(*testing.T, backend.Store)
type TestFunc func(*testing.T, CreateStoreFunc, DestroyStoreFunc) type TestFunc func(*testing.T, CreateStoreFunc, DestroyStoreFunc)
@ -626,7 +629,8 @@ from(bucket:"test") |> range(start:-1h)`
s := create(t) s := create(t)
defer destroy(t, s) defer destroy(t, s)
id, err := s.CreateTask(context.Background(), []byte{1}, []byte{2}, script, 0) org, user := idGen.ID(), idGen.ID()
id, err := s.CreateTask(context.Background(), org, user, script, 0)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -656,6 +660,20 @@ from(bucket:"test") |> range(start:-1h)`
if task != nil { if task != nil {
t.Fatalf("expected nil task when finding nonexistent ID, got %#v", task) t.Fatalf("expected nil task when finding nonexistent ID, got %#v", task)
} }
// It's safe to reuse the same name, for the same org with a new user, after deleting the original.
id, err = s.CreateTask(context.Background(), org, idGen.ID(), script, 0)
if err != nil {
t.Fatalf("Error when reusing task name that was previously deleted: %v", err)
}
if _, err := s.DeleteTask(context.Background(), id); err != nil {
t.Fatal(err)
}
// Reuse the same name, for the original user but a new org.
if _, err = s.CreateTask(context.Background(), idGen.ID(), user, script, 0); err != nil {
t.Fatalf("Error when reusing task name that was previously deleted: %v", err)
}
}) })
} }