diff --git a/azure-pipelines.yml b/azure-pipelines.yml index ea5fdaca..037953c8 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'ubuntu-latest' -jobs: +jobs: - job: displayName: build steps: @@ -44,8 +44,10 @@ jobs: arguments: '-v ./... -cover' workingDirectory: '$(System.DefaultWorkingDirectory)' - job: - displayName: integration-test + displayName: integration-test-org1-and-org2 steps: - - script: ./integration-test.sh - - + - script: ./test/integration-test.sh + - job: + displayName: integration-test-org1 + steps: + - script: ./test/integration-test.sh ORLogic diff --git a/cmd/stupid/main.go b/cmd/stupid/main.go index a949b9a2..196220bb 100644 --- a/cmd/stupid/main.go +++ b/cmd/stupid/main.go @@ -48,13 +48,13 @@ func main() { go assember.StartIntegrator(processed, envs, done) } - proposor := infra.CreateProposers(config.NumOfConn, config.ClientPerConn, config.Endorsers, crypto, logger) + proposor := infra.CreateProposers(config.NumOfConn, config.ClientPerConn, config.Endorsers, logger) proposor.Start(signed, processed, done, config) - broadcaster := infra.CreateBroadcasters(config.NumOfConn, config.Orderer.Addr, crypto, logger) + broadcaster := infra.CreateBroadcasters(config.NumOfConn, config.Orderer, logger) broadcaster.Start(envs, done) - observer := infra.CreateObserver(config.Committer.Addr, config.Channel, crypto, logger) + observer := infra.CreateObserver(config.Channel, config.Committer, crypto, logger) start := time.Now() go observer.Start(N, start) diff --git a/integration-test.sh b/integration-test.sh deleted file mode 100755 index afa3f58f..00000000 --- a/integration-test.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash -set -ex - -DIR=$PWD - -curl -vsS https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -cd ./fabric-samples/test-network -echo y | ./network.sh up createChannel -echo y | ./network.sh deployCC -cp -r organizations "$DIR" && cd "$DIR" -go build ./cmd/stupid -STUPID_LOGLEVEL=debug ./stupid config.yaml 100 - - diff --git a/pkg/infra/client.go b/pkg/infra/client.go index 270b67f5..ad6d99ff 100644 --- a/pkg/infra/client.go +++ b/pkg/infra/client.go @@ -10,7 +10,11 @@ import ( "github.com/hyperledger/fabric/core/comm" ) -func CreateGRPCClient(certs [][]byte) (*comm.GRPCClient, error) { +func CreateGRPCClient(cert []byte) (*comm.GRPCClient, error) { + var certs [][]byte + if cert != nil { + certs = append(certs, cert) + } config := comm.ClientConfig{} config.Timeout = 5 * time.Second config.SecOpts = comm.SecureOptions{ @@ -31,8 +35,8 @@ func CreateGRPCClient(certs [][]byte) (*comm.GRPCClient, error) { return grpcClient, nil } -func CreateEndorserClient(addr string, tlscacerts [][]byte) (peer.EndorserClient, error) { - gRPCClient, err := CreateGRPCClient(tlscacerts) +func CreateEndorserClient(addr string, tlscacert []byte) (peer.EndorserClient, error) { + gRPCClient, err := CreateGRPCClient(tlscacert) if err != nil { return nil, err } @@ -45,8 +49,8 @@ func CreateEndorserClient(addr string, tlscacerts [][]byte) (peer.EndorserClient return peer.NewEndorserClient(conn), nil } -func CreateBroadcastClient(addr string, tlscacerts [][]byte) (orderer.AtomicBroadcast_BroadcastClient, error) { - gRPCClient, err := CreateGRPCClient(tlscacerts) +func CreateBroadcastClient(addr string, tlscacert []byte) (orderer.AtomicBroadcast_BroadcastClient, error) { + gRPCClient, err := CreateGRPCClient(tlscacert) if err != nil { return nil, err } @@ -59,8 +63,8 @@ func CreateBroadcastClient(addr string, tlscacerts [][]byte) (orderer.AtomicBroa return orderer.NewAtomicBroadcastClient(conn).Broadcast(context.Background()) } -func CreateDeliverFilteredClient(addr string, tlscacerts [][]byte) (peer.Deliver_DeliverFilteredClient, error) { - gRPCClient, err := CreateGRPCClient(tlscacerts) +func CreateDeliverFilteredClient(addr string, tlscacert []byte) (peer.Deliver_DeliverFilteredClient, error) { + gRPCClient, err := CreateGRPCClient(tlscacert) if err != nil { return nil, err } diff --git a/pkg/infra/config.go b/pkg/infra/config.go index fc4447e8..441e6bb0 100644 --- a/pkg/infra/config.go +++ b/pkg/infra/config.go @@ -50,10 +50,9 @@ func (c Config) LoadCrypto() *Crypto { allcerts = append(allcerts, c.Orderer.TLSCACert) conf := CryptoConfig{ - MSPID: c.MSPID, - PrivKey: c.PrivateKey, - SignCert: c.SignCert, - TLSCACerts: allcerts, + MSPID: c.MSPID, + PrivKey: c.PrivateKey, + SignCert: c.SignCert, } priv, err := GetPrivateKey(conf.PrivKey) @@ -76,15 +75,17 @@ func (c Config) LoadCrypto() *Crypto { panic(err) } - certs, err := GetTLSCACerts(conf.TLSCACerts) - if err != nil { - panic(err) + return &Crypto{ + Creator: name, + PrivKey: priv, + SignCert: cert, } +} - return &Crypto{ - Creator: name, - PrivKey: priv, - SignCert: cert, - TLSCACerts: certs, +func GetTLSCACerts(file string) ([]byte, error) { + in, err := ioutil.ReadFile(file) + if err != nil { + return nil, err } + return in, nil } diff --git a/pkg/infra/crypto.go b/pkg/infra/crypto.go index a32d365e..ab91a325 100644 --- a/pkg/infra/crypto.go +++ b/pkg/infra/crypto.go @@ -29,10 +29,9 @@ type ECDSASignature struct { } type Crypto struct { - Creator []byte - PrivKey *ecdsa.PrivateKey - SignCert *x509.Certificate - TLSCACerts [][]byte + Creator []byte + PrivKey *ecdsa.PrivateKey + SignCert *x509.Certificate } func (s *Crypto) Sign(message []byte) ([]byte, error) { @@ -69,20 +68,6 @@ func (s *Crypto) NewSignatureHeader() (*common.SignatureHeader, error) { }, nil } -func GetTLSCACerts(files []string) ([][]byte, error) { - var certs [][]byte - for _, f := range files { - in, err := ioutil.ReadFile(f) - if err != nil { - return nil, err - } - - certs = append(certs, in) - } - - return certs, nil -} - func digest(in []byte) []byte { h := sha256.New() h.Write(in) diff --git a/pkg/infra/observer.go b/pkg/infra/observer.go index 515a5310..0af29a6f 100644 --- a/pkg/infra/observer.go +++ b/pkg/infra/observer.go @@ -14,8 +14,12 @@ type Observer struct { signal chan error } -func CreateObserver(addr, channel string, crypto *Crypto, logger *log.Logger) *Observer { - deliverer, err := CreateDeliverFilteredClient(addr, crypto.TLSCACerts) +func CreateObserver(channel string, node Node, crypto *Crypto, logger *log.Logger) *Observer { + TLSCACert, err := GetTLSCACerts(node.TLSCACert) + if err != nil { + panic(err) + } + deliverer, err := CreateDeliverFilteredClient(node.Addr, TLSCACert) if err != nil { panic(err) } diff --git a/pkg/infra/proposer.go b/pkg/infra/proposer.go index d5f3be64..3473f560 100644 --- a/pkg/infra/proposer.go +++ b/pkg/infra/proposer.go @@ -17,13 +17,17 @@ type Proposers struct { logger *log.Logger } -func CreateProposers(conn, client int, nodes []Node, crypto *Crypto, logger *log.Logger) *Proposers { +func CreateProposers(conn, client int, nodes []Node, logger *log.Logger) *Proposers { var ps [][]*Proposer //one proposer per connection per peer for _, node := range nodes { row := make([]*Proposer, conn) + TLSCACert, err := GetTLSCACerts(node.TLSCACert) + if err != nil { + panic(err) + } for j := 0; j < conn; j++ { - row[j] = CreateProposer(node.Addr, crypto, logger) + row[j] = CreateProposer(node.Addr, TLSCACert, logger) } ps = append(ps, row) } @@ -46,8 +50,8 @@ type Proposer struct { logger *log.Logger } -func CreateProposer(addr string, crypto *Crypto, logger *log.Logger) *Proposer { - endorser, err := CreateEndorserClient(addr, crypto.TLSCACerts) +func CreateProposer(addr string, TLSCACert []byte, logger *log.Logger) *Proposer { + endorser, err := CreateEndorserClient(addr, TLSCACert) if err != nil { panic(err) } @@ -84,10 +88,14 @@ func (p *Proposer) Start(signed, processed chan *Elements, done <-chan struct{}, type Broadcasters []*Broadcaster -func CreateBroadcasters(conn int, addr string, crypto *Crypto, logger *log.Logger) Broadcasters { +func CreateBroadcasters(conn int, orderer Node, logger *log.Logger) Broadcasters { bs := make(Broadcasters, conn) + TLSCACert, err := GetTLSCACerts(orderer.TLSCACert) + if err != nil { + panic(err) + } for i := 0; i < conn; i++ { - bs[i] = CreateBroadcaster(addr, crypto, logger) + bs[i] = CreateBroadcaster(orderer.Addr, TLSCACert, logger) } return bs @@ -105,8 +113,8 @@ type Broadcaster struct { logger *log.Logger } -func CreateBroadcaster(addr string, crypto *Crypto, logger *log.Logger) *Broadcaster { - client, err := CreateBroadcastClient(addr, crypto.TLSCACerts) +func CreateBroadcaster(addr string, tlscacert []byte, logger *log.Logger) *Broadcaster { + client, err := CreateBroadcastClient(addr, tlscacert) if err != nil { panic(err) } diff --git a/pkg/infra/proposer_test.go b/pkg/infra/proposer_test.go index 8c5b0748..cec04c90 100644 --- a/pkg/infra/proposer_test.go +++ b/pkg/infra/proposer_test.go @@ -18,13 +18,15 @@ var _ = Describe("Proposer", func() { Context("CreateProposer", func() { It("successfully creates a proposer", func() { - Proposer := infra.CreateProposer(addr, &infra.Crypto{}, nil) + var dummy []byte + Proposer := infra.CreateProposer(addr, dummy, nil) Expect(Proposer.Addr).To(Equal(addr)) }) It("error happen creates a proposer", func() { + var dummy []byte Expect(func() { - infra.CreateProposer("invalid_addr", &infra.Crypto{}, nil) + infra.CreateProposer("invalid_addr", dummy, nil) }).To(Panic()) }) }) diff --git a/test/configorg1andorg2.yaml b/test/configorg1andorg2.yaml new file mode 100644 index 00000000..3c15a507 --- /dev/null +++ b/test/configorg1andorg2.yaml @@ -0,0 +1,33 @@ +# Definition of nodes +peer1: &peer1 + addr: localhost:7051 + tls_ca_cert: ./organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem + +peer2: &peer2 + addr: localhost:9051 + tls_ca_cert: ./organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp/tlscacerts/tlsca.org2.example.com-cert.pem + +orderer1: &orderer1 + addr: localhost:7050 + tls_ca_cert: ./organizations/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem + +# Nodes to interact with +endorsers: + - *peer1 + - *peer2 +# we might support multi-committer in the future for more complex test scenario, +# i.e. consider tx committed only if it's done on >50% of nodes. But for now, +# it seems sufficient to support single committer. +committer: *peer2 +orderer: *orderer1 + +# Invocation configs +channel: mychannel +chaincode: basic +args: + - GetAllAssets +mspid: Org1MSP +private_key: ./organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/priv_sk +sign_cert: ./organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/User1@org1.example.com-cert.pem +num_of_conn: 10 +client_per_conn: 10 diff --git a/test/configselectendorser.yaml b/test/configselectendorser.yaml new file mode 100644 index 00000000..06b35de7 --- /dev/null +++ b/test/configselectendorser.yaml @@ -0,0 +1,32 @@ +# Definition of nodes +peer1: &peer1 + addr: localhost:7051 + tls_ca_cert: ./organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem + +peer2: &peer2 + addr: localhost:9051 + tls_ca_cert: ./organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp/tlscacerts/tlsca.org2.example.com-cert.pem + +orderer1: &orderer1 + addr: localhost:7050 + tls_ca_cert: ./organizations/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem + +# Nodes to interact with +endorsers: + - *peer1 +# we might support multi-committer in the future for more complex test scenario, +# i.e. consider tx committed only if it's done on >50% of nodes. But for now, +# it seems sufficient to support single committer. +committer: *peer2 +orderer: *orderer1 + +# Invocation configs +channel: mychannel +chaincode: basic +args: + - GetAllAssets +mspid: Org1MSP +private_key: ./organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/priv_sk +sign_cert: ./organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/User1@org1.example.com-cert.pem +num_of_conn: 10 +client_per_conn: 10 diff --git a/test/integration-test.sh b/test/integration-test.sh new file mode 100755 index 00000000..56cd42cb --- /dev/null +++ b/test/integration-test.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +set -ex + +DIR=$PWD +go build ./cmd/stupid +curl -vsS https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash + +cd ./fabric-samples/test-network +echo y | ./network.sh down +echo y | ./network.sh up createChannel +cp -r organizations "$DIR" + +CONFIG_FILE=./test/configorg1andorg2.yaml + +if [ $1 == "ORLogic" ]; then + CONFIG_FILE=./test/configselectendorser.yaml + ARGS=(-ccep "OR('Org1.member','Org2.member')") +fi + +echo y | ./network.sh deployCC "${ARGS[@]}" +cd "$DIR" +STUPID_LOGLEVEL=debug ./stupid $CONFIG_FILE 100