github.com/vieux/docker@v0.6.3-0.20161004191708-e097c2a938c7/pkg/sysinfo/sysinfo_solaris.go (about)

     1  // +build solaris,cgo
     2  
     3  package sysinfo
     4  
     5  import (
     6  	"bytes"
     7  	"os/exec"
     8  	"strconv"
     9  	"strings"
    10  )
    11  
    12  /*
    13  #cgo LDFLAGS: -llgrp
    14  #include <unistd.h>
    15  #include <stdlib.h>
    16  #include <sys/lgrp_user.h>
    17  int getLgrpCount() {
    18  	lgrp_cookie_t lgrpcookie = LGRP_COOKIE_NONE;
    19  	uint_t nlgrps;
    20  
    21  	if ((lgrpcookie = lgrp_init(LGRP_VIEW_OS)) == LGRP_COOKIE_NONE) {
    22  		return -1;
    23  	}
    24  	nlgrps = lgrp_nlgrps(lgrpcookie);
    25  	return nlgrps;
    26  }
    27  */
    28  import "C"
    29  
    30  // IsCPUSharesAvailable returns whether CPUShares setting is supported.
    31  // We need FSS to be set as default scheduling class to support CPU Shares
    32  func IsCPUSharesAvailable() bool {
    33  	cmd := exec.Command("/usr/sbin/dispadmin", "-d")
    34  	outBuf := new(bytes.Buffer)
    35  	errBuf := new(bytes.Buffer)
    36  	cmd.Stderr = errBuf
    37  	cmd.Stdout = outBuf
    38  
    39  	if err := cmd.Run(); err != nil {
    40  		return false
    41  	}
    42  	return (strings.Contains(outBuf.String(), "FSS"))
    43  }
    44  
    45  // New returns a new SysInfo, using the filesystem to detect which features
    46  // the kernel supports.
    47  //NOTE Solaris: If we change the below capabilities be sure
    48  // to update verifyPlatformContainerSettings() in daemon_solaris.go
    49  func New(quiet bool) *SysInfo {
    50  	sysInfo := &SysInfo{}
    51  	sysInfo.cgroupMemInfo = setCgroupMem(quiet)
    52  	sysInfo.cgroupCPUInfo = setCgroupCPU(quiet)
    53  	sysInfo.cgroupBlkioInfo = setCgroupBlkioInfo(quiet)
    54  	sysInfo.cgroupCpusetInfo = setCgroupCPUsetInfo(quiet)
    55  
    56  	sysInfo.IPv4ForwardingDisabled = false
    57  
    58  	sysInfo.AppArmor = false
    59  
    60  	return sysInfo
    61  }
    62  
    63  // setCgroupMem reads the memory information for Solaris.
    64  func setCgroupMem(quiet bool) cgroupMemInfo {
    65  
    66  	return cgroupMemInfo{
    67  		MemoryLimit:       true,
    68  		SwapLimit:         true,
    69  		MemoryReservation: false,
    70  		OomKillDisable:    false,
    71  		MemorySwappiness:  false,
    72  		KernelMemory:      false,
    73  	}
    74  }
    75  
    76  // setCgroupCPU reads the cpu information for Solaris.
    77  func setCgroupCPU(quiet bool) cgroupCPUInfo {
    78  
    79  	return cgroupCPUInfo{
    80  		CPUShares:    true,
    81  		CPUCfsPeriod: false,
    82  		CPUCfsQuota:  true,
    83  	}
    84  }
    85  
    86  // blkio switches are not supported in Solaris.
    87  func setCgroupBlkioInfo(quiet bool) cgroupBlkioInfo {
    88  
    89  	return cgroupBlkioInfo{
    90  		BlkioWeight:       false,
    91  		BlkioWeightDevice: false,
    92  	}
    93  }
    94  
    95  // setCgroupCPUsetInfo reads the cpuset information for Solaris.
    96  func setCgroupCPUsetInfo(quiet bool) cgroupCpusetInfo {
    97  
    98  	return cgroupCpusetInfo{
    99  		Cpuset: true,
   100  		Cpus:   getCPUCount(),
   101  		Mems:   getLgrpCount(),
   102  	}
   103  }
   104  
   105  func getCPUCount() string {
   106  	ncpus := C.sysconf(C._SC_NPROCESSORS_ONLN)
   107  	if ncpus <= 0 {
   108  		return ""
   109  	}
   110  	return strconv.FormatInt(int64(ncpus), 16)
   111  }
   112  
   113  func getLgrpCount() string {
   114  	nlgrps := C.getLgrpCount()
   115  	if nlgrps <= 0 {
   116  		return ""
   117  	}
   118  	return strconv.FormatInt(int64(nlgrps), 16)
   119  }