From d64df7c7659560d520a7d8ad8987083e4d52cefc Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Fri, 1 Nov 2013 19:04:08 +0000 Subject: [PATCH] Work In Progress: fix devmapper plugin, first independent test passes. --- devmapper/plugin.go | 40 ++++++++++++++++++-------- devmapper/plugin_test.go | 61 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 devmapper/plugin_test.go diff --git a/devmapper/plugin.go b/devmapper/plugin.go index e0534b4dca..5013f1a47e 100644 --- a/devmapper/plugin.go +++ b/devmapper/plugin.go @@ -1,32 +1,50 @@ 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 DMBackend struct { *DeviceSet + home string } -func (b *DMBackend) Init(home string) error { - b.DeviceSet = NewDeviceSet(home) - if err := b.DeviceSet.ensureInit(); err != nil { - return err +func Init(home string) (*DMBackend, error) { + b := &DMBackend{ + DeviceSet: NewDeviceSet(home), + home: home, } - return nil + if err := b.DeviceSet.ensureInit(); err != nil { + return nil, err + } + return b, nil } -func (b *DMBackend) Shutdown() error { +func (b *DMBackend) Cleanup() error { return b.DeviceSet.Shutdown() } -func (b *DMBackend) Create(img image, layer archive.Archive) error { +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 { @@ -39,11 +57,11 @@ func (b *DMBackend) Create(img image, layer archive.Archive) error { return err } // Mount the device in rootfs - mp := b.mountpoint(id) - if err := os.MkdirAll(mp); err != nil { + mp := b.mountpoint(img.ID()) + if err := os.MkdirAll(mp, 0700); err != nil { return err } - if err := b.DeviceSet.MountDevice(id, mp, false); err != nil { + if err := b.DeviceSet.MountDevice(img.ID(), mp, false); err != nil { return err } // Apply the layer as a diff @@ -67,6 +85,6 @@ 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) { +func (b *DMBackend) Layer(img *Image, dest string) (archive.Archive, error) { return nil, fmt.Errorf("Not implemented") } diff --git a/devmapper/plugin_test.go b/devmapper/plugin_test.go new file mode 100644 index 0000000000..08df3c3171 --- /dev/null +++ b/devmapper/plugin_test.go @@ -0,0 +1,61 @@ +package devmapper + +import ( + "io/ioutil" + _ "os" + "testing" +) + +type TestImage struct { + id string + path string +} + +func (img *TestImage) ID() string { + return img.id +} + +func (img *TestImage) Path() string { + return img.path +} + +func (img *TestImage) Parent() (Image, error) { + return nil, nil +} + + + +func mkTestImage(t *testing.T) Image { + return &TestImage{ + path: mkTestDirectory(t), + id: "4242", + } +} + +func mkTestDirectory(t *testing.T) string { + dir, err := ioutil.TempDir("", "docker-test-devmapper-") + if err != nil { + t.Fatal(err) + } + return dir +} + +func TestInit(t *testing.T) { + home := mkTestDirectory(t) + // defer os.RemoveAll(home) + plugin, err := Init(home) + if err != nil { + t.Fatal(err) + } + defer func() { + return + if err := plugin.Cleanup(); err != nil { + t.Fatal(err) + } + }() + img := mkTestImage(t) + // defer os.RemoveAll(img.(*TestImage).path) + if err := plugin.Create(img, nil); err != nil { + t.Fatal(err) + } +}