github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/integration/nwo/package.go (about) 1 /* 2 Copyright hechain All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package nwo 8 9 import ( 10 "archive/tar" 11 "compress/gzip" 12 "encoding/json" 13 "io" 14 "io/ioutil" 15 "os" 16 17 . "github.com/onsi/gomega" 18 ) 19 20 // PackageChaincodeBinary is a helper function to package 21 // an already built chaincode and write it to the location 22 // specified by Chaincode.PackageFile. 23 func PackageChaincodeBinary(c Chaincode) { 24 file, err := os.Create(c.PackageFile) 25 Expect(err).NotTo(HaveOccurred()) 26 defer file.Close() 27 writeTarGz(c, file) 28 } 29 30 func writeTarGz(c Chaincode, w io.Writer) { 31 gw := gzip.NewWriter(w) 32 tw := tar.NewWriter(gw) 33 defer closeAll(tw, gw) 34 35 writeMetadataJSON(tw, c.Path, c.Lang, c.Label) 36 37 writeCodeTarGz(tw, c.CodeFiles) 38 } 39 40 // packageMetadata holds the path, type, and label for a chaincode package 41 type packageMetadata struct { 42 Path string `json:"path"` 43 Type string `json:"type"` 44 Label string `json:"label"` 45 } 46 47 func writeMetadataJSON(tw *tar.Writer, path, ccType, label string) { 48 metadata, err := json.Marshal(&packageMetadata{ 49 Path: path, 50 Type: ccType, 51 Label: label, 52 }) 53 Expect(err).NotTo(HaveOccurred()) 54 55 // write it to the package as metadata.json 56 err = tw.WriteHeader(&tar.Header{ 57 Name: "metadata.json", 58 Size: int64(len(metadata)), 59 Mode: 0o100644, 60 }) 61 Expect(err).NotTo(HaveOccurred()) 62 _, err = tw.Write(metadata) 63 Expect(err).NotTo(HaveOccurred()) 64 } 65 66 func writeCodeTarGz(tw *tar.Writer, codeFiles map[string]string) { 67 // create temp file to hold code.tar.gz 68 tempfile, err := ioutil.TempFile("", "code.tar.gz") 69 Expect(err).NotTo(HaveOccurred()) 70 defer os.Remove(tempfile.Name()) 71 72 gzipWriter := gzip.NewWriter(tempfile) 73 tarWriter := tar.NewWriter(gzipWriter) 74 75 for source, target := range codeFiles { 76 file, err := os.Open(source) 77 Expect(err).NotTo(HaveOccurred()) 78 writeFileToTar(tarWriter, file, target) 79 file.Close() 80 } 81 82 // close down the inner tar 83 closeAll(tarWriter, gzipWriter) 84 85 writeFileToTar(tw, tempfile, "code.tar.gz") 86 } 87 88 func writeFileToTar(tw *tar.Writer, file *os.File, name string) { 89 _, err := file.Seek(0, 0) 90 Expect(err).NotTo(HaveOccurred()) 91 92 fi, err := file.Stat() 93 Expect(err).NotTo(HaveOccurred()) 94 header, err := tar.FileInfoHeader(fi, "") 95 Expect(err).NotTo(HaveOccurred()) 96 97 header.Name = name 98 err = tw.WriteHeader(header) 99 Expect(err).NotTo(HaveOccurred()) 100 101 _, err = io.Copy(tw, file) 102 Expect(err).NotTo(HaveOccurred()) 103 } 104 105 func closeAll(closers ...io.Closer) { 106 for _, c := range closers { 107 Expect(c.Close()).To(Succeed()) 108 } 109 }