Make the Syncgroup factory methods like the ones for Collection

There is currently a Database.Syncgroup(wire.Id) factory method,
change it to be consistent with Collection.SyncgroupForId/Syncgroup,
where Syncgroup() takes a name and context and the user blessing
is pulled from the context.

MultiPart: 1/3
Change-Id: Ic3e641888193bcf0682959d5f05353e1957de470
diff --git a/syncbase/.api b/syncbase/.api
index c095dec..91c3597 100644
--- a/syncbase/.api
+++ b/syncbase/.api
@@ -186,7 +186,8 @@
 pkg syncbase, type Database interface, ListSyncgroups(*context.T) ([]wire.Id, error)
 pkg syncbase, type Database interface, PauseSync(*context.T) error
 pkg syncbase, type Database interface, ResumeSync(*context.T) error
-pkg syncbase, type Database interface, Syncgroup(wire.Id) Syncgroup
+pkg syncbase, type Database interface, Syncgroup(*context.T, string) Syncgroup
+pkg syncbase, type Database interface, SyncgroupForId(wire.Id) Syncgroup
 pkg syncbase, type Database interface, Watch(*context.T, wire.Id, string, watch.ResumeMarker) (WatchStream, error)
 pkg syncbase, type Database interface, unexported methods
 pkg syncbase, type DatabaseHandle interface { Collection, CollectionForId, Exec, FullName, GetResumeMarker, Id, ListCollections }
diff --git a/syncbase/database.go b/syncbase/database.go
index f9390fe..ed66afa 100644
--- a/syncbase/database.go
+++ b/syncbase/database.go
@@ -120,11 +120,21 @@
 	return newWatchStream(cancel, call), nil
 }
 
