Skip to content

Commit 39be48c

Browse files
author
Jason Yellick
committed
[FAB-1745] Add util methods for orderer config
https://jira.hyperledger.org/browse/FAB-1745 This CR adds utility methods for generating the configuration items needed for the orderer shared configuration and updates the tests and genesis block generation to use them. Change-Id: I458c593954978177079b0bee7926e4b60332df26 Signed-off-by: Jason Yellick <[email protected]>
1 parent aa8e51b commit 39be48c

File tree

3 files changed

+138
-180
lines changed

3 files changed

+138
-180
lines changed

orderer/common/bootstrap/provisional/item.go

+7-43
Original file line numberDiff line numberDiff line change
@@ -21,44 +21,23 @@ import (
2121
"github.com/hyperledger/fabric/common/configtx"
2222
"github.com/hyperledger/fabric/orderer/common/sharedconfig"
2323
cb "github.com/hyperledger/fabric/protos/common"
24-
ab "github.com/hyperledger/fabric/protos/orderer"
2524
"github.com/hyperledger/fabric/protos/utils"
2625
)
2726

2827
func (cbs *commonBootstrapper) templateConsensusType() *cb.ConfigurationItem {
29-
configItemKey := sharedconfig.ConsensusTypeKey
30-
configItemValue := utils.MarshalOrPanic(&ab.ConsensusType{Type: cbs.consensusType})
31-
modPolicy := configtx.NewConfigurationItemPolicyKey
32-
33-
configItemChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_ITEM, msgVersion, cbs.chainID, epoch)
34-
return utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
28+
return sharedconfig.TemplateConsensusType(cbs.consensusType)
3529
}
3630

3731
func (cbs *commonBootstrapper) templateBatchSize() *cb.ConfigurationItem {
38-
configItemKey := sharedconfig.BatchSizeKey
39-
configItemValue := utils.MarshalOrPanic(cbs.batchSize)
40-
modPolicy := configtx.NewConfigurationItemPolicyKey
41-
42-
configItemChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_ITEM, msgVersion, cbs.chainID, epoch)
43-
return utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
32+
return sharedconfig.TemplateBatchSize(cbs.batchSize)
4433
}
4534

4635
func (cbs *commonBootstrapper) templateBatchTimeout() *cb.ConfigurationItem {
47-
configItemKey := sharedconfig.BatchTimeoutKey
48-
configItemValue := utils.MarshalOrPanic(&ab.BatchTimeout{Timeout: cbs.batchTimeout})
49-
modPolicy := configtx.NewConfigurationItemPolicyKey
50-
51-
configItemChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_ITEM, msgVersion, cbs.chainID, epoch)
52-
return utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
36+
return sharedconfig.TemplateBatchTimeout(cbs.batchTimeout)
5337
}
5438

5539
func (cbs *commonBootstrapper) templateChainCreationPolicyNames() *cb.ConfigurationItem {
56-
configItemKey := sharedconfig.ChainCreationPolicyNamesKey
57-
configItemValue := utils.MarshalOrPanic(&ab.ChainCreationPolicyNames{Names: DefaultChainCreationPolicyNames})
58-
modPolicy := configtx.NewConfigurationItemPolicyKey
59-
60-
configItemChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_ITEM, msgVersion, cbs.chainID, epoch)
61-
return utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
40+
return sharedconfig.TemplateChainCreationPolicyNames(DefaultChainCreationPolicyNames)
6241
}
6342

6443
func (cbs *commonBootstrapper) templateAcceptAllPolicy() *cb.ConfigurationItem {
@@ -71,21 +50,11 @@ func (cbs *commonBootstrapper) templateAcceptAllPolicy() *cb.ConfigurationItem {
7150
}
7251

7352
func (cbs *commonBootstrapper) templateIngressPolicyNames() *cb.ConfigurationItem {
74-
configItemKey := sharedconfig.IngressPolicyNamesKey
75-
configItemValue := utils.MarshalOrPanic(&ab.IngressPolicyNames{Names: []string{AcceptAllPolicyKey}})
76-
modPolicy := configtx.NewConfigurationItemPolicyKey
77-
78-
configItemChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_ITEM, msgVersion, cbs.chainID, epoch)
79-
return utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
53+
return sharedconfig.TemplateIngressPolicyNames([]string{AcceptAllPolicyKey})
8054
}
8155

