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

Commit d92bc58

Browse files
committed
[FAB-8482] using contexts in ccpolicyprovider
- removed sdk.NewClient() dependency from ccpolicyprovider - selection provider initialize will use context providers instead of sdk - removed sdk.FabricProvider() - CoreProviderFactory.CreateFabricProvider() renamed to CoreProviderFactory.CreateInfraProvider() - FabricProvider renamed to InfraProvider - refactored integration tests to not to use contexts directly for signing identities, added a utility function which will be fixed later. Change-Id: I9e5512b2f55d5a3e3fe293aa7811e9e6925d803d Signed-off-by: Sudesh Shetty <sudesh.shetty@securekey.com>
1 parent 151405c commit d92bc58

30 files changed

+309
-224
lines changed

pkg/client/common/selection/dynamicselection/ccpolicyprovider.go

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ import (
1616
"github.com/pkg/errors"
1717

1818
"github.com/hyperledger/fabric-sdk-go/pkg/client/channel"
19+
"github.com/hyperledger/fabric-sdk-go/pkg/common/context"
20+
contextImpl "github.com/hyperledger/fabric-sdk-go/pkg/context"
1921
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/core"
2022
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
21-
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk"
23+
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/api"
2224
"github.com/hyperledger/fabric-sdk-go/pkg/logging"
2325
"github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/core/common/ccprovider"
2426
"github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/common"
@@ -41,38 +43,46 @@ type CCPolicyProvider interface {
4143
}
4244

4345
// NewCCPolicyProvider creates new chaincode policy data provider
44-
func newCCPolicyProvider(sdk *fabsdk.FabricSDK, channelID string, userName string, orgName string) (CCPolicyProvider, error) {
45-
if channelID == "" || userName == "" || orgName == "" {
46-
return nil, errors.New("Must provide channel ID, user name and organisation for cc policy provider")
46+
func newCCPolicyProvider(providers api.Providers, channelID string, userName string, orgName string) (CCPolicyProvider, error) {
47+
if providers == nil || channelID == "" || userName == "" || orgName == "" {
48+
return nil, errors.New("Must provide providers, channel ID, user name and organisation for cc policy provider")
4749
}
4850

49-
if sdk == nil {
50-
return nil, errors.New("Must provide sdk")
51+
// TODO: Add option to use anchor peers instead of config
52+
targetPeers, err := providers.Config().ChannelPeers(channelID)
53+
if err != nil {
54+
return nil, errors.WithMessage(err, "unable to read configuration for channel peers")
5155
}
5256

53-
client := sdk.NewClient(fabsdk.WithUser(userName), fabsdk.WithOrg(orgName))
57+
//Get identity
58+
mgr, ok := providers.IdentityManager(orgName)
59+
if !ok {
60+
return nil, errors.New("invalid options to create identity, invalid org name")
61+
}
5462

55-
// TODO: Add option to use anchor peers instead of config
56-
targetPeers, err := sdk.Config().ChannelPeers(channelID)
63+
identity, err := mgr.GetUser(userName)
5764
if err != nil {
58-
return nil, errors.WithMessage(err, "unable to read configuration for channel peers")
65+
return nil, errors.WithMessage(err, "unable to create identity for ccl policy provider")
5966
}
6067

6168
cpp := ccPolicyProvider{
62-
config: sdk.Config(),
63-
client: client,
69+
config: providers.Config(),
70+
providers: providers,
6471
channelID: channelID,
72+
identity: identity,
6573
targetPeers: targetPeers,
6674
ccDataMap: make(map[string]*ccprovider.ChaincodeData),
67-
provider: sdk.FabricProvider(),
75+
provider: providers.InfraProvider(),
6876
}
77+
6978
return &cpp, nil
7079
}
7180

7281
type ccPolicyProvider struct {
7382
config core.Config
74-
client *fabsdk.ClientContext
83+
providers context.Providers
7584
channelID string
85+
identity context.Identity
7686
targetPeers []core.ChannelPeer
7787
ccDataMap map[string]*ccprovider.ChaincodeData // TODO: Add expiry and configurable timeout for map entries
7888
mutex sync.RWMutex
@@ -129,7 +139,11 @@ func (dp *ccPolicyProvider) queryChaincode(ccID string, ccFcn string, ccArgs [][
129139
var queryErrors []string
130140
var response []byte
131141

132-
client, err := dp.client.Channel(dp.channelID)
142+
//prepare channel context
143+
channelContext := dp.getChannelContext()
144+
145+
//get channel client
146+
client, err := channel.New(channelContext)
133147
if err != nil {
134148
return nil, errors.WithMessage(err, "Unable to create channel client")
135149
}
@@ -193,3 +207,15 @@ func newResolverKey(channelID string, chaincodeIDs ...string) *resolverKey {
193207
}
194208
return &resolverKey{channelID: channelID, chaincodeIDs: arr, key: key}
195209
}
210+
211+
func (dp *ccPolicyProvider) getChannelContext() context.ChannelProvider {
212+
//Get Channel Context
213+
return func() (context.Channel, error) {
214+
//Get Client Context
215+
clientProvider := func() (context.Client, error) {
216+
return &contextImpl.Client{Providers: dp.providers, Identity: dp.identity}, nil
217+
}
218+
219+
return contextImpl.NewChannel(clientProvider, dp.channelID)
220+
}
221+
}

pkg/client/common/selection/dynamicselection/ccpolicyprovider_test.go

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,30 @@ import (
1010
"strings"
1111
"testing"
1212

13+
"net"
14+
1315
"github.com/hyperledger/fabric-sdk-go/pkg/core/config"
16+
mocks "github.com/hyperledger/fabric-sdk-go/pkg/fab/mocks"
1417
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk"
18+
pb "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/peer"
19+
"google.golang.org/grpc"
1520
)
1621

22+
func startEndorserServer(t *testing.T, grpcServer *grpc.Server, testAddress string) (*mocks.MockEndorserServer, string) {
23+
lis, err := net.Listen("tcp", testAddress)
24+
addr := lis.Addr().String()
25+
26+
endorserServer := &mocks.MockEndorserServer{}
27+
pb.RegisterEndorserServer(grpcServer, endorserServer)
28+
if err != nil {
29+
t.Logf("Error starting test server %s", err)
30+
t.FailNow()
31+
}
32+
t.Logf("Starting test server on %s\n", addr)
33+
go grpcServer.Serve(lis)
34+
return endorserServer, addr
35+
}
36+
1737
func TestCCPolicyProvider(t *testing.T) {
1838
// Create SDK setup for channel client with dynamic selection
1939
sdk, err := fabsdk.New(config.FromFile("../../../../../test/fixtures/config/config_test.yaml"))
@@ -22,38 +42,45 @@ func TestCCPolicyProvider(t *testing.T) {
2242
}
2343
defer sdk.Close()
2444

45+
clientContext := sdk.Context(fabsdk.WithUser("User1"), fabsdk.WithOrg("Org1"))
46+
47+
context, err := clientContext()
48+
if err != nil {
49+
t.Fatal("Failed to create context")
50+
}
51+
2552
// Nil sdk
2653
ccPolicyProvider, err := newCCPolicyProvider(nil, "mychannel", "User1", "Org1")
2754
if err == nil {
2855
t.Fatalf("Should have failed for nil sdk")
2956
}
3057

3158
// Invalid channelID
32-
ccPolicyProvider, err = newCCPolicyProvider(sdk, "", "User1", "Org1")
59+
ccPolicyProvider, err = newCCPolicyProvider(context, "", "User1", "Org1")
3360
if err == nil {
3461
t.Fatalf("Should have failed for empty channel")
3562
}
3663

3764
// Empty user name
38-
ccPolicyProvider, err = newCCPolicyProvider(sdk, "mychannel", "", "Prg1")
65+
ccPolicyProvider, err = newCCPolicyProvider(context, "mychannel", "", "Prg1")
3966
if err == nil {
4067
t.Fatalf("Should have failed for empty user name")
4168
}
4269

4370
// Empty org name
44-
ccPolicyProvider, err = newCCPolicyProvider(sdk, "mychannel", "User1", "")
71+
ccPolicyProvider, err = newCCPolicyProvider(context, "mychannel", "User1", "")
4572
if err == nil {
4673
t.Fatalf("Should have failed for nil sdk")
4774
}
4875

4976
// Invalid channel
50-
ccPolicyProvider, err = newCCPolicyProvider(sdk, "non-existent", "User1", "Org1")
77+
ccPolicyProvider, err = newCCPolicyProvider(context, "non-existent", "User1", "Org1")
5178
if err == nil {
5279
t.Fatalf("Should have failed for invalid channel name")
5380
}
5481

5582
// All good
56-
ccPolicyProvider, err = newCCPolicyProvider(sdk, "mychannel", "User1", "Org1")
83+
ccPolicyProvider, err = newCCPolicyProvider(context, "mychannel", "User1", "Org1")
5784
if err != nil {
5885
t.Fatalf("Failed to setup cc policy provider: %s", err)
5986
}
@@ -79,16 +106,21 @@ func TestBadClient(t *testing.T) {
79106
}
80107
defer sdk.Close()
81108

109+
clientContext := sdk.Context(fabsdk.WithUser("User1"), fabsdk.WithOrg("Org1"))
110+
111+
context, err := clientContext()
112+
if err != nil {
113+
t.Fatal("Failed to create context")
114+
}
115+
82116
// Non-existent user
83-
ccPolicyProvider, err := newCCPolicyProvider(sdk, "mychannel", "Invalid", "Org1")
84-
_, err = ccPolicyProvider.GetChaincodePolicy("mychannel")
117+
_, err = newCCPolicyProvider(context, "mychannel", "Invalid", "Org1")
85118
if !strings.Contains(err.Error(), "user not found") {
86119
t.Fatalf("Should have failed for invalid user name: %v", err)
87120
}
88121

89122
// Invalid org
90-
ccPolicyProvider, err = newCCPolicyProvider(sdk, "mychannel", "User1", "Invalid")
91-
_, err = ccPolicyProvider.GetChaincodePolicy("mychannel")
123+
_, err = newCCPolicyProvider(context, "mychannel", "User1", "Invalid")
92124
if !strings.Contains(err.Error(), "invalid org name") {
93125
t.Fatalf("Should have failed for invalid org name")
94126
}

pkg/client/common/selection/dynamicselection/dynamicselection.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@ import (
1010
"fmt"
1111
"sync"
1212

13+
"github.com/hyperledger/fabric-sdk-go/pkg/context"
1314
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/core"
1415
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
15-
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk"
1616
"github.com/pkg/errors"
1717

1818
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/selection/dynamicselection/pgresolver"
19+
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/api"
1920
)
2021

2122
// ChannelUser contains user(identity) info to be used for specific channel
@@ -28,10 +29,10 @@ type ChannelUser struct {
2829
// SelectionProvider implements selection provider
2930
// TODO: refactor users into client contexts
3031
type SelectionProvider struct {
31-
config core.Config
32-
users []ChannelUser
33-
lbp pgresolver.LoadBalancePolicy
34-
sdk *fabsdk.FabricSDK
32+
config core.Config
33+
users []ChannelUser
34+
lbp pgresolver.LoadBalancePolicy
35+
providers api.Providers
3536
}
3637

3738
// New returns dynamic selection provider
@@ -52,8 +53,8 @@ type selectionService struct {
5253
}
5354

5455
// Initialize allow for initializing providers
55-
func (p *SelectionProvider) Initialize(sdk *fabsdk.FabricSDK) error {
56-
p.sdk = sdk
56+
func (p *SelectionProvider) Initialize(providers *context.Provider) error {
57+
p.providers = providers
5758
return nil
5859
}
5960

@@ -75,7 +76,7 @@ func (p *SelectionProvider) CreateSelectionService(channelID string) (fab.Select
7576
return nil, errors.New("Must provide user for channel")
7677
}
7778

78-
ccPolicyProvider, err := newCCPolicyProvider(p.sdk, channelID, channelUser.UserName, channelUser.OrgName)
79+
ccPolicyProvider, err := newCCPolicyProvider(p.providers, channelID, channelUser.UserName, channelUser.OrgName)
7980
if err != nil {
8081
return nil, errors.WithMessage(err, "Failed to create cc policy provider")
8182
}

pkg/client/common/selection/dynamicselection/dynamicselection_test.go

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212

1313
"github.com/golang/protobuf/proto"
1414
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/selection/dynamicselection/pgresolver"
15+
"github.com/hyperledger/fabric-sdk-go/pkg/common/context"
1516
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/core"
1617
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
1718
"github.com/hyperledger/fabric-sdk-go/pkg/core/config"
@@ -324,33 +325,44 @@ func toString(peers []fab.Peer) string {
324325

325326
func TestDynamicSelection(t *testing.T) {
326327

327-
c, err := config.FromFile("../../../../../test/fixtures/config/config_test.yaml")()
328+
// Create SDK setup for channel client with dynamic selection
329+
sdk, err := fabsdk.New(config.FromFile("../../../../../test/fixtures/config/config_test.yaml"))
330+
if err != nil {
331+
t.Fatalf("Failed to create new SDK: %s", err)
332+
}
333+
defer sdk.Close()
334+
335+
clientContext := sdk.Context(fabsdk.WithUser("User1"), fabsdk.WithOrg("Org1"))
336+
ctx, err := clientContext()
328337
if err != nil {
329-
t.Fatalf(err.Error())
338+
t.Fatalf("Failed to to get client context: %s", err)
330339
}
331340

332341
mychannelUser := ChannelUser{ChannelID: "mychannel", UserName: "User1", OrgName: "Org1"}
333342

334-
selectionProvider, err := New(c, []ChannelUser{mychannelUser}, nil)
343+
selectionProvider, err := New(ctx.Config(), []ChannelUser{mychannelUser}, nil)
335344
if err != nil {
336345
t.Fatalf("Failed to setup selection provider: %s", err)
337346
}
338347

348+
selectionProvider.providers = ctx
339349
_, err = selectionProvider.CreateSelectionService("")
340350
if err == nil {
341351
t.Fatalf("Should have failed for empty channel name")
342352
}
343353

354+
selectionProvider.providers = nil
344355
_, err = selectionProvider.CreateSelectionService("mychannel")
345356
if err == nil {
346357
t.Fatalf("Should have failed since sdk not provided")
347358
}
348359

349-
testLBPolicy(t, c, selectionProvider, mychannelUser)
350-
testCustomLBPolicy(t, c, selectionProvider, mychannelUser)
360+
selectionProvider.providers = ctx
361+
testLBPolicy(t, selectionProvider)
362+
testCustomLBPolicy(t, ctx.Config(), selectionProvider, mychannelUser)
351363
}
352364

353-
func testLBPolicy(t *testing.T, c core.Config, selectionProvider *SelectionProvider, mychannelUser ChannelUser) {
365+
func testLBPolicy(t *testing.T, selectionProvider *SelectionProvider) {
354366
factory := DynamicSelectionProviderFactory{
355367
selectionProvider: selectionProvider,
356368
}
@@ -459,3 +471,9 @@ func (lbp *customLBP) Choose(peerGroups []pgresolver.PeerGroup) pgresolver.PeerG
459471
}
460472
return peerGroups[0]
461473
}
474+
475+
func setupMockContext(userName, orgName string) context.Providers {
476+
user := mocks.NewMockUserWithMSPID(userName, orgName)
477+
ctx := mocks.NewMockContext(user)
478+
return ctx
479+
}

pkg/client/resmgmt/resmgmt.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ type SaveChannelRequest struct {
8787
// Path to channel configuration file
8888
ChannelConfig string
8989
// Users that sign channel configuration
90-
SigningIdentities []context.Identity
90+
SigningIdentities []fab.IdentityContext
9191
}
9292

9393
//RequestOption func for each Opts argument
@@ -195,7 +195,7 @@ func (rc *Client) JoinChannel(channelID string, options ...RequestOption) error
195195
}
196196

197197
// TODO: handle more than the first orderer.
198-
orderer, err := rc.context.FabricProvider().CreateOrdererFromConfig(&oConfig[0])
198+
orderer, err := rc.context.InfraProvider().CreateOrdererFromConfig(&oConfig[0])
199199
if err != nil {
200200
return errors.WithMessage(err, "failed to create orderers from config")
201201
}

pkg/client/resmgmt/resmgmt_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ func TestJoinChannelNoOrdererConfig(t *testing.T) {
264264
}
265265
ctx.SetConfig(invalidOrdererConfig)
266266
customFabProvider := fabpvdr.New(ctx)
267-
ctx.SetCustomFabricProvider(customFabProvider)
267+
ctx.SetCustomInfraProvider(customFabProvider)
268268

269269
rc = setupResMgmtClient(ctx, nil, t)
270270

@@ -1299,15 +1299,15 @@ func TestSaveChannelWithMultipleSigningIdenities(t *testing.T) {
12991299
cc := setupDefaultResMgmtClient(t)
13001300

13011301
// empty list of signing identities (defaults to context user)
1302-
req := SaveChannelRequest{ChannelID: "mychannel", ChannelConfig: channelConfig, SigningIdentities: []context.Identity{}}
1302+
req := SaveChannelRequest{ChannelID: "mychannel", ChannelConfig: channelConfig, SigningIdentities: []fab.IdentityContext{}}
13031303
err := cc.SaveChannel(req, WithOrdererID(""))
13041304
if err != nil {
13051305
t.Fatalf("Failed to save channel with default signing identity: %s", err)
13061306
}
13071307

13081308
// multiple signing identities
13091309
secondCtx := fcmocks.NewMockContext(fcmocks.NewMockUser("second"))
1310-
req = SaveChannelRequest{ChannelID: "mychannel", ChannelConfig: channelConfig, SigningIdentities: []context.Identity{cc.context, secondCtx}}
1310+
req = SaveChannelRequest{ChannelID: "mychannel", ChannelConfig: channelConfig, SigningIdentities: []fab.IdentityContext{cc.context, secondCtx}}
13111311
err = cc.SaveChannel(req, WithOrdererID(""))
13121312
if err != nil {
13131313
t.Fatalf("Failed to save channel with multiple signing identities: %s", err)

0 commit comments

Comments
 (0)