func checkManyFiles(drv graphdriver.Driver, layer string, count int, seed int64) error { root, err := drv.Get(layer, "") if err != nil { return err } defer drv.Put(layer) for i := 0; i < count; i += 100 { dir := path.Join(root, fmt.Sprintf("directory-%d", i)) for j := 0; i+j < count && j < 100; j++ { file := path.Join(dir, fmt.Sprintf("file-%d", i+j)) fileContent, err := ioutil.ReadFile(file) if err != nil { return err } content := randomContent(64, seed+int64(i+j)) if bytes.Compare(fileContent, content) != 0 { return fmt.Errorf("mismatched file content %v, expecting %v", fileContent, content) } } } return nil }
func checkManyLayers(drv graphdriver.Driver, layer string, count int) error { root, err := drv.Get(layer, "") if err != nil { return err } defer drv.Put(layer) layerIDBytes, err := ioutil.ReadFile(path.Join(root, "top-id")) if err != nil { return err } if bytes.Compare(layerIDBytes, []byte(layer)) != 0 { return fmt.Errorf("mismatched file content %v, expecting %v", layerIDBytes, []byte(layer)) } for i := count; i > 0; i-- { layerDir := path.Join(root, fmt.Sprintf("layer-%d", i)) thisLayerIDBytes, err := ioutil.ReadFile(path.Join(layerDir, "layer-id")) if err != nil { return err } if bytes.Compare(thisLayerIDBytes, layerIDBytes) != 0 { return fmt.Errorf("mismatched file content %v, expecting %v", thisLayerIDBytes, layerIDBytes) } layerIDBytes, err = ioutil.ReadFile(path.Join(layerDir, "parent-id")) if err != nil { return err } } return nil }
func addFile(drv graphdriver.Driver, layer, filename string, content []byte) error { root, err := drv.Get(layer, "") if err != nil { return err } defer drv.Put(layer) return ioutil.WriteFile(path.Join(root, filename), content, 0755) }
func addDirectory(drv graphdriver.Driver, layer, dir string) error { root, err := drv.Get(layer, "") if err != nil { return err } defer drv.Put(layer) return os.MkdirAll(path.Join(root, dir), 0755) }
func removeFile(drv graphdriver.Driver, layer, filename string) error { root, err := drv.Get(layer, "") if err != nil { return err } defer drv.Put(layer) return os.Remove(path.Join(root, filename)) }
func changeManyFiles(drv graphdriver.Driver, layer string, count int, seed int64) ([]archive.Change, error) { root, err := drv.Get(layer, "") if err != nil { return nil, err } defer drv.Put(layer) changes := []archive.Change{} for i := 0; i < count; i += 100 { archiveRoot := fmt.Sprintf("/directory-%d", i) if err := os.MkdirAll(path.Join(root, archiveRoot), 0755); err != nil { return nil, err } for j := 0; i+j < count && j < 100; j++ { if j == 0 { changes = append(changes, archive.Change{ Path: archiveRoot, Kind: archive.ChangeModify, }) } var change archive.Change switch j % 3 { // Update file case 0: change.Path = path.Join(archiveRoot, fmt.Sprintf("file-%d", i+j)) change.Kind = archive.ChangeModify if err := ioutil.WriteFile(path.Join(root, change.Path), randomContent(64, seed+int64(i+j)), 0755); err != nil { return nil, err } // Add file case 1: change.Path = path.Join(archiveRoot, fmt.Sprintf("file-%d-%d", seed, i+j)) change.Kind = archive.ChangeAdd if err := ioutil.WriteFile(path.Join(root, change.Path), randomContent(64, seed+int64(i+j)), 0755); err != nil { return nil, err } // Remove file case 2: change.Path = path.Join(archiveRoot, fmt.Sprintf("file-%d", i+j)) change.Kind = archive.ChangeDelete if err := os.Remove(path.Join(root, change.Path)); err != nil { return nil, err } } changes = append(changes, change) } } return changes, nil }
func removeAll(drv graphdriver.Driver, layer string, names ...string) error { root, err := drv.Get(layer, "") if err != nil { return err } defer drv.Put(layer) for _, filename := range names { if err := os.RemoveAll(path.Join(root, filename)); err != nil { return err } } return nil }
func checkFileRemoved(drv graphdriver.Driver, layer, filename string) error { root, err := drv.Get(layer, "") if err != nil { return err } defer drv.Put(layer) if _, err := os.Stat(path.Join(root, filename)); err == nil { return fmt.Errorf("file still exists: %s", path.Join(root, filename)) } else if !os.IsNotExist(err) { return err } return nil }
func addManyLayers(drv graphdriver.Driver, baseLayer string, count int) (string, error) { lastLayer := baseLayer for i := 1; i <= count; i++ { nextLayer := stringid.GenerateRandomID() if err := drv.Create(nextLayer, lastLayer, "", nil); err != nil { return "", err } if err := addLayerFiles(drv, nextLayer, lastLayer, i); err != nil { return "", err } lastLayer = nextLayer } return lastLayer, nil }
func checkFile(drv graphdriver.Driver, layer, filename string, content []byte) error { root, err := drv.Get(layer, "") if err != nil { return err } defer drv.Put(layer) fileContent, err := ioutil.ReadFile(path.Join(root, filename)) if err != nil { return err } if bytes.Compare(fileContent, content) != 0 { return fmt.Errorf("mismatched file content %v, expecting %v", fileContent, content) } return nil }
func addFiles(drv graphdriver.Driver, layer string, seed int64) error { root, err := drv.Get(layer, "") if err != nil { return err } defer drv.Put(layer) if err := ioutil.WriteFile(path.Join(root, "file-a"), randomContent(64, seed), 0755); err != nil { return err } if err := os.MkdirAll(path.Join(root, "dir-b"), 0755); err != nil { return err } if err := ioutil.WriteFile(path.Join(root, "dir-b", "file-b"), randomContent(128, seed+1), 0755); err != nil { return err } return ioutil.WriteFile(path.Join(root, "file-c"), randomContent(128*128, seed+2), 0755) }
func createBase(t *testing.T, driver graphdriver.Driver, name string) { // We need to be able to set any perms oldmask := syscall.Umask(0) defer syscall.Umask(oldmask) if err := driver.Create(name, ""); err != nil { t.Fatal(err) } dir, err := driver.Get(name, "") if err != nil { t.Fatal(err) } defer driver.Put(name) subdir := path.Join(dir, "a subdir") if err := os.Mkdir(subdir, 0705|os.ModeSticky); err != nil { t.Fatal(err) } if err := os.Chown(subdir, 1, 2); err != nil { t.Fatal(err) } file := path.Join(dir, "a file") if err := ioutil.WriteFile(file, []byte("Some data"), 0222|os.ModeSetuid); err != nil { t.Fatal(err) } }
func verifyBase(t *testing.T, driver graphdriver.Driver, name string) { dir, err := driver.Get(name, "") if err != nil { t.Fatal(err) } defer driver.Put(name) subdir := path.Join(dir, "a subdir") verifyFile(t, subdir, 0705|os.ModeDir|os.ModeSticky, 1, 2) file := path.Join(dir, "a file") verifyFile(t, file, 0222|os.ModeSetuid, 0, 0) fis, err := readDir(dir) if err != nil { t.Fatal(err) } if len(fis) != 2 { t.Fatal("Unexpected files in base image") } }
func addManyFiles(drv graphdriver.Driver, layer string, count int, seed int64) error { root, err := drv.Get(layer, "") if err != nil { return err } defer drv.Put(layer) for i := 0; i < count; i += 100 { dir := path.Join(root, fmt.Sprintf("directory-%d", i)) if err := os.MkdirAll(dir, 0755); err != nil { return err } for j := 0; i+j < count && j < 100; j++ { file := path.Join(dir, fmt.Sprintf("file-%d", i+j)) if err := ioutil.WriteFile(file, randomContent(64, seed+int64(i+j)), 0755); err != nil { return err } } } return nil }
func addLayerFiles(drv graphdriver.Driver, layer, parent string, i int) error { root, err := drv.Get(layer, "") if err != nil { return err } defer drv.Put(layer) if err := ioutil.WriteFile(path.Join(root, "top-id"), []byte(layer), 0755); err != nil { return err } layerDir := path.Join(root, fmt.Sprintf("layer-%d", i)) if err := os.MkdirAll(layerDir, 0755); err != nil { return err } if err := ioutil.WriteFile(path.Join(layerDir, "layer-id"), []byte(layer), 0755); err != nil { return err } if err := ioutil.WriteFile(path.Join(layerDir, "parent-id"), []byte(parent), 0755); err != nil { return err } return nil }
func selectGraphDriver(logger lager.Logger, name string, graphRoot string) (graphdriver.Driver, error) { // silence docker graph debug logging; we'll do our own warning for non-aufs // driver selection logrus.SetLevel(logrus.WarnLevel) var driver graphdriver.Driver var err error if name == "auto" { driver, err = graphdriver.New(graphRoot, nil) } else { driver, err = graphdriver.GetDriver(name, graphRoot, nil) } if err != nil { return nil, err } driverName := driver.String() if driverName != "aufs" { logger.Info("unsupported-graph-driver", lager.Data{"name": driverName}) } return driver, nil }
func tarFromFilesInGraph(graph graphdriver.Driver, graphID, parentID string, files ...FileApplier) ([]byte, error) { t, err := tarFromFiles(files...) if err != nil { return nil, err } if err := graph.Create(graphID, parentID, ""); err != nil { return nil, err } if _, err := graph.ApplyDiff(graphID, parentID, archive.Reader(bytes.NewReader(t))); err != nil { return nil, err } ar, err := graph.Diff(graphID, parentID) if err != nil { return nil, err } defer ar.Close() return ioutil.ReadAll(ar) }
"github.com/onsi/gomega/gexec" _ "github.com/docker/docker/daemon/graphdriver/aufs" _ "github.com/docker/docker/daemon/graphdriver/vfs" _ "github.com/docker/docker/pkg/chrootarchive" // allow reexec of docker-applyLayer "github.com/docker/docker/pkg/reexec" ) func init() { reexec.Init() } var _ = Describe("Docker", func() { var ( root string driver graphdriver.Driver cake *layercake.Docker ) BeforeEach(func() { var err error root, err = ioutil.TempDir("", "cakeroot") Expect(err).NotTo(HaveOccurred()) Expect(syscall.Mount("tmpfs", root, "tmpfs", 0, "")).To(Succeed()) driver, err := graphdriver.GetDriver("vfs", root, nil) Expect(err).NotTo(HaveOccurred()) graph, err := graph.NewGraph(root, driver) Expect(err).NotTo(HaveOccurred())