github.com/opencontainers/runtime-tools@v0.9.0/validation/linux_cgroups_hugetlb/linux_cgroups_hugetlb.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"runtime"
     6  
     7  	"github.com/mndrix/tap-go"
     8  	rspec "github.com/opencontainers/runtime-spec/specs-go"
     9  	"github.com/opencontainers/runtime-tools/cgroups"
    10  	"github.com/opencontainers/runtime-tools/validation/util"
    11  )
    12  
    13  func testHugetlbCgroups() error {
    14  	t := tap.New()
    15  	t.Header(0)
    16  	defer t.AutoPlan()
    17  
    18  	// limit =~ 100 * page size
    19  	// NOTE: on some systems, pagesize "1GB" doesn't seem to work.
    20  	// Ideally we should auto-detect the value.
    21  	cases := []struct {
    22  		page  string
    23  		limit uint64
    24  	}{
    25  		{"2MB", 100 * 2 * 1024 * 1024},
    26  		{"1GB", 100 * 1024 * 1024 * 1024},
    27  		{"2MB", 100 * 2 * 1024 * 1024},
    28  		{"1GB", 100 * 1024 * 1024 * 1024},
    29  	}
    30  
    31  	for _, c := range cases {
    32  		g, err := util.GetDefaultGenerator()
    33  		if err != nil {
    34  			return err
    35  		}
    36  		g.SetLinuxCgroupsPath(cgroups.AbsCgroupPath)
    37  		g.AddLinuxResourcesHugepageLimit(c.page, c.limit)
    38  		err = util.RuntimeOutsideValidate(g, t, func(config *rspec.Spec, t *tap.T, state *rspec.State) error {
    39  			cg, err := cgroups.FindCgroup()
    40  			if err != nil {
    41  				return err
    42  			}
    43  			lhd, err := cg.GetHugepageLimitData(state.Pid, config.Linux.CgroupsPath)
    44  			if err != nil {
    45  				return err
    46  			}
    47  			for _, lhl := range lhd {
    48  				if lhl.Pagesize != c.page {
    49  					continue
    50  				}
    51  				t.Ok(lhl.Limit == c.limit, "hugepage limit is set correctly")
    52  				t.Diagnosticf("expect: %d, actual: %d", c.limit, lhl.Limit)
    53  			}
    54  			return nil
    55  		})
    56  		if err != nil {
    57  			return err
    58  		}
    59  	}
    60  
    61  	return nil
    62  }
    63  
    64  func testWrongHugetlb() error {
    65  	// We deliberately set the page size to a wrong value, "3MB", to see
    66  	// if the container really returns an error.
    67  	page := "3MB"
    68  	var limit uint64 = 100 * 3 * 1024 * 1024
    69  
    70  	g, err := util.GetDefaultGenerator()
    71  	if err != nil {
    72  		return err
    73  	}
    74  
    75  	t := tap.New()
    76  	t.Header(0)
    77  	defer t.AutoPlan()
    78  
    79  	g.SetLinuxCgroupsPath(cgroups.AbsCgroupPath)
    80  	g.AddLinuxResourcesHugepageLimit(page, limit)
    81  
    82  	err = util.RuntimeOutsideValidate(g, t, func(config *rspec.Spec, t *tap.T, state *rspec.State) error {
    83  		return nil
    84  	})
    85  	t.Ok(err != nil, "hugepage invalid pagesize results in an errror")
    86  	if err == nil {
    87  		t.Diagnosticf("expect: err != nil, actual: err == nil")
    88  	}
    89  	return err
    90  }
    91  
    92  func main() {
    93  	if "linux" != runtime.GOOS {
    94  		util.Fatal(fmt.Errorf("linux-specific cgroup test"))
    95  	}
    96  
    97  	if err := testHugetlbCgroups(); err != nil {
    98  		util.Fatal(err)
    99  	}
   100  
   101  	if err := testWrongHugetlb(); err == nil {
   102  		util.Fatal(err)
   103  	}
   104  }