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

Commit 5fd3e98

Browse files
committed
[FABG-824] Allow for provider-specific options
Added a 'WithProviderOptions' option in the SDK to allow for provider-specific options. Change-Id: Ib75b948e3a0bd82ce971adf388fca33889647db9 Signed-off-by: Bob Stasyszyn <Bob.Stasyszyn@securekey.com>
1 parent bda01c9 commit 5fd3e98

File tree

17 files changed

+152
-86
lines changed

17 files changed

+152
-86
lines changed

pkg/client/common/discovery/dynamicdiscovery/opts.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func WithRefreshInterval(value time.Duration) coptions.Opt {
2323
return func(p coptions.Params) {
2424
logger.Debug("Checking refreshIntervalSetter")
2525
if setter, ok := p.(refreshIntervalSetter); ok {
26-
setter.SetRefreshInterval(value)
26+
setter.SetDiscoveryRefreshInterval(value)
2727
}
2828
}
2929
}
@@ -33,25 +33,25 @@ func WithResponseTimeout(value time.Duration) coptions.Opt {
3333
return func(p coptions.Params) {
3434
logger.Debug("Checking responseTimeoutSetter")
3535
if setter, ok := p.(responseTimeoutSetter); ok {
36-
setter.SetResponseTimeout(value)
36+
setter.SetDiscoveryResponseTimeout(value)
3737
}
3838
}
3939
}
4040

4141
type refreshIntervalSetter interface {
42-
SetRefreshInterval(value time.Duration)
42+
SetDiscoveryRefreshInterval(value time.Duration)
4343
}
4444

4545
type responseTimeoutSetter interface {
46-
SetResponseTimeout(value time.Duration)
46+
SetDiscoveryResponseTimeout(value time.Duration)
4747
}
4848

