veyron/runtimes/google: Remove dischargeclient client and server opts
and use only NoDischarges opt only instead.

This is aimed at removing client opts that need to may need to be shared
when created new client from a context.

Change-Id: Ib8a324f70a604733b35c903d29cde45ce4c988ae
diff --git a/runtimes/google/ipc/client.go b/runtimes/google/ipc/client.go
index 4269466..1d807fe 100644
--- a/runtimes/google/ipc/client.go
+++ b/runtimes/google/ipc/client.go
@@ -115,16 +115,13 @@
 }
 
 func InternalNewClient(streamMgr stream.Manager, ns naming.Namespace, opts ...ipc.ClientOpt) (ipc.Client, error) {
-
 	c := &client{
 		streamMgr: streamMgr,
 		ns:        ns,
 		vcMap:     make(map[string]*vcInfo),
 	}
+	c.dc = InternalNewDischargeClient(nil, c)
 	for _, opt := range opts {
-		if dc, ok := opt.(vc.DischargeClient); ok {
-			c.dc = dc
-		}
 		// Collect all client opts that are also vc opts.
 		switch v := opt.(type) {
 		case stream.VCOpt:
@@ -133,6 +130,7 @@
 			c.preferredProtocols = v
 		}
 	}
+	c.vcOpts = append(c.vcOpts, c.dc)
 
 	return c, nil
 }
@@ -372,7 +370,8 @@
 	var resolveOpts []naming.ResolveOpt
 	if skipResolve {
 		resolveOpts = append(resolveOpts, naming.SkipResolveOpt{})
-	} else if noDischarges {
+	}
+	if noDischarges {
 		resolveOpts = append(resolveOpts, vc.NoDischarges{})
 	}
 
diff --git a/runtimes/google/ipc/discharges.go b/runtimes/google/ipc/discharges.go
index be7641d..09a1abc 100644
--- a/runtimes/google/ipc/discharges.go
+++ b/runtimes/google/ipc/discharges.go
@@ -1,7 +1,6 @@
 package ipc
 
 import (
-	"fmt"
 	"sync"
 
 	"v.io/core/veyron/runtimes/google/ipc/stream/vc"
@@ -9,8 +8,6 @@
 
 	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
-	"v.io/core/veyron2/ipc/stream"
-	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/security"
 	"v.io/core/veyron2/vdl/vdlutil"
 	"v.io/core/veyron2/vlog"
@@ -31,23 +28,14 @@
 // PrepareDischarges call. This typically happens when fetching discharges on
 // behalf of a server accepting connections, i.e., before any notion of the
 // "context" of an API call has been established.
-func InternalNewDischargeClient(streamMgr stream.Manager, ns naming.Namespace, defaultCtx *context.T, opts ...ipc.ClientOpt) (vc.DischargeClient, error) {
-	if defaultCtx == nil {
-		return nil, fmt.Errorf("must provide a non-nil context to InternalNewDischargeClient")
-	}
-	c, err := InternalNewClient(streamMgr, ns, opts...)
-	if err != nil {
-		return nil, err
-	}
+func InternalNewDischargeClient(defaultCtx *context.T, client ipc.Client) vc.DischargeClient {
 	return &dischargeClient{
-		c:          c,
+		c:          client,
 		defaultCtx: defaultCtx,
 		cache:      dischargeCache{cache: make(map[string]security.Discharge)},
-	}, nil
+	}
 }
 
-func (*dischargeClient) IPCClientOpt()         {}
-func (*dischargeClient) IPCServerOpt()         {}
 func (*dischargeClient) IPCStreamListenerOpt() {}
 func (*dischargeClient) IPCStreamVCOpt()       {}
 
diff --git a/runtimes/google/ipc/full_test.go b/runtimes/google/ipc/full_test.go
index cd6ac56..259a45e 100644
--- a/runtimes/google/ipc/full_test.go
+++ b/runtimes/google/ipc/full_test.go
@@ -452,15 +452,7 @@
 		}
 	)
 
-	ctx := testContextWithoutDeadline()
-
-	// Start the main server.
-	dc, err := InternalNewDischargeClient(mgr, ns, ctx, vc.LocalPrincipal{pserver})
-	if err != nil {
-		t.Errorf("InternalNewDischargeClient failed: %v", err)
-	}
-
-	_, server := startServer(t, pserver, mgr, ns, serverName, testServerDisp{&testServer{}}, dc)
+	_, server := startServer(t, pserver, mgr, ns, serverName, testServerDisp{&testServer{}})
 	defer stopServer(t, server, ns, serverName)
 
 	// Start the discharge server.
