Skip to content

Commit 40c423f

Browse files
committed
[FAB-6324] MSP versioning
This change-set does the following: - Introduce an MSP factory that allows the creation of MSP instances based on passed options. An option specifies the MSP's type to be created and its version. This is to address backwards incompatibility by proving the ability to change the MSP version to be used. Change-Id: I7dcfdd783260d98896487147e50cd0e8ea62971c Signed-off-by: Angelo De Caro <adc@zurich.ibm.com>
1 parent fe125bd commit 40c423f

12 files changed

+138
-33
lines changed

common/channelconfig/msp.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -40,24 +40,24 @@ func (bh *MSPConfigHandler) ProposeMSP(mspConfig *mspprotos.MSPConfig) (msp.MSP,
4040
}
4141

4242
// create the msp instance
43-
bccspMSP, err := msp.NewBccspMsp()
43+
mspInst, err := msp.New(&msp.BCCSPNewOpts{NewBaseOpts: msp.NewBaseOpts{Version: msp.MSPv1_0}})
4444
if err != nil {
4545
return nil, fmt.Errorf("Creating the MSP manager failed, err %s", err)
4646
}
4747

48-
mspInst, err := cache.New(bccspMSP)
48+
casheMSP, err := cache.New(mspInst)
4949
if err != nil {
5050
return nil, fmt.Errorf("Creating the MSP manager failed, err %s", err)
5151
}
5252

5353
// set it up
54-
err = mspInst.Setup(mspConfig)
54+
err = casheMSP.Setup(mspConfig)
5555
if err != nil {
5656
return nil, fmt.Errorf("Setting up the MSP manager failed, err %s", err)
5757
}
5858

5959
// add the MSP to the map of pending MSPs
60-
mspID, _ := mspInst.GetIdentifier()
60+
mspID, _ := casheMSP.GetIdentifier()
6161

