Skip to content

Commit a4225b9

Browse files
committed
[FAB-14560] Refactor CCID
This change set refactors the existing CCID struct to just become a string. The struct used to embed the logic to generate the chaincode package ID from name and version. This logic should not be hardcoded by the struct but it should be implemented by the chaincode lifecycle logic. Change-Id: I21905f048314f8aff41ee806006cc39886ec7d2d Signed-off-by: Alessandro Sorniotti <ale.linux@sopit.net>
1 parent 8917d1a commit a4225b9

File tree

12 files changed

+61
-145
lines changed

12 files changed

+61
-145
lines changed

core/chaincode/container_runtime.go

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,7 @@ func (c *ContainerRuntime) Start(ccci *ccprovider.ChaincodeContainerInfo, codePa
6868
Args: lc.Args,
6969
Env: lc.Envs,
7070
FilesToUpload: lc.Files,
71-
CCID: ccintf.CCID{
72-
Name: ccci.Name,
73-
Version: ccci.Version,
74-
},
71+
CCID: ccintf.CCID(ccci.Name + "-" + ccci.Version),
7572
}
7673

7774
if err := c.Processor.Process(ccci.ContainerType, scr); err != nil {
@@ -84,10 +81,7 @@ func (c *ContainerRuntime) Start(ccci *ccprovider.ChaincodeContainerInfo, codePa
8481
// Stop terminates chaincode and its container runtime environment.
8582
func (c *ContainerRuntime) Stop(ccci *ccprovider.ChaincodeContainerInfo) error {
8683
scr := container.StopContainerReq{
87-
CCID: ccintf.CCID{
88-
Name: ccci.Name,
89-
Version: ccci.Version,
90-
},
84+
CCID: ccintf.CCID(ccci.Name + "-" + ccci.Version),
9185
Timeout: 0,
9286
Dontremove: false,
9387
}
@@ -108,10 +102,7 @@ func (c *ContainerRuntime) Wait(ccci *ccprovider.ChaincodeContainerInfo) (int, e
108102

109103
resultCh := make(chan result, 1)
110104
wcr := container.WaitContainerReq{
111-
CCID: ccintf.CCID{
112-
Name: ccci.Name,
113-
Version: ccci.Version,
114-
},
105+
CCID: ccintf.CCID(ccci.Name + "-" + ccci.Version),
115106
Exited: func(exitCode int, err error) {
116107
resultCh <- result{exitCode: exitCode, err: err}
117108
close(resultCh)

core/chaincode/container_runtime_test.go

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,7 @@ func TestContainerRuntimeStart(t *testing.T) {
183183
assert.Equal(t, startReq.Args, []string{"chaincode", "-peer.address=peer.example.com"})
184184
assert.Equal(t, startReq.Env, []string{"CORE_CHAINCODE_ID_NAME=chaincode-name:chaincode-version", "CORE_PEER_TLS_ENABLED=false"})
185185
assert.Nil(t, startReq.FilesToUpload)
186-
assert.Equal(t, startReq.CCID, ccintf.CCID{
187-
Name: "chaincode-name",
188-
Version: "chaincode-version",
189-
})
186+
assert.Equal(t, startReq.CCID, ccintf.CCID("chaincode-name-chaincode-version"))
190187
}
191188

192189
func TestContainerRuntimeStartErrors(t *testing.T) {
@@ -243,10 +240,7 @@ func TestContainerRuntimeStop(t *testing.T) {
243240

244241
assert.Equal(t, stopReq.Timeout, uint(0))
245242
assert.Equal(t, stopReq.Dontremove, false)
246-
assert.Equal(t, stopReq.CCID, ccintf.CCID{
247-
Name: "chaincode-id-name",
248-
Version: "chaincode-version",
249-
})
243+
assert.Equal(t, stopReq.CCID, ccintf.CCID("chaincode-id-name-chaincode-version"))
250244
}
251245

252246
func TestContainerRuntimeStopErrors(t *testing.T) {
@@ -308,7 +302,7 @@ func TestContainerRuntimeWait(t *testing.T) {
308302
assert.Equal(t, vmType, "container-type")
309303
waitReq, ok := req.(container.WaitContainerReq)
310304
assert.True(t, ok)
311-
assert.Equal(t, ccintf.CCID{Name: "chaincode-id-name", Version: "chaincode-version"}, waitReq.CCID)
305+
assert.Equal(t, ccintf.CCID("chaincode-id-name-chaincode-version"), waitReq.CCID)
312306

313307
fakeProcessor.ProcessReturns(errors.New("moles-and-trolls"))
314308
_, err = cr.Wait(ccci)

core/container/ccintf/ccintf.go

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,7 @@ package ccintf
1010
//communication between chaincode and peer (chaincode support).
1111
//Currently inproccontroller uses it. dockercontroller does not.
1212

13-
import (
14-
"fmt"
15-
16-
pb "github.com/hyperledger/fabric/protos/peer"
17-
)
13+
import pb "github.com/hyperledger/fabric/protos/peer"
1814

1915
// ChaincodeStream interface for stream between Peer and chaincode instance.
2016
type ChaincodeStream interface {
@@ -28,21 +24,5 @@ type CCSupport interface {
2824
HandleChaincodeStream(ChaincodeStream) error
2925
}
3026

31-
// GetCCHandlerKey is used to pass CCSupport via context
32-
func GetCCHandlerKey() string {
33-
return "CCHANDLER"
34-
}
35-
36-
//CCID encapsulates chaincode ID
37-
type CCID struct {
38-
Name string
39-
Version string
40-
}
41-
42-
//GetName returns canonical chaincode name based on the fields of CCID
43-
func (ccid *CCID) GetName() string {
44-
if ccid.Version != "" {
45-
return fmt.Sprintf("%s-%s", ccid.Name, ccid.Version)
46-
}
47-
return ccid.Name
48-
}
27+
// CCPackageID encapsulates chaincode ID
28+
type CCID string

core/container/ccintf/ccintf_test.go

Lines changed: 0 additions & 27 deletions
This file was deleted.

core/container/container_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ var _ = Describe("Container", func() {
3232

3333
BeforeEach(func() {
3434
startReq = &container.StartContainerReq{
35-
CCID: ccintf.CCID{Name: "start-name"},
35+
CCID: ccintf.CCID("start-name"),
3636
Args: []string{"foo", "bar"},
3737
Env: []string{"Bar", "Foo"},
3838
FilesToUpload: map[string][]byte{
@@ -48,7 +48,7 @@ var _ = Describe("Container", func() {
4848
Expect(err).NotTo(HaveOccurred())
4949
Expect(fakeVM.StartCallCount()).To(Equal(1))
5050
ccid, args, env, filesToUpload, builder := fakeVM.StartArgsForCall(0)
51-
Expect(ccid).To(Equal(ccintf.CCID{Name: "start-name"}))
51+
Expect(ccid).To(Equal(ccintf.CCID("start-name")))
5252
Expect(args).To(Equal([]string{"foo", "bar"}))
5353
Expect(env).To(Equal([]string{"Bar", "Foo"}))
5454
Expect(filesToUpload).To(Equal(map[string][]byte{
@@ -68,7 +68,7 @@ var _ = Describe("Container", func() {
6868

6969
Describe("GetCCID", func() {
7070
It("Returns the CCID embedded in the structure", func() {
71-
Expect(startReq.GetCCID()).To(Equal(ccintf.CCID{Name: "start-name"}))
71+
Expect(startReq.GetCCID()).To(Equal(ccintf.CCID("start-name")))
7272
})
7373
})
7474
})
@@ -80,7 +80,7 @@ var _ = Describe("Container", func() {
8080

8181
BeforeEach(func() {
8282
stopReq = &container.StopContainerReq{
83-
CCID: ccintf.CCID{Name: "stop-name"},
83+
CCID: ccintf.CCID("stop-name"),
8484
Timeout: 283,
8585
Dontkill: true,
8686
Dontremove: false,
@@ -93,7 +93,7 @@ var _ = Describe("Container", func() {
9393
Expect(resp).To(BeNil())
9494
Expect(fakeVM.StopCallCount()).To(Equal(1))
9595
ccid, timeout, dontKill, dontRemove := fakeVM.StopArgsForCall(0)
96-
Expect(ccid).To(Equal(ccintf.CCID{Name: "stop-name"}))
96+
Expect(ccid).To(Equal(ccintf.CCID("stop-name")))
9797
Expect(timeout).To(Equal(uint(283)))
9898
Expect(dontKill).To(Equal(true))
9999
Expect(dontRemove).To(Equal(false))
@@ -110,7 +110,7 @@ var _ = Describe("Container", func() {
110110

111111
Describe("GetCCID", func() {
112112
It("Returns the CCID embedded in the structure", func() {
113-
Expect(stopReq.GetCCID()).To(Equal(ccintf.CCID{Name: "stop-name"}))
113+
Expect(stopReq.GetCCID()).To(Equal(ccintf.CCID("stop-name")))
114114
})
115115
})
116116
})

core/container/controller.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,10 +201,9 @@ func (w WaitContainerReq) GetCCID() ccintf.CCID {
201201
func (vmc *VMController) Process(vmtype string, req VMCReq) error {
202202
v := vmc.newVM(vmtype)
203203
ccid := req.GetCCID()
204-
id := ccid.GetName()
205204

206-
vmc.lockContainer(id)
207-
defer vmc.unlockContainer(id)
205+
vmc.lockContainer(string(ccid))
206+
defer vmc.unlockContainer(string(ccid))
208207
return req.Do(v)
209208
}
210209

core/container/controller_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ func TestWaitContainerReq(t *testing.T) {
4545
exited.Stub = func(int, error) { close(done) }
4646

4747
req := container.WaitContainerReq{
48-
CCID: ccintf.CCID{Name: "the-name", Version: "the-version"},
48+
CCID: ccintf.CCID("the-name-the-version"),
4949
Exited: exited.Spy,
5050
}
51-
gt.Expect(req.GetCCID()).To(Equal(ccintf.CCID{Name: "the-name", Version: "the-version"}))
51+
gt.Expect(req.GetCCID()).To(Equal(ccintf.CCID("the-name-the-version")))
5252

5353
fakeVM := &mock.VM{}
5454
fakeVM.WaitReturns(99, errors.New("boing-boing"))
@@ -59,7 +59,7 @@ func TestWaitContainerReq(t *testing.T) {
5959

6060
gt.Expect(fakeVM.WaitCallCount()).To(Equal(1))
6161
ccid := fakeVM.WaitArgsForCall(0)
62-
gt.Expect(ccid).To(Equal(ccintf.CCID{Name: "the-name", Version: "the-version"}))
62+
gt.Expect(ccid).To(Equal(ccintf.CCID("the-name-the-version")))
6363

6464
ec, exitErr := exited.ArgsForCall(0)
6565
gt.Expect(ec).To(Equal(99))

core/container/dockercontroller/dockercontroller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ func (vm *DockerVM) deployImage(client dockerClient, ccid ccintf.CCID, reader io
210210
err = client.BuildImage(opts)
211211

212212
vm.BuildMetrics.ChaincodeImageBuildDuration.With(
213-
"chaincode", ccid.Name+":"+ccid.Version,
213+
"chaincode", string(ccid),
214214
"success", strconv.FormatBool(err == nil),
215215
).Observe(time.Since(startTime).Seconds())
216216

@@ -465,7 +465,7 @@ func (vm *DockerVM) GetVMNameForDocker(ccid ccintf.CCID) (string, error) {
465465
}
466466

467467
func (vm *DockerVM) preFormatImageName(ccid ccintf.CCID) string {
468-
name := ccid.GetName()
468+
name := string(ccid)
469469

470470
if vm.NetworkID != "" && vm.PeerID != "" {
471471
name = fmt.Sprintf("%s-%s-%s", vm.NetworkID, vm.PeerID, name)

core/container/dockercontroller/dockercontroller_test.go

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import (
3939
func TestIntegrationPath(t *testing.T) {
4040
coreutil.SetupTestConfig()
4141
dc := NewDockerVM("", util.GenerateUUID(), NewBuildMetrics(&disabled.Provider{}))
42-
ccid := ccintf.CCID{Name: "simple"}
42+
ccid := ccintf.CCID("simple")
4343

4444
err := dc.Start(ccid, nil, nil, nil, InMemBuilder{})
4545
require.NoError(t, err)
@@ -86,10 +86,7 @@ func Test_Start(t *testing.T) {
8686
dvm := DockerVM{
8787
BuildMetrics: NewBuildMetrics(&disabled.Provider{}),
8888
}
89-
ccid := ccintf.CCID{
90-
Name: "simple",
91-
Version: "1.0",
92-
}
89+
ccid := ccintf.CCID("simple-1.0")
9390
args := make([]string, 1)
9491
env := make([]string, 1)
9592
files := map[string][]byte{
@@ -214,16 +211,16 @@ func Test_streamOutput(t *testing.T) {
214211
}
215212

216213
func Test_BuildMetric(t *testing.T) {
217-
ccid := ccintf.CCID{Name: "simple", Version: "1.0"}
214+
ccid := ccintf.CCID("simple-1.0")
218215
client := &mockClient{}
219216

220217
tests := []struct {
221218
desc string
222219
buildErr bool
223220
expectedLabels []string
224221
}{
225-
{desc: "success", buildErr: false, expectedLabels: []string{"chaincode", "simple:1.0", "success", "true"}},
226-
{desc: "failure", buildErr: true, expectedLabels: []string{"chaincode", "simple:1.0", "success", "false"}},
222+
{desc: "success", buildErr: false, expectedLabels: []string{"chaincode", "simple-1.0", "success", "true"}},
223+
{desc: "failure", buildErr: true, expectedLabels: []string{"chaincode", "simple-1.0", "success", "false"}},
227224
}
228225
for _, tt := range tests {
229226
t.Run(tt.desc, func(t *testing.T) {
@@ -251,7 +248,7 @@ func Test_BuildMetric(t *testing.T) {
251248

252249
func Test_Stop(t *testing.T) {
253250
dvm := DockerVM{}
254-
ccid := ccintf.CCID{Name: "simple"}
251+
ccid := ccintf.CCID("simple")
255252

256253
// Failure case: getMockClient returns error
257254
getClientErr = true
@@ -272,22 +269,22 @@ func Test_Wait(t *testing.T) {
272269
dvm.getClientFnc = func() (dockerClient, error) {
273270
return nil, errors.New("gorilla-goo")
274271
}
275-
_, err := dvm.Wait(ccintf.CCID{})
272+
_, err := dvm.Wait(ccintf.CCID(""))
276273
assert.EqualError(t, err, "gorilla-goo")
277274

278275
// happy path
279276
client := &mockClient{}
280277
dvm.getClientFnc = func() (dockerClient, error) { return client, nil }
281278

282279
client.exitCode = 99
283-
exitCode, err := dvm.Wait(ccintf.CCID{Name: "the-name", Version: "the-version"})
280+
exitCode, err := dvm.Wait(ccintf.CCID("the-name-the-version"))
284281
assert.NoError(t, err)
285282
assert.Equal(t, 99, exitCode)
286283
assert.Equal(t, "the-name-the-version", client.containerID)
287284

288285
// wait fails
289286
client.waitErr = errors.New("no-wait-for-you")
290-
_, err = dvm.Wait(ccintf.CCID{})
287+
_, err = dvm.Wait(ccintf.CCID(""))
291288
assert.EqualError(t, err, "no-wait-for-you")
292289
}
293290

@@ -326,37 +323,37 @@ func TestGetVMNameForDocker(t *testing.T) {
326323
{
327324
name: "mycc",
328325
vm: &DockerVM{NetworkID: "dev", PeerID: "peer0"},
329-
ccid: ccintf.CCID{Name: "mycc", Version: "1.0"},
326+
ccid: ccintf.CCID("mycc-1.0"),
330327
expectedOutput: fmt.Sprintf("%s-%s", "dev-peer0-mycc-1.0", hex.EncodeToString(util.ComputeSHA256([]byte("dev-peer0-mycc-1.0")))),
331328
},
332329
{
333330
name: "mycc-nonetworkid",
334331
vm: &DockerVM{PeerID: "peer1"},
335-
ccid: ccintf.CCID{Name: "mycc", Version: "1.0"},
332+
ccid: ccintf.CCID("mycc-1.0"),
336333
expectedOutput: fmt.Sprintf("%s-%s", "peer1-mycc-1.0", hex.EncodeToString(util.ComputeSHA256([]byte("peer1-mycc-1.0")))),
337334
},
338335
{
339336
name: "myCC-UCids",
340337
vm: &DockerVM{NetworkID: "Dev", PeerID: "Peer0"},
341-
ccid: ccintf.CCID{Name: "myCC", Version: "1.0"},
338+
ccid: ccintf.CCID("myCC-1.0"),
342339
expectedOutput: fmt.Sprintf("%s-%s", "dev-peer0-mycc-1.0", hex.EncodeToString(util.ComputeSHA256([]byte("Dev-Peer0-myCC-1.0")))),
343340
},
344341
{
345342
name: "myCC-idsWithSpecialChars",
346343
vm: &DockerVM{NetworkID: "Dev$dev", PeerID: "Peer*0"},
347-
ccid: ccintf.CCID{Name: "myCC", Version: "1.0"},
344+
ccid: ccintf.CCID("myCC-1.0"),
348345
expectedOutput: fmt.Sprintf("%s-%s", "dev-dev-peer-0-mycc-1.0", hex.EncodeToString(util.ComputeSHA256([]byte("Dev$dev-Peer*0-myCC-1.0")))),
349346
},
350347
{
351348
name: "mycc-nopeerid",
352349
vm: &DockerVM{NetworkID: "dev"},
353-
ccid: ccintf.CCID{Name: "mycc", Version: "1.0"},
350+
ccid: ccintf.CCID("mycc-1.0"),
354351
expectedOutput: fmt.Sprintf("%s-%s", "dev-mycc-1.0", hex.EncodeToString(util.ComputeSHA256([]byte("dev-mycc-1.0")))),
355352
},
356353
{
357354
name: "myCC-LCids",
358355
vm: &DockerVM{NetworkID: "dev", PeerID: "peer0"},
359-
ccid: ccintf.CCID{Name: "myCC", Version: "1.0"},
356+
ccid: ccintf.CCID("myCC-1.0"),
360357
expectedOutput: fmt.Sprintf("%s-%s", "dev-peer0-mycc-1.0", hex.EncodeToString(util.ComputeSHA256([]byte("dev-peer0-myCC-1.0")))),
361358
},
362359
}
@@ -374,7 +371,7 @@ func TestGetVMName(t *testing.T) {
374371
{
375372
name: "myCC-preserveCase",
376373
vm: &DockerVM{NetworkID: "Dev", PeerID: "Peer0"},
377-
ccid: ccintf.CCID{Name: "myCC", Version: "1.0"},
374+
ccid: ccintf.CCID("myCC-1.0"),
378375
expectedOutput: fmt.Sprintf("%s", "Dev-Peer0-myCC-1.0"),
379376
},
380377
}

0 commit comments

Comments
 (0)