From 9da753a04e3dbf7d5849dc44bff241d2c6a503b5 Mon Sep 17 00:00:00 2001 From: Chongxin Luo Date: Mon, 17 Aug 2020 16:21:48 -0400 Subject: [PATCH] [FAB-18169] Add DevMode support in ChaincodeEndorsementInfoSource * Added DevMode support in ChaincodeEndorsementInfoSource, when chaincode is launched by developer and missing Installinfo from chaincodeInfo cache, rebuild Installinfo and return accordinly. Signed-off-by: Chongxin Luo --- ...endorsment_info.go => endorsement_info.go} | 12 ++++++- ..._info_test.go => endorsement_info_test.go} | 34 +++++++++++++++++++ internal/peer/node/start.go | 1 + 3 files changed, 46 insertions(+), 1 deletion(-) rename core/chaincode/lifecycle/{endorsment_info.go => endorsement_info.go} (94%) rename core/chaincode/lifecycle/{endorsment_info_test.go => endorsement_info_test.go} (90%) diff --git a/core/chaincode/lifecycle/endorsment_info.go b/core/chaincode/lifecycle/endorsement_info.go similarity index 94% rename from core/chaincode/lifecycle/endorsment_info.go rename to core/chaincode/lifecycle/endorsement_info.go index 145d441b0c6..d9a52f3f67d 100644 --- a/core/chaincode/lifecycle/endorsment_info.go +++ b/core/chaincode/lifecycle/endorsement_info.go @@ -9,7 +9,6 @@ package lifecycle import ( "github.com/hyperledger/fabric/core/ledger" "github.com/hyperledger/fabric/core/scc" - "github.com/pkg/errors" ) @@ -46,6 +45,7 @@ type ChaincodeEndorsementInfoSource struct { Cache ChaincodeInfoCache LegacyImpl Lifecycle BuiltinSCCs scc.BuiltinSCCs + UserRunsCC bool } func (cei *ChaincodeEndorsementInfoSource) CachedChaincodeInfo(channelID, chaincodeName string, qe ledger.SimpleQueryExecutor) (*LocalChaincodeInfo, bool, error) { @@ -90,6 +90,12 @@ func (cei *ChaincodeEndorsementInfoSource) CachedChaincodeInfo(channelID, chainc } if chaincodeInfo.InstallInfo == nil { + if cei.UserRunsCC { + chaincodeInfo.InstallInfo = &ChaincodeInstallInfo{ + PackageID: chaincodeName + ":" + chaincodeInfo.Definition.EndorsementInfo.Version, + } + return chaincodeInfo, true, nil + } return nil, false, errors.Errorf("chaincode definition for '%s' exists, but chaincode is not installed", chaincodeName) } @@ -130,6 +136,10 @@ func (cei *ChaincodeEndorsementInfoSource) ChaincodeEndorsementInfo(channelID, c return cei.LegacyImpl.ChaincodeEndorsementInfo(channelID, chaincodeName, qe) } + if chaincodeInfo.InstallInfo == nil { + chaincodeInfo.InstallInfo = &ChaincodeInstallInfo{} + } + return &ChaincodeEndorsementInfo{ Version: chaincodeInfo.Definition.EndorsementInfo.Version, EnforceInit: chaincodeInfo.Definition.EndorsementInfo.InitRequired, diff --git a/core/chaincode/lifecycle/endorsment_info_test.go b/core/chaincode/lifecycle/endorsement_info_test.go similarity index 90% rename from core/chaincode/lifecycle/endorsment_info_test.go rename to core/chaincode/lifecycle/endorsement_info_test.go index 5c0f2d01434..396c83a93ad 100644 --- a/core/chaincode/lifecycle/endorsment_info_test.go +++ b/core/chaincode/lifecycle/endorsement_info_test.go @@ -190,6 +190,40 @@ var _ = Describe("ChaincodeEndorsementInfoSource", func() { Expect(err).To(MatchError("could not get current sequence for chaincode 'name' on channel '': could not get state for key namespaces/fields/name/Sequence: invalid channel-less operation")) }) }) + + Context("when running chaincode in devmode", func() { + BeforeEach(func() { + testInfo.InstallInfo = nil + cei.UserRunsCC = true + }) + + It("set chaincode installInfo to {chaincodeName}:{chaincodeVersion}", func() { + info, ok, err := cei.CachedChaincodeInfo("channel-id", "name", fakeQueryExecutor) + Expect(err).NotTo(HaveOccurred()) + Expect(ok).To(BeTrue()) + Expect(info).To(Equal(&lifecycle.LocalChaincodeInfo{ + Definition: &lifecycle.ChaincodeDefinition{ + Sequence: 7, + EndorsementInfo: &lb.ChaincodeEndorsementInfo{ + Version: "version", + EndorsementPlugin: "endorsement-plugin", + }, + ValidationInfo: &lb.ChaincodeValidationInfo{ + ValidationPlugin: "validation-plugin", + ValidationParameter: []byte("validation-parameter"), + }, + }, + InstallInfo: &lifecycle.ChaincodeInstallInfo{ + PackageID: "name:version", + }, + Approved: true, + })) + Expect(fakeCache.ChaincodeInfoCallCount()).To(Equal(1)) + channelID, chaincodeName := fakeCache.ChaincodeInfoArgsForCall(0) + Expect(channelID).To(Equal("channel-id")) + Expect(chaincodeName).To(Equal("name")) + }) + }) }) Describe("ChaincodeEndorsementInfo", func() { diff --git a/internal/peer/node/start.go b/internal/peer/node/start.go index 430c9731170..dadd51222df 100644 --- a/internal/peer/node/start.go +++ b/internal/peer/node/start.go @@ -616,6 +616,7 @@ func serve(args []string) error { Resources: lifecycleResources, Cache: lifecycleCache, BuiltinSCCs: builtinSCCs, + UserRunsCC: userRunsCC, } containerRuntime := &chaincode.ContainerRuntime{