-
Notifications
You must be signed in to change notification settings - Fork 0
/
mgmt.go
132 lines (106 loc) · 3.3 KB
/
mgmt.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
Copyright hechain. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package mgmt
import (
"sync"
"github.com/hechain20/hechain/bccsp"
"github.com/hechain20/hechain/common/flogging"
"github.com/hechain20/hechain/msp"
"github.com/hechain20/hechain/msp/cache"
"github.com/spf13/viper"
)
// FIXME: AS SOON AS THE CHAIN MANAGEMENT CODE IS COMPLETE,
// THESE MAPS AND HELPER FUNCTIONS SHOULD DISAPPEAR BECAUSE
// OWNERSHIP OF PER-CHAIN MSP MANAGERS WILL BE HANDLED BY IT;
// HOWEVER IN THE INTERIM, THESE HELPER FUNCTIONS ARE REQUIRED
var (
m sync.Mutex
localMsp msp.MSP
mspMap = make(map[string]msp.MSPManager)
mspLogger = flogging.MustGetLogger("msp")
)
// TODO - this is a temporary solution to allow the peer to track whether the
// MSPManager has been setup for a channel, which indicates whether the channel
// exists or not
type mspMgmtMgr struct {
msp.MSPManager
}
// GetManagerForChain returns the msp manager for the supplied
// chain; if no such manager exists, one is created
func GetManagerForChain(chainID string) msp.MSPManager {
m.Lock()
defer m.Unlock()
mspMgr, ok := mspMap[chainID]
if !ok {
mspLogger.Debugf("Created new msp manager for channel `%s`", chainID)
mspMgmtMgr := &mspMgmtMgr{msp.NewMSPManager()}
mspMap[chainID] = mspMgmtMgr
mspMgr = mspMgmtMgr
}
return mspMgr
}
// GetManagers returns all the managers registered
func GetDeserializers() map[string]msp.IdentityDeserializer {
m.Lock()
defer m.Unlock()
clone := make(map[string]msp.IdentityDeserializer)
for key, mspManager := range mspMap {
clone[key] = mspManager
}
return clone
}
// XXXSetMSPManager is a stopgap solution to transition from the custom MSP config block
// parsing to the channelconfig.Resources interface, while preserving the problematic singleton
// nature of the MSP manager
func XXXSetMSPManager(chainID string, manager msp.MSPManager) {
m.Lock()
defer m.Unlock()
mspMap[chainID] = &mspMgmtMgr{manager}
}
// GetLocalMSP returns the local msp (and creates it if it doesn't exist)
func GetLocalMSP(cryptoProvider bccsp.BCCSP) msp.MSP {
m.Lock()
defer m.Unlock()
if localMsp != nil {
return localMsp
}
localMsp = loadLocalMSP(cryptoProvider)
return localMsp
}
func loadLocalMSP(bccsp bccsp.BCCSP) msp.MSP {
// determine the type of MSP (by default, we'll use bccspMSP)
mspType := viper.GetString("peer.localMspType")
if mspType == "" {
mspType = msp.ProviderTypeToString(msp.FABRIC)
}
newOpts, found := msp.Options[mspType]
if !found {
mspLogger.Panicf("msp type " + mspType + " unknown")
}
mspInst, err := msp.New(newOpts, bccsp)
if err != nil {
mspLogger.Fatalf("Failed to initialize local MSP, received err %+v", err)
}
switch mspType {
case msp.ProviderTypeToString(msp.FABRIC):
mspInst, err = cache.New(mspInst)
if err != nil {
mspLogger.Fatalf("Failed to initialize local MSP, received err %+v", err)
}
case msp.ProviderTypeToString(msp.IDEMIX):
// Do nothing
default:
panic("msp type " + mspType + " unknown")
}
mspLogger.Debugf("Created new local MSP")
return mspInst
}
// GetIdentityDeserializer returns the IdentityDeserializer for the given chain
func GetIdentityDeserializer(chainID string, cryptoProvider bccsp.BCCSP) msp.IdentityDeserializer {
if chainID == "" {
return GetLocalMSP(cryptoProvider)
}
return GetManagerForChain(chainID)
}