in cli_tools/gce_export/main.go [135:206]
func gzipDisk(file *os.File, size int64, writer io.WriteCloser) error {
wp := &progress{}
gw, err := gzip.NewWriterLevel(io.MultiWriter(wp, writer), *level)
if err != nil {
return err
}
rp := &progress{}
tw := tar.NewWriter(io.MultiWriter(rp, gw))
ls := splitLicenses(*licenses)
if ls != nil {
fmt.Printf("GCEExport: Creating gzipped image of %q with licenses %q.\n", file.Name(), ls)
} else {
fmt.Printf("GCEExport: Creating gzipped image of %q.\n", file.Name())
}
start := time.Now()
if ls != nil {
type lsJSON struct {
Licenses []string `json:"licenses"`
}
body, err := json.Marshal(lsJSON{Licenses: ls})
if err != nil {
return err
}
if err := tw.WriteHeader(&tar.Header{
Name: "manifest.json",
Mode: 0600,
Size: int64(len(body)),
Format: tar.FormatGNU,
}); err != nil {
return err
}
if _, err := tw.Write([]byte(body)); err != nil {
return err
}
}
if err := tw.WriteHeader(&tar.Header{
Name: "disk.raw",
Mode: 0600,
Size: size,
Format: tar.FormatGNU,
}); err != nil {
return err
}
go writeGzipProgress(start, size, rp, wp)
if _, err := io.CopyN(tw, file, size); err != nil {
return err
}
if err := tw.Close(); err != nil {
return err
}
if err := gw.Close(); err != nil {
return err
}
if err := writer.Close(); err != nil {
return err
}
since := time.Since(start)
spd := humanize.IBytes(uint64(size / int64(since.Seconds())))
ratio := size / wp.total
log.Printf("GCEExport: Finished creating gzipped image of %q in %s [%s/s] with a compression ratio of %d.", file.Name(), since, spd, ratio)
return nil
}