mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-11-03 23:40:03 +00:00 
			
		
		
		
	godep restore pushd $GOPATH/src/github.com/appc/spec git co master popd go get go4.org/errorutil rm -rf Godeps godep save ./... git add vendor git add -f $(git ls-files --other vendor/) git co -- Godeps/LICENSES Godeps/.license_file_state Godeps/OWNERS
		
			
				
	
	
		
			119 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package units
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"strconv"
 | 
						|
	"strings"
 | 
						|
)
 | 
						|
 | 
						|
// Ulimit is a human friendly version of Rlimit.
 | 
						|
type Ulimit struct {
 | 
						|
	Name string
 | 
						|
	Hard int64
 | 
						|
	Soft int64
 | 
						|
}
 | 
						|
 | 
						|
// Rlimit specifies the resource limits, such as max open files.
 | 
						|
type Rlimit struct {
 | 
						|
	Type int    `json:"type,omitempty"`
 | 
						|
	Hard uint64 `json:"hard,omitempty"`
 | 
						|
	Soft uint64 `json:"soft,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
const (
 | 
						|
	// magic numbers for making the syscall
 | 
						|
	// some of these are defined in the syscall package, but not all.
 | 
						|
	// Also since Windows client doesn't get access to the syscall package, need to
 | 
						|
	//	define these here
 | 
						|
	rlimitAs         = 9
 | 
						|
	rlimitCore       = 4
 | 
						|
	rlimitCPU        = 0
 | 
						|
	rlimitData       = 2
 | 
						|
	rlimitFsize      = 1
 | 
						|
	rlimitLocks      = 10
 | 
						|
	rlimitMemlock    = 8
 | 
						|
	rlimitMsgqueue   = 12
 | 
						|
	rlimitNice       = 13
 | 
						|
	rlimitNofile     = 7
 | 
						|
	rlimitNproc      = 6
 | 
						|
	rlimitRss        = 5
 | 
						|
	rlimitRtprio     = 14
 | 
						|
	rlimitRttime     = 15
 | 
						|
	rlimitSigpending = 11
 | 
						|
	rlimitStack      = 3
 | 
						|
)
 | 
						|
 | 
						|
var ulimitNameMapping = map[string]int{
 | 
						|
	//"as":         rlimitAs, // Disabled since this doesn't seem usable with the way Docker inits a container.
 | 
						|
	"core":       rlimitCore,
 | 
						|
	"cpu":        rlimitCPU,
 | 
						|
	"data":       rlimitData,
 | 
						|
	"fsize":      rlimitFsize,
 | 
						|
	"locks":      rlimitLocks,
 | 
						|
	"memlock":    rlimitMemlock,
 | 
						|
	"msgqueue":   rlimitMsgqueue,
 | 
						|
	"nice":       rlimitNice,
 | 
						|
	"nofile":     rlimitNofile,
 | 
						|
	"nproc":      rlimitNproc,
 | 
						|
	"rss":        rlimitRss,
 | 
						|
	"rtprio":     rlimitRtprio,
 | 
						|
	"rttime":     rlimitRttime,
 | 
						|
	"sigpending": rlimitSigpending,
 | 
						|
	"stack":      rlimitStack,
 | 
						|
}
 | 
						|
 | 
						|
// ParseUlimit parses and returns a Ulimit from the specified string.
 | 
						|
func ParseUlimit(val string) (*Ulimit, error) {
 | 
						|
	parts := strings.SplitN(val, "=", 2)
 | 
						|
	if len(parts) != 2 {
 | 
						|
		return nil, fmt.Errorf("invalid ulimit argument: %s", val)
 | 
						|
	}
 | 
						|
 | 
						|
	if _, exists := ulimitNameMapping[parts[0]]; !exists {
 | 
						|
		return nil, fmt.Errorf("invalid ulimit type: %s", parts[0])
 | 
						|
	}
 | 
						|
 | 
						|
	var (
 | 
						|
		soft int64
 | 
						|
		hard = &soft // default to soft in case no hard was set
 | 
						|
		temp int64
 | 
						|
		err  error
 | 
						|
	)
 | 
						|
	switch limitVals := strings.Split(parts[1], ":"); len(limitVals) {
 | 
						|
	case 2:
 | 
						|
		temp, err = strconv.ParseInt(limitVals[1], 10, 64)
 | 
						|
		if err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
		hard = &temp
 | 
						|
		fallthrough
 | 
						|
	case 1:
 | 
						|
		soft, err = strconv.ParseInt(limitVals[0], 10, 64)
 | 
						|
		if err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
	default:
 | 
						|
		return nil, fmt.Errorf("too many limit value arguments - %s, can only have up to two, `soft[:hard]`", parts[1])
 | 
						|
	}
 | 
						|
 | 
						|
	if soft > *hard {
 | 
						|
		return nil, fmt.Errorf("ulimit soft limit must be less than or equal to hard limit: %d > %d", soft, *hard)
 | 
						|
	}
 | 
						|
 | 
						|
	return &Ulimit{Name: parts[0], Soft: soft, Hard: *hard}, nil
 | 
						|
}
 | 
						|
 | 
						|
// GetRlimit returns the RLimit corresponding to Ulimit.
 | 
						|
func (u *Ulimit) GetRlimit() (*Rlimit, error) {
 | 
						|
	t, exists := ulimitNameMapping[u.Name]
 | 
						|
	if !exists {
 | 
						|
		return nil, fmt.Errorf("invalid ulimit name %s", u.Name)
 | 
						|
	}
 | 
						|
 | 
						|
	return &Rlimit{Type: t, Soft: uint64(u.Soft), Hard: uint64(u.Hard)}, nil
 | 
						|
}
 | 
						|
 | 
						|
func (u *Ulimit) String() string {
 | 
						|
	return fmt.Sprintf("%s=%d:%d", u.Name, u.Soft, u.Hard)
 | 
						|
}
 |