diff --git a/pkg/fabsdk/provider/chpvdr/chprovider.go b/pkg/fabsdk/provider/chpvdr/chprovider.go index 25fa62a80d..3f20a8ce4b 100644 --- a/pkg/fabsdk/provider/chpvdr/chprovider.go +++ b/pkg/fabsdk/provider/chpvdr/chprovider.go @@ -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" @@ -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) { diff --git a/pkg/fabsdk/provider/chpvdr/chprovider_test.go b/pkg/fabsdk/provider/chpvdr/chprovider_test.go index db93575376..656089ba2d 100644 --- a/pkg/fabsdk/provider/chpvdr/chprovider_test.go +++ b/pkg/fabsdk/provider/chpvdr/chprovider_test.go @@ -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" @@ -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") diff --git a/test/integration/orgs/multiple_orgs_test.go b/test/integration/orgs/multiple_orgs_test.go index bb1d71bdc8..2955695390 100644 --- a/test/integration/orgs/multiple_orgs_test.go +++ b/test/integration/orgs/multiple_orgs_test.go @@ -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) @@ -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)) @@ -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) }