8256
func (cbs *commonBootstrapper) templateEgressPolicyNames() *cb.ConfigurationItem {
83-
configItemKey := sharedconfig.EgressPolicyNamesKey
84-
configItemValue := utils.MarshalOrPanic(&ab.EgressPolicyNames{Names: []string{AcceptAllPolicyKey}})
85-
modPolicy := configtx.NewConfigurationItemPolicyKey
86-
87-
configItemChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_ITEM, msgVersion, cbs.chainID, epoch)
88-
return utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
57+
return sharedconfig.TemplateEgressPolicyNames([]string{AcceptAllPolicyKey})
8958
}
9059

9160
func (cbs *commonBootstrapper) templateRejectAllPolicy() *cb.ConfigurationItem {
@@ -99,10 +68,5 @@ func (cbs *commonBootstrapper) templateRejectAllPolicy() *cb.ConfigurationItem {
9968
}
10069

10170
func (kbs *kafkaBootstrapper) templateKafkaBrokers() *cb.ConfigurationItem {
102-
configItemKey := sharedconfig.KafkaBrokersKey
103-
configItemValue := utils.MarshalOrPanic(&ab.KafkaBrokers{Brokers: kbs.kafkaBrokers})
104-
modPolicy := configtx.NewConfigurationItemPolicyKey
105-
106-
configItemChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_ITEM, msgVersion, kbs.chainID, epoch)
107-
return utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
71+
return sharedconfig.TemplateKafkaBrokers(kbs.kafkaBrokers)
10872
}

orderer/common/sharedconfig/sharedconfig_test.go

+45-137
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import (
2727

2828
cb "github.com/hyperledger/fabric/protos/common"
2929
ab "github.com/hyperledger/fabric/protos/orderer"
30-
"github.com/hyperledger/fabric/protos/utils"
3130

3231
logging "github.com/op/go-logging"
3332
)
@@ -36,6 +35,14 @@ func init() {
3635
logging.SetLevel(logging.DEBUG, "")
3736
}
3837

