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

Commit 7bb665c

Browse files
committed
[FAB-8811] Rename WithOrdererID to WithOrdererURL
This change renames WithOrdererID to WithOrdererURL in resmgmt client. An additional option WithOrderer is also added to specify the orderer object itself. Change-Id: Id561d432691d3ff093d0f35074c5326f7e949b3c Signed-off-by: Troy Ronda <troy@troyronda.com>
1 parent 81a872e commit 7bb665c

File tree

5 files changed

+81
-61
lines changed

5 files changed

+81
-61
lines changed

pkg/client/resmgmt/opts.go

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,45 +9,70 @@ package resmgmt
99
import (
1010
"time"
1111

12+
"github.com/hyperledger/fabric-sdk-go/pkg/common/context"
1213
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
14+
"github.com/pkg/errors"
1315
)
1416

1517
//WithTargets encapsulates fab.Peer targets to resmgmtclient RequestOption
1618
func WithTargets(targets ...fab.Peer) RequestOption {
17-
return func(opts *Opts) error {
19+
return func(ctx context.Client, opts *requestOptions) error {
1820
opts.Targets = targets
1921
return nil
2022
}
2123
}
2224

2325
//WithTarget encapsulates fab.Peer target to RequestOption
2426
func WithTarget(target fab.Peer) RequestOption {
25-
return func(opts *Opts) error {
27+
return func(ctx context.Client, opts *requestOptions) error {
2628
opts.Targets = []fab.Peer{target}
2729
return nil
2830
}
2931
}
3032

3133
//WithTargetFilter encapsulates resmgmtclient TargetFilter targets to resmgmtclient RequestOption
3234
func WithTargetFilter(targetFilter TargetFilter) RequestOption {
33-
return func(opts *Opts) error {
35+
return func(ctx context.Client, opts *requestOptions) error {
3436
opts.TargetFilter = targetFilter
3537
return nil
3638
}
3739
}
3840

3941
//WithTimeout encapsulates time.Duration to resmgmtclient RequestOption
4042
func WithTimeout(timeout time.Duration) RequestOption {
41-
return func(opts *Opts) error {
43+
return func(ctx context.Client, opts *requestOptions) error {
4244
opts.Timeout = timeout
4345
return nil
4446
}
4547
}
4648

47-
//WithOrdererID encapsulates OrdererID to RequestOption
48-
func WithOrdererID(ordererID string) RequestOption {
49-
return func(opts *Opts) error {
50-
opts.OrdererID = ordererID
49+
//WithOrdererURL allows an orderer to be specified for the request.
50+
//The orderer will be looked-up based on the url argument.
51+
//A default orderer implementation will be used.
52+
func WithOrdererURL(ordererID string) RequestOption {
53+
return func(ctx context.Client, opts *requestOptions) error {
54+
55+
ordererCfg, err := ctx.Config().OrdererConfig(ordererID)
56+
if err != nil {
57+
return errors.WithMessage(err, "orderer not found")
58+
}
59+
if ordererCfg == nil {
60+
return errors.New("orderer not found")
61+
}
62+
63+
orderer, err := ctx.InfraProvider().CreateOrdererFromConfig(ordererCfg)
64+
if err != nil {
65+
return errors.WithMessage(err, "creating orderer from config failed")
66+
}
67+
68+
return WithOrderer(orderer)(ctx, opts)
69+
}
70+
}
71+
72+
//WithOrderer allows an orderer to be specified for the request.
73+
func WithOrderer(orderer fab.Orderer) RequestOption {
74+
return func(ctx context.Client, opts *requestOptions) error {
75+
opts.Orderer = orderer
5176
return nil
5277
}
5378
}

pkg/client/resmgmt/resmgmt.go

Lines changed: 30 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323
contextImpl "github.com/hyperledger/fabric-sdk-go/pkg/context"
2424
"github.com/hyperledger/fabric-sdk-go/pkg/errors/multi"
2525
"github.com/hyperledger/fabric-sdk-go/pkg/errors/status"
26-
"github.com/hyperledger/fabric-sdk-go/pkg/fab/orderer"
2726
"github.com/hyperledger/fabric-sdk-go/pkg/fab/peer"
2827
"github.com/hyperledger/fabric-sdk-go/pkg/fab/resource"
2928
"github.com/hyperledger/fabric-sdk-go/pkg/fab/resource/api"
@@ -75,11 +74,11 @@ type UpgradeCCRequest struct {
7574
}
7675

7776
//Opts contains options for operations performed by ResourceMgmtClient
78-
type Opts struct {
77+
type requestOptions struct {
7978
Targets []fab.Peer // target peers
8079
TargetFilter TargetFilter // target filter
81-
Timeout time.Duration //timeout options for instantiate and upgrade CC
82-
OrdererID string // use specific orderer
80+
Timeout time.Duration // timeout options for instantiate and upgrade CC
81+
Orderer fab.Orderer // use specific orderer
8382
}
8483

8584
//SaveChannelRequest used to save channel request
@@ -93,7 +92,7 @@ type SaveChannelRequest struct {
9392
}
9493

9594
//RequestOption func for each Opts argument
96-
type RequestOption func(opts *Opts) error
95+
type RequestOption func(ctx context.Client, opts *requestOptions) error
9796

9897
var logger = logging.NewLogger("fabsdk/client")
9998

@@ -183,14 +182,9 @@ func (rc *Client) JoinChannel(channelID string, options ...RequestOption) error
183182
return errors.New("No targets available")
184183
}
185184

186-
ordererCfg, err := rc.ordererConfig(&opts, channelID)
185+
orderer, err := rc.requestOrderer(&opts, channelID)
187186
if err != nil {
188-
return errors.WithMessage(err, "failed to find orderer config")
189-
}
190-
191-
orderer, err := rc.ctx.InfraProvider().CreateOrdererFromConfig(ordererCfg)
192-
if err != nil {
193-
return errors.WithMessage(err, "failed to create orderers from config")
187+
return errors.WithMessage(err, "failed to find orderer for request")
194188
}
195189

196190
genesisBlock, err := resource.GenesisBlockFromOrderer(rc.ctx, channelID, orderer)
@@ -632,14 +626,9 @@ func (rc *Client) SaveChannel(req SaveChannelRequest, options ...RequestOption)
632626
configSignatures = append(configSignatures, configSignature)
633627
}
634628

635-
ordererCfg, err := rc.ordererConfig(&opts, req.ChannelID)
629+
orderer, err := rc.requestOrderer(&opts, req.ChannelID)
636630
if err != nil {
637-
return errors.WithMessage(err, "failed to find orderer config")
638-
}
639-
640-
orderer, err := orderer.New(rc.ctx.Config(), orderer.FromOrdererConfig(ordererCfg))
641-
if err != nil {
642-
return errors.WithMessage(err, "failed to create new orderer from config")
631+
return errors.WithMessage(err, "failed to find orderer for request")
643632
}
644633

645634
request := api.CreateChannelRequest{
@@ -667,14 +656,9 @@ func (rc *Client) QueryConfigFromOrderer(channelID string, options ...RequestOpt
667656
return nil, err
668657
}
669658

670-
ordererCfg, err := rc.ordererConfig(&opts, channelID)
659+
orderer, err := rc.requestOrderer(&opts, channelID)
671660
if err != nil {
672-
return nil, errors.WithMessage(err, "failed to find orderer config")
673-
}
674-
675-
orderer, err := orderer.New(rc.ctx.Config(), orderer.FromOrdererConfig(ordererCfg))
676-
if err != nil {
677-
return nil, errors.WithMessage(err, "failed to resolve orderer")
661+
return nil, errors.WithMessage(err, "failed to find orderer for request")
678662
}
679663

680664
channelConfig, err := chconfig.New(rc.ctx, channelID, chconfig.WithOrderer(orderer))
@@ -686,18 +670,25 @@ func (rc *Client) QueryConfigFromOrderer(channelID string, options ...RequestOpt
686670

687671
}
688672

689-
func (rc *Client) ordererConfig(opts *Opts, channelID string) (*core.OrdererConfig, error) {
690-
if opts.OrdererID != "" {
691-
ordererCfg, err := rc.ctx.Config().OrdererConfig(opts.OrdererID)
692-
if err != nil {
693-
return nil, errors.WithMessage(err, "orderer not found")
694-
}
695-
if ordererCfg == nil {
696-
return nil, errors.New("orderer not found")
697-
}
698-
return ordererCfg, nil
673+
func (rc *Client) requestOrderer(opts *requestOptions, channelID string) (fab.Orderer, error) {
674+
if opts.Orderer != nil {
675+
return opts.Orderer, nil
676+
}
677+
678+
ordererCfg, err := rc.ordererConfig(channelID)
679+
if err != nil {
680+
return nil, errors.WithMessage(err, "orderer not found")
699681
}
700682

683+
orderer, err := rc.ctx.InfraProvider().CreateOrdererFromConfig(ordererCfg)
684+
if err != nil {
685+
return nil, errors.WithMessage(err, "failed to create orderer from config")
686+
}
687+
return orderer, nil
688+
689+
}
690+
691+
func (rc *Client) ordererConfig(channelID string) (*core.OrdererConfig, error) {
701692
orderers, err := rc.ctx.Config().ChannelOrderers(channelID)
702693

703694
// TODO: Not sure that we should fallback to global orderers section.
@@ -719,10 +710,10 @@ func (rc *Client) ordererConfig(opts *Opts, channelID string) (*core.OrdererConf
719710
}
720711

721712
// prepareRequestOpts prepares request options
722-
func (rc *Client) prepareRequestOpts(options ...RequestOption) (Opts, error) {
723-
opts := Opts{}
713+
func (rc *Client) prepareRequestOpts(options ...RequestOption) (requestOptions, error) {
714+
opts := requestOptions{}
724715
for _, option := range options {
725-
err := option(&opts)
716+
err := option(rc.ctx, &opts)
726717
if err != nil {
727718
return opts, errors.WithMessage(err, "Failed to read opts")
728719
}

pkg/client/resmgmt/resmgmt_test.go

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,7 @@ func TestJoinChannelSuccess(t *testing.T) {
8787
rc := setupResMgmtClient(ctx, nil, t)
8888

8989
// Setup target peers
90-
var peers []fab.Peer
9190
peer1, _ := peer.New(fcmocks.NewMockConfig(), peer.WithURL("grpc://"+addr))
92-
peers = append(peers, peer1)
9391

9492
// Test valid join channel request (success)
9593
err := rc.JoinChannel("mychannel", WithTargets(peer1))
@@ -283,8 +281,7 @@ func TestOrdererConfigFail(t *testing.T) {
283281
ctx.SetConfig(noOrdererConfig)
284282
rc := setupResMgmtClient(ctx, nil, t)
285283

286-
opts := Opts{}
287-
orderer, err := rc.ordererConfig(&opts, "mychannel")
284+
orderer, err := rc.ordererConfig("mychannel")
288285
assert.Nil(t, orderer)
289286
assert.NotNil(t, err, "should fail since no orderer has been configured")
290287
}
@@ -1371,7 +1368,7 @@ func TestSaveChannelSuccess(t *testing.T) {
13711368
}
13721369

13731370
// Test valid Save Channel request (success)
1374-
err = cc.SaveChannel(SaveChannelRequest{ChannelID: "mychannel", ChannelConfig: channelConfig}, WithOrdererID("example.com"))
1371+
err = cc.SaveChannel(SaveChannelRequest{ChannelID: "mychannel", ChannelConfig: channelConfig}, WithOrdererURL("example.com"))
13751372
if err != nil {
13761373
t.Fatal(err)
13771374
}
@@ -1398,7 +1395,7 @@ func TestSaveChannelFailure(t *testing.T) {
13981395
}
13991396

14001397
// Test create channel failure
1401-
err = cc.SaveChannel(SaveChannelRequest{ChannelID: "mychannel", ChannelConfig: channelConfig})
1398+
err = cc.SaveChannel(SaveChannelRequest{ChannelID: "Invalid", ChannelConfig: channelConfig})
14021399
if err == nil {
14031400
t.Fatal("Should have failed with create channel error")
14041401
}
@@ -1431,14 +1428,14 @@ func TestSaveChannelWithOpts(t *testing.T) {
14311428
req := SaveChannelRequest{ChannelID: "mychannel", ChannelConfig: channelConfig}
14321429

14331430
// Test empty option (default order is random orderer from config)
1434-
opts := WithOrdererID("")
1431+
opts := WithOrdererURL("")
14351432
err := cc.SaveChannel(req, opts)
14361433
if err != nil {
14371434
t.Fatal(err)
14381435
}
14391436

14401437
// Test valid orderer ID
1441-
opts = WithOrdererID("orderer.example.com")
1438+
opts = WithOrdererURL("orderer.example.com")
14421439
err = cc.SaveChannel(req, opts)
14431440
if err != nil {
14441441
t.Fatal(err)
@@ -1451,7 +1448,7 @@ func TestSaveChannelWithOpts(t *testing.T) {
14511448

14521449
cc = setupResMgmtClient(ctx, nil, t)
14531450

1454-
opts = WithOrdererID("Invalid")
1451+
opts = WithOrdererURL("Invalid")
14551452
err = cc.SaveChannel(req, opts)
14561453
if err == nil {
14571454
t.Fatal("Should have failed for invalid orderer ID")
@@ -1461,7 +1458,7 @@ func TestSaveChannelWithOpts(t *testing.T) {
14611458
func TestJoinChannelWithInvalidOpts(t *testing.T) {
14621459

14631460
cc := setupDefaultResMgmtClient(t)
1464-
opts := WithOrdererID("Invalid")
1461+
opts := WithOrdererURL("Invalid")
14651462
err := cc.JoinChannel("mychannel", opts)
14661463
if err == nil {
14671464
t.Fatal("Should have failed for invalid orderer ID")
@@ -1491,15 +1488,15 @@ func TestSaveChannelWithMultipleSigningIdenities(t *testing.T) {
14911488

14921489
// empty list of signing identities (defaults to context user)
14931490
req := SaveChannelRequest{ChannelID: "mychannel", ChannelConfig: channelConfig, SigningIdentities: []msp.Identity{}}
1494-
err := cc.SaveChannel(req, WithOrdererID(""))
1491+
err := cc.SaveChannel(req, WithOrdererURL(""))
14951492
if err != nil {
14961493
t.Fatalf("Failed to save channel with default signing identity: %s", err)
14971494
}
14981495

14991496
// multiple signing identities
15001497
secondCtx := fcmocks.NewMockContext(fcmocks.NewMockUser("second"))
15011498
req = SaveChannelRequest{ChannelID: "mychannel", ChannelConfig: channelConfig, SigningIdentities: []msp.Identity{cc.ctx, secondCtx}}
1502-
err = cc.SaveChannel(req, WithOrdererID(""))
1499+
err = cc.SaveChannel(req, WithOrdererURL(""))
15031500
if err != nil {
15041501
t.Fatalf("Failed to save channel with multiple signing identities: %s", err)
15051502
}

pkg/fab/mocks/mockconfig.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,9 @@ func (c *MockConfig) SetCustomRandomOrdererCfg(customRandomOrdererCfg *config.Or
188188

189189
// OrdererConfig not implemented
190190
func (c *MockConfig) OrdererConfig(name string) (*config.OrdererConfig, error) {
191+
if name == "Invalid" {
192+
return nil, errors.New("no orderer")
193+
}
191194
if c.customOrdererCfg != nil {
192195
return c.customOrdererCfg, nil
193196
}
@@ -245,6 +248,10 @@ func (c *MockConfig) ChannelPeers(name string) ([]config.ChannelPeer, error) {
245248

246249
// ChannelOrderers returns a list of channel orderers
247250
func (c *MockConfig) ChannelOrderers(name string) ([]config.OrdererConfig, error) {
251+
if name == "Invalid" {
252+
return nil, errors.New("no orderer")
253+
}
254+
248255
oConfig, err := c.OrdererConfig("")
249256

250257
return []config.OrdererConfig{*oConfig}, err

test/integration/sdk/resmgmt_queries_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,15 +139,15 @@ func testQueryConfigFromOrderer(t *testing.T, channelID string, client *resmgmt.
139139
t.Fatalf("Expected orderer %s, got %s", expected, channelCfg.Orderers())
140140
}
141141

142-
channelCfg, err = client.QueryConfigFromOrderer(channelID, resmgmt.WithOrdererID("orderer.example.com"))
142+
channelCfg, err = client.QueryConfigFromOrderer(channelID, resmgmt.WithOrdererURL("orderer.example.com"))
143143
if err != nil {
144144
t.Fatalf("QueryConfig return error: %v", err)
145145
}
146146
if !contains(channelCfg.Orderers(), expected) {
147147
t.Fatalf("Expected orderer %s, got %s", expected, channelCfg.Orderers())
148148
}
149149

150-
channelCfg, err = client.QueryConfigFromOrderer(channelID, resmgmt.WithOrdererID("non-existent"))
150+
channelCfg, err = client.QueryConfigFromOrderer(channelID, resmgmt.WithOrdererURL("non-existent"))
151151
if err == nil {
152152
t.Fatalf("QueryConfig should have failed for invalid orderer")
153153
}

0 commit comments

Comments
 (0)