mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
99 lines
2 KiB
Go
99 lines
2 KiB
Go
package devmapper
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/dotcloud/docker/archive"
|
|
"github.com/dotcloud/docker/graphdriver"
|
|
"os"
|
|
"path"
|
|
)
|
|
|
|
func init() {
|
|
graphdriver.Register("devicemapper", Init)
|
|
}
|
|
|
|
// Placeholder interfaces, to be replaced
|
|
// at integration.
|
|
|
|
type Image interface {
|
|
ID() string
|
|
Parent() (Image, error)
|
|
Path() string
|
|
}
|
|
|
|
type Change interface {
|
|
}
|
|
|
|
// End of placeholder interfaces.
|
|
|
|
type Driver struct {
|
|
*DeviceSet
|
|
home string
|
|
}
|
|
|
|
func Init(home string) (graphdriver.Driver, error) {
|
|
d := &Driver{
|
|
DeviceSet: NewDeviceSet(home),
|
|
home: home,
|
|
}
|
|
if err := d.DeviceSet.ensureInit(); err != nil {
|
|
return nil, err
|
|
}
|
|
return d, nil
|
|
}
|
|
|
|
func (d *Driver) Cleanup() error {
|
|
return d.DeviceSet.Shutdown()
|
|
}
|
|
|
|
func (d *Driver) OnCreate(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 := d.DeviceSet.AddDevice(img.ID(), parentID); err != nil {
|
|
return err
|
|
}
|
|
// Mount the device in rootfs
|
|
mp := d.mountpoint(img.ID())
|
|
if err := os.MkdirAll(mp, 0700); err != nil {
|
|
return err
|
|
}
|
|
if err := d.DeviceSet.MountDevice(img.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 (d *Driver) OnRemove(img Image) error {
|
|
id := img.ID()
|
|
if err := d.DeviceSet.RemoveDevice(id); err != nil {
|
|
return fmt.Errorf("Unable to remove device for %v: %v", id, err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (d *Driver) mountpoint(id string) string {
|
|
if d.home == "" {
|
|
return ""
|
|
}
|
|
return path.Join(d.home, "mnt", id)
|
|
}
|
|
|
|
func (d *Driver) Changes(img *Image, dest string) ([]Change, error) {
|
|
return nil, fmt.Errorf("Not implemented")
|
|
}
|
|
|
|
func (d *Driver) Layer(img *Image, dest string) (archive.Archive, error) {
|
|
return nil, fmt.Errorf("Not implemented")
|
|
}
|