mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 12:18:16 +00:00 
			
		
		
		
	Merge pull request #14358 from derekwaynecarr/fix_request_defaulting
Default resources.requests only for Pod resources
This commit is contained in:
		@@ -93,6 +93,24 @@ func addDefaultingFuncs() {
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							func(obj *Pod) {
 | 
				
			||||||
 | 
								// If limits are specified, but requests are not, default requests to limits
 | 
				
			||||||
 | 
								// This is done here rather than a more specific defaulting pass on ResourceRequirements
 | 
				
			||||||
 | 
								// because we only want this defaulting semantic to take place on a Pod and not a PodTemplate
 | 
				
			||||||
 | 
								for i := range obj.Spec.Containers {
 | 
				
			||||||
 | 
									// set requests to limits if requests are not specified, but limits are
 | 
				
			||||||
 | 
									if obj.Spec.Containers[i].Resources.Limits != nil {
 | 
				
			||||||
 | 
										if obj.Spec.Containers[i].Resources.Requests == nil {
 | 
				
			||||||
 | 
											obj.Spec.Containers[i].Resources.Requests = make(ResourceList)
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										for key, value := range obj.Spec.Containers[i].Resources.Limits {
 | 
				
			||||||
 | 
											if _, exists := obj.Spec.Containers[i].Resources.Requests[key]; !exists {
 | 
				
			||||||
 | 
												obj.Spec.Containers[i].Resources.Requests[key] = *(value.Copy())
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		func(obj *PodSpec) {
 | 
							func(obj *PodSpec) {
 | 
				
			||||||
			if obj.DNSPolicy == "" {
 | 
								if obj.DNSPolicy == "" {
 | 
				
			||||||
				obj.DNSPolicy = DNSClusterFirst
 | 
									obj.DNSPolicy = DNSClusterFirst
 | 
				
			||||||
@@ -165,19 +183,6 @@ func addDefaultingFuncs() {
 | 
				
			|||||||
				obj.APIVersion = "v1"
 | 
									obj.APIVersion = "v1"
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		func(obj *ResourceRequirements) {
 | 
					 | 
				
			||||||
			// Set requests to limits if requests are not specified (but limits are).
 | 
					 | 
				
			||||||
			if obj.Limits != nil {
 | 
					 | 
				
			||||||
				if obj.Requests == nil {
 | 
					 | 
				
			||||||
					obj.Requests = make(ResourceList)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				for key, value := range obj.Limits {
 | 
					 | 
				
			||||||
					if _, exists := obj.Requests[key]; !exists {
 | 
					 | 
				
			||||||
						obj.Requests[key] = *(value.Copy())
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		func(obj *LimitRangeItem) {
 | 
							func(obj *LimitRangeItem) {
 | 
				
			||||||
			// for container limits, we apply default values
 | 
								// for container limits, we apply default values
 | 
				
			||||||
			if obj.Type == LimitTypeContainer {
 | 
								if obj.Type == LimitTypeContainer {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -433,6 +433,77 @@ func TestSetDefaultObjectFieldSelectorAPIVersion(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestSetDefaultRequestsPod(t *testing.T) {
 | 
				
			||||||
 | 
						// verify we default if limits are specified
 | 
				
			||||||
 | 
						s := versioned.PodSpec{}
 | 
				
			||||||
 | 
						s.Containers = []versioned.Container{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Resources: versioned.ResourceRequirements{
 | 
				
			||||||
 | 
									Limits: versioned.ResourceList{
 | 
				
			||||||
 | 
										versioned.ResourceCPU: resource.MustParse("100m"),
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						pod := &versioned.Pod{
 | 
				
			||||||
 | 
							Spec: s,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						output := roundTrip(t, runtime.Object(pod))
 | 
				
			||||||
 | 
						pod2 := output.(*versioned.Pod)
 | 
				
			||||||
 | 
						defaultRequest := pod2.Spec.Containers[0].Resources.Requests
 | 
				
			||||||
 | 
						requestValue := defaultRequest[versioned.ResourceCPU]
 | 
				
			||||||
 | 
						if requestValue.String() != "100m" {
 | 
				
			||||||
 | 
							t.Errorf("Expected request cpu: %s, got: %s", "100m", requestValue.String())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// verify we do nothing if no limits are specified
 | 
				
			||||||
 | 
						s = versioned.PodSpec{}
 | 
				
			||||||
 | 
						s.Containers = []versioned.Container{{}}
 | 
				
			||||||
 | 
						pod = &versioned.Pod{
 | 
				
			||||||
 | 
							Spec: s,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						output = roundTrip(t, runtime.Object(pod))
 | 
				
			||||||
 | 
						pod2 = output.(*versioned.Pod)
 | 
				
			||||||
 | 
						defaultRequest = pod2.Spec.Containers[0].Resources.Requests
 | 
				
			||||||
 | 
						requestValue = defaultRequest[versioned.ResourceCPU]
 | 
				
			||||||
 | 
						if requestValue.String() != "0" {
 | 
				
			||||||
 | 
							t.Errorf("Expected 0 request value, got: %s", requestValue.String())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestDefaultRequestIsNotSetForReplicationController(t *testing.T) {
 | 
				
			||||||
 | 
						s := versioned.PodSpec{}
 | 
				
			||||||
 | 
						s.Containers = []versioned.Container{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Resources: versioned.ResourceRequirements{
 | 
				
			||||||
 | 
									Limits: versioned.ResourceList{
 | 
				
			||||||
 | 
										versioned.ResourceCPU: resource.MustParse("100m"),
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						rc := &versioned.ReplicationController{
 | 
				
			||||||
 | 
							Spec: versioned.ReplicationControllerSpec{
 | 
				
			||||||
 | 
								Replicas: newInt(3),
 | 
				
			||||||
 | 
								Template: &versioned.PodTemplateSpec{
 | 
				
			||||||
 | 
									ObjectMeta: versioned.ObjectMeta{
 | 
				
			||||||
 | 
										Labels: map[string]string{
 | 
				
			||||||
 | 
											"foo": "bar",
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									Spec: s,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						output := roundTrip(t, runtime.Object(rc))
 | 
				
			||||||
 | 
						rc2 := output.(*versioned.ReplicationController)
 | 
				
			||||||
 | 
						defaultRequest := rc2.Spec.Template.Spec.Containers[0].Resources.Requests
 | 
				
			||||||
 | 
						requestValue := defaultRequest[versioned.ResourceCPU]
 | 
				
			||||||
 | 
						if requestValue.String() != "0" {
 | 
				
			||||||
 | 
							t.Errorf("Expected 0 request value, got: %s", requestValue.String())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestSetDefaultLimitRangeItem(t *testing.T) {
 | 
					func TestSetDefaultLimitRangeItem(t *testing.T) {
 | 
				
			||||||
	limitRange := &versioned.LimitRange{
 | 
						limitRange := &versioned.LimitRange{
 | 
				
			||||||
		ObjectMeta: versioned.ObjectMeta{
 | 
							ObjectMeta: versioned.ObjectMeta{
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user