github.com/kubernetes-incubator/kube-aws@v0.16.4/provisioner/package.go (about)

     1  package provisioner
     2  
     3  import (
     4  	"archive/tar"
     5  	"bytes"
     6  	"compress/gzip"
     7  	"fmt"
     8  	"io"
     9  	"os"
    10  	"path/filepath"
    11  	"strings"
    12  	"time"
    13  )
    14  
    15  func (p TarGzArchiver) Name() string {
    16  	return filepath.Base(p.File.Path)
    17  }
    18  
    19  func CreateTarGzArchive(archive RemoteFileSpec, bundle []RemoteFileSpec, loader *RemoteFileLoader) error {
    20  	files := []*RemoteFile{}
    21  	for _, s := range bundle {
    22  		f, err := loader.Load(s)
    23  		if err != nil {
    24  			return fmt.Errorf("failed materializing %s: %v", s.Path, err)
    25  		}
    26  		files = append(files, f)
    27  	}
    28  
    29  	localpath := archive.Source.Path
    30  	dir := filepath.Dir(localpath)
    31  	if err := os.MkdirAll(dir, 0700); err != nil {
    32  		return fmt.Errorf("failed creating dir %s: %v", dir, err)
    33  	}
    34  
    35  	file, err := os.Create(localpath)
    36  	if err != nil {
    37  		return fmt.Errorf("failed creating %s: %v", localpath, err)
    38  	}
    39  	defer file.Close()
    40  
    41  	gzipWriter := gzip.NewWriter(file)
    42  
    43  	defer gzipWriter.Close()
    44  
    45  	tarWriter := tar.NewWriter(gzipWriter)
    46  	defer tarWriter.Close()
    47  
    48  	for i := range bundle {
    49  		if err := tarWriteFile(tarWriter, bundle[i]); err != nil {
    50  			return fmt.Errorf("failed writing tar: %v", err)
    51  		}
    52  	}
    53  
    54  	return nil
    55  }
    56  
    57  func tarWriteFile(tarWriter *tar.Writer, file RemoteFileSpec) error {
    58  	var reader io.Reader
    59  	var header *tar.Header
    60  
    61  	srcpath := file.Source.Path
    62  	if srcpath != "" {
    63  		srcfile, err := os.Open(srcpath)
    64  		if err != nil {
    65  			return err
    66  		}
    67  		defer srcfile.Close()
    68  
    69  		stat, err := srcfile.Stat()
    70  		if err != nil {
    71  			return err
    72  		}
    73  
    74  		header, err = tar.FileInfoHeader(stat, "")
    75  		if err != nil {
    76  			return err
    77  		}
    78  		reader = srcfile
    79  	} else {
    80  		header = new(tar.Header)
    81  		header.Size = int64(len(file.Content.bytes))
    82  		header.Mode = int64(*file.FileMode())
    83  		header.ModTime = time.Now()
    84  		reader = bytes.NewBuffer(file.Content.bytes)
    85  	}
    86  
    87  	dstpath := file.Path
    88  	intarpath := strings.TrimPrefix(dstpath, "/")
    89  
    90  	fmt.Fprintf(os.Stderr, "archiving %s as %s\n", srcpath, intarpath)
    91  
    92  	header.Name = intarpath
    93  
    94  	if err := tarWriter.WriteHeader(header); err != nil {
    95  		return err
    96  	}
    97  
    98  	if _, err := io.Copy(tarWriter, reader); err != nil {
    99  		return err
   100  	}
   101  	return nil
   102  }