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

Commit aefe5a5

Browse files
committed
[FAB-8324]: Resource Mgmt: Query Config
Change-Id: Id7ece54c45b82c75e1da66da71517cb56e138ee3 Signed-off-by: Sandra Vrtikapa <sandra.vrtikapa@securekey.com>
1 parent 4b576fd commit aefe5a5

File tree

2 files changed

+99
-3
lines changed

2 files changed

+99
-3
lines changed

pkg/client/resmgmt/resmgmt.go

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/core"
1616
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
1717
"github.com/hyperledger/fabric-sdk-go/pkg/fab/channel"
18+
"github.com/hyperledger/fabric-sdk-go/pkg/fab/chconfig"
1819
"github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/common"
1920

2021
"github.com/hyperledger/fabric-sdk-go/pkg/context"
@@ -444,8 +445,7 @@ func (rc *Client) QueryInstantiatedChaincodes(channelID string, options ...Reque
444445
}
445446

446447
// select random channel peer
447-
r := rand.New(rand.NewSource(time.Now().Unix()))
448-
randomNumber := r.Intn(len(targets))
448+
randomNumber := rand.Intn(len(targets))
449449
target = targets[randomNumber]
450450
}
451451

@@ -707,7 +707,64 @@ func (rc *Client) SaveChannel(req SaveChannelRequest, options ...RequestOption)
707707
return nil
708708
}
709709

710-
//prepareRequestOpts prepares rrequest options
710+
// QueryConfigFromOrderer config returns channel configuration from orderer
711+
// Valid request option is WithOrdererID
712+
// If orderer id is not provided orderer will be defaulted to channel orderer (if configured) or random orderer from config
713+
func (rc *Client) QueryConfigFromOrderer(channelID string, options ...RequestOption) (fab.ChannelCfg, error) {
714+
715+
opts, err := rc.prepareRequestOpts(options...)
716+
if err != nil {
717+
return nil, err
718+
}
719+
720+
chCfg, err := rc.provider.Config().ChannelConfig(channelID)
721+
if err != nil {
722+
return nil, err
723+
}
724+
725+
var ordererCfg *core.OrdererConfig
726+
727+
// Figure out orderer configuration (first try opts, then random channel orderer, then random orderer )
728+
if opts.OrdererID != "" {
729+
730+
ordererCfg, err = rc.provider.Config().OrdererConfig(opts.OrdererID)
731+
732+
} else if chCfg != nil && len(chCfg.Orderers) > 0 {
733+
734+
// random channel orderer
735+
randomNumber := rand.Intn(len(chCfg.Orderers))
736+
ordererCfg, err = rc.provider.Config().OrdererConfig(chCfg.Orderers[randomNumber])
737+
738+
} else {
739+
// random orderer from configuration
740+
ordererCfg, err = rc.provider.Config().RandomOrdererConfig()
741+
}
742+
743+
// Check if retrieving orderer configuration went ok
744+
if err != nil || ordererCfg == nil {
745+
return nil, errors.Errorf("failed to retrieve orderer config: %s", err)
746+
}
747+
748+
orderer, err := orderer.New(rc.provider.Config(), orderer.FromOrdererConfig(ordererCfg))
749+
if err != nil {
750+
return nil, errors.WithMessage(err, "failed to resolve orderer")
751+
}
752+
753+
ctx := &fabContext{
754+
Providers: rc.provider,
755+
Identity: rc.identity,
756+
}
757+
758+
channelConfig, err := chconfig.New(ctx, channelID, chconfig.WithOrderer(orderer))
759+
if err != nil {
760+
return nil, errors.WithMessage(err, "QueryConfig failed")
761+
}
762+
763+
return channelConfig.Query()
764+
765+
}
766+
767+
// prepareRequestOpts prepares request options
711768
func (rc *Client) prepareRequestOpts(options ...RequestOption) (Opts, error) {
712769
opts := Opts{}
713770
for _, option := range options {

test/integration/sdk/resmgmt_queries_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,16 @@ func TestResMgmtClientQueries(t *testing.T) {
5353
// Our target for queries will be primary peer on this channel
5454
target := testSetup.Targets[0]
5555

56+
testQueryConfigFromOrderer(t, testSetup.ChannelID, client)
57+
5658
testInstalledChaincodes(t, ccID, target, client)
5759

5860
testInstantiatedChaincodes(t, testSetup.ChannelID, ccID, target, client)
5961

6062
testQueryChannels(t, testSetup.ChannelID, target, client)
6163

6264
}
65+
6366
func testInstantiatedChaincodes(t *testing.T, channelID string, ccID string, target fab.ProposalProcessor, client *resmgmt.Client) {
6467

6568
chaincodeQueryResponse, err := client.QueryInstantiatedChaincodes(channelID, resmgmt.WithTarget(target.(fab.Peer)))
@@ -120,3 +123,39 @@ func testQueryChannels(t *testing.T, channelID string, target fab.ProposalProces
120123
}
121124

122125
}
126+
127+
func testQueryConfigFromOrderer(t *testing.T, channelID string, client *resmgmt.Client) {
128+
129+
channelCfg, err := client.QueryConfigFromOrderer(channelID)
130+
if err != nil {
131+
t.Fatalf("QueryConfig return error: %v", err)
132+
}
133+
134+
expected := "orderer.example.com:7050"
135+
if !contains(channelCfg.Orderers(), expected) {
136+
t.Fatalf("Expected orderer %s, got %s", expected, channelCfg.Orderers())
137+
}
138+
139+
channelCfg, err = client.QueryConfigFromOrderer(channelID, resmgmt.WithOrdererID("orderer.example.com"))
140+
if err != nil {
141+
t.Fatalf("QueryConfig return error: %v", err)
142+
}
143+
if !contains(channelCfg.Orderers(), expected) {
144+
t.Fatalf("Expected orderer %s, got %s", expected, channelCfg.Orderers())
145+
}
146+
147+
channelCfg, err = client.QueryConfigFromOrderer(channelID, resmgmt.WithOrdererID("non-existent"))
148+
if err == nil {
149+
t.Fatalf("QueryConfig should have failed for invalid orderer")
150+
}
151+
152+
}
153+
154+
func contains(list []string, value string) bool {
155+
for _, e := range list {
156+
if e == value {
157+
return true
158+
}
159+
}
160+
return false
161+
}

0 commit comments

Comments
 (0)