| package daemon | |
| import ( | |
| "context" | |
| "errors" | |
| "strconv" | |
| "time" | |
| "github.com/moby/moby/api/types/events" | |
| "github.com/moby/moby/v2/errdefs" | |
| ) | |
| // ContainerResize changes the size of the TTY of the process running | |
| // in the container with the given name to the given height and width. | |
| func (daemon *Daemon) ContainerResize(ctx context.Context, name string, height, width uint32) error { | |
| container, err := daemon.GetContainer(name) | |
| if err != nil { | |
| return err | |
| } | |
| container.Lock() | |
| tsk, err := container.GetRunningTask() | |
| container.Unlock() | |
| if err != nil { | |
| return err | |
| } | |
| if err = tsk.Resize(context.WithoutCancel(ctx), width, height); err == nil { | |
| daemon.LogContainerEventWithAttributes(container, events.ActionResize, map[string]string{ | |
| "height": strconv.FormatUint(uint64(height), 10), | |
| "width": strconv.FormatUint(uint64(width), 10), | |
| }) | |
| } | |
| return err | |
| } | |
| // ContainerExecResize changes the size of the TTY of the process | |
| // running in the exec with the given name to the given height and | |
| // width. | |
| func (daemon *Daemon) ContainerExecResize(ctx context.Context, name string, height, width uint32) error { | |
| ec, err := daemon.getExecConfig(name) | |
| if err != nil { | |
| return err | |
| } | |
| // TODO: the timeout is hardcoded here, it would be more flexible to make it | |
| // a parameter in resize request context, which would need API changes. | |
| timeout := time.NewTimer(10 * time.Second) | |
| defer timeout.Stop() | |
| select { | |
| case <-ec.Started: | |
| // An error may have occurred, so ec.Process may be nil. | |
| if ec.Process == nil { | |
| return errdefs.InvalidParameter(errors.New("exec process is not started")) | |
| } | |
| return ec.Process.Resize(context.WithoutCancel(ctx), width, height) | |
| case <-timeout.C: | |
| return errors.New("timeout waiting for exec session ready") | |
| } | |
| } |