Skip to content

Commit

Permalink
[FAB-10456] Use dynamic selection by default
Browse files Browse the repository at this point in the history
Set the Dynamic Selection service as the default
selection service in order to choose endorsers
based on chaincode policies

Change-Id: Idd63f4e7ec633e4a3836d4fd0765fe75e4fff5b3
Signed-off-by: Bob Stasyszyn <Bob.Stasyszyn@securekey.com>
  • Loading branch information
bstasyszyn committed May 31, 2018
1 parent 68c1ad0 commit f58e994
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 21 deletions.
4 changes: 2 additions & 2 deletions pkg/fabsdk/provider/chpvdr/chprovider.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (

"github.com/hyperledger/fabric-sdk-go/pkg/client/common/discovery/dynamicdiscovery"
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/discovery/staticdiscovery"
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/selection/staticselection"
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/selection/dynamicselection"
"github.com/hyperledger/fabric-sdk-go/pkg/common/logging"
"github.com/hyperledger/fabric-sdk-go/pkg/common/options"
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/context"
Expand Down Expand Up @@ -171,7 +171,7 @@ func (cp *ChannelProvider) createSelectionService(ctx context.Client, chConfig f
if err != nil {
return nil, err
}
return staticselection.NewService(discovery)
return dynamicselection.NewService(ctx, chConfig.ID(), discovery)
}

func (cp *ChannelProvider) getSelectionService(context fab.ClientContext, channelID string) (fab.SelectionService, error) {
Expand Down
6 changes: 3 additions & 3 deletions pkg/fabsdk/provider/chpvdr/chprovider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (

"github.com/hyperledger/fabric-sdk-go/pkg/client/common/discovery/dynamicdiscovery"
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/discovery/staticdiscovery"
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/selection/staticselection"
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/selection/dynamicselection"

"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/context"
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/fab"
Expand Down Expand Up @@ -93,8 +93,8 @@ func TestBasicValidChannel(t *testing.T) {
selection, err := channelService.Selection()
require.NoError(t, err)
require.NotNil(t, selection)
_, ok = selection.(*staticselection.SelectionService)
assert.Truef(t, ok, "Expecting selection to be Static")
_, ok = selection.(*dynamicselection.SelectionService)
assert.Truef(t, ok, "Expecting selection to be Dynamic")

// testchannel has v1_2 capabilities
channelService, err = cp.ChannelService(clientCtx, "testchannel")
Expand Down
96 changes: 80 additions & 16 deletions test/integration/orgs/multiple_orgs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ func testWithOrg1(t *testing.T, sdk *fabsdk.FabricSDK, mc *multiorgContext) int
}

// Create chaincode package for example cc
createCC(t, mc.org1ResMgmt, mc.org2ResMgmt, ccPkg, mc.ccName, mc.ccVersion)
createCC(t, mc, ccPkg, mc.ccName, mc.ccVersion)

chClientOrg1User, chClientOrg2User := connectUserToOrgChannel(org1ChannelClientContext, t, org2ChannelClientContext)

Expand Down Expand Up @@ -453,23 +453,11 @@ func verifyErrorFromCC(chClientOrg1User *channel.Client, t *testing.T, ccName st
}
}

func createCC(t *testing.T, org1ResMgmt *resmgmt.Client, org2ResMgmt *resmgmt.Client, ccPkg *resource.CCPackage, ccName, ccVersion string) {
installCCReq := resmgmt.InstallCCRequest{Name: ccName, Path: "github.com/example_cc", Version: ccVersion, Package: ccPkg}

// Install example cc to Org1 peers
_, err := org1ResMgmt.InstallCC(installCCReq, resmgmt.WithRetry(retry.DefaultResMgmtOpts))
require.NoError(t, err, "InstallCC for Org1 failed")

// Install example cc to Org2 peers
_, err = org2ResMgmt.InstallCC(installCCReq, resmgmt.WithRetry(retry.DefaultResMgmtOpts))
require.NoError(t, err, "InstallCC for Org2 failed")

instantiateCC(t, org1ResMgmt, ccName, ccVersion)

func queryInstantiatedCC(t *testing.T, resMgmt *resmgmt.Client, channelID, ccName string) bool {
found := false
for i := 0; i < 5; i++ {
// Verify that example CC is instantiated on Org1 peer
chaincodeQueryResponse, err := org1ResMgmt.QueryInstantiatedChaincodes(channelID, resmgmt.WithRetry(retry.DefaultResMgmtOpts))
chaincodeQueryResponse, err := resMgmt.QueryInstantiatedChaincodes(channelID, resmgmt.WithRetry(retry.DefaultResMgmtOpts))
require.NoError(t, err, "QueryInstantiatedChaincodes return error")

t.Logf("Found %d instantiated chaincodes:", len(chaincodeQueryResponse.Chaincodes))
Expand All @@ -481,10 +469,86 @@ func createCC(t *testing.T, org1ResMgmt *resmgmt.Client, org2ResMgmt *resmgmt.Cl
}
}
if found {
break
return true
}
time.Sleep(5 * time.Second)
}
return false
}

func createCC(t *testing.T, mc *multiorgContext, ccPkg *resource.CCPackage, ccName, ccVersion string) {
installCCReq := resmgmt.InstallCCRequest{Name: ccName, Path: "github.com/example_cc", Version: ccVersion, Package: ccPkg}

// Install example cc to Org1 peers
_, err := mc.org1ResMgmt.InstallCC(installCCReq, resmgmt.WithRetry(retry.DefaultResMgmtOpts))
require.NoError(t, err, "InstallCC for Org1 failed")

// Install example cc to Org2 peers
_, err = mc.org2ResMgmt.InstallCC(installCCReq, resmgmt.WithRetry(retry.DefaultResMgmtOpts))
require.NoError(t, err, "InstallCC for Org2 failed")

isInstalled := func(ctxProvider contextAPI.ClientProvider, resMgmt *resmgmt.Client) bool {
ctx, err := ctxProvider()
require.NoErrorf(t, err, "Getting client context for [%s] failed", ctx.Identifier().MSPID)
discoveryProvider := ctx.LocalDiscoveryProvider()
discovery, err := discoveryProvider.CreateLocalDiscoveryService(ctx.Identifier().MSPID)
require.NoErrorf(t, err, "Error creating local discovery service for [%s]", ctx.Identifier().MSPID)
peers, err := discovery.GetPeers()
require.NoErrorf(t, err, "Getting local peers for [%s] failed", ctx.Identifier().MSPID)

t.Logf("Querying [%s] peers to see if chaincode [%s:%s] was installed", ctx.Identifier().MSPID, ccName, ccVersion)
installedOnAllPeers := true
for _, peer := range peers {
t.Logf("Querying [%s] ...", peer.URL())
resp, err := resMgmt.QueryInstalledChaincodes(resmgmt.WithTargets(peer))
require.NoErrorf(t, err, "QueryInstalledChaincodes for peer [%s] failed", peer.URL())

found := false
for _, ccInfo := range resp.Chaincodes {
t.Logf("... found chaincode [%s:%s]", ccInfo.Name, ccInfo.Version)
if ccInfo.Name == ccName && ccInfo.Version == ccVersion {
found = true
break
}
}
if !found {
t.Logf("... chaincode [%s:%s] is not installed on peer [%s]", ccName, ccVersion, peer.URL())
installedOnAllPeers = false
}
}
return installedOnAllPeers
}

installed := false
for i := 0; i < 10; i++ {
if isInstalled(mc.org1AdminClientContext, mc.org1ResMgmt) {
t.Logf("Chaincode [%s:%s] is installed on all peers in Org1", ccName, ccVersion)
installed = true
break
}
t.Logf("Chaincode [%s:%s] is NOT installed on all peers in Org1. Trying again in 2 seconds...", ccName, ccVersion)
time.Sleep(2 * time.Second)
}
require.Truef(t, installed, "Expecting chaincode [%s:%s] to be installed on all peers in Org1")

installed = false
for i := 0; i < 10; i++ {
if isInstalled(mc.org2AdminClientContext, mc.org2ResMgmt) {
t.Logf("Chaincode [%s:%s] is installed on all peers in Org2", ccName, ccVersion)
installed = true
break
}
t.Logf("Chaincode [%s:%s] is NOT installed on all peers in Org2. Trying again in 2 seconds...", ccName, ccVersion)
time.Sleep(2 * time.Second)
}
require.Truef(t, installed, "Expecting chaincode [%s:%s] to be installed on all peers in Org2")

instantiateCC(t, mc.org1ResMgmt, ccName, ccVersion)

found := queryInstantiatedCC(t, mc.org1ResMgmt, channelID, ccName)
require.True(t, found, "QueryInstantiatedChaincodes failed to find instantiated '%s' chaincode", ccName)

found = queryInstantiatedCC(t, mc.org2ResMgmt, channelID, ccName)
require.True(t, found, "QueryInstantiatedChaincodes failed to find instantiated '%s' chaincode", ccName)
}

Expand Down

0 comments on commit f58e994

Please sign in to comment.