From c927b51d7c273f182af0154cbc6a3a9f070d9512 Mon Sep 17 00:00:00 2001 From: Jason Yellick Date: Wed, 3 Jan 2018 12:48:18 -0500 Subject: [PATCH] [FAB-7591] Remove LifecycleViaConfig capability The only remaining codepaths which used the lifecycle via config were the resources tree for ACL ones. As this is experiemental, have added this capability such that it can only be enabled in experimental builds. Change-Id: I84d6e5becabcd4397aff8f966bde83add266a30e Signed-off-by: Jason Yellick --- common/capabilities/application.go | 18 +++++++++++------- .../capabilities/application_experimental.go | 2 ++ common/capabilities/application_test.go | 2 -- common/channelconfig/api.go | 5 ++--- common/mocks/config/application.go | 6 +++--- common/tools/configtxgen/encoder/encoder.go | 2 +- .../tools/configtxgen/encoder/encoder_test.go | 2 ++ core/committer/txvalidator/validator_test.go | 2 +- core/common/validation/msgvalidation.go | 2 +- core/common/validation/resourceupdate_test.go | 2 +- core/peer/configtx_test.go | 3 ++- core/peer/configtx_util.go | 2 +- core/peer/peer.go | 2 +- sampleconfig/configtx.yaml | 13 ------------- 14 files changed, 28 insertions(+), 35 deletions(-) diff --git a/common/capabilities/application.go b/common/capabilities/application.go index 9c31da3130a..952986fab9b 100644 --- a/common/capabilities/application.go +++ b/common/capabilities/application.go @@ -16,15 +16,19 @@ const ( // ApplicationV1_1 is the capabilties string for standard new non-backwards compatible fabric v1.1 application capabilities. ApplicationV1_1 = "V1_1" - // ApplicationV1_1PvtDataExperimental is the capabilties string for private data using the experimental feature of collections/sideDB. + // ApplicationPvtDataExperimental is the capabilties string for private data using the experimental feature of collections/sideDB. ApplicationPvtDataExperimental = "V1_1_PVTDATA_EXPERIMENTAL" + + // ApplicationResourcesTreeExperimental is the capabilties string for private data using the experimental feature of collections/sideDB. + ApplicationResourcesTreeExperimental = "V1_1_RESOURCETREE_EXPERIMENTAL" ) // ApplicationProvider provides capabilities information for application level config. type ApplicationProvider struct { *registry - v11 bool - v11PvtDataExperimental bool + v11 bool + v11PvtDataExperimental bool + v11ResourcesTreeExperimental bool } // NewApplicationProvider creates a application capabilities provider. @@ -33,6 +37,7 @@ func NewApplicationProvider(capabilities map[string]*cb.Capability) *Application ap.registry = newRegistry(ap, capabilities) _, ap.v11 = capabilities[ApplicationV1_1] _, ap.v11PvtDataExperimental = capabilities[ApplicationPvtDataExperimental] + _, ap.v11ResourcesTreeExperimental = capabilities[ApplicationResourcesTreeExperimental] return ap } @@ -41,10 +46,9 @@ func (ap *ApplicationProvider) Type() string { return applicationTypeName } -// LifecycleViaConfig returns true if chaincode lifecycle should be managed via the resources config -// tree rather than via the deprecated v1.0 endorser tx mechanism. -func (ap *ApplicationProvider) LifecycleViaConfig() bool { - return ap.v11 +// ResourcesTree returns whether the experimental resources tree transaction processing should be enabled. +func (ap *ApplicationProvider) ResourcesTree() bool { + return ap.v11ResourcesTreeExperimental } // ForbidDuplicateTXIdInBlock specifies whether two transactions with the same TXId are permitted diff --git a/common/capabilities/application_experimental.go b/common/capabilities/application_experimental.go index 9eb63ad93cb..282b0efcfeb 100644 --- a/common/capabilities/application_experimental.go +++ b/common/capabilities/application_experimental.go @@ -16,6 +16,8 @@ func (ap *ApplicationProvider) HasCapability(capability string) bool { return true case ApplicationPvtDataExperimental: return true + case ApplicationResourcesTreeExperimental: + return true default: return false } diff --git a/common/capabilities/application_test.go b/common/capabilities/application_test.go index 850951bfaf5..d5c97f87028 100644 --- a/common/capabilities/application_test.go +++ b/common/capabilities/application_test.go @@ -17,7 +17,6 @@ import ( func TestApplicationV10(t *testing.T) { op := NewApplicationProvider(map[string]*cb.Capability{}) assert.NoError(t, op.Supported()) - assert.False(t, op.LifecycleViaConfig()) } func TestApplicationV11(t *testing.T) { @@ -25,7 +24,6 @@ func TestApplicationV11(t *testing.T) { ApplicationV1_1: &cb.Capability{}, }) assert.NoError(t, op.Supported()) - assert.True(t, op.LifecycleViaConfig()) assert.True(t, op.ForbidDuplicateTXIdInBlock()) assert.True(t, op.V1_1Validation()) } diff --git a/common/channelconfig/api.go b/common/channelconfig/api.go index bb42bef8c12..f58506b26b2 100644 --- a/common/channelconfig/api.go +++ b/common/channelconfig/api.go @@ -120,9 +120,8 @@ type ApplicationCapabilities interface { // in the same block or whether we mark the second one as TxValidationCode_DUPLICATE_TXID ForbidDuplicateTXIdInBlock() bool - // LifecycleViaConfig returns true if chaincode lifecycle should be managed via the resources config - // tree rather than via the deprecated v1.0 endorser tx mechanism. - LifecycleViaConfig() bool + // ResourcesTree returns true if the peer should process the experimental resources transactions + ResourcesTree() bool // PrivateChannelData returns true if support for private channel data (a.k.a. collections) is enabled. PrivateChannelData() bool diff --git a/common/mocks/config/application.go b/common/mocks/config/application.go index b2c77451d61..4f5b50adcdf 100644 --- a/common/mocks/config/application.go +++ b/common/mocks/config/application.go @@ -23,7 +23,7 @@ func (m *MockApplication) Capabilities() channelconfig.ApplicationCapabilities { type MockApplicationCapabilities struct { SupportedRv error ForbidDuplicateTXIdInBlockRv bool - LifecycleViaConfigRv bool + ResourcesTreeRv bool PrivateChannelDataRv bool V1_1ValidationRv bool } @@ -36,8 +36,8 @@ func (mac *MockApplicationCapabilities) ForbidDuplicateTXIdInBlock() bool { return mac.ForbidDuplicateTXIdInBlockRv } -func (mac *MockApplicationCapabilities) LifecycleViaConfig() bool { - return mac.LifecycleViaConfigRv +func (mac *MockApplicationCapabilities) ResourcesTree() bool { + return mac.ResourcesTreeRv } func (mac *MockApplicationCapabilities) PrivateChannelData() bool { diff --git a/common/tools/configtxgen/encoder/encoder.go b/common/tools/configtxgen/encoder/encoder.go index 55e7d675940..22511665373 100644 --- a/common/tools/configtxgen/encoder/encoder.go +++ b/common/tools/configtxgen/encoder/encoder.go @@ -369,7 +369,7 @@ func NewChannelCreateConfigUpdate(channelID string, orderingSystemChannelGroup * } // If this channel uses the new lifecycle config, specify the seed data - if agc.Capabilities().LifecycleViaConfig() { + if agc.Capabilities().ResourcesTree() { defaultModPolicy := policies.ChannelApplicationAdmins if conf.Application.Resources != nil { defaultModPolicy = conf.Application.Resources.DefaultModPolicy diff --git a/common/tools/configtxgen/encoder/encoder_test.go b/common/tools/configtxgen/encoder/encoder_test.go index 2dfbbd2dc43..06bf5d679d7 100644 --- a/common/tools/configtxgen/encoder/encoder_test.go +++ b/common/tools/configtxgen/encoder/encoder_test.go @@ -9,6 +9,7 @@ package encoder import ( "testing" + "github.com/hyperledger/fabric/common/capabilities" "github.com/hyperledger/fabric/common/channelconfig" "github.com/hyperledger/fabric/common/configtx" "github.com/hyperledger/fabric/common/flogging" @@ -101,6 +102,7 @@ func TestChannelCreateWithResources(t *testing.T) { t.Run("AtV1.1", func(t *testing.T) { createConfig := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelV11Profile) + createConfig.Application.Capabilities[capabilities.ApplicationResourcesTreeExperimental] = true configUpdate, err := NewChannelCreateConfigUpdate("channel.id", nil, createConfig) assert.NoError(t, err) diff --git a/core/committer/txvalidator/validator_test.go b/core/committer/txvalidator/validator_test.go index fb746f24417..88050c6ed37 100644 --- a/core/committer/txvalidator/validator_test.go +++ b/core/committer/txvalidator/validator_test.go @@ -688,7 +688,7 @@ func TestValidationResourceUpdate(t *testing.T) { }) err := validator.Validate(b1) assert.NoError(t, err) - sup.ACVal = &mockconfig.MockApplicationCapabilities{LifecycleViaConfigRv: true} + sup.ACVal = &mockconfig.MockApplicationCapabilities{ResourcesTreeRv: true} err = validator.Validate(b2) assert.NoError(t, err) // Restore default callback diff --git a/core/common/validation/msgvalidation.go b/core/common/validation/msgvalidation.go index 465ece8cd2c..70496f9abe0 100644 --- a/core/common/validation/msgvalidation.go +++ b/core/common/validation/msgvalidation.go @@ -423,7 +423,7 @@ func ValidateTransaction(e *common.Envelope, c channelconfig.ApplicationCapabili return payload, pb.TxValidationCode_VALID } case common.HeaderType_PEER_RESOURCE_UPDATE: - if !c.LifecycleViaConfig() { + if !c.ResourcesTree() { return nil, pb.TxValidationCode_UNSUPPORTED_TX_PAYLOAD } diff --git a/core/common/validation/resourceupdate_test.go b/core/common/validation/resourceupdate_test.go index 2934419a114..bc98f533cf7 100644 --- a/core/common/validation/resourceupdate_test.go +++ b/core/common/validation/resourceupdate_test.go @@ -37,6 +37,6 @@ func TestValidateResourceUpdateTx(t *testing.T) { updateResult.Signature, _ = signer.Sign(updateResult.Payload) _, txResult := ValidateTransaction(updateResult, &config.MockApplicationCapabilities{}) assert.Equal(t, txResult, peer.TxValidationCode_UNSUPPORTED_TX_PAYLOAD) - _, txResult = ValidateTransaction(updateResult, &config.MockApplicationCapabilities{LifecycleViaConfigRv: true}) + _, txResult = ValidateTransaction(updateResult, &config.MockApplicationCapabilities{ResourcesTreeRv: true}) assert.Equal(t, txResult, peer.TxValidationCode_VALID) } diff --git a/core/peer/configtx_test.go b/core/peer/configtx_test.go index 598c32e4e38..b40f8fafe41 100644 --- a/core/peer/configtx_test.go +++ b/core/peer/configtx_test.go @@ -209,6 +209,7 @@ func (h *testHelper) sampleChannelConfig(sequence uint64, enableV11Capability bo profile.Orderer.Capabilities[capabilities.ApplicationV1_1] = true profile.Application.Capabilities = make(map[string]bool) profile.Application.Capabilities[capabilities.ApplicationV1_1] = true + profile.Application.Capabilities[capabilities.ApplicationResourcesTreeExperimental] = true } channelGroup, _ := encoder.NewChannelGroup(profile) return &common.Config{ @@ -271,7 +272,7 @@ func (h *testHelper) constructResourceBundle(chainid string, ledger ledger.PeerL appConfig, capabilityOn := chanConfigBundle.ApplicationConfig() resConf := &common.Config{ChannelGroup: &common.ConfigGroup{}} - if capabilityOn && appConfig.Capabilities().LifecycleViaConfig() { + if capabilityOn && appConfig.Capabilities().ResourcesTree() { resConf, err = retrievePersistedResourceConfig(ledger) if err != nil { return nil, err diff --git a/core/peer/configtx_util.go b/core/peer/configtx_util.go index 50915b816ec..e61cec56a61 100644 --- a/core/peer/configtx_util.go +++ b/core/peer/configtx_util.go @@ -52,7 +52,7 @@ func isResConfigCapabilityOn(chainid string, chanConfig *common.Config) (bool, e if !exists { return false, fmt.Errorf("Application config missing") } - return appConfig.Capabilities().LifecycleViaConfig(), nil + return appConfig.Capabilities().ResourcesTree(), nil } // extractFullConfigFromSeedTx pulls out the seed resource config tx from the config transaction in the genesis block diff --git a/core/peer/peer.go b/core/peer/peer.go index e09f758ae2e..f16c4a5d9eb 100644 --- a/core/peer/peer.go +++ b/core/peer/peer.go @@ -336,7 +336,7 @@ func createChain(cid string, ledger ledger.PeerLedger, cb *common.Block) error { } resConf := &common.Config{ChannelGroup: &common.ConfigGroup{}} - if ac != nil && ac.Capabilities().LifecycleViaConfig() { + if ac != nil && ac.Capabilities().ResourcesTree() { if resConf, err = retrievePersistedResourceConfig(ledger); err != nil { return err } diff --git a/sampleconfig/configtx.yaml b/sampleconfig/configtx.yaml index 779e7308b13..b9e282aea17 100644 --- a/sampleconfig/configtx.yaml +++ b/sampleconfig/configtx.yaml @@ -362,16 +362,3 @@ Capabilities: # collections can be configured upon chaincode instantiation and # utilized within chaincode Invokes. V1_1_PVTDATA_EXPERIMENTAL: false - -################################################################################ -# -# SECTION: Resources -# -# - This section defines the peer resources for a fabric network. These -# resources include chaincode definitions, as well as policies for how those -# resources can be modified. Note, this section is only applicable if the V1_1 -# application capability is enabled. -# -################################################################################ -Resources: - DefaultModPolicy: /Channel/Application/Admins