Docker-DCO-1.1-Signed-off-by: Victor Vieux <victor.vieux@docker.com> (github: vieux)
| ... | ... |
@@ -24,7 +24,7 @@ ok "/commit": postCommit, 0 |
| 24 | 24 |
TODO "/build": postBuild, 0 yes |
| 25 | 25 |
TODO "/images/create": postImagesCreate, N yes yes (pull) |
| 26 | 26 |
ok "/images/{name:.*}/insert": postImagesInsert, N yes yes
|
| 27 |
-... "/images/load": postImagesLoad, 1 yes (stdin) |
|
| 27 |
+ok "/images/load": postImagesLoad, 1 yes (stdin) |
|
| 28 | 28 |
TODO "/images/{name:.*}/push": postImagesPush, N yes
|
| 29 | 29 |
ok "/images/{name:.*}/tag": postImagesTag, 0
|
| 30 | 30 |
ok "/containers/create": postContainersCreate, 0 |
| ... | ... |
@@ -608,7 +608,9 @@ func getImagesGet(srv *Server, version float64, w http.ResponseWriter, r *http.R |
| 608 | 608 |
} |
| 609 | 609 |
|
| 610 | 610 |
func postImagesLoad(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
| 611 |
- return srv.ImageLoad(r.Body) |
|
| 611 |
+ job := srv.Eng.Job("load")
|
|
| 612 |
+ job.Stdin.Add(r.Body) |
|
| 613 |
+ return job.Run() |
|
| 612 | 614 |
} |
| 613 | 615 |
|
| 614 | 616 |
func postContainersCreate(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
| ... | ... |
@@ -95,6 +95,7 @@ func jobInitApi(job *engine.Job) engine.Status {
|
| 95 | 95 |
"search": srv.ImagesSearch, |
| 96 | 96 |
"changes": srv.ContainerChanges, |
| 97 | 97 |
"top": srv.ContainerTop, |
| 98 |
+ "load": srv.ImageLoad, |
|
| 98 | 99 |
} {
|
| 99 | 100 |
if err := job.Eng.Register(name, handler); err != nil {
|
| 100 | 101 |
job.Error(err) |
| ... | ... |
@@ -355,10 +356,11 @@ func (srv *Server) exportImage(image *Image, tempdir string) error {
|
| 355 | 355 |
|
| 356 | 356 |
// Loads a set of images into the repository. This is the complementary of ImageExport. |
| 357 | 357 |
// The input stream is an uncompressed tar ball containing images and metadata. |
| 358 |
-func (srv *Server) ImageLoad(in io.Reader) error {
|
|
| 358 |
+func (srv *Server) ImageLoad(job *engine.Job) engine.Status {
|
|
| 359 | 359 |
tmpImageDir, err := ioutil.TempDir("", "docker-import-")
|
| 360 | 360 |
if err != nil {
|
| 361 |
- return err |
|
| 361 |
+ job.Error(err) |
|
| 362 |
+ return engine.StatusErr |
|
| 362 | 363 |
} |
| 363 | 364 |
defer os.RemoveAll(tmpImageDir) |
| 364 | 365 |
|
| ... | ... |
@@ -369,33 +371,40 @@ func (srv *Server) ImageLoad(in io.Reader) error {
|
| 369 | 369 |
|
| 370 | 370 |
tarFile, err := os.Create(repoTarFile) |
| 371 | 371 |
if err != nil {
|
| 372 |
- return err |
|
| 372 |
+ job.Error(err) |
|
| 373 |
+ return engine.StatusErr |
|
| 373 | 374 |
} |
| 374 |
- if _, err := io.Copy(tarFile, in); err != nil {
|
|
| 375 |
- return err |
|
| 375 |
+ if _, err := io.Copy(tarFile, job.Stdin); err != nil {
|
|
| 376 |
+ job.Error(err) |
|
| 377 |
+ return engine.StatusErr |
|
| 376 | 378 |
} |
| 377 | 379 |
tarFile.Close() |
| 378 | 380 |
|
| 379 | 381 |
repoFile, err := os.Open(repoTarFile) |
| 380 | 382 |
if err != nil {
|
| 381 |
- return err |
|
| 383 |
+ job.Error(err) |
|
| 384 |
+ return engine.StatusErr |
|
| 382 | 385 |
} |
| 383 | 386 |
if err := os.Mkdir(repoDir, os.ModeDir); err != nil {
|
| 384 |
- return err |
|
| 387 |
+ job.Error(err) |
|
| 388 |
+ return engine.StatusErr |
|
| 385 | 389 |
} |
| 386 | 390 |
if err := archive.Untar(repoFile, repoDir, nil); err != nil {
|
| 387 |
- return err |
|
| 391 |
+ job.Error(err) |
|
| 392 |
+ return engine.StatusErr |
|
| 388 | 393 |
} |
| 389 | 394 |
|
| 390 | 395 |
dirs, err := ioutil.ReadDir(repoDir) |
| 391 | 396 |
if err != nil {
|
| 392 |
- return err |
|
| 397 |
+ job.Error(err) |
|
| 398 |
+ return engine.StatusErr |
|
| 393 | 399 |
} |
| 394 | 400 |
|
| 395 | 401 |
for _, d := range dirs {
|
| 396 | 402 |
if d.IsDir() {
|
| 397 | 403 |
if err := srv.recursiveLoad(d.Name(), tmpImageDir); err != nil {
|
| 398 |
- return err |
|
| 404 |
+ job.Error(err) |
|
| 405 |
+ return engine.StatusErr |
|
| 399 | 406 |
} |
| 400 | 407 |
} |
| 401 | 408 |
} |
| ... | ... |
@@ -404,21 +413,24 @@ func (srv *Server) ImageLoad(in io.Reader) error {
|
| 404 | 404 |
if err == nil {
|
| 405 | 405 |
repositories := map[string]Repository{}
|
| 406 | 406 |
if err := json.Unmarshal(repositoriesJson, &repositories); err != nil {
|
| 407 |
- return err |
|
| 407 |
+ job.Error(err) |
|
| 408 |
+ return engine.StatusErr |
|
| 408 | 409 |
} |
| 409 | 410 |
|
| 410 | 411 |
for imageName, tagMap := range repositories {
|
| 411 | 412 |
for tag, address := range tagMap {
|
| 412 | 413 |
if err := srv.runtime.repositories.Set(imageName, tag, address, true); err != nil {
|
| 413 |
- return err |
|
| 414 |
+ job.Error(err) |
|
| 415 |
+ return engine.StatusErr |
|
| 414 | 416 |
} |
| 415 | 417 |
} |
| 416 | 418 |
} |
| 417 | 419 |
} else if !os.IsNotExist(err) {
|
| 418 |
- return err |
|
| 420 |
+ job.Error(err) |
|
| 421 |
+ return engine.StatusErr |
|
| 419 | 422 |
} |
| 420 | 423 |
|
| 421 |
- return nil |
|
| 424 |
+ return engine.StatusOK |
|
| 422 | 425 |
} |
| 423 | 426 |
|
| 424 | 427 |
func (srv *Server) recursiveLoad(address, tmpImageDir string) error {
|