@@ -8,13 +8,18 @@ package channelconfig
8
8
9
9
import (
10
10
"github.com/hyperledger/fabric/common/cauthdsl"
11
+ "github.com/hyperledger/fabric/common/config"
11
12
oldchannelconfig "github.com/hyperledger/fabric/common/config/channel"
12
13
oldmspconfig "github.com/hyperledger/fabric/common/config/channel/msp"
14
+ "github.com/hyperledger/fabric/common/configtx"
15
+ configtxapi "github.com/hyperledger/fabric/common/configtx/api"
13
16
"github.com/hyperledger/fabric/common/flogging"
14
17
"github.com/hyperledger/fabric/common/policies"
15
18
"github.com/hyperledger/fabric/msp"
16
19
cb "github.com/hyperledger/fabric/protos/common"
20
+ "github.com/hyperledger/fabric/protos/utils"
17
21
22
+ "github.com/golang/protobuf/proto"
18
23
"github.com/pkg/errors"
19
24
)
20
25
@@ -30,9 +35,10 @@ const RootGroupKey = "Channel"
30
35
// same value. The Bundle structure is immutable and will always be replaced in its
31
36
// entirety, with new backing memory.
32
37
type Bundle struct {
33
- policyManager policies.Manager
34
- mspManager msp.MSPManager
35
- rootConfig * oldchannelconfig.Root
38
+ policyManager policies.Manager
39
+ mspManager msp.MSPManager
40
+ rootConfig * oldchannelconfig.Root
41
+ configtxManager configtxapi.Manager
36
42
}
37
43
38
44
// PolicyManager returns the policy manager constructed for this config
@@ -71,6 +77,74 @@ func (b *Bundle) ApplicationConfig() (oldchannelconfig.Application, bool) {
71
77
return result , result != nil
72
78
}
73
79
80
+ // ConfigtxManager returns the configtx.Manager for the channel
81
+ func (b * Bundle ) ConfigtxManager () configtxapi.Manager {
82
+ return b .configtxManager
83
+ }
84
+
85
+ type noopDeserializer struct {}
86
+
87
+ // Deserializer returns nil, nil
88
+ func (nd noopDeserializer ) Deserialize (key string , value []byte ) (proto.Message , error ) {
89
+ return nil , nil
90
+ }
91
+
92
+ type noopProposer struct {
93
+ policyManager policies.Manager
94
+ }
95
+
96
+ // BeginValueProposals returns a noop deserializer, and noop proposers for subgroups
97
+ func (np noopProposer ) BeginValueProposals (tx interface {}, groups []string ) (config.ValueDeserializer , []config.ValueProposer , error ) {
98
+ proposers := make ([]config.ValueProposer , len (groups ))
99
+ for i := range proposers {
100
+ proposers [i ] = noopProposer {}
101
+ }
102
+ return noopDeserializer {}, proposers , nil
103
+ }
104
+
105
+ // BeginValueProposals returns a noop deserializer, and noop proposers for subgroups
106
+ func (np noopProposer ) BeginPolicyProposals (tx interface {}, groups []string ) ([]policies.Proposer , error ) {
107
+ proposers := make ([]policies.Proposer , len (groups ))
108
+ for i := range proposers {
109
+ proposers [i ] = noopProposer {}
110
+ }
111
+ return proposers , nil
112
+ }
113
+
114
+ // ProposePolicy returns nil, nil
115
+ func (np noopProposer ) ProposePolicy (tx interface {}, name string , policy * cb.ConfigPolicy ) (proto.Message , error ) {
116
+ return nil , nil
117
+ }
118
+
119
+ // RollbackProposals is a no-op
120
+ func (np noopProposer ) RollbackProposals (tx interface {}) {}
121
+
122
+ // PreCommit returns nil
123
+ func (np noopProposer ) PreCommit (tx interface {}) error { return nil }
124
+
125
+ // CommitProposals is a no-op
126
+ func (np noopProposer ) CommitProposals (tx interface {}) {}
127
+
128
+ // ValueProposer returns noopProposer
129
+ func (np noopProposer ) ValueProposer () config.ValueProposer {
130
+ return np
131
+ }
132
+
133
+ // PolicyProposer returns noopProposer
134
+ func (np noopProposer ) PolicyProposer () policies.Proposer {
135
+ return np
136
+ }
137
+
138
+ // RootGroupKey returns RootGroupKey constant
139
+ func (np noopProposer ) RootGroupKey () string {
140
+ return RootGroupKey
141
+ }
142
+
143
+ // PolicyManager() returns the policy manager for considering config changes
144
+ func (np noopProposer ) PolicyManager () policies.Manager {
145
+ return np .policyManager
146
+ }
147
+
74
148
// NewBundle creates a new immutable bundle of configuration
75
149
func NewBundle (config * cb.Config ) (* Bundle , error ) {
76
150
mspConfigHandler := oldmspconfig .NewMSPConfigHandler ()
@@ -100,9 +174,20 @@ func NewBundle(config *cb.Config) (*Bundle, error) {
100
174
return nil , errors .Wrap (err , "initializing policymanager failed" )
101
175
}
102
176
177
+ env , err := utils .CreateSignedEnvelope (cb .HeaderType_CONFIG , "sanitycheck" , nil , & cb.ConfigEnvelope {Config : config }, 0 , 0 )
178
+ if err != nil {
179
+ return nil , errors .Wrap (err , "creating envelope for configtx manager failed" )
180
+ }
181
+
182
+ configtxManager , err := configtx .NewManagerImpl (env , noopProposer {}, nil )
183
+ if err != nil {
184
+ return nil , errors .Wrap (err , "initializing configtx manager failed" )
185
+ }
186
+
103
187
return & Bundle {
104
- mspManager : mspConfigHandler ,
105
- policyManager : policyManager ,
106
- rootConfig : rootConfig ,
188
+ mspManager : mspConfigHandler ,
189
+ policyManager : policyManager ,
190
+ rootConfig : rootConfig ,
191
+ configtxManager : configtxManager ,
107
192
}, nil
108
193
}
0 commit comments