class DockerHelper::Pool

Constants

DEFAULT_BASENAME
DEFAULT_SIZE

Attributes

basename[R]
docker[R]
image[RW]
path[RW]
pool[R]
port[RW]

Public Class Methods

new(size = nil, basename = nil, docker = nil) { |self| ... } click to toggle source
# File lib/docker_helper/pool.rb, line 35
def initialize(size = nil, basename = nil, docker = nil)
  @docker, @previous_name, @basename =
    docker ||= DockerHelper.proxy, nil,
    basename ||= self.class::DEFAULT_BASENAME

  yield self if block_given?

  @pool = Array.new(size ||= self.class::DEFAULT_SIZE) { |i|
    spawn_thread("#{basename}-#{$$}-#{i}")
  }

  extend(SinglePool) if size == 1
end

Public Instance Methods

clean(name = @previous_name) click to toggle source
# File lib/docker_helper/pool.rb, line 59
def clean(name = @previous_name)
  pool.map { |t| clean_thread(t.value) }.tap { |clean|
    clean << clean_thread(name) if name
  }.each(&:join)
end
fetch(name = @previous_name) click to toggle source
# File lib/docker_helper/pool.rb, line 55
def fetch(name = @previous_name)
  pool.shift.tap { reclaim(name) }.value
end
fetch_url(name = @previous_name) click to toggle source
# File lib/docker_helper/pool.rb, line 51
def fetch_url(name = @previous_name)
  docker.url(port, @previous_name = fetch(name)) + path.to_s
end
inspect() click to toggle source
# File lib/docker_helper/pool.rb, line 65
def inspect
  '#<%s:0x%x %s@%d>' % [self.class, object_id, basename, pool.size]
end

Private Instance Methods

clean_thread(name) click to toggle source
# File lib/docker_helper/pool.rb, line 83
def clean_thread(name)
  Thread.new { docker.clean(name) }
end
reclaim(name) click to toggle source
# File lib/docker_helper/pool.rb, line 87
def reclaim(name)
  pool << spawn_thread(name, true) if name
end
spawn_thread(name, clean = false) click to toggle source
# File lib/docker_helper/pool.rb, line 73
def spawn_thread(name, clean = false)
  Thread.new {
    docker.clean(name) if clean
    docker.start(name, image) if image
    docker.ready(docker.port(port, name), path) if port

    name
  }
end