moby--moby/devmapper/driver.go

98 lines
1.9 KiB
Go
Raw Normal View History

package devmapper
import (
"fmt"
"os"
"path"
"github.com/dotcloud/docker/archive"
)
// Placeholder interfaces, to be replaced
// at integration.
type Image interface {
ID() string
Parent() (Image, error)
Path() string
}
type Change interface {
}
// End of placeholder interfaces.
2013-11-04 17:22:43 +00:00
type Driver struct {
*DeviceSet
home string
}
2013-11-04 17:22:43 +00:00
func Init(home string) (*Driver, error) {
d := &Driver{
DeviceSet: NewDeviceSet(home),
home: home,
}
2013-11-04 17:22:43 +00:00
if err := d.DeviceSet.ensureInit(); err != nil {
return nil, err
}
2013-11-04 17:22:43 +00:00
return d, nil
}
2013-11-04 17:22:43 +00:00
func (d *Driver) Cleanup() error {
return d.DeviceSet.Shutdown()
}
2013-11-04 17:22:43 +00:00
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
2013-11-04 17:22:43 +00:00
if err := d.DeviceSet.AddDevice(img.ID(), parentID); err != nil {
return err
}
// Mount the device in rootfs
2013-11-04 17:22:43 +00:00
mp := d.mountpoint(img.ID())
if err := os.MkdirAll(mp, 0700); err != nil {
return err
}
2013-11-04 17:22:43 +00:00
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
}
2013-11-04 17:22:43 +00:00
func (d *Driver) OnRemove(img Image) error {
2013-11-02 21:25:06 +00:00
id := img.ID()
2013-11-04 17:22:43 +00:00
if err := d.DeviceSet.RemoveDevice(id); err != nil {
2013-11-02 21:25:06 +00:00
return fmt.Errorf("Unable to remove device for %v: %v", id, err)
}
return nil
}
2013-11-04 17:22:43 +00:00
func (d *Driver) mountpoint(id string) string {
if d.home == "" {
return ""
}
2013-11-04 17:22:43 +00:00
return path.Join(d.home, "mnt", id)
}
2013-11-04 17:22:43 +00:00
func (d *Driver) Changes(img *Image, dest string) ([]Change, error) {
return nil, fmt.Errorf("Not implemented")
}
2013-11-04 17:22:43 +00:00
func (d *Driver) Layer(img *Image, dest string) (archive.Archive, error) {
return nil, fmt.Errorf("Not implemented")
}