func bindMount(bindDir string, rootDir string, readonly bool) error { var srcDir, destDir string d := strings.SplitN(bindDir, ":", 2) if len(d) < 2 { srcDir = d[0] } else { srcDir, destDir = d[0], d[1] } if destDir == "" { destDir = srcDir } ok, err := osutil.IsDirEmpty(srcDir) if err != nil { return err } if ok { if _, err := os.Create(fp.Join(srcDir, ".droot.keep")); err != nil { return errwrap.Wrapf(err, "Failed to create .droot.keep: {{err}}") } } containerDir := fp.Join(rootDir, destDir) if err := fileutils.CreateIfNotExists(containerDir, true); err != nil { // mkdir -p return errwrap.Wrapff(err, "Failed to create directory: %s: {{err}}", containerDir) } ok, err = osutil.IsDirEmpty(containerDir) if err != nil { return err } if ok { log.Debug("bind mount", bindDir, "to", containerDir) if err := mount.Mount(srcDir, containerDir, "none", "bind,rw"); err != nil { return errwrap.Wrapff(err, "Failed to bind mount %s: {{err}}", containerDir) } if readonly { log.Debug("robind mount", bindDir, "to", containerDir) if err := mount.Mount(srcDir, containerDir, "none", "remount,ro,bind"); err != nil { return errwrap.Wrapff(err, "Failed to robind mount %s: {{err}}", containerDir) } } } return nil }
func Compress(in io.Reader) io.ReadCloser { pReader, pWriter := io.Pipe() bufWriter := bufio.NewWriterSize(pWriter, compressionBufSize) compressor := gzip.NewWriter(bufWriter) go func() { _, err := io.Copy(compressor, in) if err == nil { err = compressor.Close() } if err == nil { err = bufWriter.Flush() } if err != nil { pWriter.CloseWithError(errwrap.Wrapf(err, "Failed to compress: {{err}}")) } else { pWriter.Close() } }() return pReader }
func (clt *S3Client) Upload(bucket, key string, reader io.Reader) (string, error) { ok, err := clt.ExistsBucket(bucket) if err != nil { return "", err } if !ok { return "", fmt.Errorf("No such bucket: %s", bucket) } upOutput, err := clt.uploader.Upload(&s3manager.UploadInput{ Bucket: &bucket, Key: &key, Body: reader, }, func(u *s3manager.Uploader) { u.PartSize = uploadPartSize }) if err != nil { return "", errwrap.Wrapf(err, "Failed to upload s3: {{err}}") } return upOutput.Location, nil }
func (clt *S3Client) Download(s3Url *url.URL, writer io.WriterAt) (int64, error) { bucket, object := s3Url.Host, s3Url.Path ok, err := clt.ExistsBucket(bucket) if err != nil { return -1, err } if !ok { return -1, fmt.Errorf("No such bucket: %s", bucket) } nBytes, err := clt.downloader.Download(writer, &s3.GetObjectInput{ Bucket: &bucket, Key: &object, }, func(d *s3manager.Downloader) { d.PartSize = downloadPartSize }) if err != nil { return -1, errwrap.Wrapf(err, "Failed to download s3: {{err}}") } return nBytes, nil }