Skip to content

Commit b4a2701

Browse files
author
Jason Yellick
committed
FAB-11954 Pass peer addr and TLS together
Presently, the docker controller is configured with the peer address of the chaincode server that chaincodes should connect back to. This is a bit awkward, because the other connection into, the TLS parameters, come across at start time. Passing these two together simplifies the concept and prepares us to pass the two together to 'launch' in the external builder. Change-Id: Ia550cfe493d57e79ee61a5ce0230deede252c0f6 Signed-off-by: Jason Yellick <jyellick@us.ibm.com>
1 parent ff9f66f commit b4a2701

File tree

11 files changed

+79
-59
lines changed

11 files changed

+79
-59
lines changed

core/chaincode/container_runtime.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ type ContainerRuntime struct {
2626
CertGenerator CertGenerator
2727
ContainerRouter *container.Router
2828
CACert []byte
29+
PeerAddress string
2930
}
3031

3132
// Start launches chaincode in a runtime environment.
@@ -55,7 +56,10 @@ func (c *ContainerRuntime) Start(ccci *ccprovider.ChaincodeContainerInfo, codePa
5556
if err := c.ContainerRouter.Start(
5657
ccintf.New(ccci.PackageID),
5758
ccci.Type,
58-
tlsConfig,
59+
&ccintf.PeerConnection{
60+
Address: c.PeerAddress,
61+
TLSConfig: tlsConfig,
62+
},
5963
); err != nil {
6064
return errors.WithMessage(err, "error starting container")
6165
}

core/chaincode/container_runtime_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ func TestContainerRuntimeStart(t *testing.T) {
2727
ContainerRouter: &container.Router{
2828
DockerVM: fakeVM,
2929
},
30+
PeerAddress: "peer-address",
3031
}
3132

3233
ccci := &ccprovider.ChaincodeContainerInfo{
@@ -52,10 +53,11 @@ func TestContainerRuntimeStart(t *testing.T) {
5253
assert.Equal(t, []byte("code-package"), codePackage)
5354

5455
assert.Equal(t, 1, fakeVM.StartCallCount())
55-
ccid, ccType, tlsConfig := fakeVM.StartArgsForCall(0)
56+
ccid, ccType, peerConnection := fakeVM.StartArgsForCall(0)
5657
assert.Equal(t, ccintf.CCID("chaincode-name:chaincode-version"), ccid)
5758
assert.Equal(t, "GOLANG", ccType)
58-
assert.Nil(t, tlsConfig)
59+
assert.Equal(t, "peer-address", peerConnection.Address)
60+
assert.Nil(t, peerConnection.TLSConfig)
5961
}
6062

6163
func TestContainerRuntimeStartErrors(t *testing.T) {

core/chaincode/exectransaction_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,9 @@ func initPeer(chainIDs ...string) (*cm.Lifecycle, net.Listener, *ChaincodeSuppor
152152
Registry: pr,
153153
Client: client,
154154
},
155-
PeerAddress: peerAddress,
156155
},
157156
},
157+
PeerAddress: peerAddress,
158158
}
159159
userRunsCC := false
160160
metricsProviders := &disabled.Provider{}

core/chaincode/mock/container_vm.go

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/container/ccintf/ccintf.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ func New(packageID persistence.PackageID) CCID {
3434
return CCID(packageID.String())
3535
}
3636

