Skip to content

Commit b16decf

Browse files
author
Shishir Mahajan
committed
CLI flag for docker create(run) to change block device size.
Signed-off-by: Shishir Mahajan <[email protected]>
1 parent 35986d4 commit b16decf

30 files changed

+228
-72
lines changed

contrib/docker-device-tool/device_tool.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ func main() {
137137
usage()
138138
}
139139

140-
err := devices.AddDevice(args[1], args[2])
140+
err := devices.AddDevice(args[1], args[2], nil)
141141
if err != nil {
142142
fmt.Println("Can't create snap device: ", err)
143143
os.Exit(1)

daemon/create.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ func (daemon *Daemon) create(params types.ContainerCreateConfig) (retC *containe
8484
return nil, err
8585
}
8686

87+
container.HostConfig.StorageOpt = params.HostConfig.StorageOpt
88+
8789
// Set RWLayer for container after mount labels have been set
8890
if err := daemon.setRWLayer(container); err != nil {
8991
return nil, err
@@ -156,7 +158,7 @@ func (daemon *Daemon) setRWLayer(container *container.Container) error {
156158
}
157159
layerID = img.RootFS.ChainID()
158160
}
159-
rwLayer, err := daemon.layerStore.CreateRWLayer(container.ID, layerID, container.MountLabel, daemon.setupInitLayer)
161+
rwLayer, err := daemon.layerStore.CreateRWLayer(container.ID, layerID, container.MountLabel, daemon.setupInitLayer, container.HostConfig.StorageOpt)
160162
if err != nil {
161163
return err
162164
}

daemon/graphdriver/aufs/aufs.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,12 @@ func (a *Driver) Exists(id string) bool {
195195

196196
// Create three folders for each id
197197
// mnt, layers, and diff
198-
func (a *Driver) Create(id, parent, mountLabel string) error {
198+
func (a *Driver) Create(id, parent, mountLabel string, storageOpt map[string]string) error {
199+
200+
if len(storageOpt) != 0 {
201+
return fmt.Errorf("--storage-opt is not supported for aufs")
202+
}
203+
199204
if err := a.createDirsFor(id); err != nil {
200205
return err
201206
}

daemon/graphdriver/aufs/aufs_test.go

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ func TestCreateNewDir(t *testing.T) {
101101
d := newDriver(t)
102102
defer os.RemoveAll(tmp)
103103

104-
if err := d.Create("1", "", ""); err != nil {
104+
if err := d.Create("1", "", "", nil); err != nil {
105105
t.Fatal(err)
106106
}
107107
}
@@ -110,7 +110,7 @@ func TestCreateNewDirStructure(t *testing.T) {
110110
d := newDriver(t)
111111
defer os.RemoveAll(tmp)
112112

113-
if err := d.Create("1", "", ""); err != nil {
113+
if err := d.Create("1", "", "", nil); err != nil {
114114
t.Fatal(err)
115115
}
116116

@@ -131,7 +131,7 @@ func TestRemoveImage(t *testing.T) {
131131
d := newDriver(t)
132132
defer os.RemoveAll(tmp)
133133

134-
if err := d.Create("1", "", ""); err != nil {
134+
if err := d.Create("1", "", "", nil); err != nil {
135135
t.Fatal(err)
136136
}
137137

@@ -156,7 +156,7 @@ func TestGetWithoutParent(t *testing.T) {
156156
d := newDriver(t)
157157
defer os.RemoveAll(tmp)
158158

159-
if err := d.Create("1", "", ""); err != nil {
159+
if err := d.Create("1", "", "", nil); err != nil {
160160
t.Fatal(err)
161161
}
162162

@@ -183,7 +183,7 @@ func TestCleanupWithDir(t *testing.T) {
183183
d := newDriver(t)
184184
defer os.RemoveAll(tmp)
185185

186-
if err := d.Create("1", "", ""); err != nil {
186+
if err := d.Create("1", "", "", nil); err != nil {
187187
t.Fatal(err)
188188
}
189189

@@ -196,7 +196,7 @@ func TestMountedFalseResponse(t *testing.T) {
196196
d := newDriver(t)
197197
defer os.RemoveAll(tmp)
198198

199-
if err := d.Create("1", "", ""); err != nil {
199+
if err := d.Create("1", "", "", nil); err != nil {
200200
t.Fatal(err)
201201
}
202202

@@ -215,10 +215,10 @@ func TestMountedTrueReponse(t *testing.T) {
215215
defer os.RemoveAll(tmp)
216216
defer d.Cleanup()
217217

218-
if err := d.Create("1", "", ""); err != nil {
218+
if err := d.Create("1", "", "", nil); err != nil {
219219
t.Fatal(err)
220220
}
221-
if err := d.Create("2", "1", ""); err != nil {
221+
if err := d.Create("2", "1", "", nil); err != nil {
222222
t.Fatal(err)
223223
}
224224

@@ -241,10 +241,10 @@ func TestMountWithParent(t *testing.T) {
241241
d := newDriver(t)
242242
defer os.RemoveAll(tmp)
243243

244-
if err := d.Create("1", "", ""); err != nil {
244+
if err := d.Create("1", "", "", nil); err != nil {
245245
t.Fatal(err)
246246
}
247-
if err := d.Create("2", "1", ""); err != nil {
247+
if err := d.Create("2", "1", "", nil); err != nil {
248248
t.Fatal(err)
249249
}
250250

@@ -272,10 +272,10 @@ func TestRemoveMountedDir(t *testing.T) {
272272
d := newDriver(t)
273273
defer os.RemoveAll(tmp)
274274

275-
if err := d.Create("1", "", ""); err != nil {
275+
if err := d.Create("1", "", "", nil); err != nil {
276276
t.Fatal(err)
277277
}
278-
if err := d.Create("2", "1", ""); err != nil {
278+
if err := d.Create("2", "1", "", nil); err != nil {
279279
t.Fatal(err)
280280
}
281281

@@ -311,7 +311,7 @@ func TestCreateWithInvalidParent(t *testing.T) {
311311
d := newDriver(t)
312312
defer os.RemoveAll(tmp)
313313

314-
if err := d.Create("1", "docker", ""); err == nil {
314+
if err := d.Create("1", "docker", "", nil); err == nil {
315315
t.Fatalf("Error should not be nil with parent does not exist")
316316
}
317317
}
@@ -320,7 +320,7 @@ func TestGetDiff(t *testing.T) {
320320
d := newDriver(t)
321321
defer os.RemoveAll(tmp)
322322

323-
if err := d.Create("1", "", ""); err != nil {
323+
if err := d.Create("1", "", "", nil); err != nil {
324324
t.Fatal(err)
325325
}
326326

@@ -354,10 +354,10 @@ func TestChanges(t *testing.T) {
354354
d := newDriver(t)
355355
defer os.RemoveAll(tmp)
356356

357-
if err := d.Create("1", "", ""); err != nil {
357+
if err := d.Create("1", "", "", nil); err != nil {
358358
t.Fatal(err)
359359
}
360-
if err := d.Create("2", "1", ""); err != nil {
360+
if err := d.Create("2", "1", "", nil); err != nil {
361361
t.Fatal(err)
362362
}
363363

@@ -403,7 +403,7 @@ func TestChanges(t *testing.T) {
403403
t.Fatalf("Change kind should be ChangeAdd got %s", change.Kind)
404404
}
405405

406-
if err := d.Create("3", "2", ""); err != nil {
406+
if err := d.Create("3", "2", "", nil); err != nil {
407407
t.Fatal(err)
408408
}
409409
mntPoint, err = d.Get("3", "")
@@ -448,7 +448,7 @@ func TestDiffSize(t *testing.T) {
448448
d := newDriver(t)
449449
defer os.RemoveAll(tmp)
450450

451-
if err := d.Create("1", "", ""); err != nil {
451+
if err := d.Create("1", "", "", nil); err != nil {
452452
t.Fatal(err)
453453
}
454454

@@ -490,7 +490,7 @@ func TestChildDiffSize(t *testing.T) {
490490
defer os.RemoveAll(tmp)
491491
defer d.Cleanup()
492492

493-
if err := d.Create("1", "", ""); err != nil {
493+
if err := d.Create("1", "", "", nil); err != nil {
494494
t.Fatal(err)
495495
}
496496

@@ -526,7 +526,7 @@ func TestChildDiffSize(t *testing.T) {
526526
t.Fatalf("Expected size to be %d got %d", size, diffSize)
527527
}
528528

529-
if err := d.Create("2", "1", ""); err != nil {
529+
if err := d.Create("2", "1", "", nil); err != nil {
530530
t.Fatal(err)
531531
}
532532

@@ -545,7 +545,7 @@ func TestExists(t *testing.T) {
545545
defer os.RemoveAll(tmp)
546546
defer d.Cleanup()
547547

548-
if err := d.Create("1", "", ""); err != nil {
548+
if err := d.Create("1", "", "", nil); err != nil {
549549
t.Fatal(err)
550550
}
551551

@@ -563,7 +563,7 @@ func TestStatus(t *testing.T) {
563563
defer os.RemoveAll(tmp)
564564
defer d.Cleanup()
565565

566-
if err := d.Create("1", "", ""); err != nil {
566+
if err := d.Create("1", "", "", nil); err != nil {
567567
t.Fatal(err)
568568
}
569569

@@ -592,7 +592,7 @@ func TestApplyDiff(t *testing.T) {
592592
defer os.RemoveAll(tmp)
593593
defer d.Cleanup()
594594

595-
if err := d.Create("1", "", ""); err != nil {
595+
if err := d.Create("1", "", "", nil); err != nil {
596596
t.Fatal(err)
597597
}
598598

@@ -618,10 +618,10 @@ func TestApplyDiff(t *testing.T) {
618618
t.Fatal(err)
619619
}
620620

621-
if err := d.Create("2", "", ""); err != nil {
621+
if err := d.Create("2", "", "", nil); err != nil {
622622
t.Fatal(err)
623623
}
624-
if err := d.Create("3", "2", ""); err != nil {
624+
if err := d.Create("3", "2", "", nil); err != nil {
625625
t.Fatal(err)
626626
}
627627

@@ -671,7 +671,7 @@ func testMountMoreThan42Layers(t *testing.T, mountPath string) {
671671
}
672672
current = hash(current)
673673

674-
if err := d.Create(current, parent, ""); err != nil {
674+
if err := d.Create(current, parent, "", nil); err != nil {
675675
t.Logf("Current layer %d", i)
676676
t.Error(err)
677677
}
@@ -750,11 +750,11 @@ func BenchmarkConcurrentAccess(b *testing.B) {
750750
ids = append(ids, stringid.GenerateNonCryptoID())
751751
}
752752

753-
if err := d.Create(ids[0], "", ""); err != nil {
753+
if err := d.Create(ids[0], "", "", nil); err != nil {
754754
b.Fatal(err)
755755
}
756756

757-
if err := d.Create(ids[1], ids[0], ""); err != nil {
757+
if err := d.Create(ids[1], ids[0], "", nil); err != nil {
758758
b.Fatal(err)
759759
}
760760

@@ -770,7 +770,7 @@ func BenchmarkConcurrentAccess(b *testing.B) {
770770
for _, id := range ids {
771771
go func(id string) {
772772
defer outerGroup.Done()
773-
if err := d.Create(id, parent, ""); err != nil {
773+
if err := d.Create(id, parent, "", nil); err != nil {
774774
b.Logf("Create %s failed", id)
775775
chErr <- err
776776
return

daemon/graphdriver/btrfs/btrfs.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,12 @@ func (d *Driver) subvolumesDirID(id string) string {
242242
}
243243

244244
// Create the filesystem with given id.
245-
func (d *Driver) Create(id, parent, mountLabel string) error {
245+
func (d *Driver) Create(id, parent, mountLabel string, storageOpt map[string]string) error {
246+
247+
if len(storageOpt) != 0 {
248+
return fmt.Errorf("--storage-opt is not supported for btrfs")
249+
}
250+
246251
subvolumes := path.Join(d.home, "subvolumes")
247252
rootUID, rootGID, err := idtools.GetRootUIDGID(d.uidMaps, d.gidMaps)
248253
if err != nil {

daemon/graphdriver/btrfs/btrfs_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func TestBtrfsCreateSnap(t *testing.T) {
3030

3131
func TestBtrfsSubvolDelete(t *testing.T) {
3232
d := graphtest.GetDriver(t, "btrfs")
33-
if err := d.Create("test", "", ""); err != nil {
33+
if err := d.Create("test", "", "", nil); err != nil {
3434
t.Fatal(err)
3535
}
3636
defer graphtest.PutDriver(t)

daemon/graphdriver/devmapper/deviceset.go

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -839,7 +839,7 @@ func (devices *DeviceSet) createRegisterDevice(hash string) (*devInfo, error) {
839839
return info, nil
840840
}
841841

842-
func (devices *DeviceSet) createRegisterSnapDevice(hash string, baseInfo *devInfo) error {
842+
func (devices *DeviceSet) createRegisterSnapDevice(hash string, baseInfo *devInfo, size uint64) error {
843843
if err := devices.poolHasFreeSpace(); err != nil {
844844
return err
845845
}
@@ -878,7 +878,7 @@ func (devices *DeviceSet) createRegisterSnapDevice(hash string, baseInfo *devInf
878878
break
879879
}
880880

881-
if _, err := devices.registerDevice(deviceID, hash, baseInfo.Size, devices.OpenTransactionID); err != nil {
881+
if _, err := devices.registerDevice(deviceID, hash, size, devices.OpenTransactionID); err != nil {
882882
devicemapper.DeleteDevice(devices.getPoolDevName(), deviceID)
883883
devices.markDeviceIDFree(deviceID)
884884
logrus.Debugf("devmapper: Error registering device: %s", err)
@@ -1830,7 +1830,7 @@ func (devices *DeviceSet) initDevmapper(doInit bool) error {
18301830
}
18311831

18321832
// AddDevice adds a device and registers in the hash.
1833-
func (devices *DeviceSet) AddDevice(hash, baseHash string) error {
1833+
func (devices *DeviceSet) AddDevice(hash, baseHash string, storageOpt map[string]string) error {
18341834
logrus.Debugf("devmapper: AddDevice(hash=%s basehash=%s)", hash, baseHash)
18351835
defer logrus.Debugf("devmapper: AddDevice(hash=%s basehash=%s) END", hash, baseHash)
18361836

@@ -1856,10 +1856,56 @@ func (devices *DeviceSet) AddDevice(hash, baseHash string) error {
18561856
return fmt.Errorf("devmapper: device %s already exists. Deleted=%v", hash, info.Deleted)
18571857
}
18581858

1859-
if err := devices.createRegisterSnapDevice(hash, baseInfo); err != nil {
1859+
devinfo := &devInfo{}
1860+
1861+
if err := devices.parseStorageOpt(storageOpt, devinfo); err != nil {
1862+
return err
1863+
}
1864+
1865+
if devinfo.Size == 0 {
1866+
devinfo.Size = baseInfo.Size
1867+
}
1868+
1869+
if devinfo.Size < baseInfo.Size {
1870+
return fmt.Errorf("devmapper: Container size cannot be smaller than %s", units.HumanSize(float64(baseInfo.Size)))
1871+
}
1872+
1873+
if err := devices.createRegisterSnapDevice(hash, baseInfo, devinfo.Size); err != nil {
18601874
return err
18611875
}
18621876

1877+
// Grow the container rootfs.
1878+
if devinfo.Size > 0 {
1879+
info, err := devices.lookupDevice(hash)
1880+
if err != nil {
1881+
return err
1882+
}
1883+
1884+
if err := devices.growFS(info); err != nil {
1885+
return err
1886+
}
1887+
}
1888+
1889+
return nil
1890+
}
1891+
1892+
func (devices *DeviceSet) parseStorageOpt(storageOpt map[string]string, devinfo *devInfo) error {
1893+
1894+
// Read size to change the block device size per container.
1895+
for key, val := range storageOpt {
1896+
key := strings.ToLower(key)
1897+
switch key {
1898+
case "size":
1899+
size, err := units.RAMInBytes(val)
1900+
if err != nil {
1901+
return err
1902+
}
1903+
devinfo.Size = uint64(size)
1904+
default:
1905+
return fmt.Errorf("Unknown option %s", key)
1906+
}
1907+
}
1908+
18631909
return nil
18641910
}
18651911

daemon/graphdriver/devmapper/driver.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,8 @@ func (d *Driver) Cleanup() error {
118118
}
119119

120120
// Create adds a device with a given id and the parent.
121-
func (d *Driver) Create(id, parent, mountLabel string) error {
122-
if err := d.DeviceSet.AddDevice(id, parent); err != nil {
121+
func (d *Driver) Create(id, parent, mountLabel string, storageOpt map[string]string) error {
122+
if err := d.DeviceSet.AddDevice(id, parent, storageOpt); err != nil {
123123
return err
124124
}
125125

0 commit comments

Comments
 (0)