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

Commit 2b9159f

Browse files
committed
[FAB-6759] Selection Service (Static)
  Change-Id: I377cd948f962f5f6029988df2866204b6a75333a Signed-off-by: Sandra Vrtikapa <sandra.vrtikapa@securekey.com>
1 parent aafbea2 commit 2b9159f

File tree

21 files changed

+367
-253
lines changed

21 files changed

+367
-253
lines changed

api/apifabclient/discoveryprovider.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ package apifabclient
88

99
// DiscoveryProvider is used to discover peers on the network
1010
type DiscoveryProvider interface {
11-
NewDiscoveryService(channel Channel) (DiscoveryService, error)
11+
NewDiscoveryService(channelID string) (DiscoveryService, error)
1212
}
1313

1414
// DiscoveryService is used to discover eligible peers on specific channel
1515
type DiscoveryService interface {
16-
GetPeers(chaincodeID string) ([]Peer, error)
16+
GetPeers() ([]Peer, error)
1717
}

api/apifabclient/peer.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,6 @@ import (
2828
type Peer interface {
2929
txn.ProposalProcessor
3030

31-
// Events (need verb)
32-
ConnectEventSource()
33-
IsEventListened(event string, channel Channel) (bool, error)
34-
AddListener(eventType string, eventTypeData interface{}, eventCallback interface{}) (string, error)
35-
RemoveListener(eventListenerRef string) (bool, error)
36-
3731
// ECert Client (need verb)
3832
EnrollmentCertificate() *pem.Block
3933
SetEnrollmentCertificate(pem *pem.Block)
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
Copyright SecureKey Technologies Inc. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package apifabclient
8+
9+
// SelectionProvider is used to select peers for endorsement
10+
type SelectionProvider interface {
11+
NewSelectionService(channelID string) (SelectionService, error)
12+
}
13+
14+
// SelectionService selects peers for endorsement and commit events
15+
type SelectionService interface {
16+
// GetEndorsersForChaincode returns a set of peers that should satisfy the endorsement
17+
// policies of all of the given chaincodes
18+
GetEndorsersForChaincode(channelPeers []Peer, chaincodeIDs ...string) ([]Peer, error)
19+
}

def/fabapi/context/context.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type SDK interface {
1818
StateStoreProvider() fab.KeyValueStore
1919
ConfigProvider() apiconfig.Config
2020
DiscoveryProvider() fab.DiscoveryProvider
21+
SelectionProvider() fab.SelectionProvider
2122
SigningManager() fab.SigningManager
2223
}
2324

def/fabapi/context/defprovider/sdk.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ import (
1515
"github.com/hyperledger/fabric-sdk-go/pkg/errors"
1616
kvs "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/keyvaluestore"
1717
signingMgr "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/signingmgr"
18-
discovery "github.com/hyperledger/fabric-sdk-go/pkg/fabric-txn/discovery"
18+
discovery "github.com/hyperledger/fabric-sdk-go/pkg/fabric-txn/discovery/staticdiscovery"
19+
selection "github.com/hyperledger/fabric-sdk-go/pkg/fabric-txn/selection/staticselection"
1920
"github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/bccsp"
2021
bccspFactory "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/bccsp/factory"
2122
)
@@ -66,5 +67,9 @@ func (f *DefaultProviderFactory) NewSigningManager(cryptoProvider bccsp.BCCSP, c
6667
// NewDiscoveryProvider returns a new default implementation of discovery provider
6768
func (f *DefaultProviderFactory) NewDiscoveryProvider(config apiconfig.Config) (fab.DiscoveryProvider, error) {
6869
return discovery.NewDiscoveryProvider(config)
70+
}
6971

72+
// NewSelectionProvider returns a new default implementation of selection service
73+
func (f *DefaultProviderFactory) NewSelectionProvider(config apiconfig.Config) (fab.SelectionProvider, error) {
74+
return selection.NewSelectionProvider(config)
7075
}

def/fabapi/context/defprovider/session.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,30 +41,37 @@ func (f *SessionClientFactory) NewSystemClient(sdk context.SDK, session context.
4141
}
4242

4343
// NewChannelClient returns a client that can execute transactions on specified channel
44-
func (f *SessionClientFactory) NewChannelClient(sdk context.SDK, session context.Session, config apiconfig.Config, channelName string) (apitxn.ChannelClient, error) {
44+
func (f *SessionClientFactory) NewChannelClient(sdk context.SDK, session context.Session, config apiconfig.Config, channelID string) (apitxn.ChannelClient, error) {
45+
46+
// TODO: Add capablity to override sdk's selection and discovery provider
4547

4648
client := clientImpl.NewClient(sdk.ConfigProvider())
4749
client.SetCryptoSuite(sdk.CryptoSuiteProvider())
4850
client.SetStateStore(sdk.StateStoreProvider())
4951
client.SetUserContext(session.Identity())
5052
client.SetSigningManager(sdk.SigningManager())
5153

52-
channel, err := getChannel(client, channelName)
54+
channel, err := getChannel(client, channelID)
5355
if err != nil {
5456
return nil, errors.WithMessage(err, "create channel failed")
5557
}
5658

57-
discovery, err := sdk.DiscoveryProvider().NewDiscoveryService(channel)
59+
discovery, err := sdk.DiscoveryProvider().NewDiscoveryService(channelID)
5860
if err != nil {
5961
return nil, errors.WithMessage(err, "create discovery service failed")
6062
}
6163

62-
eventHub, err := getEventHub(client, channelName, session)
64+
selection, err := sdk.SelectionProvider().NewSelectionService(channelID)
65+
if err != nil {
66+
return nil, errors.WithMessage(err, "create selection service failed")
67+
}
68+
69+
eventHub, err := getEventHub(client, channelID, session)
6370
if err != nil {
6471
return nil, errors.WithMessage(err, "getEventHub failed")
6572
}
6673

67-
return chImpl.NewChannelClient(client, channel, discovery, eventHub)
74+
return chImpl.NewChannelClient(client, channel, discovery, selection, eventHub)
6875
}
6976

7077
// getChannel is helper method to initializes and returns a channel based on config

def/fabapi/context/provider.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type SDKProviderFactory interface {
2323
NewCryptoSuiteProvider(config *bccspFactory.FactoryOpts) (bccsp.BCCSP, error)
2424
NewSigningManager(cryptoProvider bccsp.BCCSP, config apiconfig.Config) (fab.SigningManager, error)
2525
NewDiscoveryProvider(config apiconfig.Config) (fab.DiscoveryProvider, error)
26+
NewSelectionProvider(config apiconfig.Config) (fab.SelectionProvider, error)
2627
}
2728

2829
// OrgClientFactory allows overriding default clients and providers of an organization
@@ -35,5 +36,5 @@ type OrgClientFactory interface {
3536
// SessionClientFactory allows overriding default clients and providers of a session
3637
type SessionClientFactory interface {
3738
NewSystemClient(context SDK, session Session, config apiconfig.Config) (fab.FabricClient, error)
38-
NewChannelClient(context SDK, session Session, config apiconfig.Config, channelName string) (txn.ChannelClient, error)
39+
NewChannelClient(context SDK, session Session, config apiconfig.Config, channelID string) (txn.ChannelClient, error)
3940
}

def/fabapi/fabapi.go

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ type FabricSDK struct {
4646
stateStore apifabclient.KeyValueStore
4747
cryptoSuite bccsp.BCCSP // TODO - maybe copy this interface into the API package
4848
discoveryProvider apifabclient.DiscoveryProvider
49+
selectionProvider apifabclient.SelectionProvider
4950
signingManager apifabclient.SigningManager
5051
}
5152

@@ -55,6 +56,11 @@ type ChannelClientOpts struct {
5556
ConfigProvider apiconfig.Config
5657
}
5758

59+
// ProviderInit interface allows for initializing providers
60+
type ProviderInit interface {
61+
Initialize(sdk *FabricSDK) error
62+
}
63+
5864
// NewSDK initializes default clients
5965
func NewSDK(options Options) (*FabricSDK, error) {
6066
// Construct SDK opts from the quick access options in setup
@@ -98,19 +104,32 @@ func NewSDK(options Options) (*FabricSDK, error) {
98104
}
99105
sdk.stateStore = store
100106

107+
// Initialize Signing Manager
108+
signingMgr, err := sdk.ProviderFactory.NewSigningManager(sdk.CryptoSuiteProvider(), sdk.configProvider)
109+
if err != nil {
110+
return nil, errors.WithMessage(err, "failed to initialize signing manager")
111+
}
112+
sdk.signingManager = signingMgr
113+
101114
// Initialize discovery provider
102115
discoveryProvider, err := sdk.ProviderFactory.NewDiscoveryProvider(sdk.configProvider)
103116
if err != nil {
104117
return nil, errors.WithMessage(err, "failed to initialize discovery provider")
105118
}
119+
if pi, ok := discoveryProvider.(ProviderInit); ok {
120+
pi.Initialize(&sdk)
121+
}
106122
sdk.discoveryProvider = discoveryProvider
107123

108-
// Initialize Signing Manager
109-
signingMgr, err := sdk.ProviderFactory.NewSigningManager(sdk.CryptoSuiteProvider(), sdk.configProvider)
124+
// Initialize selection provider (for selecting endorsing peers)
125+
selectionProvider, err := sdk.ProviderFactory.NewSelectionProvider(sdk.configProvider)
110126
if err != nil {
111-
return nil, errors.WithMessage(err, "failed to initialize signing manager")
127+
return nil, errors.WithMessage(err, "failed to initialize selection provider")
112128
}
113-
sdk.signingManager = signingMgr
129+
if pi, ok := selectionProvider.(ProviderInit); ok {
130+
pi.Initialize(&sdk)
131+
}
132+
sdk.selectionProvider = selectionProvider
114133

115134
return &sdk, nil
116135
}
@@ -135,6 +154,11 @@ func (sdk *FabricSDK) DiscoveryProvider() apifabclient.DiscoveryProvider {
135154
return sdk.discoveryProvider
136155
}
137156

157+
// SelectionProvider returns selection provider
158+
func (sdk *FabricSDK) SelectionProvider() apifabclient.SelectionProvider {
159+
return sdk.selectionProvider
160+
}
161+
138162
// SigningManager returns signing manager
139163
func (sdk *FabricSDK) SigningManager() apifabclient.SigningManager {
140164
return sdk.signingManager
@@ -165,7 +189,7 @@ func (sdk *FabricSDK) NewSystemClient(s context.Session) (apifabclient.FabricCli
165189
}
166190

167191
// NewChannelClient returns a new client for a channel
168-
func (sdk *FabricSDK) NewChannelClient(channelName string, userName string) (apitxn.ChannelClient, error) {
192+
func (sdk *FabricSDK) NewChannelClient(channelID string, userName string) (apitxn.ChannelClient, error) {
169193

170194
// Read default org name from configuration
171195
client, err := sdk.configProvider.Client()
@@ -179,11 +203,11 @@ func (sdk *FabricSDK) NewChannelClient(channelName string, userName string) (api
179203

180204
opt := &ChannelClientOpts{OrgName: client.Organization, ConfigProvider: sdk.configProvider}
181205

182-
return sdk.NewChannelClientWithOpts(channelName, userName, opt)
206+
return sdk.NewChannelClientWithOpts(channelID, userName, opt)
183207
}
184208

185209
// NewChannelClientWithOpts returns a new client for a channel (user has to be pre-enrolled)
186-
func (sdk *FabricSDK) NewChannelClientWithOpts(channelName string, userName string, opt *ChannelClientOpts) (apitxn.ChannelClient, error) {
210+
func (sdk *FabricSDK) NewChannelClientWithOpts(channelID string, userName string, opt *ChannelClientOpts) (apitxn.ChannelClient, error) {
187211

188212
if opt == nil || opt.OrgName == "" {
189213
return nil, errors.New("organization name must be provided")
@@ -199,7 +223,7 @@ func (sdk *FabricSDK) NewChannelClientWithOpts(channelName string, userName stri
199223
configProvider = opt.ConfigProvider
200224
}
201225

202-
client, err := sdk.SessionFactory.NewChannelClient(sdk, session, configProvider, channelName)
226+
client, err := sdk.SessionFactory.NewChannelClient(sdk, session, configProvider, channelID)
203227
if err != nil {
204228
return nil, errors.WithMessage(err, "failed to created new channel client")
205229
}

pkg/fabric-client/credentialmgr/credentialmgr_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func TestCredentialManager(t *testing.T) {
1717

1818
config, err := config.InitConfig("../../../test/fixtures/config/config_test.yaml")
1919
if err != nil {
20-
t.Log(err.Error())
20+
t.Fatalf(err.Error())
2121
}
2222

2323
credentialMgr, err := NewCredentialManager("Org1", config, &fcmocks.MockCryptoSuite{})
@@ -46,7 +46,7 @@ func TestInvalidOrgCredentialManager(t *testing.T) {
4646

4747
config, err := config.InitConfig("../../../test/fixtures/config/config_test.yaml")
4848
if err != nil {
49-
t.Log(err.Error())
49+
t.Fatalf(err.Error())
5050
}
5151

5252
// Invalid Org

pkg/fabric-client/mocks/mockpeer.go

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,8 @@ package mocks
1010
import (
1111
"encoding/pem"
1212

13-
fab "github.com/hyperledger/fabric-sdk-go/api/apifabclient"
1413
"github.com/hyperledger/fabric-sdk-go/api/apitxn"
1514
pb "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/peer"
16-
17-
"github.com/hyperledger/fabric-sdk-go/pkg/errors"
1815
)
1916

2017
// MockPeer is a mock fabricsdk.Peer.
@@ -24,26 +21,13 @@ type MockPeer struct {
2421
MockRoles []string
2522
MockCert *pem.Block
2623
Payload []byte
24+
MockMSP string
2725
}
2826

29-
// ConnectEventSource does not connect anywhere
30-
func (p *MockPeer) ConnectEventSource() {
31-
// done.
32-
}
33-
34-
// IsEventListened always returns true
35-
func (p *MockPeer) IsEventListened(event string, chain fab.Channel) (bool, error) {
36-
return true, nil
37-
}
38-
39-
// AddListener is not implemented
40-
func (p *MockPeer) AddListener(eventType string, eventTypeData interface{}, eventCallback interface{}) (string, error) {
41-
return "", errors.New("Not implemented")
42-
}
43-
44-
// RemoveListener is not implemented
45-
func (p *MockPeer) RemoveListener(eventListenerRef string) (bool, error) {
46-
return false, errors.New("Not implemented")
27+
// NewMockPeer creates basic mock peer
28+
func NewMockPeer(name string, url string) *MockPeer {
29+
mp := &MockPeer{MockName: name, MockURL: url}
30+
return mp
4731
}
4832

4933
// Name returns the mock peer's mock name
@@ -58,11 +42,12 @@ func (p *MockPeer) SetName(name string) {
5842

5943
// MSPID gets the Peer mspID.
6044
func (p *MockPeer) MSPID() string {
61-
return ""
45+
return p.MockMSP
6246
}
6347

6448
// SetMSPID sets the Peer mspID.
6549
func (p *MockPeer) SetMSPID(mspID string) {
50+
p.MockMSP = mspID
6651
}
6752

6853
// Roles returns the mock peer's mock roles

0 commit comments

Comments
 (0)