Skip to content

Commit eb640db

Browse files
author
Jason Yellick
committed
[FAB-4328] Fix orderer genesis defaults
There are a few incorrect things about the default configuration produced for the ordering system channel by the configtxgen tool. The consortiums definitions and channel creation policy cannot be modified after creation, and the ordering system channel includes an Applications section by default which is inappropriate. This CR fixes both these issues. Change-Id: Ie6a934198fafbb37065d703edc0bc8fc9208b9ca Signed-off-by: Jason Yellick <[email protected]>
1 parent 18057d4 commit eb640db

File tree

9 files changed

+88
-44
lines changed

9 files changed

+88
-44
lines changed

common/configtx/template.go

+13-3
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,9 @@ func copyGroup(source *cb.ConfigGroup, target *cb.ConfigGroup) error {
104104
for key, group := range source.Groups {
105105
_, ok := target.Groups[key]
106106
if !ok {
107-
target.Groups[key] = cb.NewConfigGroup()
107+
newGroup := cb.NewConfigGroup()
108+
newGroup.ModPolicy = group.ModPolicy
109+
target.Groups[key] = newGroup
108110
}
109111

110112
err := copyGroup(group, target.Groups[key])
@@ -151,7 +153,7 @@ type modPolicySettingTemplate struct {
151153
}
152154

153155
// NewModPolicySettingTemplate wraps another template and sets the ModPolicy of
154-
// every ConfigGroup/ConfigValue/ConfigPolicy to modPolicy
156+
// every ConfigGroup/ConfigValue/ConfigPolicy without a modPolicy to modPolicy
155157
func NewModPolicySettingTemplate(modPolicy string, template Template) Template {
156158
return &modPolicySettingTemplate{
157159
modPolicy: modPolicy,
@@ -160,13 +162,21 @@ func NewModPolicySettingTemplate(modPolicy string, template Template) Template {
160162
}
161163

162164
func setGroupModPolicies(modPolicy string, group *cb.ConfigGroup) {
163-
group.ModPolicy = modPolicy
165+
if group.ModPolicy == "" {
166+
group.ModPolicy = modPolicy
167+
}
164168

165169
for _, value := range group.Values {
170+
if value.ModPolicy != "" {
171+
continue
172+
}
166173
value.ModPolicy = modPolicy
167174
}
168175

169176
for _, policy := range group.Policies {
177+
if policy.ModPolicy != "" {
178+
continue
179+
}
170180
policy.ModPolicy = modPolicy
171181
}
172182

common/configtx/template_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,23 @@ func TestCompositeTemplate(t *testing.T) {
7777
}
7878

7979
func TestModPolicySettingTemplate(t *testing.T) {
80+
existingModPolicy := "bar"
81+
8082
subGroup := "group"
83+
subGroupExistingModPolicy := "otherGroup"
8184
input := cb.NewConfigGroup()
8285
input.Groups[subGroup] = cb.NewConfigGroup()
86+
input.Groups[subGroupExistingModPolicy] = &cb.ConfigGroup{ModPolicy: existingModPolicy}
8387

8488
policyName := "policy"
8589
valueName := "value"
90+
policyExistingModPolicy := "otherPolicy"
91+
valueExistingModPolicy := "otherValue"
8692
for _, group := range []*cb.ConfigGroup{input, input.Groups[subGroup]} {
8793
group.Values[valueName] = &cb.ConfigValue{}
8894
group.Policies[policyName] = &cb.ConfigPolicy{}
95+
group.Values[valueExistingModPolicy] = &cb.ConfigValue{ModPolicy: existingModPolicy}
96+
group.Policies[policyExistingModPolicy] = &cb.ConfigPolicy{ModPolicy: existingModPolicy}
8997
}
9098

9199
modPolicyName := "foo"
@@ -98,9 +106,14 @@ func TestModPolicySettingTemplate(t *testing.T) {
98106
assert.Equal(t, modPolicyName, configUpdate.WriteSet.ModPolicy)
99107
assert.Equal(t, modPolicyName, configUpdate.WriteSet.Values[valueName].ModPolicy)
100108
assert.Equal(t, modPolicyName, configUpdate.WriteSet.Policies[policyName].ModPolicy)
109+
assert.Equal(t, existingModPolicy, configUpdate.WriteSet.Values[valueExistingModPolicy].ModPolicy)
110+
assert.Equal(t, existingModPolicy, configUpdate.WriteSet.Policies[policyExistingModPolicy].ModPolicy)
101111
assert.Equal(t, modPolicyName, configUpdate.WriteSet.Groups[subGroup].ModPolicy)
102112
assert.Equal(t, modPolicyName, configUpdate.WriteSet.Groups[subGroup].Values[valueName].ModPolicy)
103113
assert.Equal(t, modPolicyName, configUpdate.WriteSet.Groups[subGroup].Policies[policyName].ModPolicy)
114+
assert.Equal(t, existingModPolicy, configUpdate.WriteSet.Groups[subGroup].Values[valueExistingModPolicy].ModPolicy)
115+
assert.Equal(t, existingModPolicy, configUpdate.WriteSet.Groups[subGroup].Policies[policyExistingModPolicy].ModPolicy)
116+
assert.Equal(t, existingModPolicy, configUpdate.WriteSet.Groups[subGroupExistingModPolicy].ModPolicy)
104117
}
105118

106119
func TestNewChainTemplate(t *testing.T) {

common/configtx/tool/configtxgen/main.go

+8
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ func doOutputChannelCreateTx(conf *genesisconfig.Profile, channelID string, outp
6767
return fmt.Errorf("Error getting signing identity: %s", err)
6868
}
6969

70+
if conf.Application == nil {
71+
return fmt.Errorf("Cannot define a new channel with no application section")
72+
}
73+
7074
// XXX we ignore the non-application org names here, once the tool supports configuration updates
7175
// we should come up with a cleaner way to handle this, but leaving as is for the moment to not break
7276
// backwards compatibility
@@ -92,6 +96,10 @@ func doOutputAnchorPeersUpdate(conf *genesisconfig.Profile, channelID string, ou
9296
return fmt.Errorf("Must specify an organization to update the anchor peer for")
9397
}
9498

99+
if conf.Application == nil {
100+
return fmt.Errorf("Cannot update anchor peers without an application section")
101+
}
102+
95103
var org *genesisconfig.Organization
96104
for _, iorg := range conf.Application.Organizations {
97105
if iorg.Name == asOrg {

common/configtx/tool/configtxgen/main_test.go

+32-11
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package main
1818

1919
import (
20+
"flag"
2021
"io/ioutil"
2122
"os"
2223
"testing"
@@ -65,7 +66,7 @@ func TestInspectConfigTx(t *testing.T) {
6566
configTxDest := tmpDir + string(os.PathSeparator) + "configtx"
6667

6768
factory.InitFactories(nil)
68-
config := genesisconfig.Load(genesisconfig.SampleInsecureProfile)
69+
config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile)
6970

7071
assert.NoError(t, doOutputChannelCreateTx(config, "foo", configTxDest), "Good outputChannelCreateTx generation request")
7172
assert.NoError(t, doInspectChannelCreateTx(configTxDest), "Good configtx inspection request")
@@ -75,30 +76,50 @@ func TestGenerateAnchorPeersUpdate(t *testing.T) {
7576
configTxDest := tmpDir + string(os.PathSeparator) + "anchorPeerUpdate"
7677

7778
factory.InitFactories(nil)
78-
config := genesisconfig.Load(genesisconfig.SampleSingleMSPSoloProfile)
79+
config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile)
7980

8081
assert.NoError(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, genesisconfig.SampleOrgName), "Good anchorPeerUpdate request")
8182
}
8283

83-
func TestFlags(t *testing.T) {
84-
blockDest := tmpDir + string(os.PathSeparator) + "block"
84+
func TestConfigTxFlags(t *testing.T) {
8585
configTxDest := tmpDir + string(os.PathSeparator) + "configtx"
86+
configTxDestAnchorPeers := tmpDir + string(os.PathSeparator) + "configtxAnchorPeers"
8687
oldArgs := os.Args
87-
defer func() { os.Args = oldArgs }()
88+
defer func() {
89+
os.Args = oldArgs
90+
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
91+
}()
8892
os.Args = []string{
8993
"cmd",
90-
"-outputBlock=" + blockDest,
9194
"-outputCreateChannelTx=" + configTxDest,
92-
"-profile=" + genesisconfig.SampleSingleMSPSoloProfile,
93-
"-inspectBlock=" + blockDest,
95+
"-profile=" + genesisconfig.SampleSingleMSPChannelProfile,
9496
"-inspectChannelCreateTx=" + configTxDest,
95-
"-outputAnchorPeersUpdate=" + configTxDest,
97+
"-outputAnchorPeersUpdate=" + configTxDestAnchorPeers,
9698
"-asOrg=" + genesisconfig.SampleOrgName,
9799
}
98100
main()
99101

102+
_, err := os.Stat(configTxDest)
103+
assert.NoError(t, err, "Configtx file is written successfully")
104+
_, err = os.Stat(configTxDestAnchorPeers)
105+
assert.NoError(t, err, "Configtx anchor peers file is written successfully")
106+
}
107+
108+
func TestBlockFlags(t *testing.T) {
109+
blockDest := tmpDir + string(os.PathSeparator) + "block"
110+
oldArgs := os.Args
111+
defer func() {
112+
os.Args = oldArgs
113+
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
114+
}()
115+
os.Args = []string{
116+
"cmd",
117+
"-profile=" + genesisconfig.SampleSingleMSPSoloProfile,
118+
"-outputBlock=" + blockDest,
119+
"-inspectBlock=" + blockDest,
120+
}
121+
main()
122+
100123
_, err := os.Stat(blockDest)
101124
assert.NoError(t, err, "Block file is written successfully")
102-
_, err = os.Stat(configTxDest)
103-
assert.NoError(t, err, "Configtx file is written successfully")
104125
}

common/configtx/tool/localconfig/config.go

+2
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ const (
5959
SampleInsecureProfile = "SampleInsecureSolo"
6060
// SampleSingleMSPSoloProfile references the sample profile which includes only the sample MSP and uses solo for ordering.
6161
SampleSingleMSPSoloProfile = "SampleSingleMSPSolo"
62+
// SampleSingleMSPChannelProfile references the sample profile which includes only the sample MSP and is used to create a channel
63+
SampleSingleMSPChannelProfile = "SampleSingleMSPChannel"
6264

6365
// SampleConsortiumName is the sample consortium from the sample configtx.yaml
6466
SampleConsortiumName = "SampleConsortium"

common/configtx/tool/provisional/provisional.go

+20-10
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ const (
7272

7373
// BlockValidationPolicyKey TODO
7474
BlockValidationPolicyKey = "BlockValidation"
75+
76+
// OrdererAdminsPolicy is the absolute path to the orderer admins policy
77+
OrdererAdminsPolicy = "/Channel/Orderer/Admins"
7578
)
7679

7780
type bootstrapper struct {
@@ -97,9 +100,12 @@ func New(conf *genesisconfig.Profile) Generator {
97100
}
98101

99102
if conf.Orderer != nil {
103+
// Orderer addresses
104+
oa := config.TemplateOrdererAddresses(conf.Orderer.Addresses)
105+
oa.Values[config.OrdererAddressesKey].ModPolicy = OrdererAdminsPolicy
106+
100107
bs.ordererGroups = []*cb.ConfigGroup{
101-
// Orderer addresses
102-
config.TemplateOrdererAddresses(conf.Orderer.Addresses),
108+
oa,
103109

104110
// Orderer Config Types
105111
config.TemplateConsensusType(conf.Orderer.OrdererType),
@@ -172,15 +178,19 @@ func New(conf *genesisconfig.Profile) Generator {
172178
}
173179

174180
if conf.Consortiums != nil {
175-
bs.consortiumsGroups = append(bs.consortiumsGroups, config.TemplateConsortiumsGroup())
181+
tcg := config.TemplateConsortiumsGroup()
182+
tcg.Groups[config.ConsortiumsGroupKey].ModPolicy = OrdererAdminsPolicy
183+
bs.consortiumsGroups = append(bs.consortiumsGroups, tcg)
184+
176185
for consortiumName, consortium := range conf.Consortiums {
177-
bs.consortiumsGroups = append(
178-
bs.consortiumsGroups,
179-
config.TemplateConsortiumChannelCreationPolicy(consortiumName, policies.ImplicitMetaPolicyWithSubPolicy(
180-
configvaluesmsp.AdminsPolicyKey,
181-
cb.ImplicitMetaPolicy_ANY,
182-
).Policy),
183-
)
186+
cg := config.TemplateConsortiumChannelCreationPolicy(consortiumName, policies.ImplicitMetaPolicyWithSubPolicy(
187+
configvaluesmsp.AdminsPolicyKey,
188+
cb.ImplicitMetaPolicy_ANY,
189+
).Policy)
190+
191+
cg.Groups[config.ConsortiumsGroupKey].Groups[consortiumName].ModPolicy = OrdererAdminsPolicy
192+
cg.Groups[config.ConsortiumsGroupKey].Groups[consortiumName].Values[config.ChannelCreationPolicyKey].ModPolicy = OrdererAdminsPolicy
193+
bs.consortiumsGroups = append(bs.consortiumsGroups, cg)
184194

185195
for _, org := range consortium.Organizations {
186196
mspConfig, err := msp.GetVerifyingMspConfig(org.MSPDir, org.BCCSP, org.ID)

examples/cluster/config/configtx.yaml

-4
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,6 @@ Profiles:
1919
<<: *OrdererDefaults
2020
Organizations:
2121
- *OrdererOrg
22-
Application:
23-
<<: *ApplicationDefaults
24-
Organizations:
25-
- *Org1
2622
Consortiums:
2723
SampleConsortium:
2824
Organizations:

sampleconfig/configtx.yaml

-8
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ Profiles:
2323
SampleInsecureSolo:
2424
Orderer:
2525
<<: *OrdererDefaults
26-
Application:
27-
<<: *ApplicationDefaults
2826
Consortiums:
2927
SampleConsortium:
3028
Organizations:
@@ -35,8 +33,6 @@ Profiles:
3533
Orderer:
3634
<<: *OrdererDefaults
3735
OrdererType: kafka
38-
Application:
39-
<<: *ApplicationDefaults
4036
Consortiums:
4137
SampleConsortium:
4238
Organizations:
@@ -49,10 +45,6 @@ Profiles:
4945
<<: *OrdererDefaults
5046
Organizations:
5147
- *SampleOrg
52-
Application:
53-
<<: *ApplicationDefaults
54-
Organizations:
55-
- *SampleOrg
5648
Consortiums:
5749
SampleConsortium:
5850
Organizations:

test/feature/configs/configtx.yaml

-8
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ Profiles:
2323
SampleInsecureSolo:
2424
Orderer:
2525
<<: *OrdererDefaults
26-
Application:
27-
<<: *ApplicationDefaults
2826
Consortiums:
2927
SampleConsortium:
3028
Organizations:
@@ -35,8 +33,6 @@ Profiles:
3533
Orderer:
3634
<<: *OrdererDefaults
3735
OrdererType: kafka
38-
Application:
39-
<<: *ApplicationDefaults
4036
Consortiums:
4137
SampleConsortium:
4238
Organizations:
@@ -49,10 +45,6 @@ Profiles:
4945
<<: *OrdererDefaults
5046
Organizations:
5147
- *SampleOrg
52-
Application:
53-
<<: *ApplicationDefaults
54-
Organizations:
55-
- *SampleOrg
5648
Consortiums:
5749
SampleConsortium:
5850
Organizations:

0 commit comments

Comments
 (0)