graph/import.go
fa27580c
 package graph
 
 import (
17abfc3d
 	"bytes"
 	"encoding/json"
fa27580c
 	"net/http"
 	"net/url"
 
ef741525
 	log "github.com/Sirupsen/logrus"
fa27580c
 	"github.com/docker/docker/engine"
30d5a42c
 	"github.com/docker/docker/pkg/archive"
12b278d3
 	"github.com/docker/docker/pkg/progressreader"
17abfc3d
 	"github.com/docker/docker/runconfig"
fa27580c
 	"github.com/docker/docker/utils"
 )
 
 func (s *TagStore) CmdImport(job *engine.Job) engine.Status {
 	if n := len(job.Args); n != 2 && n != 3 {
 		return job.Errorf("Usage: %s SRC REPO [TAG]", job.Name)
 	}
 	var (
17abfc3d
 		src          = job.Args[0]
 		repo         = job.Args[1]
 		tag          string
 		sf           = utils.NewStreamFormatter(job.GetenvBool("json"))
 		archive      archive.ArchiveReader
 		resp         *http.Response
 		stdoutBuffer = bytes.NewBuffer(nil)
 		newConfig    runconfig.Config
fa27580c
 	)
 	if len(job.Args) > 2 {
 		tag = job.Args[2]
 	}
 
 	if src == "-" {
 		archive = job.Stdin
 	} else {
 		u, err := url.Parse(src)
 		if err != nil {
 			return job.Error(err)
 		}
 		if u.Scheme == "" {
 			u.Scheme = "http"
 			u.Host = src
 			u.Path = ""
 		}
 		job.Stdout.Write(sf.FormatStatus("", "Downloading from %s", u))
 		resp, err = utils.Download(u.String())
 		if err != nil {
 			return job.Error(err)
 		}
12b278d3
 		progressReader := progressreader.New(progressreader.Config{
 			In:        resp.Body,
 			Out:       job.Stdout,
 			Formatter: sf,
 			Size:      int(resp.ContentLength),
 			NewLines:  true,
 			ID:        "",
 			Action:    "Importing",
 		})
fa27580c
 		defer progressReader.Close()
 		archive = progressReader
 	}
17abfc3d
 
 	buildConfigJob := job.Eng.Job("build_config")
 	buildConfigJob.Stdout.Add(stdoutBuffer)
 	buildConfigJob.Setenv("changes", job.Getenv("changes"))
 	// FIXME this should be remove when we remove deprecated config param
 	buildConfigJob.Setenv("config", job.Getenv("config"))
 
 	if err := buildConfigJob.Run(); err != nil {
 		return job.Error(err)
 	}
 	if err := json.NewDecoder(stdoutBuffer).Decode(&newConfig); err != nil {
 		return job.Error(err)
 	}
 
 	img, err := s.graph.Create(archive, "", "", "Imported from "+src, "", nil, &newConfig)
fa27580c
 	if err != nil {
 		return job.Error(err)
 	}
 	// Optionally register the image at REPO/TAG
 	if repo != "" {
 		if err := s.Set(repo, tag, img.ID, true); err != nil {
 			return job.Error(err)
 		}
 	}
 	job.Stdout.Write(sf.FormatStatus("", img.ID))
ef741525
 	logID := img.ID
 	if tag != "" {
a2b0c977
 		logID = utils.ImageReference(logID, tag)
ef741525
 	}
 	if err = job.Eng.Job("log", "import", logID, "").Run(); err != nil {
 		log.Errorf("Error logging event 'import' for %s: %s", logID, err)
 	}
fa27580c
 	return engine.StatusOK
 }