Skip to content

Commit ff96935

Browse files
author
Jason Yellick
committed
FAB-10823 Refactor platforms to instance
The platforms package currently exposes itself through a number of package scoped functions rather than via an instance which implements those methods. This CR takes the first step to remove the package scoped functions by adding a temporary singleton to keep the tests working, and having the external callers instantiate an instance. Ultimately, the singleton will be removed and the callers will have the platform dependency injected. Change-Id: Id1a887d59b062ab593c9dcab5b68276128139229 Signed-off-by: Jason Yellick <jyellick@us.ibm.com>
1 parent b7fbc81 commit ff96935

File tree

8 files changed

+67
-56
lines changed

8 files changed

+67
-56
lines changed

core/chaincode/platforms/car/vm_helper_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func (vm *VM) BuildChaincodeContainer(spec *pb.ChaincodeSpec) error {
4040
}
4141

4242
cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: spec, CodePackage: codePackage}
43-
dockerSpec, err := platforms.GenerateDockerBuild(cds)
43+
dockerSpec, err := platforms.NewRegistry().GenerateDockerBuild(cds)
4444
if err != nil {
4545
return fmt.Errorf("Error getting chaincode docker image: %s", err)
4646
}

core/chaincode/platforms/platforms.go

Lines changed: 42 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,18 @@ import (
1111
"compress/gzip"
1212
"fmt"
1313
"io"
14-
"os"
1514

1615
"strings"
1716

18-
"io/ioutil"
19-
2017
"github.com/hyperledger/fabric/common/flogging"
2118
"github.com/hyperledger/fabric/common/metadata"
2219
"github.com/hyperledger/fabric/core/chaincode/platforms/car"
2320
"github.com/hyperledger/fabric/core/chaincode/platforms/ccmetadata"
2421
"github.com/hyperledger/fabric/core/chaincode/platforms/golang"
2522
"github.com/hyperledger/fabric/core/chaincode/platforms/java"
2623
"github.com/hyperledger/fabric/core/chaincode/platforms/node"
27-
"github.com/hyperledger/fabric/core/config"
2824
cutil "github.com/hyperledger/fabric/core/container/util"
2925
pb "github.com/hyperledger/fabric/protos/peer"
30-
"github.com/spf13/viper"
3126
)
3227

