Skip to content

Commit 1b35c2a

Browse files
authored
Merge pull request #1511 from Starnop/cri-update
feature: UpdateContainerResources of CRI Manager
2 parents a79519d + 985234c commit 1b35c2a

File tree

4 files changed

+64
-3
lines changed

4 files changed

+64
-3
lines changed

cri/v1alpha1/cri.go

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,34 @@ func (c *CriManager) ListContainerStats(ctx context.Context, r *runtime.ListCont
701701

702702
// UpdateContainerResources updates ContainerConfig of the container.
703703
func (c *CriManager) UpdateContainerResources(ctx context.Context, r *runtime.UpdateContainerResourcesRequest) (*runtime.UpdateContainerResourcesResponse, error) {
704-
return nil, fmt.Errorf("UpdateContainerResources Not Implemented Yet")
704+
containerID := r.GetContainerId()
705+
container, err := c.ContainerMgr.Get(ctx, containerID)
706+
if err != nil {
707+
return nil, fmt.Errorf("failed to get container %q: %v", containerID, err)
708+
}
709+
710+
// cannot update container resource when it is in removing state
711+
if container.IsRemoving() {
712+
return nil, fmt.Errorf("cannot to update resource for container %q when it is in removing state", containerID)
713+
}
714+
715+
resources := r.GetLinux()
716+
updateConfig := &apitypes.UpdateConfig{
717+
Resources: apitypes.Resources{
718+
CPUPeriod: resources.GetCpuPeriod(),
719+
CPUQuota: resources.GetCpuQuota(),
720+
CPUShares: resources.GetCpuShares(),
721+
Memory: resources.GetMemoryLimitInBytes(),
722+
CpusetCpus: resources.GetCpusetCpus(),
723+
CpusetMems: resources.GetCpusetMems(),
724+
},
725+
}
726+
err = c.ContainerMgr.Update(ctx, containerID, updateConfig)
727+
if err != nil {
728+
return nil, fmt.Errorf("failed to update resource for container %q: %v", containerID, err)
729+
}
730+
731+
return &runtime.UpdateContainerResourcesResponse{}, nil
705732
}
706733

707734
// ExecSync executes a command in the container, and returns the stdout output.

cri/v1alpha2/cri.go

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -698,7 +698,34 @@ func (c *CriManager) ListContainerStats(ctx context.Context, r *runtime.ListCont
698698

699699
// UpdateContainerResources updates ContainerConfig of the container.
700700
func (c *CriManager) UpdateContainerResources(ctx context.Context, r *runtime.UpdateContainerResourcesRequest) (*runtime.UpdateContainerResourcesResponse, error) {
701-
return nil, fmt.Errorf("UpdateContainerResources Not Implemented Yet")
701+
containerID := r.GetContainerId()
702+
container, err := c.ContainerMgr.Get(ctx, containerID)
703+
if err != nil {
704+
return nil, fmt.Errorf("failed to get container %q: %v", containerID, err)
705+
}
706+
707+
// cannot update container resource when it is in removing state
708+
if container.IsRemoving() {
709+
return nil, fmt.Errorf("cannot to update resource for container %q when it is in removing state", containerID)
710+
}
711+
712+
resources := r.GetLinux()
713+
updateConfig := &apitypes.UpdateConfig{
714+
Resources: apitypes.Resources{
715+
CPUPeriod: resources.GetCpuPeriod(),
716+
CPUQuota: resources.GetCpuQuota(),
717+
CPUShares: resources.GetCpuShares(),
718+
Memory: resources.GetMemoryLimitInBytes(),
719+
CpusetCpus: resources.GetCpusetCpus(),
720+
CpusetMems: resources.GetCpusetMems(),
721+
},
722+
}
723+
err = c.ContainerMgr.Update(ctx, containerID, updateConfig)
724+
if err != nil {
725+
return nil, fmt.Errorf("failed to update resource for container %q: %v", containerID, err)
726+
}
727+
728+
return &runtime.UpdateContainerResourcesResponse{}, nil
702729
}
703730

704731
// ReopenContainerLog asks runtime to reopen the stdout/stderr log file

daemon/mgr/container.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -817,7 +817,7 @@ func (mgr *ContainerManager) Update(ctx context.Context, name string, config *ty
817817

818818
c.Lock()
819819
// TODO update restartpolicy when container is running.
820-
if config.RestartPolicy.Name != "" {
820+
if config.RestartPolicy != nil && config.RestartPolicy.Name != "" {
821821
c.HostConfig.RestartPolicy = config.RestartPolicy
822822
}
823823
c.Unlock()

daemon/mgr/container_state.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,13 @@ func (c *Container) IsPaused() bool {
4242
return c.State.Status == types.StatusPaused
4343
}
4444

45+
// IsRemoving returns container is removing or not.
46+
func (c *Container) IsRemoving() bool {
47+
c.Lock()
48+
defer c.Unlock()
49+
return c.State.Status == types.StatusRemoving
50+
}
51+
4552
// IsDead returns container is dead or not.
4653
func (c *Container) IsDead() bool {
4754
c.Lock()

0 commit comments

Comments
 (0)