@@ -21,8 +21,10 @@ import (
21
21
"context"
22
22
"fmt"
23
23
"os"
24
+ "os/exec"
24
25
"path/filepath"
25
26
"strconv"
27
+ "strings"
26
28
"testing"
27
29
28
30
"gotest.tools/v3/assert"
@@ -477,3 +479,192 @@ func TestRunBlkioWeightCgroupV2(t *testing.T) {
477
479
base .Cmd ("update" , containerName , "--blkio-weight" , "400" ).AssertOK ()
478
480
base .Cmd ("exec" , containerName , "cat" , "io.bfq.weight" ).AssertOutExactly ("default 400\n " )
479
481
}
482
+
483
+ func TestRunBlkioSettingCgroupV2 (t * testing.T ) {
484
+ testCase := nerdtest .Setup ()
485
+ testCase .Require = nerdtest .Rootful
486
+
487
+ // Create dummy device path
488
+ dummyDev := "/dev/dummy-zero"
489
+
490
+ testCase .Setup = func (data test.Data , helpers test.Helpers ) {
491
+ // Create dummy device
492
+ helperCmd := exec .Command ("mknod" , dummyDev , "c" , "1" , "5" )
493
+ if out , err := helperCmd .CombinedOutput (); err != nil {
494
+ t .Fatalf ("cannot create %q: %q: %v" , dummyDev , string (out ), err )
495
+ }
496
+ }
497
+
498
+ testCase .Cleanup = func (data test.Data , helpers test.Helpers ) {
499
+ // Clean up the dummy device
500
+ if err := exec .Command ("rm" , "-f" , dummyDev ).Run (); err != nil {
501
+ t .Logf ("failed to remove device %s: %v" , dummyDev , err )
502
+ }
503
+ }
504
+
505
+ testCase .SubTests = []* test.Case {
506
+ {
507
+ Description : "blkio-weight" ,
508
+ Require : nerdtest .CGroupV2 ,
509
+ Command : func (data test.Data , helpers test.Helpers ) test.TestableCommand {
510
+ return helpers .Command ("run" , "-d" , "--name" , data .Identifier (),
511
+ "--blkio-weight" , "150" ,
512
+ testutil .AlpineImage , "sleep" , "infinity" )
513
+ },
514
+ Cleanup : func (data test.Data , helpers test.Helpers ) {
515
+ helpers .Anyhow ("rm" , "-f" , data .Identifier ())
516
+ },
517
+ Expected : func (data test.Data , helpers test.Helpers ) * test.Expected {
518
+ return & test.Expected {
519
+ ExitCode : 0 ,
520
+ Output : expect .All (
521
+ func (stdout string , info string , t * testing.T ) {
522
+ assert .Assert (t , strings .Contains (helpers .Capture ("inspect" , "--format" , "{{.HostConfig.BlkioWeight}}" , data .Identifier ()), "150" ))
523
+ },
524
+ ),
525
+ }
526
+ },
527
+ },
528
+ {
529
+ Description : "blkio-weight-device" ,
530
+ Require : nerdtest .CGroupV2 ,
531
+ Command : func (data test.Data , helpers test.Helpers ) test.TestableCommand {
532
+ return helpers .Command ("run" , "-d" , "--name" , data .Identifier (),
533
+ "--blkio-weight-device" , dummyDev + ":100" ,
534
+ testutil .AlpineImage , "sleep" , "infinity" )
535
+ },
536
+ Cleanup : func (data test.Data , helpers test.Helpers ) {
537
+ helpers .Anyhow ("rm" , "-f" , data .Identifier ())
538
+ },
539
+ Expected : func (data test.Data , helpers test.Helpers ) * test.Expected {
540
+ return & test.Expected {
541
+ ExitCode : 0 ,
542
+ Output : expect .All (
543
+ func (stdout string , info string , t * testing.T ) {
544
+ inspectOut := helpers .Capture ("inspect" , "--format" , "{{range .HostConfig.BlkioWeightDevice}}{{.Weight}}{{end}}" , data .Identifier ())
545
+ assert .Assert (t , strings .Contains (inspectOut , "100" ))
546
+ },
547
+ ),
548
+ }
549
+ },
550
+ },
551
+ {
552
+ Description : "device-read-bps" ,
553
+ Require : require .All (
554
+ nerdtest .CGroupV2 ,
555
+ // Docker cli (v26.1.3) available in github runners has a bug where some of the blkio options
556
+ // do not work https://github.com/docker/cli/issues/5321. The fix has been merged to the latest releases
557
+ // but not currently available in the v26 release.
558
+ require .Not (nerdtest .Docker ),
559
+ ),
560
+ Command : func (data test.Data , helpers test.Helpers ) test.TestableCommand {
561
+ return helpers .Command ("run" , "-d" , "--name" , data .Identifier (),
562
+ "--device-read-bps" , dummyDev + ":1048576" ,
563
+ testutil .AlpineImage , "sleep" , "infinity" )
564
+ },
565
+ Cleanup : func (data test.Data , helpers test.Helpers ) {
566
+ helpers .Anyhow ("rm" , "-f" , data .Identifier ())
567
+ },
568
+ Expected : func (data test.Data , helpers test.Helpers ) * test.Expected {
569
+ return & test.Expected {
570
+ ExitCode : 0 ,
571
+ Output : expect .All (
572
+ func (stdout string , info string , t * testing.T ) {
573
+ inspectOut := helpers .Capture ("inspect" , "--format" , "{{range .HostConfig.BlkioDeviceReadBps}}{{.Rate}}{{end}}" , data .Identifier ())
574
+ assert .Assert (t , strings .Contains (inspectOut , "1048576" ))
575
+ },
576
+ ),
577
+ }
578
+ },
579
+ },
580
+ {
581
+ Description : "device-write-bps" ,
582
+ Require : require .All (
583
+ nerdtest .CGroupV2 ,
584
+ // Docker cli (v26.1.3) available in github runners has a bug where some of the blkio options
585
+ // do not work https://github.com/docker/cli/issues/5321. The fix has been merged to the latest releases
586
+ // but not currently available in the v26 release.
587
+ require .Not (nerdtest .Docker ),
588
+ ),
589
+ Command : func (data test.Data , helpers test.Helpers ) test.TestableCommand {
590
+ return helpers .Command ("run" , "-d" , "--name" , data .Identifier (),
591
+ "--device-write-bps" , dummyDev + ":2097152" ,
592
+ testutil .AlpineImage , "sleep" , "infinity" )
593
+ },
594
+ Cleanup : func (data test.Data , helpers test.Helpers ) {
595
+ helpers .Anyhow ("rm" , "-f" , data .Identifier ())
596
+ },
597
+ Expected : func (data test.Data , helpers test.Helpers ) * test.Expected {
598
+ return & test.Expected {
599
+ ExitCode : 0 ,
600
+ Output : expect .All (
601
+ func (stdout string , info string , t * testing.T ) {
602
+ inspectOut := helpers .Capture ("inspect" , "--format" , "{{range .HostConfig.BlkioDeviceWriteBps}}{{.Rate}}{{end}}" , data .Identifier ())
603
+ assert .Assert (t , strings .Contains (inspectOut , "2097152" ))
604
+ },
605
+ ),
606
+ }
607
+ },
608
+ },
609
+ {
610
+ Description : "device-read-iops" ,
611
+ Require : require .All (
612
+ nerdtest .CGroupV2 ,
613
+ // Docker cli (v26.1.3) available in github runners has a bug where some of the blkio options
614
+ // do not work https://github.com/docker/cli/issues/5321. The fix has been merged to the latest releases
615
+ // but not currently available in the v26 release.
616
+ require .Not (nerdtest .Docker ),
617
+ ),
618
+ Command : func (data test.Data , helpers test.Helpers ) test.TestableCommand {
619
+ return helpers .Command ("run" , "-d" , "--name" , data .Identifier (),
620
+ "--device-read-iops" , dummyDev + ":1000" ,
621
+ testutil .AlpineImage , "sleep" , "infinity" )
622
+ },
623
+ Cleanup : func (data test.Data , helpers test.Helpers ) {
624
+ helpers .Anyhow ("rm" , "-f" , data .Identifier ())
625
+ },
626
+ Expected : func (data test.Data , helpers test.Helpers ) * test.Expected {
627
+ return & test.Expected {
628
+ ExitCode : 0 ,
629
+ Output : expect .All (
630
+ func (stdout string , info string , t * testing.T ) {
631
+ inspectOut := helpers .Capture ("inspect" , "--format" , "{{range .HostConfig.BlkioDeviceReadIOps}}{{.Rate}}{{end}}" , data .Identifier ())
632
+ assert .Assert (t , strings .Contains (inspectOut , "1000" ))
633
+ },
634
+ ),
635
+ }
636
+ },
637
+ },
638
+ {
639
+ Description : "device-write-iops" ,
640
+ Require : require .All (
641
+ nerdtest .CGroupV2 ,
642
+ // Docker cli (v26.1.3) available in github runners has a bug where some of the blkio options
643
+ // do not work https://github.com/docker/cli/issues/5321. The fix has been merged to the latest releases
644
+ // but not currently available in the v26 release.
645
+ require .Not (nerdtest .Docker ),
646
+ ),
647
+ Command : func (data test.Data , helpers test.Helpers ) test.TestableCommand {
648
+ return helpers .Command ("run" , "-d" , "--name" , data .Identifier (),
649
+ "--device-write-iops" , dummyDev + ":2000" ,
650
+ testutil .AlpineImage , "sleep" , "infinity" )
651
+ },
652
+ Cleanup : func (data test.Data , helpers test.Helpers ) {
653
+ helpers .Anyhow ("rm" , "-f" , data .Identifier ())
654
+ },
655
+ Expected : func (data test.Data , helpers test.Helpers ) * test.Expected {
656
+ return & test.Expected {
657
+ ExitCode : 0 ,
658
+ Output : expect .All (
659
+ func (stdout string , info string , t * testing.T ) {
660
+ inspectOut := helpers .Capture ("inspect" , "--format" , "{{range .HostConfig.BlkioDeviceWriteIOps}}{{.Rate}}{{end}}" , data .Identifier ())
661
+ assert .Assert (t , strings .Contains (inspectOut , "2000" ))
662
+ },
663
+ ),
664
+ }
665
+ },
666
+ },
667
+ }
668
+
669
+ testCase .Run (t )
670
+ }
0 commit comments