6262
existingPendingMSPConfig, ok := bh.idMap[mspID]
6363
if ok && !proto.Equal(existingPendingMSPConfig.mspConfig, mspConfig) {
@@ -67,11 +67,11 @@ func (bh *MSPConfigHandler) ProposeMSP(mspConfig *mspprotos.MSPConfig) (msp.MSP,
6767
if !ok {
6868
bh.idMap[mspID] = &pendingMSPConfig{
6969
mspConfig: mspConfig,
70-
msp: mspInst,
70+
msp: casheMSP,
7171
}
7272
}
7373

74-
return mspInst, nil
74+
return casheMSP, nil
7575
}
7676

7777
func (bh *MSPConfigHandler) CreateMSPManager() (msp.MSPManager, error) {

common/channelconfig/msp_util.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -38,24 +38,24 @@ func TemplateGroupMSPWithAdminRolePrincipal(configPath []string, mspConfig *mspp
3838
}
3939

4040
// create the msp instance
41-
bccspMSP, err := msp.NewBccspMsp()
41+
mspInst, err := msp.New(&msp.BCCSPNewOpts{NewBaseOpts: msp.NewBaseOpts{Version: msp.MSPv1_0}})
4242
if err != nil {
4343
logger.Panicf("Creating the MSP manager failed, err %s", err)
4444
}
4545

46-
mspInst, err := cache.New(bccspMSP)
46+
cacheMSP, err := cache.New(mspInst)
4747
if err != nil {
4848
logger.Panicf("Creating the MSP manager failed, err %s", err)
4949
}
5050

5151
// set it up
52-
err = mspInst.Setup(mspConfig)
52+
err = cacheMSP.Setup(mspConfig)
5353
if err != nil {
5454
logger.Panicf("Setting up the MSP manager failed, err %s", err)
5555
}
5656

5757
// add the MSP to the map of pending MSPs
58-
mspID, _ := mspInst.GetIdentifier()
58+
mspID, _ := cacheMSP.GetIdentifier()
5959

6060
memberPolicy := &cb.ConfigPolicy{
6161
Policy: &cb.Policy{

common/tools/cryptogen/msp/msp_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func TestGenerateLocalMSP(t *testing.T) {
9292
// finally check to see if we can load this as a local MSP config
9393
testMSPConfig, err := fabricmsp.GetLocalMspConfig(mspDir, nil, testName)
9494
assert.NoError(t, err, "Error parsing local MSP config")
95-
testMSP, err := fabricmsp.NewBccspMsp()
95+
testMSP, err := fabricmsp.New(&fabricmsp.BCCSPNewOpts{NewBaseOpts: fabricmsp.NewBaseOpts{Version: fabricmsp.MSPv1_0}})
9696
assert.NoError(t, err, "Error creating new BCCSP MSP")
9797
err = testMSP.Setup(testMSPConfig)
9898
assert.NoError(t, err, "Error setting up local MSP")
@@ -137,7 +137,7 @@ func TestGenerateVerifyingMSP(t *testing.T) {
137137
// finally check to see if we can load this as a verifying MSP config
138138
testMSPConfig, err := fabricmsp.GetVerifyingMspConfig(mspDir, testName)
139139
assert.NoError(t, err, "Error parsing verifying MSP config")
140-
testMSP, err := fabricmsp.NewBccspMsp()
140+
testMSP, err := fabricmsp.New(&fabricmsp.BCCSPNewOpts{NewBaseOpts: fabricmsp.NewBaseOpts{Version: fabricmsp.MSPv1_0}})
141141
assert.NoError(t, err, "Error creating new BCCSP MSP")
142142
err = testMSP.Setup(testMSPConfig)
143143
assert.NoError(t, err, "Error setting up verifying MSP")

msp/factory.go

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package msp
8+
9+
import (
10+
"github.com/pkg/errors"
11+
)
12+
13+
type MSPVersion int
14+
15+
const (
16+
MSPv1_0 = iota
17+
MSPv1_1
18+
)
19+
20+
// NewOpts represent
21+
type NewOpts interface {
22+
// GetVersion returns the MSP's version to be instantiated
23+
GetVersion() MSPVersion
24+
}
25+
26+
// NewBaseOpts is the default base type for all MSP instantiation Opts
27+
type NewBaseOpts struct {
28+
Version MSPVersion
29+
}
30+
31+
func (o *NewBaseOpts) GetVersion() MSPVersion {
32+
return o.Version
33+
}
34+
35+
// BCCSPNewOpts contains the options to instantiate a new BCCSP-based (X509) MSP
36+
type BCCSPNewOpts struct {
37+
NewBaseOpts
38+
}
39+
40+
// IdemixNewOpts contains the options to instantiate a new Idemix-based MSP
41+
type IdemixNewOpts struct {
42+
NewBaseOpts
43+
}
44+
45+
// New create a new MSP instance depending on the passed Opts
46+
func New(opts NewOpts) (MSP, error) {
47+
switch opts.(type) {
48+
case *BCCSPNewOpts:
49+
switch opts.GetVersion() {
50+
case MSPv1_0:
51+
return newBccspMsp()
52+
default:
53+
return nil, errors.Errorf("Invalid *BCCSPNewOpts. Version not recognized [%v]", opts.GetVersion())
54+
}
55+
case *IdemixNewOpts:
56+
switch opts.GetVersion() {
57+
case MSPv1_0:
58+
return newIdemixMsp()
59+
default:
60+
return nil, errors.Errorf("Invalid *IdemixNewOpts. Version not recognized [%v]", opts.GetVersion())
61+
}
62+
default:
63+
return nil, errors.Errorf("Invalid msp.NewOpts instance. It must be either *BCCSPNewOpts or *IdemixNewOpts. It was [%v]", opts)
64+
}
65+
}

msp/factory_test.go

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package msp
8+
9+
import (
10+
"testing"
11+
12+
"github.com/stretchr/testify/assert"
13+
)
14+
15+
func TestNewInvalidOpts(t *testing.T) {
16+
i, err := New(nil)
17+
assert.Error(t, err)
18+
assert.Contains(t, err.Error(), "Invalid msp.NewOpts instance. It must be either *BCCSPNewOpts or *IdemixNewOpts. It was [<nil>]")
19+
assert.Nil(t, i)
20+
21+
i, err = New(&BCCSPNewOpts{NewBaseOpts{Version: -1}})
22+
assert.Error(t, err)
23+
assert.Contains(t, err.Error(), "Invalid *BCCSPNewOpts. Version not recognized [-1]")
24+
assert.Nil(t, i)
25+
26+
i, err = New(&IdemixNewOpts{NewBaseOpts{Version: -1}})
27+
assert.Error(t, err)
28+
assert.Contains(t, err.Error(), "Invalid *IdemixNewOpts. Version not recognized [-1]")
29+
assert.Nil(t, i)
30+
}
31+
32+
func TestNew(t *testing.T) {
33+
i, err := New(&BCCSPNewOpts{NewBaseOpts{Version: MSPv1_0}})
34+
assert.NoError(t, err)
35+
assert.NotNil(t, i)
36+
37+
i, err = New(&IdemixNewOpts{NewBaseOpts{Version: MSPv1_0}})
38+
assert.NoError(t, err)
39+
assert.NotNil(t, i)
40+
}

msp/idemixmsp.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ type idemixmsp struct {
3838
name string
3939
}
4040

41-
// NewIdemixMsp creates a new instance of idemixmsp
42-
func NewIdemixMsp() (MSP, error) {
41+
// newIdemixMsp creates a new instance of idemixmsp
42+
func newIdemixMsp() (MSP, error) {
4343
mspLogger.Debugf("Creating Idemix-based MSP instance")
4444

4545
msp := idemixmsp{}

msp/idemixmsp_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717
)
1818

1919
func setup(configPath string) (MSP, error) {
20-
msp, err := NewIdemixMsp()
20+
msp, err := newIdemixMsp()
2121
if err != nil {
2222
return nil, errors.Wrap(err, "Getting MSP failed")
2323
}
@@ -64,7 +64,7 @@ func TestSetupBad(t *testing.T) {
6464
_, err := setup("testdata/idemix/badpath")
6565
assert.Error(t, err)
6666

67-
msp1, err := NewIdemixMsp()
67+
msp1, err := newIdemixMsp()
6868
assert.NoError(t, err)
6969

7070
// Setup with nil config

msp/mgmt/mgmt.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -123,16 +123,16 @@ func GetLocalMSP() msp.MSP {
123123
var err error
124124
created = true
125125

126-
bccspMSP, err := msp.NewBccspMsp()
126+
mspInst, err := msp.New(&msp.BCCSPNewOpts{NewBaseOpts: msp.NewBaseOpts{Version: msp.MSPv1_0}})
127127
if err != nil {
128128
mspLogger.Fatalf("Failed to initialize local MSP, received err %+v", err)
129129
}
130130

131-
lclMsp, err = cache.New(bccspMSP)
131+
lclMsp, err = cache.New(mspInst)
132132
if err != nil {
133133
mspLogger.Fatalf("Failed to initialize local MSP, received err %+v", err)
134134
}
135-
localMsp = bccspMSP
135+
localMsp = mspInst
136136
}
137137
}
138138

msp/msp_test.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ func TestMSPSetupNoCryptoConf(t *testing.T) {
8484
b, err := proto.Marshal(mspconf)
8585
assert.NoError(t, err)
8686
conf.Config = b
87-
newmsp, err := NewBccspMsp()
87+
newmsp, err := newBccspMsp()
8888
assert.NoError(t, err)
8989
err = newmsp.Setup(conf)
9090
assert.NoError(t, err)
@@ -97,7 +97,7 @@ func TestMSPSetupNoCryptoConf(t *testing.T) {
9797
b, err = proto.Marshal(mspconf)
9898
assert.NoError(t, err)
9999
conf.Config = b
100-
newmsp, err = NewBccspMsp()
100+
newmsp, err = newBccspMsp()
101101
assert.NoError(t, err)
102102
err = newmsp.Setup(conf)
103103
assert.NoError(t, err)
@@ -109,7 +109,7 @@ func TestMSPSetupNoCryptoConf(t *testing.T) {
109109
b, err = proto.Marshal(mspconf)
110110
assert.NoError(t, err)
111111
conf.Config = b
112-
newmsp, err = NewBccspMsp()
112+
newmsp, err = newBccspMsp()
113113
assert.NoError(t, err)
114114
err = newmsp.Setup(conf)
115115
assert.NoError(t, err)
@@ -157,7 +157,7 @@ func TestNotFoundInBCCSP(t *testing.T) {
157157

158158
assert.NoError(t, err)
159159

160-
thisMSP, err := NewBccspMsp()
160+
thisMSP, err := newBccspMsp()
161161
assert.NoError(t, err)
162162
ks, err := sw.NewFileBasedKeyStore(nil, filepath.Join(dir, "keystore"), true)
163163
assert.NoError(t, err)
@@ -208,7 +208,7 @@ func TestGetSigningIdentityFromVerifyingMSP(t *testing.T) {
208208
os.Exit(-1)
209209
}
210210

211-
newmsp, err := NewBccspMsp()
211+
newmsp, err := newBccspMsp()
212212
assert.NoError(t, err)
213213
err = newmsp.Setup(conf)
214214
assert.NoError(t, err)
@@ -269,7 +269,7 @@ func TestBadAdminIdentity(t *testing.T) {
269269
conf, err := GetLocalMspConfig("testdata/badadmin", nil, "DEFAULT")
270270
assert.NoError(t, err)
271271

272-
thisMSP, err := NewBccspMsp()
272+
thisMSP, err := newBccspMsp()
273273
assert.NoError(t, err)
274274
ks, err := sw.NewFileBasedKeyStore(nil, filepath.Join("testdata/badadmin", "keystore"), true)
275275
assert.NoError(t, err)
@@ -855,13 +855,13 @@ func TestMain(m *testing.M) {
855855
os.Exit(-1)
856856
}
857857

858-
localMsp, err = NewBccspMsp()
858+
localMsp, err = newBccspMsp()
859859
if err != nil {
860860
fmt.Printf("Constructor for msp should have succeeded, got err %s instead", err)
861861
os.Exit(-1)
862862
}
863863

864-
localMspBad, err = NewBccspMsp()
864+
localMspBad, err = newBccspMsp()
865865
if err != nil {
866866
fmt.Printf("Constructor for msp should have succeeded, got err %s instead", err)
867867
os.Exit(-1)
@@ -924,7 +924,7 @@ func getLocalMSP(t *testing.T, dir string) MSP {
924924
conf, err := GetLocalMspConfig(dir, nil, "DEFAULT")
925925
assert.NoError(t, err)
926926

927-
thisMSP, err := NewBccspMsp()
927+
thisMSP, err := newBccspMsp()
928928
assert.NoError(t, err)
929929
ks, err := sw.NewFileBasedKeyStore(nil, filepath.Join(dir, "keystore"), true)
930930
assert.NoError(t, err)

msp/mspimpl.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,11 @@ type bccspmsp struct {
7272
cryptoConfig *m.FabricCryptoConfig
7373
}
7474

75-
// NewBccspMsp returns an MSP instance backed up by a BCCSP
75+
// newBccspMsp returns an MSP instance backed up by a BCCSP
7676
// crypto provider. It handles x.509 certificates and can
7777
// generate identities and signing identities backed by
7878
// certificates and keypairs
79-
func NewBccspMsp() (MSP, error) {
79+
func newBccspMsp() (MSP, error) {
8080
mspLogger.Debugf("Creating BCCSP-based MSP instance")
8181

8282
bccsp := factory.GetDefault()

msp/ouconfig_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func TestBadConfigOUCert(t *testing.T) {
4646
conf, err := GetLocalMspConfig("testdata/badconfigoucert", nil, "DEFAULT")
4747
assert.NoError(t, err)
4848

49-
thisMSP, err := NewBccspMsp()
49+
thisMSP, err := newBccspMsp()
5050
assert.NoError(t, err)
5151

5252
err = thisMSP.Setup(conf)
@@ -68,7 +68,7 @@ func TestValidateIntermediateConfigOU(t *testing.T) {
6868
conf, err := GetLocalMspConfig("testdata/external", nil, "DEFAULT")
6969
assert.NoError(t, err)
7070

71-
thisMSP, err = NewBccspMsp()
71+
thisMSP, err = newBccspMsp()
7272
assert.NoError(t, err)
7373
ks, err := sw.NewFileBasedKeyStore(nil, filepath.Join("testdata/external", "keystore"), true)
7474
assert.NoError(t, err)

msp/revocation_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func TestRevokedIntermediateCA(t *testing.T) {
8787
conf, err := GetLocalMspConfig(dir, nil, "DEFAULT")
8888
assert.NoError(t, err)
8989

90-
thisMSP, err := NewBccspMsp()
90+
thisMSP, err := newBccspMsp()
9191
assert.NoError(t, err)
9292
ks, err := sw.NewFileBasedKeyStore(nil, filepath.Join(dir, "keystore"), true)
9393
assert.NoError(t, err)

0 commit comments

Comments
 (0)