veyron2/ipc: Invoker.Prepare will now return all tags associated with a
method, not just the security label.
This is primarily motivated by the goal of making security labels
"dynamic" (more discussion in:
https://docs.google.com/a/google.com/document/d/1DZUu2sGKrf-b4p9JFdIbN0ULhz9Loa8reuPNKsdMKD0/edit#
), however, the author feels that this commit is worthwhile regardless,
as it makes the power of method tagging in VDL more "accessible".
Change-Id: Ibcf3d549dc466339a31f871fb3e272a648295ebc
diff --git a/runtimes/google/ipc/flow_test.go b/runtimes/google/ipc/flow_test.go
index 97ca9cd..f121968 100644
--- a/runtimes/google/ipc/flow_test.go
+++ b/runtimes/google/ipc/flow_test.go
@@ -71,8 +71,8 @@
return closureInvoker{suffix}
}
-func (closureInvoker) Prepare(method string, numArgs int) (argptrs []interface{}, label security.Label, err error) {
- return nil, security.AdminLabel, nil
+func (closureInvoker) Prepare(method string, numArgs int) (argptrs, tags []interface{}, err error) {
+ return nil, []interface{}{security.AdminLabel}, nil
}
func (inv closureInvoker) Invoke(method string, call ipc.ServerCall, argptrs []interface{}) (results []interface{}, err error) {
@@ -90,9 +90,9 @@
return echoInvoker{suffix}
}
-func (echoInvoker) Prepare(method string, numArgs int) (argptrs []interface{}, label security.Label, err error) {
+func (echoInvoker) Prepare(method string, numArgs int) (argptrs, tags []interface{}, err error) {
var arg string
- return []interface{}{&arg}, security.AdminLabel, nil
+ return []interface{}{&arg}, []interface{}{security.AdminLabel}, nil
}
func (inv echoInvoker) Invoke(method string, call ipc.ServerCall, argptrs []interface{}) (results []interface{}, err error) {
diff --git a/runtimes/google/ipc/server.go b/runtimes/google/ipc/server.go
index 115615f..6d8e1dd 100644
--- a/runtimes/google/ipc/server.go
+++ b/runtimes/google/ipc/server.go
@@ -856,8 +856,8 @@
}
// Prepare invoker and decode args.
numArgs := int(req.NumPosArgs)
- argptrs, label, err := invoker.Prepare(req.Method, numArgs)
- fs.label = label
+ argptrs, tags, err := invoker.Prepare(req.Method, numArgs)
+ fs.label = labelFromTags(tags)
if err != nil {
return nil, verror.Makef(verror.ErrorID(err), "%s: name: %q", err, req.Suffix)
}
@@ -961,14 +961,14 @@
// TODO(cnicolaou): ipc.Serve TRANSITION
invoker, ok := obj.(ipc.Invoker)
if !ok {
- panic("Lookup should have returned an ipc.Invoker")
+ panic(fmt.Errorf("Lookup should have returned an ipc.Invoker, returned %T", obj))
}
if obj == nil || !ok {
return verror.NoExistf("ipc: invoker not found for Glob")
}
- argptrs, label, err := invoker.Prepare("Glob", 1)
- i.fs.label = label
+ argptrs, tags, err := invoker.Prepare("Glob", 1)
+ i.fs.label = labelFromTags(tags)
if err != nil {
return verror.Makef(verror.ErrorID(err), "%s", err)
}
@@ -1122,3 +1122,12 @@
//nologcall
return fs.flow.RemoteEndpoint()
}
+
+func labelFromTags(tags []interface{}) security.Label {
+ for _, t := range tags {
+ if l, ok := t.(security.Label); ok {
+ return l
+ }
+ }
+ return security.AdminLabel
+}