class Rummager::ClickContainer

Template to generate tasks for Container lifecycle

Attributes

allow_enter[RW]
args_create[RW]
args_start[RW]
binds[RW]
command[RW]
container_name[RW]
dep_jobs[RW]
enter_dep_jobs[RW]
exec_on_start[RW]
exposed_ports[RW]
image_name[RW]
image_nobuild[RW]
noclean[RW]
port_bindings[RW]
publishall[RW]
repo_base[RW]
volumes_from[RW]

Public Class Methods

new(container_name,args={}) { |self| ... } click to toggle source
# File lib/rummager/containers.rb, line 263
def initialize(container_name,args={})
  @container_name = container_name
  @image_name = args.delete(:image_name) || container_name
  @image_nobuild = args.delete(:image_nobuild)
  @repo_base = args.delete(:repo_base) || Rummager.repo_base
  @command = args.delete(:command)
  @args_create = args.delete(:args_create) || CNTNR_ARGS_CREATE
  @args_start = args.delete(:args_start) || {}
  @volumes_from = args.delete(:volumes_from)
  @binds = args.delete(:binds)
  @exposed_ports = args.delete(:exposed_ports)
  @port_bindings = args.delete(:port_bindings)
  if (!@exposed_ports.nil? && !@port_bindings.nil?)
    puts "WARNING: both 'exposed_ports' and 'port_bindings' are defined on #{@container_name}"
  end
  @publishall = args.delete(:publishall)
  @dep_jobs = args.delete(:dep_jobs)
  @exec_on_start = args.delete(:exec_on_start)
  @enter_dep_jobs = args.delete(:enter_dep_jobs) || []
  @allow_enter = args.delete(:allow_enter)
  @noclean = args.delete(:noclean)
  if !args.empty?
    raise ArgumentError, "ClickContainer'#{@container_name}' defenition has unused/invalid key-values:#{args}"
  end
  yield self if block_given?
  define
end

Public Instance Methods

define() click to toggle source
# File lib/rummager/containers.rb, line 291
def define
  namespace "containers" do
    namespace @container_name do
      # create task
      realcreatetask = Rummager::ContainerCreateTask.define_task :create
      realcreatetask.container_name = @container_name
      realcreatetask.image_name = @image_name
      realcreatetask.repo_base = @repo_base
      realcreatetask.args_create = @args_create
      realcreatetask.command = @command
      realcreatetask.exposed_ports = @exposed_ports
      
      if @image_nobuild == true
        puts "skipping image build - assuming it exists" if Rake.verbose == true
      else
        Rake::Task["containers:#{@container_name}:create"].enhance( [ :"images:#{@image_name}:build" ] )
      end
      
      if @dep_jobs
        @dep_jobs.each do |dj|
          Rake::Task["containers:#{@container_name}:create"].enhance( [ :"#{dj}" ] )
        end
      end

      # start task
      starttask = Rummager::ContainerStartTask.define_task :start
      starttask.container_name = @container_name
      starttask.args_start = @args_start
      starttask.volumes_from = @volumes_from
      starttask.binds = @binds
      starttask.port_bindings = @port_bindings
      starttask.publishall = @publishall
      starttask.exec_on_start = @exec_on_start
      
      # ensure that containers from which volumes will be attached
      # are started before this container is started, otherwise
      # docker volumes_from will fail
      Rake::Task["containers:#{@container_name}:start"].enhance( [ :"containers:#{@container_name}:create" ] )
      if @volumes_from
        @volumes_from.each do |vf|
          Rake::Task["containers:#{@container_name}:create"].enhance([:"containers:#{vf}:start" ])
        end
      end

      # stop task
      stoptask = Rummager::ContainerStopTask.define_task :stop
      stoptask.container_name = @container_name
      Rake::Task[:"containers:stop"].enhance( [ :"containers:#{@container_name}:stop" ] )

      # enter task
      if @allow_enter
        # build and jump into an environment
        entertask = Rummager::ContainerEnterTask.define_task :enter
        entertask.container_name = @container_name
        Rake::Task["containers:#{@container_name}:enter"].enhance([ :"containers:#{@container_name}:start" ])
        # wire in any jobs marked as required to enter
        # jobs must be defined on this container
        @enter_dep_jobs.each do |edj|
          Rake::Task["containers:#{@container_name}:enter"].enhance([ :"containers:#{@container_name}:jobs:#{edj}" ])
        end
      end # allow_enter
      
      # Remove task
      rmtask = Rummager::ContainerRMTask.define_task :rm
      rmtask.container_name = @container_name
      if @image_nobuild == true
        puts "skipping #{@image_name}:rmi dependency on #{@container_name}:rm" if Rake.verbose == true
      else
        Rake::Task["images:#{@image_name}:rmi"].enhance( [ "containers:#{@container_name}:rm" ] )
      end
      
      Rake::Task["containers:#{@container_name}:rm"].enhance( [ :"containers:#{@container_name}:stop" ] )
      
      if @noclean == true
        Rake::Task[:"containers:clobber"].enhance( [ :"containers:#{@container_name}:rm" ] )
      else
        Rake::Task[:"containers:clean"].enhance( [ :"containers:#{@container_name}:rm" ] )
      end
      
    end # namespace @container_name
  end # namespace "containers"
    
  Rake::Task["containers:#{@container_name}:rm"].enhance( [ :"containers:#{@container_name}:stop" ] )
  Rake::Task[:"containers:stop"].enhance( [ :"containers:#{@container_name}:stop" ] )

end