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  }