Merge "switch to go1.4"
diff --git a/lib/modules/core/core.go b/lib/modules/core/core.go
index a3a889c..0a49e3e 100644
--- a/lib/modules/core/core.go
+++ b/lib/modules/core/core.go
@@ -5,7 +5,8 @@
//
// root
// runs a root mount table as a subprocess
-// prints the MT_NAME=<root name>, PID=<pid> variables to stdout
+// prints the PID=<pid> variable to stdout followed by
+// an arbitrary number of MT_NAME and MT_ADDR variables.
// waits for stdin to be closed before it exits
// prints "done" to stdout when stdin is closed.
// mt <mp>
@@ -40,7 +41,9 @@
//
// echoServer <message> <name>
// runs on echoServer at <name>, it will echo back <message>: <text>
-// where <text> is supplied by the client
+// where <text> is supplied by the client. It prints the PID=<pid>
+// variable to stdout followd by an arbitrary number of NAME, ADDR
+// variables.
// echoClient <name> <text>
// invoke <name>.Echo(<text>)
//
diff --git a/lib/modules/core/core_test.go b/lib/modules/core/core_test.go
index cd9e26b..f00a65a 100644
--- a/lib/modules/core/core_test.go
+++ b/lib/modules/core/core_test.go
@@ -34,6 +34,8 @@
testutil.Init()
}
+// TODO(cnicolaou): add test for proxyd
+
func newShell(t *testing.T) (*modules.Shell, func()) {
sh, err := modules.NewShell(nil)
if err != nil {
@@ -62,9 +64,9 @@
t.Fatalf("unexpected error: %s", err)
}
s := expect.NewSession(t, root.Stdout(), time.Second)
+ s.ExpectVar("PID")
s.ExpectVar("MT_NAME")
s.ExpectVar("MT_ADDR")
- s.ExpectVar("PID")
root.CloseStdin()
}
@@ -76,6 +78,7 @@
}
sh.Forget(root)
rootSession := expect.NewSession(t, root.Stdout(), time.Minute)
+ rootSession.ExpectVar("PID")
rootName := rootSession.ExpectVar("MT_NAME")
if t.Failed() {
return nil, nil, rootSession.Error()
@@ -93,6 +96,7 @@
s := expect.NewSession(t, h.Stdout(), time.Minute)
// Wait until each mount table has at least called Serve to
// mount itself.
+ s.ExpectVar("PID")
mountAddrs[mp] = s.ExpectVar("MT_NAME")
if s.Failed() {
return nil, nil, s.Error()
@@ -179,6 +183,7 @@
t.Fatalf("unexpected error: %s", err)
}
srvSession := expect.NewSession(t, srv.Stdout(), time.Minute)
+ srvSession.ExpectVar("PID")
name := srvSession.ExpectVar("NAME")
if len(name) == 0 {
t.Fatalf("failed to get name")
diff --git a/lib/modules/core/echo.go b/lib/modules/core/echo.go
index 5f82c34..c8c432c 100644
--- a/lib/modules/core/echo.go
+++ b/lib/modules/core/echo.go
@@ -68,16 +68,18 @@
return err
}
defer server.Stop()
- ep, err := server.Listen(initListenSpec(fl))
+ eps, err := server.Listen(initListenSpec(fl))
if err != nil {
return err
}
if err := server.ServeDispatcher(mp, disp); err != nil {
return err
}
- fmt.Fprintf(stdout, "NAME=%s\n", naming.JoinAddressName(ep.String(), ""))
- fmt.Fprintf(stdout, "ADDR=%s\n", ep.String())
fmt.Fprintf(stdout, "PID=%d\n", os.Getpid())
+ for _, ep := range eps {
+ fmt.Fprintf(stdout, "NAME=%s\n", naming.JoinAddressName(ep.String(), ""))
+ fmt.Fprintf(stdout, "ADDR=%s\n", ep)
+ }
modules.WaitForEOF(stdin)
return nil
}
diff --git a/lib/modules/core/mounttable.go b/lib/modules/core/mounttable.go
index 066cf10..26a65e3 100644
--- a/lib/modules/core/mounttable.go
+++ b/lib/modules/core/mounttable.go
@@ -58,17 +58,19 @@
if err != nil {
return fmt.Errorf("mounttable.NewMountTable failed: %s", err)
}
- ep, err := server.Listen(lspec)
+ eps, err := server.Listen(lspec)
if err != nil {
return fmt.Errorf("server.Listen failed: %s", err)
}
if err := server.ServeDispatcher(mp, mt); err != nil {
return fmt.Errorf("root failed: %s", err)
}
- name := naming.JoinAddressName(ep.String(), "")
- fmt.Fprintf(stdout, "MT_NAME=%s\n", name)
- fmt.Fprintf(stdout, "MT_ADDR=%s\n", ep.String())
fmt.Fprintf(stdout, "PID=%d\n", os.Getpid())
+ for _, ep := range eps {
+ name := naming.JoinAddressName(ep.String(), "")
+ fmt.Fprintf(stdout, "MT_NAME=%s\n", name)
+ fmt.Fprintf(stdout, "MT_ADDR=%s\n", ep.String())
+ }
modules.WaitForEOF(stdin)
return nil
}
diff --git a/lib/modules/core/proxy.go b/lib/modules/core/proxy.go
index 3a46b47..4ec2a2c 100644
--- a/lib/modules/core/proxy.go
+++ b/lib/modules/core/proxy.go
@@ -3,6 +3,7 @@
import (
"fmt"
"io"
+ "os"
"time"
"veyron.io/veyron/veyron2/naming"
@@ -40,6 +41,7 @@
defer proxy.Shutdown()
pname := naming.JoinAddressName(proxy.Endpoint().String(), "")
+ fmt.Fprintf(stdout, "PID=%d\n", os.Getpid())
fmt.Fprintf(stdout, "PROXY_ADDR=%s\n", proxy.Endpoint().String())
fmt.Fprintf(stdout, "PROXY_NAME=%s\n", pname)
if expected > 0 {
diff --git a/lib/signals/signals_test.go b/lib/signals/signals_test.go
index 693e425..635bac8 100644
--- a/lib/signals/signals_test.go
+++ b/lib/signals/signals_test.go
@@ -323,14 +323,14 @@
t.Fatalf("Got error: %v", err)
}
ch := make(chan string)
- var ep naming.Endpoint
+ var ep []naming.Endpoint
if ep, err = server.Listen(profiles.LocalListenSpec); err != nil {
t.Fatalf("Got error: %v", err)
}
if err := server.Serve("", device.ConfigServer(&configServer{ch}), vflag.NewAuthorizerOrDie()); err != nil {
t.Fatalf("Got error: %v", err)
}
- return server, naming.JoinAddressName(ep.String(), ""), ch
+ return server, naming.JoinAddressName(ep[0].String(), ""), ch
}
diff --git a/lib/testutil/integration/util.go b/lib/testutil/integration/util.go
index 05ab2e2..b535576 100644
--- a/lib/testutil/integration/util.go
+++ b/lib/testutil/integration/util.go
@@ -62,6 +62,10 @@
return nil, "", err
}
s := expect.NewSession(nil, handle.Stdout(), time.Second)
+ s.ExpectVar("PID")
+ if err := s.Error(); err != nil {
+ return nil, "", err
+ }
name := s.ExpectVar("MT_NAME")
if err := s.Error(); err != nil {
return nil, "", err
@@ -70,10 +74,7 @@
if err := s.Error(); err != nil {
return nil, "", err
}
- s.ExpectVar("PID")
- if err := s.Error(); err != nil {
- return nil, "", err
- }
+
return handle, name, nil
}
diff --git a/lib/testutil/security/util_test.go b/lib/testutil/security/util_test.go
index 67bf51e..06fc209 100644
--- a/lib/testutil/security/util_test.go
+++ b/lib/testutil/security/util_test.go
@@ -30,15 +30,11 @@
fmt.Errorf("got principal from directory: %v, want: %v", pFromCred, wantPrincipal)
}
- // TODO(ashankar,ataly): Extract blessings using the principal.BlessingInfo API
- // instead of blessings.ForContext.
- ctx := security.NewContext(&security.ContextParams{
- LocalPrincipal: pFromCred,
- })
- if got := pFromCred.BlessingStore().ForPeer("foo").ForContext(ctx); !unsortedEquals(got, wantBlessings) {
+ bs := pFromCred.BlessingStore()
+ if got := pFromCred.BlessingsInfo(bs.ForPeer("foo")); !unsortedEquals(got, wantBlessings) {
return fmt.Errorf("got peer blessings: %v, want: %v", got, wantBlessings)
}
- if got := pFromCred.BlessingStore().Default().ForContext(ctx); !unsortedEquals(got, wantBlessings) {
+ if got := pFromCred.BlessingsInfo(bs.Default()); !unsortedEquals(got, wantBlessings) {
return fmt.Errorf("got default blessings: %v, want: %v", got, wantBlessings)
}
return nil
diff --git a/runtimes/google/ipc/benchmarks/server.go b/runtimes/google/ipc/benchmarks/server.go
index 44a5d4e..879ca54 100644
--- a/runtimes/google/ipc/benchmarks/server.go
+++ b/runtimes/google/ipc/benchmarks/server.go
@@ -36,7 +36,7 @@
if err != nil {
vlog.Fatalf("NewServer failed: %v", err)
}
- ep, err := server.Listen(listenSpec)
+ eps, err := server.Listen(listenSpec)
if err != nil {
vlog.Fatalf("Listen failed: %v", err)
}
@@ -44,7 +44,7 @@
if err := server.Serve("", BenchmarkServer(&impl{}), sflag.NewAuthorizerOrDie()); err != nil {
vlog.Fatalf("Serve failed: %v", err)
}
- return naming.JoinAddressName(ep.String(), ""), func() {
+ return naming.JoinAddressName(eps[0].String(), ""), func() {
if err := server.Stop(); err != nil {
vlog.Fatalf("Stop() failed: %v", err)
}
diff --git a/runtimes/google/ipc/client_test.go b/runtimes/google/ipc/client_test.go
index e8fb20f..2499915 100644
--- a/runtimes/google/ipc/client_test.go
+++ b/runtimes/google/ipc/client_test.go
@@ -51,6 +51,7 @@
sh.Forget(root)
rootSession := expect.NewSession(t, root.Stdout(), time.Minute)
+ rootSession.ExpectVar("PID")
rootName := rootSession.ExpectVar("MT_NAME")
if t.Failed() {
t.Fatalf("%s", rootSession.Error())
@@ -105,6 +106,7 @@
t.Fatalf("unexpected error: %s", err)
}
s := expect.NewSession(t, srv.Stdout(), time.Minute)
+ s.ExpectVar("PID")
s.ExpectVar("NAME")
// Verify that there are 1 entries for echoServer in the mount table.
@@ -182,12 +184,12 @@
done := make(chan struct{})
deferFn := func() { close(done); server.Stop() }
- ep, err := server.Listen(profiles.LocalListenSpec)
+ eps, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
server.Serve("", &simple{done}, nil)
- name := naming.JoinAddressName(ep.String(), "")
+ name := naming.JoinAddressName(eps[0].String(), "")
return name, deferFn
}
@@ -219,7 +221,7 @@
ctx, _ := r.NewContext().WithTimeout(100 * time.Millisecond)
call, err := r.Client().StartCall(ctx, name, "Sleep", nil)
if err != nil {
- testForVerror(t, err, verror.Timeout)
+ testForVerror(t, err, verror.Timeout, verror.BadProtocol)
return
}
verr := call.Finish(&err)
@@ -315,6 +317,7 @@
time.Sleep(10 * time.Millisecond)
srv, _ := sh.Start(core.EchoServerCommand, nil, testArgs("message", name)...)
s := expect.NewSession(t, srv.Stdout(), time.Minute)
+ s.ExpectVar("PID")
s.ExpectVar("NAME")
}
go startServer()
diff --git a/runtimes/google/ipc/debug_test.go b/runtimes/google/ipc/debug_test.go
index 8b2cacf..966952f 100644
--- a/runtimes/google/ipc/debug_test.go
+++ b/runtimes/google/ipc/debug_test.go
@@ -43,7 +43,7 @@
}
defer server.Stop()
server.Serve("", &testObject{}, nil)
- ep, err := server.Listen(listenSpec)
+ eps, err := server.Listen(listenSpec)
if err != nil {
t.Fatalf("server.Listen failed: %v", err)
}
@@ -53,6 +53,7 @@
}
defer client.Close()
ctx := testContext()
+ ep := eps[0]
// Call the Foo method on ""
{
addr := naming.JoinAddressName(ep.String(), "")
diff --git a/runtimes/google/ipc/full_test.go b/runtimes/google/ipc/full_test.go
index 729b8c6..746b578 100644
--- a/runtimes/google/ipc/full_test.go
+++ b/runtimes/google/ipc/full_test.go
@@ -202,7 +202,7 @@
if err := server.AddName(name); err != nil {
t.Errorf("server.AddName for discharger failed: %v", err)
}
- return ep, server
+ return ep[0], server
}
func loc(d int) string {
@@ -245,7 +245,7 @@
// Check that we can no longer serve after Stop.
err := server.AddName("name doesn't matter")
- if err == nil || err.Error() != "ipc: server is stopped" {
+ if err == nil || !verror.Is(err, verror.BadState.ID) {
t.Errorf("either no error, or a wrong error was returned: %v", err)
}
vlog.VI(1).Info("server.Stop DONE")
@@ -772,7 +772,7 @@
t.Fatal(err)
}
defer appServer.Stop()
- ep, err := appServer.Listen(listenSpec)
+ eps, err := appServer.Listen(listenSpec)
if err != nil {
t.Fatal(err)
}
@@ -791,7 +791,7 @@
// can go away, but till then, this workaround allows the test to be
// more predictable by ensuring there is only one VIF/VC/Flow to the
// server.
- object := naming.JoinAddressName(ep.String(), "object") // instead of "mountpoint/object"
+ object := naming.JoinAddressName(eps[0].String(), "object") // instead of "mountpoint/object"
if err := appServer.Serve("mountpoint/object", &testServer{}, &testServerAuthorizer{}); err != nil {
t.Fatal(err)
}
@@ -1231,15 +1231,16 @@
t.Errorf("InternalNewServer failed: %v", err)
}
defer server.Stop()
+
spec := ipc.ListenSpec{
Addrs: ipc.ListenAddrs{{"tcp", ":0"}},
AddressChooser: pa,
}
- ep, err := server.Listen(spec)
+ eps, err := server.Listen(spec)
if err != nil {
t.Errorf("unexpected error: %s", err)
}
- iep := ep.(*inaming.Endpoint)
+ iep := eps[0].(*inaming.Endpoint)
host, _, err := net.SplitHostPort(iep.Address)
if err != nil {
t.Errorf("unexpected error: %s", err)
@@ -1248,8 +1249,8 @@
t.Errorf("got %q, want %q", got, want)
}
// Won't override the specified address.
- ep, err = server.Listen(listenSpec)
- iep = ep.(*inaming.Endpoint)
+ eps, err = server.Listen(listenSpec)
+ iep = eps[0].(*inaming.Endpoint)
host, _, err = net.SplitHostPort(iep.Address)
if err != nil {
t.Errorf("unexpected error: %s", err)
@@ -1275,8 +1276,8 @@
Addrs: ipc.ListenAddrs{{"tcp", ":0"}},
AddressChooser: paerr,
}
- ep, err := server.Listen(spec)
- iep := ep.(*inaming.Endpoint)
+ eps, err := server.Listen(spec)
+ iep := eps[0].(*inaming.Endpoint)
host, _, err := net.SplitHostPort(iep.Address)
if err != nil {
t.Errorf("unexpected error: %s", err)
diff --git a/runtimes/google/ipc/glob_test.go b/runtimes/google/ipc/glob_test.go
index cf2c0e4..3800b49 100644
--- a/runtimes/google/ipc/glob_test.go
+++ b/runtimes/google/ipc/glob_test.go
@@ -22,14 +22,14 @@
if err != nil {
return "", nil, fmt.Errorf("failed to start debug server: %v", err)
}
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
return "", nil, fmt.Errorf("failed to listen: %v", err)
}
if err := server.ServeDispatcher("", &disp{tree}); err != nil {
return "", nil, err
}
- ep := endpoint.String()
+ ep := endpoints[0].String()
return ep, func() { server.Stop() }, nil
}
diff --git a/runtimes/google/ipc/server.go b/runtimes/google/ipc/server.go
index 98b161e..692e1f4 100644
--- a/runtimes/google/ipc/server.go
+++ b/runtimes/google/ipc/server.go
@@ -17,7 +17,8 @@
"veyron.io/veyron/veyron2/options"
"veyron.io/veyron/veyron2/security"
"veyron.io/veyron/veyron2/services/security/access"
- "veyron.io/veyron/veyron2/verror"
+ old_verror "veyron.io/veyron/veyron2/verror"
+ verror "veyron.io/veyron/veyron2/verror2"
"veyron.io/veyron/veyron2/vlog"
"veyron.io/veyron/veyron2/vom"
"veyron.io/veyron/veyron2/vom2"
@@ -29,11 +30,15 @@
"veyron.io/veyron/veyron/runtimes/google/lib/publisher"
inaming "veyron.io/veyron/veyron/runtimes/google/naming"
ivtrace "veyron.io/veyron/veyron/runtimes/google/vtrace"
+
+ // TODO(cnicolaou): finish verror -> verror2 transition, in particular
+ // for communicating from server to client.
+ // TODO(cnicolaou): remove the vom1 code now that vom2 is in place.
)
var (
// TODO(cnicolaou): this should be BadState in verror2.
- errServerStopped = verror.Abortedf("ipc: server is stopped")
+ errServerStopped = old_verror.Abortedf("ipc: server is stopped")
)
type server struct {
@@ -135,7 +140,7 @@
s.Lock()
defer s.Unlock()
if s.stopped {
- return nil, errServerStopped
+ return nil, s.newBadState("ipc.Server.Stop already called")
}
return s.publisher.Published(), nil
}
@@ -300,14 +305,65 @@
}
*/
-func (s *server) Listen(listenSpec ipc.ListenSpec) (naming.Endpoint, error) {
+type listenError struct {
+ err verror.E
+ errors map[struct{ Protocol, Address string }]error
+}
+
+func newError() *listenError {
+ return &listenError{errors: make(map[struct{ Protocol, Address string }]error)}
+}
+
+func ErrorDetails(le *listenError) map[struct{ Protocol, Address string }]error {
+ return le.errors
+}
+
+// Implements error
+func (le *listenError) Error() string {
+ s := le.err.Error()
+ for k, v := range le.errors {
+ s += fmt.Sprintf("(%s,%s:%s) ", k.Protocol, k.Address, v)
+ }
+ return strings.TrimRight(s, " ")
+}
+
+func (le *listenError) ErrorID() old_verror.ID {
+ return le.err.ErrorID()
+}
+
+func (le *listenError) Action() verror.ActionCode {
+ return le.err.Action()
+}
+
+func (le *listenError) Params() []interface{} {
+ return le.err.Params()
+}
+
+func (le *listenError) HasMessage() bool {
+ return le.err.HasMessage()
+}
+
+func (le *listenError) Stack() verror.PCs {
+ return le.err.Stack()
+}
+
+func (s *server) newBadState(m string) *listenError {
+ return &listenError{err: verror.Make(verror.BadState, s.ctx, m)}
+}
+
+func (s *server) newBadArg(m string) *listenError {
+ return &listenError{err: verror.Make(verror.BadArg, s.ctx, m)}
+}
+
+func (s *server) Listen(listenSpec ipc.ListenSpec) ([]naming.Endpoint, error) {
defer vlog.LogCall()()
s.Lock()
+
// Shortcut if the server is stopped, to avoid needlessly creating a
// listener.
if s.stopped {
s.Unlock()
- return nil, errServerStopped
+ return nil, s.newBadState("ipc.Server.Stop already called")
}
useProxy := len(listenSpec.Proxy) > 0
@@ -410,11 +466,12 @@
s.active.Done()
}(li.ln, li.ep)
}
- for _, iep := range ieps {
+ eps := make([]naming.Endpoint, len(ieps))
+ for i, iep := range ieps {
s.publisher.AddServer(naming.JoinAddressName(iep.String(), ""), s.servesMountTable)
+ eps[i] = iep
}
-
- return ieps[0], nil
+ return eps, nil
}
func (s *server) reconnectAndPublishProxy(proxy string) (*inaming.Endpoint, stream.Listener, error) {
@@ -585,7 +642,7 @@
if obj == nil {
// The ReflectInvoker inside the LeafDispatcher will panic
// if called for a nil value.
- return fmt.Errorf("A nil object is not allowed")
+ return s.newBadArg("nil object")
}
return s.ServeDispatcher(name, ipc.LeafDispatcher(obj, authorizer))
}
@@ -596,13 +653,13 @@
ivtrace.FromContext(s.ctx).Annotate("Serving under name: " + name)
if s.stopped {
- return errServerStopped
+ return s.newBadState("ipc.Server.Stop already called")
}
if disp == nil {
- return fmt.Errorf("A nil dispacther is not allowed")
+ return s.newBadArg("nil dispatcher")
}
if s.disp != nil {
- return fmt.Errorf("Serve or ServeDispatcher has already been called")
+ return s.newBadState("ipc.Server.Serve/ServeDispatcher already called")
}
s.disp = disp
s.names = make(map[string]struct{})
@@ -618,13 +675,13 @@
defer s.Unlock()
ivtrace.FromContext(s.ctx).Annotate("Serving under name: " + name)
if len(name) == 0 {
- return fmt.Errorf("empty name")
+ return s.newBadArg("name is empty")
}
if s.stopped {
- return errServerStopped
+ return s.newBadState("ipc.Server.Stop already called")
}
if s.disp == nil {
- return fmt.Errorf("Adding name before calling Serve or ServeDispatcher is not allowed")
+ return s.newBadState("adding a name before calling Serve or ServeDispatcher is not allowed")
}
s.publisher.AddName(name)
// TODO(cnicolaou): remove this map when the publisher's RemoveName
@@ -638,13 +695,13 @@
defer s.Unlock()
ivtrace.FromContext(s.ctx).Annotate("Removed name: " + name)
if s.stopped {
- return errServerStopped
+ return s.newBadState("ipc.Server.Stop already called")
}
if s.disp == nil {
- return fmt.Errorf("Removing name before calling Serve or ServeDispatcher is not allowed")
+ return s.newBadState("removing name before calling Serve or ServeDispatcher is not allowed")
}
if _, present := s.names[name]; !present {
- return fmt.Errorf("%q has not been previously used for this server", name)
+ return s.newBadArg(fmt.Sprintf("%q has not been previously used for this server", name))
}
s.publisher.RemoveName(name)
delete(s.names, name)
@@ -712,9 +769,12 @@
s.active.Wait()
s.Lock()
+ defer s.Unlock()
s.disp = nil
- s.Unlock()
- return firstErr
+ if firstErr != nil {
+ return verror.Make(verror.Internal, s.ctx, firstErr)
+ }
+ return nil
}
// TODO(toddw): Remove these interfaces after the vom2 transition.
@@ -792,14 +852,14 @@
v := vom.ValueOf(res)
if !v.IsValid() {
// Untyped nils are assumed to be nil-errors.
- var boxed verror.E
+ var boxed old_verror.E
return vom.ValueOf(&boxed).Elem()
}
if err, iserr := res.(error); iserr {
// Convert errors to verror since errors are often not
// serializable via vom/gob (errors.New and fmt.Errorf return a
// type with no exported fields).
- return vom.ValueOf(verror.Convert(err))
+ return vom.ValueOf(old_verror.Convert(err))
}
return v
}
@@ -843,8 +903,7 @@
if err == io.EOF {
return err
}
- // We'll close the flow 2x.
- return verror.BadProtocolf("ipc: response encoding failed: %v", err)
+ return old_verror.BadProtocolf("ipc: response encoding failed: %v", err)
}
if response.Error != nil {
return response.Error
@@ -854,7 +913,7 @@
if err == io.EOF {
return err
}
- return verror.BadProtocolf("ipc: result #%d [%T=%v] encoding failed: %v", ix, res, res, err)
+ return old_verror.BadProtocolf("ipc: result #%d [%T=%v] encoding failed: %v", ix, res, res, err)
}
}
// TODO(ashankar): Should unread data from the flow be drained?
@@ -873,7 +932,7 @@
return nil
}
-func (fs *flowServer) readIPCRequest() (*ipc.Request, verror.E) {
+func (fs *flowServer) readIPCRequest() (*ipc.Request, old_verror.E) {
// Set a default timeout before reading from the flow. Without this timeout,
// a client that sends no request or a partial request will retain the flow
// indefinitely (and lock up server resources).
@@ -884,12 +943,12 @@
// Decode the initial request.
var req ipc.Request
if err := fs.dec.Decode(&req); err != nil {
- return nil, verror.BadProtocolf("ipc: request decoding failed: %v", err)
+ return nil, old_verror.BadProtocolf("ipc: request decoding failed: %v", err)
}
return &req, nil
}
-func (fs *flowServer) processRequest() ([]interface{}, verror.E) {
+func (fs *flowServer) processRequest() ([]interface{}, old_verror.E) {
fs.starttime = time.Now()
req, verr := fs.readIPCRequest()
if verr != nil {
@@ -930,14 +989,14 @@
argptrs, tags, err := invoker.Prepare(fs.method, numArgs)
fs.tags = tags
if err != nil {
- return nil, verror.Makef(verror.ErrorID(err), "%s: name: %q", err, fs.suffix)
+ return nil, old_verror.Makef(old_verror.ErrorID(err), "%s: name: %q", err, fs.suffix)
}
if len(argptrs) != numArgs {
- return nil, verror.BadProtocolf(fmt.Sprintf("ipc: wrong number of input arguments for method %q, name %q (called with %d args, expected %d)", fs.method, fs.suffix, numArgs, len(argptrs)))
+ return nil, old_verror.BadProtocolf(fmt.Sprintf("ipc: wrong number of input arguments for method %q, name %q (called with %d args, expected %d)", fs.method, fs.suffix, numArgs, len(argptrs)))
}
for ix, argptr := range argptrs {
if err := fs.dec.Decode(argptr); err != nil {
- return nil, verror.BadProtocolf("ipc: arg %d decoding failed: %v", ix, err)
+ return nil, old_verror.BadProtocolf("ipc: arg %d decoding failed: %v", ix, err)
}
}
// Check application's authorization policy.
@@ -950,7 +1009,7 @@
// Invoke the method.
results, err := invoker.Invoke(fs.method, fs, argptrs)
fs.server.stats.record(fs.method, time.Since(fs.starttime))
- return results, verror.Convert(err)
+ return results, old_verror.Convert(err)
}
func (fs *flowServer) cancelContextOnClose(cancel context.CancelFunc) {
@@ -973,7 +1032,7 @@
// with ipc.DebugKeyword, we use the internal debug dispatcher to look up the
// invoker. Otherwise, and we use the server's dispatcher. The suffix and method
// value may be modified to match the actual suffix and method to use.
-func (fs *flowServer) lookup(suffix string, method *string) (ipc.Invoker, security.Authorizer, verror.E) {
+func (fs *flowServer) lookup(suffix string, method *string) (ipc.Invoker, security.Authorizer, old_verror.E) {
if naming.IsReserved(*method) {
// All reserved methods are trapped and handled here, by removing the
// reserved prefix and invoking them on reservedMethods. E.g. "__Glob"
@@ -989,12 +1048,12 @@
obj, auth, err := disp.Lookup(suffix)
switch {
case err != nil:
- return nil, nil, verror.Convert(err)
+ return nil, nil, old_verror.Convert(err)
case obj != nil:
return objectToInvoker(obj), auth, nil
}
}
- return nil, nil, verror.NoExistf("ipc: invoker not found for %q", suffix)
+ return nil, nil, old_verror.NoExistf("ipc: invoker not found for %q", suffix)
}
func objectToInvoker(obj interface{}) ipc.Invoker {
@@ -1007,11 +1066,11 @@
return ipc.ReflectInvoker(obj)
}
-func (fs *flowServer) initSecurity(req *ipc.Request) verror.E {
+func (fs *flowServer) initSecurity(req *ipc.Request) old_verror.E {
// If additional credentials are provided, make them available in the context
blessings, err := security.NewBlessings(req.GrantedBlessings)
if err != nil {
- return verror.BadProtocolf("ipc: failed to decode granted blessings: %v", err)
+ return old_verror.BadProtocolf("ipc: failed to decode granted blessings: %v", err)
}
fs.blessings = blessings
// Detect unusable blessings now, rather then discovering they are unusable on
@@ -1022,13 +1081,13 @@
// this - should servers be able to assume that a blessing is something that
// does not have the authorizations that the server's own identity has?
if blessings != nil && !reflect.DeepEqual(blessings.PublicKey(), fs.flow.LocalPrincipal().PublicKey()) {
- return verror.NoAccessf("ipc: blessing granted not bound to this server(%v vs %v)", blessings.PublicKey(), fs.flow.LocalPrincipal().PublicKey())
+ return old_verror.NoAccessf("ipc: blessing granted not bound to this server(%v vs %v)", blessings.PublicKey(), fs.flow.LocalPrincipal().PublicKey())
}
// Receive third party caveat discharges the client sent
for i := uint64(0); i < req.NumDischarges; i++ {
var d security.Discharge
if err := fs.dec.Decode(&d); err != nil {
- return verror.BadProtocolf("ipc: decoding discharge %d of %d failed: %v", i, req.NumDischarges, err)
+ return old_verror.BadProtocolf("ipc: decoding discharge %d of %d failed: %v", i, req.NumDischarges, err)
}
fs.discharges[d.ID()] = d
}
@@ -1041,7 +1100,7 @@
return nil
}
-func authorize(ctx security.Context, auth security.Authorizer) verror.E {
+func authorize(ctx security.Context, auth security.Authorizer) old_verror.E {
if ctx.LocalPrincipal() == nil {
// LocalPrincipal is nil means that the server wanted to avoid
// authentication, and thus wanted to skip authorization as well.
@@ -1052,7 +1111,7 @@
}
if err := auth.Authorize(ctx); err != nil {
// TODO(ataly, ashankar): For privacy reasons, should we hide the authorizer error?
- return verror.NoAccessf("ipc: not authorized to call %q.%q (%v)", ctx.Suffix(), ctx.Method(), err)
+ return old_verror.NoAccessf("ipc: not authorized to call %q.%q (%v)", ctx.Suffix(), ctx.Method(), err)
}
return nil
}
diff --git a/runtimes/google/ipc/server_test.go b/runtimes/google/ipc/server_test.go
index 9c8c126..4c7cc05 100644
--- a/runtimes/google/ipc/server_test.go
+++ b/runtimes/google/ipc/server_test.go
@@ -40,6 +40,7 @@
t.Fatalf("unexpected error: %s", err)
}
session := expect.NewSession(t, server.Stdout(), time.Minute)
+ session.ReadLine()
serverName := session.ExpectVar("NAME")
serverEP := session.ExpectVar("ADDR")
ep, _ := inaming.NewEndpoint(serverEP)
@@ -71,9 +72,8 @@
}
// Resurrect the server with the same address, verify client
- // re-establishes the connection. This is probably racy if another
- // process grabs the port. This seems unlikely since the kernel cycles
- // through the entire port space.
+ // re-establishes the connection. This is racy if another
+ // process grabs the port.
server, err = sh.Start(core.EchoServerCommand, nil, "--", "--veyron.tcp.address="+ep.Address, "mymessage again", "")
if err != nil {
t.Fatalf("unexpected error: %s", err)
@@ -108,7 +108,11 @@
h.proxy = p
s := expect.NewSession(t, p.Stdout(), time.Minute)
s.ReadLine()
+ s.ReadLine()
h.name = s.ExpectVar("PROXY_NAME")
+ if len(h.name) == 0 {
+ t.Fatalf("failed to get PROXY_NAME from proxyd")
+ }
return h.ns.Mount(testContext(), "proxy", h.name, time.Hour)
}
@@ -186,7 +190,7 @@
}
proxyEP, _ := naming.SplitAddressName(addrs[0])
- ep, err := server.Listen(spec)
+ eps, err := server.Listen(spec)
if err != nil {
t.Fatal(err)
}
@@ -212,14 +216,13 @@
}
proxiedEP, err := inaming.NewEndpoint(proxyEP)
-
if err != nil {
t.Fatalf("unexpected error for %q: %s", proxyEP, err)
}
proxiedEP.RID = naming.FixedRoutingID(0x555555555)
expectedEndpoints := []string{proxiedEP.String()}
if hasLocalListener {
- expectedEndpoints = append(expectedEndpoints, ep.String())
+ expectedEndpoints = append(expectedEndpoints, eps[0].String())
}
// Proxy connetions are created asynchronously, so we wait for the
@@ -247,10 +250,9 @@
// mount table, given that we're trying to test the proxy, we remove
// the local endpoint from the mount table entry! We have to remove both
// the tcp and the websocket address.
- sep := ep.String()
+ sep := eps[0].String()
//wsep := strings.Replace(sep, "@tcp@", "@ws@", 1)
ns.Unmount(testContext(), "mountpoint/server", naming.JoinAddressName(sep, ""))
- //ns.Unmount(testContext(), "mountpoint/server", naming.JoinAddressName(wsep, ""))
}
addrs = verifyMount(t, ns, name)
diff --git a/runtimes/google/ipc/signature_test.go b/runtimes/google/ipc/signature_test.go
index 0f5c5ac..59a54ad 100644
--- a/runtimes/google/ipc/signature_test.go
+++ b/runtimes/google/ipc/signature_test.go
@@ -24,14 +24,14 @@
if err != nil {
return "", nil, fmt.Errorf("failed to start sig server: %v", err)
}
- ep, err := server.Listen(profiles.LocalListenSpec)
+ eps, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
return "", nil, fmt.Errorf("failed to listen: %v", err)
}
if err := server.Serve("", sig, nil); err != nil {
return "", nil, err
}
- return ep.String(), func() { server.Stop() }, nil
+ return eps[0].String(), func() { server.Stop() }, nil
}
type sigImpl struct{}
diff --git a/runtimes/google/ipc/stream/vc/init.go b/runtimes/google/ipc/stream/vc/init.go
index ae639c5..2a51592 100644
--- a/runtimes/google/ipc/stream/vc/init.go
+++ b/runtimes/google/ipc/stream/vc/init.go
@@ -54,6 +54,10 @@
return s.k
}
+func (s *anonymousBlessingStore) PeerBlessings() map[security.BlessingPattern]security.Blessings {
+ return nil
+}
+
func (anonymousBlessingStore) DebugString() string {
return "anonymous BlessingStore"
}
diff --git a/runtimes/google/naming/namespace/all_test.go b/runtimes/google/naming/namespace/all_test.go
index 2dd0a94..9d32f56 100644
--- a/runtimes/google/naming/namespace/all_test.go
+++ b/runtimes/google/naming/namespace/all_test.go
@@ -198,15 +198,15 @@
}
// Add a mount table server.
// Start serving on a loopback address.
- ep, err := s.Listen(profiles.LocalListenSpec)
+ eps, err := s.Listen(profiles.LocalListenSpec)
if err != nil {
boom(t, "Failed to Listen: %s", err)
}
if err := s.ServeDispatcher(mountPoint, disp); err != nil {
boom(t, "Failed to serve mount table at %s: %s", mountPoint, err)
}
- name := naming.JoinAddressName(ep.String(), "")
- return &serverEntry{mountPoint: mountPoint, server: s, endpoint: ep, name: name}
+ name := naming.JoinAddressName(eps[0].String(), "")
+ return &serverEntry{mountPoint: mountPoint, server: s, endpoint: eps[0], name: name}
}
const (
diff --git a/runtimes/google/rt/ipc_test.go b/runtimes/google/rt/ipc_test.go
index 7f7c589..8efcb44 100644
--- a/runtimes/google/rt/ipc_test.go
+++ b/runtimes/google/rt/ipc_test.go
@@ -90,11 +90,11 @@
if err != nil {
return nil, "", err
}
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
return nil, "", err
}
- serverObjectName := naming.JoinAddressName(endpoint.String(), "")
+ serverObjectName := naming.JoinAddressName(endpoints[0].String(), "")
if err := server.Serve("", s, allowEveryone{}); err != nil {
return nil, "", err
}
diff --git a/runtimes/google/rt/mgmt.go b/runtimes/google/rt/mgmt.go
index ae4a949..e52b102 100644
--- a/runtimes/google/rt/mgmt.go
+++ b/runtimes/google/rt/mgmt.go
@@ -42,7 +42,7 @@
if err != nil {
return nil, err
}
- ep, err := server.Listen(*listenSpec)
+ eps, err := server.Listen(*listenSpec)
if err != nil {
return nil, err
}
@@ -50,7 +50,7 @@
server.Stop()
return nil, err
}
- err = rt.callbackToParent(parentName, naming.JoinAddressName(ep.String(), ""))
+ err = rt.callbackToParent(parentName, naming.JoinAddressName(eps[0].String(), ""))
if err != nil {
server.Stop()
return nil, err
diff --git a/runtimes/google/rt/mgmt_test.go b/runtimes/google/rt/mgmt_test.go
index fd59c0a..6323682 100644
--- a/runtimes/google/rt/mgmt_test.go
+++ b/runtimes/google/rt/mgmt_test.go
@@ -282,14 +282,14 @@
t.Fatalf("Got error: %v", err)
}
ch := make(chan string)
- var ep naming.Endpoint
- if ep, err = server.Listen(profiles.LocalListenSpec); err != nil {
+ var eps []naming.Endpoint
+ if eps, err = server.Listen(profiles.LocalListenSpec); err != nil {
t.Fatalf("Got error: %v", err)
}
if err := server.Serve("", device.ConfigServer(&configServer{ch}), vflag.NewAuthorizerOrDie()); err != nil {
t.Fatalf("Got error: %v", err)
}
- return server, naming.JoinAddressName(ep.String(), ""), ch
+ return server, naming.JoinAddressName(eps[0].String(), ""), ch
}
func setupRemoteAppCycleMgr(t *testing.T) (veyron2.Runtime, modules.Handle, appcycle.AppCycleClientMethods, func()) {
diff --git a/security/agent/agent_test.go b/security/agent/agent_test.go
index d0acb43..18b61ea 100644
--- a/security/agent/agent_test.go
+++ b/security/agent/agent_test.go
@@ -69,6 +69,8 @@
{"Sign", V{make([]byte, 10)}, security.Signature{Purpose: []byte{}, R: []byte{1}, S: []byte{1}}, nil},
{"MintDischarge", V{thirdPartyCaveat, security.UnconstrainedUse()}, discharge, nil},
{"PublicKey", V{}, mockP.PublicKey(), nil},
+ {"BlessingsByName", V{security.BlessingPattern("self")}, []security.Blessings{newBlessing(t, "blessing")}, nil},
+ {"BlessingsInfo", V{newBlessing(t, "blessing")}, []string{"blessing"}, nil},
{"AddToRoots", V{newBlessing(t, "blessing")}, nil, verror2.Make(addToRootsErr, nil)},
}
for _, test := range tests {
@@ -84,6 +86,7 @@
{"SetDefault", V{newBlessing(t, "blessing")}, nil, verror2.Make(storeSetDefaultErr, nil)},
{"Default", V{}, newBlessing(t, "root/extension"), nil},
{"PublicKey", V{}, mockP.PublicKey(), nil},
+ {"PeerBlessings", V{}, map[security.BlessingPattern]security.Blessings{"test": newBlessing(t, "root/extension")}, nil},
{"DebugString", V{}, "StoreString", nil},
}
for _, test := range storeTests {
@@ -176,6 +179,18 @@
return d, p.NextError
}
+func (p *mockPrincipal) BlessingsByName(name security.BlessingPattern) []security.Blessings {
+ defer p.reset()
+ b, _ := p.NextResult.([]security.Blessings)
+ return b
+}
+
+func (p *mockPrincipal) BlessingsInfo(blessings security.Blessings) []string {
+ defer p.reset()
+ s, _ := p.NextResult.([]string)
+ return s
+}
+
func (p *mockPrincipal) PublicKey() security.PublicKey { return p.Key }
func (p *mockPrincipal) Roots() security.BlessingRoots { return p.MockRoots }
func (p *mockPrincipal) BlessingStore() security.BlessingStore { return p.MockStore }
@@ -220,6 +235,12 @@
func (s *mockBlessingStore) PublicKey() security.PublicKey { return s.Key }
+func (s *mockBlessingStore) PeerBlessings() map[security.BlessingPattern]security.Blessings {
+ defer s.reset()
+ m, _ := s.NextResult.(map[security.BlessingPattern]security.Blessings)
+ return m
+}
+
func (s *mockBlessingStore) DebugString() string {
defer s.reset()
return s.NextResult.(string)
diff --git a/security/agent/client.go b/security/agent/client.go
index 6a3925f..cd26573 100644
--- a/security/agent/client.go
+++ b/security/agent/client.go
@@ -128,6 +128,33 @@
return c.key
}
+func (c *client) BlessingsByName(pattern security.BlessingPattern) []security.Blessings {
+ var wbResults []security.WireBlessings
+ err := c.caller.call("BlessingsByName", results(&wbResults), pattern)
+ if err != nil {
+ vlog.Errorf("error calling BlessingsByName: %v", err)
+ return nil
+ }
+ blessings := make([]security.Blessings, len(wbResults))
+ for i, wb := range wbResults {
+ var err error
+ blessings[i], err = security.NewBlessings(wb)
+ if err != nil {
+ vlog.Errorf("error creating Blessing from WireBlessings: %v", err)
+ }
+ }
+ return blessings
+}
+
+func (c *client) BlessingsInfo(blessings security.Blessings) []string {
+ var names []string
+ err := c.caller.call("BlessingsInfo", results(&names), security.MarshalBlessings(blessings))
+ if err != nil {
+ vlog.Errorf("error calling BlessingsInfo: %v", err)
+ return nil
+ }
+ return names
+}
func (c *client) BlessingStore() security.BlessingStore {
return &blessingStore{c.caller, c.key}
}
@@ -192,6 +219,25 @@
return b.key
}
+func (b *blessingStore) PeerBlessings() map[security.BlessingPattern]security.Blessings {
+ var wbMap map[security.BlessingPattern]security.WireBlessings
+ err := b.caller.call("BlessingStorePeerBlessings", results(&wbMap))
+ if err != nil {
+ vlog.Errorf("error calling BlessingStorePeerBlessings: %v", err)
+ return nil
+ }
+ bMap := make(map[security.BlessingPattern]security.Blessings)
+ for pattern, wb := range wbMap {
+ blessings, err := security.NewBlessings(wb)
+ if err != nil {
+ vlog.Errorf("error creating Blessing from WireBlessings: %v", err)
+ return nil
+ }
+ bMap[pattern] = blessings
+ }
+ return bMap
+}
+
func (b *blessingStore) DebugString() (s string) {
err := b.caller.call("BlessingStoreDebugString", results(&s))
if err != nil {
diff --git a/security/agent/server/server.go b/security/agent/server/server.go
index c6ff7ea..fcf25a3 100644
--- a/security/agent/server/server.go
+++ b/security/agent/server/server.go
@@ -307,6 +307,23 @@
return a.principal.PublicKey().MarshalBinary()
}
+func (a agentd) BlessingsByName(_ ipc.ServerContext, name security.BlessingPattern) ([]security.WireBlessings, error) {
+ blessings := a.principal.BlessingsByName(name)
+ ret := make([]security.WireBlessings, len(blessings))
+ for i, b := range blessings {
+ ret[i] = security.MarshalBlessings(b)
+ }
+ return ret, nil
+}
+
+func (a agentd) BlessingsInfo(_ ipc.ServerContext, blessings security.WireBlessings) ([]string, error) {
+ b, err := security.NewBlessings(blessings)
+ if err != nil {
+ return nil, err
+ }
+ return a.principal.BlessingsInfo(b), nil
+}
+
func (a agentd) AddToRoots(_ ipc.ServerContext, wireBlessings security.WireBlessings) error {
blessings, err := security.NewBlessings(wireBlessings)
if err != nil {
@@ -339,6 +356,15 @@
return a.principal.BlessingStore().SetDefault(blessings)
}
+func (a agentd) BlessingStorePeerBlessings(_ ipc.ServerContext) (map[security.BlessingPattern]security.WireBlessings, error) {
+ bMap := a.principal.BlessingStore().PeerBlessings()
+ wbMap := make(map[security.BlessingPattern]security.WireBlessings, len(bMap))
+ for p, b := range bMap {
+ wbMap[p] = security.MarshalBlessings(b)
+ }
+ return wbMap, nil
+}
+
func (a agentd) BlessingStoreDebugString(_ ipc.ServerContext) (string, error) {
return a.principal.BlessingStore().DebugString(), nil
}
diff --git a/security/agent/server/wire.vdl b/security/agent/server/wire.vdl
index dc52a7c..ee55e0b 100644
--- a/security/agent/server/wire.vdl
+++ b/security/agent/server/wire.vdl
@@ -35,12 +35,15 @@
Sign(message []byte) (security.Signature, error)
MintDischarge(tp any, caveat security.Caveat, additionalCaveats []security.Caveat) (any, error)
PublicKey() ([]byte, error)
+ BlessingsByName(name security.BlessingPattern) ([]security.WireBlessings, error)
+ BlessingsInfo(blessings security.WireBlessings) ([]string, error)
AddToRoots(blessing security.WireBlessings) error
BlessingStoreSet(blessings security.WireBlessings, forPeers security.BlessingPattern) (security.WireBlessings, error)
BlessingStoreForPeer(peerBlessings []string) (security.WireBlessings, error)
BlessingStoreSetDefault(blessings security.WireBlessings) error
BlessingStoreDefault() (security.WireBlessings, error)
+ BlessingStorePeerBlessings() (map[security.BlessingPattern]security.WireBlessings, error)
BlessingStoreDebugString() (string, error)
BlessingRootsAdd(root []byte, pattern security.BlessingPattern) error
diff --git a/security/agent/server/wire.vdl.go b/security/agent/server/wire.vdl.go
index fa5832b..3fc6f85 100644
--- a/security/agent/server/wire.vdl.go
+++ b/security/agent/server/wire.vdl.go
@@ -27,11 +27,14 @@
Sign(ctx __context.T, message []byte, opts ...__ipc.CallOpt) (security.Signature, error)
MintDischarge(ctx __context.T, tp __vdlutil.Any, caveat security.Caveat, additionalCaveats []security.Caveat, opts ...__ipc.CallOpt) (__vdlutil.Any, error)
PublicKey(__context.T, ...__ipc.CallOpt) ([]byte, error)
+ BlessingsByName(ctx __context.T, name security.BlessingPattern, opts ...__ipc.CallOpt) ([]security.WireBlessings, error)
+ BlessingsInfo(ctx __context.T, blessings security.WireBlessings, opts ...__ipc.CallOpt) ([]string, error)
AddToRoots(ctx __context.T, blessing security.WireBlessings, opts ...__ipc.CallOpt) error
BlessingStoreSet(ctx __context.T, blessings security.WireBlessings, forPeers security.BlessingPattern, opts ...__ipc.CallOpt) (security.WireBlessings, error)
BlessingStoreForPeer(ctx __context.T, peerBlessings []string, opts ...__ipc.CallOpt) (security.WireBlessings, error)
BlessingStoreSetDefault(ctx __context.T, blessings security.WireBlessings, opts ...__ipc.CallOpt) error
BlessingStoreDefault(__context.T, ...__ipc.CallOpt) (security.WireBlessings, error)
+ BlessingStorePeerBlessings(__context.T, ...__ipc.CallOpt) (map[security.BlessingPattern]security.WireBlessings, error)
BlessingStoreDebugString(__context.T, ...__ipc.CallOpt) (string, error)
BlessingRootsAdd(ctx __context.T, root []byte, pattern security.BlessingPattern, opts ...__ipc.CallOpt) error
BlessingRootsRecognized(ctx __context.T, root []byte, blessing string, opts ...__ipc.CallOpt) error
@@ -122,6 +125,28 @@
return
}
+func (c implAgentClientStub) BlessingsByName(ctx __context.T, i0 security.BlessingPattern, opts ...__ipc.CallOpt) (o0 []security.WireBlessings, err error) {
+ var call __ipc.Call
+ if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingsByName", []interface{}{i0}, opts...); err != nil {
+ return
+ }
+ if ierr := call.Finish(&o0, &err); ierr != nil {
+ err = ierr
+ }
+ return
+}
+
+func (c implAgentClientStub) BlessingsInfo(ctx __context.T, i0 security.WireBlessings, opts ...__ipc.CallOpt) (o0 []string, err error) {
+ var call __ipc.Call
+ if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingsInfo", []interface{}{i0}, opts...); err != nil {
+ return
+ }
+ if ierr := call.Finish(&o0, &err); ierr != nil {
+ err = ierr
+ }
+ return
+}
+
func (c implAgentClientStub) AddToRoots(ctx __context.T, i0 security.WireBlessings, opts ...__ipc.CallOpt) (err error) {
var call __ipc.Call
if call, err = c.c(ctx).StartCall(ctx, c.name, "AddToRoots", []interface{}{i0}, opts...); err != nil {
@@ -177,6 +202,17 @@
return
}
+func (c implAgentClientStub) BlessingStorePeerBlessings(ctx __context.T, opts ...__ipc.CallOpt) (o0 map[security.BlessingPattern]security.WireBlessings, err error) {
+ var call __ipc.Call
+ if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingStorePeerBlessings", nil, opts...); err != nil {
+ return
+ }
+ if ierr := call.Finish(&o0, &err); ierr != nil {
+ err = ierr
+ }
+ return
+}
+
func (c implAgentClientStub) BlessingStoreDebugString(ctx __context.T, opts ...__ipc.CallOpt) (o0 string, err error) {
var call __ipc.Call
if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingStoreDebugString", nil, opts...); err != nil {
@@ -240,11 +276,14 @@
Sign(ctx __ipc.ServerContext, message []byte) (security.Signature, error)
MintDischarge(ctx __ipc.ServerContext, tp __vdlutil.Any, caveat security.Caveat, additionalCaveats []security.Caveat) (__vdlutil.Any, error)
PublicKey(__ipc.ServerContext) ([]byte, error)
+ BlessingsByName(ctx __ipc.ServerContext, name security.BlessingPattern) ([]security.WireBlessings, error)
+ BlessingsInfo(ctx __ipc.ServerContext, blessings security.WireBlessings) ([]string, error)
AddToRoots(ctx __ipc.ServerContext, blessing security.WireBlessings) error
BlessingStoreSet(ctx __ipc.ServerContext, blessings security.WireBlessings, forPeers security.BlessingPattern) (security.WireBlessings, error)
BlessingStoreForPeer(ctx __ipc.ServerContext, peerBlessings []string) (security.WireBlessings, error)
BlessingStoreSetDefault(ctx __ipc.ServerContext, blessings security.WireBlessings) error
BlessingStoreDefault(__ipc.ServerContext) (security.WireBlessings, error)
+ BlessingStorePeerBlessings(__ipc.ServerContext) (map[security.BlessingPattern]security.WireBlessings, error)
BlessingStoreDebugString(__ipc.ServerContext) (string, error)
BlessingRootsAdd(ctx __ipc.ServerContext, root []byte, pattern security.BlessingPattern) error
BlessingRootsRecognized(ctx __ipc.ServerContext, root []byte, blessing string) error
@@ -308,6 +347,14 @@
return s.impl.PublicKey(ctx)
}
+func (s implAgentServerStub) BlessingsByName(ctx __ipc.ServerContext, i0 security.BlessingPattern) ([]security.WireBlessings, error) {
+ return s.impl.BlessingsByName(ctx, i0)
+}
+
+func (s implAgentServerStub) BlessingsInfo(ctx __ipc.ServerContext, i0 security.WireBlessings) ([]string, error) {
+ return s.impl.BlessingsInfo(ctx, i0)
+}
+
func (s implAgentServerStub) AddToRoots(ctx __ipc.ServerContext, i0 security.WireBlessings) error {
return s.impl.AddToRoots(ctx, i0)
}
@@ -328,6 +375,10 @@
return s.impl.BlessingStoreDefault(ctx)
}
+func (s implAgentServerStub) BlessingStorePeerBlessings(ctx __ipc.ServerContext) (map[security.BlessingPattern]security.WireBlessings, error) {
+ return s.impl.BlessingStorePeerBlessings(ctx)
+}
+
func (s implAgentServerStub) BlessingStoreDebugString(ctx __ipc.ServerContext) (string, error) {
return s.impl.BlessingStoreDebugString(ctx)
}
@@ -415,6 +466,26 @@
},
},
{
+ Name: "BlessingsByName",
+ InArgs: []__ipc.ArgDesc{
+ {"name", ``}, // security.BlessingPattern
+ },
+ OutArgs: []__ipc.ArgDesc{
+ {"", ``}, // []security.WireBlessings
+ {"", ``}, // error
+ },
+ },
+ {
+ Name: "BlessingsInfo",
+ InArgs: []__ipc.ArgDesc{
+ {"blessings", ``}, // security.WireBlessings
+ },
+ OutArgs: []__ipc.ArgDesc{
+ {"", ``}, // []string
+ {"", ``}, // error
+ },
+ },
+ {
Name: "AddToRoots",
InArgs: []__ipc.ArgDesc{
{"blessing", ``}, // security.WireBlessings
@@ -461,6 +532,13 @@
},
},
{
+ Name: "BlessingStorePeerBlessings",
+ OutArgs: []__ipc.ArgDesc{
+ {"", ``}, // map[security.BlessingPattern]security.WireBlessings
+ {"", ``}, // error
+ },
+ },
+ {
Name: "BlessingStoreDebugString",
OutArgs: []__ipc.ArgDesc{
{"", ``}, // string
@@ -579,6 +657,13 @@
{Name: "", Type: 75},
},
}
+ result.Methods["BlessingStorePeerBlessings"] = __ipc.MethodSignature{
+ InArgs: []__ipc.MethodArgument{},
+ OutArgs: []__ipc.MethodArgument{
+ {Name: "", Type: 79},
+ {Name: "", Type: 75},
+ },
+ }
result.Methods["BlessingStoreSet"] = __ipc.MethodSignature{
InArgs: []__ipc.MethodArgument{
{Name: "blessings", Type: 74},
@@ -597,6 +682,24 @@
{Name: "", Type: 75},
},
}
+ result.Methods["BlessingsByName"] = __ipc.MethodSignature{
+ InArgs: []__ipc.MethodArgument{
+ {Name: "name", Type: 77},
+ },
+ OutArgs: []__ipc.MethodArgument{
+ {Name: "", Type: 78},
+ {Name: "", Type: 75},
+ },
+ }
+ result.Methods["BlessingsInfo"] = __ipc.MethodSignature{
+ InArgs: []__ipc.MethodArgument{
+ {Name: "blessings", Type: 74},
+ },
+ OutArgs: []__ipc.MethodArgument{
+ {Name: "", Type: 61},
+ {Name: "", Type: 75},
+ },
+ }
result.Methods["MintDischarge"] = __ipc.MethodSignature{
InArgs: []__ipc.MethodArgument{
{Name: "tp", Type: 76},
@@ -652,7 +755,7 @@
__wiretype.FieldType{Type: 0x49, Name: "CertificateChains"},
},
"veyron.io/veyron/veyron2/security.WireBlessings", []string(nil)},
- __wiretype.NamedPrimitiveType{Type: 0x1, Name: "error", Tags: []string(nil)}, __wiretype.NamedPrimitiveType{Type: 0x1, Name: "anydata", Tags: []string(nil)}, __wiretype.NamedPrimitiveType{Type: 0x3, Name: "veyron.io/veyron/veyron2/security.BlessingPattern", Tags: []string(nil)}}
+ __wiretype.NamedPrimitiveType{Type: 0x1, Name: "error", Tags: []string(nil)}, __wiretype.NamedPrimitiveType{Type: 0x1, Name: "anydata", Tags: []string(nil)}, __wiretype.NamedPrimitiveType{Type: 0x3, Name: "veyron.io/veyron/veyron2/security.BlessingPattern", Tags: []string(nil)}, __wiretype.SliceType{Elem: 0x4a, Name: "", Tags: []string(nil)}, __wiretype.MapType{Key: 0x4d, Elem: 0x4a, Name: "", Tags: []string(nil)}}
return result, nil
}
diff --git a/security/audit/principal.go b/security/audit/principal.go
index efd1323..c37a8d7 100644
--- a/security/audit/principal.go
+++ b/security/audit/principal.go
@@ -55,6 +55,14 @@
return d, nil
}
+func (p *auditingPrincipal) BlessingsByName(name security.BlessingPattern) []security.Blessings {
+ return p.principal.BlessingsByName(name)
+}
+
+func (p *auditingPrincipal) BlessingsInfo(b security.Blessings) []string {
+ return p.principal.BlessingsInfo(b)
+}
+
func (p *auditingPrincipal) PublicKey() security.PublicKey { return p.principal.PublicKey() }
func (p *auditingPrincipal) Roots() security.BlessingRoots { return p.principal.Roots() }
func (p *auditingPrincipal) BlessingStore() security.BlessingStore { return p.principal.BlessingStore() }
diff --git a/security/audit/principal_test.go b/security/audit/principal_test.go
index 487154f..00b885e 100644
--- a/security/audit/principal_test.go
+++ b/security/audit/principal_test.go
@@ -162,6 +162,14 @@
return d, p.NextError
}
+func (p *mockPrincipal) BlessingsByName(name security.BlessingPattern) []security.Blessings {
+ return nil
+}
+
+func (p *mockPrincipal) BlessingsInfo(b security.Blessings) []string {
+ return nil
+}
+
func (p *mockPrincipal) PublicKey() security.PublicKey { return p.NextResult.(security.PublicKey) }
func (p *mockPrincipal) Roots() security.BlessingRoots { return nil }
func (p *mockPrincipal) BlessingStore() security.BlessingStore { return nil }
diff --git a/security/blessingstore.go b/security/blessingstore.go
index be3449b..fd004e6 100644
--- a/security/blessingstore.go
+++ b/security/blessingstore.go
@@ -135,6 +135,14 @@
return fmt.Sprintf("{state: %v, publicKey: %v}", bs.state, bs.publicKey)
}
+func (bs *blessingStore) PeerBlessings() map[security.BlessingPattern]security.Blessings {
+ m := make(map[security.BlessingPattern]security.Blessings)
+ for pattern, wb := range bs.state.Store {
+ m[pattern] = wb.Blessings()
+ }
+ return m
+}
+
// DebugString return a human-readable string encoding of the store
// in the following format
// Default blessing : <Default blessing of the store>
diff --git a/security/blessingstore_test.go b/security/blessingstore_test.go
index fd535d8..be7824f 100644
--- a/security/blessingstore_test.go
+++ b/security/blessingstore_test.go
@@ -30,11 +30,19 @@
{t.forAll, "...foo", "invalid BlessingPattern"},
{t.forAll, "foo/.../bar", "invalid BlessingPattern"},
}
+ added := make(map[security.BlessingPattern]security.Blessings)
for _, d := range testdata {
_, err := s.Set(d.blessings, d.pattern)
if merr := matchesError(err, d.wantErr); merr != nil {
return fmt.Errorf("Set(%v, %q): %v", d.blessings, d.pattern, merr)
}
+ if err == nil {
+ added[d.pattern] = d.blessings
+ }
+ }
+ m := s.PeerBlessings()
+ if !reflect.DeepEqual(added, m) {
+ return fmt.Errorf("PeerBlessings(%v) != added(%v)", m, added)
}
return nil
}
diff --git a/security/principal_test.go b/security/principal_test.go
index eb72f43..5f2d08c 100644
--- a/security/principal_test.go
+++ b/security/principal_test.go
@@ -7,7 +7,10 @@
"io/ioutil"
"os"
"path"
+ "reflect"
"testing"
+
+ "veyron.io/veyron/veyron2/security"
)
func TestLoadPersistentPrincipal(t *testing.T) {
@@ -116,3 +119,97 @@
}
return dir
}
+
+func TestPrincipalBlessingsByName(t *testing.T) {
+ var p1, p2, p3 security.Principal
+ var err error
+
+ if p1, err = NewPrincipal(); err != nil {
+ t.Fatal(err)
+ }
+ if p2, err = NewPrincipal(); err != nil {
+ t.Fatal(err)
+ }
+ alice, err := p1.BlessSelf("alice")
+ if err != nil {
+ t.Fatal(err)
+ }
+ p2.AddToRoots(alice)
+ var aliceworkfriend, alicegymfriend, aliceworkboss security.Blessings
+
+ if aliceworkfriend, err = p1.Bless(p2.PublicKey(), alice, "work/friend", security.UnconstrainedUse()); err != nil {
+ t.Errorf("Bless(work/friend) failed: %v", err)
+ }
+ p2.BlessingStore().Set(aliceworkfriend, "alice/work/friend")
+ if alicegymfriend, err = p1.Bless(p2.PublicKey(), alice, "gym/friend", security.UnconstrainedUse()); err != nil {
+ t.Errorf("Bless(gym/friend) failed: %v", err)
+ }
+ p2.BlessingStore().Set(alicegymfriend, "alice/gym/friend")
+ if aliceworkboss, err = p1.Bless(p2.PublicKey(), alice, "work/boss", security.UnconstrainedUse()); err != nil {
+ t.Errorf("Bless(work/friend) failed: %v", err)
+ }
+ p2.BlessingStore().Set(aliceworkboss, "alice/work/boss")
+
+ // Blessing from an untrusted principal that should never be returned
+ if p3, err = NewPrincipal(); err != nil {
+ t.Fatal(err)
+ }
+ fake, err := p3.BlessSelf("alice")
+ if err != nil {
+ t.Fatal(err)
+ }
+ fakefriend, err := p3.Bless(p2.PublicKey(), fake, "work/friend", security.UnconstrainedUse())
+ if err != nil {
+ t.Errorf("Bless(work/friend) failed: %v", err)
+ }
+ _, err = p2.BlessingStore().Set(fakefriend, "fake/work/friend")
+
+ tests := []struct {
+ matched []security.Blessings
+ pattern security.BlessingPattern
+ }{
+ {
+ matched: []security.Blessings{aliceworkfriend, aliceworkboss},
+ pattern: "alice/work/...",
+ },
+ {
+ matched: []security.Blessings{aliceworkfriend},
+ pattern: "alice/work/friend",
+ },
+ {
+ matched: []security.Blessings{alicegymfriend},
+ pattern: "alice/gym/friend",
+ },
+ {
+ matched: []security.Blessings{aliceworkfriend, alicegymfriend, aliceworkboss},
+ pattern: "alice/...",
+ },
+ {
+ matched: []security.Blessings{aliceworkfriend, alicegymfriend, aliceworkboss},
+ pattern: "...",
+ },
+ {
+ matched: nil,
+ pattern: "alice/school/...",
+ },
+ }
+
+ for _, test := range tests {
+ matched := p2.BlessingsByName(test.pattern)
+ if len(matched) != len(test.matched) {
+ t.Errorf("BlessingsByName(%s) did not return expected number of matches wanted:%d got:%d", test.pattern, len(test.matched), len(matched))
+ }
+ for _, m := range matched {
+ found := false
+ for _, tm := range test.matched {
+ if reflect.DeepEqual(m, tm) {
+ found = true
+ break
+ }
+ }
+ if !found {
+ t.Errorf("Invalid blessing was returned as a match:%v for pattern:%s", m, test.pattern)
+ }
+ }
+ }
+}
diff --git a/services/identity/identityd/main.go b/services/identity/identityd/main.go
index 6c11891..0092a47 100644
--- a/services/identity/identityd/main.go
+++ b/services/identity/identityd/main.go
@@ -6,7 +6,6 @@
"database/sql"
"flag"
"fmt"
- _ "github.com/go-sql-driver/mysql"
"html/template"
"io/ioutil"
"net"
@@ -15,6 +14,8 @@
"strings"
"time"
+ _ "github.com/go-sql-driver/mysql"
+
"veyron.io/veyron/veyron2"
"veyron.io/veyron/veyron2/ipc"
"veyron.io/veyron/veyron2/naming"
@@ -205,10 +206,11 @@
if err != nil {
return nil, nil, fmt.Errorf("failed to create new ipc.Server: %v", err)
}
- ep, err := server.Listen(static.ListenSpec)
+ eps, err := server.Listen(static.ListenSpec)
if err != nil {
return nil, nil, fmt.Errorf("server.Listen(%v) failed: %v", static.ListenSpec, err)
}
+ ep := eps[0]
googleParams.DischargerLocation = naming.JoinAddressName(ep.String(), dischargerService)
dispatcher := newDispatcher(googleParams, macaroonKey)
diff --git a/services/identity/revocation/revocation_test.go b/services/identity/revocation/revocation_test.go
index a23538b..ea6d428 100644
--- a/services/identity/revocation/revocation_test.go
+++ b/services/identity/revocation/revocation_test.go
@@ -52,7 +52,7 @@
if err != nil {
t.Fatalf("r.NewServer: %s", err)
}
- dischargerEP, err := dischargerServer.Listen(profiles.LocalListenSpec)
+ dischargerEPs, err := dischargerServer.Listen(profiles.LocalListenSpec)
if err != nil {
t.Fatalf("dischargerServer.Listen failed: %v", err)
}
@@ -61,7 +61,7 @@
t.Fatalf("dischargerServer.Serve revoker: %s", err)
}
return r.Principal().PublicKey(),
- naming.JoinAddressName(dischargerEP.String(), ""),
+ naming.JoinAddressName(dischargerEPs[0].String(), ""),
revokerService,
func() {
dischargerServer.Stop()
diff --git a/services/mgmt/application/applicationd/main.go b/services/mgmt/application/applicationd/main.go
index 4898ae7..a30fb98 100644
--- a/services/mgmt/application/applicationd/main.go
+++ b/services/mgmt/application/applicationd/main.go
@@ -39,14 +39,14 @@
vlog.Fatalf("NewDispatcher() failed: %v", err)
}
- endpoint, err := server.Listen(roaming.ListenSpec)
+ endpoints, err := server.Listen(roaming.ListenSpec)
if err != nil {
vlog.Fatalf("Listen(%s) failed: %v", roaming.ListenSpec, err)
}
if err := server.ServeDispatcher(*name, dispatcher); err != nil {
vlog.Fatalf("Serve(%v) failed: %v", *name, err)
}
- epName := naming.JoinAddressName(endpoint.String(), "")
+ epName := naming.JoinAddressName(endpoints[0].String(), "")
if *name != "" {
vlog.Infof("Application repository serving at %q (%q)", *name, epName)
} else {
diff --git a/services/mgmt/application/impl/impl_test.go b/services/mgmt/application/impl/impl_test.go
index af03a77..591fe9b 100644
--- a/services/mgmt/application/impl/impl_test.go
+++ b/services/mgmt/application/impl/impl_test.go
@@ -40,13 +40,14 @@
t.Fatalf("NewDispatcher() failed: %v", err)
}
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
}
if err := server.ServeDispatcher("", dispatcher); err != nil {
t.Fatalf("Serve(%v) failed: %v", dispatcher, err)
}
+ endpoint := endpoints[0]
// Create client stubs for talking to the server.
stub := repository.ApplicationClient(naming.JoinAddressName(endpoint.String(), "search"))
@@ -183,10 +184,11 @@
t.Fatalf("NewDispatcher() failed: %v", err)
}
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
}
+ endpoint := endpoints[0]
if err := server.ServeDispatcher("", dispatcher); err != nil {
t.Fatalf("Serve(%v) failed: %v", dispatcher, err)
}
@@ -227,10 +229,11 @@
if err != nil {
t.Fatalf("NewDispatcher() failed: %v", err)
}
- endpoint, err = server.Listen(profiles.LocalListenSpec)
+ endpoints, err = server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
}
+ endpoint = endpoints[0]
if err := server.ServeDispatcher("", dispatcher); err != nil {
t.Fatalf("Serve(%v) failed: %v", dispatcher, err)
}
diff --git a/services/mgmt/binary/binaryd/main.go b/services/mgmt/binary/binaryd/main.go
index 3ac83da..11c311b 100644
--- a/services/mgmt/binary/binaryd/main.go
+++ b/services/mgmt/binary/binaryd/main.go
@@ -85,7 +85,7 @@
}
defer server.Stop()
auth := vflag.NewAuthorizerOrDie()
- endpoint, err := server.Listen(roaming.ListenSpec)
+ endpoints, err := server.Listen(roaming.ListenSpec)
if err != nil {
vlog.Errorf("Listen(%s) failed: %v", roaming.ListenSpec, err)
return
@@ -94,7 +94,7 @@
vlog.Errorf("ServeDispatcher(%v) failed: %v", *name, err)
return
}
- epName := naming.JoinAddressName(endpoint.String(), "")
+ epName := naming.JoinAddressName(endpoints[0].String(), "")
if *name != "" {
vlog.Infof("Binary repository serving at %q (%q)", *name, epName)
} else {
diff --git a/services/mgmt/binary/impl/impl_test.go b/services/mgmt/binary/impl/impl_test.go
index b336cd1..a34937f 100644
--- a/services/mgmt/binary/impl/impl_test.go
+++ b/services/mgmt/binary/impl/impl_test.go
@@ -132,10 +132,11 @@
}
}()
dispatcher := NewDispatcher(state, nil)
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
}
+ endpoint := endpoints[0]
dontPublishName := ""
if err := server.ServeDispatcher(dontPublishName, dispatcher); err != nil {
t.Fatalf("Serve(%q) failed: %v", dontPublishName, err)
diff --git a/services/mgmt/build/impl/impl_test.go b/services/mgmt/build/impl/impl_test.go
index 5c659fa..4dfc78a 100644
--- a/services/mgmt/build/impl/impl_test.go
+++ b/services/mgmt/build/impl/impl_test.go
@@ -58,7 +58,7 @@
if err != nil {
t.Fatalf("NewServer() failed: %v", err)
}
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
}
@@ -66,7 +66,7 @@
if err := server.Serve(unpublished, build.BuilderServer(NewBuilderService(gobin, goroot)), nil); err != nil {
t.Fatalf("Serve(%q) failed: %v", unpublished, err)
}
- name := "/" + endpoint.String()
+ name := "/" + endpoints[0].String()
return build.BuilderClient(name), func() {
if err := server.Stop(); err != nil {
t.Fatalf("Stop() failed: %v", err)
diff --git a/services/mgmt/debug/dispatcher_test.go b/services/mgmt/debug/dispatcher_test.go
index 480de4d..4a65eaf 100644
--- a/services/mgmt/debug/dispatcher_test.go
+++ b/services/mgmt/debug/dispatcher_test.go
@@ -38,14 +38,14 @@
if err != nil {
return "", nil, fmt.Errorf("failed to start debug server: %v", err)
}
- endpoint, err := server.Listen(listenSpec)
+ endpoints, err := server.Listen(listenSpec)
if err != nil {
return "", nil, fmt.Errorf("failed to listen on %s: %v", listenSpec, err)
}
if err := server.ServeDispatcher("", disp); err != nil {
return "", nil, err
}
- ep := endpoint.String()
+ ep := endpoints[0].String()
return ep, func() { server.Stop() }, nil
}
diff --git a/services/mgmt/device/deviced/main.go b/services/mgmt/device/deviced/main.go
index 1397a24..e9221ba 100644
--- a/services/mgmt/device/deviced/main.go
+++ b/services/mgmt/device/deviced/main.go
@@ -50,11 +50,11 @@
vlog.Fatalf("NewServer() failed: %v", err)
}
defer server.Stop()
- endpoint, err := server.Listen(roaming.ListenSpec)
+ endpoints, err := server.Listen(roaming.ListenSpec)
if err != nil {
vlog.Fatalf("Listen(%s) failed: %v", roaming.ListenSpec, err)
}
- name := naming.JoinAddressName(endpoint.String(), "")
+ name := naming.JoinAddressName(endpoints[0].String(), "")
vlog.VI(0).Infof("Device manager object name: %v", name)
configState, err := config.Load()
if err != nil {
diff --git a/services/mgmt/device/impl/proxy_invoker_test.go b/services/mgmt/device/impl/proxy_invoker_test.go
index 4ed43a8..8ef35ac 100644
--- a/services/mgmt/device/impl/proxy_invoker_test.go
+++ b/services/mgmt/device/impl/proxy_invoker_test.go
@@ -32,7 +32,7 @@
}
defer server1.Stop()
localSpec := ipc.ListenSpec{Addrs: ipc.ListenAddrs{{"tcp", "127.0.0.1:0"}}}
- ep1, err := server1.Listen(localSpec)
+ eps1, err := server1.Listen(localSpec)
if err != nil {
t.Fatalf("Listen: %v", err)
}
@@ -46,13 +46,13 @@
t.Fatalf("NewServer: %v", err)
}
defer server2.Stop()
- ep2, err := server2.Listen(localSpec)
+ eps2, err := server2.Listen(localSpec)
if err != nil {
t.Fatalf("Listen: %v", err)
}
disp := &proxyDispatcher{
runtime,
- naming.JoinAddressName(ep1.String(), "__debug/stats"),
+ naming.JoinAddressName(eps1[0].String(), "__debug/stats"),
stats.StatsServer(nil),
}
if err := server2.ServeDispatcher("", disp); err != nil {
@@ -60,14 +60,14 @@
}
// Call Value()
- name := naming.JoinAddressName(ep2.String(), "system/start-time-rfc1123")
+ name := naming.JoinAddressName(eps2[0].String(), "system/start-time-rfc1123")
c := stats.StatsClient(name)
if _, err := c.Value(runtime.NewContext()); err != nil {
t.Fatalf("%q.Value() error: %v", name, err)
}
// Call Glob()
- results, err := testutil.GlobName(runtime.NewContext(), naming.JoinAddressName(ep2.String(), "system"), "start-time-*")
+ results, err := testutil.GlobName(runtime.NewContext(), naming.JoinAddressName(eps2[0].String(), "system"), "start-time-*")
if err != nil {
t.Fatalf("Glob failed: %v", err)
}
diff --git a/services/mgmt/device/impl/util_test.go b/services/mgmt/device/impl/util_test.go
index 52642ff..0293a99 100644
--- a/services/mgmt/device/impl/util_test.go
+++ b/services/mgmt/device/impl/util_test.go
@@ -53,6 +53,7 @@
t.Fatalf("failed to start root mount table: %s", err)
}
s := expect.NewSession(t, h.Stdout(), expectTimeout)
+ s.ExpectVar("PID")
rootName := s.ExpectVar("MT_NAME")
if t.Failed() {
t.Fatalf("failed to read mt name: %s", s.Error())
@@ -163,11 +164,11 @@
vlog.Fatalf("NewServer() failed: %v", err)
}
spec := ipc.ListenSpec{Addrs: ipc.ListenAddrs{{"tcp", "127.0.0.1:0"}}}
- endpoint, err := server.Listen(spec)
+ endpoints, err := server.Listen(spec)
if err != nil {
vlog.Fatalf("Listen(%s) failed: %v", spec, err)
}
- return server, endpoint.String()
+ return server, endpoints[0].String()
}
// resolveExpectNotFound verifies that the given name is not in the mounttable.
diff --git a/services/mgmt/lib/binary/impl_test.go b/services/mgmt/lib/binary/impl_test.go
index 216cfd1..7d6e589 100644
--- a/services/mgmt/lib/binary/impl_test.go
+++ b/services/mgmt/lib/binary/impl_test.go
@@ -56,7 +56,7 @@
t.Fatalf("NewState(%v, %v) failed: %v", rootDir, depth, err)
}
dispatcher := impl.NewDispatcher(state, nil)
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
}
@@ -64,7 +64,7 @@
if err := server.ServeDispatcher(suffix, dispatcher); err != nil {
t.Fatalf("Serve(%v, %v) failed: %v", suffix, dispatcher, err)
}
- von := naming.JoinAddressName(endpoint.String(), "test")
+ von := naming.JoinAddressName(endpoints[0].String(), "test")
return von, func() {
if err := os.Remove(path); err != nil {
t.Fatalf("Remove(%v) failed: %v", path, err)
diff --git a/services/mgmt/logreader/impl/logfile_test.go b/services/mgmt/logreader/impl/logfile_test.go
index c161d88..fb7833c 100644
--- a/services/mgmt/logreader/impl/logfile_test.go
+++ b/services/mgmt/logreader/impl/logfile_test.go
@@ -25,7 +25,7 @@
t.Fatalf("NewServer failed: %v", err)
return nil, "", err
}
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Fatalf("Listen failed: %v", err)
return nil, "", err
@@ -34,7 +34,7 @@
t.Fatalf("Serve failed: %v", err)
return nil, "", err
}
- return server, endpoint.String(), nil
+ return server, endpoints[0].String(), nil
}
func stopServer(t *testing.T, server ipc.Server) {
diff --git a/services/mgmt/pprof/client/proxy_test.go b/services/mgmt/pprof/client/proxy_test.go
index 2afeb05..04a79da 100644
--- a/services/mgmt/pprof/client/proxy_test.go
+++ b/services/mgmt/pprof/client/proxy_test.go
@@ -35,14 +35,14 @@
t.Fatalf("failed to start server: %v", err)
}
defer s.Stop()
- endpoint, err := s.Listen(profiles.LocalListenSpec)
+ endpoints, err := s.Listen(profiles.LocalListenSpec)
if err != nil {
t.Fatalf("failed to listen: %v", err)
}
if err := s.ServeDispatcher("", &dispatcher{impl.NewPProfService()}); err != nil {
t.Fatalf("failed to serve: %v", err)
}
- l, err := client.StartProxy(r, naming.JoinAddressName(endpoint.String(), ""))
+ l, err := client.StartProxy(r, naming.JoinAddressName(endpoints[0].String(), ""))
if err != nil {
t.Fatalf("failed to start proxy: %v", err)
}
diff --git a/services/mgmt/profile/impl/impl_test.go b/services/mgmt/profile/impl/impl_test.go
index 5517bca..b27486f 100644
--- a/services/mgmt/profile/impl/impl_test.go
+++ b/services/mgmt/profile/impl/impl_test.go
@@ -50,10 +50,11 @@
if err != nil {
t.Fatalf("NewDispatcher() failed: %v", err)
}
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
}
+ endpoint := endpoints[0]
if err := server.ServeDispatcher("", dispatcher); err != nil {
t.Fatalf("Serve failed: %v", err)
}
@@ -135,10 +136,11 @@
if err != nil {
t.Fatalf("NewDispatcher() failed: %v", err)
}
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
}
+ endpoint := endpoints[0]
if err := server.ServeDispatcher("", dispatcher); err != nil {
t.Fatalf("Serve failed: %v", err)
}
@@ -173,7 +175,7 @@
if err != nil {
t.Fatalf("NewDispatcher() failed: %v", err)
}
- endpoint, err = server.Listen(profiles.LocalListenSpec)
+ endpoints, err = server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
}
@@ -182,7 +184,7 @@
}
// Create client stubs for talking to the server.
- stub = repository.ProfileClient(naming.JoinAddressName(endpoint.String(), "linux/base"))
+ stub = repository.ProfileClient(naming.JoinAddressName(endpoints[0].String(), "linux/base"))
// Label
label, err = stub.Label(ctx)
diff --git a/services/mgmt/stats/impl/stats_test.go b/services/mgmt/stats/impl/stats_test.go
index c2c342a..02178a3 100644
--- a/services/mgmt/stats/impl/stats_test.go
+++ b/services/mgmt/stats/impl/stats_test.go
@@ -35,7 +35,7 @@
t.Fatalf("NewServer failed: %v", err)
return "", nil
}
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Fatalf("Listen failed: %v", err)
return "", nil
@@ -44,7 +44,7 @@
t.Fatalf("Serve failed: %v", err)
return "", nil
}
- return endpoint.String(), func() { server.Stop() }
+ return endpoints[0].String(), func() { server.Stop() }
}
func TestStatsImpl(t *testing.T) {
diff --git a/services/mgmt/vtrace/impl/vtrace_test.go b/services/mgmt/vtrace/impl/vtrace_test.go
index 3600fd9..9d7bb90 100644
--- a/services/mgmt/vtrace/impl/vtrace_test.go
+++ b/services/mgmt/vtrace/impl/vtrace_test.go
@@ -25,14 +25,14 @@
if err != nil {
t.Fatalf("Could not create server: %s", err)
}
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Fatalf("Listen failed: %s", err)
}
if err := server.Serve("", impl.NewVtraceService(runtime.VtraceStore()), nil); err != nil {
t.Fatalf("Serve failed: %s", err)
}
- return endpoint.String(), server, runtime
+ return endpoints[0].String(), server, runtime
}
func TestVtraceServer(t *testing.T) {
diff --git a/services/mounttable/lib/mounttable_test.go b/services/mounttable/lib/mounttable_test.go
index c0b8494..1f7cb29 100644
--- a/services/mounttable/lib/mounttable_test.go
+++ b/services/mounttable/lib/mounttable_test.go
@@ -171,14 +171,14 @@
boom(t, "NewMountTable: %v", err)
}
// Start serving on a loopback address.
- e, err := server.Listen(profiles.LocalListenSpec)
+ eps, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
boom(t, "Failed to Listen mount table: %s", err)
}
if err := server.ServeDispatcher("", mt); err != nil {
boom(t, "Failed to register mock collection: %s", err)
}
- estr := e.String()
+ estr := eps[0].String()
t.Logf("endpoint %s", estr)
return server, estr
}
@@ -189,7 +189,7 @@
boom(t, "r.NewServer: %s", err)
}
// Start serving on a loopback address.
- e, err := server.Listen(profiles.LocalListenSpec)
+ eps, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
boom(t, "Failed to Listen mount table: %s", err)
}
@@ -199,7 +199,7 @@
if err := server.ServeDispatcher(cPrefix, newCollectionServer()); err != nil {
boom(t, "Failed to register mock collection: %s", err)
}
- estr := e.String()
+ estr := eps[0].String()
t.Logf("endpoint %s", estr)
return server, estr
}
diff --git a/services/mounttable/lib/neighborhood_test.go b/services/mounttable/lib/neighborhood_test.go
index eb507b9..5d37e21 100644
--- a/services/mounttable/lib/neighborhood_test.go
+++ b/services/mounttable/lib/neighborhood_test.go
@@ -34,11 +34,11 @@
defer server.Stop()
// Start serving on a loopback address.
- e, err := server.Listen(profiles.LocalListenSpec)
+ eps, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
boom(t, "Failed to Listen mount table: %s", err)
}
- estr := e.String()
+ estr := eps[0].String()
addresses := []string{
naming.JoinAddressName(estr, ""),
naming.JoinAddressName(estr, "suffix1"),
diff --git a/services/mounttable/mounttabled/mounttable.go b/services/mounttable/mounttabled/mounttable.go
index a9b0a1c..57848e0 100644
--- a/services/mounttable/mounttabled/mounttable.go
+++ b/services/mounttable/mounttabled/mounttable.go
@@ -40,11 +40,12 @@
vlog.Errorf("r.NewMountTable failed: %v", err)
os.Exit(1)
}
- mtEndpoint, err := mtServer.Listen(roaming.ListenSpec)
+ mtEndpoints, err := mtServer.Listen(roaming.ListenSpec)
if err != nil {
vlog.Errorf("mtServer.Listen failed: %v", err)
os.Exit(1)
}
+ mtEndpoint := mtEndpoints[0]
name := *mountName
if err := mtServer.ServeDispatcher(name, mt); err != nil {
vlog.Errorf("ServeDispatcher(%v) failed: %v", name, err)
diff --git a/tools/application/impl_test.go b/tools/application/impl_test.go
index d7a6421..696dea1 100644
--- a/tools/application/impl_test.go
+++ b/tools/application/impl_test.go
@@ -85,7 +85,7 @@
t.Errorf("NewServer failed: %v", err)
return nil, nil, err
}
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Errorf("Listen failed: %v", err)
return nil, nil, err
@@ -94,7 +94,7 @@
t.Errorf("Serve failed: %v", err)
return nil, nil, err
}
- return server, endpoint, nil
+ return server, endpoints[0], nil
}
func stopServer(t *testing.T, server ipc.Server) {
diff --git a/tools/binary/impl_test.go b/tools/binary/impl_test.go
index 004a235..0a2554b 100644
--- a/tools/binary/impl_test.go
+++ b/tools/binary/impl_test.go
@@ -91,7 +91,7 @@
t.Errorf("NewServer failed: %v", err)
return nil, nil, err
}
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Errorf("Listen failed: %v", err)
return nil, nil, err
@@ -100,7 +100,7 @@
t.Errorf("ServeDispatcher failed: %v", err)
return nil, nil, err
}
- return server, endpoint, nil
+ return server, endpoints[0], nil
}
func stopServer(t *testing.T, server ipc.Server) {
diff --git a/tools/build/impl_test.go b/tools/build/impl_test.go
index 59f832d..094a0c3 100644
--- a/tools/build/impl_test.go
+++ b/tools/build/impl_test.go
@@ -43,7 +43,7 @@
if err != nil {
t.Fatalf("NewServer failed: %v", err)
}
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
}
@@ -51,7 +51,7 @@
if err := server.Serve(unpublished, build.BuilderServer(&mock{}), nil); err != nil {
t.Fatalf("Serve(%v) failed: %v", unpublished, err)
}
- return server, endpoint
+ return server, endpoints[0]
}
func stopServer(t *testing.T, server ipc.Server) {
diff --git a/tools/mgmt/device/devicemanager_mock_test.go b/tools/mgmt/device/devicemanager_mock_test.go
index 1ba7298..6bf5c37 100644
--- a/tools/mgmt/device/devicemanager_mock_test.go
+++ b/tools/mgmt/device/devicemanager_mock_test.go
@@ -167,7 +167,7 @@
t.Errorf("NewServer failed: %v", err)
return nil, nil, err
}
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Errorf("Listen failed: %v", err)
stopServer(t, server)
@@ -178,7 +178,7 @@
stopServer(t, server)
return nil, nil, err
}
- return server, endpoint, nil
+ return server, endpoints[0], nil
}
func stopServer(t *testing.T, server ipc.Server) {
diff --git a/tools/mounttable/impl_test.go b/tools/mounttable/impl_test.go
index ae9fa48..6680592 100644
--- a/tools/mounttable/impl_test.go
+++ b/tools/mounttable/impl_test.go
@@ -67,7 +67,7 @@
t.Errorf("NewServer failed: %v", err)
return nil, nil, err
}
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Errorf("Listen failed: %v", err)
return nil, nil, err
@@ -76,7 +76,7 @@
t.Errorf("ServeDispatcher failed: %v", err)
return nil, nil, err
}
- return server, endpoint, nil
+ return server, endpoints[0], nil
}
func stopServer(t *testing.T, server ipc.Server) {
diff --git a/tools/naming/simulator/ambiguity.scr b/tools/naming/simulator/ambiguity.scr
index 5db56ad..afa2c0a 100644
--- a/tools/naming/simulator/ambiguity.scr
+++ b/tools/naming/simulator/ambiguity.scr
@@ -22,15 +22,21 @@
set localaddr="--veyron.tcp.address=127.0.0.1:0"
root -- $localaddr
-eval $_
+set r=$_
+read $r
+eval $r
set s1=$MT_NAME
root -- $localaddr
-eval $_
+set r=$_
+read $r
+eval $r
set s2=$MT_NAME
root -- $localaddr
-eval $_
+set r=$_
+read $r
+eval $r
set s3=$MT_NAME
mount $s1/a $s2/b 1h
diff --git a/tools/naming/simulator/echo.scr b/tools/naming/simulator/echo.scr
index 09831c6..ca4228e 100644
--- a/tools/naming/simulator/echo.scr
+++ b/tools/naming/simulator/echo.scr
@@ -9,9 +9,9 @@
# A 'stand-alone' server
echoServer -- $localaddr $ws $localaddr "text" ""
set es=$_
-eval $es
-eval $es
read $es
+eval $es
+eval $es
set esName=$NAME
set esAddr=$ADDR
@@ -25,15 +25,18 @@
# now use a nameserver.
root -- $localaddr
-eval $_
+set r=$_
+read $r
+eval $r
set root=$MT_NAME
set NAMESPACE_ROOT=$root
echoServer -- $localaddr $ws $localaddr "text2" "a/b"
set es=$_
+read $es
+eval $es
eval $es
set es_name=$NAME
-read $es
set es_addr=$ADDR
echoClient "a/b" "test 2"
diff --git a/tools/naming/simulator/json_example.scr b/tools/naming/simulator/json_example.scr
index d04886a..e8f740c 100644
--- a/tools/naming/simulator/json_example.scr
+++ b/tools/naming/simulator/json_example.scr
@@ -6,16 +6,17 @@
root -- $localaddr
set root=$_
eval $root
+set ROOT_PID=$PID
+eval $root
set ROOT_NAME=$MT_NAME
read $root
-eval $root
-set ROOT_PID=$PID
json_set ROOT_NAME ROOT_PID
set PROXY_MOUNTPOINT=$ROOT_NAME/proxy/mp
proxyd -- $localaddr $PROXY_MOUNTPOINT
set proxyd=$_
read $proxyd
+read $proxyd
eval $proxyd
set PROXYD_NAME=$PROXY_NAME
splitEP $PROXY_NAME
diff --git a/tools/naming/simulator/mt_complex.scr b/tools/naming/simulator/mt_complex.scr
index daabc3b..54aaeeb 100644
--- a/tools/naming/simulator/mt_complex.scr
+++ b/tools/naming/simulator/mt_complex.scr
@@ -9,6 +9,7 @@
root -- $localaddr
set root_h=$_
+read $root_h
eval $root_h
set root=$MT_NAME
@@ -16,6 +17,7 @@
mt -- $localaddr tl/a
set m=$_
set mt_a_h=$m
+read $m
eval $m
eval $m
set mt_a_name=$MT_NAME
@@ -26,6 +28,7 @@
set mt_b_h=$m
eval $m
eval $m
+eval $m
set mt_b_name=$MT_NAME
set mt_b_addr=$MT_ADDR
@@ -77,6 +80,7 @@
echoServer -- $localaddr "E1" tl
set es_E1=$_
read $es_E1
+read $es_E1
eval $es_E1
set es_E1_addr=$ADDR
@@ -130,8 +134,8 @@
echoServer -- $localaddr "E2" tl/a
set es_E2=$_
read $es_E2
-eval $es_E2
read $es_E2
+eval $es_E2
set es_E2_addr=$ADDR
# we can invoke the echo server 'E2' just fine, probably because
@@ -210,6 +214,7 @@
set long_name=tl/b/some/deep/name/that/is/a/mount/table
mt -- $localaddr $long_name
set m=$_
+read $m
eval $m
eval $m
set mt_l_name=$MT_NAME
@@ -220,6 +225,7 @@
set second_long_name=tl/a/some/deep/name/that/is/a/mount/table
mt -- $localaddr $second_long_name
set m=$_
+read $m
eval $m
eval $m
set mt_l2_name=$MT_NAME
diff --git a/tools/naming/simulator/mt_simple.scr b/tools/naming/simulator/mt_simple.scr
index ab548a1..ef648ec 100644
--- a/tools/naming/simulator/mt_simple.scr
+++ b/tools/naming/simulator/mt_simple.scr
@@ -4,15 +4,21 @@
set ws=--veyron.tcp.protocol=ws
root -- $localaddr
-eval $_
+set m=$_
+read $m
+eval $m
set root=$MT_NAME
set NAMESPACE_ROOT=$root
mt -- $localaddr $ws $localaddr usa
-eval $_
+set m=$_
+read $m
+eval $m
set usa_mt=$MT_NAME
mt -- $localaddr $ws $localaddr uk
-eval $_
+set m=$_
+read $m
+eval $m
set uk_mt=$MT_NAME
ls $root/...
@@ -23,12 +29,16 @@
set NAMESPACE_ROOT=$usa_mt
mt -- $localaddr $ws $localaddr "palo alto"
-eval $_
+set m=$_
+read $m
+eval $m
set pa_mt=$MT_NAME
set NAMESPACE_ROOT=$uk_mt
mt -- $localaddr $ws $localaddr "cambridge"
-eval $_
+set m=$_
+read $m
+eval $m
set cam_mt=$MT_NAME
ls $root/...
diff --git a/tools/naming/simulator/proxy.scr b/tools/naming/simulator/proxy.scr
index 0ef2d7b..5438e4f 100644
--- a/tools/naming/simulator/proxy.scr
+++ b/tools/naming/simulator/proxy.scr
@@ -4,8 +4,10 @@
set localaddr=--veyron.tcp.address=127.0.0.1:0
set ws=--veyron.tcp.protocol=ws
-root -- $localaddr $ws $localaddr
-eval $_
+root -- $localaddr
+set m=$_
+read $m
+eval $m
set root=$MT_NAME
set NAMESPACE_ROOT=$root
setRoots $NAMESPACE_ROOT
@@ -14,6 +16,7 @@
# run a non-proxied echo server
echoServer -- $localaddr $ws $localaddr noproxy echo/noproxy
set esnp=$_
+read $esnp
eval $esnp
set NP_ECHOS_NAME=$NAME
eval $esnp
@@ -28,6 +31,7 @@
# run a proxy server
proxyd -- $localaddr $ws $localaddr p1
set proxy=$_
+read $proxy
# PROXY_ADDR=<address of proxy>
eval $proxy
# PROXY_NAME=<name of proxy>
@@ -49,6 +53,7 @@
echoServer -- $localaddr $ws $localaddr --veyron.proxy=p1 withproxy echo/withproxy
set eswp=$_
+read $eswp
eval $eswp
set ECHOS_NAME=$NAME
eval $eswp
diff --git a/tools/naming/simulator/public_echo.scr b/tools/naming/simulator/public_echo.scr
index 6349aa3..6942baa 100644
--- a/tools/naming/simulator/public_echo.scr
+++ b/tools/naming/simulator/public_echo.scr
@@ -11,6 +11,7 @@
set global_name=global/echo
echoServer -- $localaddr "text2" $global_name
set es=$_
+read $es
eval $es
set es_name=$NAME
eval $es
diff --git a/tools/principal/main.go b/tools/principal/main.go
index d70d12c..dfbfd1a 100644
--- a/tools/principal/main.go
+++ b/tools/principal/main.go
@@ -623,7 +623,7 @@
return fmt.Errorf("failed to create server to listen for blessings: %v", err)
}
defer server.Stop()
- ep, err := server.Listen(profile.ListenSpec)
+ eps, err := server.Listen(profile.ListenSpec)
if err != nil {
return fmt.Errorf("failed to setup listening: %v", err)
}
@@ -645,7 +645,7 @@
fmt.Println("You may want to adjust flags affecting the caveats on this blessing, for example using")
fmt.Println("the --for flag, or change the extension to something more meaningful")
fmt.Println()
- fmt.Printf("principal bless --remote_key=%v --remote_token=%v %v %v\n", runtime.Principal().PublicKey(), service.token, naming.JoinAddressName(ep.String(), ""), extension)
+ fmt.Printf("principal bless --remote_key=%v --remote_token=%v %v %v\n", runtime.Principal().PublicKey(), service.token, naming.JoinAddressName(eps[0].String(), ""), extension)
fmt.Println()
fmt.Println("...waiting for sender..")
return <-service.notify
diff --git a/tools/profile/impl_test.go b/tools/profile/impl_test.go
index 9569760..e8925e9 100644
--- a/tools/profile/impl_test.go
+++ b/tools/profile/impl_test.go
@@ -89,7 +89,7 @@
t.Errorf("NewServer failed: %v", err)
return nil, nil, err
}
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Errorf("Listen failed: %v", err)
return nil, nil, err
@@ -98,7 +98,7 @@
t.Errorf("ServeDispatcher failed: %v", err)
return nil, nil, err
}
- return server, endpoint, nil
+ return server, endpoints[0], nil
}
func stopServer(t *testing.T, server ipc.Server) {
diff --git a/tools/vrpc/impl_test.go b/tools/vrpc/impl_test.go
index 4204b33..1bf91de 100644
--- a/tools/vrpc/impl_test.go
+++ b/tools/vrpc/impl_test.go
@@ -133,7 +133,7 @@
return nil, nil, err
}
- endpoint, err := server.Listen(profiles.LocalListenSpec)
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
if err != nil {
t.Errorf("Listen failed: %v", err)
return nil, nil, err
@@ -142,7 +142,7 @@
t.Errorf("Serve failed: %v", err)
return nil, nil, err
}
- return server, endpoint, nil
+ return server, endpoints[0], nil
}
func stopServer(t *testing.T, server ipc.Server) {