-// Syncgroup implements Database.Syncgroup.
-func (d *database) Syncgroup(id wire.Id) Syncgroup {
+// SyncgroupForId implements Database.SyncgroupForId.
+func (d *database) SyncgroupForId(id wire.Id) Syncgroup {
 	return newSyncgroup(d.fullName, id)
 }
 
+// Syncgroup implements Database.Syncgroup.
+func (d *database) Syncgroup(ctx *context.T, name string) Syncgroup {
+	blessing, err := util.UserBlessingFromContext(ctx)
+	if err != nil {
+		// TODO(sadovsky): Return invalid Syncgroup handle.
+		panic(err)
+	}
+	return newSyncgroup(d.fullName, wire.Id{Name: name, Blessing: blessing})
+}
+
 // ListSyncgroups implements Database.ListSyncgroups.
 func (d *database) ListSyncgroups(ctx *context.T) ([]wire.Id, error) {
 	return d.c.ListSyncgroups(ctx)
diff --git a/syncbase/featuretests/test_util_test.go b/syncbase/featuretests/test_util_test.go
index 4dfb212..c5576db 100644
--- a/syncbase/featuretests/test_util_test.go
+++ b/syncbase/featuretests/test_util_test.go
@@ -245,7 +245,7 @@
 		MountTables: []string{mtName},
 	}
 
-	sg := d.Syncgroup(sgId)
+	sg := d.SyncgroupForId(sgId)
 	info := wire.SyncgroupMemberInfo{SyncPriority: 8}
 	if err := sg.Create(ctx, spec, info); err != nil {
 		return fmt.Errorf("{%q, %v} sg.Create() failed: %v", syncbaseName, sgId, err)
@@ -255,7 +255,7 @@
 
 func joinSyncgroup(ctx *context.T, sbNameLocal, sbNameRemote string, sgId wire.Id) error {
 	d := syncbase.NewService(sbNameLocal).DatabaseForId(testDb, nil)
-	sg := d.Syncgroup(sgId)
+	sg := d.SyncgroupForId(sgId)
 	info := wire.SyncgroupMemberInfo{SyncPriority: 10}
 	if _, err := sg.Join(ctx, sbNameRemote, "", info); err != nil {
 		return fmt.Errorf("{%q, %q} sg.Join() failed: %v", sbNameRemote, sgId, err)
@@ -265,7 +265,7 @@
 
 func verifySyncgroupMembers(ctx *context.T, syncbaseName string, sgId wire.Id, wantMembers int) error {
 	d := syncbase.NewService(syncbaseName).DatabaseForId(testDb, nil)
-	sg := d.Syncgroup(sgId)
+	sg := d.SyncgroupForId(sgId)
 
 	var gotMembers int
 	for i := 0; i < 8; i++ {
diff --git a/syncbase/model.go b/syncbase/model.go
index a0a60ee..b8c0724 100644
--- a/syncbase/model.go
+++ b/syncbase/model.go
@@ -155,11 +155,12 @@
 	// returns just a ScanStream.
 	Watch(ctx *context.T, collection wire.Id, prefix string, resumeMarker watch.ResumeMarker) (WatchStream, error)
 
-	// Syncgroup returns a handle to the syncgroup with the given Id.
-	// TODO(fredq): change this to SyncgroupForId and add a Syncgroup method that just
-	// takes a name, similar to Database.Collection/CollectionForId and
-	// Service.Database/DatabaseForId, extracting the user blessing from the context.
-	Syncgroup(id wire.Id) Syncgroup
+	// SyncgroupForId returns a handle to the syncgroup with the given Id.
+	SyncgroupForId(id wire.Id) Syncgroup
+
+	// Syncgroup returns a handle to the syncgroup with the given name and with the user
+	// blessing.
+	Syncgroup(ctx *context.T, name string) Syncgroup
 
 	// ListSyncgroups returns all Syncgroups attached to this database.
 	ListSyncgroups(ctx *context.T) ([]wire.Id, error)
diff --git a/syncbase/syncgroup_test.go b/syncbase/syncgroup_test.go
index efa3212..b591b4f 100644
--- a/syncbase/syncgroup_test.go
+++ b/syncbase/syncgroup_test.go
@@ -176,7 +176,7 @@
 	spec.Description = "test syncgroup sg1 update"
 	spec.Perms = perms("root:client", "root:client1")
 
-	sg := d.Syncgroup(sgId)
+	sg := d.SyncgroupForId(sgId)
 	if err := sg.SetSpec(ctx, spec, ""); err != nil {
 		t.Fatalf("sg.SetSpec failed: %v", err)
 	}
@@ -187,7 +187,7 @@
 // Helpers.
 
 func createSyncgroup(t *testing.T, ctx *context.T, d syncbase.Database, sgId wire.Id, spec wire.SyncgroupSpec, errID verror.ID) syncbase.Syncgroup {
-	sg := d.Syncgroup(sgId)
+	sg := d.SyncgroupForId(sgId)
 	info := wire.SyncgroupMemberInfo{SyncPriority: 8}
 	if err := sg.Create(ctx, spec, info); verror.ErrorID(err) != errID {
 		tu.Fatalf(t, "Create SG %+v failed: %v", sgId, err)
@@ -196,7 +196,7 @@
 }
 
 func joinSyncgroup(t *testing.T, ctx *context.T, d syncbase.Database, sbName string, sgId wire.Id, wantErr verror.ID) syncbase.Syncgroup {
-	sg := d.Syncgroup(sgId)
+	sg := d.SyncgroupForId(sgId)
 	info := wire.SyncgroupMemberInfo{SyncPriority: 10}
 	if _, err := sg.Join(ctx, sbName, "", info); verror.ErrorID(err) != wantErr {
 		tu.Fatalf(t, "Join SG %v failed: %v", sgId, err)
@@ -215,7 +215,7 @@
 }
 
 func verifySyncgroupInfo(t *testing.T, ctx *context.T, d syncbase.Database, sgId wire.Id, wantSpec wire.SyncgroupSpec, wantMembers int) {
-	sg := d.Syncgroup(sgId)
+	sg := d.SyncgroupForId(sgId)
 	gotSpec, _, err := sg.GetSpec(ctx)
 	if err != nil || !reflect.DeepEqual(gotSpec, wantSpec) {
 		t.Fatalf("sg.GetSpec() failed, got %v, want %v, err %v", gotSpec, wantSpec, err)
diff --git a/syncbase/syncgroup_v23_test.go b/syncbase/syncgroup_v23_test.go
index 8324b13..7554077 100644
--- a/syncbase/syncgroup_v23_test.go
+++ b/syncbase/syncgroup_v23_test.go
@@ -596,7 +596,7 @@
 		MountTables: mtNames,
 	}
 
-	sg := d.Syncgroup(wire.Id{Name: sgName, Blessing: "blessing"})
+	sg := d.SyncgroupForId(wire.Id{Name: sgName, Blessing: "blessing"})
 	info := wire.SyncgroupMemberInfo{SyncPriority: 8}
 	if err := sg.Create(ctx, spec, info); err != nil {
 		return fmt.Errorf("Create SG %v failed: %v\n", sgName, err)
@@ -606,7 +606,7 @@
 
 func runJoinSyncgroup(ctx *context.T, sbNameLocal, sbNameRemote, sgName string) error {
 	d := dbHandle(sbNameLocal)
-	sg := d.Syncgroup(wire.Id{Name: sgName, Blessing: "blessing"})
+	sg := d.SyncgroupForId(wire.Id{Name: sgName, Blessing: "blessing"})
 	info := wire.SyncgroupMemberInfo{SyncPriority: 10}
 	if _, err := sg.Join(ctx, sbNameRemote, "", info); err != nil {
 		return fmt.Errorf("Join SG %q, %q failed: %v\n", sbNameRemote, sgName, err)
@@ -616,7 +616,7 @@
 
 func runSetSyncgroupSpec(ctx *context.T, serviceName, sbName, sgName, sgDesc, sgPrefixes string, sgBlessings ...string) error {
 	d := dbHandle(serviceName)
-	sg := d.Syncgroup(wire.Id{Name: sgName, Blessing: "blessing"})
+	sg := d.SyncgroupForId(wire.Id{Name: sgName, Blessing: "blessing"})
 
 	mtNames := v23.GetNamespace(ctx).Roots()
 	spec := wire.SyncgroupSpec{
@@ -634,7 +634,7 @@
 
 func runGetSyncgroupSpec(ctx *context.T, serviceName, sbName, sgName, wantDesc, wantPrefixes string, wantBlessings ...string) error {
 	d := dbHandle(serviceName)
-	sg := d.Syncgroup(wire.Id{Name: sgName, Blessing: "blessing"})
+	sg := d.SyncgroupForId(wire.Id{Name: sgName, Blessing: "blessing"})
 
 	wantPfxs := toSgPrefixes(wantPrefixes)
 	wantPerms := perms(wantBlessings...)
@@ -659,7 +659,7 @@
 
 func runGetSyncgroupMembers(ctx *context.T, serviceName, sbName, sgName string, wantMembers uint64) error {
 	d := dbHandle(serviceName)
-	sg := d.Syncgroup(wire.Id{Name: sgName, Blessing: "blessing"})
+	sg := d.SyncgroupForId(wire.Id{Name: sgName, Blessing: "blessing"})
 
 	var gotMembers uint64
 	var members map[string]wire.SyncgroupMemberInfo
@@ -1134,7 +1134,7 @@
 				MountTables: mtNames,
 			}
 
-			sg := d.Syncgroup(wire.Id{Name: sgName, Blessing: "blessing"})
+			sg := d.SyncgroupForId(wire.Id{Name: sgName, Blessing: "blessing"})
 			info := wire.SyncgroupMemberInfo{SyncPriority: 8}
 			if err := sg.Create(ctx, spec, info); err != nil {
 				return fmt.Errorf("Create SG %q failed: %v\n", sgName, err)
@@ -1156,7 +1156,7 @@
 			d := svc.DatabaseForId(wire.Id{appName, dbName}, nil)
 
 			sgName := fmt.Sprintf("%s_%s", appName, dbName)
-			sg := d.Syncgroup(wire.Id{Name: sgName, Blessing: "blessing"})
+			sg := d.SyncgroupForId(wire.Id{Name: sgName, Blessing: "blessing"})
 			info := wire.SyncgroupMemberInfo{SyncPriority: 10}
 			if _, err := sg.Join(ctx, sbNameRemote, "", info); err != nil {
 				return fmt.Errorf("Join SG Multi %q failed: %v\n", sgName, err)