Skip to content

Commit

Permalink
FAB-11201 shim pkg. provider to support both cc pkgs
Browse files Browse the repository at this point in the history
This CR adds a new shim package provider which retrieves the
code package for a given chaincode name/version and updates
the peer to use it at startup. It first searches for a
ChaincodeInstallPackage with the given name/version and falls
back to searching for a ChaincodeDeploymentSpec.

FAB-11201 #done

Change-Id: I064dc2b364a1c8e1280ec1f2b3ffc21c8b3e2e96
Signed-off-by: Will Lahti <wtlahti@us.ibm.com>
  • Loading branch information
wlahti committed Jul 31, 2018
1 parent 3d72b63 commit 679a32e
Show file tree
Hide file tree
Showing 11 changed files with 534 additions and 13 deletions.
2 changes: 1 addition & 1 deletion core/chaincode/chaincode_support_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ func initMockPeer(chainIDs ...string) (*ChaincodeSupport, error) {

peer.MockSetMSPIDGetter(mspGetter)

ccprovider.SetChaincodesPath(ccprovider.GetCCsPath())
ccprovider.SetChaincodesPath(ccprovider.GetChaincodeInstallPathFromViper())
ca, _ := tlsgen.NewCA()
certGenerator := accesscontrol.NewAuthenticator(ca)
config := GlobalConfig()
Expand Down
2 changes: 1 addition & 1 deletion core/chaincode/exectransaction_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ func initPeer(chainIDs ...string) (net.Listener, *ChaincodeSupport, func(), erro
return nil, nil, nil, fmt.Errorf("Error starting peer listener %s", err)
}

ccprovider.SetChaincodesPath(ccprovider.GetCCsPath())
ccprovider.SetChaincodesPath(ccprovider.GetChaincodeInstallPathFromViper())
ca, _ := tlsgen.NewCA()
certGenerator := accesscontrol.NewAuthenticator(ca)
config := GlobalConfig()
Expand Down
101 changes: 101 additions & 0 deletions core/chaincode/persistence/mock/legacy_package_provider.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

182 changes: 182 additions & 0 deletions core/chaincode/persistence/mock/store_package_provider.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

83 changes: 83 additions & 0 deletions core/chaincode/persistence/package_provider.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/

package persistence

import (
"github.com/pkg/errors"
)

// StorePackageProvider is the interface needed to retrieve
// the code package from a ChaincodeInstallPackage
type StorePackageProvider interface {
Load(hash []byte) (codePackage []byte, name, version string, err error)
RetrieveHash(name, version string) (hash []byte, err error)
}

// LegacyPackageProvider is the interface needed to retrieve
// the code package from a ChaincodeDeploymentSpec
type LegacyPackageProvider interface {
GetChaincodeCodePackage(name, version string) (codePackage []byte, err error)
}

// PackageProvider holds the necessary dependencies to obtain the code
// package bytes for a chaincode
type PackageProvider struct {
Store StorePackageProvider
LegacyPP LegacyPackageProvider
}

// GetChaincodeCodePackage gets the code package bytes for a chaincode given
// the name and version. It first searches through the persisted
// ChaincodeInstallPackages and then falls back to searching for
// ChaincodeDeploymentSpecs
func (p *PackageProvider) GetChaincodeCodePackage(name, version string) ([]byte, error) {
codePackage, err := p.getCodePackageFromStore(name, version)
if err == nil {
return codePackage, nil
}
if _, ok := err.(*CodePackageNotFoundErr); !ok {
// return the error if the hash cannot be retrieved or the code package
// fails to load from the persistence store
return nil, err
}

codePackage, err = p.getCodePackageFromLegacyPP(name, version)
if err != nil {
logger.Debug(err.Error())
err = errors.Errorf("code package not found for chaincode with name '%s', version '%s'", name, version)
return nil, err
}
return codePackage, nil
}

// GetCodePackageFromStore gets the code package bytes from the package
// provider's Store, which persists ChaincodeInstallPackages
func (p *PackageProvider) getCodePackageFromStore(name, version string) ([]byte, error) {
hash, err := p.Store.RetrieveHash(name, version)
if _, ok := err.(*CodePackageNotFoundErr); ok {
return nil, err
}
if err != nil {
return nil, errors.WithMessage(err, "error retrieving hash")
}

codePackage, _, _, err := p.Store.Load(hash)
if err != nil {
return nil, errors.WithMessage(err, "error loading code package from ChaincodeInstallPackage")
}
return codePackage, nil
}

// GetCodePackageFromLegacyPP gets the code packages bytes from the
// legacy package provider, which persists ChaincodeDeploymentSpecs
func (p *PackageProvider) getCodePackageFromLegacyPP(name, version string) ([]byte, error) {
codePackage, err := p.LegacyPP.GetChaincodeCodePackage(name, version)
if err != nil {
return nil, errors.Wrap(err, "error loading code package from ChaincodeDeploymentSpec")
}
return codePackage, nil
}
Loading

0 comments on commit 679a32e

Please sign in to comment.