146 lines
4.6 KiB
Go
146 lines
4.6 KiB
Go
/*
|
|
Copyright IBM Corp. All Rights Reserved.
|
|
|
|
SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package lifecycle
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
"syscall"
|
|
|
|
docker "github.com/fsouza/go-dockerclient"
|
|
"github.com/hyperledger/fabric/integration/channelparticipation"
|
|
"github.com/hyperledger/fabric/integration/nwo"
|
|
"github.com/hyperledger/fabric/integration/nwo/commands"
|
|
"github.com/hyperledger/fabric/integration/nwo/fabricconfig"
|
|
. "github.com/onsi/ginkgo/v2"
|
|
. "github.com/onsi/gomega"
|
|
"github.com/onsi/gomega/gbytes"
|
|
"github.com/onsi/gomega/gexec"
|
|
"github.com/tedsuo/ifrit"
|
|
ginkgomon "github.com/tedsuo/ifrit/ginkgomon_v2"
|
|
)
|
|
|
|
var _ = Describe("chaincode install", func() {
|
|
var (
|
|
client *docker.Client
|
|
testDir string
|
|
|
|
network *nwo.Network
|
|
ordererRunner *ginkgomon.Runner
|
|
ordererProcess, peerProcess ifrit.Process
|
|
)
|
|
|
|
BeforeEach(func() {
|
|
var err error
|
|
testDir, err = ioutil.TempDir("", "lifecycle")
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
client, err = docker.NewClientFromEnv()
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
cwd, err := os.Getwd()
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
network = nwo.New(nwo.BasicEtcdRaft(), testDir, client, StartPort(), components)
|
|
network.ExternalBuilders = append(network.ExternalBuilders, fabricconfig.ExternalBuilder{
|
|
Path: filepath.Join(cwd, "..", "externalbuilders", "golang"),
|
|
Name: "external-golang",
|
|
PropagateEnvironment: []string{"GOPATH", "GOCACHE", "GOPROXY", "HOME", "PATH"},
|
|
})
|
|
network.GenerateConfigTree()
|
|
network.Bootstrap()
|
|
|
|
// Start all the fabric processes
|
|
ordererRunner, ordererProcess, peerProcess = network.StartSingleOrdererNetwork("orderer")
|
|
})
|
|
|
|
AfterEach(func() {
|
|
if ordererProcess != nil {
|
|
ordererProcess.Signal(syscall.SIGTERM)
|
|
Eventually(ordererProcess.Wait(), network.EventuallyTimeout).Should(Receive())
|
|
}
|
|
|
|
if peerProcess != nil {
|
|
peerProcess.Signal(syscall.SIGTERM)
|
|
Eventually(peerProcess.Wait(), network.EventuallyTimeout).Should(Receive())
|
|
}
|
|
network.Cleanup()
|
|
os.RemoveAll(testDir)
|
|
})
|
|
|
|
Describe("external builder failures", func() {
|
|
var (
|
|
orderer *nwo.Orderer
|
|
org1Peer *nwo.Peer
|
|
org2Peer *nwo.Peer
|
|
chaincode nwo.Chaincode
|
|
)
|
|
|
|
BeforeEach(func() {
|
|
packageTempDir, err := ioutil.TempDir(network.RootDir, "chaincode-package")
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
orderer = network.Orderer("orderer")
|
|
org1Peer = network.Peer("Org1", "peer0")
|
|
org2Peer = network.Peer("Org2", "peer0")
|
|
channelparticipation.JoinOrdererJoinPeersAppChannel(network, "testchannel", orderer, ordererRunner)
|
|
|
|
chaincode = nwo.Chaincode{
|
|
Name: "failure-external",
|
|
Version: "0.0",
|
|
Lang: "golang",
|
|
Path: "github.com/hyperledger/fabric/integration/chaincode/simple/cmd",
|
|
Ctor: `{"Args":["init","a","100","b","200"]}`,
|
|
Policy: `OR ('Org1MSP.member','Org2MSP.member')`,
|
|
SignaturePolicy: `OR ('Org1MSP.member','Org2MSP.member')`,
|
|
Sequence: "1",
|
|
InitRequired: false,
|
|
Label: "failure-external",
|
|
PackageFile: filepath.Join(packageTempDir, "chaincode-package"),
|
|
}
|
|
})
|
|
|
|
It("legacy does not fallback to internal platforms", func() {
|
|
By("packaging the chaincode using the legacy lifecycle")
|
|
nwo.PackageChaincodeLegacy(network, chaincode, org1Peer)
|
|
|
|
By("installing the chaincode using the legacy lifecycle")
|
|
sess, err := network.PeerAdminSession(org1Peer, commands.ChaincodeInstallLegacy{
|
|
Name: chaincode.Name,
|
|
Version: chaincode.Version,
|
|
Path: chaincode.Path,
|
|
Lang: chaincode.Lang,
|
|
PackageFile: chaincode.PackageFile,
|
|
ClientAuth: network.ClientAuthRequired,
|
|
})
|
|
Expect(err).NotTo(HaveOccurred())
|
|
Eventually(sess, network.EventuallyTimeout).Should(gexec.Exit(1))
|
|
|
|
Expect(sess.Err).To(gbytes.Say(`\Qexternal builder 'external-golang' failed: exit status 1\E`))
|
|
})
|
|
|
|
It("_lifecycle does not fallback to internal platforms when an external builder fails", func() {
|
|
By("enabling V2_0 application capabilities")
|
|
nwo.EnableCapabilities(network, "testchannel", "Application", "V2_0", orderer, org1Peer, org2Peer)
|
|
|
|
By("packaging the chaincode")
|
|
nwo.PackageChaincode(network, chaincode, org1Peer)
|
|
|
|
By("installing the chaincode using _lifecycle")
|
|
sess, err := network.PeerAdminSession(org1Peer, commands.ChaincodeInstall{
|
|
PackageFile: chaincode.PackageFile,
|
|
ClientAuth: network.ClientAuthRequired,
|
|
})
|
|
Expect(err).NotTo(HaveOccurred())
|
|
Eventually(sess, network.EventuallyTimeout).Should(gexec.Exit(1))
|
|
|
|
Expect(sess.Err).To(gbytes.Say(`\Qexternal builder 'external-golang' failed: exit status 1\E`))
|
|
})
|
|
})
|
|
})
|