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

Commit c299b89

Browse files
Firas QutishatGerrit Code Review
authored andcommitted
Merge "[FAB-3423] Remove unsafe type assertions in config.go"
2 parents 797da09 + dbdac6e commit c299b89

File tree

9 files changed

+69
-93
lines changed

9 files changed

+69
-93
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
*.db
2+
*report.xml
3+
.DS_Store

README.md

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
# Hyperledger Fabric Client SDK for Go
2-
[![Build Status](https://jenkins.hyperledger.org/buildStatus/icon?job=fabric-sdk-go-tests-verify-x86_64)](https://jenkins.hyperledger.org/job/fabric-sdk-go-tests-verify-x86_64)
2+
[![Build Status](https://jenkins.hyperledger.org/buildStatus/icon?job=fabric-sdk-go-tests-merge-x86_64)](https://jenkins.hyperledger.org/job/fabric-sdk-go-tests-merge-x86_64)
33
[![Go Report Card](https://goreportcard.com/badge/github.com/hyperledger/fabric-sdk-go)](https://goreportcard.com/report/github.com/hyperledger/fabric-sdk-go)
44
[![GoDoc](https://godoc.org/github.com/hyperledger/fabric-sdk-go?status.svg)](https://godoc.org/github.com/hyperledger/fabric-sdk-go)
55

66
The Hyperledger Fabric Client SDK makes it easy to use APIs to interact with a Hyperledger Fabric blockchain.
77

88
This SDK is targeted both towards the external access to a Hyperledger Fabric blockchain using a Go application, as well as being targeted at the internal library in a peer to access API functions on other parts of the network.
99

10-
**NOTE:** In an effort to make the codebase more modular, there will be interface changes over the course of the next week.
11-
1210
This is a **read-only mirror** of the formal [Gerrit](https://gerrit.hyperledger.org/r/#/admin/projects/fabric-sdk-go)
1311
repository, where active development is ongoing. Issue tracking is handled in [Jira](https://jira.hyperledger.org/secure/RapidBoard.jspa?projectKey=FAB&rapidView=7&view=planning)
1412

@@ -50,4 +48,3 @@ go test
5048
This client was last tested and found to be compatible with the following Hyperledger Fabric commit levels:
5149
- fabric: v1.0.0-alpha
5250
- fabric-ca: v1.0.0-alpha
53-

config/config.go

Lines changed: 25 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,17 @@ import (
3333
"github.com/spf13/viper"
3434
)
3535

36-
// PeerConfig ...
36+
// PeerConfig A set of configurations required to connect to a Fabric peer
3737
type PeerConfig struct {
38-
Host string
39-
Port string
40-
EventHost string
41-
EventPort string
42-
TLSCertificate string
43-
TLSServerHostOverride string
44-
Primary bool
38+
Host string
39+
Port int
40+
EventHost string
41+
EventPort int
42+
Primary bool
43+
TLS struct {
44+
Certificate string
45+
ServerHostOverride string
46+
}
4547
}
4648

4749
var myViper = viper.New()
@@ -121,59 +123,27 @@ func GetFabricClientViper() *viper.Viper {
121123
return myViper
122124
}
123125

124-
// GetPeersConfig ...
125-
func GetPeersConfig() []PeerConfig {
126+
// GetPeersConfig Retrieves the fabric peers from the config file provided
127+
func GetPeersConfig() ([]PeerConfig, error) {
126128
peersConfig := []PeerConfig{}
127-
peers := myViper.GetStringMap("client.peers")
128-
for key, value := range peers {
129-
mm, ok := value.(map[string]interface{})
130-
var host string
131-
var port int
132-
var primary bool
133-
var eventHost string
134-
var eventPort int
135-
var tlsCertificate string
136-
var tlsServerHostOverride string
137-
138-
if ok {
139-
host, _ = mm["host"].(string)
140-
port, _ = mm["port"].(int)
141-
primary, _ = mm["primary"].(bool)
142-
eventHost, _ = mm["event_host"].(string)
143-
eventPort, _ = mm["event_port"].(int)
144-
tlsCertificate, _ = mm["tls"].(map[string]interface{})["certificate"].(string)
145-
tlsServerHostOverride, _ = mm["tls"].(map[string]interface{})["serverhostoverride"].(string)
146-
147-
} else {
148-
mm1 := value.(map[interface{}]interface{})
149-
host, _ = mm1["host"].(string)
150-
port, _ = mm1["port"].(int)
151-
primary, _ = mm1["primary"].(bool)
152-
eventHost, _ = mm1["event_host"].(string)
153-
eventPort, _ = mm1["event_port"].(int)
154-
tlsCertificate, _ = mm1["tls"].(map[string]interface{})["certificate"].(string)
155-
tlsServerHostOverride, _ = mm1["tls"].(map[string]interface{})["serverhostoverride"].(string)
156-
157-
}
158-
159-
p := PeerConfig{Host: host, Port: strconv.Itoa(port), EventHost: eventHost, EventPort: strconv.Itoa(eventPort),
160-
TLSCertificate: tlsCertificate, TLSServerHostOverride: tlsServerHostOverride, Primary: primary}
129+
err := myViper.UnmarshalKey("client.peers", &peersConfig)
130+
if err != nil {
131+
return nil, err
132+
}
133+
for index, p := range peersConfig {
161134
if p.Host == "" {
162-
panic(fmt.Sprintf("host key not exist or empty for %s", key))
135+
return nil, fmt.Errorf("host key not exist or empty for peer %d", index)
163136
}
164-
if p.Port == "" {
165-
panic(fmt.Sprintf("port key not exist or empty for %s", key))
137+
if p.Port == 0 {
138+
return nil, fmt.Errorf("port key not exist or empty for peer %d", index)
166139
}
167-
168-
if IsTLSEnabled() && p.TLSCertificate == "" {
169-
panic(fmt.Sprintf("tls.certificate not exist or empty for %s", key))
140+
if IsTLSEnabled() && p.TLS.Certificate == "" {
141+
return nil, fmt.Errorf("tls.certificate not exist or empty for peer %d", index)
170142
}
171-
172-
p.TLSCertificate = strings.Replace(p.TLSCertificate, "$GOPATH", os.Getenv("GOPATH"), -1)
173-
peersConfig = append(peersConfig, p)
143+
peersConfig[index].TLS.Certificate = strings.Replace(p.TLS.Certificate, "$GOPATH",
144+
os.Getenv("GOPATH"), -1)
174145
}
175-
return peersConfig
176-
146+
return peersConfig, nil
177147
}
178148

179149
// IsTLSEnabled ...

config/config_test.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,22 @@ import (
2828
)
2929

3030
func TestGetPeersConfig(t *testing.T) {
31-
pc := GetPeersConfig()
31+
pc, err := GetPeersConfig()
32+
if err != nil {
33+
t.Fatalf(err.Error())
34+
}
3235

3336
for _, value := range pc {
3437
if value.Host == "" {
3538
t.Fatalf("Host value is empty")
3639
}
37-
if value.Port == "" {
40+
if value.Port == 0 {
3841
t.Fatalf("Port value is empty")
3942
}
40-
if value.Port == "" {
43+
if value.EventHost == "" {
4144
t.Fatalf("EventHost value is empty")
4245
}
43-
if value.Port == "" {
46+
if value.EventPort == 0 {
4447
t.Fatalf("EventPort value is empty")
4548
}
4649

@@ -72,8 +75,8 @@ func TestMultipleVipers(t *testing.T) {
7275
t.Fatalf("Expected testvalue after config initialization")
7376
}
7477
// Make sure Go SDK config is unaffected
75-
testValue3 := myViper.GetString("client.peers.peer1.host")
76-
if testValue3 != "localhost" {
78+
testValue3 := myViper.GetBool("client.tls.enabled")
79+
if testValue3 != true {
7780
t.Fatalf("Expected existing config value to remain unchanged")
7881
}
7982
}

fabric-client/chain.go

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1318,17 +1318,10 @@ func (c *chain) fetchGenesisBlock() (*common.Block, error) {
13181318
return nil, fmt.Errorf("Error signing payload: %s", err)
13191319
}
13201320
// Request genesis block from ordering service
1321-
var block *common.Block
1322-
// TODO: what if the primary orderer is down?
1323-
responses, errors := c.GetOrderers()[0].SendDeliver(blockRequest)
1324-
// Block on channels for genesis block or error
1325-
select {
1326-
case block = <-responses:
1327-
logger.Debugf("Got genesis block from ordering service: %#v", block)
1328-
case err = <-errors:
1329-
return nil, fmt.Errorf("Error from SendDeliver(): %s", err)
1321+
block, err := c.SendEnvelope(blockRequest)
1322+
if err != nil {
1323+
return nil, fmt.Errorf("Error from SendEnvelope: %s", err.Error())
13301324
}
1331-
13321325
return block, nil
13331326
}
13341327

fabric-client/helpers/chain.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,13 @@ func GetChain(client fabricClient.Client, chainID string) (fabricClient.Chain, e
5151
}
5252
chain.AddOrderer(orderer)
5353

54-
for _, p := range config.GetPeersConfig() {
55-
endorser, err := fabricClient.NewPeer(fmt.Sprintf("%s:%s", p.Host, p.Port), p.TLSCertificate, p.TLSServerHostOverride)
54+
peerConfig, err := config.GetPeersConfig()
55+
if err != nil {
56+
return nil, fmt.Errorf("Error reading peer config: %v", err)
57+
}
58+
for _, p := range peerConfig {
59+
endorser, err := fabricClient.NewPeer(fmt.Sprintf("%s:%d", p.Host, p.Port),
60+
p.TLS.Certificate, p.TLS.ServerHostOverride)
5661
if err != nil {
5762
return nil, fmt.Errorf("NewPeer return error: %v", err)
5863
}
@@ -164,7 +169,7 @@ func CreateAndJoinChannel(client fabricClient.Client, chain fabricClient.Chain,
164169
// Wait for orderer to process channel metadata
165170
time.Sleep(time.Second * 2)
166171
// Test join channel
167-
creator, err := getCreatorID(client)
172+
creator, err := GetCreatorID(client)
168173
if err != nil {
169174
return fmt.Errorf("Could not generate creator ID: %v", err)
170175
}

fabric-client/helpers/client.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ func GetClient(name string, pwd string, stateStorePath string) (fabricClient.Cli
101101
if user == nil {
102102
fabricCAClient, err1 := fabricCAClient.NewFabricCAClient()
103103
if err1 != nil {
104-
return nil, fmt.Errorf("NewFabricCAClient return error: %v", err)
104+
return nil, fmt.Errorf("NewFabricCAClient return error: %v", err1)
105105
}
106106
key, cert, err1 := fabricCAClient.Enroll(name, pwd)
107107
keyPem, _ := pem.Decode(key)
@@ -111,7 +111,7 @@ func GetClient(name string, pwd string, stateStorePath string) (fabricClient.Cli
111111
user := fabricClient.NewUser(name)
112112
k, err1 := client.GetCryptoSuite().KeyImport(keyPem.Bytes, &bccsp.ECDSAPrivateKeyImportOpts{Temporary: false})
113113
if err1 != nil {
114-
return nil, fmt.Errorf("KeyImport return error: %v", err)
114+
return nil, fmt.Errorf("KeyImport return error: %v", err1)
115115
}
116116
user.SetPrivateKey(k)
117117
user.SetEnrollmentCertificate(cert)
@@ -125,8 +125,8 @@ func GetClient(name string, pwd string, stateStorePath string) (fabricClient.Cli
125125

126126
}
127127

128-
// Utility method gets serialized enrollment certificate
129-
func getCreatorID(client fabricClient.Client) ([]byte, error) {
128+
// GetCreatorID gets serialized enrollment certificate
129+
func GetCreatorID(client fabricClient.Client) ([]byte, error) {
130130

131131
user, err := client.LoadUserFromStateStore("")
132132
if err != nil {

test/fixtures/config/config_test.yaml

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
client:
22
peers:
3-
peer1:
4-
host: "localhost"
3+
# peer0
4+
- host: "localhost"
55
port: 7051
6-
event_host: "localhost"
7-
event_port: 7053
6+
eventHost: "localhost"
7+
eventPort: 7053
88
primary: true
99
tls:
1010
# Certificate location absolute path
1111
certificate: "$GOPATH/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/tls/peers/peer0/ca-cert.pem"
1212
serverHostOverride: "peer0"
13-
14-
peer2:
15-
host: "localhost"
13+
# peer 1
14+
- host: "localhost"
1615
port: 7056
16+
eventHost: "localhost"
17+
eventPort: 7058
1718
primary: false
1819
tls:
1920
# Certificate location absolute path

test/integration/base_test_setup.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,10 +217,15 @@ func (setup *BaseSetupImpl) MoveFunds() (string, error) {
217217
func getEventHub() (events.EventHub, error) {
218218
eventHub := events.NewEventHub()
219219
foundEventHub := false
220-
for _, p := range config.GetPeersConfig() {
221-
if p.EventHost != "" && p.EventPort != "" {
222-
fmt.Printf("******* EventHub connect to peer (%s:%s) *******\n", p.EventHost, p.EventPort)
223-
eventHub.SetPeerAddr(fmt.Sprintf("%s:%s", p.EventHost, p.EventPort), p.TLSCertificate, p.TLSServerHostOverride)
220+
peerConfig, err := config.GetPeersConfig()
221+
if err != nil {
222+
return nil, fmt.Errorf("Error reading peer config: %v", err)
223+
}
224+
for _, p := range peerConfig {
225+
if p.EventHost != "" && p.EventPort != 0 {
226+
fmt.Printf("******* EventHub connect to peer (%s:%d) *******\n", p.EventHost, p.EventPort)
227+
eventHub.SetPeerAddr(fmt.Sprintf("%s:%d", p.EventHost, p.EventPort),
228+
p.TLS.Certificate, p.TLS.ServerHostOverride)
224229
foundEventHub = true
225230
break
226231
}

0 commit comments

Comments
 (0)