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)
 		}
 	}
 }