From e2944fa67e3dddc4aff83f0f7c5980f61149b748 Mon Sep 17 00:00:00 2001 From: Brian Flad Date: Mon, 30 Dec 2013 04:44:28 -0500 Subject: [PATCH] More helpful cmd_timeout error messages and catchable exceptions for container, fixes #31 --- README.md | 4 ++-- providers/container.rb | 25 +++++++++++++++++++++---- providers/image.rb | 25 +++++++++++++++++++++---- 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 8bbe03edf4..acf52fab79 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ Attribute | Description | Type | Default ----------|-------------|------|-------- attach | Attach container's stdout/stderr and forward all signals to the process | TrueClass, FalseClass | nil cidfile | File to store container ID | String | nil -cmd_timeout | Timeout for docker commands | Integer | `node['docker']['container_cmd_timeout']` +cmd_timeout | Timeout for docker commands (catchable exception: `Chef::Provider::Container::CommandTimeout`)| Integer | `node['docker']['container_cmd_timeout']` command | Command to run in container | String | nil container_name | Name for container/service | String | nil cookbook | Cookbook to grab any templates | String | docker @@ -186,7 +186,7 @@ These attributes are under the `docker_image` LWRP namespace. Attribute | Description | Type | Default ----------|-------------|------|-------- -cmd_timeout | Timeout for docker commands | Integer | `node['docker']['image_cmd_timeout']` +cmd_timeout | Timeout for docker commands (catchable exception: `Chef::Provider::Image::CommandTimeout`) | Integer | `node['docker']['image_cmd_timeout']` dockerfile | Dockerfile to build image | String | nil id | Image ID (internally set by LWRP) | String | nil image_name | Image name | String | LWRP name diff --git a/providers/container.rb b/providers/container.rb index a35fe1b190..689973020a 100644 --- a/providers/container.rb +++ b/providers/container.rb @@ -2,6 +2,8 @@ include Chef::Mixin::ShellOut include Helpers::Docker +class CommandTimeout < RuntimeError; end + def load_current_resource @current_resource = Chef::Resource::DockerContainer.new(new_resource) dps = shell_out('docker ps -a -notrunc', :timeout => new_resource.cmd_timeout) @@ -80,6 +82,21 @@ def container_name end end +def docker_cmd(cmd, timeout = new_resource.cmd_timeout) + Chef::Log.debug('Executing: docker ' + cmd) + begin + shell_out('docker ' + cmd, :timeout => timeout) + rescue Mixlib::ShellOut::CommandTimeout + raise CommandTimeout, <<-EOM + +Docker command timed out: +docker #{cmd} + +Please adjust node container_cmd_timeout attribute or this docker_container cmd_timeout attribute if necessary. +EOM + end +end + def exists? @current_resource.id end @@ -136,7 +153,7 @@ def run 'volumes-from' => new_resource.volumes_from, 'w' => new_resource.working_directory ) - dr = shell_out("docker run #{run_args} #{new_resource.image} #{new_resource.command}", :timeout => new_resource.cmd_timeout) + dr = docker_cmd("run #{run_args} #{new_resource.image} #{new_resource.command}") dr.error! new_resource.id(dr.stdout.chomp) service_create if service? @@ -301,7 +318,7 @@ def start if service? service_create else - shell_out("docker start #{start_args} #{current_resource.id}", :timeout => new_resource.cmd_timeout) + docker_cmd("start #{start_args} #{current_resource.id}") end end @@ -312,10 +329,10 @@ def stop if service? service_stop else - shell_out("docker stop #{stop_args} #{current_resource.id}", :timeout => (new_resource.cmd_timeout + 15)) + docker_cmd("stop #{stop_args} #{current_resource.id}", (new_resource.cmd_timeout + 15)) end end def wait - shell_out("docker wait #{current_resource.id}", :timeout => new_resource.cmd_timeout) + docker_cmd("wait #{current_resource.id}") end diff --git a/providers/image.rb b/providers/image.rb index c30432d2a5..d888836f80 100644 --- a/providers/image.rb +++ b/providers/image.rb @@ -2,6 +2,8 @@ include Chef::Mixin::ShellOut include Helpers::Docker +class CommandTimeout < RuntimeError; end + def load_current_resource @current_resource = Chef::Resource::DockerImage.new(new_resource) di = shell_out('docker images -a', :timeout => new_resource.cmd_timeout) @@ -59,7 +61,22 @@ def build command = new_resource.image_url end - shell_out("docker build -t #{full_image_name} #{command}", :timeout => new_resource.cmd_timeout) + docker_cmd("build -t #{full_image_name} #{command}") +end + +def docker_cmd(cmd, timeout = new_resource.cmd_timeout) + Chef::Log.debug('Executing: docker ' + cmd) + begin + shell_out('docker ' + cmd, :timeout => timeout) + rescue Mixlib::ShellOut::CommandTimeout + raise CommandTimeout, <<-EOM + +Docker command timed out: +docker #{cmd} + +Please adjust node image_cmd_timeout attribute or this docker_image cmd_timeout attribute if necessary. +EOM + end end def import @@ -72,7 +89,7 @@ def import import_args += " #{new_resource.tag}" if new_resource.tag end - shell_out("docker import #{import_args}", :timeout => new_resource.cmd_timeout) + docker_cmd("import #{import_args}") end def installed? @@ -84,11 +101,11 @@ def pull 'registry' => new_resource.registry, 't' => new_resource.tag ) - shell_out("docker pull #{new_resource.image_name} #{pull_args}", :timeout => new_resource.cmd_timeout) + docker_cmd("pull #{new_resource.image_name} #{pull_args}") end def remove - shell_out("docker rmi #{new_resource.image_name}", :timeout => new_resource.cmd_timeout) + docker_cmd("rmi #{new_resource.image_name}") end def tag_match