From 49e1ad49c8fe0a6fbb7cba67cc030ef73125dcc7 Mon Sep 17 00:00:00 2001 From: Brian Goff Date: Mon, 26 Jan 2015 17:31:30 -0500 Subject: [PATCH 01/77] Allow normal volume to overwrite in start Binds Fixes #9981 Allows a volume which was created by docker (ie, in /var/lib/docker/vfs/dir) to be used as a Bind argument via the container start API and overwrite an existing volume. For example: ```bash docker create -v /foo --name one docker create -v /foo --name two ``` This allows the volume from `one` to be passed into the container start API as a bind to `two`, and it will overwrite it. This was possible before 7107898d5cf0f86dc1c6dab29e9dbdad3edc9411 Signed-off-by: Brian Goff --- daemon/volumes.go | 4 +- integration-cli/docker_api_containers_test.go | 37 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/daemon/volumes.go b/daemon/volumes.go index fdfc35a932..1cdcf6c29b 100644 --- a/daemon/volumes.go +++ b/daemon/volumes.go @@ -25,6 +25,7 @@ type Mount struct { Writable bool copyData bool from *Container + isBind bool } func (mnt *Mount) Export(resource string) (io.ReadCloser, error) { @@ -80,7 +81,7 @@ func (m *Mount) initialize() error { if hostPath, exists := m.container.Volumes[m.MountToPath]; exists { // If this is a bind-mount/volumes-from, maybe it was passed in at start instead of create // We need to make sure bind-mounts/volumes-from passed on start can override existing ones. - if !m.volume.IsBindMount && m.from == nil { + if (!m.volume.IsBindMount && !m.isBind) && m.from == nil { return nil } if m.volume.Path == hostPath { @@ -172,6 +173,7 @@ func (container *Container) parseVolumeMountConfig() (map[string]*Mount, error) volume: vol, MountToPath: mountToPath, Writable: writable, + isBind: true, // in case the volume itself is a normal volume, but is being mounted in as a bindmount here } } diff --git a/integration-cli/docker_api_containers_test.go b/integration-cli/docker_api_containers_test.go index ad995b73fb..b5ebc00e77 100644 --- a/integration-cli/docker_api_containers_test.go +++ b/integration-cli/docker_api_containers_test.go @@ -403,3 +403,40 @@ func TestBuildApiDockerfileSymlink(t *testing.T) { logDone("container REST API - check build w/bad Dockerfile symlink path") } + +// #9981 - Allow a docker created volume (ie, one in /var/lib/docker/volumes) to be used to overwrite (via passing in Binds on api start) an existing volume +func TestPostContainerBindNormalVolume(t *testing.T) { + defer deleteAllContainers() + + out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "create", "-v", "/foo", "--name=one", "busybox")) + if err != nil { + t.Fatal(err, out) + } + + fooDir, err := inspectFieldMap("one", "Volumes", "/foo") + if err != nil { + t.Fatal(err) + } + + out, _, err = runCommandWithOutput(exec.Command(dockerBinary, "create", "-v", "/foo", "--name=two", "busybox")) + if err != nil { + t.Fatal(err, out) + } + + bindSpec := map[string][]string{"Binds": {fooDir + ":/foo"}} + _, err = sockRequest("POST", "/containers/two/start", bindSpec) + if err != nil && !strings.Contains(err.Error(), "204 No Content") { + t.Fatal(err) + } + + fooDir2, err := inspectFieldMap("two", "Volumes", "/foo") + if err != nil { + t.Fatal(err) + } + + if fooDir2 != fooDir { + t.Fatal("expected volume path to be %s, got: %s", fooDir, fooDir2) + } + + logDone("container REST API - can use path from normal volume as bind-mount to overwrite another volume") +} From c8abc52736ae1e3898b2512e4efe2553110eb481 Mon Sep 17 00:00:00 2001 From: Casey Bisson Date: Thu, 5 Mar 2015 12:44:41 -0800 Subject: [PATCH 02/77] installation on Joyent Signed-off-by: Casey Bisson --- docs/sources/installation.md | 1 + docs/sources/installation/MAINTAINERS | 1 + docs/sources/installation/joyent.md | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+) create mode 100644 docs/sources/installation/joyent.md diff --git a/docs/sources/installation.md b/docs/sources/installation.md index 7eaabeeefe..5fa52fa978 100644 --- a/docs/sources/installation.md +++ b/docs/sources/installation.md @@ -23,4 +23,5 @@ techniques for installing Docker all the time. - [Amazon EC2](amazon/) - [Rackspace Cloud](rackspace/) - [Google Cloud Platform](google/) + - [Joyent Compute Service](joyent/) - [Binaries](binaries/) diff --git a/docs/sources/installation/MAINTAINERS b/docs/sources/installation/MAINTAINERS index aca13975fd..6ef08309b0 100644 --- a/docs/sources/installation/MAINTAINERS +++ b/docs/sources/installation/MAINTAINERS @@ -1,2 +1,3 @@ google.md: Johan Euphrosine (@proppy) softlayer.md: Phil Jackson (@underscorephil) +joyent.md: Casey Bisson (@misterbisson) diff --git a/docs/sources/installation/joyent.md b/docs/sources/installation/joyent.md new file mode 100644 index 0000000000..e3f0208144 --- /dev/null +++ b/docs/sources/installation/joyent.md @@ -0,0 +1,18 @@ +page_title: Installation on Joyent Public Cloud +page_description: Installation instructions for Docker on the Joyent Compute Service. +page_keywords: Docker, Docker documentation, installation, joyent, Joyent Public Cloud, Joyent Compute Service, Joyent Container Service + +# Joyent Compute Service + +## Docker QuickStart + +1. Sign in to the [Joyent customer portal](https://my.joyent.com/) and [create a Docker host](https://docs.joyent.com/jpc/managing-docker-containers/creating-a-docker-host). +1. Start and manage containers: + 1. [Start containers in the web UI](https://docs.joyent.com/jpc/managing-docker-containers/starting-a-container) + 1. SSH into the Docker host and launch containers using the Docker CLI + 1. [Configure the Docker CLI on your laptop](https://docs.joyent.com/jpc/managing-docker-containers/access-your-jpc-docker-hosts-from-the-docker-cli) to connect to the remote host to launch and manage containers. + +## What next? + +Continue with the [Docker user guide](/userguide/), read Joyent's [getting started blog post](https://www.joyent.com/blog/first-steps-with-joyents-container-service), and [full documentation](https://docs.joyent.com/jpc/managing-docker-containers). + From 3bf125fce3b98bd04a359a9294aed644a9c11f09 Mon Sep 17 00:00:00 2001 From: Ma Shimiao Date: Mon, 16 Mar 2015 19:02:53 +0800 Subject: [PATCH 03/77] fix wrong tab completion Signed-off-by: Ma Shimiao --- contrib/completion/bash/docker | 2 +- contrib/completion/fish/docker.fish | 2 +- contrib/completion/zsh/_docker | 16 +++------------- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/contrib/completion/bash/docker b/contrib/completion/bash/docker index 5d48e02cf3..7b4a23f2c9 100755 --- a/contrib/completion/bash/docker +++ b/contrib/completion/bash/docker @@ -943,11 +943,11 @@ _docker() { images import info - insert inspect kill load login + logout logs pause port diff --git a/contrib/completion/fish/docker.fish b/contrib/completion/fish/docker.fish index efee52f806..d3237588ef 100644 --- a/contrib/completion/fish/docker.fish +++ b/contrib/completion/fish/docker.fish @@ -16,7 +16,7 @@ function __fish_docker_no_subcommand --description 'Test if docker has yet to be given the subcommand' for i in (commandline -opc) - if contains -- $i attach build commit cp create diff events exec export history images import info insert inspect kill load login logout logs pause port ps pull push restart rm rmi run save search start stop tag top unpause version wait + if contains -- $i attach build commit cp create diff events exec export history images import info inspect kill load login logout logs pause port ps pull push rename restart rm rmi run save search start stop tag top unpause version wait return 1 end end diff --git a/contrib/completion/zsh/_docker b/contrib/completion/zsh/_docker index 3215814313..28398f7524 100644 --- a/contrib/completion/zsh/_docker +++ b/contrib/completion/zsh/_docker @@ -270,11 +270,6 @@ __docker_subcommand () { {-q,--quiet}'[Only show numeric IDs]' \ ':repository:__docker_repositories' ;; - (inspect) - _arguments \ - {-f,--format=-}'[Format the output using the given go template]:template: ' \ - '*:containers:__docker_containers' - ;; (import) _arguments \ ':URL:(- http:// file://)' \ @@ -282,15 +277,10 @@ __docker_subcommand () { ;; (info) ;; - (import) + (inspect) _arguments \ - ':URL:(- http:// file://)' \ - ':repository:__docker_repositories_with_tags' - ;; - (insert) - _arguments '1:containers:__docker_containers' \ - '2:URL:(http:// file://)' \ - '3:file:_files' + {-f,--format=-}'[Format the output using the given go template]:template: ' \ + '*:containers:__docker_containers' ;; (kill) _arguments \ From d8c3090dd9abe3f0d95f99c9d8c7660922e9a719 Mon Sep 17 00:00:00 2001 From: Sachin Joshi Date: Fri, 23 Jan 2015 17:33:49 -0800 Subject: [PATCH 04/77] ANSI terminal emulation for windows It is implemented by intercepting and interpreting the output escape sequence by calling win32 console apis. In addition the input from win32 console is translated to linux keycodes Signed-off-by: Sachin Joshi --- api/client/cli.go | 11 +- docker/docker.go | 9 +- pkg/term/console_windows.go | 1074 +++++++++++++++++++++++++++++- pkg/term/console_windows_test.go | 232 +++++++ pkg/term/term.go | 15 + pkg/term/term_emulator.go | 216 ++++++ pkg/term/term_emulator_test.go | 388 +++++++++++ pkg/term/term_windows.go | 25 +- 8 files changed, 1926 insertions(+), 44 deletions(-) create mode 100644 pkg/term/console_windows_test.go create mode 100644 pkg/term/term_emulator.go create mode 100644 pkg/term/term_emulator_test.go diff --git a/api/client/cli.go b/api/client/cli.go index fcf6c033fb..9ca5b1161c 100644 --- a/api/client/cli.go +++ b/api/client/cli.go @@ -137,19 +137,12 @@ func NewDockerCli(in io.ReadCloser, out, err io.Writer, keyFile string, proto, a if tlsConfig != nil { scheme = "https" } - if in != nil { - if file, ok := in.(*os.File); ok { - inFd = file.Fd() - isTerminalIn = term.IsTerminal(inFd) - } + inFd, isTerminalIn = term.GetHandleInfo(in) } if out != nil { - if file, ok := out.(*os.File); ok { - outFd = file.Fd() - isTerminalOut = term.IsTerminal(outFd) - } + outFd, isTerminalOut = term.GetHandleInfo(out) } if err == nil { diff --git a/docker/docker.go b/docker/docker.go index 0641830098..d55e84b8ec 100644 --- a/docker/docker.go +++ b/docker/docker.go @@ -14,6 +14,7 @@ import ( "github.com/docker/docker/autogen/dockerversion" flag "github.com/docker/docker/pkg/mflag" "github.com/docker/docker/pkg/reexec" + "github.com/docker/docker/pkg/term" "github.com/docker/docker/utils" ) @@ -47,6 +48,10 @@ func main() { initLogging(log.InfoLevel) } + // Set terminal emulation based on platform as required. + stdout, stderr, stdin := term.StdStreams() + log.SetOutput(stderr) + // -D, --debug, -l/--log-level=debug processing // When/if -D is removed this block can be deleted if *flDebug { @@ -124,9 +129,9 @@ func main() { } if *flTls || *flTlsVerify { - cli = client.NewDockerCli(os.Stdin, os.Stdout, os.Stderr, *flTrustKey, protoAddrParts[0], protoAddrParts[1], &tlsConfig) + cli = client.NewDockerCli(stdin, stdout, stderr, *flTrustKey, protoAddrParts[0], protoAddrParts[1], &tlsConfig) } else { - cli = client.NewDockerCli(os.Stdin, os.Stdout, os.Stderr, *flTrustKey, protoAddrParts[0], protoAddrParts[1], nil) + cli = client.NewDockerCli(stdin, stdout, stderr, *flTrustKey, protoAddrParts[0], protoAddrParts[1], nil) } if err := cli.Cmd(flag.Args()...); err != nil { diff --git a/pkg/term/console_windows.go b/pkg/term/console_windows.go index 6335b2b837..53069201c7 100644 --- a/pkg/term/console_windows.go +++ b/pkg/term/console_windows.go @@ -3,6 +3,13 @@ package term import ( + "bytes" + "fmt" + "io" + "os" + "strconv" + "strings" + "sync" "syscall" "unsafe" ) @@ -20,37 +27,124 @@ const ( // If parameter is a screen buffer handle, additional values ENABLE_PROCESSED_OUTPUT = 0x0001 ENABLE_WRAP_AT_EOL_OUTPUT = 0x0002 + + //http://msdn.microsoft.com/en-us/library/windows/desktop/ms682088(v=vs.85).aspx#_win32_character_attributes + FOREGROUND_BLUE = 1 + FOREGROUND_GREEN = 2 + FOREGROUND_RED = 4 + FOREGROUND_INTENSITY = 8 + FOREGROUND_MASK_SET = 0x000F + FOREGROUND_MASK_UNSET = 0xFFF0 + + BACKGROUND_BLUE = 16 + BACKGROUND_GREEN = 32 + BACKGROUND_RED = 64 + BACKGROUND_INTENSITY = 128 + BACKGROUND_MASK_SET = 0x00F0 + BACKGROUND_MASK_UNSET = 0xFF0F + + COMMON_LVB_REVERSE_VIDEO = 0x4000 + COMMON_LVB_UNDERSCORE = 0x8000 + + // http://man7.org/linux/man-pages/man4/console_codes.4.html + // ECMA-48 Set Graphics Rendition + ANSI_ATTR_RESET = 0 + ANSI_ATTR_BOLD = 1 + ANSI_ATTR_DIM = 2 + ANSI_ATTR_UNDERLINE = 4 + ANSI_ATTR_BLINK = 5 + ANSI_ATTR_REVERSE = 7 + ANSI_ATTR_INVISIBLE = 8 + + ANSI_ATTR_UNDERLINE_OFF = 24 + ANSI_ATTR_BLINK_OFF = 25 + ANSI_ATTR_REVERSE_OFF = 27 + ANSI_ATTR_INVISIBLE_OFF = 8 + + ANSI_FOREGROUND_BLACK = 30 + ANSI_FOREGROUND_RED = 31 + ANSI_FOREGROUND_GREEN = 32 + ANSI_FOREGROUND_YELLOW = 33 + ANSI_FOREGROUND_BLUE = 34 + ANSI_FOREGROUND_MAGENTA = 35 + ANSI_FOREGROUND_CYAN = 36 + ANSI_FOREGROUND_WHITE = 37 + ANSI_FOREGROUND_DEFAULT = 39 + + ANSI_BACKGROUND_BLACK = 40 + ANSI_BACKGROUND_RED = 41 + ANSI_BACKGROUND_GREEN = 42 + ANSI_BACKGROUND_YELLOW = 43 + ANSI_BACKGROUND_BLUE = 44 + ANSI_BACKGROUND_MAGENTA = 45 + ANSI_BACKGROUND_CYAN = 46 + ANSI_BACKGROUND_WHITE = 47 + ANSI_BACKGROUND_DEFAULT = 49 + + ANSI_MAX_CMD_LENGTH = 256 + + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms683231(v=vs.85).aspx + STD_INPUT_HANDLE = -10 + STD_OUTPUT_HANDLE = -11 + STD_ERROR_HANDLE = -12 + + MAX_INPUT_BUFFER = 1024 + DEFAULT_WIDTH = 80 + DEFAULT_HEIGHT = 24 +) + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx +const ( + VK_PRIOR = 0x21 // PAGE UP key + VK_NEXT = 0x22 // PAGE DOWN key + VK_END = 0x23 // END key + VK_HOME = 0x24 // HOME key + VK_LEFT = 0x25 // LEFT ARROW key + VK_UP = 0x26 // UP ARROW key + VK_RIGHT = 0x27 //RIGHT ARROW key + VK_DOWN = 0x28 //DOWN ARROW key + VK_SELECT = 0x29 //SELECT key + VK_PRINT = 0x2A //PRINT key + VK_EXECUTE = 0x2B //EXECUTE key + VK_SNAPSHOT = 0x2C //PRINT SCREEN key + VK_INSERT = 0x2D //INS key + VK_DELETE = 0x2E //DEL key + VK_HELP = 0x2F //HELP key + VK_F1 = 0x70 //F1 key + VK_F2 = 0x71 //F2 key + VK_F3 = 0x72 //F3 key + VK_F4 = 0x73 //F4 key + VK_F5 = 0x74 //F5 key + VK_F6 = 0x75 //F6 key + VK_F7 = 0x76 //F7 key + VK_F8 = 0x77 //F8 key + VK_F9 = 0x78 //F9 key + VK_F10 = 0x79 //F10 key + VK_F11 = 0x7A //F11 key + VK_F12 = 0x7B //F12 key ) var kernel32DLL = syscall.NewLazyDLL("kernel32.dll") var ( - setConsoleModeProc = kernel32DLL.NewProc("SetConsoleMode") - getConsoleScreenBufferInfoProc = kernel32DLL.NewProc("GetConsoleScreenBufferInfo") + setConsoleModeProc = kernel32DLL.NewProc("SetConsoleMode") + getConsoleScreenBufferInfoProc = kernel32DLL.NewProc("GetConsoleScreenBufferInfo") + setConsoleCursorPositionProc = kernel32DLL.NewProc("SetConsoleCursorPosition") + setConsoleTextAttributeProc = kernel32DLL.NewProc("SetConsoleTextAttribute") + fillConsoleOutputCharacterProc = kernel32DLL.NewProc("FillConsoleOutputCharacterW") + writeConsoleOutputProc = kernel32DLL.NewProc("WriteConsoleOutputW") + readConsoleInputProc = kernel32DLL.NewProc("ReadConsoleInputW") + getNumberOfConsoleInputEventsProc = kernel32DLL.NewProc("GetNumberOfConsoleInputEvents") + getConsoleCursorInfoProc = kernel32DLL.NewProc("GetConsoleCursorInfo") + setConsoleCursorInfoProc = kernel32DLL.NewProc("SetConsoleCursorInfo") + setConsoleWindowInfoProc = kernel32DLL.NewProc("SetConsoleWindowInfo") + setConsoleScreenBufferSizeProc = kernel32DLL.NewProc("SetConsoleScreenBufferSize") ) -func GetConsoleMode(fileDesc uintptr) (uint32, error) { - var mode uint32 - err := syscall.GetConsoleMode(syscall.Handle(fileDesc), &mode) - return mode, err -} - -func SetConsoleMode(fileDesc uintptr, mode uint32) error { - r, _, err := setConsoleModeProc.Call(fileDesc, uintptr(mode), 0) - if r == 0 { - if err != nil { - return err - } - return syscall.EINVAL - } - return nil -} - -// types for calling GetConsoleScreenBufferInfo +// types for calling various windows API // see http://msdn.microsoft.com/en-us/library/windows/desktop/ms682093(v=vs.85).aspx type ( - SHORT int16 - + SHORT int16 SMALL_RECT struct { Left SHORT Top SHORT @@ -63,17 +157,182 @@ type ( Y SHORT } - WORD uint16 + BOOL int32 + WORD uint16 + WCHAR uint16 + DWORD uint32 CONSOLE_SCREEN_BUFFER_INFO struct { - dwSize COORD - dwCursorPosition COORD - wAttributes WORD - srWindow SMALL_RECT - dwMaximumWindowSize COORD + Size COORD + CursorPosition COORD + Attributes WORD + Window SMALL_RECT + MaximumWindowSize COORD + } + + CONSOLE_CURSOR_INFO struct { + Size DWORD + Visible BOOL + } + + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms684166(v=vs.85).aspx + KEY_EVENT_RECORD struct { + KeyDown BOOL + RepeatCount WORD + VirtualKeyCode WORD + VirtualScanCode WORD + UnicodeChar WCHAR + ControlKeyState DWORD + } + + INPUT_RECORD struct { + EventType WORD + KeyEvent KEY_EVENT_RECORD + } + + CHAR_INFO struct { + UnicodeChar WCHAR + Attributes WORD } ) +// Implements the TerminalEmulator interface +type WindowsTerminal struct { + outMutex sync.Mutex + inMutex sync.Mutex + inputBuffer chan byte + screenBufferInfo *CONSOLE_SCREEN_BUFFER_INFO + inputEscapeSequence []byte +} + +func StdStreams() (stdOut io.Writer, stdErr io.Writer, stdIn io.ReadCloser) { + handler := &WindowsTerminal{ + inputBuffer: make(chan byte, MAX_INPUT_BUFFER), + inputEscapeSequence: []byte(KEY_ESC_CSI), + } + + // Save current screen buffer info + handle, _ := syscall.GetStdHandle(STD_OUTPUT_HANDLE) + screenBufferInfo, err := GetConsoleScreenBufferInfo(uintptr(handle)) + if err == nil { + handler.screenBufferInfo = screenBufferInfo + } + + // Set the window size + SetWindowSize(uintptr(handle), DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_HEIGHT) + if IsTerminal(os.Stdout.Fd()) { + stdOut = &terminalWriter{ + wrappedWriter: os.Stdout, + emulator: handler, + command: make([]byte, 0, ANSI_MAX_CMD_LENGTH), + } + } else { + stdOut = os.Stdout + + } + if IsTerminal(os.Stderr.Fd()) { + stdErr = &terminalWriter{ + wrappedWriter: os.Stderr, + emulator: handler, + command: make([]byte, 0, ANSI_MAX_CMD_LENGTH), + } + } else { + stdErr = os.Stderr + + } + if IsTerminal(os.Stdin.Fd()) { + stdIn = &terminalReader{ + wrappedReader: os.Stdin, + emulator: handler, + command: make([]byte, 0, ANSI_MAX_CMD_LENGTH), + } + } else { + stdIn = os.Stdin + } + + return +} + +// GetHandleInfo returns file descriptor and bool indicating whether the file is a terminal +func GetHandleInfo(in interface{}) (uintptr, bool) { + var inFd uintptr + var isTerminalIn bool + if tr, ok := in.(*terminalReader); ok { + if file, ok := tr.wrappedReader.(*os.File); ok { + inFd = file.Fd() + isTerminalIn = IsTerminal(inFd) + } + } + return inFd, isTerminalIn +} + +// GetConsoleMode gets the console mode for given file descriptor +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms683167(v=vs.85).aspx +func GetConsoleMode(fileDesc uintptr) (uint32, error) { + var mode uint32 + err := syscall.GetConsoleMode(syscall.Handle(fileDesc), &mode) + return mode, err +} + +// SetConsoleMode sets the console mode for given file descriptor +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx +func SetConsoleMode(fileDesc uintptr, mode uint32) error { + r, _, err := setConsoleModeProc.Call(fileDesc, uintptr(mode), 0) + if r == 0 { + if err != nil { + return err + } + return syscall.EINVAL + } + return nil +} + +// SetCursorVisible sets the cursor visbility +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms686019(v=vs.85).aspx +func SetCursorVisible(fileDesc uintptr, isVisible BOOL) (bool, error) { + var cursorInfo CONSOLE_CURSOR_INFO + r, _, err := getConsoleCursorInfoProc.Call(uintptr(fileDesc), uintptr(unsafe.Pointer(&cursorInfo)), 0) + if r == 0 { + if err != nil { + return false, err + } + return false, syscall.EINVAL + } + cursorInfo.Visible = isVisible + r, _, err = setConsoleCursorInfoProc.Call(uintptr(fileDesc), uintptr(unsafe.Pointer(&cursorInfo)), 0) + if r == 0 { + if err != nil { + return false, err + } + return false, syscall.EINVAL + } + return true, nil +} + +// SetWindowSize sets the size of the console window. +func SetWindowSize(fileDesc uintptr, width, height, max SHORT) (bool, error) { + window := SMALL_RECT{Left: 0, Top: 0, Right: width - 1, Bottom: height - 1} + coord := COORD{X: width - 1, Y: max} + r, _, err := setConsoleWindowInfoProc.Call(uintptr(fileDesc), uintptr(BOOL(1)), uintptr(unsafe.Pointer(&window))) + if r == 0 { + if err != nil { + return false, err + } + return false, syscall.EINVAL + } + r, _, err = setConsoleScreenBufferSizeProc.Call(uintptr(fileDesc), uintptr(marshal(coord))) + if r == 0 { + if err != nil { + return false, err + } + return false, syscall.EINVAL + } + + return true, nil +} + +// GetConsoleScreenBufferInfo retrieves information about the specified console screen buffer. +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms683171(v=vs.85).aspx func GetConsoleScreenBufferInfo(fileDesc uintptr) (*CONSOLE_SCREEN_BUFFER_INFO, error) { var info CONSOLE_SCREEN_BUFFER_INFO r, _, err := getConsoleScreenBufferInfoProc.Call(uintptr(fileDesc), uintptr(unsafe.Pointer(&info)), 0) @@ -85,3 +344,762 @@ func GetConsoleScreenBufferInfo(fileDesc uintptr) (*CONSOLE_SCREEN_BUFFER_INFO, } return &info, nil } + +// setConsoleTextAttribute sets the attributes of characters written to the +// console screen buffer by the WriteFile or WriteConsole function, +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047(v=vs.85).aspx +func setConsoleTextAttribute(fileDesc uintptr, attribute WORD) (bool, error) { + r, _, err := setConsoleTextAttributeProc.Call(uintptr(fileDesc), uintptr(attribute), 0) + if r == 0 { + if err != nil { + return false, err + } + return false, syscall.EINVAL + } + return true, nil +} + +func writeConsoleOutput(fileDesc uintptr, buffer []CHAR_INFO, bufferSize COORD, bufferCoord COORD, writeRegion *SMALL_RECT) (bool, error) { + r, _, err := writeConsoleOutputProc.Call(uintptr(fileDesc), uintptr(unsafe.Pointer(&buffer[0])), uintptr(marshal(bufferSize)), uintptr(marshal(bufferCoord)), uintptr(unsafe.Pointer(writeRegion))) + if r == 0 { + if err != nil { + return false, err + } + return false, syscall.EINVAL + } + return true, nil +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms682663(v=vs.85).aspx +func fillConsoleOutputCharacter(fileDesc uintptr, fillChar byte, length uint32, writeCord COORD) (bool, error) { + out := int64(0) + r, _, err := fillConsoleOutputCharacterProc.Call(uintptr(fileDesc), uintptr(fillChar), uintptr(length), uintptr(marshal(writeCord)), uintptr(unsafe.Pointer(&out))) + // If the function succeeds, the return value is nonzero. + if r == 0 { + if err != nil { + return false, err + } + return false, syscall.EINVAL + } + return true, nil +} + +// Gets the number of space characters to write for "clearing" the section of terminal +func getNumberOfChars(fromCoord COORD, toCoord COORD, screenSize COORD) uint32 { + // must be valid cursor position + if fromCoord.X < 0 || fromCoord.Y < 0 || toCoord.X < 0 || toCoord.Y < 0 { + return 0 + } + if fromCoord.X >= screenSize.X || fromCoord.Y >= screenSize.Y || toCoord.X >= screenSize.X || toCoord.Y >= screenSize.Y { + return 0 + } + // can't be backwards + if fromCoord.Y > toCoord.Y { + return 0 + } + // same line + if fromCoord.Y == toCoord.Y { + return uint32(toCoord.X-fromCoord.X) + 1 + } + // spans more than one line + if fromCoord.Y < toCoord.Y { + // from start till end of line for first line + from start of line till end + retValue := uint32(screenSize.X-fromCoord.X) + uint32(toCoord.X) + 1 + // don't count first and last line + linesBetween := toCoord.Y - fromCoord.Y - 1 + if linesBetween > 0 { + retValue = retValue + uint32(linesBetween*screenSize.X) + } + return retValue + } + return 0 +} + +func clearDisplayRect(fileDesc uintptr, fillChar byte, attributes WORD, fromCoord COORD, toCoord COORD, windowSize COORD) (bool, uint32, error) { + var writeRegion SMALL_RECT + writeRegion.Top = fromCoord.Y + writeRegion.Left = fromCoord.X + writeRegion.Right = toCoord.X + writeRegion.Bottom = toCoord.Y + + // allocate and initialize buffer + width := toCoord.X - fromCoord.X + 1 + height := toCoord.Y - fromCoord.Y + 1 + size := width * height + if size > 0 { + buffer := make([]CHAR_INFO, size) + for i := 0; i < len(buffer); i++ { + buffer[i].UnicodeChar = WCHAR(string(fillChar)[0]) + buffer[i].Attributes = attributes + } + + // Write to buffer + r, err := writeConsoleOutput(fileDesc, buffer, windowSize, COORD{X: 0, Y: 0}, &writeRegion) + if !r { + if err != nil { + return false, 0, err + } + return false, 0, syscall.EINVAL + } + } + return true, uint32(size), nil +} + +func clearDisplayRange(fileDesc uintptr, fillChar byte, attributes WORD, fromCoord COORD, toCoord COORD, windowSize COORD) (bool, uint32, error) { + nw := uint32(0) + // start and end on same line + if fromCoord.Y == toCoord.Y { + r, charWritten, err := clearDisplayRect(fileDesc, fillChar, attributes, fromCoord, toCoord, windowSize) + if !r { + if err != nil { + return false, charWritten, err + } + return false, charWritten, syscall.EINVAL + } + return true, charWritten, nil + } + // TODO(azlinux): if full screen, optimize + + // spans more than one line + if fromCoord.Y < toCoord.Y { + // from start position till end of line for first line + r, n, err := clearDisplayRect(fileDesc, fillChar, attributes, fromCoord, COORD{X: windowSize.X - 1, Y: fromCoord.Y}, windowSize) + if !r { + if err != nil { + return false, nw, err + } + return false, nw, syscall.EINVAL + } + nw += n + // lines between + linesBetween := toCoord.Y - fromCoord.Y - 1 + if linesBetween > 0 { + r, n, err = clearDisplayRect(fileDesc, fillChar, attributes, COORD{X: 0, Y: fromCoord.Y + 1}, COORD{X: windowSize.X - 1, Y: toCoord.Y - 1}, windowSize) + if !r { + if err != nil { + return false, nw, err + } + return false, nw, syscall.EINVAL + } + nw += n + } + // lines at end + r, n, err = clearDisplayRect(fileDesc, fillChar, attributes, COORD{X: 0, Y: toCoord.Y}, toCoord, windowSize) + if !r { + if err != nil { + return false, nw, err + } + return false, nw, syscall.EINVAL + } + nw += n + } + return true, nw, nil +} + +// setConsoleCursorPosition sets the console cursor position +// Note The X and Y are zero based +// If relative is true then the new position is relative to current one +func setConsoleCursorPosition(fileDesc uintptr, isRelative bool, column int16, line int16) (bool, error) { + screenBufferInfo, err := GetConsoleScreenBufferInfo(fileDesc) + if err == nil { + var position COORD + if isRelative { + position.X = screenBufferInfo.CursorPosition.X + SHORT(column) + position.Y = screenBufferInfo.CursorPosition.Y + SHORT(line) + } else { + position.X = SHORT(column) + position.Y = SHORT(line) + } + + //convert + bits := marshal(position) + r, _, err := setConsoleCursorPositionProc.Call(uintptr(fileDesc), uintptr(bits), 0) + if r == 0 { + if err != nil { + return false, err + } + return false, syscall.EINVAL + } + return true, nil + } + return false, err +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms683207(v=vs.85).aspx +func getNumberOfConsoleInputEvents(fileDesc uintptr) (uint16, error) { + var n WORD + r, _, err := getNumberOfConsoleInputEventsProc.Call(uintptr(fileDesc), uintptr(unsafe.Pointer(&n))) + //If the function succeeds, the return value is nonzero + if r != 0 { + //fmt.Printf("################%d #################\n", n) + return uint16(n), nil + } + return 0, err +} + +//http://msdn.microsoft.com/en-us/library/windows/desktop/ms684961(v=vs.85).aspx +func readConsoleInputKey(fileDesc uintptr, inputBuffer []INPUT_RECORD) (int, error) { + var nr WORD + r, _, err := readConsoleInputProc.Call(uintptr(fileDesc), uintptr(unsafe.Pointer(&inputBuffer[0])), uintptr(WORD(len(inputBuffer))), uintptr(unsafe.Pointer(&nr))) + //If the function succeeds, the return value is nonzero. + if r != 0 { + return int(nr), nil + } + return int(0), err +} + +func getWindowsTextAttributeForAnsiValue(originalFlag WORD, defaultValue WORD, ansiValue int16) (WORD, error) { + flag := WORD(originalFlag) + if flag == 0 { + flag = defaultValue + } + switch ansiValue { + case ANSI_ATTR_RESET: + flag &^= COMMON_LVB_UNDERSCORE + flag &^= BACKGROUND_INTENSITY + flag = flag | FOREGROUND_INTENSITY + case ANSI_ATTR_INVISIBLE: + // TODO: how do you reset reverse? + case ANSI_ATTR_UNDERLINE: + flag = flag | COMMON_LVB_UNDERSCORE + case ANSI_ATTR_BLINK: + // seems like background intenisty is blink + flag = flag | BACKGROUND_INTENSITY + case ANSI_ATTR_UNDERLINE_OFF: + flag &^= COMMON_LVB_UNDERSCORE + case ANSI_ATTR_BLINK_OFF: + // seems like background intenisty is blink + flag &^= BACKGROUND_INTENSITY + case ANSI_ATTR_BOLD: + flag = flag | FOREGROUND_INTENSITY + case ANSI_ATTR_DIM: + flag &^= FOREGROUND_INTENSITY + case ANSI_ATTR_REVERSE, ANSI_ATTR_REVERSE_OFF: + // swap forground and background bits + foreground := flag & FOREGROUND_MASK_SET + background := flag & BACKGROUND_MASK_SET + flag = (flag & BACKGROUND_MASK_UNSET & FOREGROUND_MASK_UNSET) | (foreground << 4) | (background >> 4) + + // FOREGROUND + case ANSI_FOREGROUND_DEFAULT: + flag = (flag & FOREGROUND_MASK_UNSET) | (defaultValue & FOREGROUND_MASK_SET) + case ANSI_FOREGROUND_BLACK: + flag = flag ^ (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE) + case ANSI_FOREGROUND_RED: + flag = (flag & FOREGROUND_MASK_UNSET) | FOREGROUND_RED + case ANSI_FOREGROUND_GREEN: + flag = (flag & FOREGROUND_MASK_UNSET) | FOREGROUND_GREEN + case ANSI_FOREGROUND_YELLOW: + flag = (flag & FOREGROUND_MASK_UNSET) | FOREGROUND_RED | FOREGROUND_GREEN + case ANSI_FOREGROUND_BLUE: + flag = (flag & FOREGROUND_MASK_UNSET) | FOREGROUND_BLUE + case ANSI_FOREGROUND_MAGENTA: + flag = (flag & FOREGROUND_MASK_UNSET) | FOREGROUND_RED | FOREGROUND_BLUE + case ANSI_FOREGROUND_CYAN: + flag = (flag & FOREGROUND_MASK_UNSET) | FOREGROUND_GREEN | FOREGROUND_BLUE + case ANSI_FOREGROUND_WHITE: + flag = (flag & FOREGROUND_MASK_UNSET) | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE + + // Background + case ANSI_BACKGROUND_DEFAULT: + // Black with no intensity + flag = (flag & BACKGROUND_MASK_UNSET) | (defaultValue & BACKGROUND_MASK_SET) + case ANSI_BACKGROUND_BLACK: + flag = (flag & BACKGROUND_MASK_UNSET) + case ANSI_BACKGROUND_RED: + flag = (flag & BACKGROUND_MASK_UNSET) | BACKGROUND_RED + case ANSI_BACKGROUND_GREEN: + flag = (flag & BACKGROUND_MASK_UNSET) | BACKGROUND_GREEN + case ANSI_BACKGROUND_YELLOW: + flag = (flag & BACKGROUND_MASK_UNSET) | BACKGROUND_RED | BACKGROUND_GREEN + case ANSI_BACKGROUND_BLUE: + flag = (flag & BACKGROUND_MASK_UNSET) | BACKGROUND_BLUE + case ANSI_BACKGROUND_MAGENTA: + flag = (flag & BACKGROUND_MASK_UNSET) | BACKGROUND_RED | BACKGROUND_BLUE + case ANSI_BACKGROUND_CYAN: + flag = (flag & BACKGROUND_MASK_UNSET) | BACKGROUND_GREEN | BACKGROUND_BLUE + case ANSI_BACKGROUND_WHITE: + flag = (flag & BACKGROUND_MASK_UNSET) | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE + default: + + } + return flag, nil +} + +// HandleOutputCommand interpretes the Ansi commands and then makes appropriate Win32 calls +func (term *WindowsTerminal) HandleOutputCommand(command []byte) (n int, err error) { + // console settings changes need to happen in atomic way + term.outMutex.Lock() + defer term.outMutex.Unlock() + + r := false + // Parse the command + parsedCommand := parseAnsiCommand(command) + + // use appropriate handle + handle, _ := syscall.GetStdHandle(STD_OUTPUT_HANDLE) + + switch parsedCommand.Command { + case "m": + // [Value;...;Valuem + // Set Graphics Mode: + // Calls the graphics functions specified by the following values. + // These specified functions remain active until the next occurrence of this escape sequence. + // Graphics mode changes the colors and attributes of text (such as bold and underline) displayed on the screen. + screenBufferInfo, err := GetConsoleScreenBufferInfo(uintptr(handle)) + if err != nil { + return len(command), err + } + flag := screenBufferInfo.Attributes + for _, e := range parsedCommand.Parameters { + value, _ := strconv.ParseInt(e, 10, 16) // base 10, 16 bit + if value == ANSI_ATTR_RESET { + flag = term.screenBufferInfo.Attributes // reset + } else { + flag, err = getWindowsTextAttributeForAnsiValue(flag, term.screenBufferInfo.Attributes, int16(value)) + if nil != err { + return len(command), err + } + } + } + r, err = setConsoleTextAttribute(uintptr(handle), flag) + if !r { + return len(command), err + } + case "H", "f": + // [line;columnH + // [line;columnf + // Moves the cursor to the specified position (coordinates). + // If you do not specify a position, the cursor moves to the home position at the upper-left corner of the screen (line 0, column 0). + line, err := parseInt16OrDefault(parsedCommand.getParam(0), 1) + if err != nil { + return len(command), err + } + column, err := parseInt16OrDefault(parsedCommand.getParam(1), 1) + if err != nil { + return len(command), err + } + // The numbers are not 0 based, but 1 based + r, err = setConsoleCursorPosition(uintptr(handle), false, int16(column-1), int16(line-1)) + if !r { + return len(command), err + } + + case "A": + // [valueA + // Moves the cursor up by the specified number of lines without changing columns. + // If the cursor is already on the top line, ignores this sequence. + value, err := parseInt16OrDefault(parsedCommand.getParam(0), 1) + if err != nil { + return len(command), err + } + r, err = setConsoleCursorPosition(uintptr(handle), true, 0, -1*value) + if !r { + return len(command), err + } + case "B": + // [valueB + // Moves the cursor down by the specified number of lines without changing columns. + // If the cursor is already on the bottom line, ignores this sequence. + value, err := parseInt16OrDefault(parsedCommand.getParam(0), 1) + if err != nil { + return len(command), err + } + r, err = setConsoleCursorPosition(uintptr(handle), true, 0, value) + if !r { + return len(command), err + } + case "C": + // [valueC + // Moves the cursor forward by the specified number of columns without changing lines. + // If the cursor is already in the rightmost column, ignores this sequence. + value, err := parseInt16OrDefault(parsedCommand.getParam(0), 1) + if err != nil { + return len(command), err + } + r, err = setConsoleCursorPosition(uintptr(handle), true, int16(value), 0) + if !r { + return len(command), err + } + case "D": + // [valueD + // Moves the cursor back by the specified number of columns without changing lines. + // If the cursor is already in the leftmost column, ignores this sequence. + value, err := parseInt16OrDefault(parsedCommand.getParam(0), 1) + if err != nil { + return len(command), err + } + r, err = setConsoleCursorPosition(uintptr(handle), true, int16(-1*value), 0) + if !r { + return len(command), err + } + case "J": + // [J Erases from the cursor to the end of the screen, including the cursor position. + // [1J Erases from the beginning of the screen to the cursor, including the cursor position. + // [2J Erases the complete display. The cursor does not move. + // Clears the screen and moves the cursor to the home position (line 0, column 0). + value, err := parseInt16OrDefault(parsedCommand.getParam(0), 0) + if err != nil { + return len(command), err + } + var start COORD + var cursor COORD + var end COORD + screenBufferInfo, err := GetConsoleScreenBufferInfo(uintptr(handle)) + if err == nil { + switch value { + case 0: + start = screenBufferInfo.CursorPosition + // end of the screen + end.X = screenBufferInfo.MaximumWindowSize.X - 1 + end.Y = screenBufferInfo.MaximumWindowSize.Y - 1 + // cursor + cursor = screenBufferInfo.CursorPosition + case 1: + + // start of the screen + start.X = 0 + start.Y = 0 + // end of the screen + end = screenBufferInfo.CursorPosition + // cursor + cursor = screenBufferInfo.CursorPosition + case 2: + // start of the screen + start.X = 0 + start.Y = 0 + // end of the screen + end.X = screenBufferInfo.MaximumWindowSize.X - 1 + end.Y = screenBufferInfo.MaximumWindowSize.Y - 1 + // cursor + cursor.X = 0 + cursor.Y = 0 + } + r, _, err = clearDisplayRange(uintptr(handle), ' ', term.screenBufferInfo.Attributes, start, end, screenBufferInfo.MaximumWindowSize) + if !r { + return len(command), err + } + // remember the the cursor position is 1 based + r, err = setConsoleCursorPosition(uintptr(handle), false, int16(cursor.X), int16(cursor.Y)) + if !r { + return len(command), err + } + } + case "K": + // [K + // Clears all characters from the cursor position to the end of the line (including the character at the cursor position). + // [K Erases from the cursor to the end of the line, including the cursor position. + // [1K Erases from the beginning of the line to the cursor, including the cursor position. + // [2K Erases the complete line. + value, err := parseInt16OrDefault(parsedCommand.getParam(0), 0) + var start COORD + var cursor COORD + var end COORD + screenBufferInfo, err := GetConsoleScreenBufferInfo(uintptr(handle)) + if err == nil { + switch value { + case 0: + // start is where cursor is + start = screenBufferInfo.CursorPosition + // end of line + end.X = screenBufferInfo.MaximumWindowSize.X - 1 + end.Y = screenBufferInfo.CursorPosition.Y + // cursor remains the same + cursor = screenBufferInfo.CursorPosition + + case 1: + // beginning of line + start.X = 0 + start.Y = screenBufferInfo.CursorPosition.Y + // until cursor + end = screenBufferInfo.CursorPosition + // cursor remains the same + cursor = screenBufferInfo.CursorPosition + case 2: + // start of the line + start.X = 0 + start.Y = screenBufferInfo.MaximumWindowSize.Y - 1 + // end of the line + end.X = screenBufferInfo.MaximumWindowSize.X - 1 + end.Y = screenBufferInfo.MaximumWindowSize.Y - 1 + // cursor + cursor.X = 0 + cursor.Y = screenBufferInfo.MaximumWindowSize.Y - 1 + } + r, _, err = clearDisplayRange(uintptr(handle), ' ', term.screenBufferInfo.Attributes, start, end, screenBufferInfo.MaximumWindowSize) + if !r { + return len(command), err + } + // remember the the cursor position is 1 based + r, err = setConsoleCursorPosition(uintptr(handle), false, int16(cursor.X), int16(cursor.Y)) + if !r { + return len(command), err + } + } + + case "l": + for _, value := range parsedCommand.Parameters { + switch value { + case "?25", "25": + SetCursorVisible(uintptr(handle), BOOL(0)) + case "?1049", "1049": + // TODO (azlinux): Restore terminal + case "?1", "1": + // If the DECCKM function is reset, then the arrow keys send ANSI cursor sequences to the host. + term.inputEscapeSequence = []byte(KEY_ESC_CSI) + default: + } + } + case "h": + for _, value := range parsedCommand.Parameters { + switch value { + case "?25", "25": + SetCursorVisible(uintptr(handle), BOOL(1)) + case "?1049", "1049": + // TODO (azlinux): Save terminal + case "?1", "1": + // If the DECCKM function is set, then the arrow keys send application sequences to the host. + // DECCKM (default off): When set, the cursor keys send an ESC O prefix, rather than ESC [. + term.inputEscapeSequence = []byte(KEY_ESC_O) + default: + } + } + + case "]": + /* + TODO (azlinux): + Linux Console Private CSI Sequences + + The following sequences are neither ECMA-48 nor native VT102. They are + native to the Linux console driver. Colors are in SGR parameters: 0 = + black, 1 = red, 2 = green, 3 = brown, 4 = blue, 5 = magenta, 6 = cyan, + 7 = white. + + ESC [ 1 ; n ] Set color n as the underline color + ESC [ 2 ; n ] Set color n as the dim color + ESC [ 8 ] Make the current color pair the default attributes. + ESC [ 9 ; n ] Set screen blank timeout to n minutes. + ESC [ 10 ; n ] Set bell frequency in Hz. + ESC [ 11 ; n ] Set bell duration in msec. + ESC [ 12 ; n ] Bring specified console to the front. + ESC [ 13 ] Unblank the screen. + ESC [ 14 ; n ] Set the VESA powerdown interval in minutes. + + */ + default: + } + return len(command), nil +} + +// WriteChars writes the bytes to given writer. +func (term *WindowsTerminal) WriteChars(w io.Writer, p []byte) (n int, err error) { + return w.Write(p) +} + +const ( + CAPSLOCK_ON = 0x0080 //The CAPS LOCK light is on. + ENHANCED_KEY = 0x0100 //The key is enhanced. + LEFT_ALT_PRESSED = 0x0002 //The left ALT key is pressed. + LEFT_CTRL_PRESSED = 0x0008 //The left CTRL key is pressed. + NUMLOCK_ON = 0x0020 //The NUM LOCK light is on. + RIGHT_ALT_PRESSED = 0x0001 //The right ALT key is pressed. + RIGHT_CTRL_PRESSED = 0x0004 //The right CTRL key is pressed. + SCROLLLOCK_ON = 0x0040 //The SCROLL LOCK light is on. + SHIFT_PRESSED = 0x0010 // The SHIFT key is pressed. +) + +const ( + KEY_CONTROL_PARAM_2 = ";2" + KEY_CONTROL_PARAM_3 = ";3" + KEY_CONTROL_PARAM_4 = ";4" + KEY_CONTROL_PARAM_5 = ";5" + KEY_CONTROL_PARAM_6 = ";6" + KEY_CONTROL_PARAM_7 = ";7" + KEY_CONTROL_PARAM_8 = ";8" + KEY_ESC_CSI = "\x1B[" + KEY_ESC_N = "\x1BN" + KEY_ESC_O = "\x1BO" +) + +var keyMapPrefix = map[WORD]string{ + VK_UP: "\x1B[%sA", + VK_DOWN: "\x1B[%sB", + VK_RIGHT: "\x1B[%sC", + VK_LEFT: "\x1B[%sD", + VK_HOME: "\x1B[1%s~", // showkey shows ^[[1 + VK_END: "\x1B[4%s~", // showkey shows ^[[4 + VK_INSERT: "\x1B[2%s~", + VK_DELETE: "\x1B[3%s~", + VK_PRIOR: "\x1B[5%s~", + VK_NEXT: "\x1B[6%s~", + VK_F1: "", + VK_F2: "", + VK_F3: "\x1B[13%s~", + VK_F4: "\x1B[14%s~", + VK_F5: "\x1B[15%s~", + VK_F6: "\x1B[17%s~", + VK_F7: "\x1B[18%s~", + VK_F8: "\x1B[19%s~", + VK_F9: "\x1B[20%s~", + VK_F10: "\x1B[21%s~", + VK_F11: "\x1B[23%s~", + VK_F12: "\x1B[24%s~", +} + +var arrowKeyMapPrefix = map[WORD]string{ + VK_UP: "%s%sA", + VK_DOWN: "%s%sB", + VK_RIGHT: "%s%sC", + VK_LEFT: "%s%sD", +} + +func getControlStateParameter(shift, alt, control, meta bool) string { + if shift && alt && control { + return KEY_CONTROL_PARAM_8 + } + if alt && control { + return KEY_CONTROL_PARAM_7 + } + if shift && control { + return KEY_CONTROL_PARAM_6 + } + if control { + return KEY_CONTROL_PARAM_5 + } + if shift && alt { + return KEY_CONTROL_PARAM_4 + } + if alt { + return KEY_CONTROL_PARAM_3 + } + if shift { + return KEY_CONTROL_PARAM_2 + } + return "" +} + +func getControlKeys(controlState DWORD) (shift, alt, control bool) { + shift = 0 != (controlState & SHIFT_PRESSED) + alt = 0 != (controlState & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) + control = 0 != (controlState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) + return shift, alt, control +} + +func charSequenceForKeys(key WORD, controlState DWORD, escapeSequence []byte) string { + i, ok := arrowKeyMapPrefix[key] + if ok { + shift, alt, control := getControlKeys(controlState) + modifier := getControlStateParameter(shift, alt, control, false) + return fmt.Sprintf(i, escapeSequence, modifier) + } + + i, ok = keyMapPrefix[key] + if ok { + shift, alt, control := getControlKeys(controlState) + modifier := getControlStateParameter(shift, alt, control, false) + return fmt.Sprintf(i, modifier) + } + + return "" +} + +// mapKeystokeToTerminalString maps the given input event record to string +func mapKeystokeToTerminalString(keyEvent *KEY_EVENT_RECORD, escapeSequence []byte) string { + _, alt, control := getControlKeys(keyEvent.ControlKeyState) + if keyEvent.UnicodeChar == 0 { + return charSequenceForKeys(keyEvent.VirtualKeyCode, keyEvent.ControlKeyState, escapeSequence) + } + if control { + // TODO(azlinux): Implement following control sequences + // -D Signals the end of input from the keyboard; also exits current shell. + // -H Deletes the first character to the left of the cursor. Also called the ERASE key. + // -Q Restarts printing after it has been stopped with -s. + // -S Suspends printing on the screen (does not stop the program). + // -U Deletes all characters on the current line. Also called the KILL key. + // -E Quits current command and creates a core + + } + // +Key generates ESC N Key + if !control && alt { + return KEY_ESC_N + strings.ToLower(string(keyEvent.UnicodeChar)) + } + return string(keyEvent.UnicodeChar) +} + +// getAvailableInputEvents polls the console for availble events +// The function does not return until at least one input record has been read. +func getAvailableInputEvents() (inputEvents []INPUT_RECORD, err error) { + handle, _ := syscall.GetStdHandle(STD_INPUT_HANDLE) + if nil != err { + return nil, err + } + for { + // Read number of console events available + tempBuffer := make([]INPUT_RECORD, MAX_INPUT_BUFFER) + nr, err := readConsoleInputKey(uintptr(handle), tempBuffer) + if nr == 0 { + return nil, err + } + if 0 < nr { + retValue := make([]INPUT_RECORD, nr) + for i := 0; i < nr; i++ { + retValue[i] = tempBuffer[i] + } + return retValue, nil + } + } +} + +// getTranslatedKeyCodes converts the input events into the string of characters +// The ansi escape sequence are used to map key strokes to the strings +func getTranslatedKeyCodes(inputEvents []INPUT_RECORD, escapeSequence []byte) string { + var buf bytes.Buffer + for i := 0; i < len(inputEvents); i++ { + input := inputEvents[i] + if input.EventType == KEY_EVENT && input.KeyEvent.KeyDown != 0 { + keyString := mapKeystokeToTerminalString(&input.KeyEvent, escapeSequence) + buf.WriteString(keyString) + } + } + return buf.String() +} + +// ReadChars reads the characters from the given reader +func (term *WindowsTerminal) ReadChars(w io.Reader, p []byte) (n int, err error) { + n = 0 + for n < len(p) { + select { + case b := <-term.inputBuffer: + p[n] = b + n++ + default: + // Read at least one byte read + if n > 0 { + return n, nil + } + inputEvents, _ := getAvailableInputEvents() + if inputEvents != nil { + if len(inputEvents) == 0 && nil != err { + return n, err + } + if len(inputEvents) != 0 { + keyCodes := getTranslatedKeyCodes(inputEvents, term.inputEscapeSequence) + for _, b := range []byte(keyCodes) { + term.inputBuffer <- b + } + } + } + } + } + return n, nil +} + +// HandleInputSequence interprets the input sequence command +func (term *WindowsTerminal) HandleInputSequence(command []byte) (n int, err error) { + return 0, nil +} + +func marshal(c COORD) uint32 { + // works only on intel-endian machines + return uint32(uint32(uint16(c.Y))<<16 | uint32(uint16(c.X))) +} diff --git a/pkg/term/console_windows_test.go b/pkg/term/console_windows_test.go new file mode 100644 index 0000000000..01c25726c8 --- /dev/null +++ b/pkg/term/console_windows_test.go @@ -0,0 +1,232 @@ +// +build windows + +package term + +import ( + "fmt" + "testing" +) + +func helpsTestParseInt16OrDefault(t *testing.T, expectedValue int16, shouldFail bool, input string, defaultValue int16, format string, args ...string) { + value, err := parseInt16OrDefault(input, defaultValue) + if nil != err && !shouldFail { + t.Errorf("Unexpected error returned %v", err) + t.Errorf(format, args) + } + if nil == err && shouldFail { + t.Errorf("Should have failed as expected\n\tReturned value = %d", value) + t.Errorf(format, args) + } + if expectedValue != value { + t.Errorf("The value returned does not macth expected\n\tExpected:%v\n\t:Actual%v", expectedValue, value) + t.Errorf(format, args) + } +} + +func TestParseInt16OrDefault(t *testing.T) { + // empty string + helpsTestParseInt16OrDefault(t, 0, false, "", 0, "Empty string returns default") + helpsTestParseInt16OrDefault(t, 2, false, "", 2, "Empty string returns default") + + // normal case + helpsTestParseInt16OrDefault(t, 0, false, "0", 0, "0 handled correctly") + helpsTestParseInt16OrDefault(t, 111, false, "111", 2, "Normal") + helpsTestParseInt16OrDefault(t, 111, false, "+111", 2, "+N") + helpsTestParseInt16OrDefault(t, -111, false, "-111", 2, "-N") + helpsTestParseInt16OrDefault(t, 0, false, "+0", 11, "+0") + helpsTestParseInt16OrDefault(t, 0, false, "-0", 12, "-0") + + // ill formed strings + helpsTestParseInt16OrDefault(t, 0, true, "abc", 0, "Invalid string") + helpsTestParseInt16OrDefault(t, 42, true, "+= 23", 42, "Invalid string") + helpsTestParseInt16OrDefault(t, 42, true, "123.45", 42, "float like") + +} + +func helpsTestGetNumberOfChars(t *testing.T, expected uint32, fromCoord COORD, toCoord COORD, screenSize COORD, format string, args ...interface{}) { + actual := getNumberOfChars(fromCoord, toCoord, screenSize) + mesg := fmt.Sprintf(format, args) + assertTrue(t, expected == actual, fmt.Sprintf("%s Expected=%d, Actual=%d, Parameters = { fromCoord=%+v, toCoord=%+v, screenSize=%+v", mesg, expected, actual, fromCoord, toCoord, screenSize)) +} + +func TestGetNumberOfChars(t *testing.T) { + // Note: The columns and lines are 0 based + // Also that interval is "inclusive" means will have both start and end chars + // This test only tests the number opf characters being written + + // all four corners + maxWindow := COORD{X: 80, Y: 50} + leftTop := COORD{X: 0, Y: 0} + rightTop := COORD{X: 79, Y: 0} + leftBottom := COORD{X: 0, Y: 49} + rightBottom := COORD{X: 79, Y: 49} + + // same position + helpsTestGetNumberOfChars(t, 1, COORD{X: 1, Y: 14}, COORD{X: 1, Y: 14}, COORD{X: 80, Y: 50}, "Same position random line") + + // four corners + helpsTestGetNumberOfChars(t, 1, leftTop, leftTop, maxWindow, "Same position- leftTop") + helpsTestGetNumberOfChars(t, 1, rightTop, rightTop, maxWindow, "Same position- rightTop") + helpsTestGetNumberOfChars(t, 1, leftBottom, leftBottom, maxWindow, "Same position- leftBottom") + helpsTestGetNumberOfChars(t, 1, rightBottom, rightBottom, maxWindow, "Same position- rightBottom") + + // from this char to next char on same line + helpsTestGetNumberOfChars(t, 2, COORD{X: 0, Y: 0}, COORD{X: 1, Y: 0}, maxWindow, "Next position on same line") + helpsTestGetNumberOfChars(t, 2, COORD{X: 1, Y: 14}, COORD{X: 2, Y: 14}, maxWindow, "Next position on same line") + + // from this char to next 10 chars on same line + helpsTestGetNumberOfChars(t, 11, COORD{X: 0, Y: 0}, COORD{X: 10, Y: 0}, maxWindow, "Next position on same line") + helpsTestGetNumberOfChars(t, 11, COORD{X: 1, Y: 14}, COORD{X: 11, Y: 14}, maxWindow, "Next position on same line") + + helpsTestGetNumberOfChars(t, 5, COORD{X: 3, Y: 11}, COORD{X: 7, Y: 11}, maxWindow, "To and from on same line") + + helpsTestGetNumberOfChars(t, 8, COORD{X: 0, Y: 34}, COORD{X: 7, Y: 34}, maxWindow, "Start of line to middle") + helpsTestGetNumberOfChars(t, 4, COORD{X: 76, Y: 34}, COORD{X: 79, Y: 34}, maxWindow, "Middle to end of line") + + // multiple lines - 1 + helpsTestGetNumberOfChars(t, 81, COORD{X: 0, Y: 0}, COORD{X: 0, Y: 1}, maxWindow, "one line below same X") + helpsTestGetNumberOfChars(t, 81, COORD{X: 10, Y: 10}, COORD{X: 10, Y: 11}, maxWindow, "one line below same X") + + // multiple lines - 2 + helpsTestGetNumberOfChars(t, 161, COORD{X: 0, Y: 0}, COORD{X: 0, Y: 2}, maxWindow, "one line below same X") + helpsTestGetNumberOfChars(t, 161, COORD{X: 10, Y: 10}, COORD{X: 10, Y: 12}, maxWindow, "one line below same X") + + // multiple lines - 3 + helpsTestGetNumberOfChars(t, 241, COORD{X: 0, Y: 0}, COORD{X: 0, Y: 3}, maxWindow, "one line below same X") + helpsTestGetNumberOfChars(t, 241, COORD{X: 10, Y: 10}, COORD{X: 10, Y: 13}, maxWindow, "one line below same X") + + // full line + helpsTestGetNumberOfChars(t, 80, COORD{X: 0, Y: 0}, COORD{X: 79, Y: 0}, maxWindow, "Full line - first") + helpsTestGetNumberOfChars(t, 80, COORD{X: 0, Y: 23}, COORD{X: 79, Y: 23}, maxWindow, "Full line - random") + helpsTestGetNumberOfChars(t, 80, COORD{X: 0, Y: 49}, COORD{X: 79, Y: 49}, maxWindow, "Full line - last") + + // full screen + helpsTestGetNumberOfChars(t, 80*50, leftTop, rightBottom, maxWindow, "full screen") + + helpsTestGetNumberOfChars(t, 80*50-1, COORD{X: 1, Y: 0}, rightBottom, maxWindow, "dropping first char to, end of screen") + helpsTestGetNumberOfChars(t, 80*50-2, COORD{X: 2, Y: 0}, rightBottom, maxWindow, "dropping first two char to, end of screen") + + helpsTestGetNumberOfChars(t, 80*50-1, leftTop, COORD{X: 78, Y: 49}, maxWindow, "from start of screen, till last char-1") + helpsTestGetNumberOfChars(t, 80*50-2, leftTop, COORD{X: 77, Y: 49}, maxWindow, "from start of screen, till last char-2") + + helpsTestGetNumberOfChars(t, 80*50-5, COORD{X: 4, Y: 0}, COORD{X: 78, Y: 49}, COORD{X: 80, Y: 50}, "from start of screen+4, till last char-1") + helpsTestGetNumberOfChars(t, 80*50-6, COORD{X: 4, Y: 0}, COORD{X: 77, Y: 49}, COORD{X: 80, Y: 50}, "from start of screen+4, till last char-2") +} + +var allForeground = []int16{ + ANSI_FOREGROUND_BLACK, + ANSI_FOREGROUND_RED, + ANSI_FOREGROUND_GREEN, + ANSI_FOREGROUND_YELLOW, + ANSI_FOREGROUND_BLUE, + ANSI_FOREGROUND_MAGENTA, + ANSI_FOREGROUND_CYAN, + ANSI_FOREGROUND_WHITE, + ANSI_FOREGROUND_DEFAULT, +} +var allBackground = []int16{ + ANSI_BACKGROUND_BLACK, + ANSI_BACKGROUND_RED, + ANSI_BACKGROUND_GREEN, + ANSI_BACKGROUND_YELLOW, + ANSI_BACKGROUND_BLUE, + ANSI_BACKGROUND_MAGENTA, + ANSI_BACKGROUND_CYAN, + ANSI_BACKGROUND_WHITE, + ANSI_BACKGROUND_DEFAULT, +} + +func maskForeground(flag WORD) WORD { + return flag & FOREGROUND_MASK_UNSET +} + +func onlyForeground(flag WORD) WORD { + return flag & FOREGROUND_MASK_SET +} + +func maskBackground(flag WORD) WORD { + return flag & BACKGROUND_MASK_UNSET +} + +func onlyBackground(flag WORD) WORD { + return flag & BACKGROUND_MASK_SET +} + +func helpsTestGetWindowsTextAttributeForAnsiValue(t *testing.T, oldValue WORD /*, expected WORD*/, ansi int16, onlyMask WORD, restMask WORD) WORD { + actual, err := getWindowsTextAttributeForAnsiValue(oldValue, FOREGROUND_MASK_SET, ansi) + assertTrue(t, nil == err, "Should be no error") + // assert that other bits are not affected + if 0 != oldValue { + assertTrue(t, (actual&restMask) == (oldValue&restMask), "The operation should not have affected other bits actual=%X oldValue=%X ansi=%d", actual, oldValue, ansi) + } + return actual +} + +func TestBackgroundForAnsiValue(t *testing.T) { + // Check that nothing else changes + // background changes + for _, state1 := range allBackground { + for _, state2 := range allBackground { + flag := WORD(0) + flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state1, BACKGROUND_MASK_SET, BACKGROUND_MASK_UNSET) + flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state2, BACKGROUND_MASK_SET, BACKGROUND_MASK_UNSET) + } + } + // cummulative bcakground changes + for _, state1 := range allBackground { + flag := WORD(0) + for _, state2 := range allBackground { + flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state1, BACKGROUND_MASK_SET, BACKGROUND_MASK_UNSET) + flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state2, BACKGROUND_MASK_SET, BACKGROUND_MASK_UNSET) + } + } + // change background after foreground + for _, state1 := range allForeground { + for _, state2 := range allBackground { + flag := WORD(0) + flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state1, FOREGROUND_MASK_SET, FOREGROUND_MASK_UNSET) + flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state2, BACKGROUND_MASK_SET, BACKGROUND_MASK_UNSET) + } + } + // change background after change cumulative + for _, state1 := range allForeground { + flag := WORD(0) + for _, state2 := range allBackground { + flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state1, FOREGROUND_MASK_SET, FOREGROUND_MASK_UNSET) + flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state2, BACKGROUND_MASK_SET, BACKGROUND_MASK_UNSET) + } + } +} + +func TestForegroundForAnsiValue(t *testing.T) { + // Check that nothing else changes + for _, state1 := range allForeground { + for _, state2 := range allForeground { + flag := WORD(0) + flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state1, FOREGROUND_MASK_SET, FOREGROUND_MASK_UNSET) + flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state2, FOREGROUND_MASK_SET, FOREGROUND_MASK_UNSET) + } + } + + for _, state1 := range allForeground { + flag := WORD(0) + for _, state2 := range allForeground { + flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state1, FOREGROUND_MASK_SET, FOREGROUND_MASK_UNSET) + flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state2, FOREGROUND_MASK_SET, FOREGROUND_MASK_UNSET) + } + } + for _, state1 := range allBackground { + for _, state2 := range allForeground { + flag := WORD(0) + flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state1, BACKGROUND_MASK_SET, BACKGROUND_MASK_UNSET) + flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state2, FOREGROUND_MASK_SET, FOREGROUND_MASK_UNSET) + } + } + for _, state1 := range allBackground { + flag := WORD(0) + for _, state2 := range allForeground { + flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state1, BACKGROUND_MASK_SET, BACKGROUND_MASK_UNSET) + flag = helpsTestGetWindowsTextAttributeForAnsiValue(t, flag, state2, FOREGROUND_MASK_SET, FOREGROUND_MASK_UNSET) + } + } +} diff --git a/pkg/term/term.go b/pkg/term/term.go index 8d807d8d44..d21c73fdb6 100644 --- a/pkg/term/term.go +++ b/pkg/term/term.go @@ -4,6 +4,7 @@ package term import ( "errors" + "io" "os" "os/signal" "syscall" @@ -25,6 +26,20 @@ type Winsize struct { y uint16 } +func StdStreams() (stdOut io.Writer, stdErr io.Writer, stdIn io.ReadCloser) { + return os.Stdout, os.Stderr, os.Stdin +} + +func GetHandleInfo(in interface{}) (uintptr, bool) { + var inFd uintptr + var isTerminalIn bool + if file, ok := in.(*os.File); ok { + inFd = file.Fd() + isTerminalIn = IsTerminal(inFd) + } + return inFd, isTerminalIn +} + func GetWinsize(fd uintptr) (*Winsize, error) { ws := &Winsize{} _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(ws))) diff --git a/pkg/term/term_emulator.go b/pkg/term/term_emulator.go new file mode 100644 index 0000000000..1713f428a9 --- /dev/null +++ b/pkg/term/term_emulator.go @@ -0,0 +1,216 @@ +package term + +import ( + "io" + "strconv" + "strings" +) + +// http://manpages.ubuntu.com/manpages/intrepid/man4/console_codes.4.html +const ( + ANSI_ESCAPE_PRIMARY = 0x1B + ANSI_ESCAPE_SECONDARY = 0x5B + ANSI_COMMAND_FIRST = 0x40 + ANSI_COMMAND_LAST = 0x7E + ANSI_PARAMETER_SEP = ";" + ANSI_CMD_G0 = '(' + ANSI_CMD_G1 = ')' + ANSI_CMD_G2 = '*' + ANSI_CMD_G3 = '+' + ANSI_CMD_DECPNM = '>' + ANSI_CMD_DECPAM = '=' + ANSI_CMD_OSC = ']' + ANSI_CMD_STR_TERM = '\\' + ANSI_BEL = 0x07 + KEY_EVENT = 1 +) + +// Interface that implements terminal handling +type terminalEmulator interface { + HandleOutputCommand(command []byte) (n int, err error) + HandleInputSequence(command []byte) (n int, err error) + WriteChars(w io.Writer, p []byte) (n int, err error) + ReadChars(w io.Reader, p []byte) (n int, err error) +} + +type terminalWriter struct { + wrappedWriter io.Writer + emulator terminalEmulator + command []byte + inSequence bool +} + +type terminalReader struct { + wrappedReader io.ReadCloser + emulator terminalEmulator + command []byte + inSequence bool +} + +// http://manpages.ubuntu.com/manpages/intrepid/man4/console_codes.4.html +func isAnsiCommandChar(b byte) bool { + switch { + case ANSI_COMMAND_FIRST <= b && b <= ANSI_COMMAND_LAST && b != ANSI_ESCAPE_SECONDARY: + return true + case b == ANSI_CMD_G1 || b == ANSI_CMD_OSC || b == ANSI_CMD_DECPAM || b == ANSI_CMD_DECPNM: + // non-CSI escape sequence terminator + return true + case b == ANSI_CMD_STR_TERM || b == ANSI_BEL: + // String escape sequence terminator + return true + } + return false +} + +func isCharacterSelectionCmdChar(b byte) bool { + return (b == ANSI_CMD_G0 || b == ANSI_CMD_G1 || b == ANSI_CMD_G2 || b == ANSI_CMD_G3) +} + +func isXtermOscSequence(command []byte, current byte) bool { + return (len(command) >= 2 && command[0] == ANSI_ESCAPE_PRIMARY && command[1] == ANSI_CMD_OSC && current != ANSI_BEL) +} + +// Write writes len(p) bytes from p to the underlying data stream. +// http://golang.org/pkg/io/#Writer +func (tw *terminalWriter) Write(p []byte) (n int, err error) { + if len(p) == 0 { + return 0, nil + } + if tw.emulator == nil { + return tw.wrappedWriter.Write(p) + } + // Emulate terminal by extracting commands and executing them + totalWritten := 0 + start := 0 // indicates start of the next chunk + end := len(p) + for current := 0; current < end; current++ { + if tw.inSequence { + // inside escape sequence + tw.command = append(tw.command, p[current]) + if isAnsiCommandChar(p[current]) { + if !isXtermOscSequence(tw.command, p[current]) { + // found the last command character. + // Now we have a complete command. + nchar, err := tw.emulator.HandleOutputCommand(tw.command) + totalWritten += nchar + if err != nil { + return totalWritten, err + } + + // clear the command + // don't include current character again + tw.command = tw.command[:0] + start = current + 1 + tw.inSequence = false + } + } + } else { + if p[current] == ANSI_ESCAPE_PRIMARY { + // entering escape sequnce + tw.inSequence = true + // indicates end of "normal sequence", write whatever you have so far + if len(p[start:current]) > 0 { + nw, err := tw.emulator.WriteChars(tw.wrappedWriter, p[start:current]) + totalWritten += nw + if err != nil { + return totalWritten, err + } + } + // include the current character as part of the next sequence + tw.command = append(tw.command, p[current]) + } + } + } + // note that so far, start of the escape sequence triggers writing out of bytes to console. + // For the part _after_ the end of last escape sequence, it is not written out yet. So write it out + if !tw.inSequence { + // assumption is that we can't be inside sequence and therefore command should be empty + if len(p[start:]) > 0 { + nw, err := tw.emulator.WriteChars(tw.wrappedWriter, p[start:]) + totalWritten += nw + if err != nil { + return totalWritten, err + } + } + } + return totalWritten, nil + +} + +// Read reads up to len(p) bytes into p. +// http://golang.org/pkg/io/#Reader +func (tr *terminalReader) Read(p []byte) (n int, err error) { + //Implementations of Read are discouraged from returning a zero byte count + // with a nil error, except when len(p) == 0. + if len(p) == 0 { + return 0, nil + } + if nil == tr.emulator { + return tr.readFromWrappedReader(p) + } + return tr.emulator.ReadChars(tr.wrappedReader, p) +} + +// Close the underlying stream +func (tr *terminalReader) Close() (err error) { + return tr.wrappedReader.Close() +} + +func (tr *terminalReader) readFromWrappedReader(p []byte) (n int, err error) { + return tr.wrappedReader.Read(p) +} + +type ansiCommand struct { + CommandBytes []byte + Command string + Parameters []string + IsSpecial bool +} + +func parseAnsiCommand(command []byte) *ansiCommand { + if isCharacterSelectionCmdChar(command[1]) { + // Is Character Set Selection commands + return &ansiCommand{ + CommandBytes: command, + Command: string(command), + IsSpecial: true, + } + } + // last char is command character + lastCharIndex := len(command) - 1 + + retValue := &ansiCommand{ + CommandBytes: command, + Command: string(command[lastCharIndex]), + IsSpecial: false, + } + // more than a single escape + if lastCharIndex != 0 { + start := 1 + // skip if double char escape sequence + if command[0] == ANSI_ESCAPE_PRIMARY && command[1] == ANSI_ESCAPE_SECONDARY { + start++ + } + // convert this to GetNextParam method + retValue.Parameters = strings.Split(string(command[start:lastCharIndex]), ANSI_PARAMETER_SEP) + } + return retValue +} + +func (c *ansiCommand) getParam(index int) string { + if len(c.Parameters) > index { + return c.Parameters[index] + } + return "" +} + +func parseInt16OrDefault(s string, defaultValue int16) (n int16, err error) { + if s == "" { + return defaultValue, nil + } + parsedValue, err := strconv.ParseInt(s, 10, 16) + if nil != err { + return defaultValue, err + } + return int16(parsedValue), nil +} diff --git a/pkg/term/term_emulator_test.go b/pkg/term/term_emulator_test.go new file mode 100644 index 0000000000..7a9e1abc90 --- /dev/null +++ b/pkg/term/term_emulator_test.go @@ -0,0 +1,388 @@ +package term + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "testing" +) + +const ( + WRITE_OPERATION = iota + COMMAND_OPERATION = iota +) + +var languages = []string{ + "Български", + "Català", + "Čeština", + "Ελληνικά", + "Español", + "Esperanto", + "Euskara", + "Français", + "Galego", + "한국어", + "ქართული", + "Latviešu", + "Lietuvių", + "Magyar", + "Nederlands", + "日本語", + "Norsk bokmål", + "Norsk nynorsk", + "Polski", + "Português", + "Română", + "Русский", + "Slovenčina", + "Slovenščina", + "Српски", + "српскохрватски", + "Suomi", + "Svenska", + "ไทย", + "Tiếng Việt", + "Türkçe", + "Українська", + "中文", +} + +// Mock terminal handler object +type mockTerminal struct { + OutputCommandSequence []terminalOperation +} + +// Used for recording the callback data +type terminalOperation struct { + Operation int + Data []byte + Str string +} + +func (mt *mockTerminal) record(operation int, data []byte) { + op := terminalOperation{ + Operation: operation, + Data: make([]byte, len(data)), + } + copy(op.Data, data) + op.Str = string(op.Data) + mt.OutputCommandSequence = append(mt.OutputCommandSequence, op) +} + +func (mt *mockTerminal) HandleOutputCommand(command []byte) (n int, err error) { + mt.record(COMMAND_OPERATION, command) + return len(command), nil +} + +func (mt *mockTerminal) HandleInputSequence(command []byte) (n int, err error) { + return 0, nil +} + +func (mt *mockTerminal) WriteChars(w io.Writer, p []byte) (n int, err error) { + mt.record(WRITE_OPERATION, p) + return len(p), nil +} + +func (mt *mockTerminal) ReadChars(w io.Reader, p []byte) (n int, err error) { + return len(p), nil +} + +func assertTrue(t *testing.T, cond bool, format string, args ...interface{}) { + if !cond { + t.Errorf(format, args...) + } +} + +// reflect.DeepEqual does not provide detailed information as to what excatly failed. +func assertBytesEqual(t *testing.T, expected, actual []byte, format string, args ...interface{}) { + match := true + mismatchIndex := 0 + if len(expected) == len(actual) { + for i := 0; i < len(expected); i++ { + if expected[i] != actual[i] { + match = false + mismatchIndex = i + break + } + } + } else { + match = false + t.Errorf("Lengths don't match Expected=%d Actual=%d", len(expected), len(actual)) + } + if !match { + t.Errorf("Mismatch at index %d ", mismatchIndex) + t.Errorf("\tActual String = %s", string(actual)) + t.Errorf("\tExpected String = %s", string(expected)) + t.Errorf("\tActual = %v", actual) + t.Errorf("\tExpected = %v", expected) + t.Errorf(format, args) + } +} + +// Just to make sure :) +func TestAssertEqualBytes(t *testing.T) { + data := []byte{9, 9, 1, 1, 1, 9, 9} + assertBytesEqual(t, data, data, "Self") + assertBytesEqual(t, data[1:4], data[1:4], "Self") + assertBytesEqual(t, []byte{1, 1}, []byte{1, 1}, "Simple match") + assertBytesEqual(t, []byte{1, 2, 3}, []byte{1, 2, 3}, "content mismatch") + assertBytesEqual(t, []byte{1, 1, 1}, data[2:5], "slice match") +} + +/* +func TestAssertEqualBytesNegative(t *testing.T) { + AssertBytesEqual(t, []byte{1, 1}, []byte{1}, "Length mismatch") + AssertBytesEqual(t, []byte{1, 1}, []byte{1}, "Length mismatch") + AssertBytesEqual(t, []byte{1, 2, 3}, []byte{1, 1, 1}, "content mismatch") +}*/ + +// Checks that the calls recieved +func assertHandlerOutput(t *testing.T, mock *mockTerminal, plainText string, commands ...string) { + text := make([]byte, 0, 3*len(plainText)) + cmdIndex := 0 + for opIndex := 0; opIndex < len(mock.OutputCommandSequence); opIndex++ { + op := mock.OutputCommandSequence[opIndex] + if op.Operation == WRITE_OPERATION { + t.Logf("\nThe data is[%d] == %s", opIndex, string(op.Data)) + text = append(text[:], op.Data...) + } else { + assertTrue(t, mock.OutputCommandSequence[opIndex].Operation == COMMAND_OPERATION, "Operation should be command : %s", fmt.Sprintf("%+v", mock)) + assertBytesEqual(t, StringToBytes(commands[cmdIndex]), mock.OutputCommandSequence[opIndex].Data, "Command data should match") + cmdIndex++ + } + } + assertBytesEqual(t, StringToBytes(plainText), text, "Command data should match %#v", mock) +} + +func StringToBytes(str string) []byte { + bytes := make([]byte, len(str)) + copy(bytes[:], str) + return bytes +} + +func TestParseAnsiCommand(t *testing.T) { + // Note: if the parameter does not exist then the empty value is returned + + c := parseAnsiCommand(StringToBytes("\x1Bm")) + assertTrue(t, c.Command == "m", "Command should be m") + assertTrue(t, "" == c.getParam(0), "should return empty string") + assertTrue(t, "" == c.getParam(1), "should return empty string") + + // Escape sequence - ESC[ + c = parseAnsiCommand(StringToBytes("\x1B[m")) + assertTrue(t, c.Command == "m", "Command should be m") + assertTrue(t, "" == c.getParam(0), "should return empty string") + assertTrue(t, "" == c.getParam(1), "should return empty string") + + // Escape sequence With empty parameters- ESC[ + c = parseAnsiCommand(StringToBytes("\x1B[;m")) + assertTrue(t, c.Command == "m", "Command should be m") + assertTrue(t, "" == c.getParam(0), "should return empty string") + assertTrue(t, "" == c.getParam(1), "should return empty string") + assertTrue(t, "" == c.getParam(2), "should return empty string") + + // Escape sequence With empty muliple parameters- ESC[ + c = parseAnsiCommand(StringToBytes("\x1B[;;m")) + assertTrue(t, c.Command == "m", "Command should be m") + assertTrue(t, "" == c.getParam(0), "") + assertTrue(t, "" == c.getParam(1), "") + assertTrue(t, "" == c.getParam(2), "") + + // Escape sequence With muliple parameters- ESC[ + c = parseAnsiCommand(StringToBytes("\x1B[1;2;3m")) + assertTrue(t, c.Command == "m", "Command should be m") + assertTrue(t, "1" == c.getParam(0), "") + assertTrue(t, "2" == c.getParam(1), "") + assertTrue(t, "3" == c.getParam(2), "") + + // Escape sequence With muliple parameters- some missing + c = parseAnsiCommand(StringToBytes("\x1B[1;;3;;;6m")) + assertTrue(t, c.Command == "m", "Command should be m") + assertTrue(t, "1" == c.getParam(0), "") + assertTrue(t, "" == c.getParam(1), "") + assertTrue(t, "3" == c.getParam(2), "") + assertTrue(t, "" == c.getParam(3), "") + assertTrue(t, "" == c.getParam(4), "") + assertTrue(t, "6" == c.getParam(5), "") +} + +func newBufferedMockTerm() (stdOut io.Writer, stdErr io.Writer, stdIn io.ReadCloser, mock *mockTerminal) { + var input bytes.Buffer + var output bytes.Buffer + var err bytes.Buffer + + mock = &mockTerminal{ + OutputCommandSequence: make([]terminalOperation, 0, 256), + } + + stdOut = &terminalWriter{ + wrappedWriter: &output, + emulator: mock, + command: make([]byte, 0, 256), + } + stdErr = &terminalWriter{ + wrappedWriter: &err, + emulator: mock, + command: make([]byte, 0, 256), + } + stdIn = &terminalReader{ + wrappedReader: ioutil.NopCloser(&input), + emulator: mock, + command: make([]byte, 0, 256), + } + + return +} + +func TestOutputSimple(t *testing.T) { + stdOut, _, _, mock := newBufferedMockTerm() + + stdOut.Write(StringToBytes("Hello world")) + stdOut.Write(StringToBytes("\x1BmHello again")) + + assertTrue(t, mock.OutputCommandSequence[0].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock) + assertBytesEqual(t, StringToBytes("Hello world"), mock.OutputCommandSequence[0].Data, "Write data should match") + + assertTrue(t, mock.OutputCommandSequence[1].Operation == COMMAND_OPERATION, "Operation should be command : %+v", mock) + assertBytesEqual(t, StringToBytes("\x1Bm"), mock.OutputCommandSequence[1].Data, "Command data should match") + + assertTrue(t, mock.OutputCommandSequence[2].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock) + assertBytesEqual(t, StringToBytes("Hello again"), mock.OutputCommandSequence[2].Data, "Write data should match") +} + +func TestOutputSplitCommand(t *testing.T) { + stdOut, _, _, mock := newBufferedMockTerm() + + stdOut.Write(StringToBytes("Hello world\x1B[1;2;3")) + stdOut.Write(StringToBytes("mHello again")) + + assertTrue(t, mock.OutputCommandSequence[0].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock) + assertBytesEqual(t, StringToBytes("Hello world"), mock.OutputCommandSequence[0].Data, "Write data should match") + + assertTrue(t, mock.OutputCommandSequence[1].Operation == COMMAND_OPERATION, "Operation should be command : %+v", mock) + assertBytesEqual(t, StringToBytes("\x1B[1;2;3m"), mock.OutputCommandSequence[1].Data, "Command data should match") + + assertTrue(t, mock.OutputCommandSequence[2].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock) + assertBytesEqual(t, StringToBytes("Hello again"), mock.OutputCommandSequence[2].Data, "Write data should match") +} + +func TestOutputMultipleCommands(t *testing.T) { + stdOut, _, _, mock := newBufferedMockTerm() + + stdOut.Write(StringToBytes("Hello world")) + stdOut.Write(StringToBytes("\x1B[1;2;3m")) + stdOut.Write(StringToBytes("\x1B[J")) + stdOut.Write(StringToBytes("Hello again")) + + assertTrue(t, mock.OutputCommandSequence[0].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock) + assertBytesEqual(t, StringToBytes("Hello world"), mock.OutputCommandSequence[0].Data, "Write data should match") + + assertTrue(t, mock.OutputCommandSequence[1].Operation == COMMAND_OPERATION, "Operation should be command : %+v", mock) + assertBytesEqual(t, StringToBytes("\x1B[1;2;3m"), mock.OutputCommandSequence[1].Data, "Command data should match") + + assertTrue(t, mock.OutputCommandSequence[2].Operation == COMMAND_OPERATION, "Operation should be command : %+v", mock) + assertBytesEqual(t, StringToBytes("\x1B[J"), mock.OutputCommandSequence[2].Data, "Command data should match") + + assertTrue(t, mock.OutputCommandSequence[3].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock) + assertBytesEqual(t, StringToBytes("Hello again"), mock.OutputCommandSequence[3].Data, "Write data should match") +} + +// Splits the given data in two chunks , makes two writes and checks the split data is parsed correctly +// checks output write/command is passed to handler correctly +func helpsTestOutputSplitChunksAtIndex(t *testing.T, i int, data []byte) { + t.Logf("\ni=%d", i) + stdOut, _, _, mock := newBufferedMockTerm() + + t.Logf("\nWriting chunk[0] == %s", string(data[:i])) + t.Logf("\nWriting chunk[1] == %s", string(data[i:])) + stdOut.Write(data[:i]) + stdOut.Write(data[i:]) + + assertTrue(t, mock.OutputCommandSequence[0].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock) + assertBytesEqual(t, data[:i], mock.OutputCommandSequence[0].Data, "Write data should match") + + assertTrue(t, mock.OutputCommandSequence[1].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock) + assertBytesEqual(t, data[i:], mock.OutputCommandSequence[1].Data, "Write data should match") +} + +// Splits the given data in three chunks , makes three writes and checks the split data is parsed correctly +// checks output write/command is passed to handler correctly +func helpsTestOutputSplitThreeChunksAtIndex(t *testing.T, data []byte, i int, j int) { + stdOut, _, _, mock := newBufferedMockTerm() + + t.Logf("\nWriting chunk[0] == %s", string(data[:i])) + t.Logf("\nWriting chunk[1] == %s", string(data[i:j])) + t.Logf("\nWriting chunk[2] == %s", string(data[j:])) + stdOut.Write(data[:i]) + stdOut.Write(data[i:j]) + stdOut.Write(data[j:]) + + assertTrue(t, mock.OutputCommandSequence[0].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock) + assertBytesEqual(t, data[:i], mock.OutputCommandSequence[0].Data, "Write data should match") + + assertTrue(t, mock.OutputCommandSequence[1].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock) + assertBytesEqual(t, data[i:j], mock.OutputCommandSequence[1].Data, "Write data should match") + + assertTrue(t, mock.OutputCommandSequence[2].Operation == WRITE_OPERATION, "Operation should be Write : %#v", mock) + assertBytesEqual(t, data[j:], mock.OutputCommandSequence[2].Data, "Write data should match") +} + +// Splits the output into two parts and tests all such possible pairs +func helpsTestOutputSplitChunks(t *testing.T, data []byte) { + for i := 1; i < len(data)-1; i++ { + helpsTestOutputSplitChunksAtIndex(t, i, data) + } +} + +// Splits the output in three parts and tests all such possible triples +func helpsTestOutputSplitThreeChunks(t *testing.T, data []byte) { + for i := 1; i < len(data)-2; i++ { + for j := i + 1; j < len(data)-1; j++ { + helpsTestOutputSplitThreeChunksAtIndex(t, data, i, j) + } + } +} + +func helpsTestOutputSplitCommandsAtIndex(t *testing.T, data []byte, i int, plainText string, commands ...string) { + t.Logf("\ni=%d", i) + stdOut, _, _, mock := newBufferedMockTerm() + + stdOut.Write(data[:i]) + stdOut.Write(data[i:]) + assertHandlerOutput(t, mock, plainText, commands...) +} + +func helpsTestOutputSplitCommands(t *testing.T, data []byte, plainText string, commands ...string) { + for i := 1; i < len(data)-1; i++ { + helpsTestOutputSplitCommandsAtIndex(t, data, i, plainText, commands...) + } +} + +func injectCommandAt(data string, i int, command string) string { + retValue := make([]byte, len(data)+len(command)+4) + retValue = append(retValue, data[:i]...) + retValue = append(retValue, data[i:]...) + return string(retValue) +} + +func TestOutputSplitChunks(t *testing.T) { + data := StringToBytes("qwertyuiopasdfghjklzxcvbnm") + helpsTestOutputSplitChunks(t, data) + helpsTestOutputSplitChunks(t, StringToBytes("BBBBB")) + helpsTestOutputSplitThreeChunks(t, StringToBytes("ABCDE")) +} + +func TestOutputSplitChunksIncludingCommands(t *testing.T) { + helpsTestOutputSplitCommands(t, StringToBytes("Hello world.\x1B[mHello again."), "Hello world.Hello again.", "\x1B[m") + helpsTestOutputSplitCommandsAtIndex(t, StringToBytes("Hello world.\x1B[mHello again."), 2, "Hello world.Hello again.", "\x1B[m") +} + +func TestSplitChunkUnicode(t *testing.T) { + for _, l := range languages { + data := StringToBytes(l) + helpsTestOutputSplitChunks(t, data) + helpsTestOutputSplitThreeChunks(t, data) + } +} diff --git a/pkg/term/term_windows.go b/pkg/term/term_windows.go index d372e86a88..ea4ba5376e 100644 --- a/pkg/term/term_windows.go +++ b/pkg/term/term_windows.go @@ -2,10 +2,12 @@ package term +// State holds the console mode for the terminal. type State struct { mode uint32 } +// Winsize is used for window size. type Winsize struct { Height uint16 Width uint16 @@ -13,6 +15,7 @@ type Winsize struct { y uint16 } +// GetWinsize gets the window size of the given terminal func GetWinsize(fd uintptr) (*Winsize, error) { ws := &Winsize{} var info *CONSOLE_SCREEN_BUFFER_INFO @@ -20,8 +23,9 @@ func GetWinsize(fd uintptr) (*Winsize, error) { if err != nil { return nil, err } - ws.Height = uint16(info.srWindow.Right - info.srWindow.Left + 1) - ws.Width = uint16(info.srWindow.Bottom - info.srWindow.Top + 1) + + ws.Width = uint16(info.Window.Right - info.Window.Left + 1) + ws.Height = uint16(info.Window.Bottom - info.Window.Top + 1) ws.x = 0 // todo azlinux -- this is the pixel size of the Window, and not currently used by any caller ws.y = 0 @@ -29,6 +33,8 @@ func GetWinsize(fd uintptr) (*Winsize, error) { return ws, nil } +// SetWinsize sets the terminal connected to the given file descriptor to a +// given size. func SetWinsize(fd uintptr, ws *Winsize) error { return nil } @@ -39,12 +45,13 @@ func IsTerminal(fd uintptr) bool { return e == nil } -// Restore restores the terminal connected to the given file descriptor to a +// RestoreTerminal restores the terminal connected to the given file descriptor to a // previous state. func RestoreTerminal(fd uintptr, state *State) error { return SetConsoleMode(fd, state.mode) } +// SaveState saves the state of the given console func SaveState(fd uintptr) (*State, error) { mode, e := GetConsoleMode(fd) if e != nil { @@ -53,6 +60,7 @@ func SaveState(fd uintptr) (*State, error) { return &State{mode}, nil } +// DisableEcho disbales the echo for given file descriptor and returns previous state // see http://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx for these flag settings func DisableEcho(fd uintptr, state *State) error { state.mode &^= (ENABLE_ECHO_INPUT) @@ -60,6 +68,9 @@ func DisableEcho(fd uintptr, state *State) error { return SetConsoleMode(fd, state.mode) } +// SetRawTerminal puts the terminal connected to the given file descriptor into raw +// mode and returns the previous state of the terminal so that it can be +// restored. func SetRawTerminal(fd uintptr) (*State, error) { oldState, err := MakeRaw(fd) if err != nil { @@ -79,8 +90,12 @@ func MakeRaw(fd uintptr) (*State, error) { return nil, err } - // see http://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx for these flag settings - state.mode &^= (ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT) + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx + // All three input modes, along with processed output mode, are designed to work together. + // It is best to either enable or disable all of these modes as a group. + // When all are enabled, the application is said to be in "cooked" mode, which means that most of the processing is handled for the application. + // When all are disabled, the application is in "raw" mode, which means that input is unfiltered and any processing is left to the application. + state.mode = 0 err = SetConsoleMode(fd, state.mode) if err != nil { return nil, err From 898d2763c5430efaf808d7ca8c97b6d792c46c46 Mon Sep 17 00:00:00 2001 From: Sachin Joshi Date: Thu, 5 Mar 2015 16:41:48 -0800 Subject: [PATCH 05/77] Move windows console specific implementation in sub package Signed-off-by: Sachin Joshi --- docker/docker.go | 15 +++++---- docker/log.go | 10 +++--- pkg/term/term_windows.go | 33 +++++++++++++------ pkg/term/{ => winconsole}/console_windows.go | 15 ++++++--- .../{ => winconsole}/console_windows_test.go | 2 +- pkg/term/{ => winconsole}/term_emulator.go | 2 +- .../{ => winconsole}/term_emulator_test.go | 2 +- 7 files changed, 50 insertions(+), 29 deletions(-) rename pkg/term/{ => winconsole}/console_windows.go (99%) rename pkg/term/{ => winconsole}/console_windows_test.go (99%) rename pkg/term/{ => winconsole}/term_emulator.go (99%) rename pkg/term/{ => winconsole}/term_emulator_test.go (99%) diff --git a/docker/docker.go b/docker/docker.go index d55e84b8ec..1d2a45c9de 100644 --- a/docker/docker.go +++ b/docker/docker.go @@ -26,6 +26,11 @@ const ( ) func main() { + // Set terminal emulation based on platform as required. + stdout, stderr, stdin := term.StdStreams() + + initLogging(stderr) + if reexec.Init() { return } @@ -43,20 +48,16 @@ func main() { if err != nil { log.Fatalf("Unable to parse logging level: %s", *flLogLevel) } - initLogging(lvl) + setLogLevel(lvl) } else { - initLogging(log.InfoLevel) + setLogLevel(log.InfoLevel) } - // Set terminal emulation based on platform as required. - stdout, stderr, stdin := term.StdStreams() - log.SetOutput(stderr) - // -D, --debug, -l/--log-level=debug processing // When/if -D is removed this block can be deleted if *flDebug { os.Setenv("DEBUG", "1") - initLogging(log.DebugLevel) + setLogLevel(log.DebugLevel) } if len(flHosts) == 0 { diff --git a/docker/log.go b/docker/log.go index cdbbd4408f..0dd9a70eeb 100644 --- a/docker/log.go +++ b/docker/log.go @@ -1,12 +1,14 @@ package main import ( - "os" - log "github.com/Sirupsen/logrus" + "io" ) -func initLogging(lvl log.Level) { - log.SetOutput(os.Stderr) +func setLogLevel(lvl log.Level) { log.SetLevel(lvl) } + +func initLogging(stderr io.Writer) { + log.SetOutput(stderr) +} diff --git a/pkg/term/term_windows.go b/pkg/term/term_windows.go index ea4ba5376e..711f7446d5 100644 --- a/pkg/term/term_windows.go +++ b/pkg/term/term_windows.go @@ -1,7 +1,11 @@ // +build windows - package term +import ( + "github.com/docker/docker/pkg/term/winconsole" + "io" +) + // State holds the console mode for the terminal. type State struct { mode uint32 @@ -18,8 +22,8 @@ type Winsize struct { // GetWinsize gets the window size of the given terminal func GetWinsize(fd uintptr) (*Winsize, error) { ws := &Winsize{} - var info *CONSOLE_SCREEN_BUFFER_INFO - info, err := GetConsoleScreenBufferInfo(fd) + var info *winconsole.CONSOLE_SCREEN_BUFFER_INFO + info, err := winconsole.GetConsoleScreenBufferInfo(fd) if err != nil { return nil, err } @@ -41,19 +45,19 @@ func SetWinsize(fd uintptr, ws *Winsize) error { // IsTerminal returns true if the given file descriptor is a terminal. func IsTerminal(fd uintptr) bool { - _, e := GetConsoleMode(fd) + _, e := winconsole.GetConsoleMode(fd) return e == nil } // RestoreTerminal restores the terminal connected to the given file descriptor to a // previous state. func RestoreTerminal(fd uintptr, state *State) error { - return SetConsoleMode(fd, state.mode) + return winconsole.SetConsoleMode(fd, state.mode) } // SaveState saves the state of the given console func SaveState(fd uintptr) (*State, error) { - mode, e := GetConsoleMode(fd) + mode, e := winconsole.GetConsoleMode(fd) if e != nil { return nil, e } @@ -63,9 +67,9 @@ func SaveState(fd uintptr) (*State, error) { // DisableEcho disbales the echo for given file descriptor and returns previous state // see http://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx for these flag settings func DisableEcho(fd uintptr, state *State) error { - state.mode &^= (ENABLE_ECHO_INPUT) - state.mode |= (ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT) - return SetConsoleMode(fd, state.mode) + state.mode &^= (winconsole.ENABLE_ECHO_INPUT) + state.mode |= (winconsole.ENABLE_PROCESSED_INPUT | winconsole.ENABLE_LINE_INPUT) + return winconsole.SetConsoleMode(fd, state.mode) } // SetRawTerminal puts the terminal connected to the given file descriptor into raw @@ -96,9 +100,18 @@ func MakeRaw(fd uintptr) (*State, error) { // When all are enabled, the application is said to be in "cooked" mode, which means that most of the processing is handled for the application. // When all are disabled, the application is in "raw" mode, which means that input is unfiltered and any processing is left to the application. state.mode = 0 - err = SetConsoleMode(fd, state.mode) + err = winconsole.SetConsoleMode(fd, state.mode) if err != nil { return nil, err } return state, nil } + +// GetHandleInfo returns file descriptor and bool indicating whether the file is a terminal +func GetHandleInfo(in interface{}) (uintptr, bool) { + return winconsole.GetHandleInfo(in) +} + +func StdStreams() (stdOut io.Writer, stdErr io.Writer, stdIn io.ReadCloser) { + return winconsole.StdStreams() +} diff --git a/pkg/term/console_windows.go b/pkg/term/winconsole/console_windows.go similarity index 99% rename from pkg/term/console_windows.go rename to pkg/term/winconsole/console_windows.go index 53069201c7..8121aee757 100644 --- a/pkg/term/console_windows.go +++ b/pkg/term/winconsole/console_windows.go @@ -1,6 +1,6 @@ // +build windows -package term +package winconsole import ( "bytes" @@ -415,7 +415,7 @@ func getNumberOfChars(fromCoord COORD, toCoord COORD, screenSize COORD) uint32 { return 0 } -func clearDisplayRect(fileDesc uintptr, fillChar byte, attributes WORD, fromCoord COORD, toCoord COORD, windowSize COORD) (bool, uint32, error) { +func clearDisplayRect(fileDesc uintptr, fillChar rune, attributes WORD, fromCoord COORD, toCoord COORD, windowSize COORD) (bool, uint32, error) { var writeRegion SMALL_RECT writeRegion.Top = fromCoord.Y writeRegion.Left = fromCoord.X @@ -429,7 +429,7 @@ func clearDisplayRect(fileDesc uintptr, fillChar byte, attributes WORD, fromCoor if size > 0 { buffer := make([]CHAR_INFO, size) for i := 0; i < len(buffer); i++ { - buffer[i].UnicodeChar = WCHAR(string(fillChar)[0]) + buffer[i].UnicodeChar = WCHAR(fillChar) buffer[i].Attributes = attributes } @@ -445,7 +445,7 @@ func clearDisplayRect(fileDesc uintptr, fillChar byte, attributes WORD, fromCoor return true, uint32(size), nil } -func clearDisplayRange(fileDesc uintptr, fillChar byte, attributes WORD, fromCoord COORD, toCoord COORD, windowSize COORD) (bool, uint32, error) { +func clearDisplayRange(fileDesc uintptr, fillChar rune, attributes WORD, fromCoord COORD, toCoord COORD, windowSize COORD) (bool, uint32, error) { nw := uint32(0) // start and end on same line if fromCoord.Y == toCoord.Y { @@ -531,7 +531,6 @@ func getNumberOfConsoleInputEvents(fileDesc uintptr) (uint16, error) { r, _, err := getNumberOfConsoleInputEventsProc.Call(uintptr(fileDesc), uintptr(unsafe.Pointer(&n))) //If the function succeeds, the return value is nonzero if r != 0 { - //fmt.Printf("################%d #################\n", n) return uint16(n), nil } return 0, err @@ -1103,3 +1102,9 @@ func marshal(c COORD) uint32 { // works only on intel-endian machines return uint32(uint32(uint16(c.Y))<<16 | uint32(uint16(c.X))) } + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal(fd uintptr) bool { + _, e := GetConsoleMode(fd) + return e == nil +} diff --git a/pkg/term/console_windows_test.go b/pkg/term/winconsole/console_windows_test.go similarity index 99% rename from pkg/term/console_windows_test.go rename to pkg/term/winconsole/console_windows_test.go index 01c25726c8..ee9d96834b 100644 --- a/pkg/term/console_windows_test.go +++ b/pkg/term/winconsole/console_windows_test.go @@ -1,6 +1,6 @@ // +build windows -package term +package winconsole import ( "fmt" diff --git a/pkg/term/term_emulator.go b/pkg/term/winconsole/term_emulator.go similarity index 99% rename from pkg/term/term_emulator.go rename to pkg/term/winconsole/term_emulator.go index 1713f428a9..13bcde81fc 100644 --- a/pkg/term/term_emulator.go +++ b/pkg/term/winconsole/term_emulator.go @@ -1,4 +1,4 @@ -package term +package winconsole import ( "io" diff --git a/pkg/term/term_emulator_test.go b/pkg/term/winconsole/term_emulator_test.go similarity index 99% rename from pkg/term/term_emulator_test.go rename to pkg/term/winconsole/term_emulator_test.go index 7a9e1abc90..7017d426fe 100644 --- a/pkg/term/term_emulator_test.go +++ b/pkg/term/winconsole/term_emulator_test.go @@ -1,4 +1,4 @@ -package term +package winconsole import ( "bytes" From 45262c4cb057e78ba98d02b5e0121ed402779c7f Mon Sep 17 00:00:00 2001 From: Sachin Joshi Date: Fri, 6 Mar 2015 17:04:35 -0800 Subject: [PATCH 06/77] Use syscall consts, check for errors, Also rename func for non-windows specific names. Signed-off-by: Sachin Joshi --- api/client/cli.go | 4 +-- pkg/term/term.go | 2 +- pkg/term/term_windows.go | 4 +-- pkg/term/winconsole/console_windows.go | 38 ++++++++++++++--------- pkg/term/winconsole/term_emulator.go | 18 ++++++----- pkg/term/winconsole/term_emulator_test.go | 8 ++--- 6 files changed, 42 insertions(+), 32 deletions(-) diff --git a/api/client/cli.go b/api/client/cli.go index 9ca5b1161c..e0ab4191bf 100644 --- a/api/client/cli.go +++ b/api/client/cli.go @@ -138,11 +138,11 @@ func NewDockerCli(in io.ReadCloser, out, err io.Writer, keyFile string, proto, a scheme = "https" } if in != nil { - inFd, isTerminalIn = term.GetHandleInfo(in) + inFd, isTerminalIn = term.GetFdInfo(in) } if out != nil { - outFd, isTerminalOut = term.GetHandleInfo(out) + outFd, isTerminalOut = term.GetFdInfo(out) } if err == nil { diff --git a/pkg/term/term.go b/pkg/term/term.go index d21c73fdb6..b7a5d1874b 100644 --- a/pkg/term/term.go +++ b/pkg/term/term.go @@ -30,7 +30,7 @@ func StdStreams() (stdOut io.Writer, stdErr io.Writer, stdIn io.ReadCloser) { return os.Stdout, os.Stderr, os.Stdin } -func GetHandleInfo(in interface{}) (uintptr, bool) { +func GetFdInfo(in interface{}) (uintptr, bool) { var inFd uintptr var isTerminalIn bool if file, ok := in.(*os.File); ok { diff --git a/pkg/term/term_windows.go b/pkg/term/term_windows.go index 711f7446d5..713572878f 100644 --- a/pkg/term/term_windows.go +++ b/pkg/term/term_windows.go @@ -107,8 +107,8 @@ func MakeRaw(fd uintptr) (*State, error) { return state, nil } -// GetHandleInfo returns file descriptor and bool indicating whether the file is a terminal -func GetHandleInfo(in interface{}) (uintptr, bool) { +// GetFdInfo returns file descriptor and bool indicating whether the file is a terminal +func GetFdInfo(in interface{}) (uintptr, bool) { return winconsole.GetHandleInfo(in) } diff --git a/pkg/term/winconsole/console_windows.go b/pkg/term/winconsole/console_windows.go index 8121aee757..2d0421f8bb 100644 --- a/pkg/term/winconsole/console_windows.go +++ b/pkg/term/winconsole/console_windows.go @@ -83,11 +83,6 @@ const ( ANSI_MAX_CMD_LENGTH = 256 - // https://msdn.microsoft.com/en-us/library/windows/desktop/ms683231(v=vs.85).aspx - STD_INPUT_HANDLE = -10 - STD_OUTPUT_HANDLE = -11 - STD_ERROR_HANDLE = -12 - MAX_INPUT_BUFFER = 1024 DEFAULT_WIDTH = 80 DEFAULT_HEIGHT = 24 @@ -212,7 +207,10 @@ func StdStreams() (stdOut io.Writer, stdErr io.Writer, stdIn io.ReadCloser) { } // Save current screen buffer info - handle, _ := syscall.GetStdHandle(STD_OUTPUT_HANDLE) + handle, err := syscall.GetStdHandle(syscall.STD_OUTPUT_HANDLE) + if nil != err { + panic("This should never happen as it is predefined handle.") + } screenBufferInfo, err := GetConsoleScreenBufferInfo(uintptr(handle)) if err == nil { handler.screenBufferInfo = screenBufferInfo @@ -225,26 +223,36 @@ func StdStreams() (stdOut io.Writer, stdErr io.Writer, stdIn io.ReadCloser) { wrappedWriter: os.Stdout, emulator: handler, command: make([]byte, 0, ANSI_MAX_CMD_LENGTH), + fd: uintptr(handle), } } else { stdOut = os.Stdout } if IsTerminal(os.Stderr.Fd()) { + handle, err := syscall.GetStdHandle(syscall.STD_ERROR_HANDLE) + if nil != err { + panic("This should never happen as it is predefined handle.") + } stdErr = &terminalWriter{ wrappedWriter: os.Stderr, emulator: handler, command: make([]byte, 0, ANSI_MAX_CMD_LENGTH), + fd: uintptr(handle), } } else { stdErr = os.Stderr - } if IsTerminal(os.Stdin.Fd()) { + handle, err := syscall.GetStdHandle(syscall.STD_INPUT_HANDLE) + if nil != err { + panic("This should never happen as it is predefined handle.") + } stdIn = &terminalReader{ wrappedReader: os.Stdin, emulator: handler, command: make([]byte, 0, ANSI_MAX_CMD_LENGTH), + fd: uintptr(handle), } } else { stdIn = os.Stdin @@ -626,7 +634,7 @@ func getWindowsTextAttributeForAnsiValue(originalFlag WORD, defaultValue WORD, a } // HandleOutputCommand interpretes the Ansi commands and then makes appropriate Win32 calls -func (term *WindowsTerminal) HandleOutputCommand(command []byte) (n int, err error) { +func (term *WindowsTerminal) HandleOutputCommand(fd uintptr, command []byte) (n int, err error) { // console settings changes need to happen in atomic way term.outMutex.Lock() defer term.outMutex.Unlock() @@ -636,7 +644,7 @@ func (term *WindowsTerminal) HandleOutputCommand(command []byte) (n int, err err parsedCommand := parseAnsiCommand(command) // use appropriate handle - handle, _ := syscall.GetStdHandle(STD_OUTPUT_HANDLE) + handle := syscall.Handle(fd) switch parsedCommand.Command { case "m": @@ -891,7 +899,7 @@ func (term *WindowsTerminal) HandleOutputCommand(command []byte) (n int, err err } // WriteChars writes the bytes to given writer. -func (term *WindowsTerminal) WriteChars(w io.Writer, p []byte) (n int, err error) { +func (term *WindowsTerminal) WriteChars(fd uintptr, w io.Writer, p []byte) (n int, err error) { return w.Write(p) } @@ -1027,8 +1035,8 @@ func mapKeystokeToTerminalString(keyEvent *KEY_EVENT_RECORD, escapeSequence []by // getAvailableInputEvents polls the console for availble events // The function does not return until at least one input record has been read. -func getAvailableInputEvents() (inputEvents []INPUT_RECORD, err error) { - handle, _ := syscall.GetStdHandle(STD_INPUT_HANDLE) +func getAvailableInputEvents(fd uintptr) (inputEvents []INPUT_RECORD, err error) { + handle := syscall.Handle(fd) if nil != err { return nil, err } @@ -1064,7 +1072,7 @@ func getTranslatedKeyCodes(inputEvents []INPUT_RECORD, escapeSequence []byte) st } // ReadChars reads the characters from the given reader -func (term *WindowsTerminal) ReadChars(w io.Reader, p []byte) (n int, err error) { +func (term *WindowsTerminal) ReadChars(fd uintptr, w io.Reader, p []byte) (n int, err error) { n = 0 for n < len(p) { select { @@ -1076,7 +1084,7 @@ func (term *WindowsTerminal) ReadChars(w io.Reader, p []byte) (n int, err error) if n > 0 { return n, nil } - inputEvents, _ := getAvailableInputEvents() + inputEvents, _ := getAvailableInputEvents(fd) if inputEvents != nil { if len(inputEvents) == 0 && nil != err { return n, err @@ -1094,7 +1102,7 @@ func (term *WindowsTerminal) ReadChars(w io.Reader, p []byte) (n int, err error) } // HandleInputSequence interprets the input sequence command -func (term *WindowsTerminal) HandleInputSequence(command []byte) (n int, err error) { +func (term *WindowsTerminal) HandleInputSequence(fd uintptr, command []byte) (n int, err error) { return 0, nil } diff --git a/pkg/term/winconsole/term_emulator.go b/pkg/term/winconsole/term_emulator.go index 13bcde81fc..2678aab65e 100644 --- a/pkg/term/winconsole/term_emulator.go +++ b/pkg/term/winconsole/term_emulator.go @@ -27,10 +27,10 @@ const ( // Interface that implements terminal handling type terminalEmulator interface { - HandleOutputCommand(command []byte) (n int, err error) - HandleInputSequence(command []byte) (n int, err error) - WriteChars(w io.Writer, p []byte) (n int, err error) - ReadChars(w io.Reader, p []byte) (n int, err error) + HandleOutputCommand(fd uintptr, command []byte) (n int, err error) + HandleInputSequence(fd uintptr, command []byte) (n int, err error) + WriteChars(fd uintptr, w io.Writer, p []byte) (n int, err error) + ReadChars(fd uintptr, w io.Reader, p []byte) (n int, err error) } type terminalWriter struct { @@ -38,6 +38,7 @@ type terminalWriter struct { emulator terminalEmulator command []byte inSequence bool + fd uintptr } type terminalReader struct { @@ -45,6 +46,7 @@ type terminalReader struct { emulator terminalEmulator command []byte inSequence bool + fd uintptr } // http://manpages.ubuntu.com/manpages/intrepid/man4/console_codes.4.html @@ -91,7 +93,7 @@ func (tw *terminalWriter) Write(p []byte) (n int, err error) { if !isXtermOscSequence(tw.command, p[current]) { // found the last command character. // Now we have a complete command. - nchar, err := tw.emulator.HandleOutputCommand(tw.command) + nchar, err := tw.emulator.HandleOutputCommand(tw.fd, tw.command) totalWritten += nchar if err != nil { return totalWritten, err @@ -110,7 +112,7 @@ func (tw *terminalWriter) Write(p []byte) (n int, err error) { tw.inSequence = true // indicates end of "normal sequence", write whatever you have so far if len(p[start:current]) > 0 { - nw, err := tw.emulator.WriteChars(tw.wrappedWriter, p[start:current]) + nw, err := tw.emulator.WriteChars(tw.fd, tw.wrappedWriter, p[start:current]) totalWritten += nw if err != nil { return totalWritten, err @@ -126,7 +128,7 @@ func (tw *terminalWriter) Write(p []byte) (n int, err error) { if !tw.inSequence { // assumption is that we can't be inside sequence and therefore command should be empty if len(p[start:]) > 0 { - nw, err := tw.emulator.WriteChars(tw.wrappedWriter, p[start:]) + nw, err := tw.emulator.WriteChars(tw.fd, tw.wrappedWriter, p[start:]) totalWritten += nw if err != nil { return totalWritten, err @@ -148,7 +150,7 @@ func (tr *terminalReader) Read(p []byte) (n int, err error) { if nil == tr.emulator { return tr.readFromWrappedReader(p) } - return tr.emulator.ReadChars(tr.wrappedReader, p) + return tr.emulator.ReadChars(tr.fd, tr.wrappedReader, p) } // Close the underlying stream diff --git a/pkg/term/winconsole/term_emulator_test.go b/pkg/term/winconsole/term_emulator_test.go index 7017d426fe..65de5a7933 100644 --- a/pkg/term/winconsole/term_emulator_test.go +++ b/pkg/term/winconsole/term_emulator_test.go @@ -71,21 +71,21 @@ func (mt *mockTerminal) record(operation int, data []byte) { mt.OutputCommandSequence = append(mt.OutputCommandSequence, op) } -func (mt *mockTerminal) HandleOutputCommand(command []byte) (n int, err error) { +func (mt *mockTerminal) HandleOutputCommand(fd uintptr, command []byte) (n int, err error) { mt.record(COMMAND_OPERATION, command) return len(command), nil } -func (mt *mockTerminal) HandleInputSequence(command []byte) (n int, err error) { +func (mt *mockTerminal) HandleInputSequence(fd uintptr, command []byte) (n int, err error) { return 0, nil } -func (mt *mockTerminal) WriteChars(w io.Writer, p []byte) (n int, err error) { +func (mt *mockTerminal) WriteChars(fd uintptr, w io.Writer, p []byte) (n int, err error) { mt.record(WRITE_OPERATION, p) return len(p), nil } -func (mt *mockTerminal) ReadChars(w io.Reader, p []byte) (n int, err error) { +func (mt *mockTerminal) ReadChars(fd uintptr, w io.Reader, p []byte) (n int, err error) { return len(p), nil } From 2ce37f6616762900aa941c0644dece9cdbf90124 Mon Sep 17 00:00:00 2001 From: Vincent Batts Date: Mon, 16 Mar 2015 16:29:26 -0400 Subject: [PATCH 07/77] pkg/archive: ignore mtime changes on directories on overlay fs, the mtime of directories changes in a container where new files are added in an upper layer (e.g. '/etc'). This flags the directory as a change where there was none. Closes #9874 Signed-off-by: Vincent Batts --- pkg/archive/changes.go | 4 ++-- pkg/archive/changes_test.go | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pkg/archive/changes.go b/pkg/archive/changes.go index f2ac2a3561..c3cb4ebe0e 100644 --- a/pkg/archive/changes.go +++ b/pkg/archive/changes.go @@ -220,8 +220,8 @@ func (info *FileInfo) addChanges(oldInfo *FileInfo, changes *[]Change) { oldStat.Gid() != newStat.Gid() || oldStat.Rdev() != newStat.Rdev() || // Don't look at size for dirs, its not a good measure of change - (oldStat.Size() != newStat.Size() && oldStat.Mode()&syscall.S_IFDIR != syscall.S_IFDIR) || - !sameFsTimeSpec(oldStat.Mtim(), newStat.Mtim()) || + (oldStat.Mode()&syscall.S_IFDIR != syscall.S_IFDIR && + (!sameFsTimeSpec(oldStat.Mtim(), newStat.Mtim()) || (oldStat.Size() != newStat.Size()))) || bytes.Compare(oldChild.capability, newChild.capability) != 0 { change := Change{ Path: newChild.path(), diff --git a/pkg/archive/changes_test.go b/pkg/archive/changes_test.go index 8f32d7b30e..53ec575b67 100644 --- a/pkg/archive/changes_test.go +++ b/pkg/archive/changes_test.go @@ -218,7 +218,6 @@ func TestChangesDirsMutated(t *testing.T) { expectedChanges := []Change{ {"/dir1", ChangeDelete}, {"/dir2", ChangeModify}, - {"/dir3", ChangeModify}, {"/dirnew", ChangeAdd}, {"/file1", ChangeDelete}, {"/file2", ChangeModify}, From 55cc166e53498a844cd5e96841a25ba1d19924ae Mon Sep 17 00:00:00 2001 From: Qiang Huang Date: Wed, 18 Mar 2015 10:08:17 +0800 Subject: [PATCH 08/77] do not warning when we disable memoryswap $ docker run -ti --rm -m 300M --memory-swap=-1 ubuntu:14.04 WARNING: Your kernel does not support swap limit capabilities. Limitation discarded. root@813aafc019d5:/# When we disable memoryswap, it should not warning swap limit not support. Signed-off-by: Qiang Huang --- daemon/create.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemon/create.go b/daemon/create.go index e17b63636b..49bc6a7de9 100644 --- a/daemon/create.go +++ b/daemon/create.go @@ -33,7 +33,7 @@ func (daemon *Daemon) ContainerCreate(job *engine.Job) engine.Status { job.Errorf("Your kernel does not support memory limit capabilities. Limitation discarded.\n") hostConfig.Memory = 0 } - if hostConfig.Memory > 0 && !daemon.SystemConfig().SwapLimit { + if hostConfig.Memory > 0 && hostConfig.MemorySwap != -1 && !daemon.SystemConfig().SwapLimit { job.Errorf("Your kernel does not support swap limit capabilities. Limitation discarded.\n") hostConfig.MemorySwap = -1 } From 418b7a9abbb31c4aa226931edfaa626f251cc00c Mon Sep 17 00:00:00 2001 From: Harald Albers Date: Wed, 18 Mar 2015 18:10:51 +0100 Subject: [PATCH 09/77] restrict bash completion for hostdir arg to directories The previous state assumed that the HOSTPATH argument referred to a file. As clarified by moxiegirl in PR #11305, it is a directory. Adjusted completion to reflect this. Signed-off-by: Harald Albers --- contrib/completion/bash/docker | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/completion/bash/docker b/contrib/completion/bash/docker index 115cc15b39..ca874bc10c 100755 --- a/contrib/completion/bash/docker +++ b/contrib/completion/bash/docker @@ -325,7 +325,7 @@ _docker_cp() { (( counter++ )) if [ $cword -eq $counter ]; then - _filedir + _filedir -d return fi ;; From 028f7987fe455d958d08db98ae267d9fd4cf3813 Mon Sep 17 00:00:00 2001 From: unclejack Date: Fri, 12 Dec 2014 22:10:09 +0200 Subject: [PATCH 10/77] pkg/ioutils: add tests for BufReader Signed-off-by: Cristian Staretu --- pkg/ioutils/readers_test.go | 58 +++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/pkg/ioutils/readers_test.go b/pkg/ioutils/readers_test.go index a7a2dad176..0af978e068 100644 --- a/pkg/ioutils/readers_test.go +++ b/pkg/ioutils/readers_test.go @@ -32,3 +32,61 @@ func TestBufReader(t *testing.T) { t.Error(string(output)) } } + +type repeatedReader struct { + readCount int + maxReads int + data []byte +} + +func newRepeatedReader(max int, data []byte) *repeatedReader { + return &repeatedReader{0, max, data} +} + +func (r *repeatedReader) Read(p []byte) (int, error) { + if r.readCount >= r.maxReads { + return 0, io.EOF + } + r.readCount++ + n := copy(p, r.data) + return n, nil +} + +func testWithData(data []byte, reads int) { + reader := newRepeatedReader(reads, data) + bufReader := NewBufReader(reader) + io.Copy(ioutil.Discard, bufReader) +} + +func Benchmark1M10BytesReads(b *testing.B) { + reads := 1000000 + readSize := int64(10) + data := make([]byte, readSize) + b.SetBytes(readSize * int64(reads)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + testWithData(data, reads) + } +} + +func Benchmark1M1024BytesReads(b *testing.B) { + reads := 1000000 + readSize := int64(1024) + data := make([]byte, readSize) + b.SetBytes(readSize * int64(reads)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + testWithData(data, reads) + } +} + +func Benchmark10k32KBytesReads(b *testing.B) { + reads := 10000 + readSize := int64(32 * 1024) + data := make([]byte, readSize) + b.SetBytes(readSize * int64(reads)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + testWithData(data, reads) + } +} From e5ea2b235720db8dec7689b410de1830f707284a Mon Sep 17 00:00:00 2001 From: unclejack Date: Mon, 8 Dec 2014 16:10:36 +0200 Subject: [PATCH 11/77] pkg/ioutils: avoid huge Buffer growth in bufreader Signed-off-by: Cristian Staretu --- pkg/ioutils/readers.go | 119 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 111 insertions(+), 8 deletions(-) diff --git a/pkg/ioutils/readers.go b/pkg/ioutils/readers.go index 22f46fbd92..58ff1af639 100644 --- a/pkg/ioutils/readers.go +++ b/pkg/ioutils/readers.go @@ -2,8 +2,11 @@ package ioutils import ( "bytes" + "crypto/rand" "io" + "math/big" "sync" + "time" ) type readCloserWrapper struct { @@ -42,20 +45,40 @@ func NewReaderErrWrapper(r io.Reader, closer func()) io.Reader { } } +// bufReader allows the underlying reader to continue to produce +// output by pre-emptively reading from the wrapped reader. +// This is achieved by buffering this data in bufReader's +// expanding buffer. type bufReader struct { sync.Mutex - buf *bytes.Buffer - reader io.Reader - err error - wait sync.Cond - drainBuf []byte + buf *bytes.Buffer + reader io.Reader + err error + wait sync.Cond + drainBuf []byte + reuseBuf []byte + maxReuse int64 + resetTimeout time.Duration + bufLenResetThreshold int64 + maxReadDataReset int64 } func NewBufReader(r io.Reader) *bufReader { + var timeout int + if randVal, err := rand.Int(rand.Reader, big.NewInt(120)); err == nil { + timeout = int(randVal.Int64()) + 180 + } else { + timeout = 300 + } reader := &bufReader{ - buf: &bytes.Buffer{}, - drainBuf: make([]byte, 1024), - reader: r, + buf: &bytes.Buffer{}, + drainBuf: make([]byte, 1024), + reuseBuf: make([]byte, 4096), + maxReuse: 1000, + resetTimeout: time.Second * time.Duration(timeout), + bufLenResetThreshold: 100 * 1024, + maxReadDataReset: 10 * 1024 * 1024, + reader: r, } reader.wait.L = &reader.Mutex go reader.drain() @@ -74,14 +97,94 @@ func NewBufReaderWithDrainbufAndBuffer(r io.Reader, drainBuffer []byte, buffer * } func (r *bufReader) drain() { + var ( + duration time.Duration + lastReset time.Time + now time.Time + reset bool + bufLen int64 + dataSinceReset int64 + maxBufLen int64 + reuseBufLen int64 + reuseCount int64 + ) + reuseBufLen = int64(len(r.reuseBuf)) + lastReset = time.Now() for { n, err := r.reader.Read(r.drainBuf) + dataSinceReset += int64(n) r.Lock() + bufLen = int64(r.buf.Len()) + if bufLen > maxBufLen { + maxBufLen = bufLen + } + + // Avoid unbounded growth of the buffer over time. + // This has been discovered to be the only non-intrusive + // solution to the unbounded growth of the buffer. + // Alternative solutions such as compression, multiple + // buffers, channels and other similar pieces of code + // were reducing throughput, overall Docker performance + // or simply crashed Docker. + // This solution releases the buffer when specific + // conditions are met to avoid the continuous resizing + // of the buffer for long lived containers. + // + // Move data to the front of the buffer if it's + // smaller than what reuseBuf can store + if bufLen > 0 && reuseBufLen >= bufLen { + n, _ := r.buf.Read(r.reuseBuf) + r.buf.Write(r.reuseBuf[0:n]) + // Take action if the buffer has been reused too many + // times and if there's data in the buffer. + // The timeout is also used as means to avoid doing + // these operations more often or less often than + // required. + // The various conditions try to detect heavy activity + // in the buffer which might be indicators of heavy + // growth of the buffer. + } else if reuseCount >= r.maxReuse && bufLen > 0 { + now = time.Now() + duration = now.Sub(lastReset) + timeoutReached := duration >= r.resetTimeout + + // The timeout has been reached and the + // buffered data couldn't be moved to the front + // of the buffer, so the buffer gets reset. + if timeoutReached && bufLen > reuseBufLen { + reset = true + } + // The amount of buffered data is too high now, + // reset the buffer. + if timeoutReached && maxBufLen >= r.bufLenResetThreshold { + reset = true + } + // Reset the buffer if a certain amount of + // data has gone through the buffer since the + // last reset. + if timeoutReached && dataSinceReset >= r.maxReadDataReset { + reset = true + } + // The buffered data is moved to a fresh buffer, + // swap the old buffer with the new one and + // reset all counters. + if reset { + newbuf := &bytes.Buffer{} + newbuf.ReadFrom(r.buf) + r.buf = newbuf + lastReset = now + reset = false + dataSinceReset = 0 + maxBufLen = 0 + reuseCount = 0 + } + } if err != nil { r.err = err } else { r.buf.Write(r.drainBuf[0:n]) } + reuseCount++ r.wait.Signal() r.Unlock() if err != nil { From cb7a65c55e192558376e542319a4b7e5445c2bcf Mon Sep 17 00:00:00 2001 From: Sachin Joshi Date: Wed, 18 Mar 2015 13:10:57 -0700 Subject: [PATCH 12/77] Fix panic with vi in busybox Following bugs are fixed: 1.Handle out of bound cursor movements: vi in busybox sets cursor to (999,999) expecting it to be set to right, bottom correctly. 2.Correctly determine redirected non-terminal file. Signed-off-by: Sachin Joshi --- pkg/term/winconsole/console_windows.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pkg/term/winconsole/console_windows.go b/pkg/term/winconsole/console_windows.go index 2d0421f8bb..859ee1a1de 100644 --- a/pkg/term/winconsole/console_windows.go +++ b/pkg/term/winconsole/console_windows.go @@ -265,6 +265,10 @@ func StdStreams() (stdOut io.Writer, stdErr io.Writer, stdIn io.ReadCloser) { func GetHandleInfo(in interface{}) (uintptr, bool) { var inFd uintptr var isTerminalIn bool + if file, ok := in.(*os.File); ok { + inFd = file.Fd() + isTerminalIn = IsTerminal(inFd) + } if tr, ok := in.(*terminalReader); ok { if file, ok := tr.wrappedReader.(*os.File); ok { inFd = file.Fd() @@ -678,14 +682,24 @@ func (term *WindowsTerminal) HandleOutputCommand(fd uintptr, command []byte) (n // [line;columnf // Moves the cursor to the specified position (coordinates). // If you do not specify a position, the cursor moves to the home position at the upper-left corner of the screen (line 0, column 0). + screenBufferInfo, err := GetConsoleScreenBufferInfo(uintptr(handle)) + if err != nil { + return len(command), err + } line, err := parseInt16OrDefault(parsedCommand.getParam(0), 1) if err != nil { return len(command), err } + if line > int16(screenBufferInfo.Window.Bottom) { + line = int16(screenBufferInfo.Window.Bottom) + } column, err := parseInt16OrDefault(parsedCommand.getParam(1), 1) if err != nil { return len(command), err } + if column > int16(screenBufferInfo.Window.Right) { + column = int16(screenBufferInfo.Window.Right) + } // The numbers are not 0 based, but 1 based r, err = setConsoleCursorPosition(uintptr(handle), false, int16(column-1), int16(line-1)) if !r { From 74664dabff906f42b9acfbad516eeae484b47af9 Mon Sep 17 00:00:00 2001 From: Lei Jitang Date: Thu, 19 Mar 2015 17:03:40 +0800 Subject: [PATCH 13/77] Fix hostname missing when a container's net mode is contaienr mode Signed-off-by: Lei Jitang --- daemon/container.go | 1 + integration-cli/docker_cli_run_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/daemon/container.go b/daemon/container.go index 31bce1317a..5d3c386290 100644 --- a/daemon/container.go +++ b/daemon/container.go @@ -1222,6 +1222,7 @@ func (container *Container) initializeNetworking() error { if err != nil { return err } + container.HostnamePath = nc.HostnamePath container.HostsPath = nc.HostsPath container.ResolvConfPath = nc.ResolvConfPath container.Config.Hostname = nc.Config.Hostname diff --git a/integration-cli/docker_cli_run_test.go b/integration-cli/docker_cli_run_test.go index 3cab284331..636ef36e12 100644 --- a/integration-cli/docker_cli_run_test.go +++ b/integration-cli/docker_cli_run_test.go @@ -412,6 +412,31 @@ func TestRunLinkToContainerNetMode(t *testing.T) { logDone("run - link to a container which net mode is container success") } +func TestRunModeNetContainerHostname(t *testing.T) { + defer deleteAllContainers() + cmd := exec.Command(dockerBinary, "run", "-i", "-d", "--name", "parent", "busybox", "top") + out, _, err := runCommandWithOutput(cmd) + if err != nil { + t.Fatalf("failed to run container: %v, output: %q", err, out) + } + cmd = exec.Command(dockerBinary, "exec", "parent", "cat", "/etc/hostname") + out, _, err = runCommandWithOutput(cmd) + if err != nil { + t.Fatalf("failed to exec command: %v, output: %q", err, out) + } + + cmd = exec.Command(dockerBinary, "run", "--net=container:parent", "busybox", "cat", "/etc/hostname") + out1, _, err := runCommandWithOutput(cmd) + if err != nil { + t.Fatalf("failed to run container: %v, output: %q", err, out1) + } + if out1 != out { + t.Fatal("containers with shared net namespace should have same hostname") + } + + logDone("run - containers with shared net namespace have same hostname") +} + // Regression test for #4741 func TestRunWithVolumesAsFiles(t *testing.T) { defer deleteAllContainers() From b4ebcdef155d2c517192a07ddfa80e163d78b1b1 Mon Sep 17 00:00:00 2001 From: Phil Estes Date: Wed, 18 Mar 2015 17:30:11 -0400 Subject: [PATCH 14/77] We should point README readers at the new registry v2 project Docker-DCO-1.1-Signed-off-by: Phil Estes (github: estesp) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d15e125e88..079713ced9 100644 --- a/README.md +++ b/README.md @@ -235,8 +235,8 @@ Docker platform to broaden its application and utility. If you know of another project underway that should be listed here, please help us keep this list up-to-date by submitting a PR. -* [Docker Registry](https://github.com/docker/docker-registry): Registry -server for Docker (hosting/delivering of repositories and images) +* [Docker Registry](https://github.com/docker/distribution): Registry +server for Docker (hosting/delivery of repositories and images) * [Docker Machine](https://github.com/docker/machine): Machine management for a container-centric world * [Docker Swarm](https://github.com/docker/swarm): A Docker-native clustering From 390dd4bf3f6e3c6b239d597467554a19b04dc89d Mon Sep 17 00:00:00 2001 From: Jeff Anderson Date: Wed, 18 Feb 2015 17:06:32 -0700 Subject: [PATCH 15/77] Update docs around private github submodules in automated builds. Signed-off-by: Jeff Anderson --- docs/sources/docker-hub/builds.md | 44 +++++++++++++----- .../hub-images/gh_add_ssh_user_key.png | Bin 0 -> 83380 bytes .../docker-hub/hub-images/gh_org_members.png | Bin 0 -> 48655 bytes .../hub-images/gh_repo_deploy_key.png | Bin 0 -> 72927 bytes .../docker-hub/hub-images/gh_team_members.png | Bin 0 -> 67202 bytes .../hub-images/github_deploy_key.png | Bin 20819 -> 0 bytes 6 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 docs/sources/docker-hub/hub-images/gh_add_ssh_user_key.png create mode 100644 docs/sources/docker-hub/hub-images/gh_org_members.png create mode 100644 docs/sources/docker-hub/hub-images/gh_repo_deploy_key.png create mode 100644 docs/sources/docker-hub/hub-images/gh_team_members.png delete mode 100644 docs/sources/docker-hub/hub-images/github_deploy_key.png diff --git a/docs/sources/docker-hub/builds.md b/docs/sources/docker-hub/builds.md index 164018e827..ac62e4f984 100644 --- a/docs/sources/docker-hub/builds.md +++ b/docs/sources/docker-hub/builds.md @@ -63,13 +63,15 @@ public or private GitHub repositories with a `Dockerfile`. ### GitHub Submodules -If your GitHub repository contains links to private submodules, you'll -need to add a deploy key from your Docker Hub repository. +If your GitHub repository contains links to private submodules, you'll get an +error message in your build. -Your Docker Hub deploy key is located under the "Build Details" -menu on the Automated Build's main page in the Hub. Add this key -to your GitHub submodule by visiting the Settings page for the -repository on GitHub and selecting "Deploy keys". +Normally, the Docker Hub sets up a deploy key in your GitHub repository. +Unfortunately, GitHub only allows a deploy key to access one single repository. + +To work around this, we will be creating a dedicated user account in GitHub to +attach this key to. A key on a GitHub user account can be given read-only +access to all your repositories. @@ -82,15 +84,33 @@ repository on GitHub and selecting "Deploy keys". - - + + - - + + + + + + + + + + + + + + + + +
1.Your automated build's deploy key is in the "Build Details" menu -under "Deploy keys".First, create the new account in GitHub. It should be given read-only + access to the main repository and all submodules that are needed.
2.In your GitHub submodule's repository Settings page, add the -deploy key from your Docker Hub Automated Build.This can be accomplished by adding the account to a read-only team on + the organization(s) where the main GitHub repository and all submodule + repositories are kept.
3.Next, remove the deploy key from the main GitHub repository. This can be done in the GitHub repository's "Deploy keys" Settings section.
4.Your automated build's deploy key is in the "Build Details" menu + under "Deploy keys".
5.In your dedicated GitHub User account, add the deploy key from your + Docker Hub Automated Build.
diff --git a/docs/sources/docker-hub/hub-images/gh_add_ssh_user_key.png b/docs/sources/docker-hub/hub-images/gh_add_ssh_user_key.png new file mode 100644 index 0000000000000000000000000000000000000000..d3754d82653d2f1c249a555b6597b8423e0c131e GIT binary patch literal 83380 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]lL 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

2OlHL%TSx3dd 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 Date: Mon, 23 Feb 2015 00:07:34 +0100 Subject: [PATCH 16/77] Optimize images Optimized new screenshots, reduced file-size with 50% Signed-off-by: Sebastiaan van Stijn --- .../hub-images/gh_add_ssh_user_key.png | Bin 83380 -> 38074 bytes .../docker-hub/hub-images/gh_org_members.png | Bin 48655 -> 26612 bytes .../hub-images/gh_repo_deploy_key.png | Bin 72927 -> 32315 bytes .../docker-hub/hub-images/gh_team_members.png | Bin 67202 -> 35907 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/sources/docker-hub/hub-images/gh_add_ssh_user_key.png b/docs/sources/docker-hub/hub-images/gh_add_ssh_user_key.png index d3754d82653d2f1c249a555b6597b8423e0c131e..7d0092170f97ec2cb67089e54585dd120dcb5b3c 100644 GIT binary patch literal 38074 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 b0Ic)|W}r7?NZ9^e00000NkvXXu0mjfg%D!5 literal 83380 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]lL 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

2OlHL%TSx3dd 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 Xi6RW|92FZ(^aRODDoK=!83+FdhF+bF literal 48655 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%0Ah=whZ0c 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Ι}!_{^`ZZ1CD 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 literal 67202 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 Date: Thu, 19 Mar 2015 12:41:06 -0700 Subject: [PATCH 17/77] doc: reference/run introduce -it . Also: - Fix "docker" cmd always "sudo docker" for docs. - Fix "-ti" with "-it". - fix "/docker" typo. Signed-off-by: Lloyd Dewolf --- docs/sources/reference/run.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/sources/reference/run.md b/docs/sources/reference/run.md index 052a35823e..3c9c6a68d6 100644 --- a/docs/sources/reference/run.md +++ b/docs/sources/reference/run.md @@ -102,9 +102,10 @@ specify to which of the three standard streams (`STDIN`, `STDOUT`, $ sudo docker run -a stdin -a stdout -i -t ubuntu /bin/bash For interactive processes (like a shell), you must use `-i -t` together in -order to allocate a tty for the container process. Specifying `-t` is however -forbidden when the client standard output is redirected or pipe, such as in: -`echo test | docker run -i busybox cat`. +order to allocate a tty for the container process. `-i -t` is often written `-it` +as you'll see in later examples. Specifying `-t` is forbidden when the client +standard output is redirected or piped, such as in: +`echo test | sudo docker run -i busybox cat`. ## Container identification @@ -289,7 +290,7 @@ running the `redis-cli` command and connecting to the Redis server over the $ sudo docker run -d --name redis example/redis --bind 127.0.0.1 $ # use the redis container's network stack to access localhost - $ sudo docker run --rm -ti --net container:redis example/redis-cli -h 127.0.0.1 + $ sudo docker run --rm -it --net container:redis example/redis-cli -h 127.0.0.1 ### Managing /etc/hosts @@ -297,7 +298,7 @@ Your container will have lines in `/etc/hosts` which define the hostname of the container itself as well as `localhost` and a few other common things. The `--add-host` flag can be used to add additional lines to `/etc/hosts`. - $ /docker run -ti --add-host db-static:86.75.30.9 ubuntu cat /etc/hosts + $ sudo docker run -it --add-host db-static:86.75.30.9 ubuntu cat /etc/hosts 172.17.0.22 09d03f76bf2c fe00::0 ip6-localnet ff00::0 ip6-mcastprefix From 816d602059f9fd0e0df816c5a55e7f1dc437c8d9 Mon Sep 17 00:00:00 2001 From: Sachin Joshi Date: Thu, 19 Mar 2015 18:07:56 -0700 Subject: [PATCH 18/77] Reduce memory allocation and remove channels Signed-off-by: Sachin Joshi --- docker/docker.go | 8 +-- pkg/term/winconsole/console_windows.go | 70 ++++++++++++-------------- 2 files changed, 35 insertions(+), 43 deletions(-) diff --git a/docker/docker.go b/docker/docker.go index 1d2a45c9de..88a2fbae21 100644 --- a/docker/docker.go +++ b/docker/docker.go @@ -26,15 +26,15 @@ const ( ) func main() { + if reexec.Init() { + return + } + // Set terminal emulation based on platform as required. stdout, stderr, stdin := term.StdStreams() initLogging(stderr) - if reexec.Init() { - return - } - flag.Parse() // FIXME: validate daemon flags here diff --git a/pkg/term/winconsole/console_windows.go b/pkg/term/winconsole/console_windows.go index 859ee1a1de..f10b1e0f22 100644 --- a/pkg/term/winconsole/console_windows.go +++ b/pkg/term/winconsole/console_windows.go @@ -83,6 +83,7 @@ const ( ANSI_MAX_CMD_LENGTH = 256 + MAX_INPUT_EVENTS = 128 MAX_INPUT_BUFFER = 1024 DEFAULT_WIDTH = 80 DEFAULT_HEIGHT = 24 @@ -195,15 +196,18 @@ type ( type WindowsTerminal struct { outMutex sync.Mutex inMutex sync.Mutex - inputBuffer chan byte + inputBuffer []byte + inputSize int + inputEvents []INPUT_RECORD screenBufferInfo *CONSOLE_SCREEN_BUFFER_INFO inputEscapeSequence []byte } func StdStreams() (stdOut io.Writer, stdErr io.Writer, stdIn io.ReadCloser) { handler := &WindowsTerminal{ - inputBuffer: make(chan byte, MAX_INPUT_BUFFER), + inputBuffer: make([]byte, MAX_INPUT_BUFFER), inputEscapeSequence: []byte(KEY_ESC_CSI), + inputEvents: make([]INPUT_RECORD, MAX_INPUT_EVENTS), } // Save current screen buffer info @@ -218,6 +222,8 @@ func StdStreams() (stdOut io.Writer, stdErr io.Writer, stdIn io.ReadCloser) { // Set the window size SetWindowSize(uintptr(handle), DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_HEIGHT) + buffer = make([]CHAR_INFO, screenBufferInfo.MaximumWindowSize.X*screenBufferInfo.MaximumWindowSize.Y) + if IsTerminal(os.Stdout.Fd()) { stdOut = &terminalWriter{ wrappedWriter: os.Stdout, @@ -427,6 +433,8 @@ func getNumberOfChars(fromCoord COORD, toCoord COORD, screenSize COORD) uint32 { return 0 } +var buffer []CHAR_INFO + func clearDisplayRect(fileDesc uintptr, fillChar rune, attributes WORD, fromCoord COORD, toCoord COORD, windowSize COORD) (bool, uint32, error) { var writeRegion SMALL_RECT writeRegion.Top = fromCoord.Y @@ -439,14 +447,13 @@ func clearDisplayRect(fileDesc uintptr, fillChar rune, attributes WORD, fromCoor height := toCoord.Y - fromCoord.Y + 1 size := width * height if size > 0 { - buffer := make([]CHAR_INFO, size) - for i := 0; i < len(buffer); i++ { + for i := 0; i < int(size); i++ { buffer[i].UnicodeChar = WCHAR(fillChar) buffer[i].Attributes = attributes } // Write to buffer - r, err := writeConsoleOutput(fileDesc, buffer, windowSize, COORD{X: 0, Y: 0}, &writeRegion) + r, err := writeConsoleOutput(fileDesc, buffer[:size], windowSize, COORD{X: 0, Y: 0}, &writeRegion) if !r { if err != nil { return false, 0, err @@ -914,6 +921,9 @@ func (term *WindowsTerminal) HandleOutputCommand(fd uintptr, command []byte) (n // WriteChars writes the bytes to given writer. func (term *WindowsTerminal) WriteChars(fd uintptr, w io.Writer, p []byte) (n int, err error) { + if len(p) == 0 { + return 0, nil + } return w.Write(p) } @@ -1049,24 +1059,19 @@ func mapKeystokeToTerminalString(keyEvent *KEY_EVENT_RECORD, escapeSequence []by // getAvailableInputEvents polls the console for availble events // The function does not return until at least one input record has been read. -func getAvailableInputEvents(fd uintptr) (inputEvents []INPUT_RECORD, err error) { +func getAvailableInputEvents(fd uintptr, inputEvents []INPUT_RECORD) (n int, err error) { handle := syscall.Handle(fd) if nil != err { - return nil, err + return 0, err } for { // Read number of console events available - tempBuffer := make([]INPUT_RECORD, MAX_INPUT_BUFFER) - nr, err := readConsoleInputKey(uintptr(handle), tempBuffer) + nr, err := readConsoleInputKey(uintptr(handle), inputEvents) if nr == 0 { - return nil, err + return 0, err } if 0 < nr { - retValue := make([]INPUT_RECORD, nr) - for i := 0; i < nr; i++ { - retValue[i] = tempBuffer[i] - } - return retValue, nil + return nr, nil } } } @@ -1086,32 +1091,19 @@ func getTranslatedKeyCodes(inputEvents []INPUT_RECORD, escapeSequence []byte) st } // ReadChars reads the characters from the given reader -func (term *WindowsTerminal) ReadChars(fd uintptr, w io.Reader, p []byte) (n int, err error) { - n = 0 - for n < len(p) { - select { - case b := <-term.inputBuffer: - p[n] = b - n++ - default: - // Read at least one byte read - if n > 0 { - return n, nil - } - inputEvents, _ := getAvailableInputEvents(fd) - if inputEvents != nil { - if len(inputEvents) == 0 && nil != err { - return n, err - } - if len(inputEvents) != 0 { - keyCodes := getTranslatedKeyCodes(inputEvents, term.inputEscapeSequence) - for _, b := range []byte(keyCodes) { - term.inputBuffer <- b - } - } - } +func (term *WindowsTerminal) ReadChars(fd uintptr, r io.Reader, p []byte) (n int, err error) { + for term.inputSize == 0 { + nr, err := getAvailableInputEvents(fd, term.inputEvents) + if nr == 0 && nil != err { + return n, err + } + if nr > 0 { + keyCodes := getTranslatedKeyCodes(term.inputEvents[:nr], term.inputEscapeSequence) + term.inputSize = copy(term.inputBuffer, keyCodes) } } + n = copy(p, term.inputBuffer[:term.inputSize]) + term.inputSize -= n return n, nil } From 32efa559a3b643df117222e998b2d9ab550b0060 Mon Sep 17 00:00:00 2001 From: Sven Dowideit Date: Fri, 20 Mar 2015 14:09:30 +1000 Subject: [PATCH 19/77] Small copy edits Signed-off-by: Sven Dowideit --- docs/sources/docker-hub/builds.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/sources/docker-hub/builds.md b/docs/sources/docker-hub/builds.md index ac62e4f984..1613ad1d4b 100644 --- a/docs/sources/docker-hub/builds.md +++ b/docs/sources/docker-hub/builds.md @@ -67,11 +67,11 @@ If your GitHub repository contains links to private submodules, you'll get an error message in your build. Normally, the Docker Hub sets up a deploy key in your GitHub repository. -Unfortunately, GitHub only allows a deploy key to access one single repository. +Unfortunately, GitHub only allows a repository deploy key to access a single repository. -To work around this, we will be creating a dedicated user account in GitHub to -attach this key to. A key on a GitHub user account can be given read-only -access to all your repositories. +To work around this, you need to create a dedicated user account in GitHub and attach +the automated build's deploy key that account. This dedicated build account +can be limited to read-only access to just the repositories required to build. @@ -91,7 +91,7 @@ access to all your repositories. - From 72fa3fcaeacfcfebdad463d965ff1d6a3e95d516 Mon Sep 17 00:00:00 2001 From: Ahmet Alp Balkan Date: Mon, 16 Mar 2015 00:41:27 -0700 Subject: [PATCH 20/77] docs: Add Azure installation instructions Adding instructions that refers to the Microsoft Azure documentation on creating Docker-ready Linux VMs on Azure platform. Signed-off-by: Ahmet Alp Balkan --- docs/mkdocs.yml | 1 + docs/sources/installation/azure.md | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 docs/sources/installation/azure.md diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 49449f7843..2fe69421bb 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -45,6 +45,7 @@ pages: - ['installation/google.md', 'Installation', 'Google Cloud Platform'] - ['installation/gentoolinux.md', 'Installation', 'Gentoo'] - ['installation/softlayer.md', 'Installation', 'IBM Softlayer'] +- ['installation/azure.md', 'Installation', 'Microsoft Azure'] - ['installation/rackspace.md', 'Installation', 'Rackspace Cloud'] - ['installation/rhel.md', 'Installation', 'Red Hat Enterprise Linux'] - ['installation/oracle.md', 'Installation', 'Oracle Linux'] diff --git a/docs/sources/installation/azure.md b/docs/sources/installation/azure.md new file mode 100644 index 0000000000..a8e700fead --- /dev/null +++ b/docs/sources/installation/azure.md @@ -0,0 +1,27 @@ +page_title: Installation on Microsoft Azure Platform +page_description: Instructions for creating a Docker-ready virtual machine on Microsoft Azure cloud platform. +page_keywords: Docker, Docker documentation, installation, azure, microsoft + +# Microsoft Azure + + +## Creating a Docker host machine on Azure + +Please check out to the following detailed tutorials on [Microsoft Azure][0] +website to find out different ways to create a Docker-ready Linux virtual +machines on Azure: + +* [Docker Virtual Machine Extensions on Azure][1] + * [How to use the Docker VM Extension from Azure Cross-Platform Interface][2] + * [How to use the Docker VM Extension with the Azure Portal][3] +* [Using Docker Machine with Azure][4] + +## What next? + +Continue with the [User Guide](/userguide/). + +[0]: http://azure.microsoft.com/ +[1]: http://azure.microsoft.com/en-us/documentation/articles/virtual-machines-docker-vm-extension/ +[2]: http://azure.microsoft.com/documentation/articles/virtual-machines-docker-with-xplat-cli/ +[3]: http://azure.microsoft.com/documentation/articles/virtual-machines-docker-with-portal/ +[4]: http://azure.microsoft.com/en-us/documentation/articles/virtual-machines-docker-machine/ \ No newline at end of file From 301bd57b1d5ce78fe3e26f68c8f8f797abfbb5ca Mon Sep 17 00:00:00 2001 From: Doug Davis Date: Fri, 20 Mar 2015 05:36:34 -0700 Subject: [PATCH 21/77] Ignore blank lines in getCgroupPaths w/o this I would see: ``` unexpected file format for /proc/self/cgroup - "" ``` while running the cgroup tests Signed-off-by: Doug Davis --- integration-cli/docker_cli_run_unix_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/integration-cli/docker_cli_run_unix_test.go b/integration-cli/docker_cli_run_unix_test.go index e328b74848..6fe416f9d2 100644 --- a/integration-cli/docker_cli_run_unix_test.go +++ b/integration-cli/docker_cli_run_unix_test.go @@ -112,6 +112,10 @@ func TestRunWithUlimits(t *testing.T) { func getCgroupPaths(test string) map[string]string { cgroupPaths := map[string]string{} for _, line := range strings.Split(test, "\n") { + line = strings.TrimSpace(line) + if line == "" { + continue + } parts := strings.Split(line, ":") if len(parts) != 3 { fmt.Printf("unexpected file format for /proc/self/cgroup - %q\n", line) From b4beb0637a61c6002bb3b0b1dc150899db3b44e4 Mon Sep 17 00:00:00 2001 From: Doug Davis Date: Fri, 20 Mar 2015 05:14:31 -0700 Subject: [PATCH 22/77] Add LABEL config check to runconfig compare Without this we won't do a proper cacche check because we skip the labels part of the config. Signed-off-by: Doug Davis --- integration-cli/docker_cli_build_test.go | 19 +++++++++++++++++-- runconfig/compare.go | 6 ++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index 52132f175e..6a83595746 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -4585,14 +4585,29 @@ func TestBuildLabelsCache(t *testing.T) { `FROM busybox LABEL Vendor=Acme1`, true) if err != nil || id1 == id2 { - t.Fatalf("Build 2 should have worked & NOT used cache(%s,%s): %v", id1, id2, err) + t.Fatalf("Build 3 should have worked & NOT used cache(%s,%s): %v", id1, id2, err) } id2, err = buildImage(name, `FROM busybox LABEL Vendor Acme`, true) // Note: " " and "=" should be same if err != nil || id1 != id2 { - t.Fatalf("Build 3 should have worked & used cache(%s,%s): %v", id1, id2, err) + t.Fatalf("Build 4 should have worked & used cache(%s,%s): %v", id1, id2, err) + } + + // Now make sure the cache isn't used by mistake + id1, err = buildImage(name, + `FROM busybox + LABEL f1=b1 f2=b2`, false) + if err != nil { + t.Fatalf("Build 5 should have worked: %q", err) + } + + id2, err = buildImage(name, + `FROM busybox + LABEL f1="b1 f2=b2"`, true) + if err != nil || id1 == id2 { + t.Fatalf("Build 6 should have worked & NOT used the cache(%s,%s): %q", id1, id2, err) } logDone("build - label cache") diff --git a/runconfig/compare.go b/runconfig/compare.go index 5c1bf46575..60a21a79c0 100644 --- a/runconfig/compare.go +++ b/runconfig/compare.go @@ -19,6 +19,7 @@ func Compare(a, b *Config) bool { } if len(a.Cmd) != len(b.Cmd) || len(a.Env) != len(b.Env) || + len(a.Labels) != len(b.Labels) || len(a.PortSpecs) != len(b.PortSpecs) || len(a.ExposedPorts) != len(b.ExposedPorts) || len(a.Entrypoint) != len(b.Entrypoint) || @@ -36,6 +37,11 @@ func Compare(a, b *Config) bool { return false } } + for k, v := range a.Labels { + if v != b.Labels[k] { + return false + } + } for i := 0; i < len(a.PortSpecs); i++ { if a.PortSpecs[i] != b.PortSpecs[i] { return false From 0c0e9836c4bed0190718b0ddd0028790b19c200c Mon Sep 17 00:00:00 2001 From: Rik Nijessen Date: Sat, 28 Feb 2015 16:55:59 +0100 Subject: [PATCH 23/77] Implement cleanup unix sockets after serving. Signed-off-by: Rik Nijessen --- api/server/server.go | 5 +++++ api/server/server_linux.go | 26 ++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/api/server/server.go b/api/server/server.go index d244d2a0ce..72cd992697 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -1578,6 +1578,11 @@ func ServeApi(job *engine.Job) engine.Status { chErrors <- err return } + job.Eng.OnShutdown(func() { + if err := srv.Close(); err != nil { + log.Errorf("%s", err.Error()) + } + }) chErrors <- srv.Serve() }() } diff --git a/api/server/server_linux.go b/api/server/server_linux.go index fff803ddaf..217c051c17 100644 --- a/api/server/server_linux.go +++ b/api/server/server_linux.go @@ -10,8 +10,30 @@ import ( "github.com/docker/docker/engine" "github.com/docker/docker/pkg/systemd" + "net" ) +type UnixHttpServer struct { + srv *http.Server + l net.Listener +} + +func (s *UnixHttpServer) Serve() error { + return s.srv.Serve(s.l) +} +func (s *UnixHttpServer) Close() error { + if err := s.l.Close(); err != nil { + return err + } + if _, err := os.Stat(s.srv.Addr); err != nil { + return fmt.Errorf("Error removing unix socket %s: %s", s.srv.Addr, err.Error()) + } + if err := os.Remove(s.srv.Addr); err != nil { + return fmt.Errorf("Error removing unix socket %s: %s", s.srv.Addr, err.Error()) + } + return nil +} + // NewServer sets up the required Server and does protocol specific checking. func NewServer(proto, addr string, job *engine.Job) (Server, error) { // Basic error and sanity checking @@ -27,7 +49,7 @@ func NewServer(proto, addr string, job *engine.Job) (Server, error) { } } -func setupUnixHttp(addr string, job *engine.Job) (*HttpServer, error) { +func setupUnixHttp(addr string, job *engine.Job) (*UnixHttpServer, error) { r := createRouter(job.Eng, job.GetenvBool("Logging"), job.GetenvBool("EnableCors"), job.Getenv("CorsHeaders"), job.Getenv("Version")) if err := syscall.Unlink(addr); err != nil && !os.IsNotExist(err) { @@ -49,7 +71,7 @@ func setupUnixHttp(addr string, job *engine.Job) (*HttpServer, error) { return nil, err } - return &HttpServer{&http.Server{Addr: addr, Handler: r}, l}, nil + return &UnixHttpServer{&http.Server{Addr: addr, Handler: r}, l}, nil } // serveFd creates an http.Server and sets it up to serve given a socket activated From 16309bef6395a50ee2871780b81caed8bc6c498e Mon Sep 17 00:00:00 2001 From: Brian Goff Date: Wed, 18 Mar 2015 17:26:14 -0400 Subject: [PATCH 24/77] Add integration test for unix sock cleanup Signed-off-by: Brian Goff --- api/server/server.go | 7 +++-- api/server/server_linux.go | 26 ++---------------- docker/daemon.go | 7 ++--- engine/engine.go | 33 ++++++++++++----------- integration-cli/docker_cli_daemon_test.go | 28 +++++++++++++++++++ 5 files changed, 56 insertions(+), 45 deletions(-) diff --git a/api/server/server.go b/api/server/server.go index 72cd992697..5b84321ed2 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -1580,10 +1580,13 @@ func ServeApi(job *engine.Job) engine.Status { } job.Eng.OnShutdown(func() { if err := srv.Close(); err != nil { - log.Errorf("%s", err.Error()) + log.Error(err) } }) - chErrors <- srv.Serve() + if err = srv.Serve(); err != nil && strings.Contains(err.Error(), "use of closed network connection") { + err = nil + } + chErrors <- err }() } diff --git a/api/server/server_linux.go b/api/server/server_linux.go index 217c051c17..fff803ddaf 100644 --- a/api/server/server_linux.go +++ b/api/server/server_linux.go @@ -10,30 +10,8 @@ import ( "github.com/docker/docker/engine" "github.com/docker/docker/pkg/systemd" - "net" ) -type UnixHttpServer struct { - srv *http.Server - l net.Listener -} - -func (s *UnixHttpServer) Serve() error { - return s.srv.Serve(s.l) -} -func (s *UnixHttpServer) Close() error { - if err := s.l.Close(); err != nil { - return err - } - if _, err := os.Stat(s.srv.Addr); err != nil { - return fmt.Errorf("Error removing unix socket %s: %s", s.srv.Addr, err.Error()) - } - if err := os.Remove(s.srv.Addr); err != nil { - return fmt.Errorf("Error removing unix socket %s: %s", s.srv.Addr, err.Error()) - } - return nil -} - // NewServer sets up the required Server and does protocol specific checking. func NewServer(proto, addr string, job *engine.Job) (Server, error) { // Basic error and sanity checking @@ -49,7 +27,7 @@ func NewServer(proto, addr string, job *engine.Job) (Server, error) { } } -func setupUnixHttp(addr string, job *engine.Job) (*UnixHttpServer, error) { +func setupUnixHttp(addr string, job *engine.Job) (*HttpServer, error) { r := createRouter(job.Eng, job.GetenvBool("Logging"), job.GetenvBool("EnableCors"), job.Getenv("CorsHeaders"), job.Getenv("Version")) if err := syscall.Unlink(addr); err != nil && !os.IsNotExist(err) { @@ -71,7 +49,7 @@ func setupUnixHttp(addr string, job *engine.Job) (*UnixHttpServer, error) { return nil, err } - return &UnixHttpServer{&http.Server{Addr: addr, Handler: r}, l}, nil + return &HttpServer{&http.Server{Addr: addr, Handler: r}, l}, nil } // serveFd creates an http.Server and sets it up to serve given a socket activated diff --git a/docker/daemon.go b/docker/daemon.go index e3bd06d901..b2a985b221 100644 --- a/docker/daemon.go +++ b/docker/daemon.go @@ -186,8 +186,9 @@ func mainDaemon() { errAPI := <-serveAPIWait // If we have an error here it is unique to API (as daemonErr would have // exited the daemon process above) - if errAPI != nil { - log.Errorf("Shutting down due to ServeAPI error: %v", errAPI) - } eng.Shutdown() + if errAPI != nil { + log.Fatalf("Shutting down due to ServeAPI error: %v", errAPI) + } + } diff --git a/engine/engine.go b/engine/engine.go index e8286d89f7..84292ad2bd 100644 --- a/engine/engine.go +++ b/engine/engine.go @@ -46,18 +46,19 @@ func unregister(name string) { // It acts as a store for *containers*, and allows manipulation of these // containers by executing *jobs*. type Engine struct { - handlers map[string]Handler - catchall Handler - hack Hack // data for temporary hackery (see hack.go) - id string - Stdout io.Writer - Stderr io.Writer - Stdin io.Reader - Logging bool - tasks sync.WaitGroup - l sync.RWMutex // lock for shutdown - shutdown bool - onShutdown []func() // shutdown handlers + handlers map[string]Handler + catchall Handler + hack Hack // data for temporary hackery (see hack.go) + id string + Stdout io.Writer + Stderr io.Writer + Stdin io.Reader + Logging bool + tasks sync.WaitGroup + l sync.RWMutex // lock for shutdown + shutdownWait sync.WaitGroup + shutdown bool + onShutdown []func() // shutdown handlers } func (eng *Engine) Register(name string, handler Handler) error { @@ -143,6 +144,7 @@ func (eng *Engine) Job(name string, args ...string) *Job { func (eng *Engine) OnShutdown(h func()) { eng.l.Lock() eng.onShutdown = append(eng.onShutdown, h) + eng.shutdownWait.Add(1) eng.l.Unlock() } @@ -156,6 +158,7 @@ func (eng *Engine) Shutdown() { eng.l.Lock() if eng.shutdown { eng.l.Unlock() + eng.shutdownWait.Wait() return } eng.shutdown = true @@ -180,17 +183,15 @@ func (eng *Engine) Shutdown() { // Call shutdown handlers, if any. // Timeout after 10 seconds. - var wg sync.WaitGroup for _, h := range eng.onShutdown { - wg.Add(1) go func(h func()) { - defer wg.Done() h() + eng.shutdownWait.Done() }(h) } done := make(chan struct{}) go func() { - wg.Wait() + eng.shutdownWait.Wait() close(done) }() select { diff --git a/integration-cli/docker_cli_daemon_test.go b/integration-cli/docker_cli_daemon_test.go index 49b43c2f28..c515a63787 100644 --- a/integration-cli/docker_cli_daemon_test.go +++ b/integration-cli/docker_cli_daemon_test.go @@ -800,3 +800,31 @@ func TestDaemonDots(t *testing.T) { logDone("daemon - test dots on INFO") } + +func TestDaemonUnixSockCleanedUp(t *testing.T) { + d := NewDaemon(t) + dir, err := ioutil.TempDir("", "socket-cleanup-test") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dir) + + sockPath := filepath.Join(dir, "docker.sock") + if err := d.Start("--host", "unix://"+sockPath); err != nil { + t.Fatal(err) + } + + if _, err := os.Stat(sockPath); err != nil { + t.Fatal("socket does not exist") + } + + if err := d.Stop(); err != nil { + t.Fatal(err) + } + + if _, err := os.Stat(sockPath); err == nil || !os.IsNotExist(err) { + t.Fatal("unix socket is not cleaned up") + } + + logDone("daemon - unix socket is cleaned up") +} From 9ececa14ba860c9934d3cd8d3e704e53e828e22b Mon Sep 17 00:00:00 2001 From: Josh Hawn Date: Tue, 17 Mar 2015 23:45:30 -0700 Subject: [PATCH 25/77] Add verification of image manifest digests Docker-DCO-1.1-Signed-off-by: Josh Hawn (github: jlhawn) --- graph/manifest.go | 29 ++++++++++++++++++++++++++++- graph/pull.go | 7 +++++-- graph/push.go | 7 ++----- registry/session_v2.go | 30 +++++++++++++++++++++++++----- 4 files changed, 60 insertions(+), 13 deletions(-) diff --git a/graph/manifest.go b/graph/manifest.go index 75c2d9060b..3b1d825576 100644 --- a/graph/manifest.go +++ b/graph/manifest.go @@ -6,8 +6,10 @@ import ( "fmt" log "github.com/Sirupsen/logrus" + "github.com/docker/distribution/digest" "github.com/docker/docker/engine" "github.com/docker/docker/registry" + "github.com/docker/docker/utils" "github.com/docker/libtrust" ) @@ -16,7 +18,7 @@ import ( // contains no signatures by a trusted key for the name in the manifest, the // image is not considered verified. The parsed manifest object and a boolean // for whether the manifest is verified is returned. -func (s *TagStore) loadManifest(eng *engine.Engine, manifestBytes []byte) (*registry.ManifestData, bool, error) { +func (s *TagStore) loadManifest(eng *engine.Engine, manifestBytes []byte, dgst, ref string) (*registry.ManifestData, bool, error) { sig, err := libtrust.ParsePrettySignature(manifestBytes, "signatures") if err != nil { return nil, false, fmt.Errorf("error parsing payload: %s", err) @@ -32,6 +34,31 @@ func (s *TagStore) loadManifest(eng *engine.Engine, manifestBytes []byte) (*regi return nil, false, fmt.Errorf("error retrieving payload: %s", err) } + var manifestDigest digest.Digest + + if dgst != "" { + manifestDigest, err = digest.ParseDigest(dgst) + if err != nil { + return nil, false, fmt.Errorf("invalid manifest digest from registry: %s", err) + } + + dgstVerifier, err := digest.NewDigestVerifier(manifestDigest) + if err != nil { + return nil, false, fmt.Errorf("unable to verify manifest digest from registry: %s", err) + } + + dgstVerifier.Write(payload) + + if !dgstVerifier.Verified() { + computedDigest, _ := digest.FromBytes(payload) + return nil, false, fmt.Errorf("unable to verify manifest digest: registry has %q, computed %q", manifestDigest, computedDigest) + } + } + + if utils.DigestReference(ref) && ref != manifestDigest.String() { + return nil, false, fmt.Errorf("mismatching image manifest digest: got %q, expected %q", manifestDigest, ref) + } + var manifest registry.ManifestData if err := json.Unmarshal(payload, &manifest); err != nil { return nil, false, fmt.Errorf("error unmarshalling manifest: %s", err) diff --git a/graph/pull.go b/graph/pull.go index db46e519b1..c01152a248 100644 --- a/graph/pull.go +++ b/graph/pull.go @@ -430,12 +430,15 @@ func (s *TagStore) pullV2Repository(eng *engine.Engine, r *registry.Session, out func (s *TagStore) pullV2Tag(eng *engine.Engine, r *registry.Session, out io.Writer, endpoint *registry.Endpoint, repoInfo *registry.RepositoryInfo, tag string, sf *utils.StreamFormatter, parallel bool, auth *registry.RequestAuthorization) (bool, error) { log.Debugf("Pulling tag from V2 registry: %q", tag) + manifestBytes, manifestDigest, err := r.GetV2ImageManifest(endpoint, repoInfo.RemoteName, tag, auth) if err != nil { return false, err } - manifest, verified, err := s.loadManifest(eng, manifestBytes) + // loadManifest ensures that the manifest payload has the expected digest + // if the tag is a digest reference. + manifest, verified, err := s.loadManifest(eng, manifestBytes, manifestDigest, tag) if err != nil { return false, fmt.Errorf("error verifying manifest: %s", err) } @@ -605,7 +608,7 @@ func (s *TagStore) pullV2Tag(eng *engine.Engine, r *registry.Session, out io.Wri out.Write(sf.FormatStatus(utils.ImageReference(repoInfo.CanonicalName, tag), "The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.")) } - if len(manifestDigest) > 0 { + if manifestDigest != "" { out.Write(sf.FormatStatus("", "Digest: %s", manifestDigest)) } diff --git a/graph/push.go b/graph/push.go index 7bc79dc99e..5a4f0d1de9 100644 --- a/graph/push.go +++ b/graph/push.go @@ -1,7 +1,6 @@ package graph import ( - "bytes" "crypto/sha256" "encoding/json" "errors" @@ -432,14 +431,12 @@ func (s *TagStore) pushV2Repository(r *registry.Session, localRepo Repository, o log.Infof("Signed manifest for %s:%s using daemon's key: %s", repoInfo.LocalName, tag, s.trustKey.KeyID()) // push the manifest - digest, err := r.PutV2ImageManifest(endpoint, repoInfo.RemoteName, tag, bytes.NewReader(signedBody), auth) + digest, err := r.PutV2ImageManifest(endpoint, repoInfo.RemoteName, tag, signedBody, mBytes, auth) if err != nil { return err } - if len(digest) > 0 { - out.Write(sf.FormatStatus("", "Digest: %s", digest)) - } + out.Write(sf.FormatStatus("", "Digest: %s", digest)) } return nil } diff --git a/registry/session_v2.go b/registry/session_v2.go index c5bee11bc6..ec628ad115 100644 --- a/registry/session_v2.go +++ b/registry/session_v2.go @@ -1,6 +1,7 @@ package registry import ( + "bytes" "encoding/json" "fmt" "io" @@ -8,6 +9,7 @@ import ( "strconv" log "github.com/Sirupsen/logrus" + "github.com/docker/distribution/digest" "github.com/docker/docker/registry/v2" "github.com/docker/docker/utils" ) @@ -95,11 +97,12 @@ func (r *Session) GetV2ImageManifest(ep *Endpoint, imageName, tagName string, au return nil, "", utils.NewHTTPRequestError(fmt.Sprintf("Server error: %d trying to fetch for %s:%s", res.StatusCode, imageName, tagName), res) } - buf, err := ioutil.ReadAll(res.Body) + manifestBytes, err := ioutil.ReadAll(res.Body) if err != nil { return nil, "", fmt.Errorf("Error while reading the http response: %s", err) } - return buf, res.Header.Get(DockerDigestHeader), nil + + return manifestBytes, res.Header.Get(DockerDigestHeader), nil } // - Succeeded to head image blob (already exists) @@ -263,7 +266,7 @@ func (r *Session) PutV2ImageBlob(ep *Endpoint, imageName, sumType, sumStr string } // Finally Push the (signed) manifest of the blobs we've just pushed -func (r *Session) PutV2ImageManifest(ep *Endpoint, imageName, tagName string, manifestRdr io.Reader, auth *RequestAuthorization) (string, error) { +func (r *Session) PutV2ImageManifest(ep *Endpoint, imageName, tagName string, signedManifest, rawManifest []byte, auth *RequestAuthorization) (digest.Digest, error) { routeURL, err := getV2Builder(ep).BuildManifestURL(imageName, tagName) if err != nil { return "", err @@ -271,7 +274,7 @@ func (r *Session) PutV2ImageManifest(ep *Endpoint, imageName, tagName string, ma method := "PUT" log.Debugf("[registry] Calling %q %s", method, routeURL) - req, err := r.reqFactory.NewRequest(method, routeURL, manifestRdr) + req, err := r.reqFactory.NewRequest(method, routeURL, bytes.NewReader(signedManifest)) if err != nil { return "", err } @@ -297,7 +300,24 @@ func (r *Session) PutV2ImageManifest(ep *Endpoint, imageName, tagName string, ma return "", utils.NewHTTPRequestError(fmt.Sprintf("Server error: %d trying to push %s:%s manifest", res.StatusCode, imageName, tagName), res) } - return res.Header.Get(DockerDigestHeader), nil + hdrDigest, err := digest.ParseDigest(res.Header.Get(DockerDigestHeader)) + if err != nil { + return "", fmt.Errorf("invalid manifest digest from registry: %s", err) + } + + dgstVerifier, err := digest.NewDigestVerifier(hdrDigest) + if err != nil { + return "", fmt.Errorf("invalid manifest digest from registry: %s", err) + } + + dgstVerifier.Write(rawManifest) + + if !dgstVerifier.Verified() { + computedDigest, _ := digest.FromBytes(rawManifest) + return "", fmt.Errorf("unable to verify manifest digest: registry has %q, computed %q", hdrDigest, computedDigest) + } + + return hdrDigest, nil } type remoteTags struct { From 770e9b6b819b495a933b2f467bf768a1b785d5ad Mon Sep 17 00:00:00 2001 From: Derek McGowan Date: Tue, 3 Mar 2015 10:59:50 -0800 Subject: [PATCH 26/77] Enable v2 default push When pushing to the official registry, v2 push will be attempted first. If the v2 endpoint is unavailable, a push to v1 will occur. If a v2 push is started and failed, the push operation will fail. Pulling non-official images the official v2 registry is also enabled to pull the newly push images. When a pull of a v2 image fails, v1 will always be attempted. Signed-off-by: Derek McGowan (github: dmcgowan) --- graph/pull.go | 2 +- graph/push.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/graph/pull.go b/graph/pull.go index c01152a248..adad6f3239 100644 --- a/graph/pull.go +++ b/graph/pull.go @@ -74,7 +74,7 @@ func (s *TagStore) CmdPull(job *engine.Job) engine.Status { logName = utils.ImageReference(logName, tag) } - if len(repoInfo.Index.Mirrors) == 0 && ((repoInfo.Official && repoInfo.Index.Official) || endpoint.Version == registry.APIVersion2) { + if len(repoInfo.Index.Mirrors) == 0 && (repoInfo.Index.Official || endpoint.Version == registry.APIVersion2) { if repoInfo.Official { j := job.Eng.Job("trust_update_base") if err = j.Run(); err != nil { diff --git a/graph/push.go b/graph/push.go index 5a4f0d1de9..f86df6d0b3 100644 --- a/graph/push.go +++ b/graph/push.go @@ -539,7 +539,7 @@ func (s *TagStore) CmdPush(job *engine.Job) engine.Status { return job.Errorf("Repository does not exist: %s", repoInfo.LocalName) } - if endpoint.Version == registry.APIVersion2 { + if repoInfo.Index.Official || endpoint.Version == registry.APIVersion2 { err := s.pushV2Repository(r, localRepo, job.Stdout, repoInfo, tag, sf) if err == nil { return engine.StatusOK From 73b33db04b29a516bf8c50fbe646f563298fcfd9 Mon Sep 17 00:00:00 2001 From: Josh Hawn Date: Fri, 20 Mar 2015 12:10:06 -0700 Subject: [PATCH 27/77] Separate init blob upload Pushing a v2 image layer has two steps: - POST to get a new upload URL - PUT to that upload URL We were previously not checking the response code of the POST request and the PUT would fail in weird ways. Docker-DCO-1.1-Signed-off-by: Josh Hawn (github: jlhawn) --- registry/session_v2.go | 67 ++++++++++++++++++++++++++++++------------ 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/registry/session_v2.go b/registry/session_v2.go index c5bee11bc6..b10b15e7ed 100644 --- a/registry/session_v2.go +++ b/registry/session_v2.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "io/ioutil" + "net/http" "strconv" log "github.com/Sirupsen/logrus" @@ -209,29 +210,14 @@ func (r *Session) GetV2ImageBlobReader(ep *Endpoint, imageName, sumType, sum str // 'layer' is an uncompressed reader of the blob to be pushed. // The server will generate it's own checksum calculation. func (r *Session) PutV2ImageBlob(ep *Endpoint, imageName, sumType, sumStr string, blobRdr io.Reader, auth *RequestAuthorization) error { - routeURL, err := getV2Builder(ep).BuildBlobUploadURL(imageName) + location, err := r.initiateBlobUpload(ep, imageName, auth) if err != nil { return err } - log.Debugf("[registry] Calling %q %s", "POST", routeURL) - req, err := r.reqFactory.NewRequest("POST", routeURL, nil) - if err != nil { - return err - } - - if err := auth.Authorize(req); err != nil { - return err - } - res, _, err := r.doRequest(req) - if err != nil { - return err - } - location := res.Header.Get("Location") - method := "PUT" log.Debugf("[registry] Calling %q %s", method, location) - req, err = r.reqFactory.NewRequest(method, location, ioutil.NopCloser(blobRdr)) + req, err := r.reqFactory.NewRequest(method, location, ioutil.NopCloser(blobRdr)) if err != nil { return err } @@ -241,7 +227,7 @@ func (r *Session) PutV2ImageBlob(ep *Endpoint, imageName, sumType, sumStr string if err := auth.Authorize(req); err != nil { return err } - res, _, err = r.doRequest(req) + res, _, err := r.doRequest(req) if err != nil { return err } @@ -262,6 +248,51 @@ func (r *Session) PutV2ImageBlob(ep *Endpoint, imageName, sumType, sumStr string return nil } +// initiateBlobUpload gets the blob upload location for the given image name. +func (r *Session) initiateBlobUpload(ep *Endpoint, imageName string, auth *RequestAuthorization) (location string, err error) { + routeURL, err := getV2Builder(ep).BuildBlobUploadURL(imageName) + if err != nil { + return "", err + } + + log.Debugf("[registry] Calling %q %s", "POST", routeURL) + req, err := r.reqFactory.NewRequest("POST", routeURL, nil) + if err != nil { + return "", err + } + + if err := auth.Authorize(req); err != nil { + return "", err + } + res, _, err := r.doRequest(req) + if err != nil { + return "", err + } + + if res.StatusCode != http.StatusAccepted { + if res.StatusCode == http.StatusUnauthorized { + return "", errLoginRequired + } + if res.StatusCode == http.StatusNotFound { + return "", ErrDoesNotExist + } + + errBody, err := ioutil.ReadAll(res.Body) + if err != nil { + return "", err + } + + log.Debugf("Unexpected response from server: %q %#v", errBody, res.Header) + return "", utils.NewHTTPRequestError(fmt.Sprintf("Server error: unexpected %d response status trying to initiate upload of %s", res.StatusCode, imageName), res) + } + + if location = res.Header.Get("Location"); location == "" { + return "", fmt.Errorf("registry did not return a Location header for resumable blob upload for image %s", imageName) + } + + return +} + // Finally Push the (signed) manifest of the blobs we've just pushed func (r *Session) PutV2ImageManifest(ep *Endpoint, imageName, tagName string, manifestRdr io.Reader, auth *RequestAuthorization) (string, error) { routeURL, err := getV2Builder(ep).BuildManifestURL(imageName, tagName) From 4a8b3cad6096854027151dfbcfb4b2cd8841ad95 Mon Sep 17 00:00:00 2001 From: Ahmet Alp Balkan Date: Mon, 16 Mar 2015 06:59:10 +0000 Subject: [PATCH 28/77] Add cli build warning about chmod bits on windows This shows a warning message about adjusted file/directory permission bits when the `docker build` cli command is executed on windows. Signed-off-by: Ahmet Alp Balkan --- api/client/commands.go | 7 +++++++ integration-cli/docker_cli_build_test.go | 15 +++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/api/client/commands.go b/api/client/commands.go index e10bee3b18..e9745b71a9 100644 --- a/api/client/commands.go +++ b/api/client/commands.go @@ -227,6 +227,13 @@ func (cli *DockerCli) CmdBuild(args ...string) error { return err } } + + // windows: show error message about modified file permissions + // FIXME: this is not a valid warning when the daemon is running windows. should be removed once docker engine for windows can build. + if runtime.GOOS == "windows" { + log.Warn(`SECURITY WARNING: You are building a Docker image from Windows against a Linux Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.`) + } + var body io.Reader // Setup an upload progress bar // FIXME: ProgressReader shouldn't be this annoying to use diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index ecef76f9da..a323883b4c 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -4551,8 +4551,19 @@ func TestBuildStderr(t *testing.T) { if err != nil { t.Fatal(err) } - if stderr != "" { - t.Fatalf("Stderr should have been empty, instead its: %q", stderr) + + if runtime.GOOS == "windows" { + // stderr might contain a security warning on windows + lines := strings.Split(stderr, "\n") + for _, v := range lines { + if v != "" && !strings.Contains(v, "SECURITY WARNING:") { + t.Fatalf("Stderr contains unexpected output line: %q", v) + } + } + } else { + if stderr != "" { + t.Fatalf("Stderr should have been empty, instead its: %q", stderr) + } } logDone("build - testing stderr") } From 19e3db35039ae80409623266906093b2314bd970 Mon Sep 17 00:00:00 2001 From: Casey Bisson Date: Fri, 20 Mar 2015 14:44:24 -0700 Subject: [PATCH 29/77] updated text per recommendations in https://github.com/docker/docker/pull/11062#issuecomment-82435939 Signed-off-by: Casey Bisson --- docs/mkdocs.yml | 1 + docs/sources/installation/joyent.md | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 49449f7843..710359d3d6 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -45,6 +45,7 @@ pages: - ['installation/google.md', 'Installation', 'Google Cloud Platform'] - ['installation/gentoolinux.md', 'Installation', 'Gentoo'] - ['installation/softlayer.md', 'Installation', 'IBM Softlayer'] +- ['installation/joyent.md', 'Installation', 'Joyent Compute Service'] - ['installation/rackspace.md', 'Installation', 'Rackspace Cloud'] - ['installation/rhel.md', 'Installation', 'Red Hat Enterprise Linux'] - ['installation/oracle.md', 'Installation', 'Oracle Linux'] diff --git a/docs/sources/installation/joyent.md b/docs/sources/installation/joyent.md index e3f0208144..daa33b7996 100644 --- a/docs/sources/installation/joyent.md +++ b/docs/sources/installation/joyent.md @@ -1,18 +1,23 @@ -page_title: Installation on Joyent Public Cloud +page_title: Install on Joyent Public Cloud page_description: Installation instructions for Docker on the Joyent Compute Service. page_keywords: Docker, Docker documentation, installation, joyent, Joyent Public Cloud, Joyent Compute Service, Joyent Container Service -# Joyent Compute Service +## Install on Joyent Public Cloud -## Docker QuickStart +1. Sign in to the [Joyent customer portal](https://my.joyent.com/) -1. Sign in to the [Joyent customer portal](https://my.joyent.com/) and [create a Docker host](https://docs.joyent.com/jpc/managing-docker-containers/creating-a-docker-host). -1. Start and manage containers: - 1. [Start containers in the web UI](https://docs.joyent.com/jpc/managing-docker-containers/starting-a-container) - 1. SSH into the Docker host and launch containers using the Docker CLI - 1. [Configure the Docker CLI on your laptop](https://docs.joyent.com/jpc/managing-docker-containers/access-your-jpc-docker-hosts-from-the-docker-cli) to connect to the remote host to launch and manage containers. +2. [Create a Docker host](https://docs.joyent.com/jpc/managing-docker-containers/creating-a-docker-host). -## What next? +## Start and manage containers -Continue with the [Docker user guide](/userguide/), read Joyent's [getting started blog post](https://www.joyent.com/blog/first-steps-with-joyents-container-service), and [full documentation](https://docs.joyent.com/jpc/managing-docker-containers). +1. [Start containers in the web UI](https://docs.joyent.com/jpc/managing-docker-containers/starting-a-container) +2. [Configure the Docker CLI on your laptop](https://docs.joyent.com/jpc/managing-docker-containers/access-your-jpc-docker-hosts-from-the-docker-cli) to connect to the remote host to launch and manage containers. + +3. SSH into the Docker host. + +4. Launch containers using the Docker CLI. + +## Where to go next + +Continue with the [Docker user guide](/userguide/), read Joyent's [getting started blog post](https://www.joyent.com/blog/first-steps-with-joyents-container-service), and [full documentation](https://docs.joyent.com/jpc/managing-docker-containers). \ No newline at end of file From fe21c7a4bebd5d6d0065e0529d03a03723fc697b Mon Sep 17 00:00:00 2001 From: Todd Whiteman Date: Fri, 20 Mar 2015 14:46:42 -0700 Subject: [PATCH 30/77] docs: cli: reorder rename command to be in alphabetical order Signed-off-by: Todd Whiteman --- docs/sources/reference/commandline/cli.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/sources/reference/commandline/cli.md b/docs/sources/reference/commandline/cli.md index 322f5f401e..93be377baf 100644 --- a/docs/sources/reference/commandline/cli.md +++ b/docs/sources/reference/commandline/cli.md @@ -1514,14 +1514,6 @@ just a specific mapping: $ sudo docker port test 7890 0.0.0.0:4321 -## rename - - Usage: docker rename OLD_NAME NEW_NAME - - rename a existing container to a NEW_NAME - -The `docker rename` command allows the container to be renamed to a different name. - ## ps Usage: docker ps [OPTIONS] @@ -1617,6 +1609,14 @@ use `docker pull`: Use `docker push` to share your images to the [Docker Hub](https://hub.docker.com) registry or to a self-hosted one. +## rename + + Usage: docker rename OLD_NAME NEW_NAME + + rename a existing container to a NEW_NAME + +The `docker rename` command allows the container to be renamed to a different name. + ## restart Usage: docker restart [OPTIONS] CONTAINER [CONTAINER...] From a7639c2e1f377b1f5903bb6435473cba4db6522f Mon Sep 17 00:00:00 2001 From: Vishnu Kannan Date: Fri, 20 Mar 2015 22:32:40 +0000 Subject: [PATCH 31/77] Remove debug log line from cgroup-parent feature e2e test. Docker-DCO-1.1-Signed-off-by: Vishnu Kannan (github: vishh) --- integration-cli/docker_cli_run_unix_test.go | 23 +++------------------ integration-cli/utils.go | 14 +++++++++++++ 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/integration-cli/docker_cli_run_unix_test.go b/integration-cli/docker_cli_run_unix_test.go index 6fe416f9d2..9327ac240a 100644 --- a/integration-cli/docker_cli_run_unix_test.go +++ b/integration-cli/docker_cli_run_unix_test.go @@ -109,23 +109,6 @@ func TestRunWithUlimits(t *testing.T) { logDone("run - ulimits are set") } -func getCgroupPaths(test string) map[string]string { - cgroupPaths := map[string]string{} - for _, line := range strings.Split(test, "\n") { - line = strings.TrimSpace(line) - if line == "" { - continue - } - parts := strings.Split(line, ":") - if len(parts) != 3 { - fmt.Printf("unexpected file format for /proc/self/cgroup - %q\n", line) - continue - } - cgroupPaths[parts[1]] = parts[2] - } - return cgroupPaths -} - func TestRunContainerWithCgroupParent(t *testing.T) { testRequires(t, NativeExecDriver) defer deleteAllContainers() @@ -135,7 +118,7 @@ func TestRunContainerWithCgroupParent(t *testing.T) { if err != nil { t.Fatalf("failed to read '/proc/self/cgroup - %v", err) } - selfCgroupPaths := getCgroupPaths(string(data)) + selfCgroupPaths := parseCgroupPaths(string(data)) selfCpuCgroup, found := selfCgroupPaths["memory"] if !found { t.Fatalf("unable to find self cpu cgroup path. CgroupsPath: %v", selfCgroupPaths) @@ -145,7 +128,7 @@ func TestRunContainerWithCgroupParent(t *testing.T) { if err != nil { t.Fatalf("unexpected failure when running container with --cgroup-parent option - %s\n%v", string(out), err) } - cgroupPaths := getCgroupPaths(string(out)) + cgroupPaths := parseCgroupPaths(string(out)) if len(cgroupPaths) == 0 { t.Fatalf("unexpected output - %q", string(out)) } @@ -173,7 +156,7 @@ func TestRunContainerWithCgroupParentAbsPath(t *testing.T) { if err != nil { t.Fatalf("unexpected failure when running container with --cgroup-parent option - %s\n%v", string(out), err) } - cgroupPaths := getCgroupPaths(string(out)) + cgroupPaths := parseCgroupPaths(string(out)) if len(cgroupPaths) == 0 { t.Fatalf("unexpected output - %q", string(out)) } diff --git a/integration-cli/utils.go b/integration-cli/utils.go index 691402f35e..7560854989 100644 --- a/integration-cli/utils.go +++ b/integration-cli/utils.go @@ -328,3 +328,17 @@ func consumeWithSpeed(reader io.Reader, chunkSize int, interval time.Duration, s } } } + +// Parses 'procCgroupData', which is output of '/proc//cgroup', and returns +// a map which cgroup name as key and path as value. +func parseCgroupPaths(procCgroupData string) map[string]string { + cgroupPaths := map[string]string{} + for _, line := range strings.Split(procCgroupData, "\n") { + parts := strings.Split(line, ":") + if len(parts) != 3 { + continue + } + cgroupPaths[parts[1]] = parts[2] + } + return cgroupPaths +} From 6d66e3e7a5ecb021a9e89c4f85fadecf23e2000c Mon Sep 17 00:00:00 2001 From: Doug Davis Date: Wed, 28 Jan 2015 18:28:48 -0800 Subject: [PATCH 32/77] Fix some escaping around env var processing Clarify in the docs that ENV is not recursive Closes #10391 Signed-off-by: Doug Davis --- builder/evaluator.go | 6 +- builder/parser/line_parsers.go | 15 +- builder/parser/testfiles/env/Dockerfile | 8 + builder/parser/testfiles/env/result | 18 +- builder/shell_parser.go | 209 +++++++++++++++++++++++ builder/shell_parser_test.go | 51 ++++++ builder/support.go | 41 ----- builder/words | 43 +++++ docs/sources/reference/builder.md | 11 ++ integration-cli/docker_cli_build_test.go | 66 +++++-- 10 files changed, 402 insertions(+), 66 deletions(-) create mode 100644 builder/shell_parser.go create mode 100644 builder/shell_parser_test.go create mode 100644 builder/words diff --git a/builder/evaluator.go b/builder/evaluator.go index 985656f16a..ba2726084d 100644 --- a/builder/evaluator.go +++ b/builder/evaluator.go @@ -302,7 +302,11 @@ func (b *Builder) dispatch(stepN int, ast *parser.Node) error { var str string str = ast.Value if _, ok := replaceEnvAllowed[cmd]; ok { - str = b.replaceEnv(ast.Value) + var err error + str, err = ProcessWord(ast.Value, b.Config.Env) + if err != nil { + return err + } } strList[i+l] = str msgList[i] = ast.Value diff --git a/builder/parser/line_parsers.go b/builder/parser/line_parsers.go index 45c929ee69..3026a0b06d 100644 --- a/builder/parser/line_parsers.go +++ b/builder/parser/line_parsers.go @@ -90,7 +90,7 @@ func parseNameVal(rest string, key string) (*Node, map[string]bool, error) { if blankOK || len(word) > 0 { words = append(words, word) - // Look for = and if no there assume + // Look for = and if not there assume // we're doing the old stuff and // just read the rest of the line if !strings.Contains(word, "=") { @@ -107,12 +107,15 @@ func parseNameVal(rest string, key string) (*Node, map[string]bool, error) { quote = ch blankOK = true phase = inQuote - continue } if ch == '\\' { if pos+1 == len(rest) { continue // just skip \ at end } + // If we're not quoted and we see a \, then always just + // add \ plus the char to the word, even if the char + // is a quote. + word += string(ch) pos++ ch = rune(rest[pos]) } @@ -122,15 +125,17 @@ func parseNameVal(rest string, key string) (*Node, map[string]bool, error) { if phase == inQuote { if ch == quote { phase = inWord - continue } - if ch == '\\' { + // \ is special except for ' quotes - can't escape anything for ' + if ch == '\\' && quote != '\'' { if pos+1 == len(rest) { phase = inWord continue // just skip \ at end } pos++ - ch = rune(rest[pos]) + nextCh := rune(rest[pos]) + word += string(ch) + ch = nextCh } word += string(ch) } diff --git a/builder/parser/testfiles/env/Dockerfile b/builder/parser/testfiles/env/Dockerfile index bb78503cce..08fa18acec 100644 --- a/builder/parser/testfiles/env/Dockerfile +++ b/builder/parser/testfiles/env/Dockerfile @@ -7,6 +7,14 @@ ENV name=value\ value2 ENV name="value'quote space'value2" ENV name='value"double quote"value2' ENV name=value\ value2 name2=value2\ value3 +ENV name="a\"b" +ENV name="a\'b" +ENV name='a\'b' +ENV name='a\'b'' +ENV name='a\"b' +ENV name="''" +# don't put anything after the next line - it must be the last line of the +# Dockerfile and it must end with \ ENV name=value \ name1=value1 \ name2="value2a \ diff --git a/builder/parser/testfiles/env/result b/builder/parser/testfiles/env/result index a473d0fa39..ba0a6dd7cb 100644 --- a/builder/parser/testfiles/env/result +++ b/builder/parser/testfiles/env/result @@ -2,9 +2,15 @@ (env "name" "value") (env "name" "value") (env "name" "value" "name2" "value2") -(env "name" "value value1") -(env "name" "value value2") -(env "name" "value'quote space'value2") -(env "name" "value\"double quote\"value2") -(env "name" "value value2" "name2" "value2 value3") -(env "name" "value" "name1" "value1" "name2" "value2a value2b" "name3" "value3an\"value3b\"" "name4" "value4a\\nvalue4b") +(env "name" "\"value value1\"") +(env "name" "value\\ value2") +(env "name" "\"value'quote space'value2\"") +(env "name" "'value\"double quote\"value2'") +(env "name" "value\\ value2" "name2" "value2\\ value3") +(env "name" "\"a\\\"b\"") +(env "name" "\"a\\'b\"") +(env "name" "'a\\'b'") +(env "name" "'a\\'b''") +(env "name" "'a\\\"b'") +(env "name" "\"''\"") +(env "name" "value" "name1" "value1" "name2" "\"value2a value2b\"" "name3" "\"value3a\\n\\\"value3b\\\"\"" "name4" "\"value4a\\\\nvalue4b\"") diff --git a/builder/shell_parser.go b/builder/shell_parser.go new file mode 100644 index 0000000000..b8c746773c --- /dev/null +++ b/builder/shell_parser.go @@ -0,0 +1,209 @@ +package builder + +// This will take a single word and an array of env variables and +// process all quotes (" and ') as well as $xxx and ${xxx} env variable +// tokens. Tries to mimic bash shell process. +// It doesn't support all flavors of ${xx:...} formats but new ones can +// be added by adding code to the "special ${} format processing" section + +import ( + "fmt" + "strings" + "unicode" +) + +type shellWord struct { + word string + envs []string + pos int +} + +func ProcessWord(word string, env []string) (string, error) { + sw := &shellWord{ + word: word, + envs: env, + pos: 0, + } + return sw.process() +} + +func (sw *shellWord) process() (string, error) { + return sw.processStopOn('\000') +} + +// Process the word, starting at 'pos', and stop when we get to the +// end of the word or the 'stopChar' character +func (sw *shellWord) processStopOn(stopChar rune) (string, error) { + var result string + var charFuncMapping = map[rune]func() (string, error){ + '\'': sw.processSingleQuote, + '"': sw.processDoubleQuote, + '$': sw.processDollar, + } + + for sw.pos < len(sw.word) { + ch := sw.peek() + if stopChar != '\000' && ch == stopChar { + sw.next() + break + } + if fn, ok := charFuncMapping[ch]; ok { + // Call special processing func for certain chars + tmp, err := fn() + if err != nil { + return "", err + } + result += tmp + } else { + // Not special, just add it to the result + ch = sw.next() + if ch == '\\' { + // '\' escapes, except end of line + ch = sw.next() + if ch == '\000' { + continue + } + } + result += string(ch) + } + } + + return result, nil +} + +func (sw *shellWord) peek() rune { + if sw.pos == len(sw.word) { + return '\000' + } + return rune(sw.word[sw.pos]) +} + +func (sw *shellWord) next() rune { + if sw.pos == len(sw.word) { + return '\000' + } + ch := rune(sw.word[sw.pos]) + sw.pos++ + return ch +} + +func (sw *shellWord) processSingleQuote() (string, error) { + // All chars between single quotes are taken as-is + // Note, you can't escape ' + var result string + + sw.next() + + for { + ch := sw.next() + if ch == '\000' || ch == '\'' { + break + } + result += string(ch) + } + return result, nil +} + +func (sw *shellWord) processDoubleQuote() (string, error) { + // All chars up to the next " are taken as-is, even ', except any $ chars + // But you can escape " with a \ + var result string + + sw.next() + + for sw.pos < len(sw.word) { + ch := sw.peek() + if ch == '"' { + sw.next() + break + } + if ch == '$' { + tmp, err := sw.processDollar() + if err != nil { + return "", err + } + result += tmp + } else { + ch = sw.next() + if ch == '\\' { + chNext := sw.peek() + + if chNext == '\000' { + // Ignore \ at end of word + continue + } + + if chNext == '"' || chNext == '$' { + // \" and \$ can be escaped, all other \'s are left as-is + ch = sw.next() + } + } + result += string(ch) + } + } + + return result, nil +} + +func (sw *shellWord) processDollar() (string, error) { + sw.next() + ch := sw.peek() + if ch == '{' { + sw.next() + name := sw.processName() + ch = sw.peek() + if ch == '}' { + // Normal ${xx} case + sw.next() + return sw.getEnv(name), nil + } + return "", fmt.Errorf("Unsupported ${} substitution: %s", sw.word) + } else { + // $xxx case + name := sw.processName() + if name == "" { + return "$", nil + } + return sw.getEnv(name), nil + } +} + +func (sw *shellWord) processName() string { + // Read in a name (alphanumeric or _) + // If it starts with a numeric then just return $# + var name string + + for sw.pos < len(sw.word) { + ch := sw.peek() + if len(name) == 0 && unicode.IsDigit(ch) { + ch = sw.next() + return string(ch) + } + if !unicode.IsLetter(ch) && !unicode.IsDigit(ch) && ch != '_' { + break + } + ch = sw.next() + name += string(ch) + } + + return name +} + +func (sw *shellWord) getEnv(name string) string { + for _, env := range sw.envs { + i := strings.Index(env, "=") + if i < 0 { + if name == env { + // Should probably never get here, but just in case treat + // it like "var" and "var=" are the same + return "" + } + continue + } + if name != env[:i] { + continue + } + return env[i+1:] + } + return "" +} diff --git a/builder/shell_parser_test.go b/builder/shell_parser_test.go new file mode 100644 index 0000000000..79260492f3 --- /dev/null +++ b/builder/shell_parser_test.go @@ -0,0 +1,51 @@ +package builder + +import ( + "bufio" + "os" + "strings" + "testing" +) + +func TestShellParser(t *testing.T) { + file, err := os.Open("words") + if err != nil { + t.Fatalf("Can't open 'words': %s", err) + } + defer file.Close() + + scanner := bufio.NewScanner(file) + envs := []string{"PWD=/home", "SHELL=bash"} + for scanner.Scan() { + line := scanner.Text() + + // Trim comments and blank lines + i := strings.Index(line, "#") + if i >= 0 { + line = line[:i] + } + line = strings.TrimSpace(line) + + if line == "" { + continue + } + + words := strings.Split(line, "|") + if len(words) != 2 { + t.Fatalf("Error in 'words' - should be 2 words:%q", words) + } + + words[0] = strings.TrimSpace(words[0]) + words[1] = strings.TrimSpace(words[1]) + + newWord, err := ProcessWord(words[0], envs) + + if err != nil { + newWord = "error" + } + + if newWord != words[1] { + t.Fatalf("Error. Src: %s Calc: %s Expected: %s", words[0], newWord, words[1]) + } + } +} diff --git a/builder/support.go b/builder/support.go index 6833457f3a..787ff10ccb 100644 --- a/builder/support.go +++ b/builder/support.go @@ -1,50 +1,9 @@ package builder import ( - "regexp" "strings" ) -var ( - // `\\\\+|[^\\]|\b|\A` - match any number of "\\" (ie, properly-escaped backslashes), or a single non-backslash character, or a word boundary, or beginning-of-line - // `\$` - match literal $ - // `[[:alnum:]_]+` - match things like `$SOME_VAR` - // `{[[:alnum:]_]+}` - match things like `${SOME_VAR}` - tokenEnvInterpolation = regexp.MustCompile(`(\\|\\\\+|[^\\]|\b|\A)\$([[:alnum:]_]+|{[[:alnum:]_]+})`) - // this intentionally punts on more exotic interpolations like ${SOME_VAR%suffix} and lets the shell handle those directly -) - -// handle environment replacement. Used in dispatcher. -func (b *Builder) replaceEnv(str string) string { - for _, match := range tokenEnvInterpolation.FindAllString(str, -1) { - idx := strings.Index(match, "\\$") - if idx != -1 { - if idx+2 >= len(match) { - str = strings.Replace(str, match, "\\$", -1) - continue - } - - prefix := match[:idx] - stripped := match[idx+2:] - str = strings.Replace(str, match, prefix+"$"+stripped, -1) - continue - } - - match = match[strings.Index(match, "$"):] - matchKey := strings.Trim(match, "${}") - - for _, keyval := range b.Config.Env { - tmp := strings.SplitN(keyval, "=", 2) - if tmp[0] == matchKey { - str = strings.Replace(str, match, tmp[1], -1) - break - } - } - } - - return str -} - func handleJsonArgs(args []string, attributes map[string]bool) []string { if len(args) == 0 { return []string{} diff --git a/builder/words b/builder/words new file mode 100644 index 0000000000..2148f72537 --- /dev/null +++ b/builder/words @@ -0,0 +1,43 @@ +hello | hello +he'll'o | hello +he'llo | hello +he\'llo | he'llo +he\\'llo | he\llo +abc\tdef | abctdef +"abc\tdef" | abc\tdef +'abc\tdef' | abc\tdef +hello\ | hello +hello\\ | hello\ +"hello | hello +"hello\" | hello" +"hel'lo" | hel'lo +'hello | hello +'hello\' | hello\ +"''" | '' +$. | $. +$1 | +he$1x | hex +he$.x | he$.x +he$pwd. | he. +he$PWD | he/home +he\$PWD | he$PWD +he\\$PWD | he\/home +he\${} | he${} +he\${}xx | he${}xx +he${} | he +he${}xx | hexx +he${hi} | he +he${hi}xx | hexx +he${PWD} | he/home +he${.} | error +'he${XX}' | he${XX} +"he${PWD}" | he/home +"he'$PWD'" | he'/home' +"$PWD" | /home +'$PWD' | $PWD +'\$PWD' | \$PWD +'"hello"' | "hello" +he\$PWD | he$PWD +"he\$PWD" | he$PWD +'he\$PWD' | he\$PWD +he${PWD | error diff --git a/docs/sources/reference/builder.md b/docs/sources/reference/builder.md index 6955d31e0e..9e56abf639 100644 --- a/docs/sources/reference/builder.md +++ b/docs/sources/reference/builder.md @@ -146,6 +146,17 @@ The instructions that handle environment variables in the `Dockerfile` are: `ONBUILD` instructions are **NOT** supported for environment replacement, even the instructions above. +Environment variable subtitution will use the same value for each variable +throughout the entire command. In other words, in this example: + + ENV abc=hello + ENV abc=bye def=$abc + ENV ghi=$abc + +will result in `def` having a value of `hello`, not `bye`. However, +`ghi` will have a value of `bye` because it is not part of the same command +that set `abc` to `bye`. + ## The `.dockerignore` file If a file named `.dockerignore` exists in the source repository, then it diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index c83759d75a..6e78c59adb 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -239,9 +239,18 @@ func TestBuildEnvironmentReplacementEnv(t *testing.T) { _, err := buildImage(name, ` - FROM scratch - ENV foo foo + FROM busybox + ENV foo zzz ENV bar ${foo} + ENV abc1='$foo' + ENV env1=$foo env2=${foo} env3="$foo" env4="${foo}" + RUN [ "$abc1" = '$foo' ] && (echo "$abc1" | grep -q foo) + ENV abc2="\$foo" + RUN [ "$abc2" = '$foo' ] && (echo "$abc2" | grep -q foo) + ENV abc3 '$foo' + RUN [ "$abc3" = '$foo' ] && (echo "$abc3" | grep -q foo) + ENV abc4 "\$foo" + RUN [ "$abc4" = '$foo' ] && (echo "$abc4" | grep -q foo) `, true) if err != nil { @@ -260,13 +269,19 @@ func TestBuildEnvironmentReplacementEnv(t *testing.T) { } found := false + envCount := 0 for _, env := range envResult { parts := strings.SplitN(env, "=", 2) if parts[0] == "bar" { found = true - if parts[1] != "foo" { - t.Fatalf("Could not find replaced var for env `bar`: got %q instead of `foo`", parts[1]) + if parts[1] != "zzz" { + t.Fatalf("Could not find replaced var for env `bar`: got %q instead of `zzz`", parts[1]) + } + } else if strings.HasPrefix(parts[0], "env") { + envCount++ + if parts[1] != "zzz" { + t.Fatalf("%s should be 'foo' but instead its %q", parts[0], parts[1]) } } } @@ -275,6 +290,10 @@ func TestBuildEnvironmentReplacementEnv(t *testing.T) { t.Fatal("Never found the `bar` env variable") } + if envCount != 4 { + t.Fatalf("Didn't find all env vars - only saw %d\n%s", envCount, envResult) + } + logDone("build - env environment replacement") } @@ -361,8 +380,8 @@ func TestBuildHandleEscapes(t *testing.T) { t.Fatal(err) } - if _, ok := result[`\\\\\\${FOO}`]; !ok { - t.Fatal(`Could not find volume \\\\\\${FOO} set from env foo in volumes table`) + if _, ok := result[`\\\${FOO}`]; !ok { + t.Fatal(`Could not find volume \\\${FOO} set from env foo in volumes table`, result) } logDone("build - handle escapes") @@ -2128,7 +2147,7 @@ func TestBuildRelativeWorkdir(t *testing.T) { func TestBuildWorkdirWithEnvVariables(t *testing.T) { name := "testbuildworkdirwithenvvariables" - expected := "/test1/test2/$MISSING_VAR" + expected := "/test1/test2" defer deleteImages(name) _, err := buildImage(name, `FROM busybox @@ -3897,9 +3916,9 @@ ENV abc=zzz TO=/docker/world/hello ADD $FROM $TO RUN [ "$(cat $TO)" = "hello" ] ENV abc "zzz" -RUN [ $abc = \"zzz\" ] +RUN [ $abc = "zzz" ] ENV abc 'yyy' -RUN [ $abc = \'yyy\' ] +RUN [ $abc = 'yyy' ] ENV abc= RUN [ "$abc" = "" ] @@ -3915,13 +3934,34 @@ RUN [ "$abc" = "'foo'" ] ENV abc=\"foo\" RUN [ "$abc" = "\"foo\"" ] ENV abc "foo" -RUN [ "$abc" = "\"foo\"" ] +RUN [ "$abc" = "foo" ] ENV abc 'foo' -RUN [ "$abc" = "'foo'" ] +RUN [ "$abc" = 'foo' ] ENV abc \'foo\' -RUN [ "$abc" = "\\'foo\\'" ] +RUN [ "$abc" = "'foo'" ] ENV abc \"foo\" -RUN [ "$abc" = "\\\"foo\\\"" ] +RUN [ "$abc" = '"foo"' ] + +ENV e1=bar +ENV e2=$e1 +ENV e3=$e11 +ENV e4=\$e1 +ENV e5=\$e11 +RUN [ "$e0,$e1,$e2,$e3,$e4,$e5" = ',bar,bar,,$e1,$e11' ] + +ENV ee1 bar +ENV ee2 $ee1 +ENV ee3 $ee11 +ENV ee4 \$ee1 +ENV ee5 \$ee11 +RUN [ "$ee1,$ee2,$ee3,$ee4,$ee5" = 'bar,bar,,$ee1,$ee11' ] + +ENV eee1="foo" +ENV eee2='foo' +ENV eee3 "foo" +ENV eee4 'foo' +RUN [ "$eee1,$eee2,$eee3,$eee4" = 'foo,foo,foo,foo' ] + ` ctx, err := fakeContext(dockerfile, map[string]string{ "hello/docker/world": "hello", From 8071bf396747d3ad01db504a417b75fe7a52608a Mon Sep 17 00:00:00 2001 From: Doug Davis Date: Fri, 20 Mar 2015 21:39:49 -0700 Subject: [PATCH 33/77] Check volume path to make sure its not the empty string With this Dockerfile ``` FROM ubuntu ENV ABC="" VOLUME $ABC ``` It builds ok but then at run time I get this error: FATA[0002] Error response from daemon: Cannot start container 8902b4a7aaf5c4e4b11a38070d392db465fa97ad88c91c8b38dda5ab8149ccac: [8] System error: no such file or directory Because the Volume config shows "" as the path. This PR checks for "" as the path and stops it at build time. Signed-off-by: Doug Davis --- builder/dispatchers.go | 4 ++++ integration-cli/docker_cli_build_test.go | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/builder/dispatchers.go b/builder/dispatchers.go index 3cb3a9fb3a..4d21a75eb5 100644 --- a/builder/dispatchers.go +++ b/builder/dispatchers.go @@ -427,6 +427,10 @@ func volume(b *Builder, args []string, attributes map[string]bool, original stri b.Config.Volumes = map[string]struct{}{} } for _, v := range args { + v = strings.TrimSpace(v) + if v == "" { + return fmt.Errorf("Volume specified can not be an empty string") + } b.Config.Volumes[v] = struct{}{} } if err := b.commit("", b.Config.Cmd, fmt.Sprintf("VOLUME %v", args)); err != nil { diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index c83759d75a..81bdef028c 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -5408,3 +5408,19 @@ func TestBuildResourceConstraintsAreUsed(t *testing.T) { logDone("build - resource constraints applied") } + +func TestBuildEmptyStringVolume(t *testing.T) { + name := "testbuildemptystringvolume" + defer deleteImages(name) + + _, err := buildImage(name, ` + FROM busybox + ENV foo="" + VOLUME $foo + `, false) + if err == nil { + t.Fatal("Should have failed to build") + } + + logDone("build - empty string volume") +} From b7dc9040f04fe8dacd2f14c6b93d1b0bb6bde333 Mon Sep 17 00:00:00 2001 From: Mitch Capper Date: Sun, 15 Mar 2015 10:19:15 -0700 Subject: [PATCH 34/77] Change windows default permissions to 755 not 711, read access for all poses little security risk and prevents breaking existing Dockerfiles Signed-off-by: Mitch Capper --- integration-cli/test_vars_windows.go | 4 ++-- pkg/archive/archive_windows.go | 5 ++--- pkg/archive/archive_windows_test.go | 10 +++++----- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/integration-cli/test_vars_windows.go b/integration-cli/test_vars_windows.go index 3cad4bceef..f81ac53cc3 100644 --- a/integration-cli/test_vars_windows.go +++ b/integration-cli/test_vars_windows.go @@ -6,6 +6,6 @@ const ( // identifies if test suite is running on a unix platform isUnixCli = false - // this is the expected file permission set on windows: gh#11047 - expectedFileChmod = "-rwx------" + // this is the expected file permission set on windows: gh#11395 + expectedFileChmod = "-rwxr-xr-x" ) diff --git a/pkg/archive/archive_windows.go b/pkg/archive/archive_windows.go index 96a93ee7af..6caef3b735 100644 --- a/pkg/archive/archive_windows.go +++ b/pkg/archive/archive_windows.go @@ -28,10 +28,9 @@ func CanonicalTarNameForPath(p string) (string, error) { // chmodTarEntry is used to adjust the file permissions used in tar header based // on the platform the archival is done. func chmodTarEntry(perm os.FileMode) os.FileMode { - // Clear r/w on grp/others: no precise equivalen of group/others on NTFS. - perm &= 0711 + perm &= 0755 // Add the x bit: make everything +x from windows - perm |= 0100 + perm |= 0111 return perm } diff --git a/pkg/archive/archive_windows_test.go b/pkg/archive/archive_windows_test.go index 0c97a1040d..b33e0fb005 100644 --- a/pkg/archive/archive_windows_test.go +++ b/pkg/archive/archive_windows_test.go @@ -51,11 +51,11 @@ func TestChmodTarEntry(t *testing.T) { cases := []struct { in, expected os.FileMode }{ - {0000, 0100}, - {0777, 0711}, - {0644, 0700}, - {0755, 0711}, - {0444, 0500}, + {0000, 0111}, + {0777, 0755}, + {0644, 0755}, + {0755, 0755}, + {0444, 0555}, } for _, v := range cases { if out := chmodTarEntry(v.in); out != v.expected { From 28a34dfffdce359a5674cfda0a90b25b1f4d4d97 Mon Sep 17 00:00:00 2001 From: Ahmet Alp Balkan Date: Sat, 21 Mar 2015 19:43:14 +0000 Subject: [PATCH 35/77] integ-cli: fix bug and race in TestBuildSpaces `TestBuildSpaces` is used to do string manipulation to redact timestamps from compared cmd output. However it was assuming there is going to be only one `time=".."` in the output --not the case on windows. Therefore I wrote a regexp to redact all log timestamps. Also the test used to have a copy/paste bug (see err1/err2). This fixes that, too. Signed-off-by: Ahmet Alp Balkan --- integration-cli/docker_cli_build_test.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index c83759d75a..7f5a879b1f 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -5124,9 +5124,13 @@ func TestBuildSpaces(t *testing.T) { t.Fatal("Build 2 was supposed to fail, but didn't") } + removeLogTimestamps := func(s string) string { + return regexp.MustCompile(`time="(.*?)"`).ReplaceAllString(s, `time=[TIMESTAMP]`) + } + // Skip over the times - e1 := err1.Error()[strings.Index(err1.Error(), `level=`):] - e2 := err2.Error()[strings.Index(err1.Error(), `level=`):] + e1 := removeLogTimestamps(err1.Error()) + e2 := removeLogTimestamps(err2.Error()) // Ignore whitespace since that's what were verifying doesn't change stuff if strings.Replace(e1, " ", "", -1) != strings.Replace(e2, " ", "", -1) { @@ -5139,8 +5143,8 @@ func TestBuildSpaces(t *testing.T) { } // Skip over the times - e1 = err1.Error()[strings.Index(err1.Error(), `level=`):] - e2 = err2.Error()[strings.Index(err1.Error(), `level=`):] + e1 = removeLogTimestamps(err1.Error()) + e2 = removeLogTimestamps(err2.Error()) // Ignore whitespace since that's what were verifying doesn't change stuff if strings.Replace(e1, " ", "", -1) != strings.Replace(e2, " ", "", -1) { @@ -5153,8 +5157,8 @@ func TestBuildSpaces(t *testing.T) { } // Skip over the times - e1 = err1.Error()[strings.Index(err1.Error(), `level=`):] - e2 = err2.Error()[strings.Index(err1.Error(), `level=`):] + e1 = removeLogTimestamps(err1.Error()) + e2 = removeLogTimestamps(err2.Error()) // Ignore whitespace since that's what were verifying doesn't change stuff if strings.Replace(e1, " ", "", -1) != strings.Replace(e2, " ", "", -1) { From 3ff9991bb27b238b0df4f67b6714174ca92223eb Mon Sep 17 00:00:00 2001 From: Mary Anthony Date: Sat, 21 Mar 2015 15:30:29 -0700 Subject: [PATCH 36/77] Update contributor docs and triage to match new labeling system Add clarification around experience Adding test improvement > enhancement Signed-off-by: Mary Anthony --- docs/sources/project/create-pr.md | 2 +- docs/sources/project/find-an-issue.md | 97 +++++++++++++------- docs/sources/project/images/easy_issue.png | Bin 44245 -> 114452 bytes docs/sources/project/make-a-contribution.md | 2 +- docs/sources/project/review-pr.md | 5 +- docs/sources/project/work-issue.md | 2 +- project/ISSUE-TRIAGE.md | 55 +++++++---- 7 files changed, 109 insertions(+), 54 deletions(-) diff --git a/docs/sources/project/create-pr.md b/docs/sources/project/create-pr.md index 84de397090..197aee849d 100644 --- a/docs/sources/project/create-pr.md +++ b/docs/sources/project/create-pr.md @@ -1,6 +1,6 @@ page_title: Create a pull request (PR) page_description: Basic workflow for Docker contributions -page_keywords: contribute, pull request, review, workflow, white-belt, black-belt, squash, commit +page_keywords: contribute, pull request, review, workflow, beginner, squash, commit # Create a pull request (PR) diff --git a/docs/sources/project/find-an-issue.md b/docs/sources/project/find-an-issue.md index 39572d17a4..0a36c8833a 100644 --- a/docs/sources/project/find-an-issue.md +++ b/docs/sources/project/find-an-issue.md @@ -1,6 +1,6 @@ page_title: Make a project contribution page_description: Basic workflow for Docker contributions -page_keywords: contribute, pull request, review, workflow, white-belt, black-belt, squash, commit +page_keywords: contribute, pull request, review, workflow, beginner, expert, squash, commit @@ -37,20 +51,44 @@ An existing issue is something reported by a Docker user. As issues come in, our maintainers triage them. Triage is its own topic. For now, it is important for you to know that triage includes ranking issues according to difficulty. -Triaged issues have either a white-belt -or black-belt label. -A white-belt issue is considered -an easier issue. Issues can have more than one label, for example, -bug, -improvement, -project/doc, and so forth. -These other labels are there for filtering purposes but you might also find -them helpful. +Triaged issues have one of these labels: +
2. This can be accomplished by adding the account to a read-only team on + This can be accomplished by adding the account to a read-only team in the organization(s) where the main GitHub repository and all submodule repositories are kept.
+ + + + + + + + + + + + + + + + + + + + + + + + +
LevelExperience level guideline
exp/beginnerYou have made less than 10 contributions in your life time to any open source project.
exp/noviceYou have made more than 10 contributions to an open source project or at least 5 contributions to Docker.
exp/proficientYou have made more than 5 contributions to Docker which amount to at least 200 code lines or 1000 documentation lines.
exp/expertYou have made less than 20 commits to Docker which amount to 500-1000 code lines or 1000-3000 documentation lines.
exp/masterYou have made more than 20 commits to Docker and greater than 1000 code lines or 3000 documentation lines.
-## Claim a white-belt issue +As the table states, these labels are meant as guidelines. You might have +written a whole plugin for Docker in a personal project and never contributed to +Docker. With that kind of experience, you could take on an exp/expert or exp/master level task. -In this section, you find and claim an open white-belt issue. +## Claim a beginner or novice issue + +In this section, you find and claim an open documentation lines issue. 1. Go to the `docker/docker`
white-belt items on the list. +3. Look for the exp/beginner items on the list. -4. Click on the "labels" dropdown and select white-belt. +4. Click on the "labels" dropdown and select exp/beginner. - The system filters to show only open white-belt issues. + The system filters to show only open exp/beginner issues. 5. Open an issue that interests you. @@ -75,21 +113,18 @@ In this section, you find and claim an open white-belt issue. 6. Make sure that no other user has chosen to work on the issue. - We don't allow external contributors to assign issues to themselves, so you - need to read the comments to find if a user claimed an issue by saying: - - - "I'd love to give this a try~" - - "I'll work on this!" - - "I'll take this." - - The community is very good about claiming issues explicitly. + We don't allow external contributors to assign issues to themselves. So, you + need to read the comments to find if a user claimed the issue by leaving a + `#dibs` comment on the issue. -7. When you find an open issue that both interests you and is unclaimed, claim it yourself by adding a comment. +7. When you find an open issue that both interests you and is unclaimed, add a +`#dibs` comment. ![Easy issue](/project/images/easy_issue.png) This example uses issue 11038. Your issue # will be different depending on - what you claimed. + what you claimed. After a moment, Gordon the Docker bot, changes the issue + status to claimed. 8. Make a note of the issue number; you'll need it later. diff --git a/docs/sources/project/images/easy_issue.png b/docs/sources/project/images/easy_issue.png index ac2ea6879ca156cac6cf19f5ad9663ef0eb28c63..de44b7826dc13cdf5d6b95f726dc519bc5cee14f 100644 GIT binary patch literal 114452 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%0Dtwh^pkn;z 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�k^@s&T7nh7i_dZAOp`8m-6qxM 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. ## Where to go next At this point, you have completed all the basic tasks in our contributors guide. -If you enjoyed contributing, let us know by completing another -white-belt +If you enjoyed contributing, let us know by completing another beginner issue or two. We really appreciate the help. If you are very experienced and want to make a major change, go on to diff --git a/docs/sources/project/work-issue.md b/docs/sources/project/work-issue.md index 68d2ed750f..190cec0557 100644 --- a/docs/sources/project/work-issue.md +++ b/docs/sources/project/work-issue.md @@ -1,6 +1,6 @@ page_title: Work on your issue page_description: Basic workflow for Docker contributions -page_keywords: contribute, pull request, review, workflow, white-belt, black-belt, squash, commit +page_keywords: contribute, pull request, review, workflow, beginner, squash, commit # Work on your issue diff --git a/project/ISSUE-TRIAGE.md b/project/ISSUE-TRIAGE.md index bee7a89827..528dea9c60 100644 --- a/project/ISSUE-TRIAGE.md +++ b/project/ISSUE-TRIAGE.md @@ -54,30 +54,51 @@ that the user can easily script and know the reason why the command failed. ### Step 3: Classify the Issue Classifications help both to inform readers about an issue's priority and how to resolve it. -This is also helpful for identifying new, critical issues. Classifications types are -applied to the issue or pull request using labels. +This is also helpful for identifying new, critical issues. "Kinds of" are +applied to the issue or pull request using labels. You can apply one or more labels. -Types of classification: +Kinds of classifications: -| Type | Description | -|-------------|---------------------------------------------------------------------------------------------------------------------------------| -| improvement | improvements are not bugs or new features but can drastically improve usability. | -| regression | regressions are usually easy fixes as hopefully the action worked previously and git history can be used to propose a solution. | -| bug | bugs are bugs. The cause may or may not be known at triage time so debugging should be taken account into the time estimate. | -| feature | features are new and shinny. They are things that the project does not currently support. | +| Kind | Description | +|------------------|---------------------------------------------------------------------------------------------------------------------------------| +| kind/enhancement | Enhancement are not bugs or new features but can drastically improve usability or performance of a project component. | +| kind/cleanup | Refactoring code or otherwise clarifying documentation. | +| kind/content | Content that is not documentation such as help or error messages. | +| kind/graphics | Work involving graphics skill | +| kind/regression | Regressions are usually easy fixes as hopefully the action worked previously and git history can be used to propose a solution. | +| kind/bug | Bugs are bugs. The cause may or may not be known at triage time so debugging should be taken account into the time estimate. | +| kind/feature | Functionality or other elements that the project does not currently support. Features are new and shinny. | +| kind/question | Contains a user or contributor question requiring a response. | +| kind/usecase | A description of a user or contributor situation requiring a response perhaps in code or documentation. | +| kind/writing | Writing documentation, man pages, articles, blogs, or other significant word-driven task. | +| kind/test | Tests or test infrastructure needs adding or updating. | -### Step 4: Estimate the Difficulty -Difficulty is a way for a contributor to find an issue based on their skill set. Difficulty types are -applied to the issue or pull request using labels. +Contributors can add labels by using a `+kind/bug` in an issue or pull request comment. -Difficulty +### Step 4: Estimate the experience level required + +Experience level is a way for a contributor to find an issue based on their +skill set. Experience types are applied to the issue or pull request using +labels. + +| Level | Experience level guideline | +|------------------|--------------------------------------------------------------------------------------------------------------------------| +| exp/beginner | You have made less than 10 contributions in your life time to any open source project. | +| exp/novice | You have made more than 10 contributions to an open source project or at least 5 contributions to Docker. | +| exp/proficient | You have made more than 5 contributions to Docker which amount to at least 200 code lines or 1000 documentation lines. | +| exp/expert | You have made less than 20 commits to Docker which amount to 500-1000 code lines or 1000-3000 documentation lines. | +| exp/master | You have made more than 20 commits to Docker and greater than 1000 code lines or 3000 documentation lines. | + +As the table states, these labels are meant as guidelines. You might have +written a whole plugin for Docker in a personal project and never contributed to +Docker. With that kind of experience, you could take on an exp/expert or exp/master level task. + +Contributors can add labels by using a `+exp/expert` format in issue comment. -| Type | Description | -|--------------|-----------------------------------------------------------------------------| -| white-belt | Simple, non-time consuming issue, easy first task to accomplish | -| black-belt | Expert at the subject matter or someone who likes pain | And that's it. That should be all the information required for a new or existing contributor to come in an resolve an issue. From eaecd8b1b5871a4d17be27e3615106587eec1d3a Mon Sep 17 00:00:00 2001 From: sidharthamani Date: Mon, 9 Mar 2015 11:40:57 -0700 Subject: [PATCH 37/77] add syslog driver Signed-off-by: wlan0 --- daemon/config.go | 2 +- daemon/container.go | 7 +++ daemon/logger/syslog/syslog.go | 54 +++++++++++++++++++ docs/man/docker-create.1.md | 2 +- docs/man/docker-run.1.md | 2 +- docs/man/docker.1.md | 2 +- .../reference/api/docker_remote_api_v1.18.md | 2 +- docs/sources/reference/run.md | 5 ++ 8 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 daemon/logger/syslog/syslog.go diff --git a/daemon/config.go b/daemon/config.go index 4adc025eef..9b38fde4ed 100644 --- a/daemon/config.go +++ b/daemon/config.go @@ -83,7 +83,7 @@ func (config *Config) InstallFlags() { opts.LabelListVar(&config.Labels, []string{"-label"}, "Set key=value labels to the daemon") config.Ulimits = make(map[string]*ulimit.Ulimit) opts.UlimitMapVar(config.Ulimits, []string{"-default-ulimit"}, "Set default ulimits for containers") - flag.StringVar(&config.LogConfig.Type, []string{"-log-driver"}, "json-file", "Containers logging driver(json-file/none)") + flag.StringVar(&config.LogConfig.Type, []string{"-log-driver"}, "json-file", "Containers logging driver") } func getDefaultNetworkMtu() int { diff --git a/daemon/container.go b/daemon/container.go index 05dcd76264..dabaedbe8d 100644 --- a/daemon/container.go +++ b/daemon/container.go @@ -23,6 +23,7 @@ import ( "github.com/docker/docker/daemon/execdriver" "github.com/docker/docker/daemon/logger" "github.com/docker/docker/daemon/logger/jsonfilelog" + "github.com/docker/docker/daemon/logger/syslog" "github.com/docker/docker/engine" "github.com/docker/docker/image" "github.com/docker/docker/links" @@ -1377,6 +1378,12 @@ func (container *Container) startLogging() error { return err } l = dl + case "syslog": + dl, err := syslog.New(container.ID[:12]) + if err != nil { + return err + } + l = dl case "none": return nil default: diff --git a/daemon/logger/syslog/syslog.go b/daemon/logger/syslog/syslog.go new file mode 100644 index 0000000000..1f73d91d6e --- /dev/null +++ b/daemon/logger/syslog/syslog.go @@ -0,0 +1,54 @@ +package syslog + +import ( + "fmt" + "log/syslog" + "os" + "path" + "sync" + + "github.com/docker/docker/daemon/logger" +) + +type Syslog struct { + writer *syslog.Writer + tag string + mu sync.Mutex +} + +func New(tag string) (logger.Logger, error) { + log, err := syslog.New(syslog.LOG_USER, path.Base(os.Args[0])) + if err != nil { + return nil, err + } + return &Syslog{ + writer: log, + tag: tag, + }, nil +} + +func (s *Syslog) Log(msg *logger.Message) error { + logMessage := fmt.Sprintf("%s: %s", s.tag, string(msg.Line)) + if msg.Source == "stderr" { + if err := s.writer.Err(logMessage); err != nil { + return err + } + + } else { + if err := s.writer.Info(logMessage); err != nil { + return err + } + } + return nil +} + +func (s *Syslog) Close() error { + if s.writer != nil { + return s.writer.Close() + } + return nil +} + +func (s *Syslog) Name() string { + return "Syslog" +} diff --git a/docs/man/docker-create.1.md b/docs/man/docker-create.1.md index ddb234d377..44ce96fc2c 100644 --- a/docs/man/docker-create.1.md +++ b/docs/man/docker-create.1.md @@ -117,7 +117,7 @@ IMAGE [COMMAND] [ARG...] **--lxc-conf**=[] (lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1" -**--log-driver**="|*json-file*|*none*" +**--log-driver**="|*json-file*|*syslog*|*none*" Logging driver for container. Default is defined by daemon `--log-driver` flag. **Warning**: `docker logs` command works only for `json-file` logging driver. diff --git a/docs/man/docker-run.1.md b/docs/man/docker-run.1.md index 234d8dc522..bd9109375c 100644 --- a/docs/man/docker-run.1.md +++ b/docs/man/docker-run.1.md @@ -218,7 +218,7 @@ which interface and port to use. **--lxc-conf**=[] (lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1" -**--log-driver**="|*json-file*|*none*" +**--log-driver**="|*json-file*|*syslog*|*none*" Logging driver for container. Default is defined by daemon `--log-driver` flag. **Warning**: `docker logs` command works only for `json-file` logging driver. diff --git a/docs/man/docker.1.md b/docs/man/docker.1.md index 530fa95019..c9fe3eae9a 100644 --- a/docs/man/docker.1.md +++ b/docs/man/docker.1.md @@ -89,7 +89,7 @@ unix://[/path/to/socket] to use. **--label**="[]" Set key=value labels to the daemon (displayed in `docker info`) -**--log-driver**="*json-file*|*none*" +**--log-driver**="*json-file*|*syslog*|*none*" Container's logging driver. Default is `default`. **Warning**: `docker logs` command works only for `json-file` logging driver. diff --git a/docs/sources/reference/api/docker_remote_api_v1.18.md b/docs/sources/reference/api/docker_remote_api_v1.18.md index ac22563b7f..ca923235a3 100644 --- a/docs/sources/reference/api/docker_remote_api_v1.18.md +++ b/docs/sources/reference/api/docker_remote_api_v1.18.md @@ -258,7 +258,7 @@ Json Parameters: `Ulimits: { "Name": "nofile", "Soft": 1024, "Hard", 2048 }}` - **LogConfig** - Logging configuration to container, format `{ "Type": "", "Config": {"key1": "val1"}} - Available types: `json-file`, `none`. + Available types: `json-file`, `syslog`, `none`. `json-file` logging driver. Query Parameters: diff --git a/docs/sources/reference/run.md b/docs/sources/reference/run.md index 052a35823e..29734eafec 100644 --- a/docs/sources/reference/run.md +++ b/docs/sources/reference/run.md @@ -656,6 +656,11 @@ this driver. Default logging driver for Docker. Writes JSON messages to file. `docker logs` command is available only for this logging driver +## Logging driver: syslog + +Syslog logging driver for Docker. Writes log messages to syslog. `docker logs` +command is not available for this logging driver + ## Overriding Dockerfile image defaults When a developer builds an image from a [*Dockerfile*](/reference/builder) From f3b7bf9682c10cdd6dfbdca79080790d7411c1b7 Mon Sep 17 00:00:00 2001 From: Mary Anthony Date: Sat, 21 Mar 2015 18:20:25 -0700 Subject: [PATCH 38/77] Clarifying structure in light of Kitematic Signed-off-by: Mary Anthony --- docs/sources/installation/mac.md | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/docs/sources/installation/mac.md b/docs/sources/installation/mac.md index a06233e0ea..9bf7632680 100644 --- a/docs/sources/installation/mac.md +++ b/docs/sources/installation/mac.md @@ -4,6 +4,20 @@ page_keywords: Docker, Docker documentation, requirements, boot2docker, VirtualB # Install Docker on Mac OS X +You can install Docker using Boot2Docker to run `docker` commands at your command-line. +Choose this installation if you are familiar with the command-line or plan to +contribute to the Docker project on GitHub. + +Alternatively, you may want to try Kitematic, an application that lets you set up Docker and +run containers using a graphical user interface (GUI). + +Download Kitematic + + +## Command-line Docker with Boot2Docker + Because the Docker daemon uses Linux-specific kernel features, you can't run Docker natively in OS X. Instead, you must install the Boot2Docker application. The application includes a VirtualBox Virtual Machine (VM), Docker itself, and the @@ -17,16 +31,7 @@ completely from RAM, is a small ~24MB download, and boots in approximately 5s. Your Mac must be running OS X 10.6 "Snow Leopard" or newer to run Boot2Docker. -## How do you want to work with Docker? - -You can set up Docker using the command line with Boot2Docker and the guide -below. Alternatively, you may want to try Kitematic, -an application that lets you set up Docker and run containers using a graphical -user interface (GUI). - -Download Kitematic - -## Learn the key concepts before installing +### Learn the key concepts before installing In a Docker installation on Linux, your machine is both the localhost and the Docker host. In networking, localhost means your computer. The Docker host is @@ -50,7 +55,7 @@ When you start the `boot2docker` process, the VM is assigned an IP address. Unde practice, work through the exercises on this page. -## Install Boot2Docker +### Install Boot2Docker 1. Go to the [boot2docker/osx-installer ]( https://github.com/boot2docker/osx-installer/releases/latest) release page. @@ -319,4 +324,4 @@ at [Boot2Docker repository](https://github.com/boot2docker/boot2docker). Thanks to Chris Jones whose [blog](http://goo.gl/Be6cCk) inspired me to redo this page. -Continue with the [Docker User Guide](/userguide/). +Continue with the [Docker User Guide](/userguide/). \ No newline at end of file From 3a33bff7fdd96705e761bb1f1750cfa6f4df4070 Mon Sep 17 00:00:00 2001 From: Simon Eskildsen Date: Sun, 22 Mar 2015 02:06:50 +0000 Subject: [PATCH 39/77] vendor: update logrus to 0.7.1 Changes relevant for Docker since 0.6.6 are (most other changes are hooks and options for formatters): * Debugging color output changed to gray. * Don't quote the number 9 when it's by it self (i.e. `omg=9` instead of `omg="8"`, this was the case for all other numbers) * Performance is better when running a high logging level with lots of low-level logging. * Minor internal refactoring and more tests. Signed-off-by: Simon Eskildsen --- hack/vendor.sh | 2 +- .../src/github.com/Sirupsen/logrus/README.md | 51 ++----- .../Sirupsen/logrus/examples/hook/hook.go | 7 +- .../logrus/formatters/logstash/logstash.go | 48 +++++++ .../formatters/logstash/logstash_test.go | 52 +++++++ .../logrus/hooks/airbrake/airbrake.go | 58 ++++---- .../logrus/hooks/airbrake/airbrake_test.go | 133 ++++++++++++++++++ .../Sirupsen/logrus/hooks/bugsnag/bugsnag.go | 68 +++++++++ .../logrus/hooks/bugsnag/bugsnag_test.go | 64 +++++++++ .../Sirupsen/logrus/json_formatter.go | 11 +- .../src/github.com/Sirupsen/logrus/logger.go | 84 ++++++++--- .../Sirupsen/logrus/terminal_openbsd.go | 1 - .../Sirupsen/logrus/text_formatter.go | 2 - .../src/github.com/Sirupsen/logrus/writer.go | 2 +- 14 files changed, 478 insertions(+), 105 deletions(-) create mode 100644 vendor/src/github.com/Sirupsen/logrus/formatters/logstash/logstash.go create mode 100644 vendor/src/github.com/Sirupsen/logrus/formatters/logstash/logstash_test.go create mode 100644 vendor/src/github.com/Sirupsen/logrus/hooks/airbrake/airbrake_test.go create mode 100644 vendor/src/github.com/Sirupsen/logrus/hooks/bugsnag/bugsnag.go create mode 100644 vendor/src/github.com/Sirupsen/logrus/hooks/bugsnag/bugsnag_test.go diff --git a/hack/vendor.sh b/hack/vendor.sh index b3ba928a05..8732224bfc 100755 --- a/hack/vendor.sh +++ b/hack/vendor.sh @@ -53,7 +53,7 @@ clone hg code.google.com/p/gosqlite 74691fb6f837 clone git github.com/docker/libtrust 230dfd18c232 -clone git github.com/Sirupsen/logrus v0.6.6 +clone git github.com/Sirupsen/logrus v0.7.1 clone git github.com/go-fsnotify/fsnotify v1.0.4 diff --git a/vendor/src/github.com/Sirupsen/logrus/README.md b/vendor/src/github.com/Sirupsen/logrus/README.md index e755e7c180..512f26e5ea 100644 --- a/vendor/src/github.com/Sirupsen/logrus/README.md +++ b/vendor/src/github.com/Sirupsen/logrus/README.md @@ -82,7 +82,7 @@ func init() { // Use the Airbrake hook to report errors that have Error severity or above to // an exception tracker. You can create custom hooks, see the Hooks section. - log.AddHook(&logrus_airbrake.AirbrakeHook{}) + log.AddHook(airbrake.NewHook("https://example.com", "xyz", "development")) // Output to stderr instead of stdout, could also be a file. log.SetOutput(os.Stderr) @@ -164,43 +164,8 @@ You can add hooks for logging levels. For example to send errors to an exception tracking service on `Error`, `Fatal` and `Panic`, info to StatsD or log to multiple places simultaneously, e.g. syslog. -```go -// Not the real implementation of the Airbrake hook. Just a simple sample. -import ( - log "github.com/Sirupsen/logrus" -) - -func init() { - log.AddHook(new(AirbrakeHook)) -} - -type AirbrakeHook struct{} - -// `Fire()` takes the entry that the hook is fired for. `entry.Data[]` contains -// the fields for the entry. See the Fields section of the README. -func (hook *AirbrakeHook) Fire(entry *logrus.Entry) error { - err := airbrake.Notify(entry.Data["error"].(error)) - if err != nil { - log.WithFields(log.Fields{ - "source": "airbrake", - "endpoint": airbrake.Endpoint, - }).Info("Failed to send error to Airbrake") - } - - return nil -} - -// `Levels()` returns a slice of `Levels` the hook is fired for. -func (hook *AirbrakeHook) Levels() []log.Level { - return []log.Level{ - log.ErrorLevel, - log.FatalLevel, - log.PanicLevel, - } -} -``` - -Logrus comes with built-in hooks. Add those, or your custom hook, in `init`: +Logrus comes with [built-in hooks](hooks/). Add those, or your custom hook, in +`init`: ```go import ( @@ -211,7 +176,7 @@ import ( ) func init() { - log.AddHook(new(logrus_airbrake.AirbrakeHook)) + log.AddHook(airbrake.NewHook("https://example.com", "xyz", "development")) hook, err := logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "") if err != nil { @@ -233,6 +198,9 @@ func init() { Send errors to remote syslog server. Uses standard library `log/syslog` behind the scenes. +* [`github.com/Sirupsen/logrus/hooks/bugsnag`](https://github.com/Sirupsen/logrus/blob/master/hooks/bugsnag/bugsnag.go) + Send errors to the Bugsnag exception tracking service. + * [`github.com/nubo/hiprus`](https://github.com/nubo/hiprus) Send errors to a channel in hipchat. @@ -321,6 +289,11 @@ The built-in logging formatters are: field to `true`. To force no colored output even if there is a TTY set the `DisableColors` field to `true` * `logrus.JSONFormatter`. Logs fields as JSON. +* `logrus_logstash.LogstashFormatter`. Logs fields as Logstash Events (http://logstash.net). + + ```go + logrus.SetFormatter(&logrus_logstash.LogstashFormatter{Type: “application_name"}) + ``` Third party logging formatters: diff --git a/vendor/src/github.com/Sirupsen/logrus/examples/hook/hook.go b/vendor/src/github.com/Sirupsen/logrus/examples/hook/hook.go index 42e7a4c982..cb5759a35c 100644 --- a/vendor/src/github.com/Sirupsen/logrus/examples/hook/hook.go +++ b/vendor/src/github.com/Sirupsen/logrus/examples/hook/hook.go @@ -3,21 +3,16 @@ package main import ( "github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus/hooks/airbrake" - "github.com/tobi/airbrake-go" ) var log = logrus.New() func init() { log.Formatter = new(logrus.TextFormatter) // default - log.Hooks.Add(new(logrus_airbrake.AirbrakeHook)) + log.Hooks.Add(airbrake.NewHook("https://example.com", "xyz", "development")) } func main() { - airbrake.Endpoint = "https://exceptions.whatever.com/notifier_api/v2/notices.xml" - airbrake.ApiKey = "whatever" - airbrake.Environment = "production" - log.WithFields(logrus.Fields{ "animal": "walrus", "size": 10, diff --git a/vendor/src/github.com/Sirupsen/logrus/formatters/logstash/logstash.go b/vendor/src/github.com/Sirupsen/logrus/formatters/logstash/logstash.go new file mode 100644 index 0000000000..34b1ccbca6 --- /dev/null +++ b/vendor/src/github.com/Sirupsen/logrus/formatters/logstash/logstash.go @@ -0,0 +1,48 @@ +package logstash + +import ( + "encoding/json" + "fmt" + "github.com/Sirupsen/logrus" + "time" +) + +// Formatter generates json in logstash format. +// Logstash site: http://logstash.net/ +type LogstashFormatter struct { + Type string // if not empty use for logstash type field. +} + +func (f *LogstashFormatter) Format(entry *logrus.Entry) ([]byte, error) { + entry.Data["@version"] = 1 + entry.Data["@timestamp"] = entry.Time.Format(time.RFC3339) + + // set message field + v, ok := entry.Data["message"] + if ok { + entry.Data["fields.message"] = v + } + entry.Data["message"] = entry.Message + + // set level field + v, ok = entry.Data["level"] + if ok { + entry.Data["fields.level"] = v + } + entry.Data["level"] = entry.Level.String() + + // set type field + if f.Type != "" { + v, ok = entry.Data["type"] + if ok { + entry.Data["fields.type"] = v + } + entry.Data["type"] = f.Type + } + + serialized, err := json.Marshal(entry.Data) + if err != nil { + return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err) + } + return append(serialized, '\n'), nil +} diff --git a/vendor/src/github.com/Sirupsen/logrus/formatters/logstash/logstash_test.go b/vendor/src/github.com/Sirupsen/logrus/formatters/logstash/logstash_test.go new file mode 100644 index 0000000000..d8814a0eae --- /dev/null +++ b/vendor/src/github.com/Sirupsen/logrus/formatters/logstash/logstash_test.go @@ -0,0 +1,52 @@ +package logstash + +import ( + "bytes" + "encoding/json" + "github.com/Sirupsen/logrus" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestLogstashFormatter(t *testing.T) { + assert := assert.New(t) + + lf := LogstashFormatter{Type: "abc"} + + fields := logrus.Fields{ + "message": "def", + "level": "ijk", + "type": "lmn", + "one": 1, + "pi": 3.14, + "bool": true, + } + + entry := logrus.WithFields(fields) + entry.Message = "msg" + entry.Level = logrus.InfoLevel + + b, _ := lf.Format(entry) + + var data map[string]interface{} + dec := json.NewDecoder(bytes.NewReader(b)) + dec.UseNumber() + dec.Decode(&data) + + // base fields + assert.Equal(json.Number("1"), data["@version"]) + assert.NotEmpty(data["@timestamp"]) + assert.Equal("abc", data["type"]) + assert.Equal("msg", data["message"]) + assert.Equal("info", data["level"]) + + // substituted fields + assert.Equal("def", data["fields.message"]) + assert.Equal("ijk", data["fields.level"]) + assert.Equal("lmn", data["fields.type"]) + + // formats + assert.Equal(json.Number("1"), data["one"]) + assert.Equal(json.Number("3.14"), data["pi"]) + assert.Equal(true, data["bool"]) +} diff --git a/vendor/src/github.com/Sirupsen/logrus/hooks/airbrake/airbrake.go b/vendor/src/github.com/Sirupsen/logrus/hooks/airbrake/airbrake.go index 75f4db1513..b0502c335a 100644 --- a/vendor/src/github.com/Sirupsen/logrus/hooks/airbrake/airbrake.go +++ b/vendor/src/github.com/Sirupsen/logrus/hooks/airbrake/airbrake.go @@ -1,51 +1,51 @@ -package logrus_airbrake +package airbrake import ( + "errors" + "fmt" + "github.com/Sirupsen/logrus" "github.com/tobi/airbrake-go" ) // AirbrakeHook to send exceptions to an exception-tracking service compatible -// with the Airbrake API. You must set: -// * airbrake.Endpoint -// * airbrake.ApiKey -// * airbrake.Environment -// -// Before using this hook, to send an error. Entries that trigger an Error, -// Fatal or Panic should now include an "error" field to send to Airbrake. -type AirbrakeHook struct{} +// with the Airbrake API. +type airbrakeHook struct { + APIKey string + Endpoint string + Environment string +} -func (hook *AirbrakeHook) Fire(entry *logrus.Entry) error { - if entry.Data["error"] == nil { - entry.Logger.WithFields(logrus.Fields{ - "source": "airbrake", - "endpoint": airbrake.Endpoint, - }).Warn("Exceptions sent to Airbrake must have an 'error' key with the error") - return nil +func NewHook(endpoint, apiKey, env string) *airbrakeHook { + return &airbrakeHook{ + APIKey: apiKey, + Endpoint: endpoint, + Environment: env, } +} +func (hook *airbrakeHook) Fire(entry *logrus.Entry) error { + airbrake.ApiKey = hook.APIKey + airbrake.Endpoint = hook.Endpoint + airbrake.Environment = hook.Environment + + var notifyErr error err, ok := entry.Data["error"].(error) - if !ok { - entry.Logger.WithFields(logrus.Fields{ - "source": "airbrake", - "endpoint": airbrake.Endpoint, - }).Warn("Exceptions sent to Airbrake must have an `error` key of type `error`") - return nil + if ok { + notifyErr = err + } else { + notifyErr = errors.New(entry.Message) } - airErr := airbrake.Notify(err) + airErr := airbrake.Notify(notifyErr) if airErr != nil { - entry.Logger.WithFields(logrus.Fields{ - "source": "airbrake", - "endpoint": airbrake.Endpoint, - "error": airErr, - }).Warn("Failed to send error to Airbrake") + return fmt.Errorf("Failed to send error to Airbrake: %s", airErr) } return nil } -func (hook *AirbrakeHook) Levels() []logrus.Level { +func (hook *airbrakeHook) Levels() []logrus.Level { return []logrus.Level{ logrus.ErrorLevel, logrus.FatalLevel, diff --git a/vendor/src/github.com/Sirupsen/logrus/hooks/airbrake/airbrake_test.go b/vendor/src/github.com/Sirupsen/logrus/hooks/airbrake/airbrake_test.go new file mode 100644 index 0000000000..058a91e343 --- /dev/null +++ b/vendor/src/github.com/Sirupsen/logrus/hooks/airbrake/airbrake_test.go @@ -0,0 +1,133 @@ +package airbrake + +import ( + "encoding/xml" + "net/http" + "net/http/httptest" + "testing" + "time" + + "github.com/Sirupsen/logrus" +) + +type notice struct { + Error NoticeError `xml:"error"` +} +type NoticeError struct { + Class string `xml:"class"` + Message string `xml:"message"` +} + +type customErr struct { + msg string +} + +func (e *customErr) Error() string { + return e.msg +} + +const ( + testAPIKey = "abcxyz" + testEnv = "development" + expectedClass = "*airbrake.customErr" + expectedMsg = "foo" + unintendedMsg = "Airbrake will not see this string" +) + +var ( + noticeError = make(chan NoticeError, 1) +) + +// TestLogEntryMessageReceived checks if invoking Logrus' log.Error +// method causes an XML payload containing the log entry message is received +// by a HTTP server emulating an Airbrake-compatible endpoint. +func TestLogEntryMessageReceived(t *testing.T) { + log := logrus.New() + ts := startAirbrakeServer(t) + defer ts.Close() + + hook := NewHook(ts.URL, testAPIKey, "production") + log.Hooks.Add(hook) + + log.Error(expectedMsg) + + select { + case received := <-noticeError: + if received.Message != expectedMsg { + t.Errorf("Unexpected message received: %s", received.Message) + } + case <-time.After(time.Second): + t.Error("Timed out; no notice received by Airbrake API") + } +} + +// TestLogEntryMessageReceived confirms that, when passing an error type using +// logrus.Fields, a HTTP server emulating an Airbrake endpoint receives the +// error message returned by the Error() method on the error interface +// rather than the logrus.Entry.Message string. +func TestLogEntryWithErrorReceived(t *testing.T) { + log := logrus.New() + ts := startAirbrakeServer(t) + defer ts.Close() + + hook := NewHook(ts.URL, testAPIKey, "production") + log.Hooks.Add(hook) + + log.WithFields(logrus.Fields{ + "error": &customErr{expectedMsg}, + }).Error(unintendedMsg) + + select { + case received := <-noticeError: + if received.Message != expectedMsg { + t.Errorf("Unexpected message received: %s", received.Message) + } + if received.Class != expectedClass { + t.Errorf("Unexpected error class: %s", received.Class) + } + case <-time.After(time.Second): + t.Error("Timed out; no notice received by Airbrake API") + } +} + +// TestLogEntryWithNonErrorTypeNotReceived confirms that, when passing a +// non-error type using logrus.Fields, a HTTP server emulating an Airbrake +// endpoint receives the logrus.Entry.Message string. +// +// Only error types are supported when setting the 'error' field using +// logrus.WithFields(). +func TestLogEntryWithNonErrorTypeNotReceived(t *testing.T) { + log := logrus.New() + ts := startAirbrakeServer(t) + defer ts.Close() + + hook := NewHook(ts.URL, testAPIKey, "production") + log.Hooks.Add(hook) + + log.WithFields(logrus.Fields{ + "error": expectedMsg, + }).Error(unintendedMsg) + + select { + case received := <-noticeError: + if received.Message != unintendedMsg { + t.Errorf("Unexpected message received: %s", received.Message) + } + case <-time.After(time.Second): + t.Error("Timed out; no notice received by Airbrake API") + } +} + +func startAirbrakeServer(t *testing.T) *httptest.Server { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var notice notice + if err := xml.NewDecoder(r.Body).Decode(¬ice); err != nil { + t.Error(err) + } + r.Body.Close() + + noticeError <- notice.Error + })) + + return ts +} diff --git a/vendor/src/github.com/Sirupsen/logrus/hooks/bugsnag/bugsnag.go b/vendor/src/github.com/Sirupsen/logrus/hooks/bugsnag/bugsnag.go new file mode 100644 index 0000000000..d20a0f54ab --- /dev/null +++ b/vendor/src/github.com/Sirupsen/logrus/hooks/bugsnag/bugsnag.go @@ -0,0 +1,68 @@ +package logrus_bugsnag + +import ( + "errors" + + "github.com/Sirupsen/logrus" + "github.com/bugsnag/bugsnag-go" +) + +type bugsnagHook struct{} + +// ErrBugsnagUnconfigured is returned if NewBugsnagHook is called before +// bugsnag.Configure. Bugsnag must be configured before the hook. +var ErrBugsnagUnconfigured = errors.New("bugsnag must be configured before installing this logrus hook") + +// ErrBugsnagSendFailed indicates that the hook failed to submit an error to +// bugsnag. The error was successfully generated, but `bugsnag.Notify()` +// failed. +type ErrBugsnagSendFailed struct { + err error +} + +func (e ErrBugsnagSendFailed) Error() string { + return "failed to send error to Bugsnag: " + e.err.Error() +} + +// NewBugsnagHook initializes a logrus hook which sends exceptions to an +// exception-tracking service compatible with the Bugsnag API. Before using +// this hook, you must call bugsnag.Configure(). The returned object should be +// registered with a log via `AddHook()` +// +// Entries that trigger an Error, Fatal or Panic should now include an "error" +// field to send to Bugsnag. +func NewBugsnagHook() (*bugsnagHook, error) { + if bugsnag.Config.APIKey == "" { + return nil, ErrBugsnagUnconfigured + } + return &bugsnagHook{}, nil +} + +// Fire forwards an error to Bugsnag. Given a logrus.Entry, it extracts the +// "error" field (or the Message if the error isn't present) and sends it off. +func (hook *bugsnagHook) Fire(entry *logrus.Entry) error { + var notifyErr error + err, ok := entry.Data["error"].(error) + if ok { + notifyErr = err + } else { + notifyErr = errors.New(entry.Message) + } + + bugsnagErr := bugsnag.Notify(notifyErr) + if bugsnagErr != nil { + return ErrBugsnagSendFailed{bugsnagErr} + } + + return nil +} + +// Levels enumerates the log levels on which the error should be forwarded to +// bugsnag: everything at or above the "Error" level. +func (hook *bugsnagHook) Levels() []logrus.Level { + return []logrus.Level{ + logrus.ErrorLevel, + logrus.FatalLevel, + logrus.PanicLevel, + } +} diff --git a/vendor/src/github.com/Sirupsen/logrus/hooks/bugsnag/bugsnag_test.go b/vendor/src/github.com/Sirupsen/logrus/hooks/bugsnag/bugsnag_test.go new file mode 100644 index 0000000000..e9ea298d89 --- /dev/null +++ b/vendor/src/github.com/Sirupsen/logrus/hooks/bugsnag/bugsnag_test.go @@ -0,0 +1,64 @@ +package logrus_bugsnag + +import ( + "encoding/json" + "errors" + "io/ioutil" + "net/http" + "net/http/httptest" + "testing" + "time" + + "github.com/Sirupsen/logrus" + "github.com/bugsnag/bugsnag-go" +) + +type notice struct { + Events []struct { + Exceptions []struct { + Message string `json:"message"` + } `json:"exceptions"` + } `json:"events"` +} + +func TestNoticeReceived(t *testing.T) { + msg := make(chan string, 1) + expectedMsg := "foo" + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var notice notice + data, _ := ioutil.ReadAll(r.Body) + if err := json.Unmarshal(data, ¬ice); err != nil { + t.Error(err) + } + _ = r.Body.Close() + + msg <- notice.Events[0].Exceptions[0].Message + })) + defer ts.Close() + + hook := &bugsnagHook{} + + bugsnag.Configure(bugsnag.Configuration{ + Endpoint: ts.URL, + ReleaseStage: "production", + APIKey: "12345678901234567890123456789012", + Synchronous: true, + }) + + log := logrus.New() + log.Hooks.Add(hook) + + log.WithFields(logrus.Fields{ + "error": errors.New(expectedMsg), + }).Error("Bugsnag will not see this string") + + select { + case received := <-msg: + if received != expectedMsg { + t.Errorf("Unexpected message received: %s", received) + } + case <-time.After(time.Second): + t.Error("Timed out; no notice received by Bugsnag API") + } +} diff --git a/vendor/src/github.com/Sirupsen/logrus/json_formatter.go b/vendor/src/github.com/Sirupsen/logrus/json_formatter.go index 0e38a61919..5c4c44bbe5 100644 --- a/vendor/src/github.com/Sirupsen/logrus/json_formatter.go +++ b/vendor/src/github.com/Sirupsen/logrus/json_formatter.go @@ -11,11 +11,12 @@ type JSONFormatter struct{} func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) { data := make(Fields, len(entry.Data)+3) for k, v := range entry.Data { - // Otherwise errors are ignored by `encoding/json` - // https://github.com/Sirupsen/logrus/issues/137 - if err, ok := v.(error); ok { - data[k] = err.Error() - } else { + switch v := v.(type) { + case error: + // Otherwise errors are ignored by `encoding/json` + // https://github.com/Sirupsen/logrus/issues/137 + data[k] = v.Error() + default: data[k] = v } } diff --git a/vendor/src/github.com/Sirupsen/logrus/logger.go b/vendor/src/github.com/Sirupsen/logrus/logger.go index b392e547a7..da928a3750 100644 --- a/vendor/src/github.com/Sirupsen/logrus/logger.go +++ b/vendor/src/github.com/Sirupsen/logrus/logger.go @@ -65,11 +65,15 @@ func (logger *Logger) WithFields(fields Fields) *Entry { } func (logger *Logger) Debugf(format string, args ...interface{}) { - NewEntry(logger).Debugf(format, args...) + if logger.Level >= DebugLevel { + NewEntry(logger).Debugf(format, args...) + } } func (logger *Logger) Infof(format string, args ...interface{}) { - NewEntry(logger).Infof(format, args...) + if logger.Level >= InfoLevel { + NewEntry(logger).Infof(format, args...) + } } func (logger *Logger) Printf(format string, args ...interface{}) { @@ -77,31 +81,45 @@ func (logger *Logger) Printf(format string, args ...interface{}) { } func (logger *Logger) Warnf(format string, args ...interface{}) { - NewEntry(logger).Warnf(format, args...) + if logger.Level >= WarnLevel { + NewEntry(logger).Warnf(format, args...) + } } func (logger *Logger) Warningf(format string, args ...interface{}) { - NewEntry(logger).Warnf(format, args...) + if logger.Level >= WarnLevel { + NewEntry(logger).Warnf(format, args...) + } } func (logger *Logger) Errorf(format string, args ...interface{}) { - NewEntry(logger).Errorf(format, args...) + if logger.Level >= ErrorLevel { + NewEntry(logger).Errorf(format, args...) + } } func (logger *Logger) Fatalf(format string, args ...interface{}) { - NewEntry(logger).Fatalf(format, args...) + if logger.Level >= FatalLevel { + NewEntry(logger).Fatalf(format, args...) + } } func (logger *Logger) Panicf(format string, args ...interface{}) { - NewEntry(logger).Panicf(format, args...) + if logger.Level >= PanicLevel { + NewEntry(logger).Panicf(format, args...) + } } func (logger *Logger) Debug(args ...interface{}) { - NewEntry(logger).Debug(args...) + if logger.Level >= DebugLevel { + NewEntry(logger).Debug(args...) + } } func (logger *Logger) Info(args ...interface{}) { - NewEntry(logger).Info(args...) + if logger.Level >= InfoLevel { + NewEntry(logger).Info(args...) + } } func (logger *Logger) Print(args ...interface{}) { @@ -109,31 +127,45 @@ func (logger *Logger) Print(args ...interface{}) { } func (logger *Logger) Warn(args ...interface{}) { - NewEntry(logger).Warn(args...) + if logger.Level >= WarnLevel { + NewEntry(logger).Warn(args...) + } } func (logger *Logger) Warning(args ...interface{}) { - NewEntry(logger).Warn(args...) + if logger.Level >= WarnLevel { + NewEntry(logger).Warn(args...) + } } func (logger *Logger) Error(args ...interface{}) { - NewEntry(logger).Error(args...) + if logger.Level >= ErrorLevel { + NewEntry(logger).Error(args...) + } } func (logger *Logger) Fatal(args ...interface{}) { - NewEntry(logger).Fatal(args...) + if logger.Level >= FatalLevel { + NewEntry(logger).Fatal(args...) + } } func (logger *Logger) Panic(args ...interface{}) { - NewEntry(logger).Panic(args...) + if logger.Level >= PanicLevel { + NewEntry(logger).Panic(args...) + } } func (logger *Logger) Debugln(args ...interface{}) { - NewEntry(logger).Debugln(args...) + if logger.Level >= DebugLevel { + NewEntry(logger).Debugln(args...) + } } func (logger *Logger) Infoln(args ...interface{}) { - NewEntry(logger).Infoln(args...) + if logger.Level >= InfoLevel { + NewEntry(logger).Infoln(args...) + } } func (logger *Logger) Println(args ...interface{}) { @@ -141,21 +173,31 @@ func (logger *Logger) Println(args ...interface{}) { } func (logger *Logger) Warnln(args ...interface{}) { - NewEntry(logger).Warnln(args...) + if logger.Level >= WarnLevel { + NewEntry(logger).Warnln(args...) + } } func (logger *Logger) Warningln(args ...interface{}) { - NewEntry(logger).Warnln(args...) + if logger.Level >= WarnLevel { + NewEntry(logger).Warnln(args...) + } } func (logger *Logger) Errorln(args ...interface{}) { - NewEntry(logger).Errorln(args...) + if logger.Level >= ErrorLevel { + NewEntry(logger).Errorln(args...) + } } func (logger *Logger) Fatalln(args ...interface{}) { - NewEntry(logger).Fatalln(args...) + if logger.Level >= FatalLevel { + NewEntry(logger).Fatalln(args...) + } } func (logger *Logger) Panicln(args ...interface{}) { - NewEntry(logger).Panicln(args...) + if logger.Level >= PanicLevel { + NewEntry(logger).Panicln(args...) + } } diff --git a/vendor/src/github.com/Sirupsen/logrus/terminal_openbsd.go b/vendor/src/github.com/Sirupsen/logrus/terminal_openbsd.go index d238bfa0b4..af609a53d6 100644 --- a/vendor/src/github.com/Sirupsen/logrus/terminal_openbsd.go +++ b/vendor/src/github.com/Sirupsen/logrus/terminal_openbsd.go @@ -1,4 +1,3 @@ - package logrus import "syscall" diff --git a/vendor/src/github.com/Sirupsen/logrus/text_formatter.go b/vendor/src/github.com/Sirupsen/logrus/text_formatter.go index 71dcb6617a..0a06a1105f 100644 --- a/vendor/src/github.com/Sirupsen/logrus/text_formatter.go +++ b/vendor/src/github.com/Sirupsen/logrus/text_formatter.go @@ -3,7 +3,6 @@ package logrus import ( "bytes" "fmt" - "regexp" "sort" "strings" "time" @@ -21,7 +20,6 @@ const ( var ( baseTimestamp time.Time isTerminal bool - noQuoteNeeded *regexp.Regexp ) func init() { diff --git a/vendor/src/github.com/Sirupsen/logrus/writer.go b/vendor/src/github.com/Sirupsen/logrus/writer.go index 90d3e01b45..1e30b1c753 100644 --- a/vendor/src/github.com/Sirupsen/logrus/writer.go +++ b/vendor/src/github.com/Sirupsen/logrus/writer.go @@ -6,7 +6,7 @@ import ( "runtime" ) -func (logger *Logger) Writer() (*io.PipeWriter) { +func (logger *Logger) Writer() *io.PipeWriter { reader, writer := io.Pipe() go logger.writerScanner(reader) From 671c12204cb469d868f646da1474d5bad6541770 Mon Sep 17 00:00:00 2001 From: Peter Waller Date: Tue, 10 Mar 2015 22:10:00 +0000 Subject: [PATCH 40/77] Implement build cancellation Add the capability to cancel the build by disconnecting the client. This adds a `cancelled` channel which is used to signal that a build should halt. The build is halted by sending a Kill signal and noticing that the cancellation channel is closed. This first pass implementation does not allow cancellation during a pull, but that will come in a subsequent PR. * Add documentation of cancellation to cli and API * Protect job cancellation with sync.Once * Add TestBuildCancelationKillsSleep * Add test case for build cancellation of RUN statements. Signed-off-by: Peter Waller --- api/server/server.go | 14 ++ builder/evaluator.go | 10 ++ builder/internals.go | 11 ++ builder/job.go | 1 + .../reference/api/docker_remote_api.md | 5 + .../reference/api/docker_remote_api_v1.18.md | 3 + docs/sources/reference/commandline/cli.md | 6 + engine/engine.go | 2 + engine/job.go | 19 +++ integration-cli/docker_cli_build_test.go | 128 ++++++++++++++++++ integration-cli/utils.go | 12 ++ 11 files changed, 211 insertions(+) diff --git a/api/server/server.go b/api/server/server.go index d244d2a0ce..4a86442454 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -1087,6 +1087,20 @@ func postBuild(eng *engine.Engine, version version.Version, w http.ResponseWrite job.Setenv("cpusetcpus", r.FormValue("cpusetcpus")) job.Setenv("cpushares", r.FormValue("cpushares")) + // Job cancellation. Note: not all job types support this. + if closeNotifier, ok := w.(http.CloseNotifier); ok { + finished := make(chan struct{}) + defer close(finished) + go func() { + select { + case <-finished: + case <-closeNotifier.CloseNotify(): + log.Infof("Client disconnected, cancelling job: %v", job) + job.Cancel() + } + }() + } + if err := job.Run(); err != nil { if !job.Stdout.Used() { return err diff --git a/builder/evaluator.go b/builder/evaluator.go index 985656f16a..79ca4d934a 100644 --- a/builder/evaluator.go +++ b/builder/evaluator.go @@ -131,6 +131,8 @@ type Builder struct { cpuShares int64 memory int64 memorySwap int64 + + cancelled <-chan struct{} // When closed, job was cancelled. } // Run the builder with the context. This is the lynchpin of this package. This @@ -166,6 +168,14 @@ func (b *Builder) Run(context io.Reader) (string, error) { b.TmpContainers = map[string]struct{}{} for i, n := range b.dockerfile.Children { + select { + case <-b.cancelled: + log.Debug("Builder: build cancelled!") + fmt.Fprintf(b.OutStream, "Build cancelled") + return "", fmt.Errorf("Build cancelled") + default: + // Not cancelled yet, keep going... + } if err := b.dispatch(i, n); err != nil { if b.ForceRemove { b.clearTmp() diff --git a/builder/internals.go b/builder/internals.go index 67650f75bc..7c22b47b2b 100644 --- a/builder/internals.go +++ b/builder/internals.go @@ -581,6 +581,17 @@ func (b *Builder) run(c *daemon.Container) error { return err } + finished := make(chan struct{}) + defer close(finished) + go func() { + select { + case <-b.cancelled: + log.Debugln("Build cancelled, killing container:", c.ID) + c.Kill() + case <-finished: + } + }() + if b.Verbose { // Block on reading output from container, stop on err or chan closed if err := <-errCh; err != nil { diff --git a/builder/job.go b/builder/job.go index 27591129cd..59df87e8c6 100644 --- a/builder/job.go +++ b/builder/job.go @@ -153,6 +153,7 @@ func (b *BuilderJob) CmdBuild(job *engine.Job) engine.Status { cpuSetCpus: cpuSetCpus, memory: memory, memorySwap: memorySwap, + cancelled: job.WaitCancelled(), } id, err := builder.Run(context) diff --git a/docs/sources/reference/api/docker_remote_api.md b/docs/sources/reference/api/docker_remote_api.md index 122546cf75..3da4cc82d5 100644 --- a/docs/sources/reference/api/docker_remote_api.md +++ b/docs/sources/reference/api/docker_remote_api.md @@ -76,6 +76,11 @@ Builds can now set resource constraints for all containers created for the build (`CgroupParent`) can be passed in the host config to setup container cgroups under a specific cgroup. +`POST /build` + +**New!** +Closing the HTTP request will now cause the build to be canceled. + ## v1.17 ### Full Documentation diff --git a/docs/sources/reference/api/docker_remote_api_v1.18.md b/docs/sources/reference/api/docker_remote_api_v1.18.md index 3ebddb7d13..b5d9c0e5f4 100644 --- a/docs/sources/reference/api/docker_remote_api_v1.18.md +++ b/docs/sources/reference/api/docker_remote_api_v1.18.md @@ -1144,6 +1144,9 @@ The archive may include any number of other files, which will be accessible in the build context (See the [*ADD build command*](/reference/builder/#dockerbuilder)). +The build will also be canceled if the client drops the connection by quitting +or being killed. + Query Parameters: - **dockerfile** - path within the build context to the Dockerfile. This is diff --git a/docs/sources/reference/commandline/cli.md b/docs/sources/reference/commandline/cli.md index 322f5f401e..6de1dae787 100644 --- a/docs/sources/reference/commandline/cli.md +++ b/docs/sources/reference/commandline/cli.md @@ -599,6 +599,12 @@ in cases where the same set of files are used for multiple builds. The path must be to a file within the build context. If a relative path is specified then it must to be relative to the current directory. +If the Docker client loses connection to the daemon, the build is canceled. +This happens if you interrupt the Docker client with `ctrl-c` or if the Docker +client is killed for any reason. + +> **Note:** Currently only the "run" phase of the build can be canceled until +> pull cancelation is implemented). See also: diff --git a/engine/engine.go b/engine/engine.go index e8286d89f7..83b6efbb80 100644 --- a/engine/engine.go +++ b/engine/engine.go @@ -123,6 +123,8 @@ func (eng *Engine) Job(name string, args ...string) *Job { Stderr: NewOutput(), env: &Env{}, closeIO: true, + + cancelled: make(chan struct{}), } if eng.Logging { job.Stderr.Add(ioutils.NopWriteCloser(eng.Stderr)) diff --git a/engine/job.go b/engine/job.go index 4b2befb425..ecb68c3eb7 100644 --- a/engine/job.go +++ b/engine/job.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "strings" + "sync" "time" log "github.com/Sirupsen/logrus" @@ -34,6 +35,12 @@ type Job struct { status Status end time.Time closeIO bool + + // When closed, the job has been cancelled. + // Note: not all jobs implement cancellation. + // See Job.Cancel() and Job.WaitCancelled() + cancelled chan struct{} + cancelOnce sync.Once } type Status int @@ -248,3 +255,15 @@ func (job *Job) StatusCode() int { func (job *Job) SetCloseIO(val bool) { job.closeIO = val } + +// When called, causes the Job.WaitCancelled channel to unblock. +func (job *Job) Cancel() { + job.cancelOnce.Do(func() { + close(job.cancelled) + }) +} + +// Returns a channel which is closed ("never blocks") when the job is cancelled. +func (job *Job) WaitCancelled() <-chan struct{} { + return job.cancelled +} diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index 6a83595746..cb084255f7 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -2,6 +2,7 @@ package main import ( "archive/tar" + "bufio" "bytes" "encoding/json" "fmt" @@ -14,6 +15,7 @@ import ( "runtime" "strconv" "strings" + "sync" "testing" "text/template" "time" @@ -1924,6 +1926,132 @@ func TestBuildForceRm(t *testing.T) { logDone("build - ensure --force-rm doesn't leave containers behind") } +// Test that an infinite sleep during a build is killed if the client disconnects. +// This test is fairly hairy because there are lots of ways to race. +// Strategy: +// * Monitor the output of docker events starting from before +// * Run a 1-year-long sleep from a docker build. +// * When docker events sees container start, close the "docker build" command +// * Wait for docker events to emit a dying event. +func TestBuildCancelationKillsSleep(t *testing.T) { + // TODO(jfrazelle): Make this work on Windows. + testRequires(t, SameHostDaemon) + + name := "testbuildcancelation" + defer deleteImages(name) + + // (Note: one year, will never finish) + ctx, err := fakeContext("FROM busybox\nRUN sleep 31536000", nil) + if err != nil { + t.Fatal(err) + } + defer ctx.Close() + + var wg sync.WaitGroup + defer wg.Wait() + + finish := make(chan struct{}) + defer close(finish) + + eventStart := make(chan struct{}) + eventDie := make(chan struct{}) + + // Start one second ago, to avoid rounding problems + startEpoch := time.Now().Add(-1 * time.Second) + + // Goroutine responsible for watching start/die events from `docker events` + wg.Add(1) + go func() { + defer wg.Done() + + // Watch for events since epoch. + eventsCmd := exec.Command(dockerBinary, "events", + "-since", fmt.Sprint(startEpoch.Unix())) + stdout, err := eventsCmd.StdoutPipe() + err = eventsCmd.Start() + if err != nil { + t.Fatalf("failed to start 'docker events': %s", err) + } + + go func() { + <-finish + eventsCmd.Process.Kill() + }() + + var started, died bool + matchStart := regexp.MustCompile(" \\(from busybox\\:latest\\) start$") + matchDie := regexp.MustCompile(" \\(from busybox\\:latest\\) die$") + + // + // Read lines of `docker events` looking for container start and stop. + // + scanner := bufio.NewScanner(stdout) + for scanner.Scan() { + if ok := matchStart.MatchString(scanner.Text()); ok { + if started { + t.Fatal("assertion fail: more than one container started") + } + close(eventStart) + started = true + } + if ok := matchDie.MatchString(scanner.Text()); ok { + if died { + t.Fatal("assertion fail: more than one container died") + } + close(eventDie) + died = true + } + } + + err = eventsCmd.Wait() + if err != nil && !IsKilled(err) { + t.Fatalf("docker events had bad exit status: %s", err) + } + }() + + buildCmd := exec.Command(dockerBinary, "build", "-t", name, ".") + buildCmd.Dir = ctx.Dir + buildCmd.Stdout = os.Stdout + + err = buildCmd.Start() + if err != nil { + t.Fatalf("failed to run build: %s", err) + } + + select { + case <-time.After(30 * time.Second): + t.Fatal("failed to observe build container start in timely fashion") + case <-eventStart: + // Proceeds from here when we see the container fly past in the + // output of "docker events". + // Now we know the container is running. + } + + // Send a kill to the `docker build` command. + // Causes the underlying build to be cancelled due to socket close. + err = buildCmd.Process.Kill() + if err != nil { + t.Fatalf("error killing build command: %s", err) + } + + // Get the exit status of `docker build`, check it exited because killed. + err = buildCmd.Wait() + if err != nil && !IsKilled(err) { + t.Fatalf("wait failed during build run: %T %s", err, err) + } + + select { + case <-time.After(30 * time.Second): + // If we don't get here in a timely fashion, it wasn't killed. + t.Fatal("container cancel did not succeed") + case <-eventDie: + // We saw the container shut down in the `docker events` stream, + // as expected. + } + + logDone("build - ensure canceled job finishes immediately") +} + func TestBuildRm(t *testing.T) { name := "testbuildrm" defer deleteImages(name) diff --git a/integration-cli/utils.go b/integration-cli/utils.go index 691402f35e..159cfb1d13 100644 --- a/integration-cli/utils.go +++ b/integration-cli/utils.go @@ -42,6 +42,18 @@ func processExitCode(err error) (exitCode int) { return } +func IsKilled(err error) bool { + if exitErr, ok := err.(*exec.ExitError); ok { + sys := exitErr.ProcessState.Sys() + status, ok := sys.(syscall.WaitStatus) + if !ok { + return false + } + return status.Signaled() && status.Signal() == os.Kill + } + return false +} + func runCommandWithOutput(cmd *exec.Cmd) (output string, exitCode int, err error) { exitCode = 0 out, err := cmd.CombinedOutput() From f5c60fc0fd4e0daa068134ab9a887f69c797bae7 Mon Sep 17 00:00:00 2001 From: Raghuram Devarakonda Date: Sun, 22 Mar 2015 11:22:47 -0400 Subject: [PATCH 41/77] Fix typo in git setup doc. Signed-off-by: Raghuram Devarakonda --- docs/sources/project/set-up-git.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sources/project/set-up-git.md b/docs/sources/project/set-up-git.md index ba42c81006..2292d93b3c 100644 --- a/docs/sources/project/set-up-git.md +++ b/docs/sources/project/set-up-git.md @@ -138,7 +138,7 @@ As you change code in your fork, you make your changes on a repository branch. The branch name should reflect what you are working on. In this section, you create a branch, make a change, and push it up to your fork. -This branch is just for testing your config for this guide. The changes arepart +This branch is just for testing your config for this guide. The changes are part of a dry run so the branch name is going to be dry-run-test. To create an push the branch to your fork on GitHub: From fdbec264111ac20b06cdd9b885fe47415a6495e4 Mon Sep 17 00:00:00 2001 From: Mary Anthony Date: Fri, 6 Mar 2015 22:10:08 -0800 Subject: [PATCH 42/77] Updating in light of new contributors guide Link to new guide. Added a quickstart contributor guide for experienced people. Converting narrative style to procedures for easier use. I think there is something missing in the release publishing section...but it looks like it was missing in the original. Updates per thaJeztah Edits per Fred Updating with comments from Sven Signed-off-by: Mary Anthony --- docs/README.md | 339 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 219 insertions(+), 120 deletions(-) diff --git a/docs/README.md b/docs/README.md index 72172112ce..5feb496a73 100755 --- a/docs/README.md +++ b/docs/README.md @@ -1,156 +1,255 @@ # Docker Documentation -The source for Docker documentation is here under `sources/` and uses extended -Markdown, as implemented by [MkDocs](http://mkdocs.org). +The source for Docker documentation is in this directory under `sources/`. Our +documentation uses extended Markdown, as implemented by +[MkDocs](http://mkdocs.org). The current release of the Docker documentation +resides on [http://docs.docker.com](http://docs.docker.com). -The HTML files are built and hosted on -[http://docs.docker.com](http://docs.docker.com), and update automatically -after each change to the `docs` branch of [Docker on -GitHub](https://github.com/docker/docker) thanks to post-commit hooks. +## Understanding the documentation branches and processes -## Contributing - -Be sure to follow the [contribution guidelines](../CONTRIBUTING.md). -In particular, [remember to sign your work!](../CONTRIBUTING.md#sign-your-work) - -## Getting Started - -Docker documentation builds are done in a Docker container, which installs all -the required tools, adds the local `docs/` directory and builds the HTML docs. -It then starts a HTTP server on port 8000 so that you can connect and see your -changes. - -In the root of the `docker` source directory: - - $ make docs - .... (lots of output) .... - docker run --rm -it -e AWS_S3_BUCKET -p 8000:8000 "docker-docs:master" mkdocs serve - Running at: http://0.0.0.0:8000/ - Live reload enabled. - Hold ctrl+c to quit. - -If you have any issues you need to debug, you can use `make docs-shell` and then -run `mkdocs serve` - -## Testing the links - -You can use `make docs-test` to generate a report of missing links that are referenced in -the documentation - there should be none. - -## Adding a new document - -New document (`.md`) files are added to the documentation builds by adding them -to the menu definition in the `docs/mkdocs.yml` file. - -## Style guide - -If you have questions about how to write for Docker's documentation (e.g., -questions about grammar, syntax, formatting, styling, language, or tone) please -see the [style guide](sources/contributing/docs_style-guide.md). If something -isn't clear in the guide, please submit a PR to help us improve it. - -## Working using GitHub's file editor - -Alternatively, for small changes and typos you might want to use GitHub's built- -in file editor. It allows you to preview your changes right on-line (though -there can be some differences between GitHub Markdown and [MkDocs -Markdown](http://www.mkdocs.org/user-guide/writing-your-docs/)). Just be -careful not to create many commits. And you must still [sign your -work!](../CONTRIBUTING.md#sign-your-work) - -## Branches +Docker has two primary branches for documentation: | Branch | Description | URL (published via commit-hook) | |----------|--------------------------------|------------------------------------------------------------------------------| | `docs` | Official release documentation | [http://docs.docker.com](http://docs.docker.com) | -| `master` | Unreleased development work | [http://docs.master.dockerproject.com](http://docs.master.dockerproject.com) | +| `master` | Merged but unreleased development work | [http://docs.master.dockerproject.com](http://docs.master.dockerproject.com) | -**There are two branches related to editing docs**: `master` and `docs`. You -should always edit the documentation on a local branch of the `master` branch, -and send a PR against `master`. That way your fixes will automatically get -included in later releases, and docs maintainers can easily cherry-pick your -changes into the `docs` release branch. In the rare case where your change is -not forward-compatible, you may need to base your changes on the `docs` branch. +Additions and updates to upcoming releases are made in a feature branch off of +the `master` branch. The Docker maintainers also support a `docs` branch that +contains the last release of documentation. -Also, since there is a separate `docs` branch, we can keep -[http://docs.docker.com](http://docs.docker.com) up to date with any bugs found -between Docker code releases. +After a release, documentation updates are continually merged into `master` as +they occur. This work includes new documentation for forthcoming features, bug +fixes, and other updates. Docker's CI system automatically builds and updates +the `master` documentation after each merge and posts it to +[http://docs.master.dockerproject.com](http://docs.master.dockerproject.com). -## Publishing Documentation +Periodically, the Docker maintainers update `docs.docker.com` between official +releases of Docker. They do this by cherry-picking commits from `master`, +merging them into `docs`, and then publishing the result. -To publish a copy of the documentation you need to have Docker up and running on -your machine. You'll also need a `docs/awsconfig` file containing the settings -you need to access the AWS bucket you'll be deploying to. +In the rare case where a change is not forward-compatible, changes may be made +on other branches by special arrangement with the Docker maintainers. -The release script will create an s3 if needed, and will then push the files to it. +### Quickstart for documentation contributors - [profile dowideit-docs] - aws_access_key_id = IHOIUAHSIDH234rwf.... - aws_secret_access_key = OIUYSADJHLKUHQWIUHE...... - region = ap-southeast-2 +If you are a new or beginner contributor, we encourage you to read through the +[our detailed contributors +guide](https://docs.docker.com/project/who-written-for/). The guide explains in +detail, with examples, how to contribute. If you are an experienced contributor +this quickstart should be enough to get you started. -The `profile` name must be the same as the name of the bucket you are deploying -to - which you call from the `docker` directory: +The following is the essential workflow for contributing to the documentation: - make AWS_S3_BUCKET=dowideit-docs docs-release +1. Fork the `docker/docker` repository. -This will publish _only_ to the `http://bucket-url/v1.2/` version of the -documentation. +2. Clone the repository to your local machine. -If you're publishing the current release's documentation, you need to -also update the root docs pages by running +3. Select an issue from `docker/docker` to work on or submit a proposal of your +own. - make AWS_S3_BUCKET=dowideit-docs BUILD_ROOT=yes docs-release +4. Create a feature branch from `master` in which to work. -> **Note:** -> if you are using Boot2Docker on OSX and the above command returns an error, -> `Post http:///var/run/docker.sock/build?rm=1&t=docker-docs%3Apost-1.2.0-docs_update-2: -> dial unix /var/run/docker.sock: no such file or directory', you need to set the Docker -> host. Run `eval "$(boot2docker shellinit)"` to see the correct variable to set. The command -> will return the full `export` command, so you can just cut and paste. + By basing from `master` your work is automatically included in the next + release. It also allows docs maintainers to easily cherry-pick your changes + into the `docs` release branch. + +4. Modify existing or add new `.md` files to the `docs/sources` directory. + + If you add a new document (`.md`) file, you must also add it to the + appropriate section of the `docs/mkdocs.yml` file in this repository. + + +5. As you work, build the documentation site locally to see your changes. + + The `docker/docker` repository contains a `Dockerfile` and a `Makefile`. + Together, these create a development environment in which you can build and + run a container running the Docker documentation website. To build the + documentation site, enter `make docs` at the root of your `docker/docker` + fork: + + $ make docs + .... (lots of output) .... + docker run --rm -it -e AWS_S3_BUCKET -p 8000:8000 "docker-docs:master" mkdocs serve + Running at: http://0.0.0.0:8000/ + Live reload enabled. + Hold ctrl+c to quit. + + + The build creates an image containing all the required tools, adds the local + `docs/` directory and generates the HTML files. Then, it runs a Docker + container with this image. + + The container exposes port 8000 on the localhost so that you can connect and + see your changes. If you are running Boot2Docker, use the `boot2docker ip` + to get the address of your server. + +6. Check your writing for style and mechanical errors. + + Use our [documentation style + guide](https://docs.docker.com/project/doc-style/) to check style. There are + several [good grammar and spelling online + checkers](http://www.hemingwayapp.com/) that can check your writing + mechanics. + +7. Squash your commits on your branch. + +8. Make a pull request from your fork back to Docker's `master` branch. + +9. Work with the reviewers until your change is approved and merged. + +### Debugging and testing + +If you have any issues you need to debug, you can use `make docs-shell` and then +run `mkdocs serve`. You can use `make docs-test` to generate a report of missing +links that are referenced in the documentation—there should be none. + +## Style guide + +If you have questions about how to write for Docker's documentation, please see +the [style guide](sources/project/doc-style.md). The style guide provides +guidance about grammar, syntax, formatting, styling, language, or tone. If +something isn't clear in the guide, please submit an issue to let us know or +submit a pull request to help us improve it. + + +## Publishing documentation (for Docker maintainers) + +To publish Docker's documentation you need to have Docker up and running on your +machine. You'll also need a `docs/awsconfig` file containing the settings you +need to access the AWS bucket you'll be deploying to. + +The process for publishing is to build first to an AWS bucket, verify the build, +and then publish the final release. + +1. Have Docker installed and running on your machine. + +2. Ask the core maintainers for the `awsconfig` file. + +3. Copy the `awsconfig` file to the `docs/` directory. + + The `awsconfig` file contains the profiles of the S3 buckets for our + documentation sites. (If needed, the release script creates an S3 bucket and + pushes the files to it.) Each profile has this format: + + [profile dowideit-docs] + aws_access_key_id = IHOIUAHSIDH234rwf.... + aws_secret_access_key = OIUYSADJHLKUHQWIUHE...... + region = ap-southeast-2 + + The `profile` name must be the same as the name of the bucket you are + deploying to. + +4. Call the `make` from the `docker` directory. + + $ make AWS_S3_BUCKET=dowideit-docs docs-release + + This publishes _only_ to the `http://bucket-url/v1.2/` version of the + documentation. + +5. If you're publishing the current release's documentation, you need to also +update the root docs pages by running + + $ make AWS_S3_BUCKET=dowideit-docs BUILD_ROOT=yes docs-release + +### Errors publishing using Boot2Docker + +Sometimes, in a Boot2Docker environment, the publishing procedure returns this +error: + + Post http:///var/run/docker.sock/build?rm=1&t=docker-docs%3Apost-1.2.0-docs_update-2: + dial unix /var/run/docker.sock: no such file or directory. + +If this happens, set the Docker host. Run the following command to set the +variables in your shell: + + $ eval "$(boot2docker shellinit)" ## Cherry-picking documentation changes to update an existing release. -Whenever the core team makes a release, they publish the documentation based -on the `release` branch (which is copied into the `docs` branch). The -documentation team can make updates in the meantime, by cherry-picking changes -from `master` into any of the docs branches. +Whenever the core team makes a release, they publish the documentation based on +the `release` branch. At that time, the `release` branch is copied into the +`docs` branch. The documentation team makes updates between Docker releases by +cherry-picking changes from `master` into any of the documentation branches. +Typically, we cherry-pick into the `docs` branch. -For example, to update the current release's docs: +For example, to update the current release's docs, do the following: - git fetch upstream - git checkout -b post-1.2.0-docs-update-1 upstream/docs - # Then go through the Merge commit linked to PR's (making sure they apply - to that release) - # see https://github.com/docker/docker/commits/master - git cherry-pick -x fe845c4 - # Repeat until you have cherry picked everything you will propose to be merged - git push upstream post-1.2.0-docs-update-1 +1. Go to your `docker/docker` fork and get the latest from master. -Then make a pull request to merge into the `docs` branch, __NOT__ into master. + $ git fetch upstream + +2. Checkout a new branch based on `upstream/docs`. -Once the PR has the needed `LGTM`s, merge it, then publish to our beta server -to test: + You should give your new branch a descriptive name. - git fetch upstream - git checkout docs - git reset --hard upstream/docs - make AWS_S3_BUCKET=beta-docs.docker.io BUILD_ROOT=yes docs-release + $ git checkout -b post-1.2.0-docs-update-1 upstream/docs + +3. In a browser window, open [https://github.com/docker/docker/commits/master]. -Then go to http://beta-docs.docker.io.s3-website-us-west-2.amazonaws.com/ -to view your results and make sure what you published is what you wanted. +4. Locate the merges you want to publish. -When you're happy with it, publish the docs to our live site: + You should only cherry-pick individual commits; do not cherry-pick merge + commits. To minimize merge conflicts, start with the oldest commit and work + your way forward in time. - make AWS_S3_BUCKET=docs.docker.com BUILD_ROOT=yes DISTRIBUTION_ID=C2K6......FL2F docs-release +5. Copy the commit SHA from GitHub. -Test the uncached version of the live docs at http://docs.docker.com.s3-website-us-east-1.amazonaws.com/ +6. Cherry-pick the commit. + + $ git cherry-pick -x fe845c4 + +7. Repeat until you have cherry-picked everything you want to merge. + +8. Push your changes to your fork. + + $ git push origin post-1.2.0-docs-update-1 + +9. Make a pull request to merge into the `docs` branch. + + Do __NOT__ merge into `master`. + +10. Have maintainers review your pull request. + +11. Once the PR has the needed "LGTMs", merge it on GitHub. + +12. Return to your local fork and make sure you are still on the `docs` branch. + + $ git checkout docs + +13. Fetch your merged pull request from `docs`. + + $ git fetch upstream/docs + +14. Ensure your branch is clean and set to the latest. + + $ git reset --hard upstream/docs -Note that the new docs will not appear live on the site until the cache (a complex, -distributed CDN system) is flushed. The `make docs-release` command will do this -_if_ the `DISTRIBUTION_ID` is set to the Cloudfront distribution ID (ask the meta -team) - this will take at least 15 minutes to run and you can check its progress -with the CDN Cloudfront Chrome addin. +15. Copy the `awsconfig` file into the `docs` directory. + +16. Make the beta documentation + + $ make AWS_S3_BUCKET=beta-docs.docker.io BUILD_ROOT=yes docs-release + +17. Open [the beta +website](http://beta-docs.docker.io.s3-website-us-west-2.amazonaws.com/) site +and make sure what you published is correct. + +19. When you're happy with your content, publish the docs to our live site: + + $ make AWS_S3_BUCKET=docs.docker.com BUILD_ROOT=yes +DISTRIBUTION_ID=C2K6......FL2F docs-release + +20. Test the uncached version of the live docs at [http://docs.docker.com.s3-website-us-east-1.amazonaws.com/] + + +### Caching and the docs + +New docs do not appear live on the site until the cache (a complex, distributed +CDN system) is flushed. The `make docs-release` command flushes the cache _if_ +the `DISTRIBUTION_ID` is set to the Cloudfront distribution ID. The cache flush +can take at least 15 minutes to run and you can check its progress with the CDN +Cloudfront Purge Tool Chrome app. ## Removing files from the docs.docker.com site From 01a43174dae3b88e264f3139e1a4bf7ee666957f Mon Sep 17 00:00:00 2001 From: Tibor Vass Date: Sun, 22 Mar 2015 12:55:21 -0400 Subject: [PATCH 43/77] winconsole: cleanup Signed-off-by: Tibor Vass --- docker/docker.go | 2 +- pkg/term/term.go | 4 +- pkg/term/term_windows.go | 5 +- pkg/term/winconsole/console_windows.go | 592 +++++++++++-------------- pkg/term/winconsole/term_emulator.go | 2 +- 5 files changed, 262 insertions(+), 343 deletions(-) diff --git a/docker/docker.go b/docker/docker.go index 88a2fbae21..347424432b 100644 --- a/docker/docker.go +++ b/docker/docker.go @@ -31,7 +31,7 @@ func main() { } // Set terminal emulation based on platform as required. - stdout, stderr, stdin := term.StdStreams() + stdin, stdout, stderr := term.StdStreams() initLogging(stderr) diff --git a/pkg/term/term.go b/pkg/term/term.go index b7a5d1874b..b945a3dcea 100644 --- a/pkg/term/term.go +++ b/pkg/term/term.go @@ -26,8 +26,8 @@ type Winsize struct { y uint16 } -func StdStreams() (stdOut io.Writer, stdErr io.Writer, stdIn io.ReadCloser) { - return os.Stdout, os.Stderr, os.Stdin +func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { + return os.Stdin, os.Stdout, os.Stderr } func GetFdInfo(in interface{}) (uintptr, bool) { diff --git a/pkg/term/term_windows.go b/pkg/term/term_windows.go index 713572878f..e6d9466a63 100644 --- a/pkg/term/term_windows.go +++ b/pkg/term/term_windows.go @@ -2,8 +2,9 @@ package term import ( - "github.com/docker/docker/pkg/term/winconsole" "io" + + "github.com/docker/docker/pkg/term/winconsole" ) // State holds the console mode for the terminal. @@ -112,6 +113,6 @@ func GetFdInfo(in interface{}) (uintptr, bool) { return winconsole.GetHandleInfo(in) } -func StdStreams() (stdOut io.Writer, stdErr io.Writer, stdIn io.ReadCloser) { +func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { return winconsole.StdStreams() } diff --git a/pkg/term/winconsole/console_windows.go b/pkg/term/winconsole/console_windows.go index f10b1e0f22..19977b1010 100644 --- a/pkg/term/winconsole/console_windows.go +++ b/pkg/term/winconsole/console_windows.go @@ -203,68 +203,70 @@ type WindowsTerminal struct { inputEscapeSequence []byte } -func StdStreams() (stdOut io.Writer, stdErr io.Writer, stdIn io.ReadCloser) { +func getStdHandle(stdhandle int) uintptr { + handle, err := syscall.GetStdHandle(stdhandle) + if err != nil { + panic(fmt.Errorf("could not get standard io handle %d", stdhandle)) + } + return uintptr(handle) +} + +func StdStreams() (stdIn io.ReadCloser, stdOut io.Writer, stdErr io.Writer) { handler := &WindowsTerminal{ inputBuffer: make([]byte, MAX_INPUT_BUFFER), inputEscapeSequence: []byte(KEY_ESC_CSI), inputEvents: make([]INPUT_RECORD, MAX_INPUT_EVENTS), } - // Save current screen buffer info - handle, err := syscall.GetStdHandle(syscall.STD_OUTPUT_HANDLE) - if nil != err { - panic("This should never happen as it is predefined handle.") - } - screenBufferInfo, err := GetConsoleScreenBufferInfo(uintptr(handle)) - if err == nil { - handler.screenBufferInfo = screenBufferInfo - } - - // Set the window size - SetWindowSize(uintptr(handle), DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_HEIGHT) - buffer = make([]CHAR_INFO, screenBufferInfo.MaximumWindowSize.X*screenBufferInfo.MaximumWindowSize.Y) - - if IsTerminal(os.Stdout.Fd()) { - stdOut = &terminalWriter{ - wrappedWriter: os.Stdout, - emulator: handler, - command: make([]byte, 0, ANSI_MAX_CMD_LENGTH), - fd: uintptr(handle), - } - } else { - stdOut = os.Stdout - - } - if IsTerminal(os.Stderr.Fd()) { - handle, err := syscall.GetStdHandle(syscall.STD_ERROR_HANDLE) - if nil != err { - panic("This should never happen as it is predefined handle.") - } - stdErr = &terminalWriter{ - wrappedWriter: os.Stderr, - emulator: handler, - command: make([]byte, 0, ANSI_MAX_CMD_LENGTH), - fd: uintptr(handle), - } - } else { - stdErr = os.Stderr - } if IsTerminal(os.Stdin.Fd()) { - handle, err := syscall.GetStdHandle(syscall.STD_INPUT_HANDLE) - if nil != err { - panic("This should never happen as it is predefined handle.") - } stdIn = &terminalReader{ wrappedReader: os.Stdin, emulator: handler, command: make([]byte, 0, ANSI_MAX_CMD_LENGTH), - fd: uintptr(handle), + fd: getStdHandle(syscall.STD_INPUT_HANDLE), } } else { stdIn = os.Stdin } - return + if IsTerminal(os.Stdout.Fd()) { + stdoutHandle := getStdHandle(syscall.STD_OUTPUT_HANDLE) + + // Save current screen buffer info + screenBufferInfo, err := GetConsoleScreenBufferInfo(stdoutHandle) + if err != nil { + // If GetConsoleScreenBufferInfo returns a nil error, it usually means that stdout is not a TTY. + // However, this is in the branch where stdout is a TTY, hence the panic. + panic("could not get console screen buffer info") + } + handler.screenBufferInfo = screenBufferInfo + + // Set the window size + SetWindowSize(stdoutHandle, DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_HEIGHT) + buffer = make([]CHAR_INFO, screenBufferInfo.MaximumWindowSize.X*screenBufferInfo.MaximumWindowSize.Y) + + stdOut = &terminalWriter{ + wrappedWriter: os.Stdout, + emulator: handler, + command: make([]byte, 0, ANSI_MAX_CMD_LENGTH), + fd: stdoutHandle, + } + } else { + stdOut = os.Stdout + } + + if IsTerminal(os.Stderr.Fd()) { + stdErr = &terminalWriter{ + wrappedWriter: os.Stderr, + emulator: handler, + command: make([]byte, 0, ANSI_MAX_CMD_LENGTH), + fd: getStdHandle(syscall.STD_ERROR_HANDLE), + } + } else { + stdErr = os.Stderr + } + + return stdIn, stdOut, stdErr } // GetHandleInfo returns file descriptor and bool indicating whether the file is a terminal @@ -284,81 +286,64 @@ func GetHandleInfo(in interface{}) (uintptr, bool) { return inFd, isTerminalIn } -// GetConsoleMode gets the console mode for given file descriptor -// http://msdn.microsoft.com/en-us/library/windows/desktop/ms683167(v=vs.85).aspx -func GetConsoleMode(fileDesc uintptr) (uint32, error) { - var mode uint32 - err := syscall.GetConsoleMode(syscall.Handle(fileDesc), &mode) - return mode, err -} - -// SetConsoleMode sets the console mode for given file descriptor -// http://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx -func SetConsoleMode(fileDesc uintptr, mode uint32) error { - r, _, err := setConsoleModeProc.Call(fileDesc, uintptr(mode), 0) - if r == 0 { - if err != nil { - return err +func getError(r1, r2 uintptr, lastErr error) error { + // If the function fails, the return value is zero. + if r1 == 0 { + if lastErr != nil { + return lastErr } return syscall.EINVAL } return nil } +// GetConsoleMode gets the console mode for given file descriptor +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms683167(v=vs.85).aspx +func GetConsoleMode(handle uintptr) (uint32, error) { + var mode uint32 + err := syscall.GetConsoleMode(syscall.Handle(handle), &mode) + return mode, err +} + +// SetConsoleMode sets the console mode for given file descriptor +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx +func SetConsoleMode(handle uintptr, mode uint32) error { + return getError(setConsoleModeProc.Call(handle, uintptr(mode), 0)) +} + // SetCursorVisible sets the cursor visbility // http://msdn.microsoft.com/en-us/library/windows/desktop/ms686019(v=vs.85).aspx -func SetCursorVisible(fileDesc uintptr, isVisible BOOL) (bool, error) { +func SetCursorVisible(handle uintptr, isVisible BOOL) (bool, error) { var cursorInfo CONSOLE_CURSOR_INFO - r, _, err := getConsoleCursorInfoProc.Call(uintptr(fileDesc), uintptr(unsafe.Pointer(&cursorInfo)), 0) - if r == 0 { - if err != nil { - return false, err - } - return false, syscall.EINVAL + if err := getError(getConsoleCursorInfoProc.Call(handle, uintptr(unsafe.Pointer(&cursorInfo)), 0)); err != nil { + return false, err } cursorInfo.Visible = isVisible - r, _, err = setConsoleCursorInfoProc.Call(uintptr(fileDesc), uintptr(unsafe.Pointer(&cursorInfo)), 0) - if r == 0 { - if err != nil { - return false, err - } - return false, syscall.EINVAL + if err := getError(setConsoleCursorInfoProc.Call(handle, uintptr(unsafe.Pointer(&cursorInfo)), 0)); err != nil { + return false, err } return true, nil } // SetWindowSize sets the size of the console window. -func SetWindowSize(fileDesc uintptr, width, height, max SHORT) (bool, error) { +func SetWindowSize(handle uintptr, width, height, max SHORT) (bool, error) { window := SMALL_RECT{Left: 0, Top: 0, Right: width - 1, Bottom: height - 1} coord := COORD{X: width - 1, Y: max} - r, _, err := setConsoleWindowInfoProc.Call(uintptr(fileDesc), uintptr(BOOL(1)), uintptr(unsafe.Pointer(&window))) - if r == 0 { - if err != nil { - return false, err - } - return false, syscall.EINVAL + if err := getError(setConsoleWindowInfoProc.Call(handle, uintptr(1), uintptr(unsafe.Pointer(&window)))); err != nil { + return false, err } - r, _, err = setConsoleScreenBufferSizeProc.Call(uintptr(fileDesc), uintptr(marshal(coord))) - if r == 0 { - if err != nil { - return false, err - } - return false, syscall.EINVAL + if err := getError(setConsoleScreenBufferSizeProc.Call(handle, marshal(coord))); err != nil { + return false, err } - return true, nil } // GetConsoleScreenBufferInfo retrieves information about the specified console screen buffer. // http://msdn.microsoft.com/en-us/library/windows/desktop/ms683171(v=vs.85).aspx -func GetConsoleScreenBufferInfo(fileDesc uintptr) (*CONSOLE_SCREEN_BUFFER_INFO, error) { +func GetConsoleScreenBufferInfo(handle uintptr) (*CONSOLE_SCREEN_BUFFER_INFO, error) { var info CONSOLE_SCREEN_BUFFER_INFO - r, _, err := getConsoleScreenBufferInfoProc.Call(uintptr(fileDesc), uintptr(unsafe.Pointer(&info)), 0) - if r == 0 { - if err != nil { - return nil, err - } - return nil, syscall.EINVAL + if err := getError(getConsoleScreenBufferInfoProc.Call(handle, uintptr(unsafe.Pointer(&info)), 0)); err != nil { + return nil, err } return &info, nil } @@ -366,38 +351,22 @@ func GetConsoleScreenBufferInfo(fileDesc uintptr) (*CONSOLE_SCREEN_BUFFER_INFO, // setConsoleTextAttribute sets the attributes of characters written to the // console screen buffer by the WriteFile or WriteConsole function, // http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047(v=vs.85).aspx -func setConsoleTextAttribute(fileDesc uintptr, attribute WORD) (bool, error) { - r, _, err := setConsoleTextAttributeProc.Call(uintptr(fileDesc), uintptr(attribute), 0) - if r == 0 { - if err != nil { - return false, err - } - return false, syscall.EINVAL - } - return true, nil +func setConsoleTextAttribute(handle uintptr, attribute WORD) error { + return getError(setConsoleTextAttributeProc.Call(handle, uintptr(attribute), 0)) } -func writeConsoleOutput(fileDesc uintptr, buffer []CHAR_INFO, bufferSize COORD, bufferCoord COORD, writeRegion *SMALL_RECT) (bool, error) { - r, _, err := writeConsoleOutputProc.Call(uintptr(fileDesc), uintptr(unsafe.Pointer(&buffer[0])), uintptr(marshal(bufferSize)), uintptr(marshal(bufferCoord)), uintptr(unsafe.Pointer(writeRegion))) - if r == 0 { - if err != nil { - return false, err - } - return false, syscall.EINVAL +func writeConsoleOutput(handle uintptr, buffer []CHAR_INFO, bufferSize COORD, bufferCoord COORD, writeRegion *SMALL_RECT) (bool, error) { + if err := getError(writeConsoleOutputProc.Call(handle, uintptr(unsafe.Pointer(&buffer[0])), marshal(bufferSize), marshal(bufferCoord), uintptr(unsafe.Pointer(writeRegion)))); err != nil { + return false, err } return true, nil } // http://msdn.microsoft.com/en-us/library/windows/desktop/ms682663(v=vs.85).aspx -func fillConsoleOutputCharacter(fileDesc uintptr, fillChar byte, length uint32, writeCord COORD) (bool, error) { +func fillConsoleOutputCharacter(handle uintptr, fillChar byte, length uint32, writeCord COORD) (bool, error) { out := int64(0) - r, _, err := fillConsoleOutputCharacterProc.Call(uintptr(fileDesc), uintptr(fillChar), uintptr(length), uintptr(marshal(writeCord)), uintptr(unsafe.Pointer(&out))) - // If the function succeeds, the return value is nonzero. - if r == 0 { - if err != nil { - return false, err - } - return false, syscall.EINVAL + if err := getError(fillConsoleOutputCharacterProc.Call(handle, uintptr(fillChar), uintptr(length), marshal(writeCord), uintptr(unsafe.Pointer(&out)))); err != nil { + return false, err } return true, nil } @@ -435,7 +404,7 @@ func getNumberOfChars(fromCoord COORD, toCoord COORD, screenSize COORD) uint32 { var buffer []CHAR_INFO -func clearDisplayRect(fileDesc uintptr, fillChar rune, attributes WORD, fromCoord COORD, toCoord COORD, windowSize COORD) (bool, uint32, error) { +func clearDisplayRect(handle uintptr, fillChar rune, attributes WORD, fromCoord COORD, toCoord COORD, windowSize COORD) (uint32, error) { var writeRegion SMALL_RECT writeRegion.Top = fromCoord.Y writeRegion.Left = fromCoord.X @@ -453,117 +422,87 @@ func clearDisplayRect(fileDesc uintptr, fillChar rune, attributes WORD, fromCoor } // Write to buffer - r, err := writeConsoleOutput(fileDesc, buffer[:size], windowSize, COORD{X: 0, Y: 0}, &writeRegion) + r, err := writeConsoleOutput(handle, buffer[:size], windowSize, COORD{X: 0, Y: 0}, &writeRegion) if !r { if err != nil { - return false, 0, err + return 0, err } - return false, 0, syscall.EINVAL + return 0, syscall.EINVAL } } - return true, uint32(size), nil + return uint32(size), nil } -func clearDisplayRange(fileDesc uintptr, fillChar rune, attributes WORD, fromCoord COORD, toCoord COORD, windowSize COORD) (bool, uint32, error) { +func clearDisplayRange(handle uintptr, fillChar rune, attributes WORD, fromCoord COORD, toCoord COORD, windowSize COORD) (uint32, error) { nw := uint32(0) // start and end on same line if fromCoord.Y == toCoord.Y { - r, charWritten, err := clearDisplayRect(fileDesc, fillChar, attributes, fromCoord, toCoord, windowSize) - if !r { - if err != nil { - return false, charWritten, err - } - return false, charWritten, syscall.EINVAL - } - return true, charWritten, nil + return clearDisplayRect(handle, fillChar, attributes, fromCoord, toCoord, windowSize) } // TODO(azlinux): if full screen, optimize // spans more than one line if fromCoord.Y < toCoord.Y { // from start position till end of line for first line - r, n, err := clearDisplayRect(fileDesc, fillChar, attributes, fromCoord, COORD{X: windowSize.X - 1, Y: fromCoord.Y}, windowSize) - if !r { - if err != nil { - return false, nw, err - } - return false, nw, syscall.EINVAL + n, err := clearDisplayRect(handle, fillChar, attributes, fromCoord, COORD{X: windowSize.X - 1, Y: fromCoord.Y}, windowSize) + if err != nil { + return nw, err } nw += n // lines between linesBetween := toCoord.Y - fromCoord.Y - 1 if linesBetween > 0 { - r, n, err = clearDisplayRect(fileDesc, fillChar, attributes, COORD{X: 0, Y: fromCoord.Y + 1}, COORD{X: windowSize.X - 1, Y: toCoord.Y - 1}, windowSize) - if !r { - if err != nil { - return false, nw, err - } - return false, nw, syscall.EINVAL + n, err = clearDisplayRect(handle, fillChar, attributes, COORD{X: 0, Y: fromCoord.Y + 1}, COORD{X: windowSize.X - 1, Y: toCoord.Y - 1}, windowSize) + if err != nil { + return nw, err } nw += n } // lines at end - r, n, err = clearDisplayRect(fileDesc, fillChar, attributes, COORD{X: 0, Y: toCoord.Y}, toCoord, windowSize) - if !r { - if err != nil { - return false, nw, err - } - return false, nw, syscall.EINVAL + n, err = clearDisplayRect(handle, fillChar, attributes, COORD{X: 0, Y: toCoord.Y}, toCoord, windowSize) + if err != nil { + return nw, err } nw += n } - return true, nw, nil + return nw, nil } // setConsoleCursorPosition sets the console cursor position // Note The X and Y are zero based // If relative is true then the new position is relative to current one -func setConsoleCursorPosition(fileDesc uintptr, isRelative bool, column int16, line int16) (bool, error) { - screenBufferInfo, err := GetConsoleScreenBufferInfo(fileDesc) - if err == nil { - var position COORD - if isRelative { - position.X = screenBufferInfo.CursorPosition.X + SHORT(column) - position.Y = screenBufferInfo.CursorPosition.Y + SHORT(line) - } else { - position.X = SHORT(column) - position.Y = SHORT(line) - } - - //convert - bits := marshal(position) - r, _, err := setConsoleCursorPositionProc.Call(uintptr(fileDesc), uintptr(bits), 0) - if r == 0 { - if err != nil { - return false, err - } - return false, syscall.EINVAL - } - return true, nil +func setConsoleCursorPosition(handle uintptr, isRelative bool, column int16, line int16) error { + screenBufferInfo, err := GetConsoleScreenBufferInfo(handle) + if err != nil { + return err } - return false, err + var position COORD + if isRelative { + position.X = screenBufferInfo.CursorPosition.X + SHORT(column) + position.Y = screenBufferInfo.CursorPosition.Y + SHORT(line) + } else { + position.X = SHORT(column) + position.Y = SHORT(line) + } + return getError(setConsoleCursorPositionProc.Call(handle, marshal(position), 0)) } // http://msdn.microsoft.com/en-us/library/windows/desktop/ms683207(v=vs.85).aspx -func getNumberOfConsoleInputEvents(fileDesc uintptr) (uint16, error) { +func getNumberOfConsoleInputEvents(handle uintptr) (uint16, error) { var n WORD - r, _, err := getNumberOfConsoleInputEventsProc.Call(uintptr(fileDesc), uintptr(unsafe.Pointer(&n))) - //If the function succeeds, the return value is nonzero - if r != 0 { - return uint16(n), nil + if err := getError(getNumberOfConsoleInputEventsProc.Call(handle, uintptr(unsafe.Pointer(&n)))); err != nil { + return 0, err } - return 0, err + return uint16(n), nil } //http://msdn.microsoft.com/en-us/library/windows/desktop/ms684961(v=vs.85).aspx -func readConsoleInputKey(fileDesc uintptr, inputBuffer []INPUT_RECORD) (int, error) { +func readConsoleInputKey(handle uintptr, inputBuffer []INPUT_RECORD) (int, error) { var nr WORD - r, _, err := readConsoleInputProc.Call(uintptr(fileDesc), uintptr(unsafe.Pointer(&inputBuffer[0])), uintptr(WORD(len(inputBuffer))), uintptr(unsafe.Pointer(&nr))) - //If the function succeeds, the return value is nonzero. - if r != 0 { - return int(nr), nil + if err := getError(readConsoleInputProc.Call(handle, uintptr(unsafe.Pointer(&inputBuffer[0])), uintptr(len(inputBuffer)), uintptr(unsafe.Pointer(&nr)))); err != nil { + return 0, err } - return int(0), err + return int(nr), nil } func getWindowsTextAttributeForAnsiValue(originalFlag WORD, defaultValue WORD, ansiValue int16) (WORD, error) { @@ -638,25 +577,21 @@ func getWindowsTextAttributeForAnsiValue(originalFlag WORD, defaultValue WORD, a flag = (flag & BACKGROUND_MASK_UNSET) | BACKGROUND_GREEN | BACKGROUND_BLUE case ANSI_BACKGROUND_WHITE: flag = (flag & BACKGROUND_MASK_UNSET) | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE - default: - } return flag, nil } // HandleOutputCommand interpretes the Ansi commands and then makes appropriate Win32 calls -func (term *WindowsTerminal) HandleOutputCommand(fd uintptr, command []byte) (n int, err error) { +func (term *WindowsTerminal) HandleOutputCommand(handle uintptr, command []byte) (n int, err error) { + // always consider all the bytes in command, processed + n = len(command) + + parsedCommand := parseAnsiCommand(command) + // console settings changes need to happen in atomic way term.outMutex.Lock() defer term.outMutex.Unlock() - r := false - // Parse the command - parsedCommand := parseAnsiCommand(command) - - // use appropriate handle - handle := syscall.Handle(fd) - switch parsedCommand.Command { case "m": // [Value;...;Valuem @@ -664,9 +599,9 @@ func (term *WindowsTerminal) HandleOutputCommand(fd uintptr, command []byte) (n // Calls the graphics functions specified by the following values. // These specified functions remain active until the next occurrence of this escape sequence. // Graphics mode changes the colors and attributes of text (such as bold and underline) displayed on the screen. - screenBufferInfo, err := GetConsoleScreenBufferInfo(uintptr(handle)) + screenBufferInfo, err := GetConsoleScreenBufferInfo(handle) if err != nil { - return len(command), err + return n, err } flag := screenBufferInfo.Attributes for _, e := range parsedCommand.Parameters { @@ -675,42 +610,40 @@ func (term *WindowsTerminal) HandleOutputCommand(fd uintptr, command []byte) (n flag = term.screenBufferInfo.Attributes // reset } else { flag, err = getWindowsTextAttributeForAnsiValue(flag, term.screenBufferInfo.Attributes, int16(value)) - if nil != err { - return len(command), err + if err != nil { + return n, err } } } - r, err = setConsoleTextAttribute(uintptr(handle), flag) - if !r { - return len(command), err + if err := setConsoleTextAttribute(handle, flag); err != nil { + return n, err } case "H", "f": // [line;columnH // [line;columnf // Moves the cursor to the specified position (coordinates). // If you do not specify a position, the cursor moves to the home position at the upper-left corner of the screen (line 0, column 0). - screenBufferInfo, err := GetConsoleScreenBufferInfo(uintptr(handle)) + screenBufferInfo, err := GetConsoleScreenBufferInfo(handle) if err != nil { - return len(command), err + return n, err } line, err := parseInt16OrDefault(parsedCommand.getParam(0), 1) if err != nil { - return len(command), err + return n, err } if line > int16(screenBufferInfo.Window.Bottom) { line = int16(screenBufferInfo.Window.Bottom) } column, err := parseInt16OrDefault(parsedCommand.getParam(1), 1) if err != nil { - return len(command), err + return n, err } if column > int16(screenBufferInfo.Window.Right) { column = int16(screenBufferInfo.Window.Right) } // The numbers are not 0 based, but 1 based - r, err = setConsoleCursorPosition(uintptr(handle), false, int16(column-1), int16(line-1)) - if !r { - return len(command), err + if err := setConsoleCursorPosition(handle, false, column-1, line-1); err != nil { + return n, err } case "A": @@ -721,9 +654,8 @@ func (term *WindowsTerminal) HandleOutputCommand(fd uintptr, command []byte) (n if err != nil { return len(command), err } - r, err = setConsoleCursorPosition(uintptr(handle), true, 0, -1*value) - if !r { - return len(command), err + if err := setConsoleCursorPosition(handle, true, 0, -value); err != nil { + return n, err } case "B": // [valueB @@ -731,11 +663,10 @@ func (term *WindowsTerminal) HandleOutputCommand(fd uintptr, command []byte) (n // If the cursor is already on the bottom line, ignores this sequence. value, err := parseInt16OrDefault(parsedCommand.getParam(0), 1) if err != nil { - return len(command), err + return n, err } - r, err = setConsoleCursorPosition(uintptr(handle), true, 0, value) - if !r { - return len(command), err + if err := setConsoleCursorPosition(handle, true, 0, value); err != nil { + return n, err } case "C": // [valueC @@ -743,11 +674,10 @@ func (term *WindowsTerminal) HandleOutputCommand(fd uintptr, command []byte) (n // If the cursor is already in the rightmost column, ignores this sequence. value, err := parseInt16OrDefault(parsedCommand.getParam(0), 1) if err != nil { - return len(command), err + return n, err } - r, err = setConsoleCursorPosition(uintptr(handle), true, int16(value), 0) - if !r { - return len(command), err + if err := setConsoleCursorPosition(handle, true, value, 0); err != nil { + return n, err } case "D": // [valueD @@ -755,11 +685,10 @@ func (term *WindowsTerminal) HandleOutputCommand(fd uintptr, command []byte) (n // If the cursor is already in the leftmost column, ignores this sequence. value, err := parseInt16OrDefault(parsedCommand.getParam(0), 1) if err != nil { - return len(command), err + return n, err } - r, err = setConsoleCursorPosition(uintptr(handle), true, int16(-1*value), 0) - if !r { - return len(command), err + if err := setConsoleCursorPosition(handle, true, -value, 0); err != nil { + return n, err } case "J": // [J Erases from the cursor to the end of the screen, including the cursor position. @@ -768,50 +697,49 @@ func (term *WindowsTerminal) HandleOutputCommand(fd uintptr, command []byte) (n // Clears the screen and moves the cursor to the home position (line 0, column 0). value, err := parseInt16OrDefault(parsedCommand.getParam(0), 0) if err != nil { - return len(command), err + return n, err } var start COORD var cursor COORD var end COORD - screenBufferInfo, err := GetConsoleScreenBufferInfo(uintptr(handle)) - if err == nil { - switch value { - case 0: - start = screenBufferInfo.CursorPosition - // end of the screen - end.X = screenBufferInfo.MaximumWindowSize.X - 1 - end.Y = screenBufferInfo.MaximumWindowSize.Y - 1 - // cursor - cursor = screenBufferInfo.CursorPosition - case 1: + screenBufferInfo, err := GetConsoleScreenBufferInfo(handle) + if err != nil { + return n, err + } + switch value { + case 0: + start = screenBufferInfo.CursorPosition + // end of the screen + end.X = screenBufferInfo.MaximumWindowSize.X - 1 + end.Y = screenBufferInfo.MaximumWindowSize.Y - 1 + // cursor + cursor = screenBufferInfo.CursorPosition + case 1: - // start of the screen - start.X = 0 - start.Y = 0 - // end of the screen - end = screenBufferInfo.CursorPosition - // cursor - cursor = screenBufferInfo.CursorPosition - case 2: - // start of the screen - start.X = 0 - start.Y = 0 - // end of the screen - end.X = screenBufferInfo.MaximumWindowSize.X - 1 - end.Y = screenBufferInfo.MaximumWindowSize.Y - 1 - // cursor - cursor.X = 0 - cursor.Y = 0 - } - r, _, err = clearDisplayRange(uintptr(handle), ' ', term.screenBufferInfo.Attributes, start, end, screenBufferInfo.MaximumWindowSize) - if !r { - return len(command), err - } - // remember the the cursor position is 1 based - r, err = setConsoleCursorPosition(uintptr(handle), false, int16(cursor.X), int16(cursor.Y)) - if !r { - return len(command), err - } + // start of the screen + start.X = 0 + start.Y = 0 + // end of the screen + end = screenBufferInfo.CursorPosition + // cursor + cursor = screenBufferInfo.CursorPosition + case 2: + // start of the screen + start.X = 0 + start.Y = 0 + // end of the screen + end.X = screenBufferInfo.MaximumWindowSize.X - 1 + end.Y = screenBufferInfo.MaximumWindowSize.Y - 1 + // cursor + cursor.X = 0 + cursor.Y = 0 + } + if _, err := clearDisplayRange(uintptr(handle), ' ', term.screenBufferInfo.Attributes, start, end, screenBufferInfo.MaximumWindowSize); err != nil { + return n, err + } + // remember the the cursor position is 1 based + if err := setConsoleCursorPosition(handle, false, int16(cursor.X), int16(cursor.Y)); err != nil { + return n, err } case "K": // [K @@ -824,45 +752,44 @@ func (term *WindowsTerminal) HandleOutputCommand(fd uintptr, command []byte) (n var cursor COORD var end COORD screenBufferInfo, err := GetConsoleScreenBufferInfo(uintptr(handle)) - if err == nil { - switch value { - case 0: - // start is where cursor is - start = screenBufferInfo.CursorPosition - // end of line - end.X = screenBufferInfo.MaximumWindowSize.X - 1 - end.Y = screenBufferInfo.CursorPosition.Y - // cursor remains the same - cursor = screenBufferInfo.CursorPosition + if err != nil { + return n, err + } + switch value { + case 0: + // start is where cursor is + start = screenBufferInfo.CursorPosition + // end of line + end.X = screenBufferInfo.MaximumWindowSize.X - 1 + end.Y = screenBufferInfo.CursorPosition.Y + // cursor remains the same + cursor = screenBufferInfo.CursorPosition - case 1: - // beginning of line - start.X = 0 - start.Y = screenBufferInfo.CursorPosition.Y - // until cursor - end = screenBufferInfo.CursorPosition - // cursor remains the same - cursor = screenBufferInfo.CursorPosition - case 2: - // start of the line - start.X = 0 - start.Y = screenBufferInfo.MaximumWindowSize.Y - 1 - // end of the line - end.X = screenBufferInfo.MaximumWindowSize.X - 1 - end.Y = screenBufferInfo.MaximumWindowSize.Y - 1 - // cursor - cursor.X = 0 - cursor.Y = screenBufferInfo.MaximumWindowSize.Y - 1 - } - r, _, err = clearDisplayRange(uintptr(handle), ' ', term.screenBufferInfo.Attributes, start, end, screenBufferInfo.MaximumWindowSize) - if !r { - return len(command), err - } - // remember the the cursor position is 1 based - r, err = setConsoleCursorPosition(uintptr(handle), false, int16(cursor.X), int16(cursor.Y)) - if !r { - return len(command), err - } + case 1: + // beginning of line + start.X = 0 + start.Y = screenBufferInfo.CursorPosition.Y + // until cursor + end = screenBufferInfo.CursorPosition + // cursor remains the same + cursor = screenBufferInfo.CursorPosition + case 2: + // start of the line + start.X = 0 + start.Y = screenBufferInfo.MaximumWindowSize.Y - 1 + // end of the line + end.X = screenBufferInfo.MaximumWindowSize.X - 1 + end.Y = screenBufferInfo.MaximumWindowSize.Y - 1 + // cursor + cursor.X = 0 + cursor.Y = screenBufferInfo.MaximumWindowSize.Y - 1 + } + if _, err := clearDisplayRange(uintptr(handle), ' ', term.screenBufferInfo.Attributes, start, end, screenBufferInfo.MaximumWindowSize); err != nil { + return n, err + } + // remember the the cursor position is 1 based + if err := setConsoleCursorPosition(uintptr(handle), false, int16(cursor.X), int16(cursor.Y)); err != nil { + return n, err } case "l": @@ -875,7 +802,6 @@ func (term *WindowsTerminal) HandleOutputCommand(fd uintptr, command []byte) (n case "?1", "1": // If the DECCKM function is reset, then the arrow keys send ANSI cursor sequences to the host. term.inputEscapeSequence = []byte(KEY_ESC_CSI) - default: } } case "h": @@ -889,34 +815,32 @@ func (term *WindowsTerminal) HandleOutputCommand(fd uintptr, command []byte) (n // If the DECCKM function is set, then the arrow keys send application sequences to the host. // DECCKM (default off): When set, the cursor keys send an ESC O prefix, rather than ESC [. term.inputEscapeSequence = []byte(KEY_ESC_O) - default: } } case "]": - /* - TODO (azlinux): - Linux Console Private CSI Sequences + /* + TODO (azlinux): + Linux Console Private CSI Sequences - The following sequences are neither ECMA-48 nor native VT102. They are - native to the Linux console driver. Colors are in SGR parameters: 0 = - black, 1 = red, 2 = green, 3 = brown, 4 = blue, 5 = magenta, 6 = cyan, - 7 = white. + The following sequences are neither ECMA-48 nor native VT102. They are + native to the Linux console driver. Colors are in SGR parameters: 0 = + black, 1 = red, 2 = green, 3 = brown, 4 = blue, 5 = magenta, 6 = cyan, + 7 = white. - ESC [ 1 ; n ] Set color n as the underline color - ESC [ 2 ; n ] Set color n as the dim color - ESC [ 8 ] Make the current color pair the default attributes. - ESC [ 9 ; n ] Set screen blank timeout to n minutes. - ESC [ 10 ; n ] Set bell frequency in Hz. - ESC [ 11 ; n ] Set bell duration in msec. - ESC [ 12 ; n ] Bring specified console to the front. - ESC [ 13 ] Unblank the screen. - ESC [ 14 ; n ] Set the VESA powerdown interval in minutes. + ESC [ 1 ; n ] Set color n as the underline color + ESC [ 2 ; n ] Set color n as the dim color + ESC [ 8 ] Make the current color pair the default attributes. + ESC [ 9 ; n ] Set screen blank timeout to n minutes. + ESC [ 10 ; n ] Set bell frequency in Hz. + ESC [ 11 ; n ] Set bell duration in msec. + ESC [ 12 ; n ] Bring specified console to the front. + ESC [ 13 ] Unblank the screen. + ESC [ 14 ; n ] Set the VESA powerdown interval in minutes. - */ - default: + */ } - return len(command), nil + return n, nil } // WriteChars writes the bytes to given writer. @@ -1059,19 +983,13 @@ func mapKeystokeToTerminalString(keyEvent *KEY_EVENT_RECORD, escapeSequence []by // getAvailableInputEvents polls the console for availble events // The function does not return until at least one input record has been read. -func getAvailableInputEvents(fd uintptr, inputEvents []INPUT_RECORD) (n int, err error) { - handle := syscall.Handle(fd) - if nil != err { - return 0, err - } +func getAvailableInputEvents(handle uintptr, inputEvents []INPUT_RECORD) (n int, err error) { + // TODO(azlinux): Why is there a for loop? Seems to me, that `n` cannot be negative. - tibor for { // Read number of console events available - nr, err := readConsoleInputKey(uintptr(handle), inputEvents) - if nr == 0 { - return 0, err - } - if 0 < nr { - return nr, nil + n, err = readConsoleInputKey(handle, inputEvents) + if err != nil || n >= 0 { + return n, err } } } @@ -1112,9 +1030,9 @@ func (term *WindowsTerminal) HandleInputSequence(fd uintptr, command []byte) (n return 0, nil } -func marshal(c COORD) uint32 { +func marshal(c COORD) uintptr { // works only on intel-endian machines - return uint32(uint32(uint16(c.Y))<<16 | uint32(uint16(c.X))) + return uintptr(uint32(uint32(uint16(c.Y))<<16 | uint32(uint16(c.X)))) } // IsTerminal returns true if the given file descriptor is a terminal. diff --git a/pkg/term/winconsole/term_emulator.go b/pkg/term/winconsole/term_emulator.go index 2678aab65e..8c9f34284d 100644 --- a/pkg/term/winconsole/term_emulator.go +++ b/pkg/term/winconsole/term_emulator.go @@ -211,7 +211,7 @@ func parseInt16OrDefault(s string, defaultValue int16) (n int16, err error) { return defaultValue, nil } parsedValue, err := strconv.ParseInt(s, 10, 16) - if nil != err { + if err != nil { return defaultValue, err } return int16(parsedValue), nil From df389df9904dc1585160d7992c6f3dc150490e05 Mon Sep 17 00:00:00 2001 From: Tibor Vass Date: Sun, 22 Mar 2015 19:34:40 -0400 Subject: [PATCH 44/77] Skip TestPullVerified because hello-world image cannot be verified Signed-off-by: Tibor Vass --- integration-cli/docker_cli_pull_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/integration-cli/docker_cli_pull_test.go b/integration-cli/docker_cli_pull_test.go index 926e763434..c55bd2e673 100644 --- a/integration-cli/docker_cli_pull_test.go +++ b/integration-cli/docker_cli_pull_test.go @@ -55,6 +55,8 @@ func TestPullImageWithAliases(t *testing.T) { // pulling library/hello-world should show verified message func TestPullVerified(t *testing.T) { + t.Skip("problems verifying library/hello-world (to be fixed)") + // Image must be pulled from central repository to get verified message // unless keychain is manually updated to contain the daemon's sign key. From 33448ac3c9c0c63fb07f7bf04cec998d3536fc10 Mon Sep 17 00:00:00 2001 From: Arnaud Porterie Date: Sun, 22 Mar 2015 17:56:05 -0700 Subject: [PATCH 45/77] Restore TestPullVerified test Signed-off-by: Arnaud Porterie --- integration-cli/docker_cli_pull_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/integration-cli/docker_cli_pull_test.go b/integration-cli/docker_cli_pull_test.go index c55bd2e673..926e763434 100644 --- a/integration-cli/docker_cli_pull_test.go +++ b/integration-cli/docker_cli_pull_test.go @@ -55,8 +55,6 @@ func TestPullImageWithAliases(t *testing.T) { // pulling library/hello-world should show verified message func TestPullVerified(t *testing.T) { - t.Skip("problems verifying library/hello-world (to be fixed)") - // Image must be pulled from central repository to get verified message // unless keychain is manually updated to contain the daemon's sign key. From c8d2ec93caf7c64f3e510e4e75f49614880ed9b9 Mon Sep 17 00:00:00 2001 From: Derek McGowan Date: Sun, 22 Mar 2015 18:15:18 -0700 Subject: [PATCH 46/77] Add check for 404 on get repository data No longer add the body to the error when a 404 is received on get repository data. closes #11510 Signed-off-by: Derek McGowan (github: dmcgowan) --- registry/session.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/registry/session.go b/registry/session.go index 470aeab4cb..82338252eb 100644 --- a/registry/session.go +++ b/registry/session.go @@ -280,7 +280,9 @@ func (r *Session) GetRepositoryData(remote string) (*RepositoryData, error) { } // TODO: Right now we're ignoring checksums in the response body. // In the future, we need to use them to check image validity. - if res.StatusCode != 200 { + if res.StatusCode == 404 { + return nil, utils.NewHTTPRequestError(fmt.Sprintf("HTTP code: %d", res.StatusCode), res) + } else if res.StatusCode != 200 { errBody, err := ioutil.ReadAll(res.Body) if err != nil { log.Debugf("Error reading response body: %s", err) From f07ac12791e4af7f199a893705204481588062ae Mon Sep 17 00:00:00 2001 From: Arnaud Porterie Date: Sun, 22 Mar 2015 18:45:01 -0700 Subject: [PATCH 47/77] Document VERSION file update scheme Signed-off-by: Arnaud Porterie --- project/RELEASE-CHECKLIST.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/project/RELEASE-CHECKLIST.md b/project/RELEASE-CHECKLIST.md index d9382b901c..10af71c81d 100644 --- a/project/RELEASE-CHECKLIST.md +++ b/project/RELEASE-CHECKLIST.md @@ -364,7 +364,17 @@ echo "https://github.com/$GITHUBUSER/docker/compare/docker:master...$GITHUBUSER: Again, get two maintainers to validate, then merge, then push that pretty blue button to delete your branch. -### 13. Rejoice and Evangelize! +### 13. Update the API docs and VERSION files + +Now that version X.Y.Z is out, time to start working on the next! Update the +content of the `VERSION` file to be the next minor (incrementing Y) and add the +`-dev` suffix. For example, after 1.5.0 release, the `VERSION` file gets +updated to `1.6.0-dev` (as in "1.6.0 in the making"). + +Also create a new entry in `docs/sources/reference/api/` by copying the latest +and bumping the version number (in both the file's name and content). + +### 14. Rejoice and Evangelize! Congratulations! You're done. From 7dc1af146d24c346ac74c9dcb1df98f9ef51339d Mon Sep 17 00:00:00 2001 From: Mabin Date: Mon, 16 Mar 2015 17:08:22 +0800 Subject: [PATCH 48/77] Fix hanging up problem when start and attach multiple containers Signed-off-by: Mabin --- api/client/commands.go | 50 +++++++++++------------- integration-cli/docker_cli_start_test.go | 46 ++++++++++++++++++++++ 2 files changed, 69 insertions(+), 27 deletions(-) diff --git a/api/client/commands.go b/api/client/commands.go index e10bee3b18..9adf09abf0 100644 --- a/api/client/commands.go +++ b/api/client/commands.go @@ -723,18 +723,6 @@ func (cli *DockerCli) CmdStart(args ...string) error { cmd.Require(flag.Min, 1) utils.ParseFlags(cmd, args, true) - hijacked := make(chan io.Closer) - // Block the return until the chan gets closed - defer func() { - log.Debugf("CmdStart() returned, defer waiting for hijack to finish.") - if _, ok := <-hijacked; ok { - log.Errorf("Hijack did not finish (chan still open)") - } - if *openStdin || *attach { - cli.in.Close() - } - }() - if *attach || *openStdin { if cmd.NArg() > 1 { return fmt.Errorf("You cannot start and attach multiple containers at once.") @@ -770,26 +758,34 @@ func (cli *DockerCli) CmdStart(args ...string) error { v.Set("stdout", "1") v.Set("stderr", "1") + hijacked := make(chan io.Closer) + // Block the return until the chan gets closed + defer func() { + log.Debugf("CmdStart() returned, defer waiting for hijack to finish.") + if _, ok := <-hijacked; ok { + log.Errorf("Hijack did not finish (chan still open)") + } + cli.in.Close() + }() cErr = promise.Go(func() error { return cli.hijack("POST", "/containers/"+cmd.Arg(0)+"/attach?"+v.Encode(), tty, in, cli.out, cli.err, hijacked, nil) }) - } else { - close(hijacked) + + // Acknowledge the hijack before starting + select { + case closer := <-hijacked: + // Make sure that the hijack gets closed when returning (results + // in closing the hijack chan and freeing server's goroutines) + if closer != nil { + defer closer.Close() + } + case err := <-cErr: + if err != nil { + return err + } + } } - // Acknowledge the hijack before starting - select { - case closer := <-hijacked: - // Make sure that the hijack gets closed when returning (results - // in closing the hijack chan and freeing server's goroutines) - if closer != nil { - defer closer.Close() - } - case err := <-cErr: - if err != nil { - return err - } - } var encounteredError error for _, name := range cmd.Args() { _, _, err := readBody(cli.call("POST", "/containers/"+name+"/start", nil, false)) diff --git a/integration-cli/docker_cli_start_test.go b/integration-cli/docker_cli_start_test.go index 01f0ef95a1..3ec04c9169 100644 --- a/integration-cli/docker_cli_start_test.go +++ b/integration-cli/docker_cli_start_test.go @@ -240,3 +240,49 @@ func TestStartMultipleContainers(t *testing.T) { logDone("start - start multiple containers continue on one failed") } + +func TestStartAttachMultipleContainers(t *testing.T) { + + var cmd *exec.Cmd + + defer deleteAllContainers() + // run multiple containers to test + for _, container := range []string{"test1", "test2", "test3"} { + cmd = exec.Command(dockerBinary, "run", "-d", "--name", container, "busybox", "top") + if out, _, err := runCommandWithOutput(cmd); err != nil { + t.Fatal(out, err) + } + } + + // stop all the containers + for _, container := range []string{"test1", "test2", "test3"} { + cmd = exec.Command(dockerBinary, "stop", container) + if out, _, err := runCommandWithOutput(cmd); err != nil { + t.Fatal(out, err) + } + } + + // test start and attach multiple containers at once, expected error + for _, option := range []string{"-a", "-i", "-ai"} { + cmd = exec.Command(dockerBinary, "start", option, "test1", "test2", "test3") + out, _, err := runCommandWithOutput(cmd) + if !strings.Contains(out, "You cannot start and attach multiple containers at once.") || err == nil { + t.Fatal("Expected error but got none") + } + } + + // confirm the state of all the containers be stopped + for container, expected := range map[string]string{"test1": "false", "test2": "false", "test3": "false"} { + cmd = exec.Command(dockerBinary, "inspect", "-f", "{{.State.Running}}", container) + out, _, err := runCommandWithOutput(cmd) + if err != nil { + t.Fatal(out, err) + } + out = strings.Trim(out, "\r\n") + if out != expected { + t.Fatal("Container running state wrong") + } + } + + logDone("start - error on start and attach multiple containers at once") +} From 5de1e7bc3a823e1a4fa35ddf75401d233b3e4692 Mon Sep 17 00:00:00 2001 From: bobby abbott Date: Sun, 22 Mar 2015 22:31:46 -0700 Subject: [PATCH 49/77] Refactors pkg/testutils Solves #11579. Signed-off-by: bobby abbott --- engine/env_test.go | 18 +++++++++++++++--- pkg/testutils/README.md | 2 -- pkg/testutils/utils.go | 37 ------------------------------------- 3 files changed, 15 insertions(+), 42 deletions(-) delete mode 100644 pkg/testutils/README.md delete mode 100644 pkg/testutils/utils.go diff --git a/engine/env_test.go b/engine/env_test.go index 2ed99d0fea..5182783bb3 100644 --- a/engine/env_test.go +++ b/engine/env_test.go @@ -3,12 +3,24 @@ package engine import ( "bytes" "encoding/json" + "math/rand" "testing" "time" - - "github.com/docker/docker/pkg/testutils" ) +const chars = "abcdefghijklmnopqrstuvwxyz" + + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + "~!@#$%^&*()-_+={}[]\\|<,>.?/\"';:` " + +// RandomString returns random string of specified length +func RandomString(length int) string { + res := make([]byte, length) + for i := 0; i < length; i++ { + res[i] = chars[rand.Intn(len(chars))] + } + return string(res) +} + func TestEnvLenZero(t *testing.T) { env := &Env{} if env.Len() != 0 { @@ -185,7 +197,7 @@ func TestMultiMap(t *testing.T) { func testMap(l int) [][2]string { res := make([][2]string, l) for i := 0; i < l; i++ { - t := [2]string{testutils.RandomString(5), testutils.RandomString(20)} + t := [2]string{RandomString(5), RandomString(20)} res[i] = t } return res diff --git a/pkg/testutils/README.md b/pkg/testutils/README.md deleted file mode 100644 index a208a90e68..0000000000 --- a/pkg/testutils/README.md +++ /dev/null @@ -1,2 +0,0 @@ -`testutils` is a collection of utility functions to facilitate the writing -of tests. It is used in various places by the Docker test suite. diff --git a/pkg/testutils/utils.go b/pkg/testutils/utils.go deleted file mode 100644 index 9c664ff253..0000000000 --- a/pkg/testutils/utils.go +++ /dev/null @@ -1,37 +0,0 @@ -package testutils - -import ( - "math/rand" - "testing" - "time" -) - -const chars = "abcdefghijklmnopqrstuvwxyz" + - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + - "~!@#$%^&*()-_+={}[]\\|<,>.?/\"';:` " - -// Timeout calls f and waits for 100ms for it to complete. -// If it doesn't, it causes the tests to fail. -// t must be a valid testing context. -func Timeout(t *testing.T, f func()) { - onTimeout := time.After(100 * time.Millisecond) - onDone := make(chan bool) - go func() { - f() - close(onDone) - }() - select { - case <-onTimeout: - t.Fatalf("timeout") - case <-onDone: - } -} - -// RandomString returns random string of specified length -func RandomString(length int) string { - res := make([]byte, length) - for i := 0; i < length; i++ { - res[i] = chars[rand.Intn(len(chars))] - } - return string(res) -} From a91b2431a303f919b0737d95639d8e445124cb23 Mon Sep 17 00:00:00 2001 From: bobby abbott Date: Sun, 22 Mar 2015 23:27:04 -0700 Subject: [PATCH 50/77] Refactor pkg/networkfs Solves #11591 Signed-off-by: bobby abbott --- api/client/commands.go | 2 +- daemon/container.go | 4 ++-- daemon/daemon.go | 2 +- daemon/networkdriver/bridge/driver.go | 2 +- integration-cli/docker_cli_run_test.go | 2 +- pkg/{networkfs => }/etchosts/etchosts.go | 0 pkg/{networkfs => }/etchosts/etchosts_test.go | 0 pkg/{networkfs => }/resolvconf/resolvconf.go | 0 pkg/{networkfs => }/resolvconf/resolvconf_test.go | 0 9 files changed, 6 insertions(+), 6 deletions(-) rename pkg/{networkfs => }/etchosts/etchosts.go (100%) rename pkg/{networkfs => }/etchosts/etchosts_test.go (100%) rename pkg/{networkfs => }/resolvconf/resolvconf.go (100%) rename pkg/{networkfs => }/resolvconf/resolvconf_test.go (100%) diff --git a/api/client/commands.go b/api/client/commands.go index 2b837596e8..6de8ca01fa 100644 --- a/api/client/commands.go +++ b/api/client/commands.go @@ -37,11 +37,11 @@ import ( "github.com/docker/docker/pkg/fileutils" "github.com/docker/docker/pkg/homedir" flag "github.com/docker/docker/pkg/mflag" - "github.com/docker/docker/pkg/networkfs/resolvconf" "github.com/docker/docker/pkg/parsers" "github.com/docker/docker/pkg/parsers/filters" "github.com/docker/docker/pkg/progressreader" "github.com/docker/docker/pkg/promise" + "github.com/docker/docker/pkg/resolvconf" "github.com/docker/docker/pkg/signal" "github.com/docker/docker/pkg/symlink" "github.com/docker/docker/pkg/term" diff --git a/daemon/container.go b/daemon/container.go index 0fff3238e9..4b7c58558a 100644 --- a/daemon/container.go +++ b/daemon/container.go @@ -31,10 +31,10 @@ import ( "github.com/docker/docker/pkg/broadcastwriter" "github.com/docker/docker/pkg/common" "github.com/docker/docker/pkg/directory" + "github.com/docker/docker/pkg/etchosts" "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/networkfs/etchosts" - "github.com/docker/docker/pkg/networkfs/resolvconf" "github.com/docker/docker/pkg/promise" + "github.com/docker/docker/pkg/resolvconf" "github.com/docker/docker/pkg/symlink" "github.com/docker/docker/pkg/ulimit" "github.com/docker/docker/runconfig" diff --git a/daemon/daemon.go b/daemon/daemon.go index ebb43e2484..6a27a085a0 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -35,9 +35,9 @@ import ( "github.com/docker/docker/pkg/graphdb" "github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/pkg/namesgenerator" - "github.com/docker/docker/pkg/networkfs/resolvconf" "github.com/docker/docker/pkg/parsers" "github.com/docker/docker/pkg/parsers/kernel" + "github.com/docker/docker/pkg/resolvconf" "github.com/docker/docker/pkg/sysinfo" "github.com/docker/docker/pkg/truncindex" "github.com/docker/docker/runconfig" diff --git a/daemon/networkdriver/bridge/driver.go b/daemon/networkdriver/bridge/driver.go index aa139b9a39..b8dfdf9488 100644 --- a/daemon/networkdriver/bridge/driver.go +++ b/daemon/networkdriver/bridge/driver.go @@ -17,8 +17,8 @@ import ( "github.com/docker/docker/engine" "github.com/docker/docker/nat" "github.com/docker/docker/pkg/iptables" - "github.com/docker/docker/pkg/networkfs/resolvconf" "github.com/docker/docker/pkg/parsers/kernel" + "github.com/docker/docker/pkg/resolvconf" "github.com/docker/libcontainer/netlink" ) diff --git a/integration-cli/docker_cli_run_test.go b/integration-cli/docker_cli_run_test.go index 636ef36e12..f192468e0e 100644 --- a/integration-cli/docker_cli_run_test.go +++ b/integration-cli/docker_cli_run_test.go @@ -20,7 +20,7 @@ import ( "time" "github.com/docker/docker/nat" - "github.com/docker/docker/pkg/networkfs/resolvconf" + "github.com/docker/docker/pkg/resolvconf" ) // "test123" should be printed by docker run diff --git a/pkg/networkfs/etchosts/etchosts.go b/pkg/etchosts/etchosts.go similarity index 100% rename from pkg/networkfs/etchosts/etchosts.go rename to pkg/etchosts/etchosts.go diff --git a/pkg/networkfs/etchosts/etchosts_test.go b/pkg/etchosts/etchosts_test.go similarity index 100% rename from pkg/networkfs/etchosts/etchosts_test.go rename to pkg/etchosts/etchosts_test.go diff --git a/pkg/networkfs/resolvconf/resolvconf.go b/pkg/resolvconf/resolvconf.go similarity index 100% rename from pkg/networkfs/resolvconf/resolvconf.go rename to pkg/resolvconf/resolvconf.go diff --git a/pkg/networkfs/resolvconf/resolvconf_test.go b/pkg/resolvconf/resolvconf_test.go similarity index 100% rename from pkg/networkfs/resolvconf/resolvconf_test.go rename to pkg/resolvconf/resolvconf_test.go From d124197cc726a3b69cc3cde8c4d560f3f0e1af9c Mon Sep 17 00:00:00 2001 From: Antonio Murdaca Date: Sun, 22 Mar 2015 19:09:12 +0100 Subject: [PATCH 51/77] Remove container if --rm flag is passed and container cannot be started Signed-off-by: Antonio Murdaca --- api/client/commands.go | 11 +++++-- integration-cli/docker_cli_run_test.go | 43 ++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/api/client/commands.go b/api/client/commands.go index 2b837596e8..cb0cd24235 100644 --- a/api/client/commands.go +++ b/api/client/commands.go @@ -2499,6 +2499,14 @@ func (cli *DockerCli) CmdRun(args ...string) error { } } + defer func() { + if *flAutoRemove { + if _, _, err = readBody(cli.call("DELETE", "/containers/"+createResponse.ID+"?v=1", nil, false)); err != nil { + log.Errorf("Error deleting container: %s", err) + } + } + }() + //start the container if _, _, err = readBody(cli.call("POST", "/containers/"+createResponse.ID+"/start", nil, false)); err != nil { return err @@ -2536,9 +2544,6 @@ func (cli *DockerCli) CmdRun(args ...string) error { if _, status, err = getExitCode(cli, createResponse.ID); err != nil { return err } - if _, _, err := readBody(cli.call("DELETE", "/containers/"+createResponse.ID+"?v=1", nil, false)); err != nil { - return err - } } else { // No Autoremove: Simply retrieve the exit code if !config.Tty { diff --git a/integration-cli/docker_cli_run_test.go b/integration-cli/docker_cli_run_test.go index 636ef36e12..4f6f646a52 100644 --- a/integration-cli/docker_cli_run_test.go +++ b/integration-cli/docker_cli_run_test.go @@ -3348,3 +3348,46 @@ func TestRunVolumesFromRestartAfterRemoved(t *testing.T) { logDone("run - can restart a volumes-from container after producer is removed") } + +// run container with --rm should remove container if exit code != 0 +func TestRunContainerWithRmFlagExitCodeNotEqualToZero(t *testing.T) { + defer deleteAllContainers() + + runCmd := exec.Command(dockerBinary, "run", "--rm", "busybox", "ls", "/notexists") + out, _, err := runCommandWithOutput(runCmd) + if err == nil { + t.Fatal("Expected docker run to fail", out, err) + } + + out, err = getAllContainers() + if err != nil { + t.Fatal(out, err) + } + + if out != "" { + t.Fatal("Expected not to have containers", out) + } + + logDone("run - container is removed if run with --rm and exit code != 0") +} + +func TestRunContainerWithRmFlagCannotStartContainer(t *testing.T) { + defer deleteAllContainers() + + runCmd := exec.Command(dockerBinary, "run", "--rm", "busybox", "commandNotFound") + out, _, err := runCommandWithOutput(runCmd) + if err == nil { + t.Fatal("Expected docker run to fail", out, err) + } + + out, err = getAllContainers() + if err != nil { + t.Fatal(out, err) + } + + if out != "" { + t.Fatal("Expected not to have containers", out) + } + + logDone("run - container is removed if run with --rm and cannot start") +} From 5daa9260bcef2a47c493adc04e6638c9d200a9cf Mon Sep 17 00:00:00 2001 From: Srini Brahmaroutu Date: Fri, 27 Feb 2015 22:18:11 +0000 Subject: [PATCH 52/77] Test image api through local V1 repo Closes #10967 Signed-off-by: Srini Brahmaroutu --- integration-cli/docker_cli_pull_test.go | 2 ++ integration-cli/requirements.go | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/integration-cli/docker_cli_pull_test.go b/integration-cli/docker_cli_pull_test.go index c55bd2e673..fec9700e2e 100644 --- a/integration-cli/docker_cli_pull_test.go +++ b/integration-cli/docker_cli_pull_test.go @@ -108,6 +108,8 @@ func TestPullNonExistingImage(t *testing.T) { // pulling an image from the central registry using official names should work // ensure all pulls result in the same image func TestPullImageOfficialNames(t *testing.T) { + testRequires(t, Network) + names := []string{ "docker.io/hello-world", "index.docker.io/hello-world", diff --git a/integration-cli/requirements.go b/integration-cli/requirements.go index 346d0cdf66..cdd9991873 100644 --- a/integration-cli/requirements.go +++ b/integration-cli/requirements.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "log" + "net/http" "os/exec" "strings" "testing" @@ -32,6 +33,16 @@ var ( func() bool { return supportsExec }, "Test requires 'docker exec' capabilities on the tested daemon.", } + Network = TestRequirement{ + func() bool { + resp, err := http.Get("http://hub.docker.com") + if resp != nil { + resp.Body.Close() + } + return err == nil + }, + "Test requires network availability, environment variable set to none to run in a non-network enabled mode.", + } RegistryHosting = TestRequirement{ func() bool { // for now registry binary is built only if we're running inside From b38ff8c83d82b7958c62c07a8b82e4b85f0311c0 Mon Sep 17 00:00:00 2001 From: Ahmet Alp Balkan Date: Mon, 23 Mar 2015 18:38:43 +0000 Subject: [PATCH 53/77] Disable ANSI emulation in certain windows shells This disables recently added ANSI emulation feature in certain Windows shells (like ConEmu) where ANSI output is emulated by default with builtin functionality in the shell. MSYS (mingw) runs in cmd.exe window and it doesn't support emulation. Cygwin doesn't even pass terminal handles to docker.exe as far as I can tell, stdin/stdout/stderr handles are behaving like non-TTY. Therefore not even including that in the check. Signed-off-by: Ahmet Alp Balkan --- pkg/term/term_windows.go | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/pkg/term/term_windows.go b/pkg/term/term_windows.go index e6d9466a63..abda841cb1 100644 --- a/pkg/term/term_windows.go +++ b/pkg/term/term_windows.go @@ -3,6 +3,7 @@ package term import ( "io" + "os" "github.com/docker/docker/pkg/term/winconsole" ) @@ -114,5 +115,23 @@ func GetFdInfo(in interface{}) (uintptr, bool) { } func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { - return winconsole.StdStreams() + var shouldEmulateANSI bool + switch { + case os.Getenv("ConEmuANSI") == "ON": + // ConEmu shell, ansi emulated by default and ConEmu does an extensively + // good emulation. + shouldEmulateANSI = false + case os.Getenv("MSYSTEM") != "": + // MSYS (mingw) cannot fully emulate well and still shows escape characters + // mostly because it's still running on cmd.exe window. + shouldEmulateANSI = true + default: + shouldEmulateANSI = true + } + + if shouldEmulateANSI { + return winconsole.StdStreams() + } + + return os.Stdin, os.Stdout, os.Stderr } From 8f025aae36fd040d8d2617890b258b5460ae44db Mon Sep 17 00:00:00 2001 From: Antonio Murdaca Date: Mon, 23 Mar 2015 19:59:30 +0100 Subject: [PATCH 54/77] Refactor syslog Log else clause Signed-off-by: Antonio Murdaca --- daemon/logger/syslog/syslog.go | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/daemon/logger/syslog/syslog.go b/daemon/logger/syslog/syslog.go index 1f73d91d6e..e7054d257b 100644 --- a/daemon/logger/syslog/syslog.go +++ b/daemon/logger/syslog/syslog.go @@ -30,16 +30,9 @@ func New(tag string) (logger.Logger, error) { func (s *Syslog) Log(msg *logger.Message) error { logMessage := fmt.Sprintf("%s: %s", s.tag, string(msg.Line)) if msg.Source == "stderr" { - if err := s.writer.Err(logMessage); err != nil { - return err - } - - } else { - if err := s.writer.Info(logMessage); err != nil { - return err - } + return s.writer.Err(logMessage) } - return nil + return s.writer.Info(logMessage) } func (s *Syslog) Close() error { From e600df2d9732b8c40d056563e361ded6cd5ce773 Mon Sep 17 00:00:00 2001 From: Antonio Murdaca Date: Mon, 23 Mar 2015 20:03:24 +0100 Subject: [PATCH 55/77] Remove redunant nil check, s.writer cannot be nil Signed-off-by: Antonio Murdaca --- daemon/logger/syslog/syslog.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/daemon/logger/syslog/syslog.go b/daemon/logger/syslog/syslog.go index 1f73d91d6e..cb8976a17a 100644 --- a/daemon/logger/syslog/syslog.go +++ b/daemon/logger/syslog/syslog.go @@ -43,10 +43,7 @@ func (s *Syslog) Log(msg *logger.Message) error { } func (s *Syslog) Close() error { - if s.writer != nil { - return s.writer.Close() - } - return nil + return s.writer.Close() } func (s *Syslog) Name() string { From 8b02d85e1728b48729b2fb8553b2ec4b56a30d37 Mon Sep 17 00:00:00 2001 From: Antonio Murdaca Date: Mon, 23 Mar 2015 20:20:43 +0100 Subject: [PATCH 56/77] Remove hardcoded error Signed-off-by: Antonio Murdaca --- builder/evaluator.go | 7 +------ integration-cli/docker_cli_build_test.go | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/builder/evaluator.go b/builder/evaluator.go index b74c1ba6ae..aff0e4eabd 100644 --- a/builder/evaluator.go +++ b/builder/evaluator.go @@ -20,7 +20,6 @@ package builder import ( - "errors" "fmt" "io" "os" @@ -42,10 +41,6 @@ import ( "github.com/docker/docker/utils" ) -var ( - ErrDockerfileEmpty = errors.New("Dockerfile cannot be empty") -) - // Environment variable interpolation will happen on these statements only. var replaceEnvAllowed = map[string]struct{}{ command.Env: {}, @@ -225,7 +220,7 @@ func (b *Builder) readDockerfile() error { return fmt.Errorf("Cannot locate specified Dockerfile: %s", origFile) } if fi.Size() == 0 { - return ErrDockerfileEmpty + return fmt.Errorf("The Dockerfile (%s) cannot be empty", origFile) } f, err := os.Open(filename) diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index 44d6313858..239dce6e8e 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -3504,7 +3504,7 @@ func TestBuildFailsDockerfileEmpty(t *testing.T) { defer deleteImages(name) _, err := buildImage(name, ``, true) if err != nil { - if !strings.Contains(err.Error(), "Dockerfile cannot be empty") { + if !strings.Contains(err.Error(), "The Dockerfile (Dockerfile) cannot be empty") { t.Fatalf("Wrong error %v, must be about empty Dockerfile", err) } } else { From 8e4d9f3cf9669f45b0591eea27c47b6f64d89c2d Mon Sep 17 00:00:00 2001 From: Brian Goff Date: Sat, 21 Mar 2015 16:57:22 -0400 Subject: [PATCH 57/77] Improve err message when parsing kernel port range Signed-off-by: Brian Goff --- daemon/networkdriver/portallocator/portallocator.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/daemon/networkdriver/portallocator/portallocator.go b/daemon/networkdriver/portallocator/portallocator.go index da9f987397..3a4f8e6ae7 100644 --- a/daemon/networkdriver/portallocator/portallocator.go +++ b/daemon/networkdriver/portallocator/portallocator.go @@ -70,10 +70,11 @@ func NewErrPortAlreadyAllocated(ip string, port int) ErrPortAlreadyAllocated { func init() { const portRangeKernelParam = "/proc/sys/net/ipv4/ip_local_port_range" + portRangeFallback := fmt.Sprintf("using fallback port range %d-%d", beginPortRange, endPortRange) file, err := os.Open(portRangeKernelParam) if err != nil { - log.Warnf("Failed to read %s kernel parameter: %v", portRangeKernelParam, err) + log.Warnf("port allocator - %s due to error: %v", portRangeFallback, err) return } var start, end int @@ -82,7 +83,7 @@ func init() { if err == nil { err = fmt.Errorf("unexpected count of parsed numbers (%d)", n) } - log.Errorf("Failed to parse port range from %s: %v", portRangeKernelParam, err) + log.Errorf("port allocator - failed to parse system ephemeral port range from %s - %s: %v", portRangeKernelParam, portRangeFallback, err) return } beginPortRange = start From 664ef0cbe2113e8307135e656cc6db9199f8268e Mon Sep 17 00:00:00 2001 From: George MacRorie Date: Mon, 23 Mar 2015 19:21:37 +0000 Subject: [PATCH 58/77] Cleanup redundant else statements find via golint #11602 Signed-off-by: George MacRorie --- builder/parser/line_parsers.go | 19 ++++++++++--------- builder/shell_parser.go | 13 ++++++------- integration-cli/docker_utils.go | 3 +-- opts/opts.go | 3 +-- 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/builder/parser/line_parsers.go b/builder/parser/line_parsers.go index 3026a0b06d..6e284d6fc3 100644 --- a/builder/parser/line_parsers.go +++ b/builder/parser/line_parsers.go @@ -239,17 +239,18 @@ func parseJSON(rest string) (*Node, map[string]bool, error) { var top, prev *Node for _, str := range myJson { - if s, ok := str.(string); !ok { + s, ok := str.(string) + if !ok { return nil, nil, errDockerfileNotStringArray - } else { - node := &Node{Value: s} - if prev == nil { - top = node - } else { - prev.Next = node - } - prev = node } + + node := &Node{Value: s} + if prev == nil { + top = node + } else { + prev.Next = node + } + prev = node } return top, map[string]bool{"json": true}, nil diff --git a/builder/shell_parser.go b/builder/shell_parser.go index b8c746773c..d086645eb0 100644 --- a/builder/shell_parser.go +++ b/builder/shell_parser.go @@ -158,14 +158,13 @@ func (sw *shellWord) processDollar() (string, error) { return sw.getEnv(name), nil } return "", fmt.Errorf("Unsupported ${} substitution: %s", sw.word) - } else { - // $xxx case - name := sw.processName() - if name == "" { - return "$", nil - } - return sw.getEnv(name), nil } + // $xxx case + name := sw.processName() + if name == "" { + return "$", nil + } + return sw.getEnv(name), nil } func (sw *shellWord) processName() string { diff --git a/integration-cli/docker_utils.go b/integration-cli/docker_utils.go index 10cc6c9218..e0b9bacc4a 100644 --- a/integration-cli/docker_utils.go +++ b/integration-cli/docker_utils.go @@ -395,9 +395,8 @@ func getSliceOfPausedContainers() ([]string, error) { if err == nil { slice := strings.Split(strings.TrimSpace(out), "\n") return slice, err - } else { - return []string{out}, err } + return []string{out}, err } func unpauseContainer(container string) error { diff --git a/opts/opts.go b/opts/opts.go index e867c0a21d..df9decf61f 100644 --- a/opts/opts.go +++ b/opts/opts.go @@ -192,9 +192,8 @@ func ValidateMACAddress(val string) (string, error) { _, err := net.ParseMAC(strings.TrimSpace(val)) if err != nil { return "", err - } else { - return val, nil } + return val, nil } // Validates domain for resolvconf search configuration. From 12576798769081823a3f660b46290da808630616 Mon Sep 17 00:00:00 2001 From: Paul Bellamy Date: Mon, 23 Mar 2015 20:05:26 +0000 Subject: [PATCH 59/77] Refactor global portallocator state into a global struct Signed-off-by: Paul Bellamy --- .../portallocator/portallocator.go | 61 ++++++++----- .../portallocator/portallocator_test.go | 90 +++++++++---------- 2 files changed, 83 insertions(+), 68 deletions(-) diff --git a/daemon/networkdriver/portallocator/portallocator.go b/daemon/networkdriver/portallocator/portallocator.go index da9f987397..42540b4077 100644 --- a/daemon/networkdriver/portallocator/portallocator.go +++ b/daemon/networkdriver/portallocator/portallocator.go @@ -50,12 +50,21 @@ var ( ) var ( - mutex sync.Mutex - - defaultIP = net.ParseIP("0.0.0.0") - globalMap = ipMapping{} + defaultIP = net.ParseIP("0.0.0.0") + defaultPortAllocator = New() ) +type PortAllocator struct { + mutex sync.Mutex + ipMap ipMapping +} + +func New() *PortAllocator { + return &PortAllocator{ + ipMap: ipMapping{}, + } +} + type ErrPortAlreadyAllocated struct { ip string port int @@ -109,12 +118,9 @@ func (e ErrPortAlreadyAllocated) Error() string { return fmt.Sprintf("Bind for %s:%d failed: port is already allocated", e.ip, e.port) } -// RequestPort requests new port from global ports pool for specified ip and proto. -// If port is 0 it returns first free port. Otherwise it cheks port availability -// in pool and return that port or error if port is already busy. -func RequestPort(ip net.IP, proto string, port int) (int, error) { - mutex.Lock() - defer mutex.Unlock() +func (p *PortAllocator) RequestPort(ip net.IP, proto string, port int) (int, error) { + p.mutex.Lock() + defer p.mutex.Unlock() if proto != "tcp" && proto != "udp" { return 0, ErrUnknownProtocol @@ -124,10 +130,10 @@ func RequestPort(ip net.IP, proto string, port int) (int, error) { ip = defaultIP } ipstr := ip.String() - protomap, ok := globalMap[ipstr] + protomap, ok := p.ipMap[ipstr] if !ok { protomap = newProtoMap() - globalMap[ipstr] = protomap + p.ipMap[ipstr] = protomap } mapping := protomap[proto] if port > 0 { @@ -145,15 +151,22 @@ func RequestPort(ip net.IP, proto string, port int) (int, error) { return port, nil } +// RequestPort requests new port from global ports pool for specified ip and proto. +// If port is 0 it returns first free port. Otherwise it cheks port availability +// in pool and return that port or error if port is already busy. +func RequestPort(ip net.IP, proto string, port int) (int, error) { + return defaultPortAllocator.RequestPort(ip, proto, port) +} + // ReleasePort releases port from global ports pool for specified ip and proto. -func ReleasePort(ip net.IP, proto string, port int) error { - mutex.Lock() - defer mutex.Unlock() +func (p *PortAllocator) ReleasePort(ip net.IP, proto string, port int) error { + p.mutex.Lock() + defer p.mutex.Unlock() if ip == nil { ip = defaultIP } - protomap, ok := globalMap[ip.String()] + protomap, ok := p.ipMap[ip.String()] if !ok { return nil } @@ -161,14 +174,22 @@ func ReleasePort(ip net.IP, proto string, port int) error { return nil } +func ReleasePort(ip net.IP, proto string, port int) error { + return defaultPortAllocator.ReleasePort(ip, proto, port) +} + // ReleaseAll releases all ports for all ips. -func ReleaseAll() error { - mutex.Lock() - globalMap = ipMapping{} - mutex.Unlock() +func (p *PortAllocator) ReleaseAll() error { + p.mutex.Lock() + p.ipMap = ipMapping{} + p.mutex.Unlock() return nil } +func ReleaseAll() error { + return defaultPortAllocator.ReleaseAll() +} + func (pm *portMap) findPort() (int, error) { port := pm.last for i := 0; i <= endPortRange-beginPortRange; i++ { diff --git a/daemon/networkdriver/portallocator/portallocator_test.go b/daemon/networkdriver/portallocator/portallocator_test.go index bac558fa41..f6f122bbde 100644 --- a/daemon/networkdriver/portallocator/portallocator_test.go +++ b/daemon/networkdriver/portallocator/portallocator_test.go @@ -10,14 +10,10 @@ func init() { endPortRange = DefaultPortRangeEnd } -func reset() { - ReleaseAll() -} - func TestRequestNewPort(t *testing.T) { - defer reset() + p := New() - port, err := RequestPort(defaultIP, "tcp", 0) + port, err := p.RequestPort(defaultIP, "tcp", 0) if err != nil { t.Fatal(err) } @@ -28,9 +24,9 @@ func TestRequestNewPort(t *testing.T) { } func TestRequestSpecificPort(t *testing.T) { - defer reset() + p := New() - port, err := RequestPort(defaultIP, "tcp", 5000) + port, err := p.RequestPort(defaultIP, "tcp", 5000) if err != nil { t.Fatal(err) } @@ -40,9 +36,9 @@ func TestRequestSpecificPort(t *testing.T) { } func TestReleasePort(t *testing.T) { - defer reset() + p := New() - port, err := RequestPort(defaultIP, "tcp", 5000) + port, err := p.RequestPort(defaultIP, "tcp", 5000) if err != nil { t.Fatal(err) } @@ -50,15 +46,15 @@ func TestReleasePort(t *testing.T) { t.Fatalf("Expected port 5000 got %d", port) } - if err := ReleasePort(defaultIP, "tcp", 5000); err != nil { + if err := p.ReleasePort(defaultIP, "tcp", 5000); err != nil { t.Fatal(err) } } func TestReuseReleasedPort(t *testing.T) { - defer reset() + p := New() - port, err := RequestPort(defaultIP, "tcp", 5000) + port, err := p.RequestPort(defaultIP, "tcp", 5000) if err != nil { t.Fatal(err) } @@ -66,20 +62,20 @@ func TestReuseReleasedPort(t *testing.T) { t.Fatalf("Expected port 5000 got %d", port) } - if err := ReleasePort(defaultIP, "tcp", 5000); err != nil { + if err := p.ReleasePort(defaultIP, "tcp", 5000); err != nil { t.Fatal(err) } - port, err = RequestPort(defaultIP, "tcp", 5000) + port, err = p.RequestPort(defaultIP, "tcp", 5000) if err != nil { t.Fatal(err) } } func TestReleaseUnreadledPort(t *testing.T) { - defer reset() + p := New() - port, err := RequestPort(defaultIP, "tcp", 5000) + port, err := p.RequestPort(defaultIP, "tcp", 5000) if err != nil { t.Fatal(err) } @@ -87,7 +83,7 @@ func TestReleaseUnreadledPort(t *testing.T) { t.Fatalf("Expected port 5000 got %d", port) } - port, err = RequestPort(defaultIP, "tcp", 5000) + port, err = p.RequestPort(defaultIP, "tcp", 5000) switch err.(type) { case ErrPortAlreadyAllocated: @@ -97,18 +93,16 @@ func TestReleaseUnreadledPort(t *testing.T) { } func TestUnknowProtocol(t *testing.T) { - defer reset() - - if _, err := RequestPort(defaultIP, "tcpp", 0); err != ErrUnknownProtocol { + if _, err := New().RequestPort(defaultIP, "tcpp", 0); err != ErrUnknownProtocol { t.Fatalf("Expected error %s got %s", ErrUnknownProtocol, err) } } func TestAllocateAllPorts(t *testing.T) { - defer reset() + p := New() for i := 0; i <= endPortRange-beginPortRange; i++ { - port, err := RequestPort(defaultIP, "tcp", 0) + port, err := p.RequestPort(defaultIP, "tcp", 0) if err != nil { t.Fatal(err) } @@ -118,21 +112,21 @@ func TestAllocateAllPorts(t *testing.T) { } } - if _, err := RequestPort(defaultIP, "tcp", 0); err != ErrAllPortsAllocated { + if _, err := p.RequestPort(defaultIP, "tcp", 0); err != ErrAllPortsAllocated { t.Fatalf("Expected error %s got %s", ErrAllPortsAllocated, err) } - _, err := RequestPort(defaultIP, "udp", 0) + _, err := p.RequestPort(defaultIP, "udp", 0) if err != nil { t.Fatal(err) } // release a port in the middle and ensure we get another tcp port port := beginPortRange + 5 - if err := ReleasePort(defaultIP, "tcp", port); err != nil { + if err := p.ReleasePort(defaultIP, "tcp", port); err != nil { t.Fatal(err) } - newPort, err := RequestPort(defaultIP, "tcp", 0) + newPort, err := p.RequestPort(defaultIP, "tcp", 0) if err != nil { t.Fatal(err) } @@ -142,10 +136,10 @@ func TestAllocateAllPorts(t *testing.T) { // now pm.last == newPort, release it so that it's the only free port of // the range, and ensure we get it back - if err := ReleasePort(defaultIP, "tcp", newPort); err != nil { + if err := p.ReleasePort(defaultIP, "tcp", newPort); err != nil { t.Fatal(err) } - port, err = RequestPort(defaultIP, "tcp", 0) + port, err = p.RequestPort(defaultIP, "tcp", 0) if err != nil { t.Fatal(err) } @@ -155,11 +149,11 @@ func TestAllocateAllPorts(t *testing.T) { } func BenchmarkAllocatePorts(b *testing.B) { - defer reset() + p := New() for i := 0; i < b.N; i++ { for i := 0; i <= endPortRange-beginPortRange; i++ { - port, err := RequestPort(defaultIP, "tcp", 0) + port, err := p.RequestPort(defaultIP, "tcp", 0) if err != nil { b.Fatal(err) } @@ -168,21 +162,21 @@ func BenchmarkAllocatePorts(b *testing.B) { b.Fatalf("Expected port %d got %d", expected, port) } } - reset() + p.ReleaseAll() } } func TestPortAllocation(t *testing.T) { - defer reset() + p := New() ip := net.ParseIP("192.168.0.1") ip2 := net.ParseIP("192.168.0.2") - if port, err := RequestPort(ip, "tcp", 80); err != nil { + if port, err := p.RequestPort(ip, "tcp", 80); err != nil { t.Fatal(err) } else if port != 80 { t.Fatalf("Acquire(80) should return 80, not %d", port) } - port, err := RequestPort(ip, "tcp", 0) + port, err := p.RequestPort(ip, "tcp", 0) if err != nil { t.Fatal(err) } @@ -190,41 +184,41 @@ func TestPortAllocation(t *testing.T) { t.Fatalf("Acquire(0) should return a non-zero port") } - if _, err := RequestPort(ip, "tcp", port); err == nil { + if _, err := p.RequestPort(ip, "tcp", port); err == nil { t.Fatalf("Acquiring a port already in use should return an error") } - if newPort, err := RequestPort(ip, "tcp", 0); err != nil { + if newPort, err := p.RequestPort(ip, "tcp", 0); err != nil { t.Fatal(err) } else if newPort == port { t.Fatalf("Acquire(0) allocated the same port twice: %d", port) } - if _, err := RequestPort(ip, "tcp", 80); err == nil { + if _, err := p.RequestPort(ip, "tcp", 80); err == nil { t.Fatalf("Acquiring a port already in use should return an error") } - if _, err := RequestPort(ip2, "tcp", 80); err != nil { + if _, err := p.RequestPort(ip2, "tcp", 80); err != nil { t.Fatalf("It should be possible to allocate the same port on a different interface") } - if _, err := RequestPort(ip2, "tcp", 80); err == nil { + if _, err := p.RequestPort(ip2, "tcp", 80); err == nil { t.Fatalf("Acquiring a port already in use should return an error") } - if err := ReleasePort(ip, "tcp", 80); err != nil { + if err := p.ReleasePort(ip, "tcp", 80); err != nil { t.Fatal(err) } - if _, err := RequestPort(ip, "tcp", 80); err != nil { + if _, err := p.RequestPort(ip, "tcp", 80); err != nil { t.Fatal(err) } - port, err = RequestPort(ip, "tcp", 0) + port, err = p.RequestPort(ip, "tcp", 0) if err != nil { t.Fatal(err) } - port2, err := RequestPort(ip, "tcp", port+1) + port2, err := p.RequestPort(ip, "tcp", port+1) if err != nil { t.Fatal(err) } - port3, err := RequestPort(ip, "tcp", 0) + port3, err := p.RequestPort(ip, "tcp", 0) if err != nil { t.Fatal(err) } @@ -234,15 +228,15 @@ func TestPortAllocation(t *testing.T) { } func TestNoDuplicateBPR(t *testing.T) { - defer reset() + p := New() - if port, err := RequestPort(defaultIP, "tcp", beginPortRange); err != nil { + if port, err := p.RequestPort(defaultIP, "tcp", beginPortRange); err != nil { t.Fatal(err) } else if port != beginPortRange { t.Fatalf("Expected port %d got %d", beginPortRange, port) } - if port, err := RequestPort(defaultIP, "tcp", 0); err != nil { + if port, err := p.RequestPort(defaultIP, "tcp", 0); err != nil { t.Fatal(err) } else if port == beginPortRange { t.Fatalf("Acquire(0) allocated the same port twice: %d", port) From a0cd0045282f21215d7845a987ec6292aa92a685 Mon Sep 17 00:00:00 2001 From: Frank Herrmann Date: Mon, 23 Mar 2015 20:10:38 +0000 Subject: [PATCH 60/77] Add builder/evaluator comments for the package in godoc-style fixes #11617 Signed-off-by: Frank Herrmann --- builder/evaluator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builder/evaluator.go b/builder/evaluator.go index b74c1ba6ae..49b7272f06 100644 --- a/builder/evaluator.go +++ b/builder/evaluator.go @@ -1,4 +1,4 @@ -// builder is the evaluation step in the Dockerfile parse/evaluate pipeline. +// Package builder is the evaluation step in the Dockerfile parse/evaluate pipeline. // // It incorporates a dispatch table based on the parser.Node values (see the // parser package for more information) that are yielded from the parser itself. From e321ec980708b052fd788b41af97f875630cda9c Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Mon, 23 Mar 2015 11:49:02 -0700 Subject: [PATCH 61/77] Update libcontainer to fd0087d3acdc4c5865de1829d4a Signed-off-by: Michael Crosby --- hack/vendor.sh | 2 +- .../docker/libcontainer/cgroups/fs/apply_raw.go | 7 +++---- .../github.com/docker/libcontainer/cgroups/fs/blkio.go | 8 ++------ .../src/github.com/docker/libcontainer/cgroups/fs/cpu.go | 6 +----- .../github.com/docker/libcontainer/cgroups/fs/devices.go | 6 +----- .../github.com/docker/libcontainer/cgroups/fs/freezer.go | 8 ++------ .../github.com/docker/libcontainer/cgroups/fs/memory.go | 9 +++------ .../docker/libcontainer/cgroups/systemd/apply_systemd.go | 2 +- .../docker/libcontainer/netlink/netlink_linux.go | 4 ++-- 9 files changed, 16 insertions(+), 36 deletions(-) diff --git a/hack/vendor.sh b/hack/vendor.sh index 8732224bfc..f6422ccac5 100755 --- a/hack/vendor.sh +++ b/hack/vendor.sh @@ -75,7 +75,7 @@ rm -rf src/github.com/docker/distribution mkdir -p src/github.com/docker/distribution mv tmp-digest src/github.com/docker/distribution/digest -clone git github.com/docker/libcontainer 4a72e540feb67091156b907c4700e580a99f5a9d +clone git github.com/docker/libcontainer fd0087d3acdc4c5865de1829d4accee5e3ebb658 # see src/github.com/docker/libcontainer/update-vendor.sh which is the "source of truth" for libcontainer deps (just like this file) rm -rf src/github.com/docker/libcontainer/vendor eval "$(grep '^clone ' src/github.com/docker/libcontainer/update-vendor.sh | grep -v 'github.com/codegangsta/cli' | grep -v 'github.com/Sirupsen/logrus')" diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/apply_raw.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/apply_raw.go index f6c0d7d597..5cb8467c78 100644 --- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/apply_raw.go +++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/apply_raw.go @@ -99,12 +99,11 @@ func (m *Manager) Apply(pid int) error { // created then join consists of writing the process pids to cgroup.procs p, err := d.path(name) if err != nil { + if cgroups.IsNotFound(err) { + continue + } return err } - if !cgroups.PathExists(p) { - continue - } - paths[name] = p } m.Paths = paths diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/blkio.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/blkio.go index 01da5d7fc7..8e132643bb 100644 --- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/blkio.go +++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/blkio.go @@ -17,12 +17,8 @@ type BlkioGroup struct { func (s *BlkioGroup) Apply(d *data) error { dir, err := d.join("blkio") - if err != nil { - if cgroups.IsNotFound(err) { - return nil - } else { - return err - } + if err != nil && !cgroups.IsNotFound(err) { + return err } if err := s.Set(dir, d.c); err != nil { diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpu.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpu.go index 42386fd847..1fbf7b1540 100644 --- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpu.go +++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/cpu.go @@ -18,11 +18,7 @@ func (s *CpuGroup) Apply(d *data) error { // on a container basis dir, err := d.join("cpu") if err != nil { - if cgroups.IsNotFound(err) { - return nil - } else { - return err - } + return err } if err := s.Set(dir, d.c); err != nil { diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/devices.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/devices.go index fab8323e93..16e00b1c73 100644 --- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/devices.go +++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/devices.go @@ -11,11 +11,7 @@ type DevicesGroup struct { func (s *DevicesGroup) Apply(d *data) error { dir, err := d.join("devices") if err != nil { - if cgroups.IsNotFound(err) { - return nil - } else { - return err - } + return err } if err := s.Set(dir, d.c); err != nil { diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/freezer.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/freezer.go index 5e08e05302..fc8241d1bf 100644 --- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/freezer.go +++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/freezer.go @@ -13,12 +13,8 @@ type FreezerGroup struct { func (s *FreezerGroup) Apply(d *data) error { dir, err := d.join("freezer") - if err != nil { - if cgroups.IsNotFound(err) { - return nil - } else { - return err - } + if err != nil && !cgroups.IsNotFound(err) { + return err } if err := s.Set(dir, d.c); err != nil { diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/fs/memory.go b/vendor/src/github.com/docker/libcontainer/cgroups/fs/memory.go index 68e930fdc5..b99f81687a 100644 --- a/vendor/src/github.com/docker/libcontainer/cgroups/fs/memory.go +++ b/vendor/src/github.com/docker/libcontainer/cgroups/fs/memory.go @@ -16,12 +16,9 @@ type MemoryGroup struct { func (s *MemoryGroup) Apply(d *data) error { dir, err := d.join("memory") - if err != nil { - if cgroups.IsNotFound(err) { - return nil - } else { - return err - } + // only return an error for memory if it was specified + if err != nil && (d.c.Memory != 0 || d.c.MemoryReservation != 0 || d.c.MemorySwap != 0) { + return err } defer func() { if err != nil { diff --git a/vendor/src/github.com/docker/libcontainer/cgroups/systemd/apply_systemd.go b/vendor/src/github.com/docker/libcontainer/cgroups/systemd/apply_systemd.go index f4358e1a64..f353640697 100644 --- a/vendor/src/github.com/docker/libcontainer/cgroups/systemd/apply_systemd.go +++ b/vendor/src/github.com/docker/libcontainer/cgroups/systemd/apply_systemd.go @@ -91,7 +91,7 @@ func UseSystemd() bool { ddf := newProp("DefaultDependencies", false) if _, err := theConn.StartTransientUnit("docker-systemd-test-default-dependencies.scope", "replace", ddf); err != nil { if dbusError, ok := err.(dbus.Error); ok { - if dbusError.Name == "org.freedesktop.DBus.Error.PropertyReadOnly" { + if strings.Contains(dbusError.Name, "org.freedesktop.DBus.Error.PropertyReadOnly") { hasTransientDefaultDependencies = false } } diff --git a/vendor/src/github.com/docker/libcontainer/netlink/netlink_linux.go b/vendor/src/github.com/docker/libcontainer/netlink/netlink_linux.go index 3ecb81fb78..c438ec300f 100644 --- a/vendor/src/github.com/docker/libcontainer/netlink/netlink_linux.go +++ b/vendor/src/github.com/docker/libcontainer/netlink/netlink_linux.go @@ -659,7 +659,7 @@ func networkSetNsAction(iface *net.Interface, rtattr *RtAttr) error { } // Move a particular network interface to a particular network namespace -// specified by PID. This is idential to running: ip link set dev $name netns $pid +// specified by PID. This is identical to running: ip link set dev $name netns $pid func NetworkSetNsPid(iface *net.Interface, nspid int) error { data := uint32Attr(syscall.IFLA_NET_NS_PID, uint32(nspid)) return networkSetNsAction(iface, data) @@ -673,7 +673,7 @@ func NetworkSetNsFd(iface *net.Interface, fd int) error { return networkSetNsAction(iface, data) } -// Rname a particular interface to a different name +// Rename a particular interface to a different name // !!! Note that you can't rename an active interface. You need to bring it down before renaming it. // This is identical to running: ip link set dev ${oldName} name ${newName} func NetworkChangeName(iface *net.Interface, newName string) error { From 221e9624e3a7a7a9b81ffda9930657352080e32d Mon Sep 17 00:00:00 2001 From: Meaglith Ma Date: Thu, 12 Mar 2015 03:45:01 +0800 Subject: [PATCH 62/77] Fix decode tags value error when call get /v2//tags/list in registry api v2. Signed-off-by: Meaglith Ma --- registry/session_v2.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/registry/session_v2.go b/registry/session_v2.go index 833abeed6f..ed8ce061e3 100644 --- a/registry/session_v2.go +++ b/registry/session_v2.go @@ -352,8 +352,8 @@ func (r *Session) PutV2ImageManifest(ep *Endpoint, imageName, tagName string, si } type remoteTags struct { - name string - tags []string + Name string + Tags []string } // Given a repository name, returns a json array of string tags @@ -393,5 +393,5 @@ func (r *Session) GetV2RemoteTags(ep *Endpoint, imageName string, auth *RequestA if err != nil { return nil, fmt.Errorf("Error while decoding the http response: %s", err) } - return remote.tags, nil + return remote.Tags, nil } From 4925d98d1f638e9439e19b6c89c608a64a281a39 Mon Sep 17 00:00:00 2001 From: Derek McGowan Date: Mon, 23 Mar 2015 14:23:47 -0700 Subject: [PATCH 63/77] Add struct tags on v2 remote tags struct Signed-off-by: Derek McGowan (github: dmcgowan) --- registry/session_v2.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/session_v2.go b/registry/session_v2.go index ed8ce061e3..22f39317be 100644 --- a/registry/session_v2.go +++ b/registry/session_v2.go @@ -352,8 +352,8 @@ func (r *Session) PutV2ImageManifest(ep *Endpoint, imageName, tagName string, si } type remoteTags struct { - Name string - Tags []string + Name string `json:"name"` + Tags []string `json:"tags"` } // Given a repository name, returns a json array of string tags From bfc748221b15a0f6e42a6ab520ed6e31fa9e90c8 Mon Sep 17 00:00:00 2001 From: Arnaud Porterie Date: Mon, 23 Mar 2015 15:16:13 -0700 Subject: [PATCH 64/77] Cleanup "hello-world" image in build tests Signed-off-by: Arnaud Porterie --- integration-cli/docker_cli_build_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index 239dce6e8e..9a8ee69e54 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -5487,7 +5487,7 @@ func TestBuildRUNoneJSON(t *testing.T) { name := "testbuildrunonejson" defer deleteAllContainers() - defer deleteImages(name) + defer deleteImages(name, "hello-world") ctx, err := fakeContext(`FROM hello-world:frozen RUN [ "/hello" ]`, map[string]string{}) @@ -5513,7 +5513,7 @@ RUN [ "/hello" ]`, map[string]string{}) func TestBuildResourceConstraintsAreUsed(t *testing.T) { name := "testbuildresourceconstraints" defer deleteAllContainers() - defer deleteImages(name) + defer deleteImages(name, "hello-world") ctx, err := fakeContext(` FROM hello-world:frozen From f2c7b4d7437443d469b2247362835af02ccef385 Mon Sep 17 00:00:00 2001 From: Anton Tiurin Date: Tue, 24 Mar 2015 01:32:33 +0300 Subject: [PATCH 65/77] Syslog.Log - Remove redundant cast of msg.Line []byte to string as it's a fmt.Sprintf responsibility. Signed-off-by: Anton Tiurin --- daemon/logger/syslog/syslog.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemon/logger/syslog/syslog.go b/daemon/logger/syslog/syslog.go index bbd2090900..8cd50ae9ed 100644 --- a/daemon/logger/syslog/syslog.go +++ b/daemon/logger/syslog/syslog.go @@ -28,7 +28,7 @@ func New(tag string) (logger.Logger, error) { } func (s *Syslog) Log(msg *logger.Message) error { - logMessage := fmt.Sprintf("%s: %s", s.tag, string(msg.Line)) + logMessage := fmt.Sprintf("%s: %s", s.tag, msg.Line) if msg.Source == "stderr" { return s.writer.Err(logMessage) } From fe1f5ac77cda335ee773956cc8683a0c31791c3c Mon Sep 17 00:00:00 2001 From: Natalie Parker Date: Mon, 23 Mar 2015 20:15:29 +0000 Subject: [PATCH 66/77] Added missing code example in the RM command reference of command to delete all stopped containers Signed-off-by: Natalie Parker --- docs/sources/reference/commandline/cli.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/sources/reference/commandline/cli.md b/docs/sources/reference/commandline/cli.md index 6c3eb1c8dd..30a8a6b42c 100644 --- a/docs/sources/reference/commandline/cli.md +++ b/docs/sources/reference/commandline/cli.md @@ -1661,6 +1661,8 @@ containers removing all network communication. The main process inside the container referenced under the link `/redis` will receive `SIGKILL`, then the container will be removed. + $ docker rm $(docker ps -a -q) + This command will delete all stopped containers. The command `docker ps -a -q` will return all existing container IDs and pass them to the `rm` command which will delete them. Any running containers will not be From 0c3d2f6f9658ae9b1e7c7cc6f7fda730d4b04898 Mon Sep 17 00:00:00 2001 From: Antonio Murdaca Date: Mon, 23 Mar 2015 22:03:54 +0100 Subject: [PATCH 67/77] Return ContainerExecCreateResponse from container exec start API endpoint, Fixes #11613 Signed-off-by: Antonio Murdaca --- api/client/commands.go | 9 ++++++--- api/server/server.go | 17 +++++++++++++---- api/types/types.go | 9 +++++++++ 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/api/client/commands.go b/api/client/commands.go index 676db9dc90..a7cf9122fe 100644 --- a/api/client/commands.go +++ b/api/client/commands.go @@ -2677,12 +2677,15 @@ func (cli *DockerCli) CmdExec(args ...string) error { return err } - var execResult engine.Env - if err := execResult.Decode(stream); err != nil { + var response types.ContainerExecCreateResponse + if err := json.NewDecoder(stream).Decode(&response); err != nil { return err } + for _, warning := range response.Warnings { + fmt.Fprintf(cli.err, "WARNING: %s\n", warning) + } - execID := execResult.Get("Id") + execID := response.ID if execID == "" { fmt.Fprintf(cli.out, "exec ID empty") diff --git a/api/server/server.go b/api/server/server.go index a1c57a8e42..1b9c5562fd 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -1155,10 +1155,11 @@ func postContainerExecCreate(eng *engine.Engine, version version.Version, w http return nil } var ( - out engine.Env name = vars["name"] job = eng.Job("execCreate", name) stdoutBuffer = bytes.NewBuffer(nil) + outWarnings []string + warnings = bytes.NewBuffer(nil) ) if err := job.DecodeEnv(r.Body); err != nil { @@ -1166,15 +1167,23 @@ func postContainerExecCreate(eng *engine.Engine, version version.Version, w http } job.Stdout.Add(stdoutBuffer) + // Read warnings from stderr + job.Stderr.Add(warnings) // Register an instance of Exec in container. if err := job.Run(); err != nil { fmt.Fprintf(os.Stderr, "Error setting up exec command in container %s: %s\n", name, err) return err } - // Return the ID - out.Set("Id", engine.Tail(stdoutBuffer, 1)) + // Parse warnings from stderr + scanner := bufio.NewScanner(warnings) + for scanner.Scan() { + outWarnings = append(outWarnings, scanner.Text()) + } - return writeJSONEnv(w, http.StatusCreated, out) + return writeJSON(w, http.StatusCreated, &types.ContainerExecCreateResponse{ + ID: engine.Tail(stdoutBuffer, 1), + Warnings: outWarnings, + }) } // TODO(vishh): Refactor the code to avoid having to specify stream config as part of both create and start. diff --git a/api/types/types.go b/api/types/types.go index f1b1d041ea..5531135b1d 100644 --- a/api/types/types.go +++ b/api/types/types.go @@ -9,3 +9,12 @@ type ContainerCreateResponse struct { // Warnings are any warnings encountered during the creation of the container. Warnings []string `json:"Warnings"` } + +// POST /containers/{name:.*}/exec +type ContainerExecCreateResponse struct { + // ID is the exec ID. + ID string `json:"Id"` + + // Warnings are any warnings encountered during the execution of the command. + Warnings []string `json:"Warnings"` +} From 841692ff864c0d71347607eb8e4fbcf826d859c0 Mon Sep 17 00:00:00 2001 From: Jamshid Afshar Date: Mon, 23 Mar 2015 19:00:05 -0500 Subject: [PATCH 68/77] correcting git fetch command Signed-off-by: Jamshid Afshar --- docs/sources/project/find-an-issue.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sources/project/find-an-issue.md b/docs/sources/project/find-an-issue.md index 0a36c8833a..2b3396e6e7 100644 --- a/docs/sources/project/find-an-issue.md +++ b/docs/sources/project/find-an-issue.md @@ -166,7 +166,7 @@ To sync your repository: 5. Fetch all the changes from the `upstream/master` branch. - $ git fetch upstream/master + $ git fetch upstream remote: Counting objects: 141, done. remote: Compressing objects: 100% (29/29), done. remote: Total 141 (delta 52), reused 46 (delta 46), pack-reused 66 From dabd8a02aeff8b2122efa0b55de4ba52c429f936 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Mon, 23 Mar 2015 18:46:24 -0700 Subject: [PATCH 69/77] Removed unused "mutex" field fixes #11659 Signed-off-by: Alena Prokharchyk --- daemon/logger/syslog/syslog.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/daemon/logger/syslog/syslog.go b/daemon/logger/syslog/syslog.go index 8cd50ae9ed..afd3dacbb4 100644 --- a/daemon/logger/syslog/syslog.go +++ b/daemon/logger/syslog/syslog.go @@ -5,7 +5,6 @@ import ( "log/syslog" "os" "path" - "sync" "github.com/docker/docker/daemon/logger" ) @@ -13,7 +12,6 @@ import ( type Syslog struct { writer *syslog.Writer tag string - mu sync.Mutex } func New(tag string) (logger.Logger, error) { From b21751da907cb2889aa9ca95ebf6c4c66e6131a6 Mon Sep 17 00:00:00 2001 From: Chris Khoo Date: Mon, 23 Mar 2015 19:21:31 -0700 Subject: [PATCH 70/77] fix broken prerequisite link Signed-off-by: Chris Khoo --- docs/sources/project/set-up-dev-env.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sources/project/set-up-dev-env.md b/docs/sources/project/set-up-dev-env.md index 637eef6f58..9b767ad649 100644 --- a/docs/sources/project/set-up-dev-env.md +++ b/docs/sources/project/set-up-dev-env.md @@ -15,7 +15,7 @@ You use the `docker` repository and its `Dockerfile` to create a Docker image, run a Docker container, and develop code in the container. Docker itself builds, tests, and releases new Docker versions using this container. -If you followed the procedures that +If you followed the procedures that set up the prerequisites, you should have a fork of the `docker/docker` repository. You also created a branch called `dry-run-test`. In this section, you continue working with your fork on this branch. From ef0275c66c420944dd3de4647d2d25b78f8f1b5a Mon Sep 17 00:00:00 2001 From: Mark West Date: Mon, 23 Mar 2015 20:16:40 -0700 Subject: [PATCH 71/77] RE: Issue #6114. Updated docs to reflect docker inpsect for volumes Signed-off-by: Mark West --- docs/sources/userguide/dockervolumes.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/sources/userguide/dockervolumes.md b/docs/sources/userguide/dockervolumes.md index d533224656..af4a7297fb 100644 --- a/docs/sources/userguide/dockervolumes.md +++ b/docs/sources/userguide/dockervolumes.md @@ -52,6 +52,27 @@ This will create a new volume inside a container at `/webapp`. > You can also use the `VOLUME` instruction in a `Dockerfile` to add one or > more new volumes to any container created from that image. +### Locating a volume + +You can locate the volume on the host by utilizing the 'docker inspect' command. + + $ docker inspect web + +The output will provide details on the container configurations including the +volumes. The output should look something similar to the following: + + ... + "Volumes": { + "/webapp": "/var/lib/docker/volumes/fac362...80535" + }, + "VolumesRW": { + "/webapp": true + } + ... + +You will notice in the above 'Volumes' is specifying the location on the host and +'VolumesRW' is specifying that the volume is read/write. + ### Mount a Host Directory as a Data Volume In addition to creating a volume using the `-v` flag you can also mount a From 6fa6b5bcbb707a1fe709c5272035b79635c29a78 Mon Sep 17 00:00:00 2001 From: Swapnil Daingade Date: Mon, 23 Mar 2015 23:42:26 -0400 Subject: [PATCH 72/77] Fixes error #11683 Signed-off-by: Swapnil Daingade --- docs/sources/userguide/usingdocker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sources/userguide/usingdocker.md b/docs/sources/userguide/usingdocker.md index 8d57def4ed..fd5f52a375 100644 --- a/docs/sources/userguide/usingdocker.md +++ b/docs/sources/userguide/usingdocker.md @@ -298,7 +298,7 @@ and won't need it again. So let's remove it using the `docker rm` command. Error: Impossible to remove a running container, please stop it first or use -f 2014/05/24 08:12:56 Error: failed to remove one or more containers -What's happened? We can't actually remove a running container. This protects +What happened? We can't actually remove a running container. This protects you from accidentally removing a running container you might need. Let's try this again by stopping the container first. From a57d7c5c796a1affcfa05ee6e7ea586750a9292f Mon Sep 17 00:00:00 2001 From: Dan Anolik Date: Mon, 23 Mar 2015 20:47:04 -0700 Subject: [PATCH 73/77] Added documentation for specifying groupname or GID for commands. Also clarified used of the possible use of multiple USER commands in a Dockerfile. Signed-off-by: Dan Anolik --- docs/man/Dockerfile.5.md | 11 +++++++++-- docs/man/docker-run.1.md | 7 ++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/docs/man/Dockerfile.5.md b/docs/man/Dockerfile.5.md index 7f884888e2..0ec54a8c9c 100644 --- a/docs/man/Dockerfile.5.md +++ b/docs/man/Dockerfile.5.md @@ -273,8 +273,15 @@ A Dockerfile is similar to a Makefile. **USER** -- `USER daemon` - The **USER** instruction sets the username or UID that is used when running the - image. + Sets the username or UID used for running subsequent commands. + + The **USER** instruction can optionally be used to set the group or GID. The + followings examples are all valid: + USER [user | user:group | uid | uid:gid | user:gid | uid:group ] + + Until the **USER** instruction is set, instructions will be run as root. The USER + instruction can be used any number of times in a Dockerfile, and will only affect + subsequent commands. **WRKDIR** -- `WORKDIR /path/to/workdir` diff --git a/docs/man/docker-run.1.md b/docs/man/docker-run.1.md index 1831237de2..9ac5717383 100644 --- a/docs/man/docker-run.1.md +++ b/docs/man/docker-run.1.md @@ -341,7 +341,12 @@ The **-t** option is incompatible with a redirection of the docker client standard input. **-u**, **--user**="" - Username or UID + Sets the username or UID used and optionally the groupname or GID for the specified command. + + The followings examples are all valid: + --user [user | user:group | uid | uid:gid | user:gid | uid:group ] + + Without this argument the command will be run as root in the container. **-v**, **--volume**=[] Bind mount a volume (e.g., from the host: -v /host:/container, from Docker: -v /container) From df98ce0a28c6d38757305dccc1acb4b8989e6aff Mon Sep 17 00:00:00 2001 From: Chris Khoo Date: Mon, 23 Mar 2015 20:58:51 -0700 Subject: [PATCH 74/77] fix test-and-docs typo "do" to "due" Signed-off-by: Chris Khoo --- docs/sources/project/test-and-docs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sources/project/test-and-docs.md b/docs/sources/project/test-and-docs.md index d586ea2c3c..cef3cae8eb 100644 --- a/docs/sources/project/test-and-docs.md +++ b/docs/sources/project/test-and-docs.md @@ -169,7 +169,7 @@ To run the same test inside your Docker development container, you do this: root@5f8630b873fe:/go/src/github.com/docker/docker# TESTFLAGS='-run ^TestBuild$' hack/make.sh -## If test under Boot2Docker fail do to space errors +## If tests under Boot2Docker fail due to disk space errors Running the tests requires about 2GB of memory. If you are running your container on bare metal, that is you are not running with Boot2Docker, your From ed0d2ac3b799b8f7b2508176e65bfe8583881c83 Mon Sep 17 00:00:00 2001 From: Jesse Dearing Date: Mon, 23 Mar 2015 20:48:12 -0700 Subject: [PATCH 75/77] Add documentation about the semantics of `docker login` Fixes #10550 Signed-off-by: Jesse Dearing --- docs/man/docker-login.1.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/man/docker-login.1.md b/docs/man/docker-login.1.md index e3614cce4a..5ff9403a8d 100644 --- a/docs/man/docker-login.1.md +++ b/docs/man/docker-login.1.md @@ -17,6 +17,9 @@ Register or Login to a docker registry server, if no server is specified "https://index.docker.io/v1/" is the default. If you want to login to a private registry you can specify this by adding the server name. +This stores encoded credentials in `$HOME/.dockercfg` on Linux or `%USERPROFILE%/.dockercfg` +on Windows. + # OPTIONS **-e**, **--email**="" Email From babd1b3e1fd7be7674f6e96f264b1b841aeba3b9 Mon Sep 17 00:00:00 2001 From: Antonio Murdaca Date: Mon, 23 Mar 2015 23:32:50 +0100 Subject: [PATCH 76/77] Return AuthResponse from postAuth api endpoint, Fixes #11607 Signed-off-by: Antonio Murdaca --- api/client/commands.go | 11 ++++++----- api/server/server.go | 4 +++- api/types/types.go | 6 ++++++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/api/client/commands.go b/api/client/commands.go index 5689dfd2cf..d5dfb2a37c 100644 --- a/api/client/commands.go +++ b/api/client/commands.go @@ -450,17 +450,18 @@ func (cli *DockerCli) CmdLogin(args ...string) error { if err != nil { return err } - var out2 engine.Env - err = out2.Decode(stream) - if err != nil { + + var response types.AuthResponse + if err := json.NewDecoder(stream).Decode(response); err != nil { cli.configFile, _ = registry.LoadConfig(homedir.Get()) return err } + registry.SaveConfig(cli.configFile) fmt.Fprintf(cli.out, "WARNING: login credentials saved in %s.\n", path.Join(homedir.Get(), registry.CONFIGFILE)) - if out2.Get("Status") != "" { - fmt.Fprintf(cli.out, "%s\n", out2.Get("Status")) + if response.Status != "" { + fmt.Fprintf(cli.out, "%s\n", response.Status) } return nil } diff --git a/api/server/server.go b/api/server/server.go index 1b9c5562fd..a11a4fd9ff 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -192,7 +192,9 @@ func postAuth(eng *engine.Engine, version version.Version, w http.ResponseWriter if status := engine.Tail(stdoutBuffer, 1); status != "" { var env engine.Env env.Set("Status", status) - return writeJSONEnv(w, http.StatusOK, env) + return writeJSON(w, http.StatusOK, &types.AuthResponse{ + Status: status, + }) } w.WriteHeader(http.StatusNoContent) return nil diff --git a/api/types/types.go b/api/types/types.go index 5531135b1d..21dba7729e 100644 --- a/api/types/types.go +++ b/api/types/types.go @@ -18,3 +18,9 @@ type ContainerExecCreateResponse struct { // Warnings are any warnings encountered during the execution of the command. Warnings []string `json:"Warnings"` } + +// POST /auth +type AuthResponse struct { + // Status is the authentication status + Status string `json:"Status"` +} From 96d8c3584cedddfc69c01bda3f512d495b21ac47 Mon Sep 17 00:00:00 2001 From: Hu Keping Date: Wed, 25 Mar 2015 00:46:22 +0800 Subject: [PATCH 77/77] Fix minor typo Fix minor typo and make the comments of version-comparison functions uniform. Signed-off-by: Hu Keping --- pkg/version/version.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/version/version.go b/pkg/version/version.go index cc802a654c..bd5ec7a835 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -37,7 +37,7 @@ func (v Version) compareTo(other Version) int { return 0 } -// LessThan checks if a version is less than another version +// LessThan checks if a version is less than another func (v Version) LessThan(other Version) bool { return v.compareTo(other) == -1 } @@ -47,12 +47,12 @@ func (v Version) LessThanOrEqualTo(other Version) bool { return v.compareTo(other) <= 0 } -// GreaterThan checks if a version is greater than another one +// GreaterThan checks if a version is greater than another func (v Version) GreaterThan(other Version) bool { return v.compareTo(other) == 1 } -// GreaterThanOrEqualTo checks ia version is greater than or equal to another +// GreaterThanOrEqualTo checks if a version is greater than or equal to another func (v Version) GreaterThanOrEqualTo(other Version) bool { return v.compareTo(other) >= 0 }