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

Commit 72a5fdb

Browse files
committed
[FAB-9808] override orderers configuration
- Orderers config in endpoint channels config will be taken into consideration before going through orderers in channel configuration. - This functionality may get removed in future Change-Id: I67a604f59b616b166a7e7a620ceca43ccb2a2650 Signed-off-by: Sudesh Shetty <sudesh.shetty@securekey.com>
1 parent fc7ae84 commit 72a5fdb

File tree

3 files changed

+103
-2
lines changed

3 files changed

+103
-2
lines changed

pkg/fab/channel/transactor.go

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616

1717
reqContext "context"
1818

19+
"github.com/hyperledger/fabric-sdk-go/pkg/common/errors/status"
1920
contextImpl "github.com/hyperledger/fabric-sdk-go/pkg/context"
2021
"github.com/hyperledger/fabric-sdk-go/pkg/core/config/endpoint"
2122
"github.com/hyperledger/fabric-sdk-go/pkg/fab/txn"
@@ -54,18 +55,31 @@ func NewTransactor(reqCtx reqContext.Context, cfg fab.ChannelCfg) (*Transactor,
5455
}
5556

5657
func orderersFromChannelCfg(ctx context.Client, cfg fab.ChannelCfg) ([]fab.Orderer, error) {
57-
orderers := []fab.Orderer{}
58+
59+
//below call to get orderers from endpoint config 'channels.<CHANNEL-ID>.orderers' is not recommended.
60+
//To override any orderer configuration items, entity matchers should be used.
61+
orderers, err := orderersFromChannel(ctx, cfg.ID())
62+
if err != nil {
63+
return nil, err
64+
}
65+
if len(orderers) > 0 {
66+
logger.Warn("Getting orderers from endpoint config channels.orderer is deprecated, use entity matchers to override orderer configuration")
67+
logger.Warn("visit https://github.com/hyperledger/fabric-sdk-go/blob/master/test/fixtures/config/overrides/local_entity_matchers.yaml for samples")
68+
return orderers, nil
69+
}
70+
5871
ordererDict, err := orderersByTarget(ctx)
5972
if err != nil {
6073
return nil, err
6174
}
6275

63-
// Add orderer if specified in config
76+
// Add orderer if specified in channel config
6477
for _, target := range cfg.Orderers() {
6578

6679
// Figure out orderer configuration
6780
oCfg, ok := ordererDict[target]
6881

82+
//try entity matcher
6983
if !ok {
7084
logger.Debugf("Failed to get channel Cfg orderer [%s] from ordererDict, now trying orderer Matchers in Entity Matchers", target)
7185
// Try to find a match from entityMatchers config
@@ -77,6 +91,7 @@ func orderersFromChannelCfg(ctx context.Client, cfg fab.ChannelCfg) ([]fab.Order
7791
}
7892

7993
}
94+
//create orderer using channel config block orderer address
8095
if !ok {
8196
logger.Debugf("Unable to find matching ordererConfig from entity Matchers for channel Cfg Orderer [%s]", target)
8297
oCfg = fab.OrdererConfig{
@@ -95,6 +110,39 @@ func orderersFromChannelCfg(ctx context.Client, cfg fab.ChannelCfg) ([]fab.Order
95110
return orderers, nil
96111
}
97112

113+
//deprecated
114+
//orderersFromChannel returns list of fab.Orderer by channel id
115+
//will return empty list when orderers are not found in endpoint config
116+
func orderersFromChannel(ctx context.Client, channelID string) ([]fab.Orderer, error) {
117+
118+
chNetworkConfig, err := ctx.EndpointConfig().ChannelConfig(channelID)
119+
if err != nil {
120+
return nil, errors.WithMessage(err, "failed to get channel network config")
121+
}
122+
123+
orderers := []fab.Orderer{}
124+
for _, chOrderer := range chNetworkConfig.Orderers {
125+
126+
ordererConfig, err := ctx.EndpointConfig().OrdererConfig(chOrderer)
127+
if err != nil {
128+
s, ok := status.FromError(err)
129+
if !ok || s.Code != status.NoMatchingOrdererEntity.ToInt32() {
130+
return nil, errors.Wrapf(err, "unable to get orderer config from [%s]", chOrderer)
131+
}
132+
//continue if given channel orderer not found in endpoint config
133+
continue
134+
}
135+
136+
orderer, err := ctx.InfraProvider().CreateOrdererFromConfig(ordererConfig)
137+
if err != nil {
138+
return nil, errors.WithMessage(err, "failed to create orderer from config")
139+
}
140+
141+
orderers = append(orderers, orderer)
142+
}
143+
return orderers, nil
144+
}
145+
98146
func orderersByTarget(ctx context.Client) (map[string]fab.OrdererConfig, error) {
99147
ordererDict := map[string]fab.OrdererConfig{}
100148
orderersConfig, err := ctx.EndpointConfig().OrderersConfig()

pkg/fab/channel/transactor_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,13 @@ import (
1111

1212
"time"
1313

14+
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/core"
1415
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/fab"
1516
"github.com/hyperledger/fabric-sdk-go/pkg/context"
17+
"github.com/hyperledger/fabric-sdk-go/pkg/core/config"
18+
"github.com/hyperledger/fabric-sdk-go/pkg/core/config/lookup"
19+
mocksConfig "github.com/hyperledger/fabric-sdk-go/pkg/core/mocks"
20+
fabImpl "github.com/hyperledger/fabric-sdk-go/pkg/fab"
1621
"github.com/hyperledger/fabric-sdk-go/pkg/fab/mocks"
1722
"github.com/hyperledger/fabric-sdk-go/pkg/fab/txn"
1823
mspmocks "github.com/hyperledger/fabric-sdk-go/pkg/msp/test/mockmsp"
@@ -136,3 +141,47 @@ func TestOrderersFromChannelCfgBadTLS(t *testing.T) {
136141
assert.Nil(t, err)
137142
assert.NotEmpty(t, o)
138143
}
144+
145+
// TestOrderersURLOverride tests orderer URL override from endpoint channels config
146+
func TestOrderersURLOverride(t *testing.T) {
147+
sampleOrdererURL := "orderer.example.com.sample.url:100090"
148+
149+
//Create endpoint config
150+
configBackends, err := config.FromFile("../../core/config/testdata/config_test.yaml")()
151+
if err != nil {
152+
t.Fatal("failed to get config backends")
153+
}
154+
155+
//Override orderer URL in endpoint config
156+
//Create an empty network config
157+
networkConfig := fab.NetworkConfig{}
158+
err = lookup.New(configBackends...).UnmarshalKey("orderers", &networkConfig.Orderers)
159+
if err != nil {
160+
t.Fatal("failed to unmarshal orderer")
161+
}
162+
163+
orderer := networkConfig.Orderers["orderer.example.com"]
164+
orderer.URL = sampleOrdererURL
165+
networkConfig.Orderers["orderer.example.com"] = orderer
166+
167+
backendMap := make(map[string]interface{})
168+
backendMap["orderers"] = networkConfig.Orderers
169+
backends := append([]core.ConfigBackend{}, &mocksConfig.MockConfigBackend{KeyValueMap: backendMap})
170+
backends = append(backends, configBackends...)
171+
endpointCfg, err := fabImpl.ConfigFromBackend(backends...)
172+
if err != nil {
173+
t.Fatal("failed to get endpoint config")
174+
}
175+
176+
user := mspmocks.NewMockSigningIdentity("test", "test")
177+
ctx := mocks.NewMockContext(user)
178+
ctx.SetEndpointConfig(endpointCfg)
179+
chConfig := mocks.NewMockChannelCfg("mychannel")
180+
chConfig.MockOrderers = []string{"example.com"}
181+
182+
o, err := orderersFromChannelCfg(ctx, chConfig)
183+
assert.Nil(t, err)
184+
assert.NotEmpty(t, o)
185+
assert.Equal(t, 1, len(o), "expected one orderer from response orderers list")
186+
assert.Equal(t, sampleOrdererURL, o[0].URL(), "orderer URL override from endpointconfig channels is not working as expected")
187+
}

pkg/fab/mocks/mockfabricprovider.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ func (f *MockInfraProvider) CreateOrdererFromConfig(cfg *fab.OrdererConfig) (fab
6969
return f.customOrderer, nil
7070
}
7171

72+
if cfg.URL != "" {
73+
return &MockOrderer{OrdererURL: cfg.URL}, nil
74+
}
75+
7276
return &MockOrderer{}, nil
7377
}
7478

0 commit comments

Comments
 (0)