From 86dd2473c1351df87520111b1b1ba9953f9e5f09 Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Fri, 1 Nov 2013 05:06:49 +0000 Subject: [PATCH] Work In Progress: devmapper backend plugin --- devmapper/plugin.go | 72 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 devmapper/plugin.go diff --git a/devmapper/plugin.go b/devmapper/plugin.go new file mode 100644 index 0000000000..e0534b4dca --- /dev/null +++ b/devmapper/plugin.go @@ -0,0 +1,72 @@ +package devmapper + +import ( + "github.com/dotcloud/docker/archive" +) + +type Image interface { + ID() string + Parent() (Image, error) + Path() string +} + +type DMBackend struct { + *DeviceSet +} + +func (b *DMBackend) Init(home string) error { + b.DeviceSet = NewDeviceSet(home) + if err := b.DeviceSet.ensureInit(); err != nil { + return err + } + return nil +} + +func (b *DMBackend) Shutdown() error { + return b.DeviceSet.Shutdown() +} + +func (b *DMBackend) Create(img image, layer archive.Archive) error { + // Determine the source of the snapshot (parent id or init device) + var parentID string + if parent, err := img.Parent(); err != nil { + return err + } else if parent != nil { + parentID = parent.ID() + } + // Create the device for this image by snapshotting source + if err := b.DeviceSet.AddDevice(img.ID(), parentID); err != nil { + return err + } + // Mount the device in rootfs + mp := b.mountpoint(id) + if err := os.MkdirAll(mp); err != nil { + return err + } + if err := b.DeviceSet.MountDevice(id, mp, false); err != nil { + return err + } + // Apply the layer as a diff + if layer != nil { + if err := archive.ApplyLayer(mp, layer); err != nil { + return err + } + } + return nil +} + + +func (b *DMBackend) mountpoint(id string) string { + if b.home == "" { + return "" + } + return path.Join(b.home, "mnt", id) +} + +func (b *DMBackend) Changes(img *Image, dest string) ([]Change, error) { + return nil, fmt.Errorf("Not implemented") +} + +func (b *DMBackend) Layer(img *Image, dest string) (Archive, error) { + return nil, fmt.Errorf("Not implemented") +}