pkg/download: for downloading files into tmp
cmd/podman needs that functionality as well, so I figured it makes sense to break it into a separate package to reduce code clones. Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
This commit is contained in:
parent
86fc3c565d
commit
8eb373cb0a
|
|
@ -1,46 +0,0 @@
|
||||||
package libimage
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
)
|
|
||||||
|
|
||||||
// tmpdir returns a path to a temporary directory.
|
|
||||||
func tmpdir() string {
|
|
||||||
tmpdir := os.Getenv("TMPDIR")
|
|
||||||
if tmpdir == "" {
|
|
||||||
tmpdir = "/var/tmp"
|
|
||||||
}
|
|
||||||
|
|
||||||
return tmpdir
|
|
||||||
}
|
|
||||||
|
|
||||||
// downloadFromURL downloads an image in the format "https:/example.com/myimage.tar"
|
|
||||||
// and temporarily saves in it $TMPDIR/importxyz, which is deleted after the image is imported
|
|
||||||
func (r *Runtime) downloadFromURL(source string) (string, error) {
|
|
||||||
fmt.Printf("Downloading from %q\n", source)
|
|
||||||
|
|
||||||
outFile, err := ioutil.TempFile(r.systemContext.BigFilesTemporaryDir, "import")
|
|
||||||
if err != nil {
|
|
||||||
return "", errors.Wrap(err, "error creating file")
|
|
||||||
}
|
|
||||||
defer outFile.Close()
|
|
||||||
|
|
||||||
response, err := http.Get(source) // nolint:noctx
|
|
||||||
if err != nil {
|
|
||||||
return "", errors.Wrapf(err, "error downloading %q", source)
|
|
||||||
}
|
|
||||||
defer response.Body.Close()
|
|
||||||
|
|
||||||
_, err = io.Copy(outFile, response.Body)
|
|
||||||
if err != nil {
|
|
||||||
return "", errors.Wrapf(err, "error saving %s to %s", source, outFile.Name())
|
|
||||||
}
|
|
||||||
|
|
||||||
return outFile.Name(), nil
|
|
||||||
}
|
|
||||||
|
|
@ -2,9 +2,11 @@ package libimage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"github.com/containers/common/pkg/download"
|
||||||
storageTransport "github.com/containers/image/v5/storage"
|
storageTransport "github.com/containers/image/v5/storage"
|
||||||
tarballTransport "github.com/containers/image/v5/tarball"
|
tarballTransport "github.com/containers/image/v5/tarball"
|
||||||
v1 "github.com/opencontainers/image-spec/specs-go/v1"
|
v1 "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
|
@ -61,7 +63,8 @@ func (r *Runtime) Import(ctx context.Context, path string, options *ImportOption
|
||||||
u, err := url.ParseRequestURI(path)
|
u, err := url.ParseRequestURI(path)
|
||||||
if err == nil && u.Scheme != "" {
|
if err == nil && u.Scheme != "" {
|
||||||
// If source is a URL, download the file.
|
// If source is a URL, download the file.
|
||||||
file, err := r.downloadFromURL(path)
|
fmt.Printf("Downloading from %q\n", path)
|
||||||
|
file, err := download.FromURL(r.systemContext.BigFilesTemporaryDir, path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,16 @@ import (
|
||||||
// Faster than the standard library, see https://github.com/json-iterator/go.
|
// Faster than the standard library, see https://github.com/json-iterator/go.
|
||||||
var json = jsoniter.ConfigCompatibleWithStandardLibrary
|
var json = jsoniter.ConfigCompatibleWithStandardLibrary
|
||||||
|
|
||||||
|
// tmpdir returns a path to a temporary directory.
|
||||||
|
func tmpdir() string {
|
||||||
|
tmpdir := os.Getenv("TMPDIR")
|
||||||
|
if tmpdir == "" {
|
||||||
|
tmpdir = "/var/tmp"
|
||||||
|
}
|
||||||
|
|
||||||
|
return tmpdir
|
||||||
|
}
|
||||||
|
|
||||||
// RuntimeOptions allow for creating a customized Runtime.
|
// RuntimeOptions allow for creating a customized Runtime.
|
||||||
type RuntimeOptions struct {
|
type RuntimeOptions struct {
|
||||||
// The base system context of the runtime which will be used throughout
|
// The base system context of the runtime which will be used throughout
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
package download
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
// FromURL downloads the specified source to a file in tmpdir (OS defaults if
|
||||||
|
// empty).
|
||||||
|
func FromURL(tmpdir, source string) (string, error) {
|
||||||
|
tmp, err := ioutil.TempFile(tmpdir, "")
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("creating temporary download file: %w", err)
|
||||||
|
}
|
||||||
|
defer tmp.Close()
|
||||||
|
|
||||||
|
response, err := http.Get(source) // nolint:noctx
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("downloading %s: %w", source, err)
|
||||||
|
}
|
||||||
|
defer response.Body.Close()
|
||||||
|
|
||||||
|
_, err = io.Copy(tmp, response.Body)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("copying %s to %s: %w", source, tmp.Name(), err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return tmp.Name(), nil
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue