| ... | ... |
@@ -112,7 +112,7 @@ func (graph *Graph) Create(layerData Archive, container *Container, comment, aut |
| 112 | 112 |
img.Container = container.Id |
| 113 | 113 |
img.ContainerConfig = *container.Config |
| 114 | 114 |
} |
| 115 |
- if err := graph.Register(layerData, img); err != nil {
|
|
| 115 |
+ if err := graph.Register(layerData, true, img); err != nil {
|
|
| 116 | 116 |
return nil, err |
| 117 | 117 |
} |
| 118 | 118 |
go img.Checksum() |
| ... | ... |
@@ -121,7 +121,7 @@ func (graph *Graph) Create(layerData Archive, container *Container, comment, aut |
| 121 | 121 |
|
| 122 | 122 |
// Register imports a pre-existing image into the graph. |
| 123 | 123 |
// FIXME: pass img as first argument |
| 124 |
-func (graph *Graph) Register(layerData Archive, img *Image) error {
|
|
| 124 |
+func (graph *Graph) Register(layerData Archive, store bool, img *Image) error {
|
|
| 125 | 125 |
if err := ValidateId(img.Id); err != nil {
|
| 126 | 126 |
return err |
| 127 | 127 |
} |
| ... | ... |
@@ -134,7 +134,7 @@ func (graph *Graph) Register(layerData Archive, img *Image) error {
|
| 134 | 134 |
if err != nil {
|
| 135 | 135 |
return fmt.Errorf("Mktemp failed: %s", err)
|
| 136 | 136 |
} |
| 137 |
- if err := StoreImage(img, layerData, tmp); err != nil {
|
|
| 137 |
+ if err := StoreImage(img, layerData, tmp, store); err != nil {
|
|
| 138 | 138 |
return err |
| 139 | 139 |
} |
| 140 | 140 |
// Commit |
| ... | ... |
@@ -56,7 +56,7 @@ func LoadImage(root string) (*Image, error) {
|
| 56 | 56 |
return img, nil |
| 57 | 57 |
} |
| 58 | 58 |
|
| 59 |
-func StoreImage(img *Image, layerData Archive, root string) error {
|
|
| 59 |
+func StoreImage(img *Image, layerData Archive, root string, store bool) error {
|
|
| 60 | 60 |
// Check that root doesn't already exist |
| 61 | 61 |
if _, err := os.Stat(root); err == nil {
|
| 62 | 62 |
return fmt.Errorf("Image %s already exists", img.Id)
|
| ... | ... |
@@ -68,6 +68,28 @@ func StoreImage(img *Image, layerData Archive, root string) error {
|
| 68 | 68 |
if err := os.MkdirAll(layer, 0700); err != nil {
|
| 69 | 69 |
return err |
| 70 | 70 |
} |
| 71 |
+ |
|
| 72 |
+ if store {
|
|
| 73 |
+ layerArchive := layerArchivePath(root) |
|
| 74 |
+ file, err := os.OpenFile(layerArchive, os.O_WRONLY|os.O_CREATE, 0600) |
|
| 75 |
+ if err != nil {
|
|
| 76 |
+ return err |
|
| 77 |
+ } |
|
| 78 |
+ // FIXME: Retrieve the image layer size from here? |
|
| 79 |
+ if _, err := io.Copy(file, layerData); err != nil {
|
|
| 80 |
+ return err |
|
| 81 |
+ } |
|
| 82 |
+ // FIXME: Don't close/open, read/write instead of Copy |
|
| 83 |
+ file.Close() |
|
| 84 |
+ |
|
| 85 |
+ file, err = os.Open(layerArchive) |
|
| 86 |
+ if err != nil {
|
|
| 87 |
+ return err |
|
| 88 |
+ } |
|
| 89 |
+ defer file.Close() |
|
| 90 |
+ layerData = file |
|
| 91 |
+ } |
|
| 92 |
+ |
|
| 71 | 93 |
if err := Untar(layerData, layer); err != nil {
|
| 72 | 94 |
return err |
| 73 | 95 |
} |
| ... | ... |
@@ -86,6 +108,10 @@ func layerPath(root string) string {
|
| 86 | 86 |
return path.Join(root, "layer") |
| 87 | 87 |
} |
| 88 | 88 |
|
| 89 |
+func layerArchivePath(root string) string {
|
|
| 90 |
+ return path.Join(root, "layer.tar.xz") |
|
| 91 |
+} |
|
| 92 |
+ |
|
| 89 | 93 |
func jsonPath(root string) string {
|
| 90 | 94 |
return path.Join(root, "json") |
| 91 | 95 |
} |
| ... | ... |
@@ -290,9 +316,20 @@ func (img *Image) Checksum() (string, error) {
|
| 290 | 290 |
return "", err |
| 291 | 291 |
} |
| 292 | 292 |
|
| 293 |
- layerData, err := Tar(layer, Xz) |
|
| 294 |
- if err != nil {
|
|
| 295 |
- return "", err |
|
| 293 |
+ var layerData io.Reader |
|
| 294 |
+ |
|
| 295 |
+ if file, err := os.Open(layerArchivePath(root)); err != nil {
|
|
| 296 |
+ if os.IsNotExist(err) {
|
|
| 297 |
+ layerData, err = Tar(layer, Xz) |
|
| 298 |
+ if err != nil {
|
|
| 299 |
+ return "", err |
|
| 300 |
+ } |
|
| 301 |
+ } else {
|
|
| 302 |
+ return "", err |
|
| 303 |
+ } |
|
| 304 |
+ } else {
|
|
| 305 |
+ defer file.Close() |
|
| 306 |
+ layerData = file |
|
| 296 | 307 |
} |
| 297 | 308 |
|
| 298 | 309 |
h := sha256.New() |
| ... | ... |
@@ -259,7 +259,7 @@ func (graph *Graph) PullImage(stdout io.Writer, imgId, registry string, token [] |
| 259 | 259 |
// FIXME: Keep goging in case of error? |
| 260 | 260 |
return err |
| 261 | 261 |
} |
| 262 |
- if err = graph.Register(layer, img); err != nil {
|
|
| 262 |
+ if err = graph.Register(layer, false, img); err != nil {
|
|
| 263 | 263 |
return err |
| 264 | 264 |
} |
| 265 | 265 |
} |