@@ -487,6 +479,7 @@
 			t.Errorf("%s: failed to create client: %v", name, err)
 			continue
 		}
+		ctx := testContextWithoutDeadline()
 		dctx, cancel := ctx.WithTimeout(10 * time.Second)
 		call, err := client.StartCall(dctx, fmt.Sprintf("[%s]%s/suffix", test.pattern, serverName), "Method", nil)
 		if !matchesErrorPattern(err, test.errID, test.err) {
@@ -777,12 +770,6 @@
 		t.Fatal(err)
 	}
 
-	// DischargeClient used to fetch discharges.
-	dc, err := InternalNewDischargeClient(sm, ns, testContext(), vc.LocalPrincipal{pclient})
-	if err != nil {
-		t.Fatalf("InternalDischargeNewClient failed: %v", err)
-	}
-
 	// Setup the application server.
 	appServer, err := InternalNewServer(testContext(), sm, ns, nil, vc.LocalPrincipal{pserver})
 	if err != nil {
@@ -832,7 +819,7 @@
 
 	for testidx, test := range tests {
 		pclient := mkClient(test.Requirements)
-		client, err := InternalNewClient(sm, ns, pclient, dc)
+		client, err := InternalNewClient(sm, ns, pclient)
 		if err != nil {
 			t.Fatalf("InternalNewClient(%+v) failed: %v", test.Requirements, err)
 		}
@@ -990,11 +977,7 @@
 
 	for _, test := range tests {
 		name := fmt.Sprintf("%q.%s(%v) by %v", test.name, test.method, test.args, test.blessings)
-		dc, err := InternalNewDischargeClient(mgr, ns, testContext(), vc.LocalPrincipal{pclient})
-		if err != nil {
-			t.Errorf("InternalNewDischargeClient failed: %v", err)
-		}
-		client, err := InternalNewClient(mgr, ns, vc.LocalPrincipal{pclient}, dc)
+		client, err := InternalNewClient(mgr, ns, vc.LocalPrincipal{pclient})
 		if err != nil {
 			t.Fatalf("InternalNewClient failed: %v", err)
 		}
@@ -1035,11 +1018,8 @@
 	b := createBundle(t, nil, pserver, &testServer{})
 	defer b.cleanup(t)
 
-	dc, err := InternalNewDischargeClient(b.sm, b.ns, testContext(), vc.LocalPrincipal{pclient})
-	if err != nil {
-		t.Fatalf("InternalNewDischargeClient failed: %v", err)
-	}
-	if b.client, err = InternalNewClient(b.sm, b.ns, vc.LocalPrincipal{pclient}, dc); err != nil {
+	var err error
+	if b.client, err = InternalNewClient(b.sm, b.ns, vc.LocalPrincipal{pclient}); err != nil {
 		t.Fatalf("InternalNewClient failed: %v", err)
 	}
 	call := func() verror.E {
@@ -1508,11 +1488,7 @@
 		}
 		smc := imanager.InternalNew(rid)
 		defer smc.Shutdown()
-		dc, err := InternalNewDischargeClient(smc, ns, testContext())
-		if err != nil {
-			t.Fatal(err)
-		}
-		client, err := InternalNewClient(smc, ns, vc.LocalPrincipal{pclient}, dc)
+		client, err := InternalNewClient(smc, ns, vc.LocalPrincipal{pclient})
 		if err != nil {
 			t.Fatalf("failed to create client: %v", err)
 		}
@@ -1586,10 +1562,12 @@
 		t.Fatal(err)
 	}
 	sm := imanager.InternalNew(rid)
-	dc, err := InternalNewDischargeClient(sm, ns, testContext(), vc.LocalPrincipal{pdischargeClient})
+
+	c, err := InternalNewClient(sm, ns, vc.LocalPrincipal{pdischargeClient})
 	if err != nil {
-		t.Fatal(err)
+		t.Fatalf("failed to create client: %v", err)
 	}
+	dc := c.(*client).dc
 	tpcav2, err := security.NewPublicKeyCaveat(pdischarger2.PublicKey(), "mountpoint/discharger2", security.ThirdPartyRequirements{}, mkCaveat(security.ExpiryCaveat(time.Now().Add(time.Hour))))
 	if err != nil {
 		t.Error(err)
diff --git a/runtimes/google/ipc/server.go b/runtimes/google/ipc/server.go
index ca3b7c8..0b85a52 100644
--- a/runtimes/google/ipc/server.go
+++ b/runtimes/google/ipc/server.go
@@ -123,6 +123,13 @@
 			s.preferredProtocols = []string(opt)
 		}
 	}
+	// TODO(suharshs,mattr): Get a client from the context.
+	client, err := InternalNewClient(streamMgr, ns)
+	if err != nil {
+		return nil, fmt.Errorf("failed to create discharge-client: %v", err)
+	}
+	dc := InternalNewDischargeClient(ctx, client)
+	s.listenerOpts = append(s.listenerOpts, dc)
 	blessingsStatsName := naming.Join(statsPrefix, "security", "blessings")
 	if blessings != nil {
 		// TODO(caprita): revist printing the blessings with %s, and
diff --git a/runtimes/google/ipc/stream/vc/vc.go b/runtimes/google/ipc/stream/vc/vc.go
index a52585b..e9521b5 100644
--- a/runtimes/google/ipc/stream/vc/vc.go
+++ b/runtimes/google/ipc/stream/vc/vc.go
@@ -126,8 +126,6 @@
 	// Invalidate marks the provided discharges as invalid, and therefore unfit
 	// for being returned by a subsequent PrepareDischarges call.
 	Invalidate(discharges ...security.Discharge)
-	IPCServerOpt()
-	IPCClientOpt()
 	IPCStreamListenerOpt()
 	IPCStreamVCOpt()
 }
diff --git a/runtimes/google/ipc/stream/vc/vc_test.go b/runtimes/google/ipc/stream/vc/vc_test.go
index ab6a300..3c05f16 100644
--- a/runtimes/google/ipc/stream/vc/vc_test.go
+++ b/runtimes/google/ipc/stream/vc/vc_test.go
@@ -171,8 +171,6 @@
 func (mockDischargeClient) Invalidate(...security.Discharge) {}
 func (mockDischargeClient) IPCStreamListenerOpt()            {}
 func (mockDischargeClient) IPCStreamVCOpt()                  {}
-func (mockDischargeClient) IPCServerOpt()                    {}
-func (mockDischargeClient) IPCClientOpt()                    {}
 
 // Test that mockDischargeClient implements vc.DischargeClient.
 var _ vc.DischargeClient = (mockDischargeClient)(nil)
diff --git a/runtimes/google/rt/ipc.go b/runtimes/google/rt/ipc.go
index 227455e..6e4439f 100644
--- a/runtimes/google/rt/ipc.go
+++ b/runtimes/google/rt/ipc.go
@@ -37,12 +37,7 @@
 		}
 	}
 	otherOpts = append(otherOpts, vc.LocalPrincipal{rt.principal}, &imanager.DialTimeout{5 * time.Minute}, rt.preferredProtocols)
