Browse code

Store the actual archive when commit

Guillaume J. Charmes authored on 2013/05/09 11:08:11
Showing 3 changed files
... ...
@@ -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
 		}