Skip to content

Commit 8910180

Browse files
authored
Merge pull request #271 from nalind/template-layers
drivers: add CreateFromTemplate()
2 parents e03971b + 5e1849c commit 8910180

23 files changed

Lines changed: 295 additions & 38 deletions

.travis.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,5 @@ script:
7676
-e TRAVIS_JOB_ID=$TRAVIS_JOB_ID
7777
-e TRAVIS_BUILD_DIR=$TRAVIS_BUILD_DIR"
7878
- env
79-
- echo
8079
- echo "Running tests in SPC using ./hack/run_ci_tests.sh"
8180
- ./hack/run_ci_tests.sh

containers_ffjson.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

drivers/aufs/aufs.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,11 @@ func (a *Driver) AdditionalImageStores() []string {
253253
return nil
254254
}
255255

256+
// CreateFromTemplate creates a layer with the same contents and parent as another layer.
257+
func (a *Driver) CreateFromTemplate(id, template string, templateIDMappings *idtools.IDMappings, parent string, parentIDMappings *idtools.IDMappings, opts *graphdriver.CreateOpts, readWrite bool) error {
258+
return graphdriver.NaiveCreateFromTemplate(a, id, template, templateIDMappings, parent, parentIDMappings, opts, readWrite)
259+
}
260+
256261
// CreateReadWrite creates a layer that is writable for use as a container
257262
// file system.
258263
func (a *Driver) CreateReadWrite(id, parent string, opts *graphdriver.CreateOpts) error {

drivers/aufs/aufs_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"testing"
1515

1616
"github.com/containers/storage/drivers"
17+
"github.com/containers/storage/drivers/graphtest"
1718
"github.com/containers/storage/pkg/archive"
1819
"github.com/containers/storage/pkg/reexec"
1920
"github.com/containers/storage/pkg/stringid"
@@ -803,3 +804,23 @@ func TestInitStaleCleanup(t *testing.T) {
803804
}
804805
}
805806
}
807+
808+
func TestAufsCreateEmpty(t *testing.T) {
809+
graphtest.DriverTestCreateEmpty(t, "aufs")
810+
}
811+
812+
func TestAufsCreateBase(t *testing.T) {
813+
graphtest.DriverTestCreateBase(t, "aufs")
814+
}
815+
816+
func TestAufsCreateSnap(t *testing.T) {
817+
graphtest.DriverTestCreateSnap(t, "aufs")
818+
}
819+
820+
func TestAufsCreateFromTemplate(t *testing.T) {
821+
graphtest.DriverTestCreateFromTemplate(t, "aufs")
822+
}
823+
824+
func TestAufsEcho(t *testing.T) {
825+
graphtest.DriverTestEcho(t, "aufs")
826+
}

drivers/btrfs/btrfs.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,11 @@ func (d *Driver) quotasDirID(id string) string {
490490
return path.Join(d.quotasDir(), id)
491491
}
492492