-
-	dc, err := iipc.InternalNewDischargeClient(sm, ns, rt.NewContext(), otherOpts...)
-	if err != nil {
-		return nil, fmt.Errorf("failed to create discharge-client: %v", err)
-	}
-	return iipc.InternalNewClient(sm, ns, append(otherOpts, dc)...)
+	return iipc.InternalNewClient(sm, ns, otherOpts...)
 }
 
 func (rt *vrt) Client() ipc.Client {
@@ -113,16 +108,8 @@
 	if len(rt.preferredProtocols) > 0 {
 		otherOpts = append(otherOpts, iipc.PreferredServerResolveProtocols(rt.preferredProtocols))
 	}
-
-	// Add the option that provides a discharge client to the server.
-	// TODO(cnicolaou): extend the timeout when parallel connections are
-	// going.
 	ctx := rt.NewContext()
-	dc, err := iipc.InternalNewDischargeClient(sm, ns, ctx, vc.LocalPrincipal{rt.principal}, &imanager.DialTimeout{5 * time.Second})
-	if err != nil {
-		return nil, fmt.Errorf("failed to create discharge-client: %v", err)
-	}
-	return iipc.InternalNewServer(ctx, sm, ns, rt.traceStore, append(otherOpts, dc)...)
+	return iipc.InternalNewServer(ctx, sm, ns, rt.traceStore, otherOpts...)
 }
 
 func (rt *vrt) NewStreamManager(opts ...stream.ManagerOpt) (stream.Manager, error) {