38+
func invalidMessage(key string) *cb.ConfigurationItem {
39+
return &cb.ConfigurationItem{
40+
Type: cb.ConfigurationItem_Orderer,
41+
Key: key,
42+
Value: []byte("Garbage Data"),
43+
}
44+
}
45+
3946
func doesFuncCrash(crasher func(), test string) bool {
4047
// Adapted from https://talks.golang.org/2014/testing.slide#23 to test os.Exit() functionality
4148
if os.Getenv("BE_CRASHER") == "1" {
@@ -85,22 +92,10 @@ func TestRollback(t *testing.T) {
8592

8693
func TestConsensusType(t *testing.T) {
8794
endType := "foo"
88-
invalidMessage :=
89-
&cb.ConfigurationItem{
90-
Type: cb.ConfigurationItem_Orderer,
91-
Key: ConsensusTypeKey,
92-
Value: []byte("Garbage Data"),
93-
}
94-
validMessage := &cb.ConfigurationItem{
95-
Type: cb.ConfigurationItem_Orderer,
96-
Key: ConsensusTypeKey,
97-
Value: utils.MarshalOrPanic(&ab.ConsensusType{Type: endType}),
98-
}
99-
otherValidMessage := &cb.ConfigurationItem{
100-
Type: cb.ConfigurationItem_Orderer,
101-
Key: ConsensusTypeKey,
102-
Value: utils.MarshalOrPanic(&ab.ConsensusType{Type: "bar"}),
103-
}
95+
invalidMessage := invalidMessage(ConsensusTypeKey)
96+
validMessage := TemplateConsensusType(endType)
97+
otherValidMessage := TemplateConsensusType("bar")
98+
10499
m := NewManagerImpl()
105100
m.BeginConfig()
106101

@@ -143,11 +138,9 @@ func TestBatchSize(t *testing.T) {
143138
t.Run("ValidConfiguration", func(t *testing.T) {
144139
m := NewManagerImpl()
145140
m.BeginConfig()
146-
err := m.ProposeConfig(&cb.ConfigurationItem{
147-
Type: cb.ConfigurationItem_Orderer,
148-
Key: BatchSizeKey,
149-
Value: utils.MarshalOrPanic(&ab.BatchSize{MaxMessageCount: validMaxMessageCount, AbsoluteMaxBytes: validAbsoluteMaxBytes, PreferredMaxBytes: validPreferredMaxBytes}),
150-
})
141+
err := m.ProposeConfig(
142+
TemplateBatchSize(&ab.BatchSize{MaxMessageCount: validMaxMessageCount, AbsoluteMaxBytes: validAbsoluteMaxBytes, PreferredMaxBytes: validPreferredMaxBytes}),
143+
)
151144
assert.Nil(t, err, "Error applying valid config: %s", err)
152145
m.CommitConfig()
153146
if m.BatchSize().MaxMessageCount != validMaxMessageCount {
@@ -164,74 +157,43 @@ func TestBatchSize(t *testing.T) {
164157
t.Run("UnserializableConfiguration", func(t *testing.T) {
165158
m := NewManagerImpl()
166159
m.BeginConfig()
167-
err := m.ProposeConfig(&cb.ConfigurationItem{
168-
Type: cb.ConfigurationItem_Orderer,
169-
Key: BatchSizeKey,
170-
Value: []byte("Garbage Data"),
171-
})
160+
err := m.ProposeConfig(invalidMessage(BatchSizeKey))
172161
assert.NotNil(t, err, "Should have failed on invalid message")
173162
m.CommitConfig()
174163
})
175164

176165
t.Run("ZeroMaxMessageCount", func(t *testing.T) {
177166
m := NewManagerImpl()
178167
m.BeginConfig()
179-
err := m.ProposeConfig(&cb.ConfigurationItem{
180-
Type: cb.ConfigurationItem_Orderer,
181-
Key: BatchSizeKey,
182-
Value: utils.MarshalOrPanic(&ab.BatchSize{MaxMessageCount: 0, AbsoluteMaxBytes: validAbsoluteMaxBytes, PreferredMaxBytes: validPreferredMaxBytes}),
183-
})
168+
err := m.ProposeConfig(TemplateBatchSize(&ab.BatchSize{MaxMessageCount: 0, AbsoluteMaxBytes: validAbsoluteMaxBytes, PreferredMaxBytes: validPreferredMaxBytes}))
184169
assert.NotNil(t, err, "Should have rejected batch size max message count of 0")
185170
m.CommitConfig()
186171
})
187172

188173
t.Run("ZeroAbsoluteMaxBytes", func(t *testing.T) {
189174
m := NewManagerImpl()
190175
m.BeginConfig()
191-
err := m.ProposeConfig(&cb.ConfigurationItem{
192-
Type: cb.ConfigurationItem_Orderer,
193-
Key: BatchSizeKey,
194-
Value: utils.MarshalOrPanic(&ab.BatchSize{MaxMessageCount: validMaxMessageCount, AbsoluteMaxBytes: 0, PreferredMaxBytes: validPreferredMaxBytes}),
195-
})
176+
err := m.ProposeConfig(TemplateBatchSize(&ab.BatchSize{MaxMessageCount: validMaxMessageCount, AbsoluteMaxBytes: 0, PreferredMaxBytes: validPreferredMaxBytes}))
196177
assert.NotNil(t, err, "Should have rejected batch size absolute max message bytes of 0")
197178
m.CommitConfig()
198179
})
199180

200181
t.Run("TooLargePreferredMaxBytes", func(t *testing.T) {
201182
m := NewManagerImpl()
202183
m.BeginConfig()
203-
err := m.ProposeConfig(&cb.ConfigurationItem{
204-
Type: cb.ConfigurationItem_Orderer,
205-
Key: BatchSizeKey,
206-
Value: utils.MarshalOrPanic(&ab.BatchSize{MaxMessageCount: validMaxMessageCount, AbsoluteMaxBytes: validAbsoluteMaxBytes, PreferredMaxBytes: validAbsoluteMaxBytes + 1}),
207-
})
184+
err := m.ProposeConfig(TemplateBatchSize(&ab.BatchSize{MaxMessageCount: validMaxMessageCount, AbsoluteMaxBytes: validAbsoluteMaxBytes, PreferredMaxBytes: validAbsoluteMaxBytes + 1}))
208185
assert.NotNil(t, err, "Should have rejected batch size preferred max message bytes greater than absolute max message bytes")
209186
m.CommitConfig()
210187
})
211188
}
212189

213190
func TestBatchTimeout(t *testing.T) {
214191
endBatchTimeout, _ := time.ParseDuration("1s")
215-
invalidMessage := &cb.ConfigurationItem{
216-
Type: cb.ConfigurationItem_Orderer,
217-
Key: BatchTimeoutKey,
218-
Value: []byte("Garbage Data"),
219-
}
220-
negativeBatchTimeout := &cb.ConfigurationItem{
221-
Type: cb.ConfigurationItem_Orderer,
222-
Key: BatchTimeoutKey,
223-
Value: utils.MarshalOrPanic(&ab.BatchTimeout{Timeout: "-1s"}),
224-
}
225-
zeroBatchTimeout := &cb.ConfigurationItem{
226-
Type: cb.ConfigurationItem_Orderer,
227-
Key: BatchTimeoutKey,
228-
Value: utils.MarshalOrPanic(&ab.BatchTimeout{Timeout: "0s"}),
229-
}
230-
validMessage := &cb.ConfigurationItem{
231-
Type: cb.ConfigurationItem_Orderer,
232-
Key: BatchTimeoutKey,
233-
Value: utils.MarshalOrPanic(&ab.BatchTimeout{Timeout: endBatchTimeout.String()}),
234-
}
192+
invalidMessage := invalidMessage(BatchTimeoutKey)
193+
negativeBatchTimeout := TemplateBatchTimeout("-1s")
194+
zeroBatchTimeout := TemplateBatchTimeout("0s")
195+
validMessage := TemplateBatchTimeout(endBatchTimeout.String())
196+
235197
m := NewManagerImpl()
236198
m.BeginConfig()
237199

@@ -265,34 +227,15 @@ func TestBatchTimeout(t *testing.T) {
265227
func TestKafkaBrokers(t *testing.T) {
266228
endList := []string{"127.0.0.1:9092", "foo.bar:9092"}
267229

268-
invalidMessage := &cb.ConfigurationItem{
269-
Type: cb.ConfigurationItem_Orderer,
270-
Key: KafkaBrokersKey,
271-
Value: []byte("Garbage Data"),
272-
}
273-
274-
zeroBrokers := &cb.ConfigurationItem{
275-
Type: cb.ConfigurationItem_Orderer,
276-
Key: KafkaBrokersKey,
277-
Value: utils.MarshalOrPanic(&ab.KafkaBrokers{}),
278-
}
279-
230+
invalidMessage := invalidMessage(KafkaBrokersKey)
231+
zeroBrokers := TemplateKafkaBrokers([]string{})
280232
badList := []string{"127.0.0.1", "foo.bar", "127.0.0.1:-1", "localhost:65536", "foo.bar.:9092", ".127.0.0.1:9092", "-foo.bar:9092"}
281233
badMessages := []*cb.ConfigurationItem{}
282234
for _, badAddress := range badList {
283-
msg := &cb.ConfigurationItem{
284-
Type: cb.ConfigurationItem_Orderer,
285-
Key: KafkaBrokersKey,
286-
Value: utils.MarshalOrPanic(&ab.KafkaBrokers{Brokers: []string{badAddress}}),
287-
}
288-
badMessages = append(badMessages, msg)
235+
badMessages = append(badMessages, TemplateKafkaBrokers([]string{badAddress}))
289236
}
290237

291-
validMessage := &cb.ConfigurationItem{
292-
Type: cb.ConfigurationItem_Orderer,
293-
Key: KafkaBrokersKey,
294-
Value: utils.MarshalOrPanic(&ab.KafkaBrokers{Brokers: endList}),
295-
}
238+
validMessage := TemplateKafkaBrokers(endList)
296239

297240
m := NewManagerImpl()
298241
m.BeginConfig()
@@ -330,20 +273,11 @@ func TestKafkaBrokers(t *testing.T) {
330273
}
331274
}
332275

333-
func TestIngressPolicyNames(t *testing.T) {
334-
endPolicy := []string{"foo"}
335-
invalidMessage :=
336-
&cb.ConfigurationItem{
337-
Type: cb.ConfigurationItem_Orderer,
338-
Key: IngressPolicyNamesKey,
339-
Value: []byte("Garbage Data"),
340-
}
341-
validMessage := &cb.ConfigurationItem{
342-
Type: cb.ConfigurationItem_Orderer,
343-
Key: IngressPolicyNamesKey,
344-
Value: utils.MarshalOrPanic(&ab.IngressPolicyNames{Names: endPolicy}),
345-
}
346-
m := NewManagerImpl()
276+
func testPolicyNames(m *ManagerImpl, key string, initializer func(val []string) *cb.ConfigurationItem, retriever func() []string, t *testing.T) {
277+
endPolicy := []string{"foo", "bar"}
278+
invalidMessage := invalidMessage(key)
279+
validMessage := initializer(endPolicy)
280+
347281
m.BeginConfig()
348282

349283
err := m.ProposeConfig(validMessage)
@@ -366,48 +300,22 @@ func TestIngressPolicyNames(t *testing.T) {
366300

367301
m.CommitConfig()
368302

369-
if nowPolicy := m.IngressPolicyNames(); !reflect.DeepEqual(nowPolicy, endPolicy) {
370-
t.Fatalf("IngressPolicyNames should have ended as %s but was %s", endPolicy, nowPolicy)
303+
if nowPolicy := retriever(); !reflect.DeepEqual(nowPolicy, endPolicy) {
304+
t.Fatalf("%s should have ended as %s but was %s", key, endPolicy, nowPolicy)
371305
}
372306
}
373307

374-
func TestEgressPolicyNames(t *testing.T) {
375-
endPolicy := []string{"foo"}
376-
invalidMessage :=
377-
&cb.ConfigurationItem{
378-
Type: cb.ConfigurationItem_Orderer,
379-
Key: EgressPolicyNamesKey,
380-
Value: []byte("Garbage Data"),
381-
}
382-
validMessage := &cb.ConfigurationItem{
383-
Type: cb.ConfigurationItem_Orderer,
384-
Key: EgressPolicyNamesKey,
385-
Value: utils.MarshalOrPanic(&ab.EgressPolicyNames{Names: endPolicy}),
386-
}
308+
func TestIngressPolicyNames(t *testing.T) {
387309
m := NewManagerImpl()
388-
m.BeginConfig()
389-
390-
err := m.ProposeConfig(validMessage)
391-
if err != nil {
392-
t.Fatalf("Error applying valid config: %s", err)
393-
}
394-
395-
m.CommitConfig()
396-
m.BeginConfig()
397-
398-
err = m.ProposeConfig(invalidMessage)
399-
if err == nil {
400-
t.Fatalf("Should have failed on invalid message")
401-
}
402-
403-
err = m.ProposeConfig(validMessage)
404-
if err != nil {
405-
t.Fatalf("Error re-applying valid config: %s", err)
406-
}
310+
testPolicyNames(m, IngressPolicyNamesKey, TemplateIngressPolicyNames, m.IngressPolicyNames, t)
311+
}
407312

408-
m.CommitConfig()
313+
func TestEgressPolicyNames(t *testing.T) {
314+
m := NewManagerImpl()
315+
testPolicyNames(m, EgressPolicyNamesKey, TemplateEgressPolicyNames, m.EgressPolicyNames, t)
316+
}
409317

410-
if nowPolicy := m.EgressPolicyNames(); !reflect.DeepEqual(nowPolicy, endPolicy) {
411-
t.Fatalf("EgressPolicyNames should have ended as %s but was %s", endPolicy, nowPolicy)
412-
}
318+
func TestChainCreationPolicyNames(t *testing.T) {
319+
m := NewManagerImpl()
320+
testPolicyNames(m, ChainCreationPolicyNamesKey, TemplateChainCreationPolicyNames, m.ChainCreationPolicyNames, t)
413321
}

0 commit comments

Comments
 (0)