Skip to content
This repository was archived by the owner on Apr 25, 2025. It is now read-only.

Commit f58e994

Browse files
committed
[FAB-10456] Use dynamic selection by default
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>
1 parent 68c1ad0 commit f58e994

File tree

3 files changed

+85
-21
lines changed

3 files changed

+85
-21
lines changed

pkg/fabsdk/provider/chpvdr/chprovider.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111

1212
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/discovery/dynamicdiscovery"
1313
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/discovery/staticdiscovery"
14-
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/selection/staticselection"
14+
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/selection/dynamicselection"
1515
"github.com/hyperledger/fabric-sdk-go/pkg/common/logging"
1616
"github.com/hyperledger/fabric-sdk-go/pkg/common/options"
1717
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/context"
@@ -171,7 +171,7 @@ func (cp *ChannelProvider) createSelectionService(ctx context.Client, chConfig f
171171
if err != nil {
172172
return nil, err
173173
}
174-
return staticselection.NewService(discovery)
174+
return dynamicselection.NewService(ctx, chConfig.ID(), discovery)
175175
}
176176

177177
func (cp *ChannelProvider) getSelectionService(context fab.ClientContext, channelID string) (fab.SelectionService, error) {

pkg/fabsdk/provider/chpvdr/chprovider_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313

1414
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/discovery/dynamicdiscovery"
1515
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/discovery/staticdiscovery"
16-
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/selection/staticselection"
16+
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/selection/dynamicselection"
1717

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

9999
// testchannel has v1_2 capabilities
100100
channelService, err = cp.ChannelService(clientCtx, "testchannel")

test/integration/orgs/multiple_orgs_test.go

Lines changed: 80 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ func testWithOrg1(t *testing.T, sdk *fabsdk.FabricSDK, mc *multiorgContext) int
230230
}
231231

232232
// Create chaincode package for example cc
233-
createCC(t, mc.org1ResMgmt, mc.org2ResMgmt, ccPkg, mc.ccName, mc.ccVersion)
233+
createCC(t, mc, ccPkg, mc.ccName, mc.ccVersion)
234234

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

@@ -453,23 +453,11 @@ func verifyErrorFromCC(chClientOrg1User *channel.Client, t *testing.T, ccName st
453453
}
454454
}
455455

