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

Commit 4889a92

Browse files
committed
[FAB-8482] Context function implementation for SDK
- Added Context() function in sdk to create context client - Added NewChannelContext() function fabsdk package to create channel context - Removed SessionFactory - Refactored contexts in channel, ledger, resource packages - Created common/context package for context related interfaces Change-Id: I2b06f13ee7b0239858506646ea250a7eb6942801 Signed-off-by: Sudesh Shetty <sudesh.shetty@securekey.com>
1 parent 697f96f commit 4889a92

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+1228
-969
lines changed

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,8 @@ dockerenv-latest-up: clean
325325
mock-gen:
326326
mockgen -build_flags '$(GO_LDFLAGS_ARG)' github.com/hyperledger/fabric-sdk-go/pkg/context/api/core Config,Providers,IdentityManager | sed "s/github.com\/hyperledger\/fabric-sdk-go\/vendor\///g" | goimports > pkg/context/api/core/mocks/mockcoreapi.gen.go
327327
mockgen -build_flags '$(GO_LDFLAGS_ARG)' github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab ProposalProcessor,Providers | sed "s/github.com\/hyperledger\/fabric-sdk-go\/vendor\///g" | goimports > pkg/context/api/fab/mocks/mockfabapi.gen.go
328-
mockgen -build_flags '$(GO_LDFLAGS_ARG)' github.com/hyperledger/fabric-sdk-go/pkg/context Providers | sed "s/github.com\/hyperledger\/fabric-sdk-go\/vendor\///g" | goimports > pkg/context/mocks/mockcontext.gen.go
329-
mockgen -build_flags '$(GO_LDFLAGS_ARG)' github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/api CoreProviderFactory,ServiceProviderFactory,SessionClientFactory | sed "s/github.com\/hyperledger\/fabric-sdk-go\/vendor\///g" | goimports > pkg/fabsdk/mocks/mockfabsdkapi.gen.go
328+
mockgen -build_flags '$(GO_LDFLAGS_ARG)' github.com/hyperledger/fabric-sdk-go/pkg/common/context Providers,Client | sed "s/github.com\/hyperledger\/fabric-sdk-go\/vendor\///g" | goimports > pkg/common/context/mocks/mockcontext.gen.go
329+
mockgen -build_flags '$(GO_LDFLAGS_ARG)' github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/api CoreProviderFactory,ServiceProviderFactory | sed "s/github.com\/hyperledger\/fabric-sdk-go\/vendor\///g" | goimports > pkg/fabsdk/mocks/mockfabsdkapi.gen.go
330330

331331
# TODO - Add cryptogen
332332
.PHONY: channel-config-gen