37+
// PeerConnection instructs the chaincode how to connect back to the peer
38+
type PeerConnection struct {
39+
Address string
40+
TLSConfig *TLSConfig
41+
}
42+
3743
// TLSConfig is used to pass the TLS context into the chaincode launch
3844
type TLSConfig struct {
3945
ClientCert []byte

core/container/container.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ var vmLogger = flogging.MustGetLogger("container")
1919
//VM is an abstract virtual image for supporting arbitrary virual machines
2020
type VM interface {
2121
Build(ccci *ccprovider.ChaincodeContainerInfo, codePackage []byte) error
22-
Start(ccid ccintf.CCID, ccType string, tlsConfig *ccintf.TLSConfig) error
22+
Start(ccid ccintf.CCID, ccType string, peerConnection *ccintf.PeerConnection) error
2323
Stop(ccid ccintf.CCID) error
2424
Wait(ccid ccintf.CCID) (int, error)
2525
}
@@ -55,8 +55,8 @@ func (r *Router) Build(ccci *ccprovider.ChaincodeContainerInfo, codePackage []by
5555
return r.getVM(ccintf.New(ccci.PackageID)).Build(ccci, codePackage)
5656
}
5757

58-
func (r *Router) Start(ccid ccintf.CCID, ccType string, tlsConfig *ccintf.TLSConfig) error {
59-
return r.getVM(ccid).Start(ccid, ccType, tlsConfig)
58+
func (r *Router) Start(ccid ccintf.CCID, ccType string, peerConnection *ccintf.PeerConnection) error {
59+
return r.getVM(ccid).Start(ccid, ccType, peerConnection)
6060
}
6161

6262
func (r *Router) Stop(ccid ccintf.CCID) error {

core/container/container_test.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,22 +40,28 @@ var _ = Describe("Container", func() {
4040
err := router.Start(
4141
ccintf.CCID("start:name"),
4242
"fake-ccType",
43-
&ccintf.TLSConfig{
44-
ClientKey: []byte("key"),
45-
ClientCert: []byte("cert"),
46-
RootCert: []byte("root"),
43+
&ccintf.PeerConnection{
44+
Address: "peer-address",
45+
TLSConfig: &ccintf.TLSConfig{
46+
ClientKey: []byte("key"),
47+
ClientCert: []byte("cert"),
48+
RootCert: []byte("root"),
49+
},
4750
},
4851
)
4952

5053
Expect(err).To(MatchError("fake-start-error"))
5154
Expect(fakeVM.StartCallCount()).To(Equal(1))
52-
ccid, args, tlsConfig := fakeVM.StartArgsForCall(0)
55+
ccid, args, peerConnection := fakeVM.StartArgsForCall(0)
5356
Expect(ccid).To(Equal(ccintf.CCID("start:name")))
5457
Expect(args).To(Equal("fake-ccType"))
55-
Expect(tlsConfig).To(Equal(&ccintf.TLSConfig{
56-
ClientKey: []byte("key"),
57-
ClientCert: []byte("cert"),
58-
RootCert: []byte("root"),
58+
Expect(peerConnection).To(Equal(&ccintf.PeerConnection{
59+
Address: "peer-address",
60+
TLSConfig: &ccintf.TLSConfig{
61+
ClientKey: []byte("key"),
62+
ClientCert: []byte("cert"),
63+
RootCert: []byte("root"),
64+
},
5965
}))
6066
})
6167
})

core/container/dockercontroller/dockercontroller.go

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ type DockerVM struct {
8686
ChaincodePull bool
8787
NetworkMode string
8888
PlatformBuilder PlatformBuilder
89-
PeerAddress string
9089
}
9190

9291
// HealthCheck checks if the DockerVM is able to communicate with the Docker
@@ -177,16 +176,16 @@ func (vm *DockerVM) Build(ccci *ccprovider.ChaincodeContainerInfo, codePackage [
177176
return nil
178177
}
179178

180-
func (vm *DockerVM) GetArgs(ccType string) ([]string, error) {
179+
func (vm *DockerVM) GetArgs(ccType string, peerAddress string) ([]string, error) {
181180
// language specific arguments, possibly should be pushed back into platforms, but were simply
182181
// ported from the container_runtime chaincode component
183182
switch ccType {
184183
case pb.ChaincodeSpec_GOLANG.String(), pb.ChaincodeSpec_CAR.String():
185-
return []string{"chaincode", fmt.Sprintf("-peer.address=%s", vm.PeerAddress)}, nil
184+
return []string{"chaincode", fmt.Sprintf("-peer.address=%s", peerAddress)}, nil
186185
case pb.ChaincodeSpec_JAVA.String():
187-
return []string{"/root/chaincode-java/start", "--peerAddress", vm.PeerAddress}, nil
186+
return []string{"/root/chaincode-java/start", "--peerAddress", peerAddress}, nil
188187
case pb.ChaincodeSpec_NODE.String():
189-
return []string{"/bin/sh", "-c", fmt.Sprintf("cd /usr/local/src; npm start -- --peer.address %s", vm.PeerAddress)}, nil
188+
return []string{"/bin/sh", "-c", fmt.Sprintf("cd /usr/local/src; npm start -- --peer.address %s", peerAddress)}, nil
190189
default:
191190
return nil, errors.Errorf("unknown chaincodeType: %s", ccType)
192191
}
@@ -223,7 +222,7 @@ func GetEnv(ccid ccintf.CCID, tlsConfig *ccintf.TLSConfig) []string {
223222
}
224223

225224
// Start starts a container using a previously created docker image
226-
func (vm *DockerVM) Start(ccid ccintf.CCID, ccType string, tlsConfig *ccintf.TLSConfig) error {
225+
func (vm *DockerVM) Start(ccid ccintf.CCID, ccType string, peerConnection *ccintf.PeerConnection) error {
227226
imageName, err := vm.GetVMNameForDocker(ccid)
228227
if err != nil {
229228
return err
@@ -234,13 +233,13 @@ func (vm *DockerVM) Start(ccid ccintf.CCID, ccType string, tlsConfig *ccintf.TLS
234233

235234
vm.stopInternal(containerName)
236235

237-
args, err := vm.GetArgs(ccType)
236+
args, err := vm.GetArgs(ccType, peerConnection.Address)
238237
if err != nil {
239238
return errors.WithMessage(err, "could not get args")
240239
}
241240
dockerLogger.Debugf("start container with args: %s", strings.Join(args, " "))
242241

243-
env := GetEnv(ccid, tlsConfig)
242+
env := GetEnv(ccid, peerConnection.TLSConfig)
244243
dockerLogger.Debugf("start container with env:\n\t%s", strings.Join(env, "\n\t"))
245244

246245
err = vm.createContainer(imageName, containerName, args, env)
@@ -256,16 +255,16 @@ func (vm *DockerVM) Start(ccid ccintf.CCID, ccType string, tlsConfig *ccintf.TLS
256255
}
257256

258257
// upload TLS files to the container before starting it if needed
259-
if tlsConfig != nil {
258+
if peerConnection.TLSConfig != nil {
260259
// the docker upload API takes a tar file, so we need to first
261260
// consolidate the file entries to a tar
262261
payload := bytes.NewBuffer(nil)
263262
gw := gzip.NewWriter(payload)
264263
tw := tar.NewWriter(gw)
265264

266-
cutil.WriteBytesToPackage(TLSClientKeyPath, tlsConfig.ClientKey, tw)
267-
cutil.WriteBytesToPackage(TLSClientCertPath, tlsConfig.ClientCert, tw)
268-
cutil.WriteBytesToPackage(TLSClientRootCertPath, tlsConfig.RootCert, tw)
265+
cutil.WriteBytesToPackage(TLSClientKeyPath, peerConnection.TLSConfig.ClientKey, tw)
266+
cutil.WriteBytesToPackage(TLSClientCertPath, peerConnection.TLSConfig.ClientCert, tw)
267+
cutil.WriteBytesToPackage(TLSClientRootCertPath, peerConnection.TLSConfig.RootCert, tw)
269268

270269
// Write the tar file out
271270
if err := tw.Close(); err != nil {

core/container/dockercontroller/dockercontroller_test.go

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ func TestIntegrationPath(t *testing.T) {
5959
}, []byte("code-package"))
6060
require.NoError(t, err)
6161

62-
err = dc.Start(ccid, "NODE", nil)
62+
err = dc.Start(ccid, "NODE", &ccintf.PeerConnection{
63+
Address: "peer-address",
64+
})
6365
require.NoError(t, err)
6466

6567
err = dc.Stop(ccid)
@@ -79,11 +81,9 @@ func TestGetArgs(t *testing.T) {
7981
{"unknown-chaincode", pb.ChaincodeSpec_Type(999), []string{}, "unknown chaincodeType: 999"},
8082
}
8183
for _, tc := range tests {
82-
vm := &DockerVM{
83-
PeerAddress: "peer-address",
84-
}
84+
vm := &DockerVM{}
8585

86-
args, err := vm.GetArgs(tc.ccType.String())
86+
args, err := vm.GetArgs(tc.ccType.String(), "peer-address")
8787
if tc.expectedErr != "" {
8888
assert.EqualError(t, err, tc.expectedErr)
8989
continue
@@ -124,23 +124,26 @@ func Test_Start(t *testing.T) {
124124
}
125125

126126
ccid := ccintf.CCID("simple:1.0")
127-
tlsConfig := &ccintf.TLSConfig{
128-
ClientKey: []byte("key"),
129-
ClientCert: []byte("cert"),
130-
RootCert: []byte("root"),
127+
peerConnection := &ccintf.PeerConnection{
128+
Address: "peer-address",
129+
TLSConfig: &ccintf.TLSConfig{
130+
ClientKey: []byte("key"),
131+
ClientCert: []byte("cert"),
132+
RootCert: []byte("root"),
133+
},
131134
}
132135

133136
// case 1: dockerClient.CreateContainer returns error
134137
testError1 := errors.New("junk1")
135138
dockerClient.CreateContainerReturns(nil, testError1)
136-
err := dvm.Start(ccid, "GOLANG", tlsConfig)
139+
err := dvm.Start(ccid, "GOLANG", peerConnection)
137140
gt.Expect(err).To(MatchError(testError1))
138141
dockerClient.CreateContainerReturns(&docker.Container{}, nil)
139142

140143
// case 2: dockerClient.UploadToContainer returns error
141144
testError2 := errors.New("junk2")
142145
dockerClient.UploadToContainerReturns(testError2)
143-
err = dvm.Start(ccid, "GOLANG", tlsConfig)
146+
err = dvm.Start(ccid, "GOLANG", peerConnection)
144147
gt.Expect(err.Error()).To(ContainSubstring("junk2"))
145148
dockerClient.UploadToContainerReturns(nil)
146149

@@ -149,31 +152,31 @@ func Test_Start(t *testing.T) {
149152
testError3 := errors.New("junk3")
150153
dvm.AttachStdOut = true
151154
dockerClient.CreateContainerReturns(nil, testError3)
152-
err = dvm.Start(ccid, "GOLANG", tlsConfig)
155+
err = dvm.Start(ccid, "GOLANG", peerConnection)
153156
gt.Expect(err).To(MatchError(testError3))
154157
dockerClient.CreateContainerReturns(&docker.Container{}, nil)
155158

156159
// case 4: GetArgs returns error
157-
err = dvm.Start(ccid, "FAKE_TYPE", tlsConfig)
160+
err = dvm.Start(ccid, "FAKE_TYPE", peerConnection)
158161
gt.Expect(err).To(MatchError("could not get args: unknown chaincodeType: FAKE_TYPE"))
159162

160163
// Success cases
161-
err = dvm.Start(ccid, "GOLANG", tlsConfig)
164+
err = dvm.Start(ccid, "GOLANG", peerConnection)
162165
gt.Expect(err).NotTo(HaveOccurred())
163166

164167
// dockerClient.StopContainer returns error
165-
err = dvm.Start(ccid, "GOLANG", tlsConfig)
168+
err = dvm.Start(ccid, "GOLANG", peerConnection)
166169
gt.Expect(err).NotTo(HaveOccurred())
167170

168171
// dockerClient.KillContainer returns error
169-
err = dvm.Start(ccid, "GOLANG", tlsConfig)
172+
err = dvm.Start(ccid, "GOLANG", peerConnection)
170173
gt.Expect(err).NotTo(HaveOccurred())
171174

172175
// dockerClient.RemoveContainer returns error
173-
err = dvm.Start(ccid, "GOLANG", tlsConfig)
176+
err = dvm.Start(ccid, "GOLANG", peerConnection)
174177
gt.Expect(err).NotTo(HaveOccurred())
175178

176-
err = dvm.Start(ccid, "GOLANG", tlsConfig)
179+
err = dvm.Start(ccid, "GOLANG", peerConnection)
177180
gt.Expect(err).NotTo(HaveOccurred())
178181
}
179182

core/container/mock/vm.go

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)