456-
func createCC(t *testing.T, org1ResMgmt *resmgmt.Client, org2ResMgmt *resmgmt.Client, ccPkg *resource.CCPackage, ccName, ccVersion string) {
457-
installCCReq := resmgmt.InstallCCRequest{Name: ccName, Path: "github.com/example_cc", Version: ccVersion, Package: ccPkg}
458-
459-
// Install example cc to Org1 peers
460-
_, err := org1ResMgmt.InstallCC(installCCReq, resmgmt.WithRetry(retry.DefaultResMgmtOpts))
461-
require.NoError(t, err, "InstallCC for Org1 failed")
462-
463-
// Install example cc to Org2 peers
464-
_, err = org2ResMgmt.InstallCC(installCCReq, resmgmt.WithRetry(retry.DefaultResMgmtOpts))
465-
require.NoError(t, err, "InstallCC for Org2 failed")
466-
467-
instantiateCC(t, org1ResMgmt, ccName, ccVersion)
468-
456+
func queryInstantiatedCC(t *testing.T, resMgmt *resmgmt.Client, channelID, ccName string) bool {
469457
found := false
470458
for i := 0; i < 5; i++ {
471459
// Verify that example CC is instantiated on Org1 peer
472-
chaincodeQueryResponse, err := org1ResMgmt.QueryInstantiatedChaincodes(channelID, resmgmt.WithRetry(retry.DefaultResMgmtOpts))
460+
chaincodeQueryResponse, err := resMgmt.QueryInstantiatedChaincodes(channelID, resmgmt.WithRetry(retry.DefaultResMgmtOpts))
473461
require.NoError(t, err, "QueryInstantiatedChaincodes return error")
474462

475463
t.Logf("Found %d instantiated chaincodes:", len(chaincodeQueryResponse.Chaincodes))
@@ -481,10 +469,86 @@ func createCC(t *testing.T, org1ResMgmt *resmgmt.Client, org2ResMgmt *resmgmt.Cl
481469
}
482470
}
483471
if found {
484-
break
472+
return true
485473
}
486474
time.Sleep(5 * time.Second)
487475
}
476+
return false
477+
}
478+
479+
func createCC(t *testing.T, mc *multiorgContext, ccPkg *resource.CCPackage, ccName, ccVersion string) {
480+
installCCReq := resmgmt.InstallCCRequest{Name: ccName, Path: "github.com/example_cc", Version: ccVersion, Package: ccPkg}
481+
482+
// Install example cc to Org1 peers
483+
_, err := mc.org1ResMgmt.InstallCC(installCCReq, resmgmt.WithRetry(retry.DefaultResMgmtOpts))
484+
require.NoError(t, err, "InstallCC for Org1 failed")
485+
486+
// Install example cc to Org2 peers
487+
_, err = mc.org2ResMgmt.InstallCC(installCCReq, resmgmt.WithRetry(retry.DefaultResMgmtOpts))
488+
require.NoError(t, err, "InstallCC for Org2 failed")
489+
490+
isInstalled := func(ctxProvider contextAPI.ClientProvider, resMgmt *resmgmt.Client) bool {
491+
ctx, err := ctxProvider()
492+
require.NoErrorf(t, err, "Getting client context for [%s] failed", ctx.Identifier().MSPID)
493+
discoveryProvider := ctx.LocalDiscoveryProvider()
494+
discovery, err := discoveryProvider.CreateLocalDiscoveryService(ctx.Identifier().MSPID)
495+
require.NoErrorf(t, err, "Error creating local discovery service for [%s]", ctx.Identifier().MSPID)
496+
peers, err := discovery.GetPeers()
497+
require.NoErrorf(t, err, "Getting local peers for [%s] failed", ctx.Identifier().MSPID)
498+
499+
t.Logf("Querying [%s] peers to see if chaincode [%s:%s] was installed", ctx.Identifier().MSPID, ccName, ccVersion)
500+
installedOnAllPeers := true
501+
for _, peer := range peers {
502+
t.Logf("Querying [%s] ...", peer.URL())
503+
resp, err := resMgmt.QueryInstalledChaincodes(resmgmt.WithTargets(peer))
504+
require.NoErrorf(t, err, "QueryInstalledChaincodes for peer [%s] failed", peer.URL())
505+
506+
found := false
507+
for _, ccInfo := range resp.Chaincodes {
508+
t.Logf("... found chaincode [%s:%s]", ccInfo.Name, ccInfo.Version)
509+
if ccInfo.Name == ccName && ccInfo.Version == ccVersion {
510+
found = true
511+
break
512+
}
513+
}
514+
if !found {
515+
t.Logf("... chaincode [%s:%s] is not installed on peer [%s]", ccName, ccVersion, peer.URL())
516+
installedOnAllPeers = false
517+
}
518+
}
519+
return installedOnAllPeers
520+
}
521+
522+
installed := false
523+
for i := 0; i < 10; i++ {
524+
if isInstalled(mc.org1AdminClientContext, mc.org1ResMgmt) {
525+
t.Logf("Chaincode [%s:%s] is installed on all peers in Org1", ccName, ccVersion)
526+
installed = true
527+
break
528+
}
529+
t.Logf("Chaincode [%s:%s] is NOT installed on all peers in Org1. Trying again in 2 seconds...", ccName, ccVersion)
530+
time.Sleep(2 * time.Second)
531+
}
532+
require.Truef(t, installed, "Expecting chaincode [%s:%s] to be installed on all peers in Org1")
533+
534+
installed = false
535+
for i := 0; i < 10; i++ {
536+
if isInstalled(mc.org2AdminClientContext, mc.org2ResMgmt) {
537+
t.Logf("Chaincode [%s:%s] is installed on all peers in Org2", ccName, ccVersion)
538+
installed = true
539+
break
540+
}
541+
t.Logf("Chaincode [%s:%s] is NOT installed on all peers in Org2. Trying again in 2 seconds...", ccName, ccVersion)
542+
time.Sleep(2 * time.Second)
543+
}
544+
require.Truef(t, installed, "Expecting chaincode [%s:%s] to be installed on all peers in Org2")
545+
546+
instantiateCC(t, mc.org1ResMgmt, ccName, ccVersion)
547+
548+
found := queryInstantiatedCC(t, mc.org1ResMgmt, channelID, ccName)
549+
require.True(t, found, "QueryInstantiatedChaincodes failed to find instantiated '%s' chaincode", ccName)
550+
551+
found = queryInstantiatedCC(t, mc.org2ResMgmt, channelID, ccName)
488552
require.True(t, found, "QueryInstantiatedChaincodes failed to find instantiated '%s' chaincode", ccName)
489553
}
490554

0 commit comments

Comments
 (0)