pkg/client/channel/chclient.go

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/hyperledger/fabric-sdk-go/pkg/client/channel/invoke"
1515
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/discovery"
1616
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/discovery/greylist"
17+
"github.com/hyperledger/fabric-sdk-go/pkg/common/context"
1718
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/core"
1819
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
1920
"github.com/hyperledger/fabric-sdk-go/pkg/errors/multi"
@@ -35,50 +36,54 @@ const (
3536
// An application that requires interaction with multiple channels should create a separate
3637
// instance of the channel client for each channel. Channel client supports non-admin functions only.
3738
type Client struct {
38-
context core.Providers
39-
discovery fab.DiscoveryService
40-
selection fab.SelectionService
39+
context context.Channel
4140
membership fab.ChannelMembership
4241
transactor fab.Transactor
4342
eventHub fab.EventHub
4443
greylist *greylist.Filter
4544
}
4645

47-
// Context holds the providers and services needed to create a Client.
48-
type Context struct {
49-
core.Providers
50-
DiscoveryService fab.DiscoveryService
51-
SelectionService fab.SelectionService
52-
ChannelService fab.ChannelService
46+
type customChannelContext struct {
47+
context.Channel
48+
discoveryService fab.DiscoveryService
49+
}
50+
51+
func (ccc *customChannelContext) DiscoveryService() fab.DiscoveryService {
52+
return ccc.discoveryService
5353
}
5454

5555
// New returns a Client instance.
56-
func New(c Context) (*Client, error) {
56+
func New(c context.Channel) (*Client, error) {
57+
5758
greylistProvider := greylist.New(c.Config().TimeoutOrDefault(core.DiscoveryGreylistExpiry))
5859

59-
eventHub, err := c.ChannelService.EventHub()
60+
if c.ChannelService() == nil {
61+
return nil, errors.New("channel service not initialized")
62+
}
63+
64+
eventHub, err := c.ChannelService().EventHub()
6065
if err != nil {
6166
return nil, errors.WithMessage(err, "event hub creation failed")
6267
}
6368

64-
transactor, err := c.ChannelService.Transactor()
69+
transactor, err := c.ChannelService().Transactor()
6570
if err != nil {
6671
return nil, errors.WithMessage(err, "transactor creation failed")
6772
}
6873

69-
membership, err := c.ChannelService.Membership()
74+
membership, err := c.ChannelService().Membership()
7075
if err != nil {
7176
return nil, errors.WithMessage(err, "membership creation failed")
7277
}
7378

79+
customDiscoveryService := discovery.NewDiscoveryFilterService(c.DiscoveryService(), greylistProvider)
80+
7481
channelClient := Client{
75-
greylist: greylistProvider,
76-
context: c,
77-
discovery: discovery.NewDiscoveryFilterService(c.DiscoveryService, greylistProvider),
78-
selection: c.SelectionService,
82+
context: &customChannelContext{Channel: c, discoveryService: customDiscoveryService},
7983
membership: membership,
8084
transactor: transactor,
8185
eventHub: eventHub,
86+
greylist: greylistProvider,
8287
}
8388

8489
return &channelClient, nil
@@ -157,8 +162,8 @@ func (cc *Client) prepareHandlerContexts(request Request, o opts) (*invoke.Reque
157162
}
158163

159164
clientContext := &invoke.ClientContext{
160-
Selection: cc.selection,
161-
Discovery: cc.discovery,
165+
Selection: cc.context.SelectionService(),
166+
Discovery: cc.context.DiscoveryService(),
162167
Membership: cc.membership,
163168
Transactor: cc.transactor,
164169
EventHub: cc.eventHub,

pkg/client/channel/chclient_test.go

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ import (
1616

1717
"github.com/hyperledger/fabric-sdk-go/pkg/client/channel/invoke"
1818
txnmocks "github.com/hyperledger/fabric-sdk-go/pkg/client/common/mocks"
19-
"github.com/hyperledger/fabric-sdk-go/pkg/context"
19+
"github.com/hyperledger/fabric-sdk-go/pkg/common/context"
20+
contextImpl "github.com/hyperledger/fabric-sdk-go/pkg/context"
2021
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/core"
2122
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
2223
"github.com/hyperledger/fabric-sdk-go/pkg/errors/retry"
@@ -30,6 +31,7 @@ import (
3031

3132
const (
3233
testAddress = "127.0.0.1:47882"
34+
channelID = "testChannel"
3335
)
3436

3537
func TestTxProposalResponseFilter(t *testing.T) {
@@ -449,29 +451,21 @@ func TestMultiErrorPropogation(t *testing.T) {
449451
}
450452

451453
func TestDiscoveryGreylist(t *testing.T) {
454+
452455
testPeer1 := fcmocks.NewMockPeer("Peer1", "http://peer1.com")
453456
testPeer1.Error = status.New(status.EndorserClientStatus,
454457
status.ConnectionFailed.ToInt32(), "test", []interface{}{testPeer1.URL()})
455458

456-
fabCtx := setupTestContext()
457-
458-
orderer := fcmocks.NewMockOrderer("", nil)
459-
testChannelSvc, err := setupTestChannelService(fabCtx, []fab.Orderer{orderer})
459+
selectionService, err := setupTestSelection(nil, nil)
460460
assert.Nil(t, err, "Got error %s", err)
461+
selectionService.SelectAll = true
461462

462463
discoveryService, err := setupTestDiscovery(nil, []fab.Peer{testPeer1})
463464
assert.Nil(t, err, "Got error %s", err)
464465

465-
selectionService, err := setupTestSelection(nil, nil)
466-
assert.Nil(t, err, "Got error %s", err)
467-
selectionService.SelectAll = true
466+
fabCtx := setupCustomTestContext(t, selectionService, discoveryService, nil)
467+
ctx := contextImpl.NewChannel(fabCtx, channelID)
468468

469-
ctx := Context{
470-
Providers: fabCtx,
471-
DiscoveryService: discoveryService,
472-
SelectionService: selectionService,
473-
ChannelService: testChannelSvc,
474-
}
475469
chClient, err := New(ctx)
476470
assert.Nil(t, err, "Got error %s", err)
477471

@@ -491,7 +485,7 @@ func TestDiscoveryGreylist(t *testing.T) {
491485
assert.EqualValues(t, status.NoPeersFound.ToInt32(), s.Code, "expected No Peers Found status on greylist")
492486
assert.Equal(t, 1, testPeer1.ProcessProposalCalls, "expected peer 1 to be greylisted")
493487
// Wait for greylist expiry
494-
time.Sleep(ctx.Config().TimeoutOrDefault(core.DiscoveryGreylistExpiry))
488+
time.Sleep(ctx.Providers().Config().TimeoutOrDefault(core.DiscoveryGreylistExpiry))
495489
testPeer1.ProcessProposalCalls = 0
496490
testPeer1.Error = status.New(status.EndorserServerStatus, int32(common.Status_SERVICE_UNAVAILABLE), "test", nil)
497491
// Try again
@@ -506,20 +500,19 @@ func TestDiscoveryGreylist(t *testing.T) {
506500
}
507501

508502
func setupTestChannelService(ctx context.Client, orderers []fab.Orderer) (fab.ChannelService, error) {
509-
const channelName = "testChannel"
510503
chProvider, err := fcmocks.NewMockChannelProvider(ctx)
511504
if err != nil {
512505
return nil, errors.WithMessage(err, "mock channel provider creation failed")
513506
}
514507

515-
chService, err := chProvider.ChannelService(ctx, channelName)
508+
chService, err := chProvider.ChannelService(ctx, channelID)
516509
if err != nil {
517510
return nil, errors.WithMessage(err, "mock channel service creation failed")
518511
}
519512

520513
transactor := txnmocks.MockTransactor{
521514
Ctx: ctx,
522-
ChannelID: channelName,
515+
ChannelID: channelID,
523516
Orderers: orderers,
524517
}
525518
chService.(*fcmocks.MockChannelService).SetTransactor(&transactor)
@@ -533,6 +526,31 @@ func setupTestContext() context.Client {
533526
return ctx
534527
}
535528

529+
func setupCustomTestContext(t *testing.T, selectionService fab.SelectionService, discoveryService fab.DiscoveryService, orderers []fab.Orderer) context.Client {
530+
user := fcmocks.NewMockUser("test")
531+
ctx := fcmocks.NewMockContext(user)
532+
533+
if orderers == nil {
534+
orderer := fcmocks.NewMockOrderer("", nil)
535+
orderers = []fab.Orderer{orderer}
536+
}
537+
538+
testChannelSvc, err := setupTestChannelService(ctx, orderers)
539+
assert.Nil(t, err, "Got error %s", err)
540+
541+
//Modify for custom mocks to test scenarios
542+
selectionProvider := ctx.MockProviderContext.SelectionProvider()
543+
selectionProvider.(*fcmocks.MockSelectionProvider).SetCustomSelectionService(selectionService)
544+
545+
channelProvider := ctx.MockProviderContext.ChannelProvider()
546+
channelProvider.(*fcmocks.MockChannelProvider).SetCustomChannelService(testChannelSvc)
547+
548+
discoveryProvider := ctx.MockProviderContext.DiscoveryProvider()
549+
discoveryProvider.(*fcmocks.MockStaticDiscoveryProvider).SetCustomDiscoveryService(discoveryService)
550+
551+
return ctx
552+
}
553+
536554
func setupTestDiscovery(discErr error, peers []fab.Peer) (fab.DiscoveryService, error) {
537555

538556
mockDiscovery, err := txnmocks.NewMockDiscoveryProvider(discErr, peers)
@@ -560,11 +578,6 @@ func setupChannelClient(peers []fab.Peer, t *testing.T) *Client {
560578

561579
func setupChannelClientWithError(discErr error, selectionErr error, peers []fab.Peer, t *testing.T) *Client {
562580

563-
fabCtx := setupTestContext()
564-
orderer := fcmocks.NewMockOrderer("", nil)
565-
testChannelSvc, err := setupTestChannelService(fabCtx, []fab.Orderer{orderer})
566-
assert.Nil(t, err, "Got error %s", err)
567-
568581
discoveryService, err := setupTestDiscovery(discErr, nil)
569582
if err != nil {
570583
t.Fatalf("Failed to setup discovery service: %s", err)
@@ -575,12 +588,10 @@ func setupChannelClientWithError(discErr error, selectionErr error, peers []fab.
575588
t.Fatalf("Failed to setup discovery service: %s", err)
576589
}
577590

578-
ctx := Context{
579-
Providers: fabCtx,
580-
DiscoveryService: discoveryService,
581-
SelectionService: selectionService,
582-
ChannelService: testChannelSvc,
583-
}
591+
fabCtx := setupCustomTestContext(t, selectionService, discoveryService, nil)
592+
593+
ctx := contextImpl.NewChannel(fabCtx, channelID)
594+
584595
ch, err := New(ctx)
585596
if err != nil {
586597
t.Fatalf("Failed to create new channel client: %s", err)
@@ -592,22 +603,16 @@ func setupChannelClientWithError(discErr error, selectionErr error, peers []fab.
592603
func setupChannelClientWithNodes(peers []fab.Peer,
593604
orderers []fab.Orderer, t *testing.T) *Client {
594605

595-
fabCtx := setupTestContext()
596-
testChannelSvc, err := setupTestChannelService(fabCtx, orderers)
597-
assert.Nil(t, err, "Got error %s", err)
598-
599606
discoveryService, err := setupTestDiscovery(nil, nil)
600607
assert.Nil(t, err, "Failed to setup discovery service")
601608

602609
selectionService, err := setupTestSelection(nil, peers)
603610
assert.Nil(t, err, "Failed to setup discovery service")
604611

605-
ctx := Context{
606-
Providers: fabCtx,
607-
DiscoveryService: discoveryService,
608-
SelectionService: selectionService,
609-
ChannelService: testChannelSvc,
610-
}
612+
fabCtx := setupCustomTestContext(t, selectionService, discoveryService, orderers)
613+
614+
ctx := contextImpl.NewChannel(fabCtx, channelID)
615+
611616
ch, err := New(ctx)
612617
assert.Nil(t, err, "Failed to create new channel client")
613618

pkg/client/channel/invoke/txnhandler_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
"github.com/stretchr/testify/assert"
1616

1717
txnmocks "github.com/hyperledger/fabric-sdk-go/pkg/client/common/mocks"
18-
"github.com/hyperledger/fabric-sdk-go/pkg/context"
18+
"github.com/hyperledger/fabric-sdk-go/pkg/common/context"
1919
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
2020
fcmocks "github.com/hyperledger/fabric-sdk-go/pkg/fab/mocks"
2121
)

pkg/client/common/mocks/mocktransactor.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ SPDX-License-Identifier: Apache-2.0
77
package mocks
88

99
import (
10-
"github.com/hyperledger/fabric-sdk-go/pkg/context"
10+
"github.com/hyperledger/fabric-sdk-go/pkg/common/context"
1111
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
1212
"github.com/hyperledger/fabric-sdk-go/pkg/fab/txn"
1313
"github.com/pkg/errors"

pkg/client/ledger/ledger.go

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ import (
1212
"time"
1313

1414
"github.com/golang/protobuf/proto"
15-
"github.com/hyperledger/fabric-sdk-go/pkg/context"
16-
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/core"
15+
"github.com/hyperledger/fabric-sdk-go/pkg/common/context"
1716
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
1817
"github.com/hyperledger/fabric-sdk-go/pkg/fab/channel"
1918
"github.com/hyperledger/fabric-sdk-go/pkg/fab/chconfig"
@@ -36,27 +35,13 @@ const (
3635
// An application that requires interaction with multiple channels should create a separate
3736
// instance of the ledger client for each channel. Ledger client supports specific queries only.
3837
type Client struct {
39-
provider core.Providers
40-
identity context.Identity
38+
context context.Client
4139
discovery fab.DiscoveryService
4240
ledger *channel.Ledger
4341
filter TargetFilter
4442
chName string
4543
}
4644

47-
// Context holds the providers and services needed to create a Client.
48-
type Context struct {
49-
core.Providers
50-
context.Identity
51-
DiscoveryService fab.DiscoveryService
52-
ChannelService fab.ChannelService
53-
}
54-
55-
type fabContext struct {
56-
core.Providers
57-
context.Identity
58-
}
59-
6045
// MSPFilter is default filter
6146
type MSPFilter struct {
6247
mspID string
@@ -68,17 +53,21 @@ func (f *MSPFilter) Accept(peer fab.Peer) bool {
6853
}
6954

7055
// New returns a Client instance.
71-
func New(c Context, chName string, opts ...ClientOption) (*Client, error) {
56+
func New(c context.Client, chName string, opts ...ClientOption) (*Client, error) {
7257

7358
l, err := channel.NewLedger(c, chName)
7459
if err != nil {
7560
return nil, err
7661
}
7762

63+
discoveryService, err := c.DiscoveryProvider().NewDiscoveryService(chName)
64+
if err != nil {
65+
return nil, err
66+
}
67+
7868
ledgerClient := Client{
79-
provider: c,
80-
identity: c,
81-
discovery: c.DiscoveryService,
69+
context: c,
70+
discovery: discoveryService,
8271
ledger: l,
8372
chName: chName,
8473
}
@@ -284,12 +273,7 @@ func (c *Client) QueryConfig(options ...RequestOption) (fab.ChannelCfg, error) {
284273
return nil, errors.WithMessage(err, "failed to determine target peers for QueryConfig")
285274
}
286275

287-
ctx := fabContext{
288-
Providers: c.provider,
289-
Identity: c.identity,
290-
}
291-
292-
channelConfig, err := chconfig.New(ctx, c.chName, chconfig.WithPeers(targets), chconfig.WithMinResponses(opts.MinTargets))
276+
channelConfig, err := chconfig.New(c.context, c.chName, chconfig.WithPeers(targets), chconfig.WithMinResponses(opts.MinTargets))
293277
if err != nil {
294278
return nil, errors.WithMessage(err, "QueryConfig failed")
295279
}

0 commit comments

Comments
 (0)