瀏覽代碼

Merge pull request #39140 from ehazlett/apply-diff-rwlayer

ApplyDiff to RWLayer
Derek McGowan 6 年之前
父節點
當前提交
e516af6e56
共有 3 個文件被更改,包括 66 次插入0 次删除
  1. 3 0
      layer/layer.go
  2. 58 0
      layer/mount_test.go
  3. 5 0
      layer/mounted_layer.go

+ 3 - 0
layer/layer.go

@@ -145,6 +145,9 @@ type RWLayer interface {
 
 	// Metadata returns the low level metadata for the mutable layer
 	Metadata() (map[string]string, error)
+
+	// ApplyDiff applies the diff to the RW layer
+	ApplyDiff(diff io.Reader) (int64, error)
 }
 
 // Metadata holds information about a

+ 58 - 0
layer/mount_test.go

@@ -206,6 +206,64 @@ func TestMountChanges(t *testing.T) {
 	})
 }
 
+func TestMountApply(t *testing.T) {
+	// TODO Windows: Figure out why this is failing
+	if runtime.GOOS == "windows" {
+		t.Skip("Failing on Windows")
+	}
+	ls, _, cleanup := newTestStore(t)
+	defer cleanup()
+
+	basefile := newTestFile("testfile.txt", []byte("base data!"), 0644)
+	newfile := newTestFile("newfile.txt", []byte("new data!"), 0755)
+
+	li := initWithFiles(basefile)
+	layer, err := createLayer(ls, "", li)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	di := initWithFiles(newfile)
+	diffLayer, err := createLayer(ls, "", di)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	m, err := ls.CreateRWLayer("fun-mount", layer.ChainID(), nil)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	r, err := diffLayer.TarStream()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if _, err := m.ApplyDiff(r); err != nil {
+		t.Fatal(err)
+	}
+
+	pathFS, err := m.Mount("")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	f, err := pathFS.Open(pathFS.Join(pathFS.Path(), "newfile.txt"))
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer f.Close()
+
+	b, err := ioutil.ReadAll(f)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if expected := "new data!"; string(b) != expected {
+		t.Fatalf("Unexpected test file contents %q, expected %q", string(b), expected)
+	}
+}
+
 func assertChange(t *testing.T, actual, expected archive.Change) {
 	if actual.Path != expected.Path {
 		t.Fatalf("Unexpected change path %s, expected %s", actual.Path, expected.Path)

+ 5 - 0
layer/mounted_layer.go

@@ -98,3 +98,8 @@ func (rl *referencedRWLayer) Mount(mountLabel string) (containerfs.ContainerFS,
 func (rl *referencedRWLayer) Unmount() error {
 	return rl.layerStore.driver.Put(rl.mountedLayer.mountID)
 }
+
+// ApplyDiff applies specified diff to the layer
+func (rl *referencedRWLayer) ApplyDiff(diff io.Reader) (int64, error) {
+	return rl.layerStore.driver.ApplyDiff(rl.mountID, rl.cacheParent(), diff)
+}