49-
func (o *options) SetRefreshInterval(value time.Duration) {
49+
func (o *options) SetDiscoveryRefreshInterval(value time.Duration) {
5050
logger.Debugf("RefreshInterval: %s", value)
5151
o.refreshInterval = value
5252
}
5353

54-
func (o *options) SetResponseTimeout(value time.Duration) {
54+
func (o *options) SetDiscoveryResponseTimeout(value time.Duration) {
5555
logger.Debugf("ResponseTimeout: %s", value)
5656
o.responseTimeout = value
5757
}

pkg/client/common/selection/fabricselection/opts.go

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"time"
1111

1212
"github.com/hyperledger/fabric-sdk-go/pkg/common/errors/retry"
13-
1413
coptions "github.com/hyperledger/fabric-sdk-go/pkg/common/options"
1514
)
1615

@@ -26,7 +25,7 @@ func WithRefreshInterval(value time.Duration) coptions.Opt {
2625
return func(p coptions.Params) {
2726
logger.Debug("Checking refreshIntervalSetter")
2827
if setter, ok := p.(refreshIntervalSetter); ok {
29-
setter.SetRefreshInterval(value)
28+
setter.SetSelectionRefreshInterval(value)
3029
}
3130
}
3231
}
@@ -36,7 +35,7 @@ func WithResponseTimeout(value time.Duration) coptions.Opt {
3635
return func(p coptions.Params) {
3736
logger.Debug("Checking responseTimeoutSetter")
3837
if setter, ok := p.(responseTimeoutSetter); ok {
39-
setter.SetResponseTimeout(value)
38+
setter.SetSelectionResponseTimeout(value)
4039
}
4140
}
4241
}
@@ -47,34 +46,34 @@ func WithRetryOpts(value retry.Opts) coptions.Opt {
4746
return func(p coptions.Params) {
4847
logger.Debug("Checking retryOptsSetter")
4948
if setter, ok := p.(retryOptsSetter); ok {
50-
setter.SetRetryOpts(value)
49+
setter.SetSelectionRetryOpts(value)
5150
}
5251
}
5352
}
5453

5554
type refreshIntervalSetter interface {
56-
SetRefreshInterval(value time.Duration)
55+
SetSelectionRefreshInterval(value time.Duration)
5756
}
5857

5958
type responseTimeoutSetter interface {
60-
SetResponseTimeout(value time.Duration)
59+
SetSelectionResponseTimeout(value time.Duration)
6160
}
6261

6362
type retryOptsSetter interface {
64-
SetRetryOpts(value retry.Opts)
63+
SetSelectionRetryOpts(value retry.Opts)
6564
}
6665

67-
func (o *params) SetRefreshInterval(value time.Duration) {
66+
func (o *params) SetSelectionRefreshInterval(value time.Duration) {
6867
logger.Debugf("RefreshInterval: %s", value)
6968
o.refreshInterval = value
7069
}
7170

72-
func (o *params) SetResponseTimeout(value time.Duration) {
71+
func (o *params) SetSelectionResponseTimeout(value time.Duration) {
7372
logger.Debugf("ResponseTimeout: %s", value)
7473
o.responseTimeout = value
7574
}
7675

77-
func (o *params) SetRetryOpts(value retry.Opts) {
76+
func (o *params) SetSelectionRetryOpts(value retry.Opts) {
7877
logger.Debugf("RetryOpts: %#v", value)
7978
o.retryOpts = value
8079
}

pkg/fab/chconfig/cache.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@ SPDX-License-Identifier: Apache-2.0
77
package chconfig
88

99
import (
10-
"time"
11-
10+
"github.com/hyperledger/fabric-sdk-go/pkg/common/options"
1211
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/fab"
1312
"github.com/hyperledger/fabric-sdk-go/pkg/util/concurrent/lazycache"
14-
1513
"github.com/pkg/errors"
1614
)
1715

@@ -46,13 +44,13 @@ func NewCacheKey(ctx fab.ClientContext, pvdr Provider, channelID string) (CacheK
4644

4745
// NewRefCache a cache of channel config references that refreshed with the
4846
// given interval
49-
func NewRefCache(refresh time.Duration) *lazycache.Cache {
47+
func NewRefCache(opts ...options.Opt) *lazycache.Cache {
5048
initializer := func(key lazycache.Key) (interface{}, error) {
5149
ck, ok := key.(CacheKey)
5250
if !ok {
5351
return nil, errors.New("unexpected cache key")
5452
}
55-
return NewRef(refresh, ck.Provider(), ck.ChannelID(), ck.Context()), nil
53+
return NewRef(ck.Context(), ck.Provider(), ck.ChannelID(), opts...), nil
5654
}
5755

5856
return lazycache.New("Channel_Cfg_Cache", initializer)

pkg/fab/chconfig/cache_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func TestChannelConfigCache(t *testing.T) {
2626
user := mspmocks.NewMockSigningIdentity("user", "user")
2727
clientCtx := mocks.NewMockContext(user)
2828

29-
cache := NewRefCache(time.Millisecond * 10)
29+
cache := NewRefCache(WithRefreshInterval(time.Millisecond * 10))
3030
assert.NotNil(t, cache)
3131

3232
key, err := NewCacheKey(clientCtx, mockProvider, "test")
@@ -42,7 +42,7 @@ func TestChannelConfigCacheBad(t *testing.T) {
4242
user := mspmocks.NewMockSigningIdentity("user", "user")
4343
clientCtx := mocks.NewMockContext(user)
4444

45-
cache := NewRefCache(time.Millisecond * 10)
45+
cache := NewRefCache(WithRefreshInterval(time.Millisecond * 10))
4646
assert.NotNil(t, cache)
4747

4848
r, err := cache.Get(&badKey{s: "test"})
@@ -54,7 +54,7 @@ func TestChannelConfigCacheBad(t *testing.T) {
5454
assert.Nil(t, err)
5555
assert.NotNil(t, key)
5656

57-
cache = NewRefCache(time.Millisecond * 10)
57+
cache = NewRefCache(WithRefreshInterval(time.Millisecond * 10))
5858
assert.NotNil(t, cache)
5959

6060
r, err = cache.Get(key)

pkg/fab/chconfig/chconfig.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ import (
1212
"regexp"
1313

1414
"github.com/golang/protobuf/proto"
15-
"github.com/pkg/errors"
16-
1715
channelConfig "github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric/common/channelconfig"
1816
imsp "github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric/msp"
1917
"github.com/hyperledger/fabric-sdk-go/pkg/common/errors/retry"
@@ -27,6 +25,7 @@ import (
2725
"github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/common"
2826
mb "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/msp"
2927
pb "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/peer"
28+
"github.com/pkg/errors"
3029
)
3130

3231
var logger = logging.NewLogger("fabsdk/fab")

pkg/fab/chconfig/opts.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
Copyright SecureKey Technologies Inc. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package chconfig
8+
9+
import (
10+
"time"
11+
12+
coptions "github.com/hyperledger/fabric-sdk-go/pkg/common/options"
13+
)
14+
15+
const (
16+
defaultRefreshInterval = time.Second * 90
17+
)
18+
19+
type params struct {
20+
refreshInterval time.Duration
21+
}
22+
23+
func newDefaultParams() *params {
24+
return &params{
25+
refreshInterval: defaultRefreshInterval,
26+
}
27+
}
28+
29+
// WithRefreshInterval sets the interval in which the
30+
// channel config cache is refreshed
31+
func WithRefreshInterval(value time.Duration) coptions.Opt {
32+
return func(p coptions.Params) {
33+
if setter, ok := p.(refreshIntervalSetter); ok {
34+
setter.SetChConfigRefreshInterval(value)
35+
}
36+
}
37+
}
38+
39+
type refreshIntervalSetter interface {
40+
SetChConfigRefreshInterval(value time.Duration)
41+
}
42+
43+
func (o *params) SetChConfigRefreshInterval(value time.Duration) {
44+
logger.Debugf("RefreshInterval: %s", value)
45+
o.refreshInterval = value
46+
}

pkg/fab/chconfig/reference.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ SPDX-License-Identifier: Apache-2.0
77
package chconfig
88

99
import (
10-
"time"
11-
10+
"github.com/hyperledger/fabric-sdk-go/pkg/common/options"
1211
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/fab"
1312
contextImpl "github.com/hyperledger/fabric-sdk-go/pkg/context"
1413
"github.com/hyperledger/fabric-sdk-go/pkg/util/concurrent/lazyref"
@@ -23,8 +22,14 @@ type Ref struct {
2322
channelID string
2423
}
2524

25+
// ChannelConfigError is returned when the channel config could not be refreshed
26+
type ChannelConfigError error
27+
2628
// NewRef returns a new channel config reference
27-
func NewRef(refresh time.Duration, pvdr Provider, channel string, ctx fab.ClientContext) *Ref {
29+
func NewRef(ctx fab.ClientContext, pvdr Provider, channel string, opts ...options.Opt) *Ref {
30+
params := newDefaultParams()
31+
options.Apply(params, opts)
32+
2833
cfgRef := &Ref{
2934
pvdr: pvdr,
3035
ctx: ctx,
@@ -33,7 +38,7 @@ func NewRef(refresh time.Duration, pvdr Provider, channel string, ctx fab.Client
3338

3439
cfgRef.Reference = lazyref.New(
3540
cfgRef.initializer(),
36-
lazyref.WithRefreshInterval(lazyref.InitImmediately, refresh),
41+
lazyref.WithRefreshInterval(lazyref.InitImmediately, params.refreshInterval),
3742
)
3843

3944
return cfgRef

pkg/fabsdk/api/factory.go

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

99
import (
10+
"github.com/hyperledger/fabric-sdk-go/pkg/common/options"
1011
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/core"
1112
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/fab"
1213
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/msp"
@@ -35,5 +36,5 @@ type MSPProviderFactory interface {
3536
// ServiceProviderFactory allows overriding default service providers (such as peer discovery)
3637
type ServiceProviderFactory interface {
3738
CreateLocalDiscoveryProvider(config fab.EndpointConfig) (fab.LocalDiscoveryProvider, error)
38-
CreateChannelProvider(config fab.EndpointConfig) (fab.ChannelProvider, error)
39+
CreateChannelProvider(config fab.EndpointConfig, opts ...options.Opt) (fab.ChannelProvider, error)
3940
}

pkg/fabsdk/fabsdk.go

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

1414
"github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric/core/operations"
15-
contextApi "github.com/hyperledger/fabric-sdk-go/pkg/common/providers/context"
16-
"github.com/hyperledger/fabric-sdk-go/pkg/context"
17-
"github.com/hyperledger/fabric-sdk-go/pkg/core/config/lookup"
18-
"github.com/hyperledger/fabric-sdk-go/pkg/core/logging/api"
19-
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/metrics"
20-
2115
"github.com/hyperledger/fabric-sdk-go/pkg/common/logging"
16+
coptions "github.com/hyperledger/fabric-sdk-go/pkg/common/options"
17+
contextApi "github.com/hyperledger/fabric-sdk-go/pkg/common/providers/context"
2218
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/core"
2319
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/fab"
2420
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/msp"
21+
"github.com/hyperledger/fabric-sdk-go/pkg/context"
22+
"github.com/hyperledger/fabric-sdk-go/pkg/core/config/lookup"
2523
"github.com/hyperledger/fabric-sdk-go/pkg/core/cryptosuite"
24+
"github.com/hyperledger/fabric-sdk-go/pkg/core/logging/api"
2625
fabImpl "github.com/hyperledger/fabric-sdk-go/pkg/fab"
2726
sdkApi "github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/api"
27+
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/metrics"
2828
metricsCfg "github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/metrics/cfg"
2929
mspImpl "github.com/hyperledger/fabric-sdk-go/pkg/msp"
3030
"github.com/pkg/errors"
@@ -57,6 +57,7 @@ type options struct {
5757
endpointConfig fab.EndpointConfig
5858
IdentityConfig msp.IdentityConfig
5959
ConfigBackend []core.ConfigBackend
60+
ProviderOpts []coptions.Opt // Provider options are passed along to the various providers
6061
metricsConfig metricsCfg.MetricsConfig
6162
}
6263

@@ -202,6 +203,14 @@ func WithMetricsConfig(metricsConfigs ...interface{}) Option {
202203
}
203204
}
204205

206+
// WithProviderOpts adds options which are propagated to the various providers.
207+
func WithProviderOpts(sopts ...coptions.Opt) Option {
208+
return func(opts *options) error {
209+
opts.ProviderOpts = append(opts.ProviderOpts, sopts...)
210+
return nil
211+
}
212+
}
213+
205214
// providerInit interface allows for initializing providers
206215
// TODO: minimize interface
207216
type providerInit interface {
@@ -261,7 +270,7 @@ func initSDK(sdk *FabricSDK, configProvider core.ConfigProvider, opts []Option)
261270
return errors.WithMessage(err, "failed to create local discovery provider")
262271
}
263272

264-
channelProvider, err := sdk.opts.Service.CreateChannelProvider(cfg.endpointConfig)
273+
channelProvider, err := sdk.opts.Service.CreateChannelProvider(cfg.endpointConfig, sdk.opts.ProviderOpts...)
265274
if err != nil {
266275
return errors.WithMessage(err, "failed to create channel provider")
267276
}

pkg/fabsdk/factory/defsvc/svcfactory.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ SPDX-License-Identifier: Apache-2.0
77
package defsvc
88

99
import (
10-
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/fab"
11-
1210
discovery "github.com/hyperledger/fabric-sdk-go/pkg/client/common/discovery/staticdiscovery"
11+
"github.com/hyperledger/fabric-sdk-go/pkg/common/options"
12+
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/fab"
1313
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/provider/chpvdr"
1414
)
1515

@@ -29,6 +29,6 @@ func (f *ProviderFactory) CreateLocalDiscoveryProvider(config fab.EndpointConfig
2929
}
3030

3131
// CreateChannelProvider returns a new default implementation of channel provider
32-
func (f *ProviderFactory) CreateChannelProvider(config fab.EndpointConfig) (fab.ChannelProvider, error) {
33-
return chpvdr.New(config)
32+
func (f *ProviderFactory) CreateChannelProvider(config fab.EndpointConfig, opts ...options.Opt) (fab.ChannelProvider, error) {
33+
return chpvdr.New(config, opts...)
3434
}

0 commit comments

Comments
 (0)