sensorlog: syncbase: eliminate explicit app layer
MultiPart: 3/3
Change-Id: I1fe2dc9ca1bcc95bc834eecbd63861afac8bddda
diff --git a/go/src/v.io/x/sensorlog/internal/measure/syncgroup_test.go b/go/src/v.io/x/sensorlog/internal/measure/syncgroup_test.go
index 6f7044d..9653863 100644
--- a/go/src/v.io/x/sensorlog/internal/measure/syncgroup_test.go
+++ b/go/src/v.io/x/sensorlog/internal/measure/syncgroup_test.go
@@ -20,7 +20,7 @@
_, ctxMeasured, sbName, _, cleanup := sbtu.SetupOrDieCustom("one", "one:sb", nil)
defer cleanup()
- // Open app/db (create both) as measured.
+ // Open (create) db as measured.
db, err := sbutil.CreateOrOpenDB(ctxMeasured, sbName, sbmodel.MeasuredCollections)
if err != nil {
t.Fatalf("CreateOrOpenDB should have succeeded, got error: %v", err)
diff --git a/go/src/v.io/x/sensorlog/internal/measure/watcher_test.go b/go/src/v.io/x/sensorlog/internal/measure/watcher_test.go
index 9bba516..9b6d9e6 100644
--- a/go/src/v.io/x/sensorlog/internal/measure/watcher_test.go
+++ b/go/src/v.io/x/sensorlog/internal/measure/watcher_test.go
@@ -31,7 +31,7 @@
_, ctxMeasured, sbName, _, cleanup := sbtu.SetupOrDieCustom("one", "one:sb", nil)
defer cleanup()
- // Open app/db (create both) as measured. Keep write permission on StreamDef.
+ // Open (create) db as measured. Keep write permission on StreamDef.
db, err := sbutil.CreateOrOpenDB(ctxMeasured, sbName, watchCollections)
if err != nil {
t.Fatalf("CreateOrOpenDB should have succeeded, got error: %v", err)
@@ -80,7 +80,7 @@
_, ctxMeasured, sbName, _, cleanup := sbtu.SetupOrDieCustom("one", "one:sb", nil)
defer cleanup()
- // Open app/db (create both) as measured. Keep write permission on StreamDef.
+ // Open (create) db as measured. Keep write permission on StreamDef.
db, err := sbutil.CreateOrOpenDB(ctxMeasured, sbName, watchCollections)
if err != nil {
t.Fatalf("CreateOrOpenDB should have succeeded, got error: %v", err)
diff --git a/go/src/v.io/x/sensorlog/internal/sbutil/syncbase.go b/go/src/v.io/x/sensorlog/internal/sbutil/syncbase.go
index d3d843f..e076030 100644
--- a/go/src/v.io/x/sensorlog/internal/sbutil/syncbase.go
+++ b/go/src/v.io/x/sensorlog/internal/sbutil/syncbase.go
@@ -10,6 +10,7 @@
"v.io/v23/context"
"v.io/v23/security"
"v.io/v23/security/access"
+ wire "v.io/v23/services/syncbase"
"v.io/v23/syncbase"
"v.io/v23/verror"
"v.io/x/sensorlog/internal/config"
@@ -17,7 +18,7 @@
)
// CreateOrOpenDB opens the Sensor Log database hosted on specified Syncbase
-// instance, creating it if missing, initializing specified collections.
+// instance, creating it if missing, and initializing specified collections.
func CreateOrOpenDB(ctx *context.T, sbService string, collections []sbmodel.CollectionSpec) (syncbase.Database, error) {
aclFull := access.Permissions{}
// Allow everyone to resolve to allow joining syncgroups.
@@ -32,25 +33,22 @@
AddPermsForPrincipal(&aclReadOnly, v23.GetPrincipal(ctx), access.Read, access.Admin)
sbs := syncbase.NewService(sbService)
- app := sbs.App(config.AppName)
- if err := createIfMissing(ctx, app, aclFull); err != nil {
- return nil, err
- }
-
+ // TODO(sadovsky): Refactor to reflect the change that eliminates the explicit
+ // app layer. For now, we simply use AppName as database Id.Blessing.
// TODO(ivanpi): Add schema version.
- db := app.Database(config.DBName, nil)
+ db := sbs.DatabaseForId(wire.Id{Blessing: config.AppName, Name: config.DBName}, nil)
if err := createIfMissing(ctx, db, aclFull); err != nil {
return nil, err
}
// TODO(ivanpi): Add schemas when available.
- for _, ts := range collections {
- tb := db.Collection(ts.Prototype.Collection())
+ for _, cs := range collections {
+ c := db.Collection(cs.Prototype.Collection())
acl := aclReadOnly
- if !ts.ReadOnly {
+ if !cs.ReadOnly {
acl = aclFull
}
- if err := createIfMissing(ctx, tb, acl); err != nil {
+ if err := createIfMissing(ctx, c, acl); err != nil {
return nil, err
}
}
@@ -58,8 +56,8 @@
return db, nil
}
-// creatable is satisfied by Syncbase hierarchy layers (app, db, collection)
-// that can be created and tested for existence.
+// creatable is satisfied by Syncbase hierarchy layers (db, collection) that can
+// be created and tested for existence.
type creatable interface {
Create(ctx *context.T, acl access.Permissions) error
Exists(ctx *context.T) (bool, error)
diff --git a/go/src/v.io/x/sensorlog/internal/sbutil/syncbase_test.go b/go/src/v.io/x/sensorlog/internal/sbutil/syncbase_test.go
index a31fa52..7f248e2 100644
--- a/go/src/v.io/x/sensorlog/internal/sbutil/syncbase_test.go
+++ b/go/src/v.io/x/sensorlog/internal/sbutil/syncbase_test.go
@@ -22,33 +22,16 @@
defer cleanup()
ctxGuest := sbtu.NewCtx(ctxOwner, rootPrincipal, "two")
- // Try to open app/db (create both) as guest, fail with ErrNoAccess.
+ // Try to open (create) db as guest, fail with ErrNoAccess.
if _, err := sbutil.CreateOrOpenDB(ctxGuest, sbName, sbmodel.MasterCollections); verror.ErrorID(err) != verror.ErrNoAccess.ID {
t.Errorf("CreateOrOpenDB should have failed with ErrNoAccess, got error: %v", err)
}
- // Open app/db (create both) as owner.
+ // Open (create) db as owner.
dbOwner, err := sbutil.CreateOrOpenDB(ctxOwner, sbName, sbmodel.MasterCollections)
if err != nil {
t.Fatalf("CreateOrOpenDB should have succeeded, got error: %v", err)
}
- // Open existing app/db as guest.
- if _, err := sbutil.CreateOrOpenDB(ctxGuest, sbName, sbmodel.MasterCollections); err != nil {
- t.Errorf("CreateOrOpenDB should have succeeded, got error: %v", err)
- }
- // Destroy db (but not app) to simulate interrupted creation.
- if err := dbOwner.Destroy(ctxOwner); err != nil {
- t.Errorf("dbOwner.Destroy should have succeeded, got error: %v", err)
- }
- // Try to open app/db (create db) as guest, fail with ErrNoAccess.
- if _, err := sbutil.CreateOrOpenDB(ctxGuest, sbName, sbmodel.MasterCollections); verror.ErrorID(err) != verror.ErrNoAccess.ID {
- t.Errorf("CreateOrOpenDB should have failed with ErrNoAccess, got error: %v", err)
- }
- // Open app/db (recreate db) as owner.
- dbOwner, err = sbutil.CreateOrOpenDB(ctxOwner, sbName, sbmodel.MasterCollections)
- if err != nil {
- t.Fatalf("CreateOrOpenDB should have succeeded, got error: %v", err)
- }
- // Open recreated app/db as guest.
+ // Open db as guest.
dbGuest, err := sbutil.CreateOrOpenDB(ctxGuest, sbName, sbmodel.MasterCollections)
if err != nil {
t.Errorf("CreateOrOpenDB should have succeeded, got error: %v", err)
@@ -63,10 +46,10 @@
t.Errorf("Unexpected database permissions: got %v, want %v", got, want)
}
// Check that all collections exist.
- for _, ts := range sbmodel.MasterCollections {
- tb := dbGuest.Collection(ts.Prototype.Collection())
- if exists, err := tb.Exists(ctxGuest); err != nil || !exists {
- t.Errorf("Expected collection %s to exist, got: %v (error: %v)", tb.Name(), exists, err)
+ for _, cs := range sbmodel.MasterCollections {
+ c := dbGuest.Collection(cs.Prototype.Collection())
+ if exists, err := c.Exists(ctxGuest); err != nil || !exists {
+ t.Errorf("Expected collection %s to exist, got: %v (error: %v)", c.Name(), exists, err)
}
}
}
@@ -75,7 +58,7 @@
_, ctxOwner, sbName, _, cleanup := sbtu.SetupOrDieCustom("one", "one:sb", nil)
defer cleanup()
- // Open app/db (create both) as owner.
+ // Open (create) db as owner.
dbOwner, err := sbutil.CreateOrOpenDB(ctxOwner, sbName, sbmodel.MeasuredCollections)
if err != nil {
t.Fatalf("CreateOrOpenDB should have succeeded, got error: %v", err)
@@ -89,19 +72,19 @@
Add(security.BlessingPattern("root:one"), string(access.Admin), string(access.Read))
// Check that all collections have correct permissions (full or readonly).
- for _, ts := range sbmodel.MeasuredCollections {
- tb := dbOwner.Collection(ts.Prototype.Collection())
- if exists, err := tb.Exists(ctxOwner); err != nil || !exists {
- t.Errorf("Expected collection %s to exist, got: %v (error: %v)", tb.Name(), exists, err)
+ for _, cs := range sbmodel.MeasuredCollections {
+ c := dbOwner.Collection(cs.Prototype.Collection())
+ if exists, err := c.Exists(ctxOwner); err != nil || !exists {
+ t.Errorf("Expected collection %s to exist, got: %v (error: %v)", c.Name(), exists, err)
}
want := expectPermsFull
- if ts.ReadOnly {
+ if cs.ReadOnly {
want = expectPermsReadOnly
}
- if got, err := tb.GetPermissions(ctxOwner); err != nil {
+ if got, err := c.GetPermissions(ctxOwner); err != nil {
t.Errorf("GetPermissions should have succeeded, got error: %v", err)
} else if got, want = got.Normalize(), want.Normalize(); !reflect.DeepEqual(got, want) {
- t.Errorf("Unexpected collection %s permissions: got %v, want %v", tb.Name(), got, want)
+ t.Errorf("Unexpected collection %s permissions: got %v, want %v", c.Name(), got, want)
}
}
}