3328
// Interface for validating the specification and and writing the package for
@@ -43,19 +38,48 @@ type Platform interface {
4338

4439
var logger = flogging.MustGetLogger("chaincode-platform")
4540

41+
// XXX Temporary singleton hack to allow tests to continue to work
42+
var r = NewRegistry()
43+
4644
// Added for unit testing purposes
47-
var _Find = Find
48-
var _GetPath = config.GetPath
49-
var _VGetBool = viper.GetBool
50-
var _OSStat = os.Stat
51-
var _IOUtilReadFile = ioutil.ReadFile
45+
var _Find = find
5246
var _CUtilWriteBytesToPackage = cutil.WriteBytesToPackage
53-
var _generateDockerfile = generateDockerfile
54-
var _generateDockerBuild = generateDockerBuild
47+
var _generateDockerfile = r.generateDockerfile
48+
var _generateDockerBuild = r.generateDockerBuild
49+
50+
type Registry struct{}
51+
52+
// TODO, ultimately this should take the platforms as parameters
53+
func NewRegistry() *Registry {
54+
return &Registry{}
55+
}
56+
57+
func (r *Registry) ValidateSpec(spec *pb.ChaincodeSpec) error {
58+
p, err := _Find(spec.Type)
59+
if err != nil {
60+
return err
61+
}
62+
return p.ValidateSpec(spec)
63+
}
5564

56-
// Find returns the platform interface for the given platform type
57-
func Find(chaincodeType pb.ChaincodeSpec_Type) (Platform, error) {
65+
func (r *Registry) ValidateDeploymentSpec(spec *pb.ChaincodeDeploymentSpec) error {
66+
p, err := _Find(spec.ChaincodeSpec.Type)
67+
if err != nil {
68+
return err
69+
}
70+
return p.ValidateDeploymentSpec(spec)
71+
}
5872

73+
func (r *Registry) GetMetadataProvider(spec *pb.ChaincodeDeploymentSpec) (ccmetadata.MetadataProvider, error) {
74+
p, err := _Find(spec.ChaincodeSpec.Type)
75+
if err != nil {
76+
return nil, err
77+
}
78+
return p.GetMetadataProvider(spec), nil
79+
}
80+
81+
// find returns the platform interface for the given platform type
82+
func find(chaincodeType pb.ChaincodeSpec_Type) (Platform, error) {
5983
switch chaincodeType {
6084
case pb.ChaincodeSpec_GOLANG:
6185
return &golang.Platform{}, nil
@@ -68,10 +92,9 @@ func Find(chaincodeType pb.ChaincodeSpec_Type) (Platform, error) {
6892
default:
6993
return nil, fmt.Errorf("Unknown chaincodeType: %s", chaincodeType)
7094
}
71-
7295
}
7396

74-
func GetDeploymentPayload(spec *pb.ChaincodeSpec) ([]byte, error) {
97+
func (r *Registry) GetDeploymentPayload(spec *pb.ChaincodeSpec) ([]byte, error) {
7598
platform, err := _Find(spec.Type)
7699
if err != nil {
77100
return nil, err
@@ -80,7 +103,7 @@ func GetDeploymentPayload(spec *pb.ChaincodeSpec) ([]byte, error) {
80103
return platform.GetDeploymentPayload(spec)
81104
}
82105

83-
func generateDockerfile(platform Platform, cds *pb.ChaincodeDeploymentSpec) ([]byte, error) {
106+
func (r *Registry) generateDockerfile(platform Platform, cds *pb.ChaincodeDeploymentSpec) ([]byte, error) {
84107

85108
var buf []string
86109

@@ -118,7 +141,7 @@ func generateDockerfile(platform Platform, cds *pb.ChaincodeDeploymentSpec) ([]b
118141

119142
type InputFiles map[string][]byte
120143

121-
func generateDockerBuild(platform Platform, cds *pb.ChaincodeDeploymentSpec, inputFiles InputFiles, tw *tar.Writer) error {
144+
func (r *Registry) generateDockerBuild(platform Platform, cds *pb.ChaincodeDeploymentSpec, inputFiles InputFiles, tw *tar.Writer) error {
122145

123146
var err error
124147

@@ -143,7 +166,7 @@ func generateDockerBuild(platform Platform, cds *pb.ChaincodeDeploymentSpec, inp
143166
return nil
144167
}
145168

146-
func GenerateDockerBuild(cds *pb.ChaincodeDeploymentSpec) (io.Reader, error) {
169+
func (r *Registry) GenerateDockerBuild(cds *pb.ChaincodeDeploymentSpec) (io.Reader, error) {
147170

148171
inputFiles := make(InputFiles)
149172

core/chaincode/platforms/platforms_test.go renamed to core/chaincode/platforms/platforms_legacy_test.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,31 +24,31 @@ import (
2424

2525
// START Find tests
2626
func TestFind(t *testing.T) {
27-
response, err := Find(pb.ChaincodeSpec_GOLANG)
27+
response, err := find(pb.ChaincodeSpec_GOLANG)
2828
_, ok := response.(Platform)
2929
if !ok {
3030
t.Error("Assertion error")
3131
}
3232
assert.NotNil(t, response, "Response should have been set")
3333
assert.Nil(t, err, "Error should have been nil")
3434

35-
response, err = Find(pb.ChaincodeSpec_CAR)
35+
response, err = find(pb.ChaincodeSpec_CAR)
3636
_, ok = response.(Platform)
3737
if !ok {
3838
t.Error("Assertion error")
3939
}
4040
assert.NotNil(t, response, "Response should have been set")
4141
assert.Nil(t, err, "Error should have been nil")
4242

43-
response, err = Find(pb.ChaincodeSpec_JAVA)
43+
response, err = find(pb.ChaincodeSpec_JAVA)
4444
_, ok = response.(Platform)
4545
if !ok {
4646
t.Error("Assertion error")
4747
}
4848
assert.NotNil(t, response, "Response should have been set")
4949
assert.Nil(t, err, "Error should have been nil")
5050

51-
response, err = Find(pb.ChaincodeSpec_UNDEFINED)
51+
response, err = find(pb.ChaincodeSpec_UNDEFINED)
5252
_, ok = response.(Platform)
5353
assert.Nil(t, response, "Response should have been nil")
5454
assert.NotNil(t, err, "Error should have been set")
@@ -84,7 +84,7 @@ func TestGetDeplotmentPayload(t *testing.T) {
8484
fake := pb.ChaincodeSpec{
8585
Type: pb.ChaincodeSpec_GOLANG,
8686
}
87-
response, err := GetDeploymentPayload(&fake)
87+
response, err := r.GetDeploymentPayload(&fake)
8888

8989
fmt.Println(err)
9090

@@ -93,7 +93,7 @@ func TestGetDeplotmentPayload(t *testing.T) {
9393

9494
_Find = FakeFindErr
9595

96-
response, err = GetDeploymentPayload(&fake)
96+
response, err = r.GetDeploymentPayload(&fake)
9797

9898
fmt.Println(err)
9999

@@ -159,12 +159,12 @@ func TestGenerateDockerfile(t *testing.T) {
159159
},
160160
},
161161
}
162-
response, err := generateDockerfile(mockPlatform, fakeChaincodeSpec)
162+
response, err := r.generateDockerfile(mockPlatform, fakeChaincodeSpec)
163163
assert.NotNil(t, err, "Error should have been set")
164164
assert.Nil(t, response, "Response should not have been set")
165165

166166
mockPlatformOk := &FakePlatformOk{}
167-
response, err = generateDockerfile(mockPlatformOk, fakeChaincodeSpec)
167+
response, err = r.generateDockerfile(mockPlatformOk, fakeChaincodeSpec)
168168
assert.Nil(t, err, "Error should not have been set")
169169
assert.NotNil(t, response, "Response should not have been set")
170170

@@ -185,7 +185,7 @@ func TestGenerateDockerfile(t *testing.T) {
185185
"Should return the correct values when TLS is not enabled",
186186
)
187187

188-
response, err = generateDockerfile(mockPlatformOk, fakeChaincodeSpec)
188+
response, err = r.generateDockerfile(mockPlatformOk, fakeChaincodeSpec)
189189
contents = strings.Join(buf, "\n")
190190
assert.Equal(
191191
t,
@@ -241,16 +241,16 @@ func TestGenerateDockerBuild1(t *testing.T) {
241241

242242
// No errors
243243
_CUtilWriteBytesToPackage = CUtilWriteBytesToPackageOk
244-
err := generateDockerBuild(mockPlatformOk, fakeChaincodeSpec, inputFiles, mockTw)
244+
err := r.generateDockerBuild(mockPlatformOk, fakeChaincodeSpec, inputFiles, mockTw)
245245
assert.Nil(t, err, "err should not have been set")
246246
// Error from cutil.WriteBytesToPackage
247247
_CUtilWriteBytesToPackage = CUtilWriteBytesToPackageErr
248-
err = generateDockerBuild(mockPlatformOk, fakeChaincodeSpec, inputFiles, mockTw)
248+
err = r.generateDockerBuild(mockPlatformOk, fakeChaincodeSpec, inputFiles, mockTw)
249249
assert.NotNil(t, err, "err should have been set")
250250

251251
// Error from platform.GenerateDockerBuild
252252
_CUtilWriteBytesToPackage = CUtilWriteBytesToPackageOk
253-
err = generateDockerBuild(mockPlatformErr, fakeChaincodeSpec, inputFiles, mockTw)
253+
err = r.generateDockerBuild(mockPlatformErr, fakeChaincodeSpec, inputFiles, mockTw)
254254
assert.NotNil(t, err, "err should have been set")
255255

256256
}
@@ -302,28 +302,28 @@ func TestGenerateDockerBuild2(t *testing.T) {
302302
}
303303

304304
// No error
305-
io, err := GenerateDockerBuild(fakeChaincodeSpec)
305+
io, err := r.GenerateDockerBuild(fakeChaincodeSpec)
306306
assert.NotNil(t, io, "io should not be nil")
307307
assert.Nil(t, err, "error should be nil")
308308

309309
// Error from Find
310310
_Find = FindErr
311-
io, err = GenerateDockerBuild(fakeChaincodeSpec)
311+
io, err = r.GenerateDockerBuild(fakeChaincodeSpec)
312312
assert.Nil(t, io, "io should be nil")
313313
assert.NotNil(t, err, "error should not be nil")
314314

315315
// Error from generateDockerfile
316316
_Find = oldFind
317317
_generateDockerfile = generateDockerfileErr
318-
io, err = GenerateDockerBuild(fakeChaincodeSpec)
318+
io, err = r.GenerateDockerBuild(fakeChaincodeSpec)
319319
assert.Nil(t, io, "io should be nil")
320320
assert.NotNil(t, err, "error should not be nil")
321321

322322
// Error from generateDockerBuild
323323
_Find = oldFind
324324
_generateDockerfile = oldGenerateDockerfile
325325
_generateDockerBuild = generateDockerBuildErr
326-
io, err = GenerateDockerBuild(fakeChaincodeSpec)
326+
io, err = r.GenerateDockerBuild(fakeChaincodeSpec)
327327
assert.NotNil(t, io, "io should not be nil")
328328
assert.Nil(t, err, "error should be nil")
329329
}

core/common/ccprovider/cc_statedb_artifacts_provider.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,11 @@ func ExtractStatedbArtifactsForChaincode(ccname, ccversion string) (installed bo
5050
// This function is called during chaincode instantiate/upgrade (from above), and from install, so that statedb artifacts can be created.
5151
func ExtractStatedbArtifactsFromCCPackage(ccpackage CCPackage) (statedbArtifactsTar []byte, err error) {
5252
cds := ccpackage.GetDepSpec()
53-
pform, err := platforms.Find(cds.ChaincodeSpec.Type)
53+
metaprov, err := platforms.NewRegistry().GetMetadataProvider(cds)
5454
if err != nil {
55-
ccproviderLogger.Infof("invalid deployment spec (bad platform type:%s)", cds.ChaincodeSpec.Type)
55+
ccproviderLogger.Infof("invalid deployment spec: %s", err)
5656
return nil, fmt.Errorf("invalid deployment spec")
5757
}
58-
metaprov := pform.GetMetadataProvider(cds)
5958
return metaprov.GetMetadataAsTarEntries()
6059
}
6160

core/container/controller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ type PlatformBuilder struct {
132132

133133
// Build a tar stream based on the CDS
134134
func (b *PlatformBuilder) Build() (io.Reader, error) {
135-
return platforms.GenerateDockerBuild(b.DeploymentSpec)
135+
return platforms.NewRegistry().GenerateDockerBuild(b.DeploymentSpec)
136136
}
137137

138138
func (si StartContainerReq) Do(ctxt context.Context, v VM) error {
@@ -200,5 +200,5 @@ func GetChaincodePackageBytes(spec *pb.ChaincodeSpec) ([]byte, error) {
200200
return nil, fmt.Errorf("invalid chaincode spec")
201201
}
202202

203-
return platforms.GetDeploymentPayload(spec)
203+
return platforms.NewRegistry().GetDeploymentPayload(spec)
204204
}

core/container/dockercontroller/dockercontroller_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,13 @@ func Test_Start(t *testing.T) {
119119
ChaincodeId: &pb.ChaincodeID{Name: "ex01", Path: chaincodePath},
120120
Input: &pb.ChaincodeInput{Args: util.ToChaincodeArgs("f")},
121121
}
122-
codePackage, err := platforms.GetDeploymentPayload(spec)
122+
codePackage, err := platforms.NewRegistry().GetDeploymentPayload(spec)
123123
if err != nil {
124124
t.Fatal()
125125
}
126126
cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: spec, CodePackage: codePackage}
127127
bldr := &mockBuilder{
128-
buildFunc: func() (io.Reader, error) { return platforms.GenerateDockerBuild(cds) },
128+
buildFunc: func() (io.Reader, error) { return platforms.NewRegistry().GenerateDockerBuild(cds) },
129129
}
130130

131131
// case 4: start called with builder and dockerClient.CreateContainer returns

peer/chaincode/common.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,7 @@ func checkSpec(spec *pb.ChaincodeSpec) error {
4444
return errors.New("expected chaincode specification, nil received")
4545
}
4646

47-
platform, err := platforms.Find(spec.Type)
48-
if err != nil {
49-
return errors.WithMessage(err, "failed to determine platform type")
50-
}
51-
52-
return platform.ValidateSpec(spec)
47+
return platforms.NewRegistry().ValidateSpec(spec)
5348
}
5449

5550
// getChaincodeDeploymentSpec get chaincode deployment spec given the chaincode spec

protos/utils/proputils.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,7 @@ func GetChaincodeDeploymentSpec(code []byte) (*peer.ChaincodeDeploymentSpec, err
156156
}
157157

158158
// FAB-2122: Validate the CDS according to platform specific requirements
159-
platform, err := platforms.Find(cds.ChaincodeSpec.Type)
160-
if err != nil {
161-
return nil, err
162-
}
163-
164-
err = platform.ValidateDeploymentSpec(cds)
165-
return cds, err
159+
return cds, platforms.NewRegistry().ValidateDeploymentSpec(cds)
166160
}
167161

168162
// GetChaincodeAction gets the ChaincodeAction given chaicnode action bytes

0 commit comments

Comments
 (0)