From 40cfff3ca2d7cc6d622ce46e02071503bb9c53cc Mon Sep 17 00:00:00 2001 From: Jason Yellick Date: Thu, 9 Feb 2017 14:37:48 -0500 Subject: [PATCH] [FAB-2155] Split orderer config local and genesis https://jira.hyperledger.org/browse/FAB-2155 The orderer is currently capable of generating its genesis material based on configuration. This function is needed in the common components in order to deprecate the static templating that exists today. Change-Id: Ida60c158eabce3491b25350ee50d5863b5934820 Signed-off-by: Jason Yellick --- Makefile | 4 +- images/orderer/Dockerfile.in | 1 + images/testenv/Dockerfile.in | 1 + .../bootstrap/provisional/provisional.go | 20 +-- .../bootstrap/provisional/provisional_test.go | 16 +- orderer/common/deliver/deliver_test.go | 2 +- orderer/genesis.yaml | 42 +++++ orderer/kafka/config_test.go | 17 -- orderer/ledger/file/fileledger_test.go | 2 +- orderer/ledger/fileledger_test.go | 2 +- orderer/ledger/ram/ramledger_test.go | 2 +- orderer/localconfig/config.go | 149 ++++++++++++++---- orderer/main.go | 6 +- orderer/multichain/manager_test.go | 30 ++-- orderer/network_test.go | 6 +- orderer/orderer.yaml | 29 +--- .../sample_clients/broadcast_config/client.go | 4 +- .../broadcast_config/newchain.go | 4 +- orderer/sbft_test.go | 7 +- 19 files changed, 227 insertions(+), 117 deletions(-) create mode 100644 orderer/genesis.yaml diff --git a/Makefile b/Makefile index 6bd26c25b0a..0281c894e7d 100644 --- a/Makefile +++ b/Makefile @@ -179,10 +179,12 @@ build/image/peer/payload: build/docker/bin/peer \ build/genesis-sampleconfig.tar.bz2 build/image/orderer/payload: build/docker/bin/orderer \ build/msp-sampleconfig.tar.bz2 \ - orderer/orderer.yaml + orderer/orderer.yaml \ + orderer/genesis.yaml build/image/testenv/payload: build/gotools.tar.bz2 \ build/docker/bin/orderer \ orderer/orderer.yaml \ + orderer/genesis.yaml \ build/docker/bin/peer \ peer/core.yaml \ build/msp-sampleconfig.tar.bz2 \ diff --git a/images/orderer/Dockerfile.in b/images/orderer/Dockerfile.in index 4876843bccf..dda6136a703 100644 --- a/images/orderer/Dockerfile.in +++ b/images/orderer/Dockerfile.in @@ -4,5 +4,6 @@ RUN mkdir -p /var/hyperledger/production /etc/hyperledger/fabric/orderer COPY payload/orderer /usr/local/bin ADD payload/msp-sampleconfig.tar.bz2 $ORDERER_CFG_PATH/../ COPY payload/orderer.yaml $ORDERER_CFG_PATH/ +COPY payload/genesis.yaml $ORDERER_CFG_PATH/ EXPOSE 7050 CMD orderer diff --git a/images/testenv/Dockerfile.in b/images/testenv/Dockerfile.in index 5ff67ea75c6..4d527dd23e3 100644 --- a/images/testenv/Dockerfile.in +++ b/images/testenv/Dockerfile.in @@ -15,6 +15,7 @@ ADD payload/gotools.tar.bz2 /usr/local/bin/ # fabric configuration files COPY payload/orderer.yaml $ORDERER_CFG_PATH +COPY payload/genesis.yaml $ORDERER_CFG_PATH COPY payload/core.yaml $PEER_CFG_PATH ADD payload/msp-sampleconfig.tar.bz2 $PEER_CFG_PATH diff --git a/orderer/common/bootstrap/provisional/provisional.go b/orderer/common/bootstrap/provisional/provisional.go index 611376ee692..31b2ec6bcd3 100644 --- a/orderer/common/bootstrap/provisional/provisional.go +++ b/orderer/common/bootstrap/provisional/provisional.go @@ -65,22 +65,22 @@ type bootstrapper struct { } // New returns a new provisional bootstrap helper. -func New(conf *config.TopLevel) Generator { +func New(conf *config.GenesisTopLevel) Generator { bs := &bootstrapper{ minimalGroups: []*cb.ConfigGroup{ // Chain Config Types configtxchannel.DefaultHashingAlgorithm(), configtxchannel.DefaultBlockDataHashingStructure(), - configtxchannel.TemplateOrdererAddresses([]string{fmt.Sprintf("%s:%d", conf.General.ListenAddress, conf.General.ListenPort)}), + configtxchannel.TemplateOrdererAddresses(conf.Orderer.Addresses), // Orderer Config Types - configtxorderer.TemplateConsensusType(conf.Genesis.OrdererType), + configtxorderer.TemplateConsensusType(conf.Orderer.OrdererType), configtxorderer.TemplateBatchSize(&ab.BatchSize{ - MaxMessageCount: conf.Genesis.BatchSize.MaxMessageCount, - AbsoluteMaxBytes: conf.Genesis.BatchSize.AbsoluteMaxBytes, - PreferredMaxBytes: conf.Genesis.BatchSize.PreferredMaxBytes, + MaxMessageCount: conf.Orderer.BatchSize.MaxMessageCount, + AbsoluteMaxBytes: conf.Orderer.BatchSize.AbsoluteMaxBytes, + PreferredMaxBytes: conf.Orderer.BatchSize.PreferredMaxBytes, }), - configtxorderer.TemplateBatchTimeout(conf.Genesis.BatchTimeout.String()), + configtxorderer.TemplateBatchTimeout(conf.Orderer.BatchTimeout.String()), configtxorderer.TemplateIngressPolicyNames([]string{AcceptAllPolicyKey}), configtxorderer.TemplateEgressPolicyNames([]string{AcceptAllPolicyKey}), @@ -94,12 +94,12 @@ func New(conf *config.TopLevel) Generator { }, } - switch conf.Genesis.OrdererType { + switch conf.Orderer.OrdererType { case ConsensusTypeSolo, ConsensusTypeSbft: case ConsensusTypeKafka: - bs.minimalGroups = append(bs.minimalGroups, configtxorderer.TemplateKafkaBrokers(conf.Kafka.Brokers)) + bs.minimalGroups = append(bs.minimalGroups, configtxorderer.TemplateKafkaBrokers(conf.Orderer.Kafka.Brokers)) default: - panic(fmt.Errorf("Wrong consenter type value given: %s", conf.Genesis.OrdererType)) + panic(fmt.Errorf("Wrong consenter type value given: %s", conf.Orderer.OrdererType)) } return bs diff --git a/orderer/common/bootstrap/provisional/provisional_test.go b/orderer/common/bootstrap/provisional/provisional_test.go index 65b34903ff3..296c2b56ff3 100644 --- a/orderer/common/bootstrap/provisional/provisional_test.go +++ b/orderer/common/bootstrap/provisional/provisional_test.go @@ -24,14 +24,14 @@ import ( cb "github.com/hyperledger/fabric/protos/common" ) -var confSolo, confKafka *config.TopLevel -var testCases []*config.TopLevel +var confSolo, confKafka *config.GenesisTopLevel +var testCases []*config.GenesisTopLevel func init() { - confSolo = config.Load() - confKafka = config.Load() - confKafka.Genesis.OrdererType = ConsensusTypeKafka - testCases = []*config.TopLevel{confSolo, confKafka} + confSolo = config.LoadGenesis() + confKafka = config.LoadGenesis() + confKafka.Orderer.OrdererType = ConsensusTypeKafka + testCases = []*config.GenesisTopLevel{confSolo, confKafka} } func TestGenesisBlockHeader(t *testing.T) { @@ -40,10 +40,10 @@ func TestGenesisBlockHeader(t *testing.T) { for _, tc := range testCases { genesisBlock := New(tc).GenesisBlock() if genesisBlock.Header.Number != expectedHeaderNumber { - t.Fatalf("Case %s: Expected header number %d, got %d", tc.Genesis.OrdererType, expectedHeaderNumber, genesisBlock.Header.Number) + t.Fatalf("Case %s: Expected header number %d, got %d", tc.Orderer.OrdererType, expectedHeaderNumber, genesisBlock.Header.Number) } if !bytes.Equal(genesisBlock.Header.PreviousHash, nil) { - t.Fatalf("Case %s: Expected header previousHash to be nil, got %x", tc.Genesis.OrdererType, genesisBlock.Header.PreviousHash) + t.Fatalf("Case %s: Expected header previousHash to be nil, got %x", tc.Orderer.OrdererType, genesisBlock.Header.PreviousHash) } } } diff --git a/orderer/common/deliver/deliver_test.go b/orderer/common/deliver/deliver_test.go index 0827378b1d3..44a0b7a520e 100644 --- a/orderer/common/deliver/deliver_test.go +++ b/orderer/common/deliver/deliver_test.go @@ -44,7 +44,7 @@ const ledgerSize = 10 func init() { logging.SetLevel(logging.DEBUG, "") - genesisBlock = provisional.New(config.Load()).GenesisBlock() + genesisBlock = provisional.New(config.LoadGenesis()).GenesisBlock() } type mockD struct { diff --git a/orderer/genesis.yaml b/orderer/genesis.yaml new file mode 100644 index 00000000000..1f627afdbe7 --- /dev/null +++ b/orderer/genesis.yaml @@ -0,0 +1,42 @@ +--- +################################################################################ +# +# SECTION: Orderer +# +# - This section defines the values to encode into a config transaction or +# genesis block for orderer related parameters +# +################################################################################ +Orderer: + + # Orderer Type: The orderer implementation to start + # Available types are "solo" and "kafka" + OrdererType: solo + + Addresses: + - 127.0.0.1:7050 + + # Batch Timeout: The amount of time to wait before creating a batch + BatchTimeout: 10s + + # Batch Size: Controls the number of messages batched into a block + BatchSize: + + # Max Message Count: The maximum number of messages to permit in a batch + MaxMessageCount: 10 + + # Absolute Max Bytes: The absolute maximum number of bytes allowed for + # the serialized messages in a batch. + AbsoluteMaxBytes: 99 MB + + # Preferred Max Bytes: The preferred maximum number of bytes allowed for + # the serialized messages in a batch. A message larger than the preferred + # max bytes will result in a batch larger than preferred max bytes. + PreferredMaxBytes: 512 KB + + Kafka: + # Brokers: A list of Kafka brokers to which the orderer connects + # NOTE: Use IP:port notation + Brokers: + - 127.0.0.1:9092 + diff --git a/orderer/kafka/config_test.go b/orderer/kafka/config_test.go index b3367d04fa0..9cb51f2206f 100644 --- a/orderer/kafka/config_test.go +++ b/orderer/kafka/config_test.go @@ -38,14 +38,6 @@ var ( ) var testConf = &config.TopLevel{ - General: config.General{ - LedgerType: "ram", - QueueSize: 100, - MaxWindowSize: 100, - ListenAddress: "127.0.0.1", - ListenPort: 7050, - GenesisMethod: "provisional", - }, Kafka: config.Kafka{ Brokers: []string{"127.0.0.1:9092"}, Retry: config.Retry{ @@ -55,15 +47,6 @@ var testConf = &config.TopLevel{ Verbose: false, Version: sarama.V0_9_0_1, }, - Genesis: config.Genesis{ - OrdererType: "kafka", - BatchTimeout: 500 * time.Millisecond, - BatchSize: config.BatchSize{ - MaxMessageCount: 100, - AbsoluteMaxBytes: 10 * 1024 * 1024, - PreferredMaxBytes: 512 * 1024, - }, - }, } func testClose(t *testing.T, x Closeable) { diff --git a/orderer/ledger/file/fileledger_test.go b/orderer/ledger/file/fileledger_test.go index b17bd992694..1558b6f2ef1 100644 --- a/orderer/ledger/file/fileledger_test.go +++ b/orderer/ledger/file/fileledger_test.go @@ -35,7 +35,7 @@ var genesisBlock *cb.Block func init() { logging.SetLevel(logging.DEBUG, "") - genesisBlock = provisional.New(config.Load()).GenesisBlock() + genesisBlock = provisional.New(config.LoadGenesis()).GenesisBlock() } type testEnv struct { diff --git a/orderer/ledger/fileledger_test.go b/orderer/ledger/fileledger_test.go index 377921d6eb7..a9f33a91459 100644 --- a/orderer/ledger/fileledger_test.go +++ b/orderer/ledger/fileledger_test.go @@ -30,7 +30,7 @@ import ( var genesisBlock *cb.Block func init() { - genesisBlock = provisional.New(config.Load()).GenesisBlock() + genesisBlock = provisional.New(config.LoadGenesis()).GenesisBlock() testables = append(testables, &fileLedgerTestEnv{}) } diff --git a/orderer/ledger/ram/ramledger_test.go b/orderer/ledger/ram/ramledger_test.go index 54d27e9a290..60e64619eca 100644 --- a/orderer/ledger/ram/ramledger_test.go +++ b/orderer/ledger/ram/ramledger_test.go @@ -30,7 +30,7 @@ var genesisBlock *cb.Block func init() { logging.SetLevel(logging.DEBUG, "") - genesisBlock = provisional.New(config.Load()).GenesisBlock() + genesisBlock = provisional.New(config.LoadGenesis()).GenesisBlock() } func NewTestChain(maxSize int) *ramLedger { diff --git a/orderer/localconfig/config.go b/orderer/localconfig/config.go index 4841bccc0d7..ca50d375052 100644 --- a/orderer/localconfig/config.go +++ b/orderer/localconfig/config.go @@ -62,12 +62,28 @@ type TLS struct { ClientRootCAs []string } -// Genesis contains config which is used by the provisional bootstrapper +// Genesis is a deprecated structure which was used to put +// values into the genesis block, but this is now handled elsewhere +// SBFT did not reference these values via the genesis block however +// so it is being left here for backwards compatibility purposes type Genesis struct { + DeprecatedBatchTimeout time.Duration + DeprecatedBatchSize uint32 + SbftShared SbftShared +} + +// GenesisTopLevel contains the genesis structures for use by the provisional bootstrapper +type GenesisTopLevel struct { + Orderer Orderer +} + +// Orderer contains config which is used for orderer genesis by the provisional bootstrapper +type Orderer struct { OrdererType string + Addresses []string BatchTimeout time.Duration BatchSize BatchSize - SbftShared SbftShared + Kafka Kafka } // BatchSize contains configuration affecting the size of batches @@ -96,7 +112,7 @@ type FileLedger struct { // Kafka contains config for the Kafka orderer type Kafka struct { - Brokers []string // TODO This should be deprecated and this information should be stored in the config block + Brokers []string // TODO This should be removed when the genesis config moves Retry Retry Verbose bool Version sarama.KafkaVersion @@ -125,6 +141,11 @@ type Retry struct { Stop time.Duration } +type RuntimeAndGenesis struct { + runtime *TopLevel + genesis *Genesis +} + // TopLevel directly corresponds to the orderer config yaml // Note, for non 1-1 mappings, you may append // something like `mapstructure:"weirdFoRMat"` to @@ -175,13 +196,6 @@ var defaults = TopLevel{ }, }, Genesis: Genesis{ - OrdererType: "solo", - BatchTimeout: 10 * time.Second, - BatchSize: BatchSize{ - MaxMessageCount: 10, - AbsoluteMaxBytes: 100000000, - PreferredMaxBytes: 512 * 1024, - }, SbftShared: SbftShared{ N: 1, F: 0, @@ -242,30 +256,12 @@ func (c *TopLevel) completeInitialization() { case c.FileLedger.Prefix == "": logger.Infof("FileLedger.Prefix unset, setting to %s", defaults.FileLedger.Prefix) c.FileLedger.Prefix = defaults.FileLedger.Prefix - case c.Kafka.Brokers == nil: - logger.Infof("Kafka.Brokers unset, setting to %v", defaults.Kafka.Brokers) - c.Kafka.Brokers = defaults.Kafka.Brokers case c.Kafka.Retry.Period == 0*time.Second: logger.Infof("Kafka.Retry.Period unset, setting to %v", defaults.Kafka.Retry.Period) c.Kafka.Retry.Period = defaults.Kafka.Retry.Period case c.Kafka.Retry.Stop == 0*time.Second: logger.Infof("Kafka.Retry.Stop unset, setting to %v", defaults.Kafka.Retry.Stop) c.Kafka.Retry.Stop = defaults.Kafka.Retry.Stop - case c.Genesis.OrdererType == "": - logger.Infof("Genesis.OrdererType unset, setting to %s", defaults.Genesis.OrdererType) - c.Genesis.OrdererType = defaults.Genesis.OrdererType - case c.Genesis.BatchTimeout == 0: - logger.Infof("Genesis.BatchTimeout unset, setting to %s", defaults.Genesis.BatchTimeout) - c.Genesis.BatchTimeout = defaults.Genesis.BatchTimeout - case c.Genesis.BatchSize.MaxMessageCount == 0: - logger.Infof("Genesis.BatchSize.MaxMessageCount unset, setting to %s", defaults.Genesis.BatchSize.MaxMessageCount) - c.Genesis.BatchSize.MaxMessageCount = defaults.Genesis.BatchSize.MaxMessageCount - case c.Genesis.BatchSize.AbsoluteMaxBytes == 0: - logger.Infof("Genesis.BatchSize.AbsoluteMaxBytes unset, setting to %s", defaults.Genesis.BatchSize.AbsoluteMaxBytes) - c.Genesis.BatchSize.AbsoluteMaxBytes = defaults.Genesis.BatchSize.AbsoluteMaxBytes - case c.Genesis.BatchSize.PreferredMaxBytes == 0: - logger.Infof("Genesis.BatchSize.PreferredMaxBytes unset, setting to %s", defaults.Genesis.BatchSize.PreferredMaxBytes) - c.Genesis.BatchSize.PreferredMaxBytes = defaults.Genesis.BatchSize.PreferredMaxBytes default: // A bit hacky, but its type makes it impossible to test for a nil value. // This may be overwritten by the Kafka orderer upon instantiation. @@ -275,6 +271,103 @@ func (c *TopLevel) completeInitialization() { } } +var genesisDefaults = GenesisTopLevel{ + Orderer: Orderer{ + OrdererType: "solo", + Addresses: []string{"127.0.0.1:7050"}, + BatchTimeout: 10 * time.Second, + BatchSize: BatchSize{ + MaxMessageCount: 10, + AbsoluteMaxBytes: 100000000, + PreferredMaxBytes: 512 * 1024, + }, + Kafka: Kafka{ + Brokers: []string{"127.0.0.1:9092"}, + }, + }, +} + +func (g *GenesisTopLevel) completeInitialization() { + for { + switch { + case g.Orderer.OrdererType == "": + logger.Infof("Orderer.OrdererType unset, setting to %s", genesisDefaults.Orderer.OrdererType) + g.Orderer.OrdererType = genesisDefaults.Orderer.OrdererType + case g.Orderer.Addresses == nil: + logger.Infof("Orderer.Addresses unset, setting to %s", genesisDefaults.Orderer.Addresses) + g.Orderer.Addresses = genesisDefaults.Orderer.Addresses + case g.Orderer.BatchTimeout == 0: + logger.Infof("Orderer.BatchTimeout unset, setting to %s", genesisDefaults.Orderer.BatchTimeout) + g.Orderer.BatchTimeout = genesisDefaults.Orderer.BatchTimeout + case g.Orderer.BatchTimeout == 0: + logger.Infof("Orderer.BatchTimeout unset, setting to %s", genesisDefaults.Orderer.BatchTimeout) + g.Orderer.BatchTimeout = genesisDefaults.Orderer.BatchTimeout + case g.Orderer.BatchSize.MaxMessageCount == 0: + logger.Infof("Orderer.BatchSize.MaxMessageCount unset, setting to %s", genesisDefaults.Orderer.BatchSize.MaxMessageCount) + g.Orderer.BatchSize.MaxMessageCount = genesisDefaults.Orderer.BatchSize.MaxMessageCount + case g.Orderer.BatchSize.AbsoluteMaxBytes == 0: + logger.Infof("Orderer.BatchSize.AbsoluteMaxBytes unset, setting to %s", genesisDefaults.Orderer.BatchSize.AbsoluteMaxBytes) + g.Orderer.BatchSize.AbsoluteMaxBytes = genesisDefaults.Orderer.BatchSize.AbsoluteMaxBytes + case g.Orderer.BatchSize.PreferredMaxBytes == 0: + logger.Infof("Orderer.BatchSize.PreferredMaxBytes unset, setting to %s", genesisDefaults.Orderer.BatchSize.PreferredMaxBytes) + g.Orderer.BatchSize.PreferredMaxBytes = genesisDefaults.Orderer.BatchSize.PreferredMaxBytes + case g.Orderer.Kafka.Brokers == nil: + logger.Infof("Orderer.Kafka.Brokers unset, setting to %v", genesisDefaults.Orderer.Kafka.Brokers) + g.Orderer.Kafka.Brokers = genesisDefaults.Orderer.Kafka.Brokers + default: + return + } + } +} + +func LoadGenesis() *GenesisTopLevel { + config := viper.New() + + const prefix = "GENESIS" + + config.SetConfigName("genesis") + cfgPath := os.Getenv("ORDERER_CFG_PATH") + if cfgPath == "" { + logger.Infof("No orderer cfg path set, assuming development environment, deriving from go path") + // Path to look for the config file in based on GOPATH + gopath := os.Getenv("GOPATH") + for _, p := range filepath.SplitList(gopath) { + ordererPath := filepath.Join(p, "src/github.com/hyperledger/fabric/orderer/") + if _, err := os.Stat(filepath.Join(ordererPath, "genesis.yaml")); err != nil { + // The yaml file does not exist in this component of the go src + continue + } + cfgPath = ordererPath + } + if cfgPath == "" { + logger.Fatalf("Could not find orderer.yaml, try setting ORDERER_CFG_PATH or GOPATH correctly") + } + } + config.AddConfigPath(cfgPath) // Path to look for the config file in + + // for environment variables + config.SetEnvPrefix(prefix) + config.AutomaticEnv() + replacer := strings.NewReplacer(".", "_") + config.SetEnvKeyReplacer(replacer) + + err := config.ReadInConfig() + if err != nil { + panic(fmt.Errorf("Error reading %s plugin config: %s", prefix, err)) + } + + var uconf GenesisTopLevel + + err = ExactWithDateUnmarshal(config, &uconf) + if err != nil { + panic(fmt.Errorf("Error unmarshaling into structure: %s", err)) + } + + uconf.completeInitialization() + + return &uconf +} + // Load parses the orderer.yaml file and environment, producing a struct suitable for config use func Load() *TopLevel { config := viper.New() diff --git a/orderer/main.go b/orderer/main.go index b44245d8636..d25c2318550 100644 --- a/orderer/main.go +++ b/orderer/main.go @@ -114,7 +114,7 @@ func main() { // Select the bootstrapping mechanism switch conf.General.GenesisMethod { case "provisional": - genesisBlock = provisional.New(conf).GenesisBlock() + genesisBlock = provisional.New(config.LoadGenesis()).GenesisBlock() case "file": genesisBlock = file.New(conf.General.GenesisFile).GenesisBlock() default: @@ -165,8 +165,8 @@ func main() { func makeSbftConsensusConfig(conf *config.TopLevel) *sbft.ConsensusConfig { cfg := simplebft.Config{N: conf.Genesis.SbftShared.N, F: conf.Genesis.SbftShared.F, - BatchDurationNsec: uint64(conf.Genesis.BatchTimeout), - BatchSizeBytes: uint64(conf.Genesis.BatchSize.AbsoluteMaxBytes), + BatchDurationNsec: uint64(conf.Genesis.DeprecatedBatchTimeout), + BatchSizeBytes: uint64(conf.Genesis.DeprecatedBatchSize), RequestTimeoutNsec: conf.Genesis.SbftShared.RequestTimeoutNsec} peers := make(map[string][]byte) for addr, cert := range conf.Genesis.SbftShared.Peers { diff --git a/orderer/multichain/manager_test.go b/orderer/multichain/manager_test.go index 14c6f14fc6a..2d2a9e326a0 100644 --- a/orderer/multichain/manager_test.go +++ b/orderer/multichain/manager_test.go @@ -35,11 +35,11 @@ import ( "github.com/stretchr/testify/assert" ) -var conf *config.TopLevel +var conf *config.GenesisTopLevel var genesisBlock *cb.Block func init() { - conf = config.Load() + conf = config.LoadGenesis() logging.SetLevel(logging.DEBUG, "") genesisBlock = provisional.New(conf).GenesisBlock() } @@ -127,7 +127,7 @@ func TestNoSystemChain(t *testing.T) { lf := ramledger.New(10) consenters := make(map[string]Consenter) - consenters[conf.Genesis.OrdererType] = &mockConsenter{} + consenters[conf.Orderer.OrdererType] = &mockConsenter{} NewManagerImpl(lf, consenters, &mockCryptoHelper{}) } @@ -137,7 +137,7 @@ func TestManagerImpl(t *testing.T) { lf, rl := NewRAMLedgerAndFactory(10) consenters := make(map[string]Consenter) - consenters[conf.Genesis.OrdererType] = &mockConsenter{} + consenters[conf.Orderer.OrdererType] = &mockConsenter{} manager := NewManagerImpl(lf, consenters, &mockCryptoHelper{}) @@ -152,8 +152,8 @@ func TestManagerImpl(t *testing.T) { t.Fatalf("Should have gotten chain which was initialized by ramledger") } - messages := make([]*cb.Envelope, conf.Genesis.BatchSize.MaxMessageCount) - for i := 0; i < int(conf.Genesis.BatchSize.MaxMessageCount); i++ { + messages := make([]*cb.Envelope, conf.Orderer.BatchSize.MaxMessageCount) + for i := 0; i < int(conf.Orderer.BatchSize.MaxMessageCount); i++ { messages[i] = makeNormalTx(provisional.TestChainID, i) } @@ -168,7 +168,7 @@ func TestManagerImpl(t *testing.T) { if status != cb.Status_SUCCESS { t.Fatalf("Could not retrieve block") } - for i := 0; i < int(conf.Genesis.BatchSize.MaxMessageCount); i++ { + for i := 0; i < int(conf.Orderer.BatchSize.MaxMessageCount); i++ { if !reflect.DeepEqual(utils.ExtractEnvelopeOrPanic(block, i), messages[i]) { t.Errorf("Block contents wrong at index %d", i) } @@ -183,7 +183,7 @@ func TestSignatureFilter(t *testing.T) { lf, rl := NewRAMLedgerAndFactory(10) consenters := make(map[string]Consenter) - consenters[conf.Genesis.OrdererType] = &mockConsenter{} + consenters[conf.Orderer.OrdererType] = &mockConsenter{} manager := NewManagerImpl(lf, consenters, &mockCryptoHelper{}) @@ -193,8 +193,8 @@ func TestSignatureFilter(t *testing.T) { t.Fatalf("Should have gotten chain which was initialized by ramledger") } - messages := make([]*cb.Envelope, conf.Genesis.BatchSize.MaxMessageCount) - for i := 0; i < int(conf.Genesis.BatchSize.MaxMessageCount); i++ { + messages := make([]*cb.Envelope, conf.Orderer.BatchSize.MaxMessageCount) + for i := 0; i < int(conf.Orderer.BatchSize.MaxMessageCount); i++ { messages[i] = makeSignaturelessTx(provisional.TestChainID, i) } @@ -217,11 +217,11 @@ func TestSignatureFilter(t *testing.T) { // This test brings up the entire system, with the mock consenter, including the broadcasters etc. and creates a new chain func TestNewChain(t *testing.T) { - conf := config.Load() + conf := config.LoadGenesis() lf, rl := NewRAMLedgerAndFactory(10) consenters := make(map[string]Consenter) - consenters[conf.Genesis.OrdererType] = &mockConsenter{} + consenters[conf.Orderer.OrdererType] = &mockConsenter{} manager := NewManagerImpl(lf, consenters, &mockCryptoHelper{}) @@ -267,8 +267,8 @@ func TestNewChain(t *testing.T) { t.Fatalf("Should have gotten new chain which was created") } - messages := make([]*cb.Envelope, conf.Genesis.BatchSize.MaxMessageCount) - for i := 0; i < int(conf.Genesis.BatchSize.MaxMessageCount); i++ { + messages := make([]*cb.Envelope, conf.Orderer.BatchSize.MaxMessageCount) + for i := 0; i < int(conf.Orderer.BatchSize.MaxMessageCount); i++ { messages[i] = makeNormalTx(newChainID, i) } @@ -300,7 +300,7 @@ func TestNewChain(t *testing.T) { if status != cb.Status_SUCCESS { t.Fatalf("Could not retrieve block on new chain") } - for i := 0; i < int(conf.Genesis.BatchSize.MaxMessageCount); i++ { + for i := 0; i < int(conf.Orderer.BatchSize.MaxMessageCount); i++ { if !reflect.DeepEqual(utils.ExtractEnvelopeOrPanic(block, i), messages[i]) { t.Errorf("Block contents wrong at index %d in new chain", i) } diff --git a/orderer/network_test.go b/orderer/network_test.go index 7ccad154c38..bcfd5c21283 100644 --- a/orderer/network_test.go +++ b/orderer/network_test.go @@ -306,9 +306,9 @@ func generateConfigEnv(peerNum uint64, grpcPort int, peerCommPort string, certFi envs := []string{} envs = append(envs, fmt.Sprintf("ORDERER_CFG_PATH=%s", ordererDir)) envs = append(envs, fmt.Sprintf("ORDERER_GENERAL_LISTENPORT=%d", grpcPort)) - envs = append(envs, fmt.Sprintf("ORDERER_GENESIS_ORDERERTYPE=%s", "sbft")) - envs = append(envs, fmt.Sprintf("ORDERER_GENESIS_BATCHTIMEOUT=%d", 1000)) - envs = append(envs, fmt.Sprintf("ORDERER_GENESIS_BATCHSIZE_ABSOLUTEMAXBYTES=%d", 1000000000)) + envs = append(envs, fmt.Sprintf("GENESIS_ORDERER_ORDERERTYPE=%s", "sbft")) + envs = append(envs, fmt.Sprintf("ORDERER_GENESIS_DEPRECATEDBATCHTIMEOUT=%d", 1000)) + envs = append(envs, fmt.Sprintf("ORDERER_GENESIS_DEPRECATED=%d", 1000000000)) envs = append(envs, fmt.Sprintf("ORDERER_GENESIS_SBFTSHARED_REQUESTTIMEOUTNSEC=%d", 1000000000)) envs = append(envs, fmt.Sprintf("ORDERER_GENESIS_SBFTSHARED_N=%d", peerNum)) envs = append(envs, fmt.Sprintf("ORDERER_GENESIS_SBFTSHARED_F=%d", (peerNum-1)/3)) diff --git a/orderer/orderer.yaml b/orderer/orderer.yaml index 2db34accf9a..b3907b68be0 100644 --- a/orderer/orderer.yaml +++ b/orderer/orderer.yaml @@ -153,32 +153,17 @@ SbftLocal: # # SECTION: Genesis # -# - This section applies to the configuration for the provisional bootstrapper +# - This section is pending removal but is left to support Sbft +# to be migrated to genesis.yaml # ################################################################################ Genesis: + # Deprecated Batch Timeout: The amount of time to wait before creating a batch + DeprecatedBatchTimeout: 10s - # Orderer Type: The orderer implementation to start - # Available types are "solo" and "kafka" - OrdererType: solo - - # Batch Timeout: The amount of time to wait before creating a batch - BatchTimeout: 10s - - # Batch Size: Controls the number of messages batched into a block - BatchSize: - - # Max Message Count: The maximum number of messages to permit in a batch - MaxMessageCount: 10 - - # Absolute Max Bytes: The absolute maximum number of bytes allowed for - # the serialized messages in a batch. - AbsoluteMaxBytes: 99 MB - - # Preferred Max Bytes: The preferred maximum number of bytes allowed for - # the serialized messages in a batch. A message larger than the preferred - # max bytes will result in a batch larger than preferred max bytes. - PreferredMaxBytes: 512 KB + # DeprecatedBatchSize: The absolute maximum number of bytes allowed for + # the serialized messages in a batch. + DeprecatedBatchSize: 99 MB # Defines the SBFT parameters when 'sbft' is specified as the 'OrdererType' SbftShared: diff --git a/orderer/sample_clients/broadcast_config/client.go b/orderer/sample_clients/broadcast_config/client.go index 96ddb70021f..3e8a039acb9 100644 --- a/orderer/sample_clients/broadcast_config/client.go +++ b/orderer/sample_clients/broadcast_config/client.go @@ -29,6 +29,7 @@ import ( ) var conf *config.TopLevel +var genConf *config.GenesisTopLevel type broadcastClient struct { ab.AtomicBroadcast_BroadcastClient @@ -67,6 +68,7 @@ type argsImpl struct { func init() { conf = config.Load() + genConf = config.LoadGenesis() } func main() { @@ -75,7 +77,7 @@ func main() { flag.StringVar(&srv, "server", fmt.Sprintf("%s:%d", conf.General.ListenAddress, conf.General.ListenPort), "The RPC server to connect to.") flag.StringVar(&cmd.name, "cmd", "newChain", "The action that this client is requesting via the config transaction.") - flag.StringVar(&cmd.args.consensusType, "consensusType", conf.Genesis.OrdererType, "In case of a newChain command, the type of consensus the ordering service is running on.") + flag.StringVar(&cmd.args.consensusType, "consensusType", genConf.Orderer.OrdererType, "In case of a newChain command, the type of consensus the ordering service is running on.") flag.StringVar(&cmd.args.creationPolicy, "creationPolicy", "AcceptAllPolicy", "In case of a newChain command, the chain creation policy this request should be validated against.") flag.StringVar(&cmd.args.chainID, "chainID", "NewChannelId", "In case of a newChain command, the chain ID to create.") flag.Parse() diff --git a/orderer/sample_clients/broadcast_config/newchain.go b/orderer/sample_clients/broadcast_config/newchain.go index b40004f4b37..e826d55cecf 100644 --- a/orderer/sample_clients/broadcast_config/newchain.go +++ b/orderer/sample_clients/broadcast_config/newchain.go @@ -24,8 +24,8 @@ import ( ) func newChainRequest(consensusType, creationPolicy, newChannelId string) *cb.Envelope { - conf.Genesis.OrdererType = consensusType - generator := provisional.New(conf) + genConf.Orderer.OrdererType = consensusType + generator := provisional.New(genConf) channelTemplate := generator.ChannelTemplate() signer, err := msp.NewNoopMsp().GetDefaultSigningIdentity() diff --git a/orderer/sbft_test.go b/orderer/sbft_test.go index dc4b7870278..d7946540f7f 100644 --- a/orderer/sbft_test.go +++ b/orderer/sbft_test.go @@ -99,9 +99,10 @@ func TestSbftPeer(t *testing.T) { // Start GRPC logger.Info("Creating a GRPC server.") conf := config.Load() - conf.Genesis.OrdererType = sbftName + genConf := config.LoadGenesis() + genConf.Orderer.OrdererType = sbftName conf.General.LocalMSPDir = pwd + "/../msp/sampleconfig" - lf := newRAMLedgerFactory(conf) + lf := newRAMLedgerFactory(genConf) consenters := make(map[string]multichain.Consenter) consenters[sbftName] = sbftConsenter @@ -261,7 +262,7 @@ func broadcastSender(t *testing.T, resultch chan item, errorch chan error, clien resultch <- item{itemtype: sent, payload: mpl} } -func newRAMLedgerFactory(conf *config.TopLevel) ordererledger.Factory { +func newRAMLedgerFactory(conf *config.GenesisTopLevel) ordererledger.Factory { rlf := ramledger.New(10) genesisBlock := provisional.New(conf).GenesisBlock() rl, err := rlf.GetOrCreate(provisional.TestChainID)