Skip to content

Commit

Permalink
[FAB-6275] Add Default GO SDK config
Browse files Browse the repository at this point in the history
Change-Id: I338a8a59e586321930dc8b62ff0175c573b44995
Signed-off-by: Baha Shaaban <[email protected]>
  • Loading branch information
Baha Shaaban committed Sep 25, 2017
1 parent 3b6d77b commit bf29760
Show file tree
Hide file tree
Showing 8 changed files with 428 additions and 63 deletions.
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,17 @@ cd $GOPATH/src/github.com/hyperledger/fabric-sdk-go/test/integration/
go test
```

#### Using default config

Default SDK Go configurations are found in the code under /pkg/config/config.yaml

To override the default in non Dev environment, set the default path in the following environment variable:

**FABRIC_SDK_CONFIG_PATH**=/path/to/default/config yaml(without specifying the yaml file name)

This path value must be a directory. It must contain a default 'config.yaml' file.
Note that this default config is used only if environment configuration yaml file is missing to ensure all environment variables are created regardless of their values.

#### Testing with Local Build of Fabric (Advanced)

Alternatively you can build and run Fabric on your own box using the following commands:
Expand Down
23 changes: 23 additions & 0 deletions pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import (
"strings"
"time"

"path/filepath"

"github.com/hyperledger/fabric-sdk-go/api/apiconfig"
bccspFactory "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/bccsp/factory"
"github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/bccsp/pkcs11"
Expand Down Expand Up @@ -56,6 +58,10 @@ func InitConfigWithCmdRoot(configFile string, cmdRootPrefix string) (*Config, er
myViper.AutomaticEnv()
replacer := strings.NewReplacer(".", "_")
myViper.SetEnvKeyReplacer(replacer)
err := loadDefaultConfig()
if err != nil {
return nil, err
}
if configFile != "" {
// create new viper
myViper.SetConfigFile(configFile)
Expand Down Expand Up @@ -85,6 +91,23 @@ func InitConfigWithCmdRoot(configFile string, cmdRootPrefix string) (*Config, er
return &Config{tlsCertPool: x509.NewCertPool()}, nil
}

// load Default confid
func loadDefaultConfig() error {
// get Environment Default Config Path
defaultPath := os.Getenv("FABRIC_SDK_CONFIG_PATH")
if defaultPath != "" { // if set, use it to load default config
myViper.AddConfigPath(strings.Replace(defaultPath, "$GOPATH", os.Getenv("GOPATH"), -1))
} else { // else fallback to default DEV path
devPath := filepath.Join(os.Getenv("GOPATH"), "src", "github.com", "hyperledger", "fabric-sdk-go", "pkg", "config")
myViper.AddConfigPath(devPath)
}
err := myViper.ReadInConfig() // Find and read the config file
if err != nil { // Handle errors reading the config file
return fmt.Errorf("fatal error config file: %s", err)
}
return nil
}

// Client returns the Client config
func (c *Config) Client() (*apiconfig.ClientConfig, error) {
config, err := c.NetworkConfig()
Expand Down
239 changes: 239 additions & 0 deletions pkg/config/config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,239 @@
#
# Copyright SecureKey Technologies Inc. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
#
# Default GO SDK Configuration
#
# The network connection profile provides client applications the information about the target
# blockchain network that are necessary for the applications to interact with it. These are all
# knowledge that must be acquired from out-of-band sources. This file provides such a source.
#
name: "default-network"

#
# Any properties with an "x-" prefix will be treated as application-specific, exactly like how naming
# in HTTP headers or swagger properties work. The SDK will simply ignore these fields and leave
# them for the applications to process. This is a mechanism for different components of an application
# to exchange information that are not part of the standard schema described below. In particular,
# the "x-type" property with the "hlfv1" value example below is used by Hyperledger Composer to
# determine the type of Fabric networks (v0.6 vs. v1.0) it needs to work with.
#
x-type: "hlfv1"
x-loggingLevel: info

#
# Describe what the target network is/does.
#
description: "The network description"

#
# Schema version of the content. Used by the SDK to apply the corresponding parsing rules.
#
version: 1.0.0

#
# The client section used by GO SDK.
#
client:
# Which organization does this application instance belong to? The value must be the name of an org
# defined under "organizations"
organization: match_value_with_one_of_organizations

logging:
level: info

# set connection timeouts for the peer and orderer for the client
connection:
timeout:
peer:
endorser: 3s
eventHub: 3s
eventReg: 3s
orderer: 3s

# Needed to load users crypto keys and certs.
cryptoconfig:
path: path/to/cryptoconfig

# enable/disable tls for the client
tls:
enabled: true

# Some SDKs support pluggable KV stores, the properties under "credentialStore"
# are implementation specific
credentialStore:
# [Optional]. Not used by Go SDK. Others SDKs may use it if using an alternative impl
# Could be used if SDK would require an object for properties like url, db name, etc.
path: unused/by/sdk/go

# [Optional]. Specific to the CryptoSuite implementation used by GO SDK. Software-based implementations
# requiring a key store. PKCS#11 based implementations does not.
cryptoStore:
# Specific to the underlying KeyValueStore that backs the crypto key store.
path: /usually/it/is/tmp/msp

# [Optional]. Specific to Composer environment. Not used by SDK Go.
wallet: wallet-name-unused-by-sdk-go

# BCCSP config for the client. Used by GO SDK.
BCCSP:
security:
enabled: true
default:
# provider: "SW"
provider: ""
# hashAlgorithm: "SHA2"
hashAlgorithm: ""
softVerify: true
ephemeral: false
level: 256
pin: "somepin"
label: "ForFabric"
#library: "/usr/lib/x86_64-linux-gnu/softhsm/libsofthsm2.so, /usr/lib/softhsm/libsofthsm2.so ,/usr/lib/s390x-linux-gnu/softhsm/libsofthsm2.so, /usr/lib/powerpc64le-linux-gnu/softhsm/libsofthsm2.so, /usr/local/Cellar/softhsm/2.1.0/lib/softhsm/libsofthsm2.so"
library: "add BCCSP library here"

#
# [Optional]. But most apps would have this section so that channel objects can be constructed
# based on the content below. If an app is creating channels, then it likely will not need this
# section.
#
channels:
# name of the channel
# mychannel:
# Required. list of orderers designated by the application to use for transactions on this
# channel. This list can be a result of access control ("org1" can only access "ordererA"), or
# operational decisions to share loads from applications among the orderers. The values must
# be "names" of orgs defined under "organizations/peers"
# orderers:
# - orderer.example.com

# Required. list of peers from participating orgs
# peers:
# peer0.org1.example.com:
# [Optional]. will this peer be sent transaction proposals for endorsement? The peer must
# have the chaincode installed. The app can also use this property to decide which peers
# to send the chaincode install request. Default: true
# endorsingPeer: true

# [Optional]. will this peer be sent query proposals? The peer must have the chaincode
# installed. The app can also use this property to decide which peers to send the
# chaincode install request. Default: true
# chaincodeQuery: true

# [Optional]. will this peer be sent query proposals that do not require chaincodes, like
# queryBlock(), queryTransaction(), etc. Default: true
# ledgerQuery: true

# [Optional]. will this peer be the target of the SDK's listener registration? All peers can
# produce events but the app typically only needs to connect to one to listen to events.
# Default: true
# eventSource: true


# [Optional]. what chaincodes are expected to exist on this channel? The application can use
# this information to validate that the target peers are in the expected state by comparing
# this list with the query results of getInstalledChaincodes() and getInstantiatedChaincodes()
# chaincodes:
# the format follows the "canonical name" of chaincodes by fabric code
# - example02:v1
# - marbles:1.0

#
# list of participating organizations in this network
#
organizations:
# org1:
# mspid: Org1MSP

# peers:
# - peer0.org1.example.com

# [Optional]. Certificate Authorities issue certificates for identification purposes in a Fabric based
# network. Typically certificates provisioning is done in a separate process outside of the
# runtime network. Fabric-CA is a special certificate authority that provides a REST APIs for
# dynamic certificate management (enroll, revoke, re-enroll). The following section is only for
# Fabric-CA servers.
# certificateAuthorities:
# - ca-org1

# [Optional]. If the application is going to make requests that are reserved to organization
# administrators, including creating/updating channels, installing/instantiating chaincodes, it
# must have access to the admin identity represented by the private key and signing certificate.
# Both properties can be the PEM string or local path to the PEM file. Note that this is mainly for
# convenience in development mode, production systems should not expose sensitive information
# this way. The SDK should allow applications to set the org admin identity via APIs, and only use
# this route as an alternative when it exists.
# adminPrivateKey:
# pem: "-----BEGIN PRIVATE KEY----- <etc>"
# signedCert:
# path: "/tmp/somepath/signed-cert.pem"


#
# List of orderers to send transaction and channel create/update requests to. For the time
# being only one orderer is needed. If more than one is defined, which one get used by the
# SDK is implementation specific. Consult each SDK's documentation for its handling of orderers.
#
orderers:
# orderer.example.com:
# url: orderer.example.com:7050

# these are standard properties defined by the gRPC library
# they will be passed in as-is to gRPC client constructor
# grpcOptions:
# ssl-target-name-override: orderer.example.com
# grpc-max-send-message-length: 15

# tlsCACerts:
# Certificate location absolute path
# path: $GOPATH/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/channel/crypto-config/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem

#
# List of peers to send various requests to, including endorsement, query
# and event listener registration.
#
peers:
# peer0.org1.example.com:
# this URL is used to send endorsement and query requests
# url: peer0.org1.example.com:7051

# this URL is used to connect the EventHub and registering event listeners
# eventUrl: peer0.org1.example.com:7053

# grpcOptions:
# ssl-target-name-override: peer0.org1.example.com
# grpc.http2.keepalive_time: 15

# tlsCACerts:
# Certificate location absolute path
# path: path/to/tls/cert/for/peer0/org1

#
# Fabric-CA is a special kind of Certificate Authority provided by Hyperledger Fabric which allows
# certificate management to be done via REST APIs. Application may choose to use a standard
# Certificate Authority instead of Fabric-CA, in which case this section would not be specified.
#
certificateAuthorities:
# ca-org1:
# url: https://ca_peerOrg1:7054
# the properties specified under this object are passed to the 'http' client verbatim when
# making the request to the Fabric-CA server
# httpOptions:
# verify: true
# tlsCACerts:
# Comma-Separated list of paths
# path: path/to/tls/cert/for/ca-org1
# Client key and cert for SSL handshake with Fabric CA
# client:
# keyfile: path/to/client_fabric_client-key.pem
# certfile: path/to/client_fabric_client.pem

# Fabric-CA supports dynamic user enrollment via REST APIs. A "root" user, a.k.a registrar, is
# needed to enroll and invoke new users.
# registrar:
# enrollId: usualy-it-is_admin
# enrollSecret: adminpasswd
# [Optional] The optional name of the CA.
# caName: ca-org1
Loading

0 comments on commit bf29760

Please sign in to comment.