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

Commit 199cc9d

Browse files
committed
[FAB-7827] Use ConfigProvider interface
This patch allows fabsdk.New to capture configuration errors. By capturing these errors, boiler plate is reduced. Change-Id: Ib7226d61b35783044cb6e5307ebee769aac4eb99 Signed-off-by: Troy Ronda <troy@troyronda.com>
1 parent 5843985 commit 199cc9d

File tree

29 files changed

+219
-352
lines changed

29 files changed

+219
-352
lines changed

api/apiconfig/configprovider.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ type Config interface {
5252
TLSClientCerts() ([]tls.Certificate, error)
5353
}
5454

55+
// ConfigProvider enables creation of a Config instance
56+
type ConfigProvider func() (Config, error)
57+
5558
// TimeoutType enumerates the different types of outgoing connections
5659
type TimeoutType int
5760

def/fabapi/deprecated.go

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ type StateStoreOpts struct {
4545
Path string
4646
}
4747

48-
func configFromOptions(options *Options) (apiconfig.Config, error) {
48+
func configFromOptions(options *Options) apiconfig.ConfigProvider {
4949
if options.ConfigByte != nil {
5050
return config.FromRaw(options.ConfigByte, options.ConfigType)
5151
}
@@ -54,19 +54,15 @@ func configFromOptions(options *Options) (apiconfig.Config, error) {
5454
return config.FromFile(options.ConfigFile)
5555
}
5656

57-
return nil, errors.New("No configuration provided")
57+
return func() (apiconfig.Config, error) {
58+
return nil, errors.New("No configuration provided")
59+
}
5860
}
5961

6062
// NewSDK wraps the NewSDK func moved to the pkg folder.
6163
// Notice: this wrapper is deprecated and will be removed.
6264
func NewSDK(options Options) (*fabsdk.FabricSDK, error) {
63-
configProvider, err := configFromOptions(&options)
64-
if err != nil {
65-
return nil, err
66-
}
67-
68-
sdk, err := fabsdk.New(
69-
configProvider,
65+
sdk, err := fabsdk.New(configFromOptions(&options),
7066
sdkOptionsFromDeprecatedOptions(options)...)
7167

7268
if err != nil {

def/factory/defclient/orgfactory_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func TestNewMSPClient(t *testing.T) {
4141
func TestNewCredentialManager(t *testing.T) {
4242
factory := NewOrgClientFactory()
4343

44-
config, err := config.FromFile("../../../test/fixtures/config/config_test.yaml")
44+
config, err := config.FromFile("../../../test/fixtures/config/config_test.yaml")()
4545
if err != nil {
4646
t.Fatalf(err.Error())
4747
}

def/factory/defclient/sessfactory_test.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/hyperledger/fabric-sdk-go/api/apicryptosuite"
1818
"github.com/hyperledger/fabric-sdk-go/api/apifabclient"
1919
"github.com/hyperledger/fabric-sdk-go/def/factory/defcore"
20+
"github.com/hyperledger/fabric-sdk-go/pkg/config"
2021
"github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/channel"
2122
fabmocks "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/mocks"
2223
chImpl "github.com/hyperledger/fabric-sdk-go/pkg/fabric-txn/chclient"
@@ -187,10 +188,7 @@ func newMockProviders(t *testing.T) *mockProviders {
187188
coreFactory := defcore.NewProviderFactory()
188189
svcFactory := defsvc.NewProviderFactory()
189190

190-
opts := defcore.ConfigOpts{
191-
FileName: "../../../test/fixtures/config/config_test.yaml",
192-
}
193-
config, err := coreFactory.NewConfigProvider(opts)
191+
config, err := config.FromFile("../../../test/fixtures/config/config_test.yaml")()
194192
if err != nil {
195193
t.Fatalf(err.Error())
196194
}

def/factory/defcore/corefactory.go

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import (
1414
"github.com/hyperledger/fabric-sdk-go/api/apilogging"
1515

1616
"github.com/hyperledger/fabric-sdk-go/def/provider/fabpvdr"
17-
configImpl "github.com/hyperledger/fabric-sdk-go/pkg/config"
1817
cryptosuiteimpl "github.com/hyperledger/fabric-sdk-go/pkg/cryptosuite/bccsp/sw"
1918
"github.com/hyperledger/fabric-sdk-go/pkg/errors"
2019
kvs "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/keyvaluestore"
@@ -35,26 +34,6 @@ func NewProviderFactory() *ProviderFactory {
3534
return &f
3635
}
3736

38-
// ConfigOpts provides bootstrap setup
39-
type ConfigOpts struct {
40-
//FileName to load from a predefined path
41-
FileName string
42-
//Raw to load from an bytes array
43-
Raw []byte
44-
//Format to specify the type of the config (mainly used with ConfigBytes as ConfigFile has a file extension to specify the type)
45-
// valid values: yaml, json, etc.
46-
Format string
47-
}
48-
49-
// NewConfigProvider creates a Config using the SDK's default implementation
50-
func (f *ProviderFactory) NewConfigProvider(opts ConfigOpts) (apiconfig.Config, error) {
51-
// configBytes takes precedence over configFile
52-
if opts.Raw != nil && len(opts.Raw) > 0 {
53-
return configImpl.FromRaw(opts.Raw, opts.Format)
54-
}
55-
return configImpl.FromFile(opts.FileName)
56-
}
57-
5837
// NewStateStoreProvider creates a KeyValueStore using the SDK's default implementation
5938
func (f *ProviderFactory) NewStateStoreProvider(config apiconfig.Config) (fab.KeyValueStore, error) {
6039

def/factory/defcore/corefactory_test.go

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,32 +15,13 @@ import (
1515
"github.com/hyperledger/fabric-sdk-go/api/apiconfig/mocks"
1616
"github.com/hyperledger/fabric-sdk-go/api/apifabclient"
1717
"github.com/hyperledger/fabric-sdk-go/def/provider/fabpvdr"
18-
configImpl "github.com/hyperledger/fabric-sdk-go/pkg/config"
1918
cryptosuitewrapper "github.com/hyperledger/fabric-sdk-go/pkg/cryptosuite/bccsp/wrapper"
2019
kvs "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/keyvaluestore"
2120
"github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/mocks"
2221
signingMgr "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/signingmgr"
2322
"github.com/hyperledger/fabric-sdk-go/pkg/logging/modlog"
2423
)
2524

26-
func TestNewConfigProvider(t *testing.T) {
27-
factory := NewProviderFactory()
28-
29-
opts := ConfigOpts{
30-
FileName: "../../../test/fixtures/config/config_test.yaml",
31-
}
32-
33-
config, err := factory.NewConfigProvider(opts)
34-
if err != nil {
35-
t.Fatalf("Unexpected error creating config provider %v", err)
36-
}
37-
38-
_, ok := config.(*configImpl.Config)
39-
if !ok {
40-
t.Fatalf("Unexpected config provider created")
41-
}
42-
}
43-
4425
func TestNewStateStoreProvider(t *testing.T) {
4526
factory := NewProviderFactory()
4627

pkg/config/config.go

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -61,56 +61,55 @@ type Option func(opts *options) error
6161

6262
// FromReader loads configuration from in.
6363
// configType can be "json" or "yaml".
64-
func FromReader(in io.Reader, configType string, opts ...Option) (*Config, error) {
65-
c, err := newConfig(opts...)
66-
if err != nil {
67-
return nil, err
68-
}
64+
func FromReader(in io.Reader, configType string, opts ...Option) apiconfig.ConfigProvider {
65+
return func() (apiconfig.Config, error) {
66+
c, err := newConfig(opts...)
67+
if err != nil {
68+
return nil, err
69+
}
6970

70-
if configType == "" {
71-
return nil, errors.New("empty config type")
72-
}
71+
if configType == "" {
72+
return nil, errors.New("empty config type")
73+
}
7374

74-
// read config from bytes array, but must set ConfigType
75-
// for viper to properly unmarshal the bytes array
76-
c.configViper.SetConfigType(configType)
77-
c.configViper.MergeConfig(in)
75+
// read config from bytes array, but must set ConfigType
76+
// for viper to properly unmarshal the bytes array
77+
c.configViper.SetConfigType(configType)
78+
c.configViper.MergeConfig(in)
7879

79-
return initConfig(c)
80+
return initConfig(c)
81+
}
8082
}
8183

8284
// FromFile reads from named config file
83-
func FromFile(name string, opts ...Option) (*Config, error) {
84-
c, err := newConfig(opts...)
85-
if err != nil {
86-
return nil, err
87-
}
85+
func FromFile(name string, opts ...Option) apiconfig.ConfigProvider {
86+
return func() (apiconfig.Config, error) {
87+
c, err := newConfig(opts...)
88+
if err != nil {
89+
return nil, err
90+
}
8891

89-
if name == "" {
90-
return nil, errors.New("filename is required")
91-
}
92+
if name == "" {
93+
return nil, errors.New("filename is required")
94+
}
9295

93-
// create new viper
94-
c.configViper.SetConfigFile(name)
96+
// create new viper
97+
c.configViper.SetConfigFile(name)
9598

96-
// If a config file is found, read it in.
97-
err = c.configViper.MergeInConfig()
98-
if err == nil {
99-
logger.Debugf("Using config file: %s", c.configViper.ConfigFileUsed())
100-
} else {
101-
return nil, errors.Wrap(err, "loading config file failed")
102-
}
99+
// If a config file is found, read it in.
100+
err = c.configViper.MergeInConfig()
101+
if err == nil {
102+
logger.Debugf("Using config file: %s", c.configViper.ConfigFileUsed())
103+
} else {
104+
return nil, errors.Wrap(err, "loading config file failed")
105+
}
103106

104-
return initConfig(c)
107+
return initConfig(c)
108+
}
105109
}
106110

107111
// FromRaw will initialize the configs from a byte array
108-
func FromRaw(configBytes []byte, configType string, opts ...Option) (*Config, error) {
109-
110-
if len(configBytes) == 0 {
111-
return nil, errors.New("empty config byte array")
112-
}
113-
112+
func FromRaw(configBytes []byte, configType string, opts ...Option) apiconfig.ConfigProvider {
114113
buf := bytes.NewBuffer(configBytes)
115114
logger.Debugf("config.FromRaw buf Len is %d, Cap is %d: %s", buf.Len(), buf.Cap(), buf)
116115

0 commit comments

Comments
 (0)