493+
// CreateFromTemplate creates a layer with the same contents and parent as another layer.
494+
func (d *Driver) CreateFromTemplate(id, template string, templateIDMappings *idtools.IDMappings, parent string, parentIDMappings *idtools.IDMappings, opts *graphdriver.CreateOpts, readWrite bool) error {
495+
return d.Create(id, template, opts)
496+
}
497+
493498
// CreateReadWrite creates a layer that is writable for use as a container
494499
// file system.
495500
func (d *Driver) CreateReadWrite(id, parent string, opts *graphdriver.CreateOpts) error {

drivers/btrfs/btrfs_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ func TestBtrfsCreateSnap(t *testing.T) {
2929
graphtest.DriverTestCreateSnap(t, "btrfs")
3030
}
3131

32+
func TestBtrfsCreateFromTemplate(t *testing.T) {
33+
graphtest.DriverTestCreateFromTemplate(t, "btrfs")
34+
}
35+
3236
func TestBtrfsSubvolDelete(t *testing.T) {
3337
d := graphtest.GetDriver(t, "btrfs")
3438
if err := d.CreateReadWrite("test", "", nil); err != nil {

drivers/devmapper/devmapper_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ func TestDevmapperCreateSnap(t *testing.T) {
8282
graphtest.DriverTestCreateSnap(t, "devicemapper", "test=1")
8383
}
8484

85+
func TestDevmapperCreateFromTemplate(t *testing.T) {
86+
graphtest.DriverTestCreateFromTemplate(t, "devicemapper", "test=1")
87+
}
88+
8589
func TestDevmapperTeardown(t *testing.T) {
8690
graphtest.PutDriver(t)
8791
}

drivers/devmapper/driver.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,11 @@ func (d *Driver) Cleanup() error {
123123
return err
124124
}
125125

126+
// CreateFromTemplate creates a layer with the same contents and parent as another layer.
127+
func (d *Driver) CreateFromTemplate(id, template string, templateIDMappings *idtools.IDMappings, parent string, parentIDMappings *idtools.IDMappings, opts *graphdriver.CreateOpts, readWrite bool) error {
128+
return d.Create(id, template, opts)
129+
}
130+
126131
// CreateReadWrite creates a layer that is writable for use as a container
127132
// file system.
128133
func (d *Driver) CreateReadWrite(id, parent string, opts *graphdriver.CreateOpts) error {

drivers/driver.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ type ProtoDriver interface {
7272
// specified id and parent and options passed in opts. Parent
7373
// may be "" and opts may be nil.
7474
Create(id, parent string, opts *CreateOpts) error
75+
// CreateFromTemplate creates a new filesystem layer with the specified id
76+
// and parent, with contents identical to the specified template layer.
77+
CreateFromTemplate(id, template string, templateIDMappings *idtools.IDMappings, parent string, parentIDMappings *idtools.IDMappings, opts *CreateOpts, readWrite bool) error
7578
// Remove attempts to remove the filesystem layer with this id.
7679
Remove(id string) error
7780
// Get returns the mountpoint for the layered filesystem referred

drivers/graphtest/graphtest_unix.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,100 @@ func DriverTestCreateSnap(t testing.TB, drivername string, driverOptions ...stri
143143
verifyBase(t, driver, "Snap")
144144
}
145145

146+
// DriverTestCreateFromTemplate Create a driver and template of a snap and verifies its
147+
// contents.
148+
func DriverTestCreateFromTemplate(t testing.TB, drivername string, driverOptions ...string) {
149+
driver := GetDriver(t, drivername, driverOptions...)
150+
defer PutDriver(t)
151+
152+
createBase(t, driver, "Base")
153+
defer func() {
154+
require.NoError(t, driver.Remove("Base"))
155+
}()
156+
157+
err := driver.Create("Snap", "Base", nil)
158+
require.NoError(t, err)
159+
defer func() {
160+
require.NoError(t, driver.Remove("Snap"))
161+
}()
162+
163+
content := []byte("test content")
164+
if err := addFile(driver, "Snap", "testfile.txt", content); err != nil {
165+
t.Fatal(err)
166+
}
167+
168+
err = driver.CreateFromTemplate("FromTemplate", "Snap", nil, "Base", nil, nil, true)
169+
require.NoError(t, err)
170+
defer func() {
171+
require.NoError(t, driver.Remove("FromTemplate"))
172+
}()
173+
174+
err = driver.CreateFromTemplate("ROFromTemplate", "Snap", nil, "Base", nil, nil, false)
175+
require.NoError(t, err)
176+
defer func() {
177+
require.NoError(t, driver.Remove("ROFromTemplate"))
178+
}()
179+
180+
noChanges := []archive.Change{}
181+
182+
changes, err := driver.Changes("FromTemplate", nil, "Snap", nil, "")
183+
if err != nil {
184+
t.Fatal(err)
185+
}
186+
if err = checkChanges(noChanges, changes); err != nil {
187+
t.Fatal(err)
188+
}
189+
190+
changes, err = driver.Changes("ROFromTemplate", nil, "Snap", nil, "")
191+
if err != nil {
192+
t.Fatal(err)
193+
}
194+
if err = checkChanges(noChanges, changes); err != nil {
195+
t.Fatal(err)
196+
}
197+
198+
if err := checkFile(driver, "FromTemplate", "testfile.txt", content); err != nil {
199+
t.Fatal(err)
200+
}
201+
if err := checkFile(driver, "ROFromTemplate", "testfile.txt", content); err != nil {
202+
t.Fatal(err)
203+
}
204+
if err := checkFile(driver, "Snap", "testfile.txt", content); err != nil {
205+
t.Fatal(err)
206+
}
207+
208+
expectedChanges := []archive.Change{{
209+
Path: "/testfile.txt",
210+
Kind: archive.ChangeAdd,
211+
}}
212+
213+
changes, err = driver.Changes("Snap", nil, "Base", nil, "")
214+
if err != nil {
215+
t.Fatal(err)
216+
}
217+
if err = checkChanges(expectedChanges, changes); err != nil {
218+
t.Fatal(err)
219+
}
220+
221+
changes, err = driver.Changes("FromTemplate", nil, "Base", nil, "")
222+
if err != nil {
223+
t.Fatal(err)
224+
}
225+
if err = checkChanges(expectedChanges, changes); err != nil {
226+
t.Fatal(err)
227+
}
228+
229+
changes, err = driver.Changes("ROFromTemplate", nil, "Base", nil, "")
230+
if err != nil {
231+
t.Fatal(err)
232+
}
233+
if err = checkChanges(expectedChanges, changes); err != nil {
234+
t.Fatal(err)
235+
}
236+
237+
verifyBase(t, driver, "Base")
238+
}
239+
146240
// DriverTestDeepLayerRead reads a file from a lower layer under a given number of layers
147241
func DriverTestDeepLayerRead(t testing.TB, layerCount int, drivername string, driverOptions ...string) {
148242
driver := GetDriver(t, drivername, driverOptions...)

0 commit comments

Comments
 (0)