177 lines
5.5 KiB
Go
177 lines
5.5 KiB
Go
/*
|
|
Copyright IBM Corp. All Rights Reserved.
|
|
|
|
SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package common
|
|
|
|
import (
|
|
"io/ioutil"
|
|
|
|
"github.com/pkg/errors"
|
|
yaml "gopkg.in/yaml.v2"
|
|
)
|
|
|
|
// NetworkConfig provides a static definition of a Hyperledger Fabric network
|
|
type NetworkConfig struct {
|
|
Name string `yaml:"name"`
|
|
Xtype string `yaml:"x-type"`
|
|
Description string `yaml:"description"`
|
|
Version string `yaml:"version"`
|
|
Channels map[string]ChannelNetworkConfig `yaml:"channels"`
|
|
Organizations map[string]OrganizationConfig `yaml:"organizations"`
|
|
Peers map[string]PeerConfig `yaml:"peers"`
|
|
Client ClientConfig `yaml:"client"`
|
|
Orderers map[string]OrdererConfig `yaml:"orderers"`
|
|
CertificateAuthorities map[string]CAConfig `yaml:"certificateAuthorities"`
|
|
}
|
|
|
|
// ClientConfig - not currently used by CLI
|
|
type ClientConfig struct {
|
|
Organization string `yaml:"organization"`
|
|
Logging LoggingType `yaml:"logging"`
|
|
CryptoConfig CCType `yaml:"cryptoconfig"`
|
|
TLS TLSType `yaml:"tls"`
|
|
CredentialStore CredentialStoreType `yaml:"credentialStore"`
|
|
}
|
|
|
|
// LoggingType not currently used by CLI
|
|
type LoggingType struct {
|
|
Level string `yaml:"level"`
|
|
}
|
|
|
|
// CCType - not currently used by CLI
|
|
type CCType struct {
|
|
Path string `yaml:"path"`
|
|
}
|
|
|
|
// TLSType - not currently used by CLI
|
|
type TLSType struct {
|
|
Enabled bool `yaml:"enabled"`
|
|
}
|
|
|
|
// CredentialStoreType - not currently used by CLI
|
|
type CredentialStoreType struct {
|
|
Path string `yaml:"path"`
|
|
CryptoStore struct {
|
|
Path string `yaml:"path"`
|
|
}
|
|
Wallet string `yaml:"wallet"`
|
|
}
|
|
|
|
// ChannelNetworkConfig provides the definition of channels for the network
|
|
type ChannelNetworkConfig struct {
|
|
// Orderers list of ordering service nodes
|
|
Orderers []string `yaml:"orderers"`
|
|
// Peers a list of peer-channels that are part of this organization
|
|
// to get the real Peer config object, use the Name field and fetch NetworkConfig.Peers[Name]
|
|
Peers map[string]PeerChannelConfig `yaml:"peers"`
|
|
// Chaincodes list of services
|
|
Chaincodes []string `yaml:"chaincodes"`
|
|
}
|
|
|
|
// PeerChannelConfig defines the peer capabilities
|
|
type PeerChannelConfig struct {
|
|
EndorsingPeer bool `yaml:"endorsingPeer"`
|
|
ChaincodeQuery bool `yaml:"chaincodeQuery"`
|
|
LedgerQuery bool `yaml:"ledgerQuery"`
|
|
EventSource bool `yaml:"eventSource"`
|
|
}
|
|
|
|
// OrganizationConfig provides the definition of an organization in the network
|
|
// not currently used by CLI
|
|
type OrganizationConfig struct {
|
|
MspID string `yaml:"mspid"`
|
|
Peers []string `yaml:"peers"`
|
|
CryptoPath string `yaml:"cryptoPath"`
|
|
CertificateAuthorities []string `yaml:"certificateAuthorities"`
|
|
AdminPrivateKey TLSConfig `yaml:"adminPrivateKey"`
|
|
SignedCert TLSConfig `yaml:"signedCert"`
|
|
}
|
|
|
|
// OrdererConfig defines an orderer configuration
|
|
// not currently used by CLI
|
|
type OrdererConfig struct {
|
|
URL string `yaml:"url"`
|
|
GrpcOptions map[string]interface{} `yaml:"grpcOptions"`
|
|
TLSCACerts TLSConfig `yaml:"tlsCACerts"`
|
|
}
|
|
|
|
// PeerConfig defines a peer configuration
|
|
type PeerConfig struct {
|
|
URL string `yaml:"url"`
|
|
EventURL string `yaml:"eventUrl"`
|
|
GRPCOptions map[string]interface{} `yaml:"grpcOptions"`
|
|
TLSCACerts TLSConfig `yaml:"tlsCACerts"`
|
|
}
|
|
|
|
// CAConfig defines a CA configuration
|
|
// not currently used by CLI
|
|
type CAConfig struct {
|
|
URL string `yaml:"url"`
|
|
HTTPOptions map[string]interface{} `yaml:"httpOptions"`
|
|
TLSCACerts MutualTLSConfig `yaml:"tlsCACerts"`
|
|
Registrar EnrollCredentials `yaml:"registrar"`
|
|
CaName string `yaml:"caName"`
|
|
}
|
|
|
|
// EnrollCredentials holds credentials used for enrollment
|
|
// not currently used by CLI
|
|
type EnrollCredentials struct {
|
|
EnrollID string `yaml:"enrollId"`
|
|
EnrollSecret string `yaml:"enrollSecret"`
|
|
}
|
|
|
|
// TLSConfig TLS configurations
|
|
type TLSConfig struct {
|
|
// the following two fields are interchangeable.
|
|
// If Path is available, then it will be used to load the cert
|
|
// if Pem is available, then it has the raw data of the cert it will be used as-is
|
|
// Certificate root certificate path
|
|
Path string `yaml:"path"`
|
|
// Certificate actual content
|
|
Pem string `yaml:"pem"`
|
|
}
|
|
|
|
// MutualTLSConfig Mutual TLS configurations
|
|
// not currently used by CLI
|
|
type MutualTLSConfig struct {
|
|
Pem []string `yaml:"pem"`
|
|
|
|
// Certfiles root certificates for TLS validation (Comma separated path list)
|
|
Path string `yaml:"path"`
|
|
|
|
// Client TLS information
|
|
Client TLSKeyPair `yaml:"client"`
|
|
}
|
|
|
|
// TLSKeyPair contains the private key and certificate for TLS encryption
|
|
// not currently used by CLI
|
|
type TLSKeyPair struct {
|
|
Key TLSConfig `yaml:"key"`
|
|
Cert TLSConfig `yaml:"cert"`
|
|
}
|
|
|
|
// GetConfig unmarshals the provided connection profile into a network
|
|
// configuration struct
|
|
func GetConfig(fileName string) (*NetworkConfig, error) {
|
|
if fileName == "" {
|
|
return nil, errors.New("filename cannot be empty")
|
|
}
|
|
|
|
data, err := ioutil.ReadFile(fileName)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "error reading connection profile")
|
|
}
|
|
|
|
configData := string(data)
|
|
config := &NetworkConfig{}
|
|
err = yaml.Unmarshal([]byte(configData), &config)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "error unmarshalling YAML")
|
|
}
|
|
|
|
return config, nil
|
|
}
|