veyron/runtimes/google/ipc: Switch everything to __Glob.

This is the 4th of a series of changes that add a simple
interface for objects to participate in the namespace.

With this change, the ipc Server no longer intercepts to the Glob
method. It now only intercepts __Glob.

The only left after this is to change (some of) the existing Glob
implementations to the simpler interface.

Change-Id: I0b9cbebc781e9793ef62f54e01da0f37847670af
diff --git a/lib/testutil/glob.go b/lib/testutil/glob.go
new file mode 100644
index 0000000..ecd078f
--- /dev/null
+++ b/lib/testutil/glob.go
@@ -0,0 +1,37 @@
+package testutil
+
+import (
+	"io"
+	"sort"
+
+	"veyron.io/veyron/veyron2/ipc"
+	"veyron.io/veyron/veyron2/rt"
+	"veyron.io/veyron/veyron2/services/mounttable/types"
+)
+
+// GlobName calls __Glob on the given object with the given pattern and returns
+// a sorted list of matching object names, or an error.
+func GlobName(name, pattern string) ([]string, error) {
+	call, err := rt.R().Client().StartCall(rt.R().NewContext(), name, ipc.GlobMethod, []interface{}{pattern})
+	if err != nil {
+		return nil, err
+	}
+	results := []string{}
+Loop:
+	for {
+		var me types.MountEntry
+		switch err := call.Recv(&me); err {
+		case nil:
+			results = append(results, me.Name)
+		case io.EOF:
+			break Loop
+		default:
+			return nil, err
+		}
+	}
+	sort.Strings(results)
+	if ferr := call.Finish(&err); ferr != nil {
+		err = ferr
+	}
+	return results, err
+}
diff --git a/runtimes/google/ipc/debug_test.go b/runtimes/google/ipc/debug_test.go
index 054696d..c9fff21 100644
--- a/runtimes/google/ipc/debug_test.go
+++ b/runtimes/google/ipc/debug_test.go
@@ -99,7 +99,7 @@
 	}
 	for _, tc := range testcases {
 		addr := naming.JoinAddressName(ep.String(), "//"+tc.name)
-		call, err := client.StartCall(ctx, addr, "Glob", []interface{}{tc.pattern})
+		call, err := client.StartCall(ctx, addr, ipc.GlobMethod, []interface{}{tc.pattern})
 		if err != nil {
 			t.Fatalf("client.StartCall failed: %v", err)
 		}
diff --git a/runtimes/google/ipc/glob_test.go b/runtimes/google/ipc/glob_test.go
index 654709d..44b7720 100644
--- a/runtimes/google/ipc/glob_test.go
+++ b/runtimes/google/ipc/glob_test.go
@@ -3,7 +3,6 @@
 import (
 	"fmt"
 	"reflect"
-	"sort"
 	"strings"
 	"testing"
 
@@ -12,10 +11,10 @@
 	"veyron.io/veyron/veyron2/naming"
 	"veyron.io/veyron/veyron2/rt"
 	"veyron.io/veyron/veyron2/security"
-	"veyron.io/veyron/veyron2/services/mounttable"
 	"veyron.io/veyron/veyron2/services/mounttable/types"
 
 	"veyron.io/veyron/veyron/lib/glob"
+	"veyron.io/veyron/veyron/lib/testutil"
 	"veyron.io/veyron/veyron/profiles"
 )
 
@@ -159,27 +158,15 @@
 		}},
 	}
 	for _, tc := range testcases {
-		c := mounttable.GlobbableClient(naming.JoinAddressName(ep, tc.name))
-
-		stream, err := c.Glob(runtime.NewContext(), tc.pattern)
+		name := naming.JoinAddressName(ep, tc.name)
+		results, err := testutil.GlobName(name, tc.pattern)
 		if err != nil {
-			t.Fatalf("Glob failed: %v", err)
+			t.Errorf("unexpected Glob error for (%q, %q): %v", tc.name, tc.pattern, err)
+			continue
 		}
-		results := []string{}
-		iterator := stream.RecvStream()
-		for iterator.Advance() {
-			results = append(results, iterator.Value().Name)
-		}
-		sort.Strings(results)
 		if !reflect.DeepEqual(results, tc.expected) {
 			t.Errorf("unexpected result for (%q, %q). Got %q, want %q", tc.name, tc.pattern, results, tc.expected)
 		}
-		if err := iterator.Err(); err != nil {
-			t.Errorf("unexpected stream error for %q: %v", tc.name, err)
-		}
-		if err := stream.Finish(); err != nil {
-			t.Errorf("Finish failed for %q: %v", tc.name, err)
-		}
 	}
 }
 
diff --git a/runtimes/google/ipc/server.go b/runtimes/google/ipc/server.go
index c5c9d02..522ead9 100644
--- a/runtimes/google/ipc/server.go
+++ b/runtimes/google/ipc/server.go
@@ -816,9 +816,7 @@
 // value may be modified to match the actual name and method to use.
 func (fs *flowServer) lookup(name, method *string) (ipc.Invoker, security.Authorizer, verror.E) {
 	*name = strings.TrimLeft(*name, "/")
-	// TODO(rthellend): Remove "Glob" from the condition below after
-	// everything has transitioned to the new name.
-	if *method == "Glob" || *method == ipc.GlobMethod {
+	if *method == ipc.GlobMethod {
 		*method = "Glob"
 		return ipc.ReflectInvoker(&globInternal{fs, *name}), &acceptAllAuthorizer{}, nil
 	}
diff --git a/runtimes/google/naming/namespace/glob.go b/runtimes/google/naming/namespace/glob.go
index 4083bb3..ed6cda2 100644
--- a/runtimes/google/naming/namespace/glob.go
+++ b/runtimes/google/naming/namespace/glob.go
@@ -8,6 +8,7 @@
 	"veyron.io/veyron/veyron/lib/glob"
 
 	"veyron.io/veyron/veyron2/context"
+	"veyron.io/veyron/veyron2/ipc"
 	"veyron.io/veyron/veyron2/naming"
 	"veyron.io/veyron/veyron2/options"
 	"veyron.io/veyron/veyron2/services/mounttable/types"
@@ -60,7 +61,7 @@
 		// Don't further resolve s.Server.
 		callCtx, _ := ctx.WithTimeout(callTimeout)
 		client := ns.rt.Client()
-		call, err := client.StartCall(callCtx, s.Server, "Glob", []interface{}{pstr}, options.NoResolve(true))
+		call, err := client.StartCall(callCtx, s.Server, ipc.GlobMethod, []interface{}{pstr}, options.NoResolve(true))
 		if err != nil {
 			lastErr = err
 			continue // try another instance
diff --git a/services/mgmt/debug/dispatcher_test.go b/services/mgmt/debug/dispatcher_test.go
index 4d6f6b9..9055d94 100644
--- a/services/mgmt/debug/dispatcher_test.go
+++ b/services/mgmt/debug/dispatcher_test.go
@@ -17,10 +17,10 @@
 	"veyron.io/veyron/veyron2/rt"
 	"veyron.io/veyron/veyron2/services/mgmt/logreader"
 	"veyron.io/veyron/veyron2/services/mgmt/stats"
-	"veyron.io/veyron/veyron2/services/mounttable"
 	"veyron.io/veyron/veyron2/verror"
 
 	libstats "veyron.io/veyron/veyron/lib/stats"
+	"veyron.io/veyron/veyron/lib/testutil"
 	"veyron.io/veyron/veyron/profiles"
 )
 
@@ -66,44 +66,23 @@
 
 	// Access a logs directory that exists.
 	{
-		ld := mounttable.GlobbableClient(naming.JoinAddressName(endpoint, "debug/logs"))
-		stream, err := ld.Glob(runtime.NewContext(), "*")
+		results, err := testutil.GlobName(naming.JoinAddressName(endpoint, "debug/logs"), "*")
 		if err != nil {
 			t.Errorf("Glob failed: %v", err)
 		}
-		results := []string{}
-		iterator := stream.RecvStream()
-		for count := 0; iterator.Advance(); count++ {
-			results = append(results, iterator.Value().Name)
-		}
 		if len(results) != 1 || results[0] != "test.INFO" {
 			t.Errorf("unexpected result. Got %v, want 'test.INFO'", results)
 		}
-		if err := iterator.Err(); err != nil {
-			t.Errorf("unexpected stream error: %v", iterator.Err())
-		}
-		if err := stream.Finish(); err != nil {
-			t.Errorf("Finish failed: %v", err)
-		}
 	}
 
 	// Access a logs directory that doesn't exist.
 	{
-		ld := mounttable.GlobbableClient(naming.JoinAddressName(endpoint, "debug/logs/nowheretobefound"))
-		stream, err := ld.Glob(runtime.NewContext(), "*")
-		if err != nil {
-			t.Errorf("Glob failed: %v", err)
-		}
-		results := []string{}
-		iterator := stream.RecvStream()
-		for count := 0; iterator.Advance(); count++ {
-			results = append(results, iterator.Value().Name)
-		}
+		results, err := testutil.GlobName(naming.JoinAddressName(endpoint, "debug/logs/nowheretobefound"), "*")
 		if len(results) != 0 {
 			t.Errorf("unexpected result. Got %v, want ''", results)
 		}
-		if expected, got := verror.NoExist, stream.Finish(); !verror.Is(got, expected) {
-			t.Errorf("unexpected error value, got %v, want: %v", got, expected)
+		if expected := verror.NoExist; !verror.Is(err, expected) {
+			t.Errorf("unexpected error value, got %v, want: %v", err, expected)
 		}
 	}
 
diff --git a/services/mgmt/node/impl/impl_test.go b/services/mgmt/node/impl/impl_test.go
index 7c8c79f..8367a64 100644
--- a/services/mgmt/node/impl/impl_test.go
+++ b/services/mgmt/node/impl/impl_test.go
@@ -36,7 +36,6 @@
 	"veyron.io/veyron/veyron2/services/mgmt/node"
 	"veyron.io/veyron/veyron2/services/mgmt/pprof"
 	"veyron.io/veyron/veyron2/services/mgmt/stats"
-	"veyron.io/veyron/veyron2/services/mounttable"
 	"veyron.io/veyron/veyron2/services/mounttable/types"
 	"veyron.io/veyron/veyron2/verror"
 	"veyron.io/veyron/veyron2/vlog"
@@ -1020,7 +1019,11 @@
 	logFileRemoveErrorFatalWarningRE := regexp.MustCompile("(ERROR|FATAL|WARNING)")
 	statsTrimRE := regexp.MustCompile("/stats/(ipc|system(/start-time.*)?)$")
 	for _, tc := range testcases {
-		results := doGlob(t, tc.name, tc.pattern)
+		results, err := testutil.GlobName(tc.name, tc.pattern)
+		if err != nil {
+			t.Errorf("unexpected glob error for (%q, %q): %v", tc.name, tc.pattern, err)
+			continue
+		}
 		filteredResults := []string{}
 		for _, name := range results {
 			// Keep only the stats object names that match this RE.
@@ -1044,7 +1047,10 @@
 	}
 
 	// Call Size() on the log file objects.
-	files := doGlob(t, "nm", "apps/google naps/"+installID+"/"+instance1ID+"/logs/*")
+	files, err := testutil.GlobName("nm", "apps/google naps/"+installID+"/"+instance1ID+"/logs/*")
+	if err != nil {
+		t.Errorf("unexpected glob error: %v", err)
+	}
 	if want, got := 4, len(files); got < want {
 		t.Errorf("Unexpected number of matches. Got %d, want at least %d", got, want)
 	}
@@ -1057,7 +1063,10 @@
 	}
 
 	// Call Value() on some of the stats objects.
-	objects := doGlob(t, "nm", "apps/google naps/"+installID+"/"+instance1ID+"/stats/system/start-time*")
+	objects, err := testutil.GlobName("nm", "apps/google naps/"+installID+"/"+instance1ID+"/stats/system/start-time*")
+	if err != nil {
+		t.Errorf("unexpected glob error: %v", err)
+	}
 	if want, got := 2, len(objects); got != want {
 		t.Errorf("Unexpected number of matches. Got %d, want %d", got, want)
 	}
@@ -1086,26 +1095,6 @@
 	}
 }
 
-func doGlob(t *testing.T, name, pattern string) []string {
-	c := mounttable.GlobbableClient(name)
-	stream, err := c.Glob(rt.R().NewContext(), pattern)
-	if err != nil {
-		t.Errorf("Glob failed: %v", err)
-	}
-	results := []string{}
-	iterator := stream.RecvStream()
-	for iterator.Advance() {
-		results = append(results, iterator.Value().Name)
-	}
-	if err := iterator.Err(); err != nil {
-		t.Errorf("unexpected stream error: %v", err)
-	}
-	if err := stream.Finish(); err != nil {
-		t.Errorf("Finish failed: %v", err)
-	}
-	return results
-}
-
 func listAndVerifyAssociations(t *testing.T, stub node.NodeClientMethods, run veyron2.Runtime, expected []node.Association) {
 	assocs, err := stub.ListAssociations(run.NewContext())
 	if err != nil {