@@ -21,8 +21,10 @@ import (
2121 "context"
2222 "fmt"
2323 "os"
24+ "os/exec"
2425 "path/filepath"
2526 "strconv"
27+ "strings"
2628 "testing"
2729
2830 "gotest.tools/v3/assert"
@@ -477,3 +479,192 @@ func TestRunBlkioWeightCgroupV2(t *testing.T) {
477479 base .Cmd ("update" , containerName , "--blkio-weight" , "400" ).AssertOK ()
478480 base .Cmd ("exec" , containerName , "cat" , "io.bfq.weight" ).AssertOutExactly ("default 400\n " )
479481}
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