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 {