Implement docker import with the standalone client lib.

Signed-off-by: David Calavera <david.calavera@gmail.com>
This commit is contained in:
David Calavera 2015-12-03 17:11:37 -05:00
parent 381262fbea
commit 6bf757500b
3 changed files with 64 additions and 19 deletions

View File

@ -3,12 +3,13 @@ package client
import ( import (
"fmt" "fmt"
"io" "io"
"net/url"
"os" "os"
"github.com/docker/distribution/reference" "github.com/docker/distribution/reference"
"github.com/docker/docker/api/client/lib"
Cli "github.com/docker/docker/cli" Cli "github.com/docker/docker/cli"
"github.com/docker/docker/opts" "github.com/docker/docker/opts"
"github.com/docker/docker/pkg/jsonmessage"
flag "github.com/docker/docker/pkg/mflag" flag "github.com/docker/docker/pkg/mflag"
"github.com/docker/docker/pkg/urlutil" "github.com/docker/docker/pkg/urlutil"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
@ -29,20 +30,17 @@ func (cli *DockerCli) CmdImport(args ...string) error {
cmd.ParseFlags(args, true) cmd.ParseFlags(args, true)
var ( var (
v = url.Values{} in io.Reader
tag string
src = cmd.Arg(0) src = cmd.Arg(0)
srcName = src
repository = cmd.Arg(1) repository = cmd.Arg(1)
changes = flChanges.GetAll()
) )
v.Set("fromSrc", src)
v.Set("repo", repository)
v.Set("message", *message)
for _, change := range flChanges.GetAll() {
v.Add("changes", change)
}
if cmd.NArg() == 3 { if cmd.NArg() == 3 {
fmt.Fprintf(cli.err, "[DEPRECATED] The format 'file|URL|- [REPOSITORY [TAG]]' has been deprecated. Please use file|URL|- [REPOSITORY[:TAG]]\n") fmt.Fprintf(cli.err, "[DEPRECATED] The format 'file|URL|- [REPOSITORY [TAG]]' has been deprecated. Please use file|URL|- [REPOSITORY[:TAG]]\n")
v.Set("tag", cmd.Arg(2)) tag = cmd.Arg(2)
} }
if repository != "" { if repository != "" {
@ -56,12 +54,10 @@ func (cli *DockerCli) CmdImport(args ...string) error {
} }
} }
var in io.Reader
if src == "-" { if src == "-" {
in = cli.in in = cli.in
} else if !urlutil.IsURL(src) { } else if !urlutil.IsURL(src) {
v.Set("fromSrc", "-") srcName = "-"
file, err := os.Open(src) file, err := os.Open(src)
if err != nil { if err != nil {
return err return err
@ -71,12 +67,20 @@ func (cli *DockerCli) CmdImport(args ...string) error {
} }
sopts := &streamOpts{ options := lib.ImportImageOptions{
rawTerminal: true, Source: in,
in: in, SourceName: srcName,
out: cli.out, RepositoryName: repository,
Message: *message,
Tag: tag,
Changes: changes,
} }
_, err := cli.stream("POST", "/images/create?"+v.Encode(), sopts) responseBody, err := cli.client.ImportImage(options)
return err if err != nil {
return err
}
defer responseBody.Close()
return jsonmessage.DisplayJSONMessagesStream(responseBody, cli.out, cli.outFd, cli.isTerminalOut)
} }

View File

@ -5,7 +5,7 @@ import (
"net/url" "net/url"
) )
// CreateImageOptions holds information to create images // CreateImageOptions holds information to create images.
type CreateImageOptions struct { type CreateImageOptions struct {
// Parent is the image to create this image from // Parent is the image to create this image from
Parent string Parent string

View File

@ -0,0 +1,41 @@
package lib
import (
"io"
"net/url"
)
// ImportImageOptions holds information to import images from the client host.
type ImportImageOptions struct {
// Source is the data to send to the server to create this image from
Source io.Reader
// Source is the name of the source to import this image from
SourceName string
// RepositoryName is the name of the repository to import this image
RepositoryName string
// Message is the message to tag the image with
Message string
// Tag is the name to tag this image
Tag string
// Changes are the raw changes to apply to the image
Changes []string
}
// ImportImage creates a new image based in the source options.
// It returns the JSON content in the response body.
func (cli *Client) ImportImage(options ImportImageOptions) (io.ReadCloser, error) {
var query url.Values
query.Set("fromSrc", options.SourceName)
query.Set("repo", options.RepositoryName)
query.Set("tag", options.Tag)
query.Set("message", options.Message)
for _, change := range options.Changes {
query.Add("changes", change)
}
resp, err := cli.POSTRaw("/images/create", query, options.Source, nil)
if err != nil {
return nil, err
}
return resp.body, nil
}