Adds Windows resource limits support
This will allow running Windows Containers to have their resource limits updated through containerd. The CPU resource limits support has been added for Windows Server 20H2 and newer, on older versions hcsshim will raise an Unimplemented error. Signed-off-by: Claudiu Belu <cbelu@cloudbasesolutions.com>
This commit is contained in:
		| @@ -67,7 +67,7 @@ func TestUpdateContainerResources(t *testing.T) { | ||||
| 	t.Log("Update container memory limit after created") | ||||
| 	err = runtimeService.UpdateContainerResources(cn, &runtime.LinuxContainerResources{ | ||||
| 		MemoryLimitInBytes: 400 * 1024 * 1024, | ||||
| 	}) | ||||
| 	}, nil) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	t.Log("Check memory limit in container OCI spec") | ||||
| @@ -90,7 +90,7 @@ func TestUpdateContainerResources(t *testing.T) { | ||||
| 	t.Log("Update container memory limit after started") | ||||
| 	err = runtimeService.UpdateContainerResources(cn, &runtime.LinuxContainerResources{ | ||||
| 		MemoryLimitInBytes: 800 * 1024 * 1024, | ||||
| 	}) | ||||
| 	}, nil) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	t.Log("Check memory limit in container OCI spec") | ||||
|   | ||||
| @@ -63,7 +63,7 @@ type ContainerManager interface { | ||||
| 	// ContainerStatus returns the status of the container. | ||||
| 	ContainerStatus(containerID string, opts ...grpc.CallOption) (*runtimeapi.ContainerStatus, error) | ||||
| 	// UpdateContainerResources updates the cgroup resources for the container. | ||||
| 	UpdateContainerResources(containerID string, resources *runtimeapi.LinuxContainerResources, opts ...grpc.CallOption) error | ||||
| 	UpdateContainerResources(containerID string, resources *runtimeapi.LinuxContainerResources, windowsResources *runtimeapi.WindowsContainerResources, opts ...grpc.CallOption) error | ||||
| 	// ExecSync executes a command in the container, and returns the stdout output. | ||||
| 	// If command exits with a non-zero exit code, an error is returned. | ||||
| 	ExecSync(containerID string, cmd []string, timeout time.Duration, opts ...grpc.CallOption) (stdout []byte, stderr []byte, err error) | ||||
|   | ||||
| @@ -361,7 +361,7 @@ func (r *RuntimeService) ContainerStatus(containerID string, opts ...grpc.CallOp | ||||
| } | ||||
|  | ||||
| // UpdateContainerResources updates a containers resource config | ||||
| func (r *RuntimeService) UpdateContainerResources(containerID string, resources *runtimeapi.LinuxContainerResources, opts ...grpc.CallOption) error { | ||||
| func (r *RuntimeService) UpdateContainerResources(containerID string, resources *runtimeapi.LinuxContainerResources, windowsResources *runtimeapi.WindowsContainerResources, opts ...grpc.CallOption) error { | ||||
| 	klog.V(10).Infof("[RuntimeService] UpdateContainerResources (containerID=%v, timeout=%v)", containerID, r.timeout) | ||||
| 	ctx, cancel := getContextWithTimeout(r.timeout) | ||||
| 	defer cancel() | ||||
| @@ -369,6 +369,7 @@ func (r *RuntimeService) UpdateContainerResources(containerID string, resources | ||||
| 	_, err := r.runtimeClient.UpdateContainerResources(ctx, &runtimeapi.UpdateContainerResourcesRequest{ | ||||
| 		ContainerId: containerID, | ||||
| 		Linux:       resources, | ||||
| 		Windows:     windowsResources, | ||||
| 	}, opts...) | ||||
| 	if err != nil { | ||||
| 		klog.Errorf("UpdateContainerResources %q from runtime service failed: %v", containerID, err) | ||||
|   | ||||
| @@ -111,12 +111,15 @@ func TestTruncIndex(t *testing.T) { | ||||
| 	require.NoError(t, err) | ||||
| 	assert.Equal(t, cn, cStats.Attributes.Id) | ||||
|  | ||||
| 	t.Logf("Update container memory limit after started") | ||||
| 	if goruntime.GOOS != "windows" { | ||||
| 		// TODO(claudiub): remove this when UpdateContainerResources works on running Windows Containers. | ||||
| 		// https://github.com/containerd/containerd/issues/5187 | ||||
| 		t.Logf("Update container memory limit after started") | ||||
| 		err = runtimeService.UpdateContainerResources(cnTruncIndex, &runtimeapi.LinuxContainerResources{ | ||||
| 			MemoryLimitInBytes: 50 * 1024 * 1024, | ||||
| 		}, nil) | ||||
| 		assert.NoError(t, err) | ||||
| 	} else { | ||||
| 		err = runtimeService.UpdateContainerResources(cnTruncIndex, nil, &runtimeapi.WindowsContainerResources{ | ||||
| 			MemoryLimitInBytes: 50 * 1024 * 1024, | ||||
| 		}) | ||||
| 		assert.NoError(t, err) | ||||
| 	} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Claudiu Belu
					Claudiu Belu