Add support for Attach to the kubelet.

This is a pre-cursor to supporting 'kubectl attach ...' and 'kubectl run -it ...'
This commit is contained in:
Brendan Burns
2015-07-27 21:48:55 -07:00
parent e45c6f9847
commit 64be76c14d
10 changed files with 357 additions and 12 deletions

View File

@@ -71,6 +71,7 @@ type DockerInterface interface {
CreateExec(docker.CreateExecOptions) (*docker.Exec, error)
StartExec(string, docker.StartExecOptions) error
InspectExec(id string) (*docker.ExecInspect, error)
AttachToContainer(opts docker.AttachToContainerOptions) error
}
// KubeletContainerName encapsulates a pod name and a Kubernetes container name.

View File

@@ -298,6 +298,13 @@ func (f *FakeDockerClient) StartExec(_ string, _ docker.StartExecOptions) error
return nil
}
func (f *FakeDockerClient) AttachToContainer(opts docker.AttachToContainerOptions) error {
f.Lock()
defer f.Unlock()
f.called = append(f.called, "attach")
return nil
}
func (f *FakeDockerClient) InspectExec(id string) (*docker.ExecInspect, error) {
return f.ExecInspect, f.popError("inspect_exec")
}

View File

@@ -189,3 +189,12 @@ func (in instrumentedDockerInterface) InspectExec(id string) (*docker.ExecInspec
recordError(operation, err)
return out, err
}
func (in instrumentedDockerInterface) AttachToContainer(opts docker.AttachToContainerOptions) error {
const operation = "attach"
defer recordOperation(operation, time.Now())
err := in.client.AttachToContainer(opts)
recordError(operation, err)
return err
}

View File

@@ -1006,6 +1006,21 @@ func (dm *DockerManager) ExecInContainer(containerId string, cmd []string, stdin
return dm.execHandler.ExecInContainer(dm.client, container, cmd, stdin, stdout, stderr, tty)
}
func (dm *DockerManager) AttachContainer(containerId string, stdin io.Reader, stdout, stderr io.WriteCloser, tty bool) error {
opts := docker.AttachToContainerOptions{
Container: containerId,
InputStream: stdin,
OutputStream: stdout,
ErrorStream: stderr,
Logs: true,
Stdin: stdin != nil,
Stdout: stdout != nil,
Stderr: stderr != nil,
RawTerminal: tty,
}
return dm.client.AttachToContainer(opts)
}
func noPodInfraContainerError(podName, podNamespace string) error {
return fmt.Errorf("cannot find pod infra container in pod %q", kubecontainer.BuildPodFullName(podName, podNamespace))
}