// PodCPU computes total cpu limit across all containers in pod // TODO: Remove this once the mesos scheduler becomes request aware func PodCPU(pod *api.Pod) *resource.Quantity { val := int64(0) for j := range pod.Spec.Containers { val = val + pod.Spec.Containers[j].Resources.Limits.Cpu().MilliValue() } return resource.NewMilliQuantity(int64(val), resource.DecimalSI) }
func makeResources(milliCPU int64, memory int64, pods int64) api.NodeResources { return api.NodeResources{ Capacity: api.ResourceList{ api.ResourceCPU: *resource.NewMilliQuantity(milliCPU, resource.DecimalSI), api.ResourceMemory: *resource.NewQuantity(memory, resource.BinarySI), api.ResourcePods: *resource.NewQuantity(pods, resource.DecimalSI), }, } }
func CapacityFromMachineInfo(info *cadvisorApi.MachineInfo) api.ResourceList { c := api.ResourceList{ api.ResourceCPU: *resource.NewMilliQuantity( int64(info.NumCores*1000), resource.DecimalSI), api.ResourceMemory: *resource.NewQuantity( info.MemoryCapacity, resource.BinarySI), } return c }
func makeNode(node string, milliCPU, memory int64) api.Node { return api.Node{ ObjectMeta: api.ObjectMeta{Name: node}, Status: api.NodeStatus{ Capacity: api.ResourceList{ "cpu": *resource.NewMilliQuantity(milliCPU, resource.DecimalSI), "memory": *resource.NewQuantity(memory, resource.BinarySI), }, }, } }
func (cm *containerManagerImpl) SystemContainersLimit() api.ResourceList { cpuLimit := int64(0) // Sum up resources of all external containers. for _, cont := range cm.systemContainers { cpuLimit += cont.cpuMillicores } return api.ResourceList{ api.ResourceCPU: *resource.NewMilliQuantity( cpuLimit, resource.DecimalSI), } }
func ExampleFormat() { memorySize := resource.NewQuantity(5*1024*1024*1024, resource.BinarySI) fmt.Printf("memorySize = %v\n", memorySize) diskSize := resource.NewQuantity(5*1000*1000*1000, resource.DecimalSI) fmt.Printf("diskSize = %v\n", diskSize) cores := resource.NewMilliQuantity(5300, resource.DecimalSI) fmt.Printf("cores = %v\n", cores) // Output: // memorySize = 5Gi // diskSize = 5G // cores = 5300m }
func newResourcePod(usage ...resourceRequest) *api.Pod { containers := []api.Container{} for _, req := range usage { containers = append(containers, api.Container{ Resources: api.ResourceRequirements{ Requests: api.ResourceList{ api.ResourceCPU: *resource.NewMilliQuantity(req.milliCPU, resource.DecimalSI), api.ResourceMemory: *resource.NewQuantity(req.memory, resource.BinarySI), }, }, }) } return &api.Pod{ Spec: api.PodSpec{ Containers: containers, }, } }
// Instances returns an implementation of Instances for OpenStack. func (os *OpenStack) Instances() (cloudprovider.Instances, bool) { glog.V(4).Info("openstack.Instances() called") compute, err := openstack.NewComputeV2(os.provider, gophercloud.EndpointOpts{ Region: os.region, }) if err != nil { glog.Warningf("Failed to find compute endpoint: %v", err) return nil, false } pager := flavors.ListDetail(compute, nil) flavor_to_resource := make(map[string]*api.NodeResources) err = pager.EachPage(func(page pagination.Page) (bool, error) { flavorList, err := flavors.ExtractFlavors(page) if err != nil { return false, err } for _, flavor := range flavorList { rsrc := api.NodeResources{ Capacity: api.ResourceList{ api.ResourceCPU: *resource.NewQuantity(int64(flavor.VCPUs), resource.DecimalSI), api.ResourceMemory: *resource.NewQuantity(int64(flavor.RAM)*MiB, resource.BinarySI), "openstack.org/disk": *resource.NewQuantity(int64(flavor.Disk)*GB, resource.DecimalSI), "openstack.org/rxTxFactor": *resource.NewMilliQuantity(int64(flavor.RxTxFactor)*1000, resource.DecimalSI), "openstack.org/swap": *resource.NewQuantity(int64(flavor.Swap)*MiB, resource.BinarySI), }, } flavor_to_resource[flavor.ID] = &rsrc } return true, nil }) if err != nil { glog.Warningf("Failed to find compute flavors: %v", err) return nil, false } glog.V(3).Infof("Found %v compute flavors", len(flavor_to_resource)) glog.V(1).Info("Claiming to support Instances") return &Instances{compute, flavor_to_resource}, true }
// sum takes the total of each named resource across all inputs // if a key is not in each input, then the output resource list will omit the key func sum(inputs []api.ResourceList) api.ResourceList { result := api.ResourceList{} keys := []api.ResourceName{} for i := range inputs { for k := range inputs[i] { keys = append(keys, k) } } for _, key := range keys { total, isSet := int64(0), true for i := range inputs { input := inputs[i] v, exists := input[key] if exists { if key == api.ResourceCPU { total = total + v.MilliValue() } else { total = total + v.Value() } } else { isSet = false } } if isSet { if key == api.ResourceCPU { result[key] = *(resource.NewMilliQuantity(total, resource.DecimalSI)) } else { result[key] = *(resource.NewQuantity(total, resource.DecimalSI)) } } } return result }
startPods(c, podsNeededForSaturation, ns, "overcommit", api.Pod{ TypeMeta: unversioned.TypeMeta{ Kind: "Pod", }, ObjectMeta: api.ObjectMeta{ Name: "", Labels: map[string]string{"name": ""}, }, Spec: api.PodSpec{ Containers: []api.Container{ { Name: "", Image: "gcr.io/google_containers/pause:go", Resources: api.ResourceRequirements{ Limits: api.ResourceList{ "cpu": *resource.NewMilliQuantity(milliCpuPerPod, "DecimalSI"), }, }, }, }, }, }) podName := "additional-pod" _, err = c.Pods(ns).Create(&api.Pod{ TypeMeta: unversioned.TypeMeta{ Kind: "Pod", }, ObjectMeta: api.ObjectMeta{ Name: podName, Labels: map[string]string{"name": "additional"},
// limitPodCPU sets DefaultContainerCPUs for the CPU limit of each container that // does not limit its CPU resource yet. limitPodCPU returns true if and only if // at least one container had no CPU limit set. func LimitPodCPU(pod *api.Pod, defaultLimit CPUShares) bool { defaultCPUQuantity := resource.NewMilliQuantity(int64(float64(defaultLimit)*1000.0), resource.DecimalSI) return limitPodResource(pod, api.ResourceCPU, *defaultCPUQuantity) }
func (ir initialResources) getEstimation(kind api.ResourceName, c *api.Container, ns string) (*resource.Quantity, error) { end := time.Now() start := end.Add(-week) var usage, samples int64 var err error // Historical data from last 7 days for the same image:tag within the same namespace. if usage, samples, err = ir.source.GetUsagePercentile(kind, ir.percentile, c.Image, ns, true, start, end); err != nil { return nil, err } if samples < samplesThreshold { // Historical data from last 30 days for the same image:tag within the same namespace. start := end.Add(-month) if usage, samples, err = ir.source.GetUsagePercentile(kind, ir.percentile, c.Image, ns, true, start, end); err != nil { return nil, err } } // If we are allowed to estimate only based on data from the same namespace. if ir.nsOnly { if samples < samplesThreshold { // Historical data from last 30 days for the same image within the same namespace. start := end.Add(-month) image := strings.Split(c.Image, ":")[0] if usage, samples, err = ir.source.GetUsagePercentile(kind, ir.percentile, image, ns, false, start, end); err != nil { return nil, err } } } else { if samples < samplesThreshold { // Historical data from last 7 days for the same image:tag within all namespaces. start := end.Add(-week) if usage, samples, err = ir.source.GetUsagePercentile(kind, ir.percentile, c.Image, "", true, start, end); err != nil { return nil, err } } if samples < samplesThreshold { // Historical data from last 30 days for the same image:tag within all namespaces. start := end.Add(-month) if usage, samples, err = ir.source.GetUsagePercentile(kind, ir.percentile, c.Image, "", true, start, end); err != nil { return nil, err } } if samples < samplesThreshold { // Historical data from last 30 days for the same image within all namespaces. start := end.Add(-month) image := strings.Split(c.Image, ":")[0] if usage, samples, err = ir.source.GetUsagePercentile(kind, ir.percentile, image, "", false, start, end); err != nil { return nil, err } } } if samples > 0 && kind == api.ResourceCPU { return resource.NewMilliQuantity(usage, resource.DecimalSI), nil } if samples > 0 && kind == api.ResourceMemory { return resource.NewQuantity(usage, resource.DecimalSI), nil } return nil, nil }
pod := &api.Pod{ ObjectMeta: api.ObjectMeta{ Name: name, Labels: map[string]string{ "name": "foo", "time": value, }, }, Spec: api.PodSpec{ Containers: []api.Container{ { Name: "nginx", Image: "gcr.io/google_containers/pause", Resources: api.ResourceRequirements{ Limits: api.ResourceList{ api.ResourceCPU: *resource.NewMilliQuantity(100, resource.DecimalSI), api.ResourceMemory: *resource.NewQuantity(10*1024*1024, resource.DecimalSI), }, }, }, }, }, } defer podClient.Delete(pod.Name, nil) _, err := podClient.Create(pod) if err != nil { Failf("Error creating a pod: %v", err) } expectNoError(framework.WaitForPodRunning(pod.Name)) })