85 lines
2.6 KiB
Go
85 lines
2.6 KiB
Go
/*
|
|
Copyright IBM Corp. All Rights Reserved.
|
|
|
|
SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package cluster
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/golang/protobuf/proto"
|
|
"github.com/hyperledger/fabric-protos-go/orderer"
|
|
)
|
|
|
|
//go:generate mockery --dir . --name Communicator --case underscore --output ./mocks/
|
|
|
|
// Communicator defines communication for a consenter
|
|
type Communicator interface {
|
|
// Remote returns a RemoteContext for the given RemoteNode ID in the context
|
|
// of the given channel, or error if connection cannot be established, or
|
|
// the channel wasn't configured
|
|
Remote(channel string, id uint64) (*RemoteContext, error)
|
|
// Configure configures the communication to connect to all
|
|
// given members, and disconnect from any members not among the given
|
|
// members.
|
|
Configure(channel string, members []RemoteNode)
|
|
// Shutdown shuts down the communicator
|
|
Shutdown()
|
|
}
|
|
|
|
// ChannelExtractor extracts the channel of a given message,
|
|
// or returns an empty string if that's not possible
|
|
type ChannelExtractor interface {
|
|
TargetChannel(message proto.Message) string
|
|
}
|
|
|
|
//go:generate mockery --dir . --name Handler --case underscore --output ./mocks/
|
|
|
|
// Handler handles Step() and Submit() requests and returns a corresponding response
|
|
type Handler interface {
|
|
OnConsensus(channel string, sender uint64, req *orderer.ConsensusRequest) error
|
|
OnSubmit(channel string, sender uint64, req *orderer.SubmitRequest) error
|
|
}
|
|
|
|
type NodeCerts struct {
|
|
// ServerTLSCert is the DER encoded TLS server certificate of the node
|
|
ServerTLSCert []byte
|
|
// ClientTLSCert is the DER encoded TLS client certificate of the node
|
|
ClientTLSCert []byte
|
|
// PEM-encoded X509 certificate authority to verify server certificates
|
|
ServerRootCA [][]byte
|
|
// PEM-encoded X509 certificate
|
|
Identity []byte
|
|
}
|
|
|
|
type NodeAddress struct {
|
|
// ID is unique among all members, and cannot be 0.
|
|
ID uint64
|
|
// Endpoint is the endpoint of the node, denoted in %s:%d format
|
|
Endpoint string
|
|
}
|
|
|
|
// RemoteNode represents a cluster member
|
|
type RemoteNode struct {
|
|
NodeAddress
|
|
NodeCerts
|
|
}
|
|
|
|
// String returns a string representation of this RemoteNode
|
|
func (rm RemoteNode) String() string {
|
|
return fmt.Sprintf("ID: %d,\nEndpoint: %s,\nServerTLSCert:%s,\nClientTLSCert:%s, ServerRootCA: %s",
|
|
rm.ID, rm.Endpoint, DERtoPEM(rm.ServerTLSCert), DERtoPEM(rm.ClientTLSCert), rm.ServerRootCA)
|
|
}
|
|
|
|
// go:generate mockery --dir . --name StepClientStream --case underscore --output ./mocks/
|
|
// StepClientStream
|
|
type StepClientStream interface {
|
|
Send(request *orderer.StepRequest) error
|
|
Recv() (*orderer.StepResponse, error)
|
|
Auth() error
|
|
Context() context.Context
|
|
}
|