feat(platform/id): using uint64 for platform.IDs

Signed-off-by: Leonardo Di Donato <leodidonato@gmail.com>
Co-Authored-by: Lorenzo Fontana <lo@linux.com>
pull/10616/head
Leonardo Di Donato 2018-07-20 12:24:07 +02:00 committed by Chris Goller
parent 23a53d2d2e
commit 8d7f06cf4b
44 changed files with 1477 additions and 660 deletions

View File

@ -1,7 +1,6 @@
package bolt
import (
"bytes"
"context"
"encoding/json"
"fmt"
@ -57,9 +56,13 @@ func (c *Client) FindAuthorizationByID(ctx context.Context, id platform.ID) (*pl
}
func (c *Client) findAuthorizationByID(ctx context.Context, tx *bolt.Tx, id platform.ID) (*platform.Authorization, error) {
var a platform.Authorization
encodedID, err := id.Encode()
if err != nil {
return nil, err
}
v := tx.Bucket(authorizationBucket).Get(id)
var a platform.Authorization
v := tx.Bucket(authorizationBucket).Get(encodedID)
if len(v) == 0 {
// TODO: Make standard error
@ -94,14 +97,17 @@ func (c *Client) FindAuthorizationByToken(ctx context.Context, n string) (*platf
}
func (c *Client) findAuthorizationByToken(ctx context.Context, tx *bolt.Tx, n string) (*platform.Authorization, error) {
id := tx.Bucket(authorizationIndex).Get(authorizationIndexKey(n))
return c.findAuthorizationByID(ctx, tx, platform.ID(id))
var id platform.ID
if err := id.Decode(tx.Bucket(authorizationIndex).Get(authorizationIndexKey(n))); err != nil {
return nil, err
}
return c.findAuthorizationByID(ctx, tx, id)
}
func filterAuthorizationsFn(filter platform.AuthorizationFilter) func(a *platform.Authorization) bool {
if filter.ID != nil {
return func(a *platform.Authorization) bool {
return bytes.Equal(a.ID, *filter.ID)
return a.ID.Valid() && a.ID == *filter.ID
}
}
@ -113,7 +119,7 @@ func filterAuthorizationsFn(filter platform.AuthorizationFilter) func(a *platfor
if filter.UserID != nil {
return func(a *platform.Authorization) bool {
return bytes.Equal(a.UserID, *filter.UserID)
return a.UserID.Valid() && a.UserID == *filter.UserID
}
}
@ -187,7 +193,7 @@ func (c *Client) findAuthorizations(ctx context.Context, tx *bolt.Tx, f platform
// CreateAuthorization creates a platform authorization and sets b.ID, and b.UserID if not provided.
func (c *Client) CreateAuthorization(ctx context.Context, a *platform.Authorization) error {
return c.db.Update(func(tx *bolt.Tx) error {
if len(a.UserID) == 0 {
if !a.UserID.Valid() {
u, err := c.findUserByName(ctx, tx, a.User)
if err != nil {
return err
@ -239,10 +245,15 @@ func (c *Client) putAuthorization(ctx context.Context, tx *bolt.Tx, a *platform.
return err
}
if err := tx.Bucket(authorizationIndex).Put(authorizationIndexKey(a.Token), a.ID); err != nil {
encodedID, err := a.ID.Encode()
if err != nil {
return err
}
if err := tx.Bucket(authorizationBucket).Put(a.ID, v); err != nil {
if err := tx.Bucket(authorizationIndex).Put(authorizationIndexKey(a.Token), encodedID); err != nil {
return err
}
if err := tx.Bucket(authorizationBucket).Put(encodedID, v); err != nil {
return err
}
return c.setUserOnAuthorization(ctx, tx, a)
@ -302,7 +313,12 @@ func (c *Client) deleteAuthorization(ctx context.Context, tx *bolt.Tx, id platfo
if err := tx.Bucket(authorizationIndex).Delete(authorizationIndexKey(a.Token)); err != nil {
return err
}
return tx.Bucket(authorizationBucket).Delete(id)
encodedID, err := id.Encode()
if err != nil {
return err
}
return tx.Bucket(authorizationBucket).Delete(encodedID)
}
// SetAuthorizationStatus updates the status of the authorization. Useful

View File

@ -1,7 +1,6 @@
package bolt
import (
"bytes"
"context"
"encoding/json"
"fmt"
@ -57,7 +56,12 @@ func (c *Client) FindBucketByID(ctx context.Context, id platform.ID) (*platform.
func (c *Client) findBucketByID(ctx context.Context, tx *bolt.Tx, id platform.ID) (*platform.Bucket, error) {
var b platform.Bucket
v := tx.Bucket(bucketBucket).Get(id)
encodedID, err := id.Encode()
if err != nil {
return nil, err
}
v := tx.Bucket(bucketBucket).Get(encodedID)
if len(v) == 0 {
// TODO: Make standard error
@ -97,8 +101,16 @@ func (c *Client) findBucketByName(ctx context.Context, tx *bolt.Tx, orgID platfo
OrganizationID: orgID,
Name: n,
}
id := tx.Bucket(bucketIndex).Get(bucketIndexKey(b))
return c.findBucketByID(ctx, tx, platform.ID(id))
key, err := bucketIndexKey(b)
if err != nil {
return nil, err
}
var id platform.ID
if err := id.Decode(tx.Bucket(bucketIndex).Get(key)); err != nil {
return nil, err
}
return c.findBucketByID(ctx, tx, id)
}
// FindBucket retrives a bucket using an arbitrary bucket filter.
@ -147,13 +159,13 @@ func (c *Client) FindBucket(ctx context.Context, filter platform.BucketFilter) (
func filterBucketsFn(filter platform.BucketFilter) func(b *platform.Bucket) bool {
if filter.ID != nil {
return func(b *platform.Bucket) bool {
return bytes.Equal(b.ID, *filter.ID)
return b.ID == *filter.ID
}
}
if filter.Name != nil && filter.OrganizationID != nil {
return func(b *platform.Bucket) bool {
return bytes.Equal(b.OrganizationID, *filter.OrganizationID) && b.Name == *filter.Name
return b.Name == *filter.Name && b.OrganizationID == *filter.OrganizationID
}
}
@ -165,7 +177,7 @@ func filterBucketsFn(filter platform.BucketFilter) func(b *platform.Bucket) bool
if filter.OrganizationID != nil {
return func(b *platform.Bucket) bool {
return bytes.Equal(b.OrganizationID, *filter.OrganizationID)
return b.OrganizationID == *filter.OrganizationID
}
}
@ -239,7 +251,7 @@ func (c *Client) findBuckets(ctx context.Context, tx *bolt.Tx, filter platform.B
// CreateBucket creates a platform bucket and sets b.ID.
func (c *Client) CreateBucket(ctx context.Context, b *platform.Bucket) error {
return c.db.Update(func(tx *bolt.Tx) error {
if len(b.OrganizationID) == 0 {
if !b.OrganizationID.Valid() {
o, err := c.findOrganizationByName(ctx, tx, b.Organization)
if err != nil {
return err
@ -273,20 +285,33 @@ func (c *Client) putBucket(ctx context.Context, tx *bolt.Tx, b *platform.Bucket)
return err
}
if err := tx.Bucket(bucketIndex).Put(bucketIndexKey(b), b.ID); err != nil {
encodedID, err := b.ID.Encode()
if err != nil {
return err
}
if err := tx.Bucket(bucketBucket).Put(b.ID, v); err != nil {
key, err := bucketIndexKey(b)
if err != nil {
return err
}
if err := tx.Bucket(bucketIndex).Put(key, encodedID); err != nil {
return err
}
if err := tx.Bucket(bucketBucket).Put(encodedID, v); err != nil {
return err
}
return c.setOrganizationOnBucket(ctx, tx, b)
}
func bucketIndexKey(b *platform.Bucket) []byte {
k := make([]byte, len(b.OrganizationID)+len(b.Name))
copy(k, b.OrganizationID)
copy(k[len(b.OrganizationID):], []byte(b.Name))
return k
func bucketIndexKey(b *platform.Bucket) ([]byte, error) {
orgID, err := b.OrganizationID.Encode()
if err != nil {
return nil, err
}
k := make([]byte, platform.IDStringLength+len(b.Name))
copy(k, orgID)
copy(k[platform.IDStringLength:], []byte(b.Name))
return k, nil
}
// forEachBucket will iterate through all buckets while fn returns true.
@ -309,7 +334,11 @@ func (c *Client) forEachBucket(ctx context.Context, tx *bolt.Tx, fn func(*platfo
}
func (c *Client) uniqueBucketName(ctx context.Context, tx *bolt.Tx, b *platform.Bucket) bool {
v := tx.Bucket(bucketIndex).Get(bucketIndexKey(b))
key, err := bucketIndexKey(b)
if err != nil {
return false
}
v := tx.Bucket(bucketIndex).Get(key)
return len(v) == 0
}
@ -339,9 +368,12 @@ func (c *Client) updateBucket(ctx context.Context, tx *bolt.Tx, id platform.ID,
}
if upd.Name != nil {
// Buckets are indexed by name and so the bucket index must be pruned when name
// is modified.
if err := tx.Bucket(bucketIndex).Delete(bucketIndexKey(b)); err != nil {
key, err := bucketIndexKey(b)
if err != nil {
return nil, err
}
// Buckets are indexed by name and so the bucket index must be pruned when name is modified.
if err := tx.Bucket(bucketIndex).Delete(key); err != nil {
return nil, err
}
b.Name = *upd.Name
@ -370,9 +402,17 @@ func (c *Client) deleteBucket(ctx context.Context, tx *bolt.Tx, id platform.ID)
if err != nil {
return err
}
// make lowercase deleteBucket with tx
if err := tx.Bucket(bucketIndex).Delete(bucketIndexKey(b)); err != nil {
key, err := bucketIndexKey(b)
if err != nil {
return err
}
return tx.Bucket(bucketBucket).Delete(id)
// make lowercase deleteBucket with tx
if err := tx.Bucket(bucketIndex).Delete(key); err != nil {
return err
}
encodedID, err := id.Encode()
if err != nil {
return err
}
return tx.Bucket(bucketBucket).Delete(encodedID)
}

View File

@ -45,9 +45,13 @@ func (c *Client) FindDashboardByID(ctx context.Context, id platform.ID) (*platfo
}
func (c *Client) findDashboardByID(ctx context.Context, tx *bolt.Tx, id platform.ID) (*platform.Dashboard, error) {
var d platform.Dashboard
encodedID, err := id.Encode()
if err != nil {
return nil, err
}
v := tx.Bucket(dashboardBucket).Get([]byte(id))
var d platform.Dashboard
v := tx.Bucket(dashboardBucket).Get(encodedID)
if len(v) == 0 {
return nil, platform.ErrDashboardNotFound
@ -326,7 +330,11 @@ func (c *Client) putDashboard(ctx context.Context, tx *bolt.Tx, d *platform.Dash
if err != nil {
return err
}
if err := tx.Bucket(dashboardBucket).Put([]byte(d.ID), v); err != nil {
encodedID, err := d.ID.Encode()
if err != nil {
return err
}
if err := tx.Bucket(dashboardBucket).Put(encodedID, v); err != nil {
return err
}
return nil
@ -397,5 +405,9 @@ func (c *Client) deleteDashboard(ctx context.Context, tx *bolt.Tx, id platform.I
return err
}
}
return tx.Bucket(dashboardBucket).Delete([]byte(id))
encodedID, err := id.Encode()
if err != nil {
return err
}
return tx.Bucket(dashboardBucket).Delete(encodedID)
}

View File

@ -1,7 +1,6 @@
package bolt
import (
"bytes"
"context"
"encoding/json"
"fmt"
@ -48,9 +47,13 @@ func (c *Client) FindOrganizationByID(ctx context.Context, id platform.ID) (*pla
}
func (c *Client) findOrganizationByID(ctx context.Context, tx *bolt.Tx, id platform.ID) (*platform.Organization, error) {
var o platform.Organization
encodedID, err := id.Encode()
if err != nil {
return nil, err
}
v := tx.Bucket(organizationBucket).Get(id)
var o platform.Organization
v := tx.Bucket(organizationBucket).Get(encodedID)
if len(v) == 0 {
// TODO: Make standard error
@ -81,8 +84,11 @@ func (c *Client) FindOrganizationByName(ctx context.Context, n string) (*platfor
}
func (c *Client) findOrganizationByName(ctx context.Context, tx *bolt.Tx, n string) (*platform.Organization, error) {
id := tx.Bucket(organizationIndex).Get(organizationIndexKey(n))
return c.findOrganizationByID(ctx, tx, platform.ID(id))
var id platform.ID
if err := id.Decode(tx.Bucket(organizationIndex).Get(organizationIndexKey(n))); err != nil {
return nil, err
}
return c.findOrganizationByID(ctx, tx, id)
}
// FindOrganization retrives a organization using an arbitrary organization filter.
@ -124,7 +130,7 @@ func (c *Client) FindOrganization(ctx context.Context, filter platform.Organizat
func filterOrganizationsFn(filter platform.OrganizationFilter) func(o *platform.Organization) bool {
if filter.ID != nil {
return func(o *platform.Organization) bool {
return bytes.Equal(o.ID, *filter.ID)
return o.ID.Valid() && o.ID == *filter.ID
}
}
@ -205,11 +211,14 @@ func (c *Client) putOrganization(ctx context.Context, tx *bolt.Tx, o *platform.O
if err != nil {
return err
}
if err := tx.Bucket(organizationIndex).Put(organizationIndexKey(o.Name), o.ID); err != nil {
encodedID, err := o.ID.Encode()
if err != nil {
return err
}
return tx.Bucket(organizationBucket).Put(o.ID, v)
if err := tx.Bucket(organizationIndex).Put(organizationIndexKey(o.Name), encodedID); err != nil {
return err
}
return tx.Bucket(organizationBucket).Put(encodedID, v)
}
func organizationIndexKey(n string) []byte {
@ -292,7 +301,11 @@ func (c *Client) deleteOrganization(ctx context.Context, tx *bolt.Tx, id platfor
if err := tx.Bucket(organizationIndex).Delete(organizationIndexKey(o.Name)); err != nil {
return err
}
return tx.Bucket(organizationBucket).Delete(id)
encodedID, err := id.Encode()
if err != nil {
return err
}
return tx.Bucket(organizationBucket).Delete(encodedID)
}
func (c *Client) deleteOrganizationsBuckets(ctx context.Context, tx *bolt.Tx, id platform.ID) error {

View File

@ -22,8 +22,8 @@ func initOrganizationService(f platformtesting.OrganizationFields, t *testing.T)
}
return c, func() {
defer closeFn()
for _, u := range f.Organizations {
if err := c.DeleteOrganization(ctx, u.ID); err != nil {
for _, o := range f.Organizations {
if err := c.DeleteOrganization(ctx, o.ID); err != nil {
t.Logf("failed to remove organizations: %v", err)
}
}

View File

@ -1,7 +1,6 @@
package bolt
import (
"bytes"
"context"
"encoding/json"
"fmt"
@ -55,9 +54,13 @@ func (c *Client) FindUserByID(ctx context.Context, id platform.ID) (*platform.Us
}
func (c *Client) findUserByID(ctx context.Context, tx *bolt.Tx, id platform.ID) (*platform.User, error) {
var u platform.User
encodedID, err := id.Encode()
if err != nil {
return nil, err
}
v := tx.Bucket(userBucket).Get(id)
var u platform.User
v := tx.Bucket(userBucket).Get(encodedID)
if len(v) == 0 {
// TODO: Make standard error
@ -88,8 +91,11 @@ func (c *Client) FindUserByName(ctx context.Context, n string) (*platform.User,
}
func (c *Client) findUserByName(ctx context.Context, tx *bolt.Tx, n string) (*platform.User, error) {
id := tx.Bucket(userIndex).Get(userIndexKey(n))
return c.findUserByID(ctx, tx, platform.ID(id))
var id platform.ID
if err := id.Decode(tx.Bucket(userIndex).Get(userIndexKey(n))); err != nil {
return nil, err
}
return c.findUserByID(ctx, tx, id)
}
// FindUser retrives a user using an arbitrary user filter.
@ -131,7 +137,7 @@ func (c *Client) FindUser(ctx context.Context, filter platform.UserFilter) (*pla
func filterUsersFn(filter platform.UserFilter) func(u *platform.User) bool {
if filter.ID != nil {
return func(u *platform.User) bool {
return bytes.Equal(u.ID, *filter.ID)
return u.ID.Valid() && u.ID == *filter.ID
}
}
@ -212,11 +218,14 @@ func (c *Client) putUser(ctx context.Context, tx *bolt.Tx, u *platform.User) err
if err != nil {
return err
}
if err := tx.Bucket(userIndex).Put(userIndexKey(u.Name), u.ID); err != nil {
encodedID, err := u.ID.Encode()
if err != nil {
return err
}
return tx.Bucket(userBucket).Put(u.ID, v)
if err := tx.Bucket(userIndex).Put(userIndexKey(u.Name), encodedID); err != nil {
return err
}
return tx.Bucket(userBucket).Put(encodedID, v)
}
func userIndexKey(n string) []byte {
@ -296,11 +305,14 @@ func (c *Client) deleteUser(ctx context.Context, tx *bolt.Tx, id platform.ID) er
if err != nil {
return err
}
encodedID, err := id.Encode()
if err != nil {
return err
}
if err := tx.Bucket(userIndex).Delete(userIndexKey(u.Name)); err != nil {
return err
}
return tx.Bucket(userBucket).Delete(id)
return tx.Bucket(userBucket).Delete(encodedID)
}
func (c *Client) deleteUsersAuthorizations(ctx context.Context, tx *bolt.Tx, id platform.ID) error {

View File

@ -151,23 +151,23 @@ func authorizationFindF(cmd *cobra.Command, args []string) {
filter := platform.AuthorizationFilter{}
if authorizationFindFlags.id != "" {
filter.ID = &platform.ID{}
err := filter.ID.DecodeFromString(authorizationFindFlags.id)
fID, err := platform.IDFromString(authorizationFindFlags.id)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
filter.ID = fID
}
if authorizationFindFlags.user != "" {
filter.User = &authorizationFindFlags.user
}
if authorizationFindFlags.userID != "" {
filter.UserID = &platform.ID{}
err := filter.UserID.DecodeFromString(authorizationFindFlags.userID)
uID, err := platform.IDFromString(authorizationFindFlags.userID)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
filter.UserID = uID
}
authorizations, _, err := s.FindAuthorizations(context.Background(), filter)
@ -230,20 +230,20 @@ func authorizationDeleteF(cmd *cobra.Command, args []string) {
Token: flags.token,
}
id := platform.ID{}
if err := id.DecodeFromString(authorizationDeleteFlags.id); err != nil {
fmt.Println(err)
os.Exit(1)
}
ctx := context.TODO()
a, err := s.FindAuthorizationByID(ctx, id)
id, err := platform.IDFromString(authorizationDeleteFlags.id)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
if err := s.DeleteAuthorization(context.Background(), id); err != nil {
ctx := context.TODO()
a, err := s.FindAuthorizationByID(ctx, *id)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
if err := s.DeleteAuthorization(context.Background(), *id); err != nil {
fmt.Println(err)
os.Exit(1)
}

View File

@ -71,12 +71,12 @@ func bucketCreateF(cmd *cobra.Command, args []string) {
}
if bucketCreateFlags.orgID != "" {
var id platform.ID
if err := id.DecodeFromString(bucketCreateFlags.orgID); err != nil {
id, err := platform.IDFromString(bucketCreateFlags.orgID)
if err != nil {
fmt.Printf("error parsing organization id: %v\n", err)
os.Exit(1)
}
b.OrganizationID = id
b.OrganizationID = *id
}
if err := s.CreateBucket(context.Background(), b); err != nil {
@ -139,12 +139,12 @@ func bucketFindF(cmd *cobra.Command, args []string) {
}
if bucketFindFlags.id != "" {
filter.ID = &platform.ID{}
err := filter.ID.DecodeFromString(bucketFindFlags.id)
id, err := platform.IDFromString(bucketFindFlags.id)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
filter.ID = id
}
if bucketFindFlags.orgID != "" && bucketFindFlags.org != "" {
@ -154,12 +154,12 @@ func bucketFindF(cmd *cobra.Command, args []string) {
}
if bucketFindFlags.orgID != "" {
filter.OrganizationID = &platform.ID{}
err := filter.OrganizationID.DecodeFromString(bucketFindFlags.orgID)
orgID, err := platform.IDFromString(bucketFindFlags.orgID)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
filter.OrganizationID = orgID
}
if bucketFindFlags.org != "" {

View File

@ -103,11 +103,12 @@ func organizationFindF(cmd *cobra.Command, args []string) {
}
if organizationFindFlags.id != "" {
filter.ID = &platform.ID{}
if err := filter.ID.DecodeFromString(organizationFindFlags.id); err != nil {
id, err := platform.IDFromString(organizationFindFlags.id)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
filter.ID = id
}
orgs, _, err := s.FindOrganizations(context.Background(), filter)

View File

@ -155,11 +155,12 @@ func userFindF(cmd *cobra.Command, args []string) {
filter.Name = &userFindFlags.name
}
if userFindFlags.id != "" {
filter.ID = &platform.ID{}
if err := filter.ID.DecodeFromString(userFindFlags.id); err != nil {
id, err := platform.IDFromString(userFindFlags.id)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
filter.ID = id
}
users, _, err := s.FindUsers(context.Background(), filter)

View File

@ -92,7 +92,7 @@ type CellUpdate struct {
Y *int32 `json:"y"`
W *int32 `json:"w"`
H *int32 `json:"h"`
ViewID *ID `json:"viewID"`
ViewID ID `json:"viewID"`
}
// Apply applies an update to a Cell.
@ -113,8 +113,8 @@ func (u CellUpdate) Apply(c *Cell) error {
c.H = *u.H
}
if u.ViewID != nil {
c.ViewID = *u.ViewID
if u.ViewID.Valid() {
c.ViewID = u.ViewID
}
return nil

View File

@ -1,7 +1,6 @@
package platform
import (
"bytes"
"context"
"errors"
"strconv"
@ -48,10 +47,10 @@ func (m DBRPMapping) Validate() error {
if !validName(m.RetentionPolicy) {
return errors.New("RetentionPolicy must contain at least one character and only be letters, numbers, '_', '-', and '.'")
}
if len(m.OrganizationID) == 0 {
if !m.OrganizationID.Valid() {
return errors.New("OrganizationID is required")
}
if len(m.BucketID) == 0 {
if !m.BucketID.Valid() {
return errors.New("BucketID is required")
}
return nil
@ -64,7 +63,6 @@ func validName(name string) bool {
return false
}
}
return name != "" &&
name != "." &&
name != ".." &&
@ -83,8 +81,12 @@ func (m *DBRPMapping) Equal(o *DBRPMapping) bool {
m.Database == o.Database &&
m.RetentionPolicy == o.RetentionPolicy &&
m.Default == o.Default &&
bytes.Equal(m.OrganizationID, o.OrganizationID) &&
bytes.Equal(m.BucketID, o.BucketID)
m.OrganizationID.Valid() &&
o.OrganizationID.Valid() &&
m.BucketID.Valid() &&
o.BucketID.Valid() &&
m.OrganizationID == o.OrganizationID &&
m.BucketID == o.BucketID
}
// DBRPMappingFilter represents a set of filters that restrict the returned results by cluster, database and retention policy.

View File

@ -0,0 +1,41 @@
package platform
import (
"testing"
)
func Test_validName(t *testing.T) {
tests := []struct {
arg string
name string
want bool
}{
{
name: "names cannot have unprintable characters",
arg: string([]byte{0x0D}),
want: false,
},
{
name: "names cannot have .",
arg: ".",
want: false,
},
{
name: "names cannot have ..",
arg: "..",
want: false,
},
{
name: "names cannot have /",
arg: "/",
want: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := validName(tt.arg); got != tt.want {
t.Errorf("validName() = %v, want %v", got, tt.want)
}
})
}
}

View File

@ -1,7 +1,10 @@
package platform
package platform_test
import (
"testing"
"github.com/influxdata/platform"
platformtesting "github.com/influxdata/platform/testing"
)
func TestDBRPMapping_Validate(t *testing.T) {
@ -10,8 +13,8 @@ func TestDBRPMapping_Validate(t *testing.T) {
Database string
RetentionPolicy string
Default bool
OrganizationID ID
BucketID ID
OrganizationID platform.ID
BucketID platform.ID
}
tests := []struct {
name string
@ -57,7 +60,7 @@ func TestDBRPMapping_Validate(t *testing.T) {
Cluster: "abc",
Database: "telegraf",
RetentionPolicy: "autogen",
OrganizationID: []byte{0xde, 0xba, 0xc1, 0xe0, 0xde, 0xad, 0xbe, 0xef},
OrganizationID: platformtesting.MustIDFromString("debac1e0deadbeef"),
},
wantErr: true,
},
@ -85,21 +88,20 @@ func TestDBRPMapping_Validate(t *testing.T) {
},
wantErr: true,
},
{
name: "dash accepted as valid database",
fields: fields{
Cluster: "12345_.",
Database: "howdy-doody",
RetentionPolicy: "autogen",
OrganizationID: []byte{0xde, 0xba, 0xc1, 0xe0, 0xde, 0xad, 0xbe, 0xef},
BucketID: []byte{0x5c, 0xa1, 0xab, 0x1e, 0xde, 0xad, 0xbe, 0xa7},
OrganizationID: platformtesting.MustIDFromString("debac1e0deadbeef"),
BucketID: platformtesting.MustIDFromString("5ca1ab1edeadbea7"),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
m := DBRPMapping{
m := platform.DBRPMapping{
Cluster: tt.fields.Cluster,
Database: tt.fields.Database,
RetentionPolicy: tt.fields.RetentionPolicy,
@ -107,45 +109,10 @@ func TestDBRPMapping_Validate(t *testing.T) {
OrganizationID: tt.fields.OrganizationID,
BucketID: tt.fields.BucketID,
}
if err := m.Validate(); (err != nil) != tt.wantErr {
t.Errorf("DBRPMapping.Validate() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}
func Test_validName(t *testing.T) {
tests := []struct {
arg string
name string
want bool
}{
{
name: "names cannot have unprintable characters",
arg: string([]byte{0x0D}),
want: false,
},
{
name: "names cannot have .",
arg: ".",
want: false,
},
{
name: "names cannot have ..",
arg: "..",
want: false,
},
{
name: "names cannot have /",
arg: "/",
want: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := validName(tt.arg); got != tt.want {
t.Errorf("validName() = %v, want %v", got, tt.want)
}
})
}
}

View File

@ -155,10 +155,11 @@ func decodeGetAuthorizationsRequest(ctx context.Context, r *http.Request) (*getA
userID := qp.Get("userID")
if userID != "" {
req.filter.UserID = &platform.ID{}
if err := req.filter.UserID.DecodeFromString(userID); err != nil {
id, err := platform.IDFromString(userID)
if err != nil {
return nil, err
}
req.filter.UserID = id
}
user := qp.Get("user")
@ -168,10 +169,11 @@ func decodeGetAuthorizationsRequest(ctx context.Context, r *http.Request) (*getA
authID := qp.Get("id")
if authID != "" {
req.filter.ID = &platform.ID{}
if err := req.filter.ID.DecodeFromString(authID); err != nil {
id, err := platform.IDFromString(authID)
if err != nil {
return nil, err
}
req.filter.ID = id
}
return req, nil

View File

@ -348,10 +348,11 @@ func decodeGetBucketsRequest(ctx context.Context, r *http.Request) (*getBucketsR
req := &getBucketsRequest{}
if id := qp.Get("orgID"); id != "" {
req.filter.OrganizationID = &platform.ID{}
if err := req.filter.OrganizationID.DecodeFromString(id); err != nil {
temp, err := platform.IDFromString(id)
if err != nil {
return nil, err
}
req.filter.OrganizationID = temp
}
if org := qp.Get("org"); org != "" {
@ -359,10 +360,11 @@ func decodeGetBucketsRequest(ctx context.Context, r *http.Request) (*getBucketsR
}
if id := qp.Get("id"); id != "" {
req.filter.ID = &platform.ID{}
if err := req.filter.ID.DecodeFromString(id); err != nil {
temp, err := platform.IDFromString(id)
if err != nil {
return nil, err
}
req.filter.ID = temp
}
if name := qp.Get("name"); name != "" {

View File

@ -210,10 +210,11 @@ func decodeGetOrgsRequest(ctx context.Context, r *http.Request) (*getOrgsRequest
req := &getOrgsRequest{}
if id := qp.Get("id"); id != "" {
req.filter.ID = &platform.ID{}
if err := req.filter.ID.DecodeFromString(id); err != nil {
temp, err := platform.IDFromString(id)
if err != nil {
return nil, err
}
req.filter.ID = temp
}
if name := qp.Get("name"); name != "" {

View File

@ -100,24 +100,27 @@ func decodeGetTasksRequest(ctx context.Context, r *http.Request) (*getTasksReque
req := &getTasksRequest{}
if id := qp.Get("after"); id != "" {
req.filter.After = &platform.ID{}
if err := req.filter.After.DecodeFromString(id); err != nil {
temp, err := platform.IDFromString(id)
if err != nil {
return nil, err
}
req.filter.After = temp
}
if id := qp.Get("organization"); id != "" {
req.filter.Organization = &platform.ID{}
if err := req.filter.Organization.DecodeFromString(id); err != nil {
temp, err := platform.IDFromString(id)
if err != nil {
return nil, err
}
req.filter.Organization = temp
}
if id := qp.Get("user"); id != "" {
req.filter.User = &platform.ID{}
if err := req.filter.User.DecodeFromString(id); err != nil {
userID, err := platform.IDFromString(id)
if err != nil {
return nil, err
}
req.filter.User = userID
}
return req, nil
@ -337,10 +340,11 @@ func decodeGetLogsRequest(ctx context.Context, r *http.Request, orgs platform.Or
}
req := &getLogsRequest{}
req.filter.Task = &platform.ID{}
if err := req.filter.Task.DecodeFromString(id); err != nil {
taskID, err := platform.IDFromString(id)
if err != nil {
return nil, err
}
req.filter.Task = taskID
qp := r.URL.Query()
@ -354,10 +358,11 @@ func decodeGetLogsRequest(ctx context.Context, r *http.Request, orgs platform.Or
}
if id := params.ByName("rid"); id != "" {
req.filter.Run = &platform.ID{}
if err := req.filter.Run.DecodeFromString(id); err != nil {
temp, err := platform.IDFromString(id)
if err != nil {
return nil, err
}
req.filter.Run = temp
}
return req, nil
@ -409,10 +414,11 @@ func decodeGetRunsRequest(ctx context.Context, r *http.Request, orgs platform.Or
}
req := &getRunsRequest{}
req.filter.Task = &platform.ID{}
if err := req.filter.Task.DecodeFromString(id); err != nil {
taskID, err := platform.IDFromString(id)
if err != nil {
return nil, err
}
req.filter.Task = taskID
qp := r.URL.Query()
@ -426,10 +432,11 @@ func decodeGetRunsRequest(ctx context.Context, r *http.Request, orgs platform.Or
}
if id := qp.Get("after"); id != "" {
req.filter.After = &platform.ID{}
if err := req.filter.After.DecodeFromString(id); err != nil {
afterID, err := platform.IDFromString(id)
if err != nil {
return nil, err
}
req.filter.After = afterID
}
if limit := qp.Get("limit"); limit != "" {

View File

@ -257,10 +257,11 @@ func decodeGetUsersRequest(ctx context.Context, r *http.Request) (*getUsersReque
req := &getUsersRequest{}
if id := qp.Get("id"); id != "" {
req.filter.ID = &platform.ID{}
if err := req.filter.ID.DecodeFromString(id); err != nil {
temp, err := platform.IDFromString(id)
if err != nil {
return nil, err
}
req.filter.ID = temp
}
if name := qp.Get("name"); name != "" {

75
id.go
View File

@ -1,12 +1,25 @@
package platform
import (
"encoding/binary"
"encoding/hex"
"encoding/json"
"errors"
)
// IDStringLength is the exact length a string (or a byte slice representing it) must have in order to be decoded into a valid ID.
const IDStringLength = 16
// ErrInvalidID is the error thrown to notify invalid IDs.
var ErrInvalidID = errors.New("invalid ID")
// ErrInvalidIDLength is the error thrown to notify input does not match the wanted length.
var ErrInvalidIDLength = errors.New("input must be an array of 16 bytes")
// ID is a unique identifier.
type ID []byte
//
// Its zero value is not a valid ID.
type ID uint64
// IDGenerator represents a generator for IDs.
type IDGenerator interface {
@ -14,10 +27,12 @@ type IDGenerator interface {
ID() ID
}
// IDFromString creates an ID from a given string
func IDFromString(idstr string) (*ID, error) {
// IDFromString creates an ID from a given string.
//
// It errors if the input string does not match a valid ID.
func IDFromString(str string) (*ID, error) {
var id ID
err := id.DecodeFromString(idstr)
err := id.DecodeFromString(str)
if err != nil {
return nil, err
}
@ -25,13 +40,25 @@ func IDFromString(idstr string) (*ID, error) {
}
// Decode parses b as a hex-encoded byte-slice-string.
//
// It errors if the input byte slice does not have the correct length
// or if it contains all zeros.
func (i *ID) Decode(b []byte) error {
dst := make([]byte, hex.DecodedLen(len(b)))
if len(b) != IDStringLength {
return ErrInvalidIDLength
}
dst := make([]byte, hex.DecodedLen(IDStringLength))
_, err := hex.Decode(dst, b)
if err != nil {
return err
}
*i = dst
*i = ID(binary.BigEndian.Uint64(dst))
if !i.Valid() {
return ErrInvalidID
}
return nil
}
@ -41,15 +68,32 @@ func (i *ID) DecodeFromString(s string) error {
}
// Encode converts ID to a hex-encoded byte-slice-string.
func (i ID) Encode() []byte {
dst := make([]byte, hex.EncodedLen(len(i)))
hex.Encode(dst, i)
return dst
//
// It errors if the receiving ID holds its zero value.
func (i ID) Encode() ([]byte, error) {
if !i.Valid() {
return nil, ErrInvalidID
}
b := make([]byte, hex.DecodedLen(IDStringLength))
binary.BigEndian.PutUint64(b, uint64(i))
dst := make([]byte, hex.EncodedLen(len(b)))
hex.Encode(dst, b)
return dst, nil
}
// String returns the ID as a hex encoded string
// Valid checks whether the receiving ID is a valid one or not.
func (i ID) Valid() bool {
return i != 0
}
// String returns the ID as a hex encoded string.
//
// Returns an empty string in the case the ID is invalid.
func (i ID) String() string {
return string(i.Encode())
enc, _ := i.Encode()
return string(enc)
}
// UnmarshalJSON implements JSON unmarshaller for IDs.
@ -60,6 +104,9 @@ func (i *ID) UnmarshalJSON(b []byte) error {
// MarshalJSON implements JSON marshaller for IDs.
func (i ID) MarshalJSON() ([]byte, error) {
id := i.Encode()
return json.Marshal(string(id[:]))
enc, err := i.Encode()
if err != nil {
return nil, err
}
return json.Marshal(string(enc))
}

View File

@ -1,38 +1,190 @@
package platform
package platform_test
import (
"bytes"
"encoding/json"
"reflect"
"testing"
"github.com/influxdata/platform"
platformtesting "github.com/influxdata/platform/testing"
)
func TestIDFromString(t *testing.T) {
tests := []struct {
name string
idstr string
want *ID
id string
want platform.ID
wantErr bool
err string
}{
{
name: "Is able to decode an id",
idstr: "020f755c3c082000",
want: &ID{0x02, 0x0f, 0x75, 0x5c, 0x3c, 0x08, 0x20, 0x00},
name: "Should be able to decode an all zeros ID",
id: "0000000000000000",
wantErr: true,
err: platform.ErrInvalidID.Error(),
},
{
name: "It should not be able to decode an id that's not hex",
idstr: "gggggggggggggg",
name: "Should be able to decode an all f ID",
id: "ffffffffffffffff",
want: platformtesting.MustIDFromString("ffffffffffffffff"),
},
{
name: "Should be able to decode an ID",
id: "020f755c3c082000",
want: platformtesting.MustIDFromString("020f755c3c082000"),
},
{
name: "Should not be able to decode a non hex ID",
id: "gggggggggggggggg",
wantErr: true,
err: "encoding/hex: invalid byte: U+0067 'g'",
},
{
name: "Should not be able to decode inputs with length less than 16 bytes",
id: "abc",
wantErr: true,
err: platform.ErrInvalidIDLength.Error(),
},
{
name: "Should not be able to decode inputs with length greater than 16 bytes",
id: "abcdabcdabcdabcd0",
wantErr: true,
err: platform.ErrInvalidIDLength.Error(),
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := IDFromString(tt.idstr)
if (err != nil) != tt.wantErr {
t.Errorf("IDFromString() error = %v, wantErr %v", err, tt.wantErr)
got, err := platform.IDFromString(tt.id)
// Check negative test cases
if (err != nil) && tt.wantErr {
if tt.err != err.Error() {
t.Errorf("IDFromString() errors out \"%s\", want \"%s\"", err, tt.err)
}
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("IDFromString() = %v, want %v", got, tt.want)
// Check positive test cases
if !reflect.DeepEqual(*got, tt.want) && !tt.wantErr {
t.Errorf("IDFromString() outputs %v, want %v", got, tt.want)
}
})
}
}
func TestDecodeFromString(t *testing.T) {
var id platform.ID
err := id.DecodeFromString("020f755c3c082000")
if err != nil {
t.Errorf(err.Error())
}
want := []byte{48, 50, 48, 102, 55, 53, 53, 99, 51, 99, 48, 56, 50, 48, 48, 48}
got, _ := id.Encode()
if !bytes.Equal(want, got) {
t.Errorf("got ID not equal to wanted ID")
}
if id.String() != "020f755c3c082000" {
t.Errorf("expecting string representation to contain the right value")
}
if !id.Valid() {
t.Errorf("expecting ID to be a valid one")
}
}
func TestEncode(t *testing.T) {
var id platform.ID
if _, err := id.Encode(); err == nil {
t.Errorf("encoding an invalid ID should not be possible")
}
id.DecodeFromString("5ca1ab1eba5eba11")
want := []byte{53, 99, 97, 49, 97, 98, 49, 101, 98, 97, 53, 101, 98, 97, 49, 49}
got, _ := id.Encode()
if !bytes.Equal(want, got) {
t.Errorf("encoding error")
}
if id.String() != "5ca1ab1eba5eba11" {
t.Errorf("expecting string representation to contain the right value")
}
if !id.Valid() {
t.Errorf("expecting ID to be a valid one")
}
}
func TestDecodeFromAllZeros(t *testing.T) {
var id platform.ID
err := id.Decode(make([]byte, platform.IDStringLength))
if err == nil {
t.Errorf("expecting all zeros ID to not be a valid ID")
}
}
func TestDecodeFromShorterString(t *testing.T) {
var id platform.ID
err := id.DecodeFromString("020f75")
if err == nil {
t.Errorf("expecting shorter inputs to error")
}
if id.String() != "" {
t.Errorf("expecting invalid ID to be serialized into empty string")
}
}
func TestDecodeFromLongerString(t *testing.T) {
var id platform.ID
err := id.DecodeFromString("020f755c3c082000aaa")
if err == nil {
t.Errorf("expecting shorter inputs to error")
}
if id.String() != "" {
t.Errorf("expecting invalid ID to be serialized into empty string")
}
}
func TestDecodeFromEmptyString(t *testing.T) {
var id platform.ID
err := id.DecodeFromString("")
if err == nil {
t.Errorf("expecting empty inputs to error")
}
if id.String() != "" {
t.Errorf("expecting invalid ID to be serialized into empty string")
}
}
func TestMarshalling(t *testing.T) {
var id0 platform.ID
_, err := json.Marshal(id0)
if err == nil {
t.Errorf("expecting empty ID to not be a valid one")
}
init := "ca55e77eca55e77e"
id1, err := platform.IDFromString(init)
if err != nil {
t.Errorf(err.Error())
}
serialized, err := json.Marshal(id1)
if err != nil {
t.Errorf(err.Error())
}
var id2 platform.ID
json.Unmarshal(serialized, &id2)
bytes1, _ := id1.Encode()
bytes2, _ := id2.Encode()
if !bytes.Equal(bytes1, bytes2) {
t.Errorf("error marshalling/unmarshalling ID")
}
}
func TestValid(t *testing.T) {
var id platform.ID
if id.Valid() {
t.Errorf("expecting initial ID to be invalid")
}
}

View File

@ -2,7 +2,7 @@ package platform
import "context"
// Organization is a organization. 🎉
// Organization is an organization. 🎉
type Organization struct {
ID ID `json:"id"`
Name string `json:"name"`

View File

@ -51,7 +51,7 @@ func TestAuthorizationService_Metrics(t *testing.T) {
reg.MustRegister(svc.PrometheusCollectors()...)
ctx := context.Background()
id := platform.ID{1}
id := platform.ID(1)
if _, err := svc.FindAuthorizationByID(ctx, id); err != nil {
t.Fatal(err)
@ -89,7 +89,8 @@ func TestAuthorizationService_Metrics(t *testing.T) {
t.Fatalf("exp 1 request, got %v", got)
}
if err := svc.DeleteAuthorization(ctx, nil); err != nil {
var tempID platform.ID
if err := svc.DeleteAuthorization(ctx, tempID); err != nil {
t.Fatal(err)
}
mfs = promtest.MustGather(t, reg)
@ -137,7 +138,7 @@ func TestAuthorizationService_Metrics(t *testing.T) {
t.Fatalf("exp 1 request, got %v", got)
}
if err := svc.DeleteAuthorization(ctx, nil); err != forced {
if err := svc.DeleteAuthorization(ctx, tempID); err != forced {
t.Fatalf("expected forced error, got %v", err)
}
mfs = promtest.MustGather(t, reg)

View File

@ -0,0 +1,450 @@
package execute_test
import (
"sort"
"testing"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
"github.com/influxdata/platform/query"
"github.com/influxdata/platform/query/execute"
"github.com/influxdata/platform/query/execute/executetest"
"github.com/influxdata/platform/query/functions"
)
func TestAggregate_Process(t *testing.T) {
sumAgg := new(functions.SumAgg)
countAgg := new(functions.CountAgg)
testCases := []struct {
name string
agg execute.Aggregate
config execute.AggregateConfig
data []*executetest.Table
want []*executetest.Table
}{
{
name: "single",
config: execute.DefaultAggregateConfig,
agg: sumAgg,
data: []*executetest.Table{{
KeyCols: []string{"_start", "_stop"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "_time", Type: query.TTime},
{Label: "_value", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(0), execute.Time(100), execute.Time(0), 0.0},
{execute.Time(0), execute.Time(100), execute.Time(10), 1.0},
{execute.Time(0), execute.Time(100), execute.Time(20), 2.0},
{execute.Time(0), execute.Time(100), execute.Time(30), 3.0},
{execute.Time(0), execute.Time(100), execute.Time(40), 4.0},
{execute.Time(0), execute.Time(100), execute.Time(50), 5.0},
{execute.Time(0), execute.Time(100), execute.Time(60), 6.0},
{execute.Time(0), execute.Time(100), execute.Time(70), 7.0},
{execute.Time(0), execute.Time(100), execute.Time(80), 8.0},
{execute.Time(0), execute.Time(100), execute.Time(90), 9.0},
},
}},
want: []*executetest.Table{{
KeyCols: []string{"_start", "_stop"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "_time", Type: query.TTime},
{Label: "_value", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(0), execute.Time(100), execute.Time(100), 45.0},
},
}},
},
{
name: "single use start time",
config: execute.AggregateConfig{
Columns: []string{execute.DefaultValueColLabel},
TimeSrc: execute.DefaultStartColLabel,
TimeDst: execute.DefaultTimeColLabel,
},
agg: sumAgg,
data: []*executetest.Table{{
KeyCols: []string{"_start", "_stop"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "_time", Type: query.TTime},
{Label: "_value", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(0), execute.Time(100), execute.Time(0), 0.0},
{execute.Time(0), execute.Time(100), execute.Time(10), 1.0},
{execute.Time(0), execute.Time(100), execute.Time(20), 2.0},
{execute.Time(0), execute.Time(100), execute.Time(30), 3.0},
{execute.Time(0), execute.Time(100), execute.Time(40), 4.0},
{execute.Time(0), execute.Time(100), execute.Time(50), 5.0},
{execute.Time(0), execute.Time(100), execute.Time(60), 6.0},
{execute.Time(0), execute.Time(100), execute.Time(70), 7.0},
{execute.Time(0), execute.Time(100), execute.Time(80), 8.0},
{execute.Time(0), execute.Time(100), execute.Time(90), 9.0},
},
}},
want: []*executetest.Table{{
KeyCols: []string{"_start", "_stop"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "_time", Type: query.TTime},
{Label: "_value", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(0), execute.Time(100), execute.Time(0), 45.0},
},
}},
},
{
name: "multiple tables",
config: execute.DefaultAggregateConfig,
agg: sumAgg,
data: []*executetest.Table{
{
KeyCols: []string{"_start", "_stop"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "_time", Type: query.TTime},
{Label: "_value", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(0), execute.Time(100), execute.Time(0), 0.0},
{execute.Time(0), execute.Time(100), execute.Time(10), 1.0},
{execute.Time(0), execute.Time(100), execute.Time(20), 2.0},
{execute.Time(0), execute.Time(100), execute.Time(30), 3.0},
{execute.Time(0), execute.Time(100), execute.Time(40), 4.0},
{execute.Time(0), execute.Time(100), execute.Time(50), 5.0},
{execute.Time(0), execute.Time(100), execute.Time(60), 6.0},
{execute.Time(0), execute.Time(100), execute.Time(70), 7.0},
{execute.Time(0), execute.Time(100), execute.Time(80), 8.0},
{execute.Time(0), execute.Time(100), execute.Time(90), 9.0},
},
},
{
KeyCols: []string{"_start", "_stop"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "_time", Type: query.TTime},
{Label: "_value", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(100), execute.Time(200), execute.Time(100), 10.0},
{execute.Time(100), execute.Time(200), execute.Time(110), 11.0},
{execute.Time(100), execute.Time(200), execute.Time(120), 12.0},
{execute.Time(100), execute.Time(200), execute.Time(130), 13.0},
{execute.Time(100), execute.Time(200), execute.Time(140), 14.0},
{execute.Time(100), execute.Time(200), execute.Time(150), 15.0},
{execute.Time(100), execute.Time(200), execute.Time(160), 16.0},
{execute.Time(100), execute.Time(200), execute.Time(170), 17.0},
{execute.Time(100), execute.Time(200), execute.Time(180), 18.0},
{execute.Time(100), execute.Time(200), execute.Time(190), 19.0},
},
},
},
want: []*executetest.Table{
{
KeyCols: []string{"_start", "_stop"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "_time", Type: query.TTime},
{Label: "_value", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(0), execute.Time(100), execute.Time(100), 45.0},
},
},
{
KeyCols: []string{"_start", "_stop"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "_time", Type: query.TTime},
{Label: "_value", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(100), execute.Time(200), execute.Time(200), 145.0},
},
},
},
},
{
name: "multiple tables with keyed columns",
config: execute.DefaultAggregateConfig,
agg: sumAgg,
data: []*executetest.Table{
{
KeyCols: []string{"_start", "_stop", "t1"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "t1", Type: query.TString},
{Label: "_time", Type: query.TTime},
{Label: "_value", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(0), execute.Time(100), "a", execute.Time(0), 0.0},
{execute.Time(0), execute.Time(100), "a", execute.Time(10), 1.0},
{execute.Time(0), execute.Time(100), "a", execute.Time(20), 2.0},
{execute.Time(0), execute.Time(100), "a", execute.Time(30), 3.0},
{execute.Time(0), execute.Time(100), "a", execute.Time(40), 4.0},
{execute.Time(0), execute.Time(100), "a", execute.Time(50), 5.0},
{execute.Time(0), execute.Time(100), "a", execute.Time(60), 6.0},
{execute.Time(0), execute.Time(100), "a", execute.Time(70), 7.0},
{execute.Time(0), execute.Time(100), "a", execute.Time(80), 8.0},
{execute.Time(0), execute.Time(100), "a", execute.Time(90), 9.0},
},
},
{
KeyCols: []string{"_start", "_stop", "t1"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "t1", Type: query.TString},
{Label: "_time", Type: query.TTime},
{Label: "_value", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(0), execute.Time(100), "b", execute.Time(0), 0.3},
{execute.Time(0), execute.Time(100), "b", execute.Time(10), 1.3},
{execute.Time(0), execute.Time(100), "b", execute.Time(20), 2.3},
{execute.Time(0), execute.Time(100), "b", execute.Time(30), 3.3},
{execute.Time(0), execute.Time(100), "b", execute.Time(40), 4.3},
{execute.Time(0), execute.Time(100), "b", execute.Time(50), 5.3},
{execute.Time(0), execute.Time(100), "b", execute.Time(60), 6.3},
{execute.Time(0), execute.Time(100), "b", execute.Time(70), 7.3},
{execute.Time(0), execute.Time(100), "b", execute.Time(80), 8.3},
{execute.Time(0), execute.Time(100), "b", execute.Time(90), 9.3},
},
},
{
KeyCols: []string{"_start", "_stop", "t1"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "t1", Type: query.TString},
{Label: "_time", Type: query.TTime},
{Label: "_value", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(100), execute.Time(200), "a", execute.Time(100), 10.0},
{execute.Time(100), execute.Time(200), "a", execute.Time(110), 11.0},
{execute.Time(100), execute.Time(200), "a", execute.Time(120), 12.0},
{execute.Time(100), execute.Time(200), "a", execute.Time(130), 13.0},
{execute.Time(100), execute.Time(200), "a", execute.Time(140), 14.0},
{execute.Time(100), execute.Time(200), "a", execute.Time(150), 15.0},
{execute.Time(100), execute.Time(200), "a", execute.Time(160), 16.0},
{execute.Time(100), execute.Time(200), "a", execute.Time(170), 17.0},
{execute.Time(100), execute.Time(200), "a", execute.Time(180), 18.0},
{execute.Time(100), execute.Time(200), "a", execute.Time(190), 19.0},
},
},
{
KeyCols: []string{"_start", "_stop", "t1"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "t1", Type: query.TString},
{Label: "_time", Type: query.TTime},
{Label: "_value", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(100), execute.Time(200), "b", execute.Time(100), 10.3},
{execute.Time(100), execute.Time(200), "b", execute.Time(110), 11.3},
{execute.Time(100), execute.Time(200), "b", execute.Time(120), 12.3},
{execute.Time(100), execute.Time(200), "b", execute.Time(130), 13.3},
{execute.Time(100), execute.Time(200), "b", execute.Time(140), 14.3},
{execute.Time(100), execute.Time(200), "b", execute.Time(150), 15.3},
{execute.Time(100), execute.Time(200), "b", execute.Time(160), 16.3},
{execute.Time(100), execute.Time(200), "b", execute.Time(170), 17.3},
{execute.Time(100), execute.Time(200), "b", execute.Time(180), 18.3},
{execute.Time(100), execute.Time(200), "b", execute.Time(190), 19.3},
},
},
},
want: []*executetest.Table{
{
KeyCols: []string{"_start", "_stop", "t1"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "t1", Type: query.TString},
{Label: "_time", Type: query.TTime},
{Label: "_value", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(0), execute.Time(100), "a", execute.Time(100), 45.0},
},
},
{
KeyCols: []string{"_start", "_stop", "t1"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "t1", Type: query.TString},
{Label: "_time", Type: query.TTime},
{Label: "_value", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(100), execute.Time(200), "a", execute.Time(200), 145.0},
},
},
{
KeyCols: []string{"_start", "_stop", "t1"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "t1", Type: query.TString},
{Label: "_time", Type: query.TTime},
{Label: "_value", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(0), execute.Time(100), "b", execute.Time(100), 48.0},
},
},
{
KeyCols: []string{"_start", "_stop", "t1"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "t1", Type: query.TString},
{Label: "_time", Type: query.TTime},
{Label: "_value", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(100), execute.Time(200), "b", execute.Time(200), 148.0},
},
},
},
},
{
name: "multiple values",
config: execute.AggregateConfig{
Columns: []string{"x", "y"},
TimeSrc: execute.DefaultStopColLabel,
TimeDst: execute.DefaultTimeColLabel,
},
agg: sumAgg,
data: []*executetest.Table{{
KeyCols: []string{"_start", "_stop"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "_time", Type: query.TTime},
{Label: "x", Type: query.TFloat},
{Label: "y", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(0), execute.Time(100), execute.Time(0), 0.0, 0.0},
{execute.Time(0), execute.Time(100), execute.Time(10), 1.0, -1.0},
{execute.Time(0), execute.Time(100), execute.Time(20), 2.0, -2.0},
{execute.Time(0), execute.Time(100), execute.Time(30), 3.0, -3.0},
{execute.Time(0), execute.Time(100), execute.Time(40), 4.0, -4.0},
{execute.Time(0), execute.Time(100), execute.Time(50), 5.0, -5.0},
{execute.Time(0), execute.Time(100), execute.Time(60), 6.0, -6.0},
{execute.Time(0), execute.Time(100), execute.Time(70), 7.0, -7.0},
{execute.Time(0), execute.Time(100), execute.Time(80), 8.0, -8.0},
{execute.Time(0), execute.Time(100), execute.Time(90), 9.0, -9.0},
},
}},
want: []*executetest.Table{{
KeyCols: []string{"_start", "_stop"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "_time", Type: query.TTime},
{Label: "x", Type: query.TFloat},
{Label: "y", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(0), execute.Time(100), execute.Time(100), 45.0, -45.0},
},
}},
},
{
name: "multiple values changing types",
config: execute.AggregateConfig{
Columns: []string{"x", "y"},
TimeSrc: execute.DefaultStopColLabel,
TimeDst: execute.DefaultTimeColLabel,
},
agg: countAgg,
data: []*executetest.Table{{
KeyCols: []string{"_start", "_stop"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "_time", Type: query.TTime},
{Label: "x", Type: query.TFloat},
{Label: "y", Type: query.TFloat},
},
Data: [][]interface{}{
{execute.Time(0), execute.Time(100), execute.Time(0), 0.0, 0.0},
{execute.Time(0), execute.Time(100), execute.Time(10), 1.0, -1.0},
{execute.Time(0), execute.Time(100), execute.Time(20), 2.0, -2.0},
{execute.Time(0), execute.Time(100), execute.Time(30), 3.0, -3.0},
{execute.Time(0), execute.Time(100), execute.Time(40), 4.0, -4.0},
{execute.Time(0), execute.Time(100), execute.Time(50), 5.0, -5.0},
{execute.Time(0), execute.Time(100), execute.Time(60), 6.0, -6.0},
{execute.Time(0), execute.Time(100), execute.Time(70), 7.0, -7.0},
{execute.Time(0), execute.Time(100), execute.Time(80), 8.0, -8.0},
{execute.Time(0), execute.Time(100), execute.Time(90), 9.0, -9.0},
},
}},
want: []*executetest.Table{{
KeyCols: []string{"_start", "_stop"},
ColMeta: []query.ColMeta{
{Label: "_start", Type: query.TTime},
{Label: "_stop", Type: query.TTime},
{Label: "_time", Type: query.TTime},
{Label: "x", Type: query.TInt},
{Label: "y", Type: query.TInt},
},
Data: [][]interface{}{
{execute.Time(0), execute.Time(100), execute.Time(100), int64(10), int64(10)},
},
}},
},
}
for _, tc := range testCases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
d := executetest.NewDataset(executetest.RandomDatasetID())
c := execute.NewTableBuilderCache(executetest.UnlimitedAllocator)
c.SetTriggerSpec(execute.DefaultTriggerSpec)
agg := execute.NewAggregateTransformation(d, c, tc.agg, tc.config)
parentID := executetest.RandomDatasetID()
for _, b := range tc.data {
if err := agg.Process(parentID, b); err != nil {
t.Fatal(err)
}
}
got, err := executetest.TablesFromCache(c)
if err != nil {
t.Fatal(err)
}
executetest.NormalizeTables(got)
executetest.NormalizeTables(tc.want)
sort.Sort(executetest.SortedTables(got))
sort.Sort(executetest.SortedTables(tc.want))
if !cmp.Equal(tc.want, got, cmpopts.EquateNaNs()) {
t.Errorf("unexpected tables -want/+got\n%s", cmp.Diff(tc.want, got))
}
})
}
}

View File

@ -16,6 +16,8 @@ import (
"github.com/influxdata/platform"
"github.com/influxdata/platform/mock"
"github.com/influxdata/platform/query/influxql"
"github.com/influxdata/platform/query/semantic/semantictest"
platformtesting "github.com/influxdata/platform/testing"
"github.com/google/go-cmp/cmp"
"golang.org/x/text/unicode/norm"
@ -92,15 +94,13 @@ func main() {
var dbrpMappingSvc = mock.NewDBRPMappingService()
func init() {
organizationID := platform.ID("aaaa")
bucketID := platform.ID("bbbb")
mapping := platform.DBRPMapping{
Cluster: "cluster",
Database: "db",
RetentionPolicy: "rp",
Default: true,
OrganizationID: organizationID,
BucketID: bucketID,
OrganizationID: platformtesting.MustIDFromString("aaaaaaaaaaaaaaaa"),
BucketID: platformtesting.MustIDFromString("bbbbbbbbbbbbbbbb"),
}
dbrpMappingSvc.FindByFn = func(ctx context.Context, cluster string, db string, rp string) (*platform.DBRPMapping, error) {
return &mapping, nil

View File

@ -17,6 +17,8 @@ import (
"github.com/influxdata/platform/query"
_ "github.com/influxdata/platform/query/builtin"
"github.com/influxdata/platform/query/influxql"
"github.com/influxdata/platform/query/querytest"
platformtesting "github.com/influxdata/platform/testing"
"github.com/andreyvit/diff"
)
@ -29,8 +31,8 @@ func init() {
Database: "db0",
RetentionPolicy: "autogen",
Default: true,
OrganizationID: platform.ID("org"),
BucketID: platform.ID("bucket"),
OrganizationID: platformtesting.MustIDFromString("cadecadecadecade"),
BucketID: platformtesting.MustIDFromString("da7aba5e5eedca5e"),
}
dbrpMappingSvc.FindByFn = func(ctx context.Context, cluster string, db string, rp string) (*platform.DBRPMapping, error) {
return &mapping, nil

View File

@ -14,12 +14,13 @@ import (
"github.com/influxdata/platform"
"github.com/influxdata/platform/mock"
"github.com/influxdata/platform/query/influxql"
platformtesting "github.com/influxdata/platform/testing"
)
var dbrpMappingSvc = mock.NewDBRPMappingService()
var organizationID = platform.ID("aaaa")
var bucketID = platform.ID("bbbb")
var altBucketID = platform.ID("cccc")
var organizationID platform.ID
var bucketID platform.ID
var altBucketID platform.ID
func init() {
mapping := platform.DBRPMapping{
@ -83,6 +84,10 @@ func NewFixture(stmt string, spec *flux.Spec) Fixture {
}
func (f *fixture) Run(t *testing.T) {
organizationID = platformtesting.MustIDFromString("aaaaaaaaaaaaaaaa")
bucketID = platformtesting.MustIDFromString("bbbbbbbbbbbbbbbb")
altBucketID = platformtesting.MustIDFromString("cccccccccccccccc")
t.Run(f.stmt, func(t *testing.T) {
if err := f.spec.Validate(); err != nil {
t.Fatalf("%s:%d: expected spec is not valid: %s", f.file, f.line, err)

View File

@ -9,6 +9,7 @@ import (
"github.com/influxdata/platform/mock"
"github.com/influxdata/platform/query/influxql"
"github.com/influxdata/platform/query/influxql/spectests"
platformtesting "github.com/influxdata/platform/testing"
"github.com/pkg/errors"
)
@ -20,8 +21,8 @@ func init() {
Database: "db0",
RetentionPolicy: "autogen",
Default: true,
OrganizationID: platform.ID("aaaa"),
BucketID: platform.ID("bbbb"),
OrganizationID: platformtesting.MustIDFromString("aaaaaaaaaaaaaaaa"),
BucketID: platformtesting.MustIDFromString("bbbbbbbbbbbbbbbb"),
}
dbrpMappingSvc.FindByFn = func(ctx context.Context, cluster string, db string, rp string) (*platform.DBRPMapping, error) {
return &mapping, nil

View File

@ -1,7 +1,6 @@
package snowflake
import (
"encoding/binary"
"errors"
"math/rand"
"sync"
@ -57,7 +56,7 @@ func NewDefaultIDGenerator() *IDGenerator {
return NewIDGenerator()
}
// IDGenerator generates a new ID.
// IDGenerator holds the ID generator.
type IDGenerator struct {
Generator *snowflake.Generator
}
@ -87,8 +86,12 @@ func NewIDGenerator(opts ...IDGeneratorOp) *IDGenerator {
// ID returns the next platform.ID from an IDGenerator.
func (g *IDGenerator) ID() platform.ID {
id := make(platform.ID, 8)
i := g.Generator.Next()
binary.BigEndian.PutUint64(id, i)
var id platform.ID
for {
id = platform.ID(g.Generator.Next())
if id.Valid() {
break
}
}
return id
}

View File

@ -1,16 +1,19 @@
package snowflake
import (
"bytes"
"testing"
"github.com/influxdata/platform"
)
func TestIDLength(t *testing.T) {
func TestIDStringLength(t *testing.T) {
gen := NewIDGenerator()
id := gen.ID()
if len(id) != 8 {
if !id.Valid() {
t.Fail()
}
enc, _ := id.Encode()
if len(enc) != platform.IDStringLength {
t.Fail()
}
}
@ -21,7 +24,7 @@ func TestToFromString(t *testing.T) {
var clone platform.ID
if err := clone.DecodeFromString(id.String()); err != nil {
t.Error(err)
} else if !bytes.Equal(id, clone) {
} else if id != clone {
t.Errorf("id started as %x but got back %x", id, clone)
}
}

View File

@ -20,6 +20,7 @@ import (
_ "github.com/influxdata/platform/query/builtin"
"github.com/influxdata/platform/task/backend"
"github.com/influxdata/platform/task/backend/executor"
platformtesting "github.com/influxdata/platform/testing"
"go.uber.org/zap"
)
@ -250,13 +251,15 @@ const testScript = `option task = {
from(bucket: "one") |> toHTTP(url: "http://example.com")`
func testExecutorQuerySuccess(t *testing.T, fn createSysFn) {
var orgID = platformtesting.MustIDFromString("aaaaaaaaaaaaaaaa")
var userID = platformtesting.MustIDFromString("baaaaaaaaaaaaaab")
sys := fn()
t.Run(sys.name+"/QuerySuccess", func(t *testing.T) {
tid, err := sys.st.CreateTask(context.Background(), platform.ID("org"), platform.ID("user"), testScript, 0)
tid, err := sys.st.CreateTask(context.Background(), orgID, userID, testScript)
if err != nil {
t.Fatal(err)
}
qr := backend.QueuedRun{TaskID: tid, RunID: platform.ID{1}, Now: 123}
qr := backend.QueuedRun{TaskID: *tid, RunID: platform.ID(1), Now: 123}
rp, err := sys.ex.Execute(context.Background(), qr)
if err != nil {
t.Fatal(err)
@ -300,13 +303,15 @@ func testExecutorQuerySuccess(t *testing.T, fn createSysFn) {
}
func testExecutorQueryFailure(t *testing.T, fn createSysFn) {
var orgID = platformtesting.MustIDFromString("aaaaaaaaaaaaaaaa")
var userID = platformtesting.MustIDFromString("baaaaaaaaaaaaaab")
sys := fn()
t.Run(sys.name+"/QueryFail", func(t *testing.T) {
tid, err := sys.st.CreateTask(context.Background(), platform.ID("org"), platform.ID("user"), testScript, 0)
tid, err := sys.st.CreateTask(context.Background(), orgID, userID, testScript)
if err != nil {
t.Fatal(err)
}
qr := backend.QueuedRun{TaskID: tid, RunID: platform.ID{1}, Now: 123}
qr := backend.QueuedRun{TaskID: *tid, RunID: platform.ID(1), Now: 123}
rp, err := sys.ex.Execute(context.Background(), qr)
if err != nil {
t.Fatal(err)
@ -326,13 +331,15 @@ func testExecutorQueryFailure(t *testing.T, fn createSysFn) {
}
func testExecutorPromiseCancel(t *testing.T, fn createSysFn) {
var orgID = platformtesting.MustIDFromString("aaaaaaaaaaaaaaaa")
var userID = platformtesting.MustIDFromString("baaaaaaaaaaaaaab")
sys := fn()
t.Run(sys.name+"/PromiseCancel", func(t *testing.T) {
tid, err := sys.st.CreateTask(context.Background(), platform.ID("org"), platform.ID("user"), testScript, 0)
tid, err := sys.st.CreateTask(context.Background(), orgID, userID, testScript)
if err != nil {
t.Fatal(err)
}
qr := backend.QueuedRun{TaskID: tid, RunID: platform.ID{1}, Now: 123}
qr := backend.QueuedRun{TaskID: *tid, RunID: platform.ID(1), Now: 123}
rp, err := sys.ex.Execute(context.Background(), qr)
if err != nil {
t.Fatal(err)
@ -351,13 +358,15 @@ func testExecutorPromiseCancel(t *testing.T, fn createSysFn) {
}
func testExecutorServiceError(t *testing.T, fn createSysFn) {
var orgID = platformtesting.MustIDFromString("aaaaaaaaaaaaaaaa")
var userID = platformtesting.MustIDFromString("baaaaaaaaaaaaaab")
sys := fn()
t.Run(sys.name+"/ServiceError", func(t *testing.T) {
tid, err := sys.st.CreateTask(context.Background(), platform.ID("org"), platform.ID("user"), testScript, 0)
tid, err := sys.st.CreateTask(context.Background(), orgID, userID, testScript)
if err != nil {
t.Fatal(err)
}
qr := backend.QueuedRun{TaskID: tid, RunID: platform.ID{1}, Now: 123}
qr := backend.QueuedRun{TaskID: *tid, RunID: platform.ID(1), Now: 123}
var forced = errors.New("forced")
sys.svc.FailNextQuery(forced)

View File

@ -66,7 +66,7 @@ func (s *inmem) CreateTask(_ context.Context, org, user platform.ID, script stri
Delay: int32(o.Delay / time.Second),
}
return id, nil
return &id, nil
}
func (s *inmem) ModifyTask(_ context.Context, id platform.ID, script string) error {
@ -79,7 +79,7 @@ func (s *inmem) ModifyTask(_ context.Context, id platform.ID, script string) err
defer s.mu.Unlock()
for n, t := range s.tasks {
if !bytes.Equal(t.ID, id) {
if t.ID != id {
continue
}
@ -93,7 +93,7 @@ func (s *inmem) ModifyTask(_ context.Context, id platform.ID, script string) err
}
func (s *inmem) ListTasks(_ context.Context, params TaskSearchParams) ([]StoreTask, error) {
if len(params.Org) > 0 && len(params.User) > 0 {
if params.Org.Valid() && params.User.Valid() {
return nil, errors.New("ListTasks: org and user filters are mutually exclusive")
}
@ -124,13 +124,19 @@ func (s *inmem) ListTasks(_ context.Context, params TaskSearchParams) ([]StoreTa
defer s.mu.RUnlock()
for _, t := range s.tasks {
if len(after) > 0 && bytes.Compare(after, t.ID) >= 0 {
taskIDBytes, err := t.ID.Encode()
if err != nil {
return nil, err
}
afterBytes, _ := after.Encode()
if bytes.Compare(afterBytes, taskIDBytes) >= 0 {
continue
}
if len(org) > 0 && !bytes.Equal(org, t.Org) {
if org.Valid() && org != t.Org {
continue
}
if len(user) > 0 && !bytes.Equal(user, t.User) {
if user.Valid() && user != t.User {
continue
}
@ -148,7 +154,7 @@ func (s *inmem) FindTaskByID(_ context.Context, id platform.ID) (*StoreTask, err
defer s.mu.RUnlock()
for _, t := range s.tasks {
if bytes.Equal(t.ID, id) {
if t.ID == id {
// Return a copy of the task.
task := new(StoreTask)
*task = t
@ -230,7 +236,7 @@ func (s *inmem) DeleteTask(_ context.Context, id platform.ID) (deleted bool, err
idx := -1
for i, t := range s.tasks {
if bytes.Equal(t.ID, id) {
if t.ID == id {
idx = i
break
}
@ -317,7 +323,7 @@ func (s *inmem) delete(ctx context.Context, id platform.ID, f func(StoreTask) pl
newTasks := []StoreTask{}
deletingTasks := []platform.ID{}
for i := range s.tasks {
if !bytes.Equal(f(s.tasks[i]), id) {
if f(s.tasks[i]) != id {
newTasks = append(newTasks, s.tasks[i])
} else {
deletingTasks = append(deletingTasks, s.tasks[i].ID)

View File

@ -25,7 +25,7 @@ func TestScheduler_StartScriptOnClaim(t *testing.T) {
defer o.Stop()
task := &backend.StoreTask{
ID: platform.ID{1},
ID: platform.ID(1),
}
meta := &backend.StoreTaskMeta{
MaxConcurrency: 1,
@ -44,7 +44,7 @@ func TestScheduler_StartScriptOnClaim(t *testing.T) {
// For every second, can queue for timestamps 4 and 5.
task = &backend.StoreTask{
ID: platform.ID{2},
ID: platform.ID(2),
}
meta = &backend.StoreTaskMeta{
MaxConcurrency: 99,
@ -99,7 +99,7 @@ func TestScheduler_CreateNextRunOnTick(t *testing.T) {
defer o.Stop()
task := &backend.StoreTask{
ID: platform.ID{1},
ID: platform.ID(1),
}
meta := &backend.StoreTaskMeta{
MaxConcurrency: 2,
@ -169,7 +169,7 @@ func TestScheduler_Release(t *testing.T) {
defer o.Stop()
task := &backend.StoreTask{
ID: platform.ID{1},
ID: platform.ID(1),
}
meta := &backend.StoreTaskMeta{
MaxConcurrency: 99,
@ -205,7 +205,7 @@ func TestScheduler_Queue(t *testing.T) {
defer o.Stop()
task := &backend.StoreTask{
ID: platform.ID{1},
ID: platform.ID(1),
}
meta := &backend.StoreTaskMeta{
MaxConcurrency: 1,
@ -418,7 +418,7 @@ func TestScheduler_Metrics(t *testing.T) {
// Claim a task that starts later.
task := &backend.StoreTask{
ID: platform.ID{1},
ID: platform.ID(1),
}
meta := &backend.StoreTaskMeta{
MaxConcurrency: 99,

View File

@ -256,10 +256,10 @@ func (StoreValidation) CreateArgs(org, user platform.ID, script string) (options
}
}
if len(org) == 0 {
if !org.Valid() {
missing = append(missing, "organization ID")
}
if len(user) == 0 {
if !user.Valid() {
missing = append(missing, "user ID")
}
@ -286,7 +286,7 @@ func (StoreValidation) ModifyArgs(taskID platform.ID, script string) (options.Op
}
}
if len(taskID) == 0 {
if !taskID.Valid() {
missing = append(missing, "task ID")
}

View File

@ -2,7 +2,6 @@
package mock
import (
"bytes"
"context"
"encoding/binary"
"errors"
@ -134,7 +133,7 @@ func (s *Scheduler) ReleaseError(err error) {
type DesiredState struct {
mu sync.Mutex
// Map of stringified task ID to last ID used for run.
runIDs map[string]uint32
runIDs map[string]uint64
// Map of stringified, concatenated task and platform ID, to runs that have been created.
created map[string]backend.QueuedRun
@ -147,7 +146,7 @@ var _ backend.DesiredState = (*DesiredState)(nil)
func NewDesiredState() *DesiredState {
return &DesiredState{
runIDs: make(map[string]uint32),
runIDs: make(map[string]uint64),
created: make(map[string]backend.QueuedRun),
meta: make(map[string]backend.StoreTaskMeta),
}
@ -217,7 +216,7 @@ func (d *DesiredState) CreatedFor(taskID platform.ID) []backend.QueuedRun {
var qrs []backend.QueuedRun
for _, qr := range d.created {
if bytes.Equal(qr.TaskID, taskID) {
if qr.TaskID == taskID {
qrs = append(qrs, qr)
}
}
@ -289,7 +288,7 @@ func (e *Executor) RunningFor(taskID platform.ID) []*RunPromise {
var rps []*RunPromise
for _, rp := range e.running {
if bytes.Equal(rp.Run().TaskID, taskID) {
if rp.Run().TaskID == taskID {
rps = append(rps, rp)
}
}

View File

@ -79,7 +79,7 @@ func (p pAdapter) CreateTask(ctx context.Context, t *platform.Task) error {
if err != nil {
return err
}
t.ID = id
t.ID = *id
t.Every = opts.Every.String()
t.Cron = opts.Cron
@ -172,8 +172,8 @@ func toPlatformTask(t backend.StoreTask) (*platform.Task, error) {
Name: t.Name,
Status: "", // TODO: set and update status
Owner: platform.User{
ID: append([]byte(nil), t.User...), // Copy just in case.
Name: "", // TODO(mr): how to get owner name?
ID: t.User,
Name: "", // TODO(mr): how to get owner name?
},
Flux: t.Script,
Cron: opts.Cron,

View File

@ -110,7 +110,7 @@ func CreateAuthorization(
Users: []*platform.User{
{
Name: "cooluser",
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
},
},
},
@ -126,8 +126,8 @@ func CreateAuthorization(
wants: wants{
authorizations: []*platform.Authorization{
{
ID: idFromString(t, authOneID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authOneID),
UserID: MustIDFromString(userOneID),
Token: "rand",
Status: platform.Active,
User: "cooluser",
@ -151,17 +151,17 @@ func CreateAuthorization(
Users: []*platform.User{
{
Name: "cooluser",
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
},
{
Name: "regularuser",
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
},
},
Authorizations: []*platform.Authorization{
{
ID: idFromString(t, authOneID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authOneID),
UserID: MustIDFromString(userOneID),
Token: "supersecret",
Permissions: []platform.Permission{
platform.CreateUserPermission,
@ -181,8 +181,8 @@ func CreateAuthorization(
wants: wants{
authorizations: []*platform.Authorization{
{
ID: idFromString(t, authOneID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authOneID),
UserID: MustIDFromString(userOneID),
User: "cooluser",
Status: platform.Active,
Token: "supersecret",
@ -192,9 +192,8 @@ func CreateAuthorization(
},
},
{
ID: idFromString(t, authTwoID),
UserID: idFromString(t, userTwoID),
Status: platform.Active,
ID: MustIDFromString(authTwoID),
UserID: MustIDFromString(userTwoID),
User: "regularuser",
Token: "rand",
Permissions: []platform.Permission{
@ -221,7 +220,9 @@ func CreateAuthorization(
t.Fatalf("expected error messages to match '%v' got '%v'", tt.wants.err, err.Error())
}
}
// if tt.args.authorization.ID != nil {
defer s.DeleteAuthorization(ctx, tt.args.authorization.ID)
// }
authorizations, _, err := s.FindAuthorizations(ctx, platform.AuthorizationFilter{})
if err != nil {
@ -259,17 +260,17 @@ func FindAuthorizationByID(
Users: []*platform.User{
{
Name: "cooluser",
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
},
{
Name: "regularuser",
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
},
},
Authorizations: []*platform.Authorization{
{
ID: idFromString(t, authOneID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authOneID),
UserID: MustIDFromString(userOneID),
Token: "rand1",
Permissions: []platform.Permission{
platform.CreateUserPermission,
@ -277,8 +278,8 @@ func FindAuthorizationByID(
},
},
{
ID: idFromString(t, authTwoID),
UserID: idFromString(t, userTwoID),
ID: MustIDFromString(authTwoID),
UserID: MustIDFromString(userTwoID),
Token: "rand2",
Permissions: []platform.Permission{
platform.CreateUserPermission,
@ -287,12 +288,12 @@ func FindAuthorizationByID(
},
},
args: args{
id: idFromString(t, authTwoID),
id: MustIDFromString(authTwoID),
},
wants: wants{
authorization: &platform.Authorization{
ID: idFromString(t, authTwoID),
UserID: idFromString(t, userTwoID),
ID: MustIDFromString(authTwoID),
UserID: MustIDFromString(userTwoID),
User: "regularuser",
Status: platform.Active,
Token: "rand2",
@ -353,17 +354,17 @@ func FindAuthorizationByToken(
Users: []*platform.User{
{
Name: "cooluser",
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
},
{
Name: "regularuser",
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
},
},
Authorizations: []*platform.Authorization{
{
ID: idFromString(t, authOneID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authOneID),
UserID: MustIDFromString(userOneID),
Token: "rand1",
Status: platform.Inactive,
Permissions: []platform.Permission{
@ -372,8 +373,8 @@ func FindAuthorizationByToken(
},
},
{
ID: idFromString(t, authZeroID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authZeroID),
UserID: MustIDFromString(userOneID),
Token: "rand0",
Permissions: []platform.Permission{
platform.CreateUserPermission,
@ -381,16 +382,16 @@ func FindAuthorizationByToken(
},
},
{
ID: idFromString(t, authTwoID),
UserID: idFromString(t, userTwoID),
ID: MustIDFromString(authTwoID),
UserID: MustIDFromString(userTwoID),
Token: "rand2",
Permissions: []platform.Permission{
platform.CreateUserPermission,
},
},
{
ID: idFromString(t, authThreeID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authThreeID),
UserID: MustIDFromString(userOneID),
Token: "rand3",
Permissions: []platform.Permission{
platform.CreateUserPermission,
@ -404,9 +405,8 @@ func FindAuthorizationByToken(
},
wants: wants{
authorization: &platform.Authorization{
ID: idFromString(t, authOneID),
UserID: idFromString(t, userOneID),
Status: platform.Inactive,
ID: MustIDFromString(authOneID),
UserID: MustIDFromString(userOneID),
User: "cooluser",
Token: "rand1",
Permissions: []platform.Permission{
@ -469,17 +469,17 @@ func FindAuthorizations(
Users: []*platform.User{
{
Name: "cooluser",
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
},
{
Name: "regularuser",
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
},
},
Authorizations: []*platform.Authorization{
{
ID: idFromString(t, authOneID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authOneID),
UserID: MustIDFromString(userOneID),
Token: "rand1",
Permissions: []platform.Permission{
platform.CreateUserPermission,
@ -487,9 +487,8 @@ func FindAuthorizations(
},
},
{
ID: idFromString(t, authTwoID),
UserID: idFromString(t, userTwoID),
Status: platform.Active,
ID: MustIDFromString(authTwoID),
UserID: MustIDFromString(userTwoID),
Token: "rand2",
Permissions: []platform.Permission{
platform.CreateUserPermission,
@ -501,8 +500,8 @@ func FindAuthorizations(
wants: wants{
authorizations: []*platform.Authorization{
{
ID: idFromString(t, authOneID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authOneID),
UserID: MustIDFromString(userOneID),
User: "cooluser",
Token: "rand1",
Status: platform.Active,
@ -512,8 +511,8 @@ func FindAuthorizations(
},
},
{
ID: idFromString(t, authTwoID),
UserID: idFromString(t, userTwoID),
ID: MustIDFromString(authTwoID),
UserID: MustIDFromString(userTwoID),
User: "regularuser",
Token: "rand2",
Status: platform.Active,
@ -530,17 +529,17 @@ func FindAuthorizations(
Users: []*platform.User{
{
Name: "cooluser",
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
},
{
Name: "regularuser",
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
},
},
Authorizations: []*platform.Authorization{
{
ID: idFromString(t, authOneID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authOneID),
UserID: MustIDFromString(userOneID),
Token: "rand1",
Status: platform.Active,
Permissions: []platform.Permission{
@ -549,16 +548,16 @@ func FindAuthorizations(
},
},
{
ID: idFromString(t, authTwoID),
UserID: idFromString(t, userTwoID),
ID: MustIDFromString(authTwoID),
UserID: MustIDFromString(userTwoID),
Token: "rand2",
Permissions: []platform.Permission{
platform.CreateUserPermission,
},
},
{
ID: idFromString(t, authThreeID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authThreeID),
UserID: MustIDFromString(userOneID),
Token: "rand3",
Permissions: []platform.Permission{
platform.DeleteUserPermission,
@ -567,13 +566,13 @@ func FindAuthorizations(
},
},
args: args{
UserID: idFromString(t, userOneID),
UserID: MustIDFromString(userOneID),
},
wants: wants{
authorizations: []*platform.Authorization{
{
ID: idFromString(t, authOneID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authOneID),
UserID: MustIDFromString(userOneID),
User: "cooluser",
Status: platform.Active,
Token: "rand1",
@ -583,8 +582,8 @@ func FindAuthorizations(
},
},
{
ID: idFromString(t, authThreeID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authThreeID),
UserID: MustIDFromString(userOneID),
User: "cooluser",
Status: platform.Active,
Token: "rand3",
@ -601,25 +600,25 @@ func FindAuthorizations(
Users: []*platform.User{
{
Name: "cooluser",
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
},
{
Name: "regularuser",
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
},
},
Authorizations: []*platform.Authorization{
{
ID: idFromString(t, authZeroID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authZeroID),
UserID: MustIDFromString(userOneID),
Token: "rand1",
Permissions: []platform.Permission{
platform.DeleteUserPermission,
},
},
{
ID: idFromString(t, authOneID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authOneID),
UserID: MustIDFromString(userOneID),
Token: "rand1",
Permissions: []platform.Permission{
platform.CreateUserPermission,
@ -627,16 +626,16 @@ func FindAuthorizations(
},
},
{
ID: idFromString(t, authTwoID),
UserID: idFromString(t, userTwoID),
ID: MustIDFromString(authTwoID),
UserID: MustIDFromString(userTwoID),
Token: "rand2",
Permissions: []platform.Permission{
platform.CreateUserPermission,
},
},
{
ID: idFromString(t, authThreeID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authThreeID),
UserID: MustIDFromString(userOneID),
Token: "rand3",
Permissions: []platform.Permission{
platform.DeleteUserPermission,
@ -650,8 +649,8 @@ func FindAuthorizations(
wants: wants{
authorizations: []*platform.Authorization{
{
ID: idFromString(t, authTwoID),
UserID: idFromString(t, userTwoID),
ID: MustIDFromString(authTwoID),
UserID: MustIDFromString(userTwoID),
User: "regularuser",
Token: "rand2",
Status: platform.Active,
@ -671,10 +670,10 @@ func FindAuthorizations(
ctx := context.TODO()
filter := platform.AuthorizationFilter{}
if tt.args.ID != nil {
if tt.args.ID.Valid() {
filter.ID = &tt.args.ID
}
if tt.args.UserID != nil {
if tt.args.UserID.Valid() {
filter.UserID = &tt.args.UserID
}
if tt.args.token != "" {
@ -724,17 +723,17 @@ func DeleteAuthorization(
Users: []*platform.User{
{
Name: "cooluser",
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
},
{
Name: "regularuser",
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
},
},
Authorizations: []*platform.Authorization{
{
ID: idFromString(t, authOneID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authOneID),
UserID: MustIDFromString(userOneID),
Token: "rand1",
Permissions: []platform.Permission{
platform.CreateUserPermission,
@ -742,8 +741,8 @@ func DeleteAuthorization(
},
},
{
ID: idFromString(t, authTwoID),
UserID: idFromString(t, userTwoID),
ID: MustIDFromString(authTwoID),
UserID: MustIDFromString(userTwoID),
Token: "rand2",
Permissions: []platform.Permission{
platform.CreateUserPermission,
@ -752,13 +751,13 @@ func DeleteAuthorization(
},
},
args: args{
ID: idFromString(t, authOneID),
ID: MustIDFromString(authOneID),
},
wants: wants{
authorizations: []*platform.Authorization{
{
ID: idFromString(t, authTwoID),
UserID: idFromString(t, userTwoID),
ID: MustIDFromString(authTwoID),
UserID: MustIDFromString(userTwoID),
User: "regularuser",
Status: platform.Active,
Token: "rand2",
@ -775,17 +774,17 @@ func DeleteAuthorization(
Users: []*platform.User{
{
Name: "cooluser",
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
},
{
Name: "regularuser",
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
},
},
Authorizations: []*platform.Authorization{
{
ID: idFromString(t, authOneID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authOneID),
UserID: MustIDFromString(userOneID),
Token: "rand1",
Permissions: []platform.Permission{
platform.CreateUserPermission,
@ -793,8 +792,8 @@ func DeleteAuthorization(
},
},
{
ID: idFromString(t, authTwoID),
UserID: idFromString(t, userTwoID),
ID: MustIDFromString(authTwoID),
UserID: MustIDFromString(userTwoID),
Token: "rand2",
Permissions: []platform.Permission{
platform.CreateUserPermission,
@ -803,14 +802,14 @@ func DeleteAuthorization(
},
},
args: args{
ID: idFromString(t, authThreeID),
ID: MustIDFromString(authThreeID),
},
wants: wants{
err: fmt.Errorf("authorization not found"),
authorizations: []*platform.Authorization{
{
ID: idFromString(t, authOneID),
UserID: idFromString(t, userOneID),
ID: MustIDFromString(authOneID),
UserID: MustIDFromString(userOneID),
User: "cooluser",
Token: "rand1",
Status: platform.Active,
@ -820,8 +819,8 @@ func DeleteAuthorization(
},
},
{
ID: idFromString(t, authTwoID),
UserID: idFromString(t, userTwoID),
ID: MustIDFromString(authTwoID),
UserID: MustIDFromString(userTwoID),
User: "regularuser",
Token: "rand2",
Status: platform.Active,
@ -839,7 +838,7 @@ func DeleteAuthorization(
s, done := init(tt.fields, t)
defer done()
ctx := context.TODO()
err := s.DeleteAuthorization(ctx, platform.ID(tt.args.ID))
err := s.DeleteAuthorization(ctx, tt.args.ID)
if (err != nil) != (tt.wants.err != nil) {
t.Fatalf("expected error '%v' got '%v'", tt.wants.err, err)
}

View File

@ -112,22 +112,22 @@ func CreateBucket(
Organizations: []*platform.Organization{
{
Name: "theorg",
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
},
},
},
args: args{
bucket: &platform.Bucket{
Name: "name1",
OrganizationID: idFromString(t, orgOneID),
OrganizationID: MustIDFromString(orgOneID),
},
},
wants: wants{
buckets: []*platform.Bucket{
{
Name: "name1",
ID: idFromString(t, bucketOneID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
Organization: "theorg",
},
},
@ -138,46 +138,46 @@ func CreateBucket(
fields: BucketFields{
IDGenerator: &mock.IDGenerator{
IDFn: func() platform.ID {
return idFromString(t, bucketTwoID)
return MustIDFromString(bucketTwoID)
},
},
Buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
ID: MustIDFromString(bucketOneID),
Name: "bucket1",
OrganizationID: idFromString(t, orgOneID),
OrganizationID: MustIDFromString(orgOneID),
},
},
Organizations: []*platform.Organization{
{
Name: "theorg",
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
},
{
Name: "otherorg",
ID: idFromString(t, orgTwoID),
ID: MustIDFromString(orgTwoID),
},
},
},
args: args{
bucket: &platform.Bucket{
Name: "bucket2",
OrganizationID: idFromString(t, orgTwoID),
OrganizationID: MustIDFromString(orgTwoID),
},
},
wants: wants{
buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
ID: MustIDFromString(bucketOneID),
Name: "bucket1",
Organization: "theorg",
OrganizationID: idFromString(t, orgOneID),
OrganizationID: MustIDFromString(orgOneID),
},
{
ID: idFromString(t, bucketTwoID),
ID: MustIDFromString(bucketTwoID),
Name: "bucket2",
Organization: "otherorg",
OrganizationID: idFromString(t, orgTwoID),
OrganizationID: MustIDFromString(orgTwoID),
},
},
},
@ -187,24 +187,24 @@ func CreateBucket(
fields: BucketFields{
IDGenerator: &mock.IDGenerator{
IDFn: func() platform.ID {
return idFromString(t, bucketTwoID)
return MustIDFromString(bucketTwoID)
},
},
Buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
ID: MustIDFromString(bucketOneID),
Name: "bucket1",
OrganizationID: idFromString(t, orgOneID),
OrganizationID: MustIDFromString(orgOneID),
},
},
Organizations: []*platform.Organization{
{
Name: "theorg",
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
},
{
Name: "otherorg",
ID: idFromString(t, orgTwoID),
ID: MustIDFromString(orgTwoID),
},
},
},
@ -217,16 +217,16 @@ func CreateBucket(
wants: wants{
buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
ID: MustIDFromString(bucketOneID),
Name: "bucket1",
Organization: "theorg",
OrganizationID: idFromString(t, orgOneID),
OrganizationID: MustIDFromString(orgOneID),
},
{
ID: idFromString(t, bucketTwoID),
ID: MustIDFromString(bucketTwoID),
Name: "bucket2",
Organization: "otherorg",
OrganizationID: idFromString(t, orgTwoID),
OrganizationID: MustIDFromString(orgTwoID),
},
},
},
@ -236,40 +236,40 @@ func CreateBucket(
fields: BucketFields{
IDGenerator: &mock.IDGenerator{
IDFn: func() platform.ID {
return idFromString(t, bucketTwoID)
return MustIDFromString(bucketTwoID)
},
},
Buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
ID: MustIDFromString(bucketOneID),
Name: "bucket1",
OrganizationID: idFromString(t, orgOneID),
OrganizationID: MustIDFromString(orgOneID),
},
},
Organizations: []*platform.Organization{
{
Name: "theorg",
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
},
{
Name: "otherorg",
ID: idFromString(t, orgTwoID),
ID: MustIDFromString(orgTwoID),
},
},
},
args: args{
bucket: &platform.Bucket{
Name: "bucket1",
OrganizationID: idFromString(t, orgOneID),
OrganizationID: MustIDFromString(orgOneID),
},
},
wants: wants{
buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
ID: MustIDFromString(bucketOneID),
Name: "bucket1",
Organization: "theorg",
OrganizationID: idFromString(t, orgOneID),
OrganizationID: MustIDFromString(orgOneID),
},
},
err: fmt.Errorf("bucket with name bucket1 already exists"),
@ -280,46 +280,46 @@ func CreateBucket(
fields: BucketFields{
IDGenerator: &mock.IDGenerator{
IDFn: func() platform.ID {
return idFromString(t, bucketTwoID)
return MustIDFromString(bucketTwoID)
},
},
Organizations: []*platform.Organization{
{
Name: "theorg",
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
},
{
Name: "otherorg",
ID: idFromString(t, orgTwoID),
ID: MustIDFromString(orgTwoID),
},
},
Buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
ID: MustIDFromString(bucketOneID),
Name: "bucket1",
OrganizationID: idFromString(t, orgOneID),
OrganizationID: MustIDFromString(orgOneID),
},
},
},
args: args{
bucket: &platform.Bucket{
Name: "bucket1",
OrganizationID: idFromString(t, orgTwoID),
OrganizationID: MustIDFromString(orgTwoID),
},
},
wants: wants{
buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
ID: MustIDFromString(bucketOneID),
Name: "bucket1",
Organization: "theorg",
OrganizationID: idFromString(t, orgOneID),
OrganizationID: MustIDFromString(orgOneID),
},
{
ID: idFromString(t, bucketTwoID),
ID: MustIDFromString(bucketTwoID),
Name: "bucket1",
Organization: "otherorg",
OrganizationID: idFromString(t, orgTwoID),
OrganizationID: MustIDFromString(orgTwoID),
},
},
},
@ -344,7 +344,11 @@ func CreateBucket(
t.Fatalf("expected error messages to match '%v' got '%v'", tt.wants.err, err.Error())
}
}
// Delete only newly created buckets - ie., with a not nil ID
// if tt.args.bucket.ID.Valid() {
defer s.DeleteBucket(ctx, tt.args.bucket.ID)
// }
buckets, _, err := s.FindBuckets(ctx, platform.BucketFilter{})
if err != nil {
@ -381,30 +385,30 @@ func FindBucketByID(
fields: BucketFields{
Buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
Name: "bucket1",
},
{
ID: idFromString(t, bucketTwoID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketTwoID),
OrganizationID: MustIDFromString(orgOneID),
Name: "bucket2",
},
},
Organizations: []*platform.Organization{
{
Name: "theorg",
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
},
},
},
args: args{
id: idFromString(t, bucketTwoID),
id: MustIDFromString(bucketTwoID),
},
wants: wants{
bucket: &platform.Bucket{
ID: idFromString(t, bucketTwoID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketTwoID),
OrganizationID: MustIDFromString(orgOneID),
Organization: "theorg",
Name: "bucket2",
},
@ -464,22 +468,22 @@ func FindBuckets(
Organizations: []*platform.Organization{
{
Name: "theorg",
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
},
{
Name: "otherorg",
ID: idFromString(t, orgTwoID),
ID: MustIDFromString(orgTwoID),
},
},
Buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
Name: "abc",
},
{
ID: idFromString(t, bucketTwoID),
OrganizationID: idFromString(t, orgTwoID),
ID: MustIDFromString(bucketTwoID),
OrganizationID: MustIDFromString(orgTwoID),
Name: "xyz",
},
},
@ -488,14 +492,14 @@ func FindBuckets(
wants: wants{
buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
Organization: "theorg",
Name: "abc",
},
{
ID: idFromString(t, bucketTwoID),
OrganizationID: idFromString(t, orgTwoID),
ID: MustIDFromString(bucketTwoID),
OrganizationID: MustIDFromString(orgTwoID),
Organization: "otherorg",
Name: "xyz",
},
@ -508,27 +512,27 @@ func FindBuckets(
Organizations: []*platform.Organization{
{
Name: "theorg",
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
},
{
Name: "otherorg",
ID: idFromString(t, orgTwoID),
ID: MustIDFromString(orgTwoID),
},
},
Buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
Name: "abc",
},
{
ID: idFromString(t, bucketTwoID),
OrganizationID: idFromString(t, orgTwoID),
ID: MustIDFromString(bucketTwoID),
OrganizationID: MustIDFromString(orgTwoID),
Name: "xyz",
},
{
ID: idFromString(t, bucketThreeID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketThreeID),
OrganizationID: MustIDFromString(orgOneID),
Name: "123",
},
},
@ -539,14 +543,14 @@ func FindBuckets(
wants: wants{
buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
Organization: "theorg",
Name: "abc",
},
{
ID: idFromString(t, bucketThreeID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketThreeID),
OrganizationID: MustIDFromString(orgOneID),
Organization: "theorg",
Name: "123",
},
@ -559,45 +563,45 @@ func FindBuckets(
Organizations: []*platform.Organization{
{
Name: "theorg",
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
},
{
Name: "otherorg",
ID: idFromString(t, orgTwoID),
ID: MustIDFromString(orgTwoID),
},
},
Buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
Name: "abc",
},
{
ID: idFromString(t, bucketTwoID),
OrganizationID: idFromString(t, orgTwoID),
ID: MustIDFromString(bucketTwoID),
OrganizationID: MustIDFromString(orgTwoID),
Name: "xyz",
},
{
ID: idFromString(t, bucketThreeID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketThreeID),
OrganizationID: MustIDFromString(orgOneID),
Name: "123",
},
},
},
args: args{
organizationID: idFromString(t, orgOneID),
organizationID: MustIDFromString(orgOneID),
},
wants: wants{
buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
Organization: "theorg",
Name: "abc",
},
{
ID: idFromString(t, bucketThreeID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketThreeID),
OrganizationID: MustIDFromString(orgOneID),
Organization: "theorg",
Name: "123",
},
@ -610,30 +614,30 @@ func FindBuckets(
Organizations: []*platform.Organization{
{
Name: "theorg",
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
},
},
Buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
Name: "abc",
},
{
ID: idFromString(t, bucketTwoID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketTwoID),
OrganizationID: MustIDFromString(orgOneID),
Name: "xyz",
},
},
},
args: args{
ID: idFromString(t, bucketTwoID),
ID: MustIDFromString(bucketTwoID),
},
wants: wants{
buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketTwoID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketTwoID),
OrganizationID: MustIDFromString(orgOneID),
Organization: "theorg",
Name: "xyz",
},
@ -646,18 +650,18 @@ func FindBuckets(
Organizations: []*platform.Organization{
{
Name: "theorg",
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
},
},
Buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
Name: "abc",
},
{
ID: idFromString(t, bucketTwoID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketTwoID),
OrganizationID: MustIDFromString(orgOneID),
Name: "xyz",
},
},
@ -668,8 +672,8 @@ func FindBuckets(
wants: wants{
buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketTwoID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketTwoID),
OrganizationID: MustIDFromString(orgOneID),
Organization: "theorg",
Name: "xyz",
},
@ -685,10 +689,10 @@ func FindBuckets(
ctx := context.TODO()
filter := platform.BucketFilter{}
if tt.args.ID != nil {
if tt.args.ID.Valid() {
filter.ID = &tt.args.ID
}
if tt.args.organizationID != nil {
if tt.args.organizationID.Valid() {
filter.OrganizationID = &tt.args.organizationID
}
if tt.args.organization != "" {
@ -741,31 +745,31 @@ func DeleteBucket(
Organizations: []*platform.Organization{
{
Name: "theorg",
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
},
},
Buckets: []*platform.Bucket{
{
Name: "A",
ID: platform.ID("abc"),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
},
{
Name: "B",
ID: platform.ID("xyz"),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketThreeID),
OrganizationID: MustIDFromString(orgOneID),
},
},
},
args: args{
ID: "abc",
ID: bucketOneID,
},
wants: wants{
buckets: []*platform.Bucket{
{
Name: "B",
ID: platform.ID("xyz"),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketThreeID),
OrganizationID: MustIDFromString(orgOneID),
Organization: "theorg",
},
},
@ -777,38 +781,38 @@ func DeleteBucket(
Organizations: []*platform.Organization{
{
Name: "theorg",
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
},
},
Buckets: []*platform.Bucket{
{
Name: "A",
ID: platform.ID("abc"),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
},
{
Name: "B",
ID: platform.ID("xyz"),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketThreeID),
OrganizationID: MustIDFromString(orgOneID),
},
},
},
args: args{
ID: "123",
ID: "1234567890654321",
},
wants: wants{
err: fmt.Errorf("bucket not found"),
buckets: []*platform.Bucket{
{
Name: "A",
ID: platform.ID("abc"),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
Organization: "theorg",
},
{
Name: "B",
ID: platform.ID("xyz"),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketThreeID),
OrganizationID: MustIDFromString(orgOneID),
Organization: "theorg",
},
},
@ -821,7 +825,7 @@ func DeleteBucket(
s, done := init(tt.fields, t)
defer done()
ctx := context.TODO()
err := s.DeleteBucket(ctx, platform.ID(tt.args.ID))
err := s.DeleteBucket(ctx, MustIDFromString(tt.args.ID))
if (err != nil) != (tt.wants.err != nil) {
t.Fatalf("expected error '%v' got '%v'", tt.wants.err, err)
}
@ -871,30 +875,30 @@ func FindBucket(
Organizations: []*platform.Organization{
{
Name: "theorg",
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
},
},
Buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
Name: "abc",
},
{
ID: idFromString(t, bucketTwoID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketTwoID),
OrganizationID: MustIDFromString(orgOneID),
Name: "xyz",
},
},
},
args: args{
name: "abc",
organizationID: idFromString(t, orgOneID),
organizationID: MustIDFromString(orgOneID),
},
wants: wants{
bucket: &platform.Bucket{
ID: idFromString(t, bucketOneID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
Organization: "theorg",
Name: "abc",
},
@ -911,7 +915,7 @@ func FindBucket(
if tt.args.name != "" {
filter.Name = &tt.args.name
}
if tt.args.organizationID != nil {
if tt.args.organizationID.Valid() {
filter.OrganizationID = &tt.args.organizationID
}
@ -960,30 +964,30 @@ func UpdateBucket(
Organizations: []*platform.Organization{
{
Name: "theorg",
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
},
},
Buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
Name: "bucket1",
},
{
ID: idFromString(t, bucketTwoID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketTwoID),
OrganizationID: MustIDFromString(orgOneID),
Name: "bucket2",
},
},
},
args: args{
id: idFromString(t, bucketOneID),
id: MustIDFromString(bucketOneID),
name: "changed",
},
wants: wants{
bucket: &platform.Bucket{
ID: idFromString(t, bucketOneID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
Organization: "theorg",
Name: "changed",
},
@ -995,30 +999,30 @@ func UpdateBucket(
Organizations: []*platform.Organization{
{
Name: "theorg",
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
},
},
Buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
Name: "bucket1",
},
{
ID: idFromString(t, bucketTwoID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketTwoID),
OrganizationID: MustIDFromString(orgOneID),
Name: "bucket2",
},
},
},
args: args{
id: idFromString(t, bucketOneID),
id: MustIDFromString(bucketOneID),
retention: 100,
},
wants: wants{
bucket: &platform.Bucket{
ID: idFromString(t, bucketOneID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
Organization: "theorg",
Name: "bucket1",
RetentionPeriod: 100 * time.Minute,
@ -1031,31 +1035,31 @@ func UpdateBucket(
Organizations: []*platform.Organization{
{
Name: "theorg",
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
},
},
Buckets: []*platform.Bucket{
{
ID: idFromString(t, bucketOneID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketOneID),
OrganizationID: MustIDFromString(orgOneID),
Name: "bucket1",
},
{
ID: idFromString(t, bucketTwoID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketTwoID),
OrganizationID: MustIDFromString(orgOneID),
Name: "bucket2",
},
},
},
args: args{
id: idFromString(t, bucketTwoID),
id: MustIDFromString(bucketTwoID),
retention: 101,
name: "changed",
},
wants: wants{
bucket: &platform.Bucket{
ID: idFromString(t, bucketTwoID),
OrganizationID: idFromString(t, orgOneID),
ID: MustIDFromString(bucketTwoID),
OrganizationID: MustIDFromString(orgOneID),
Organization: "theorg",
Name: "changed",
RetentionPeriod: 101 * time.Minute,

View File

@ -11,6 +11,16 @@ import (
"github.com/pkg/errors"
)
const (
dbrpOrg1ID = "ba55ba55ba55ba55"
dbrpOrg2ID = "beadbeadbeadbead"
dbrpOrg3ID = "1005e1eaf1005e1e"
dbrpBucket1ID = "cab00d1ecab00d1e"
dbrpBucket2ID = "ca1fca1fca1fca1f"
dbrpBucketAID = "a55e55eda55e55ed"
dbrpBucketBID = "b1077edb1077eded"
)
var dbrpMappingCmpOptions = cmp.Options{
cmp.Comparer(func(x, y []byte) bool {
return bytes.Equal(x, y)
@ -91,8 +101,8 @@ func CreateDBRPMapping(
Database: "database1",
RetentionPolicy: "retention_policy1",
Default: false,
OrganizationID: platform.ID("org1"),
BucketID: platform.ID("bucket1"),
OrganizationID: MustIDFromString(dbrpOrg1ID),
BucketID: MustIDFromString(dbrpBucket1ID),
},
},
wants: wants{
@ -101,8 +111,8 @@ func CreateDBRPMapping(
Database: "database1",
RetentionPolicy: "retention_policy1",
Default: false,
OrganizationID: platform.ID("org1"),
BucketID: platform.ID("bucket1"),
OrganizationID: MustIDFromString(dbrpOrg1ID),
BucketID: MustIDFromString(dbrpBucket1ID),
}},
},
},
@ -114,8 +124,8 @@ func CreateDBRPMapping(
Database: "database1",
RetentionPolicy: "retention_policy1",
Default: false,
OrganizationID: platform.ID("org1"),
BucketID: platform.ID("bucket1"),
OrganizationID: MustIDFromString(dbrpOrg1ID),
BucketID: MustIDFromString(dbrpBucket1ID),
}},
},
args: args{
@ -124,8 +134,8 @@ func CreateDBRPMapping(
Database: "database2",
RetentionPolicy: "retention_policy2",
Default: true,
OrganizationID: platform.ID("org2"),
BucketID: platform.ID("bucket2"),
OrganizationID: MustIDFromString(dbrpOrg2ID),
BucketID: MustIDFromString(dbrpBucket2ID),
},
},
wants: wants{
@ -135,16 +145,16 @@ func CreateDBRPMapping(
Database: "database1",
RetentionPolicy: "retention_policy1",
Default: false,
OrganizationID: platform.ID("org1"),
BucketID: platform.ID("bucket1"),
OrganizationID: MustIDFromString(dbrpOrg1ID),
BucketID: MustIDFromString(dbrpBucket1ID),
},
{
Cluster: "cluster2",
Database: "database2",
RetentionPolicy: "retention_policy2",
Default: true,
OrganizationID: platform.ID("org2"),
BucketID: platform.ID("bucket2"),
OrganizationID: MustIDFromString(dbrpOrg2ID),
BucketID: MustIDFromString(dbrpBucket2ID),
},
},
},
@ -157,8 +167,8 @@ func CreateDBRPMapping(
Database: "database1",
RetentionPolicy: "retention_policy1",
Default: false,
OrganizationID: platform.ID("org1"),
BucketID: platform.ID("bucket1"),
OrganizationID: MustIDFromString(dbrpOrg1ID),
BucketID: MustIDFromString(dbrpBucket1ID),
}},
},
args: args{
@ -167,8 +177,8 @@ func CreateDBRPMapping(
Database: "database1",
RetentionPolicy: "retention_policy1",
Default: false,
OrganizationID: platform.ID("org1"),
BucketID: platform.ID("bucket1"),
OrganizationID: MustIDFromString(dbrpOrg1ID),
BucketID: MustIDFromString(dbrpBucket1ID),
},
},
wants: wants{
@ -178,8 +188,8 @@ func CreateDBRPMapping(
Database: "database1",
RetentionPolicy: "retention_policy1",
Default: false,
OrganizationID: platform.ID("org1"),
BucketID: platform.ID("bucket1"),
OrganizationID: MustIDFromString(dbrpOrg1ID),
BucketID: MustIDFromString(dbrpBucket1ID),
},
},
},
@ -192,8 +202,8 @@ func CreateDBRPMapping(
Database: "database1",
RetentionPolicy: "retention_policy1",
Default: false,
OrganizationID: platform.ID("org1"),
BucketID: platform.ID("bucket1"),
OrganizationID: MustIDFromString(dbrpOrg1ID),
BucketID: MustIDFromString(dbrpBucket1ID),
}},
},
args: args{
@ -202,8 +212,8 @@ func CreateDBRPMapping(
Database: "database1",
RetentionPolicy: "retention_policy1",
Default: true,
OrganizationID: platform.ID("org1"),
BucketID: platform.ID("bucket1"),
OrganizationID: MustIDFromString(dbrpOrg1ID),
BucketID: MustIDFromString(dbrpBucket1ID),
},
},
wants: wants{
@ -214,8 +224,8 @@ func CreateDBRPMapping(
Database: "database1",
RetentionPolicy: "retention_policy1",
Default: false,
OrganizationID: platform.ID("org1"),
BucketID: platform.ID("bucket1"),
OrganizationID: MustIDFromString(dbrpOrg1ID),
BucketID: MustIDFromString(dbrpBucket1ID),
},
},
},
@ -277,16 +287,16 @@ func FindDBRPMappings(
Database: "database1",
RetentionPolicy: "retention_policy1",
Default: false,
OrganizationID: platform.ID("org1"),
BucketID: platform.ID("bucket1"),
OrganizationID: MustIDFromString(dbrpOrg1ID),
BucketID: MustIDFromString(dbrpBucket1ID),
},
{
Cluster: "cluster2",
Database: "database2",
RetentionPolicy: "retention_policy2",
Default: true,
OrganizationID: platform.ID("org2"),
BucketID: platform.ID("bucket2"),
OrganizationID: MustIDFromString(dbrpOrg2ID),
BucketID: MustIDFromString(dbrpBucket2ID),
},
},
},
@ -300,16 +310,16 @@ func FindDBRPMappings(
Database: "database1",
RetentionPolicy: "retention_policy1",
Default: false,
OrganizationID: platform.ID("org1"),
BucketID: platform.ID("bucket1"),
OrganizationID: MustIDFromString(dbrpOrg1ID),
BucketID: MustIDFromString(dbrpBucket1ID),
},
{
Cluster: "cluster2",
Database: "database2",
RetentionPolicy: "retention_policy2",
Default: true,
OrganizationID: platform.ID("org2"),
BucketID: platform.ID("bucket2"),
OrganizationID: MustIDFromString(dbrpOrg2ID),
BucketID: MustIDFromString(dbrpBucket2ID),
},
},
},
@ -323,16 +333,16 @@ func FindDBRPMappings(
Database: "database1",
RetentionPolicy: "retention_policy1",
Default: false,
OrganizationID: platform.ID("org1"),
BucketID: platform.ID("bucket1"),
OrganizationID: MustIDFromString(dbrpOrg1ID),
BucketID: MustIDFromString(dbrpBucket1ID),
},
{
Cluster: "cluster2",
Database: "database2",
RetentionPolicy: "retention_policy2",
Default: true,
OrganizationID: platform.ID("org2"),
BucketID: platform.ID("bucket2"),
OrganizationID: MustIDFromString(dbrpOrg2ID),
BucketID: MustIDFromString(dbrpBucket2ID),
},
},
},
@ -348,8 +358,8 @@ func FindDBRPMappings(
Database: "database2",
RetentionPolicy: "retention_policy2",
Default: true,
OrganizationID: platform.ID("org2"),
BucketID: platform.ID("bucket2"),
OrganizationID: MustIDFromString(dbrpOrg2ID),
BucketID: MustIDFromString(dbrpBucket2ID),
},
},
},
@ -363,16 +373,16 @@ func FindDBRPMappings(
Database: "database",
RetentionPolicy: "retention_policyA",
Default: false,
OrganizationID: platform.ID("org"),
BucketID: platform.ID("bucketA"),
OrganizationID: MustIDFromString(dbrpOrg3ID),
BucketID: MustIDFromString(dbrpBucketAID),
},
{
Cluster: "cluster",
Database: "database",
RetentionPolicy: "retention_policyB",
Default: true,
OrganizationID: platform.ID("org"),
BucketID: platform.ID("bucketB"),
OrganizationID: MustIDFromString(dbrpOrg3ID),
BucketID: MustIDFromString(dbrpBucketBID),
},
},
},
@ -390,8 +400,8 @@ func FindDBRPMappings(
Database: "database",
RetentionPolicy: "retention_policyB",
Default: true,
OrganizationID: platform.ID("org"),
BucketID: platform.ID("bucketB"),
OrganizationID: MustIDFromString(dbrpOrg3ID),
BucketID: MustIDFromString(dbrpBucketBID),
},
},
},
@ -453,16 +463,16 @@ func FindDBRPMappingByKey(
Database: "database",
RetentionPolicy: "retention_policyA",
Default: false,
OrganizationID: platform.ID("org"),
BucketID: platform.ID("bucketA"),
OrganizationID: MustIDFromString(dbrpOrg3ID),
BucketID: MustIDFromString(dbrpBucketAID),
},
{
Cluster: "cluster",
Database: "database",
RetentionPolicy: "retention_policyB",
Default: false,
OrganizationID: platform.ID("org"),
BucketID: platform.ID("bucketB"),
OrganizationID: MustIDFromString(dbrpOrg3ID),
BucketID: MustIDFromString(dbrpBucketBID),
},
},
},
@ -477,8 +487,8 @@ func FindDBRPMappingByKey(
Database: "database",
RetentionPolicy: "retention_policyB",
Default: false,
OrganizationID: platform.ID("org"),
BucketID: platform.ID("bucketB"),
OrganizationID: MustIDFromString(dbrpOrg3ID),
BucketID: MustIDFromString(dbrpBucketBID),
},
},
},
@ -491,8 +501,8 @@ func FindDBRPMappingByKey(
Database: "database",
RetentionPolicy: "retention_policyA",
Default: false,
OrganizationID: platform.ID("org"),
BucketID: platform.ID("bucketA"),
OrganizationID: MustIDFromString(dbrpOrg3ID),
BucketID: MustIDFromString(dbrpBucketAID),
},
},
},
@ -560,16 +570,16 @@ func FindDBRPMapping(
Database: "database",
RetentionPolicy: "retention_policyA",
Default: false,
OrganizationID: platform.ID("org"),
BucketID: platform.ID("bucketA"),
OrganizationID: MustIDFromString(dbrpOrg3ID),
BucketID: MustIDFromString(dbrpBucketAID),
},
{
Cluster: "cluster",
Database: "database",
RetentionPolicy: "retention_policyB",
Default: false,
OrganizationID: platform.ID("org"),
BucketID: platform.ID("bucketB"),
OrganizationID: MustIDFromString(dbrpOrg3ID),
BucketID: MustIDFromString(dbrpBucketBID),
},
},
},
@ -586,8 +596,8 @@ func FindDBRPMapping(
Database: "database",
RetentionPolicy: "retention_policyB",
Default: false,
OrganizationID: platform.ID("org"),
BucketID: platform.ID("bucketB"),
OrganizationID: MustIDFromString(dbrpOrg3ID),
BucketID: MustIDFromString(dbrpBucketBID),
},
},
},
@ -600,16 +610,16 @@ func FindDBRPMapping(
Database: "database",
RetentionPolicy: "retention_policyA",
Default: false,
OrganizationID: platform.ID("org"),
BucketID: platform.ID("bucketA"),
OrganizationID: MustIDFromString(dbrpOrg3ID),
BucketID: MustIDFromString(dbrpBucketAID),
},
{
Cluster: "cluster",
Database: "database",
RetentionPolicy: "retention_policyB",
Default: true,
OrganizationID: platform.ID("org"),
BucketID: platform.ID("bucketB"),
OrganizationID: MustIDFromString(dbrpOrg3ID),
BucketID: MustIDFromString(dbrpBucketBID),
},
},
},
@ -626,8 +636,8 @@ func FindDBRPMapping(
Database: "database",
RetentionPolicy: "retention_policyB",
Default: true,
OrganizationID: platform.ID("org"),
BucketID: platform.ID("bucketB"),
OrganizationID: MustIDFromString(dbrpOrg3ID),
BucketID: MustIDFromString(dbrpBucketBID),
},
},
},
@ -685,16 +695,16 @@ func DeleteDBRPMapping(
Database: "database1",
RetentionPolicy: "retention_policy1",
Default: false,
OrganizationID: platform.ID("org1"),
BucketID: platform.ID("bucket1"),
OrganizationID: MustIDFromString(dbrpOrg1ID),
BucketID: MustIDFromString(dbrpBucket1ID),
},
{
Cluster: "cluster2",
Database: "database2",
RetentionPolicy: "retention_policy2",
Default: true,
OrganizationID: platform.ID("org2"),
BucketID: platform.ID("bucket2"),
OrganizationID: MustIDFromString(dbrpOrg2ID),
BucketID: MustIDFromString(dbrpBucket2ID),
},
},
},
@ -709,8 +719,8 @@ func DeleteDBRPMapping(
Database: "database2",
RetentionPolicy: "retention_policy2",
Default: true,
OrganizationID: platform.ID("org2"),
BucketID: platform.ID("bucket2"),
OrganizationID: MustIDFromString(dbrpOrg2ID),
BucketID: MustIDFromString(dbrpBucket2ID),
}},
},
},
@ -723,16 +733,16 @@ func DeleteDBRPMapping(
Database: "database1",
RetentionPolicy: "retention_policy1",
Default: false,
OrganizationID: platform.ID("org1"),
BucketID: platform.ID("bucket1"),
OrganizationID: MustIDFromString(dbrpOrg1ID),
BucketID: MustIDFromString(dbrpBucket1ID),
},
{
Cluster: "cluster2",
Database: "database2",
RetentionPolicy: "retention_policy2",
Default: true,
OrganizationID: platform.ID("org2"),
BucketID: platform.ID("bucket2"),
OrganizationID: MustIDFromString(dbrpOrg2ID),
BucketID: MustIDFromString(dbrpBucket2ID),
},
},
},
@ -748,16 +758,16 @@ func DeleteDBRPMapping(
Database: "database1",
RetentionPolicy: "retention_policy1",
Default: false,
OrganizationID: platform.ID("org1"),
BucketID: platform.ID("bucket1"),
OrganizationID: MustIDFromString(dbrpOrg1ID),
BucketID: MustIDFromString(dbrpBucket1ID),
},
{
Cluster: "cluster2",
Database: "database2",
RetentionPolicy: "retention_policy2",
Default: true,
OrganizationID: platform.ID("org2"),
BucketID: platform.ID("bucket2"),
OrganizationID: MustIDFromString(dbrpOrg2ID),
BucketID: MustIDFromString(dbrpBucket2ID),
},
},
},

View File

@ -111,7 +111,7 @@ func CreateOrganization(
organizations: []*platform.Organization{
{
Name: "name1",
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
},
},
},
@ -122,7 +122,7 @@ func CreateOrganization(
IDGenerator: mock.NewIDGenerator(orgTwoID, t),
Organizations: []*platform.Organization{
{
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
Name: "organization1",
},
},
@ -135,23 +135,23 @@ func CreateOrganization(
wants: wants{
organizations: []*platform.Organization{
{
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
Name: "organization1",
},
{
ID: idFromString(t, orgTwoID),
ID: MustIDFromString(orgTwoID),
Name: "organization2",
},
},
},
},
{
name: "names should not be unique",
name: "names should be unique",
fields: OrganizationFields{
IDGenerator: mock.NewIDGenerator(orgTwoID, t),
Organizations: []*platform.Organization{
{
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
Name: "organization1",
},
},
@ -164,7 +164,7 @@ func CreateOrganization(
wants: wants{
organizations: []*platform.Organization{
{
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
Name: "organization1",
},
},
@ -188,7 +188,11 @@ func CreateOrganization(
t.Fatalf("expected error messages to match '%v' got '%v'", tt.wants.err, err.Error())
}
}
// Delete only newly created organizations
// if tt.args.organization.ID != nil {
defer s.DeleteOrganization(ctx, tt.args.organization.ID)
// }
organizations, _, err := s.FindOrganizations(ctx, platform.OrganizationFilter{})
if err != nil {
@ -225,21 +229,21 @@ func FindOrganizationByID(
fields: OrganizationFields{
Organizations: []*platform.Organization{
{
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
Name: "organization1",
},
{
ID: idFromString(t, orgTwoID),
ID: MustIDFromString(orgTwoID),
Name: "organization2",
},
},
},
args: args{
id: idFromString(t, orgTwoID),
id: MustIDFromString(orgTwoID),
},
wants: wants{
organization: &platform.Organization{
ID: idFromString(t, orgTwoID),
ID: MustIDFromString(orgTwoID),
Name: "organization2",
},
},
@ -295,11 +299,11 @@ func FindOrganizations(
fields: OrganizationFields{
Organizations: []*platform.Organization{
{
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
Name: "abc",
},
{
ID: idFromString(t, orgTwoID),
ID: MustIDFromString(orgTwoID),
Name: "xyz",
},
},
@ -308,11 +312,11 @@ func FindOrganizations(
wants: wants{
organizations: []*platform.Organization{
{
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
Name: "abc",
},
{
ID: idFromString(t, orgTwoID),
ID: MustIDFromString(orgTwoID),
Name: "xyz",
},
},
@ -323,22 +327,22 @@ func FindOrganizations(
fields: OrganizationFields{
Organizations: []*platform.Organization{
{
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
Name: "abc",
},
{
ID: idFromString(t, orgTwoID),
ID: MustIDFromString(orgTwoID),
Name: "xyz",
},
},
},
args: args{
ID: idFromString(t, orgTwoID),
ID: MustIDFromString(orgTwoID),
},
wants: wants{
organizations: []*platform.Organization{
{
ID: idFromString(t, orgTwoID),
ID: MustIDFromString(orgTwoID),
Name: "xyz",
},
},
@ -349,11 +353,11 @@ func FindOrganizations(
fields: OrganizationFields{
Organizations: []*platform.Organization{
{
ID: idFromString(t, orgOneID),
ID: MustIDFromString(orgOneID),
Name: "abc",
},
{
ID: idFromString(t, orgTwoID),
ID: MustIDFromString(orgTwoID),
Name: "xyz",
},
},
@ -364,7 +368,7 @@ func FindOrganizations(
wants: wants{
organizations: []*platform.Organization{
{
ID: idFromString(t, orgTwoID),
ID: MustIDFromString(orgTwoID),
Name: "xyz",
},
},
@ -379,7 +383,7 @@ func FindOrganizations(
ctx := context.TODO()
filter := platform.OrganizationFilter{}
if tt.args.ID != nil {
if tt.args.ID.Valid() {
filter.ID = &tt.args.ID
}
if tt.args.name != "" {
@ -429,22 +433,22 @@ func DeleteOrganization(
Organizations: []*platform.Organization{
{
Name: "orgA",
ID: platform.ID("abc"),
ID: MustIDFromString(orgOneID),
},
{
Name: "orgB",
ID: platform.ID("xyz"),
ID: MustIDFromString(orgTwoID),
},
},
},
args: args{
ID: "abc",
ID: orgOneID,
},
wants: wants{
organizations: []*platform.Organization{
{
Name: "orgB",
ID: platform.ID("xyz"),
ID: MustIDFromString(orgTwoID),
},
},
},
@ -455,27 +459,27 @@ func DeleteOrganization(
Organizations: []*platform.Organization{
{
Name: "orgA",
ID: platform.ID("abc"),
ID: MustIDFromString(orgOneID),
},
{
Name: "orgB",
ID: platform.ID("xyz"),
ID: MustIDFromString(orgTwoID),
},
},
},
args: args{
ID: "123",
ID: "1234567890654321",
},
wants: wants{
err: fmt.Errorf("organization not found"),
organizations: []*platform.Organization{
{
Name: "orgA",
ID: platform.ID("abc"),
ID: MustIDFromString(orgOneID),
},
{
Name: "orgB",
ID: platform.ID("xyz"),
ID: MustIDFromString(orgTwoID),
},
},
},
@ -487,7 +491,7 @@ func DeleteOrganization(
s, done := init(tt.fields, t)
defer done()
ctx := context.TODO()
err := s.DeleteOrganization(ctx, platform.ID(tt.args.ID))
err := s.DeleteOrganization(ctx, MustIDFromString(tt.args.ID))
if (err != nil) != (tt.wants.err != nil) {
t.Fatalf("expected error '%v' got '%v'", tt.wants.err, err)
}
@ -535,11 +539,11 @@ func FindOrganization(
fields: OrganizationFields{
Organizations: []*platform.Organization{
{
ID: platform.ID("a"),
ID: MustIDFromString(orgOneID),
Name: "abc",
},
{
ID: platform.ID("b"),
ID: MustIDFromString(orgTwoID),
Name: "xyz",
},
},
@ -549,7 +553,7 @@ func FindOrganization(
},
wants: wants{
organization: &platform.Organization{
ID: platform.ID("a"),
ID: MustIDFromString(orgOneID),
Name: "abc",
},
},
@ -609,22 +613,22 @@ func UpdateOrganization(
fields: OrganizationFields{
Organizations: []*platform.Organization{
{
ID: platform.ID("1"),
ID: MustIDFromString(orgOneID),
Name: "organization1",
},
{
ID: platform.ID("2"),
ID: MustIDFromString(orgTwoID),
Name: "organization2",
},
},
},
args: args{
id: platform.ID("1"),
id: MustIDFromString(orgOneID),
name: "changed",
},
wants: wants{
organization: &platform.Organization{
ID: platform.ID("1"),
ID: MustIDFromString(orgOneID),
Name: "changed",
},
},

View File

@ -112,7 +112,7 @@ func CreateUser(
users: []*platform.User{
{
Name: "name1",
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
},
},
},
@ -123,7 +123,7 @@ func CreateUser(
IDGenerator: mock.NewIDGenerator(userTwoID, t),
Users: []*platform.User{
{
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
Name: "user1",
},
},
@ -136,27 +136,27 @@ func CreateUser(
wants: wants{
users: []*platform.User{
{
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
Name: "user1",
},
{
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
Name: "user2",
},
},
},
},
{
name: "names should not be unique",
name: "names should be unique",
fields: UserFields{
IDGenerator: &mock.IDGenerator{
IDFn: func() platform.ID {
return idFromString(t, userOneID)
return MustIDFromString(userOneID)
},
},
Users: []*platform.User{
{
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
Name: "user1",
},
},
@ -169,7 +169,7 @@ func CreateUser(
wants: wants{
users: []*platform.User{
{
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
Name: "user1",
},
},
@ -193,7 +193,11 @@ func CreateUser(
t.Fatalf("expected error messages to match '%v' got '%v'", tt.wants.err, err.Error())
}
}
defer s.DeleteUser(ctx, tt.args.user.ID)
// Delete only created users - ie., having a not nil ID
if tt.args.user.ID.Valid() {
defer s.DeleteUser(ctx, tt.args.user.ID)
}
users, _, err := s.FindUsers(ctx, platform.UserFilter{})
if err != nil {
@ -230,21 +234,21 @@ func FindUserByID(
fields: UserFields{
Users: []*platform.User{
{
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
Name: "user1",
},
{
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
Name: "user2",
},
},
},
args: args{
id: idFromString(t, userTwoID),
id: MustIDFromString(userTwoID),
},
wants: wants{
user: &platform.User{
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
Name: "user2",
},
},
@ -300,11 +304,11 @@ func FindUsers(
fields: UserFields{
Users: []*platform.User{
{
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
Name: "abc",
},
{
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
Name: "xyz",
},
},
@ -313,11 +317,11 @@ func FindUsers(
wants: wants{
users: []*platform.User{
{
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
Name: "abc",
},
{
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
Name: "xyz",
},
},
@ -328,22 +332,22 @@ func FindUsers(
fields: UserFields{
Users: []*platform.User{
{
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
Name: "abc",
},
{
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
Name: "xyz",
},
},
},
args: args{
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
},
wants: wants{
users: []*platform.User{
{
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
Name: "xyz",
},
},
@ -354,11 +358,11 @@ func FindUsers(
fields: UserFields{
Users: []*platform.User{
{
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
Name: "abc",
},
{
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
Name: "xyz",
},
},
@ -369,7 +373,7 @@ func FindUsers(
wants: wants{
users: []*platform.User{
{
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
Name: "xyz",
},
},
@ -384,7 +388,7 @@ func FindUsers(
ctx := context.TODO()
filter := platform.UserFilter{}
if tt.args.ID != nil {
if tt.args.ID.Valid() {
filter.ID = &tt.args.ID
}
if tt.args.name != "" {
@ -434,22 +438,22 @@ func DeleteUser(
Users: []*platform.User{
{
Name: "orgA",
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
},
{
Name: "orgB",
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
},
},
},
args: args{
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
},
wants: wants{
users: []*platform.User{
{
Name: "orgB",
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
},
},
},
@ -460,27 +464,27 @@ func DeleteUser(
Users: []*platform.User{
{
Name: "orgA",
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
},
{
Name: "orgB",
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
},
},
},
args: args{
ID: idFromString(t, userThreeID),
ID: MustIDFromString(userThreeID),
},
wants: wants{
err: fmt.Errorf("user not found"),
users: []*platform.User{
{
Name: "orgA",
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
},
{
Name: "orgB",
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
},
},
},
@ -540,11 +544,11 @@ func FindUser(
fields: UserFields{
Users: []*platform.User{
{
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
Name: "abc",
},
{
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
Name: "xyz",
},
},
@ -554,7 +558,7 @@ func FindUser(
},
wants: wants{
user: &platform.User{
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
Name: "abc",
},
},
@ -614,22 +618,22 @@ func UpdateUser(
fields: UserFields{
Users: []*platform.User{
{
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
Name: "user1",
},
{
ID: idFromString(t, userTwoID),
ID: MustIDFromString(userTwoID),
Name: "user2",
},
},
},
args: args{
id: idFromString(t, userOneID),
id: MustIDFromString(userOneID),
name: "changed",
},
wants: wants{
user: &platform.User{
ID: idFromString(t, userOneID),
ID: MustIDFromString(userOneID),
Name: "changed",
},
},

View File

@ -1,15 +1,14 @@
package testing
import (
"testing"
"github.com/influxdata/platform"
)
func idFromString(t *testing.T, s string) platform.ID {
// MustIDFromString is an helper to ensure a correct ID is built during testing.
func MustIDFromString(s string) platform.ID {
id, err := platform.IDFromString(s)
if err != nil {
t.Fatal(err)
panic(err)
}
return *id
}

View File

@ -2,7 +2,7 @@ package platform
import "context"
// User is a user. 🎉
// User is an user. 🎉
type User struct {
ID ID `json:"id,omitempty"`
Name string `json:"name"`

View File

@ -6,6 +6,7 @@ import (
"github.com/google/go-cmp/cmp"
"github.com/influxdata/platform"
platformtesting "github.com/influxdata/platform/testing"
)
func TestView_MarshalJSON(t *testing.T) {
@ -24,7 +25,7 @@ func TestView_MarshalJSON(t *testing.T) {
args: args{
view: platform.View{
ViewContents: platform.ViewContents{
ID: platform.ID("0"),
ID: platformtesting.MustIDFromString("f01dab1ef005ba11"),
Name: "hello",
},
Properties: platform.LineViewProperties{
@ -35,7 +36,7 @@ func TestView_MarshalJSON(t *testing.T) {
wants: wants{
json: `
{
"id": "30",
"id": "f01dab1ef005ba11",
"name": "hello",
"properties": {
"shape": "chronograf-v2",