Browse code

move load to a job

Docker-DCO-1.1-Signed-off-by: Victor Vieux <victor.vieux@docker.com> (github: vieux)

Victor Vieux authored on 2014/01/21 09:09:17
Showing 3 changed files
... ...
@@ -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 {