12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- 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.
- type Driver struct {
- *DeviceSet
- home string
- }
- func Init(home string) (*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")
- }
|