class DkComposer::Stack

Attributes

name[RW]
networks[RW]
services[RW]
version[RW]
volumes[RW]

Public Class Methods

create(name, *params, **opts, &block) click to toggle source
# File lib/dkcomposer/stack.rb, line 93
def self.create(name, *params, **opts, &block)
  ret = Stack.new(name)
  ret.config(opts)
  ret.instance_exec(*params, &block) if block
  ret
end
load_compose_file(file, name = :auto_generated) click to toggle source
# File lib/dkcomposer/stack.rb, line 127
def self.load_compose_file(file, name = :auto_generated)
  opts = YAML.load_file(file)
  ret = create(name)
  ret.from_h(opts.symbolize_key)
  ret
end
new(name) click to toggle source
# File lib/dkcomposer/stack.rb, line 5
def initialize(name)
  @name = name
  @services = []
  @volumes = {}
  @networks = {}
  @version = '2'
end

Public Instance Methods

dump()
Alias for: to_s
from_h(h) click to toggle source
# File lib/dkcomposer/stack.rb, line 112
def from_h(h)
  version h[:version]

  h[:volumes].each do |k, v|
    volume(k, v || {})
  end
  h[:networks].each do |k, v|
    network(k, v || {})
  end

  h[:services].each do |k, v|
    service(k, v)
  end
end
network(name, **opts, &block) click to toggle source
# File lib/dkcomposer/stack.rb, line 37
def network(name, **opts, &block)
  ret = if NETWORK[name]
          NETWORK[name].deep_clone
        else
          Network.create(name)
        end
  ret.config(opts)
  ret.instance_exec(&block) if block
  @networks[name] = ret
  ret
end
run(*opts, path: build_path) click to toggle source
# File lib/dkcomposer/stack.rb, line 53
def run(*opts, path: build_path)
  composefile = tempfile(to_yaml, 'docker-compose.yml', path)
  up_cmd = [
    "pushd #{path}",
    "docker-compose -f #{composefile}  up #{opts.join(' ')}",
    'popd'
  ].join('&&')
  run_command(up_cmd)
end
service(name, **opts, &block) click to toggle source
# File lib/dkcomposer/stack.rb, line 13
def service(name, **opts, &block)
  ret = if SERVICE[name]
          SERVICE[name].deep_clone
        else
          Service.create(name)
        end
  ret.config(opts)
  ret.instance_exec(&block) if block
  @services << ret
  ret
end
stop(*opts, path: build_path) click to toggle source
# File lib/dkcomposer/stack.rb, line 63
def stop(*opts, path: build_path)
  composefile = tempfile(to_yaml, 'docker-compose.yml', path)
  up_cmd = [
    "pushd #{path}",
    "docker-compose -f #{composefile}  down #{opts.join(' ')}",
    'popd'
  ].join('&&')
  run_command(up_cmd)
end
to_h() click to toggle source
# File lib/dkcomposer/stack.rb, line 73
def to_h
  ret = {
    version: @version,
    volumes: @volumes.each_with_object({}) do |(_, v), r|
      r.merge! v.to_h
    end.stringfy_key,
    networks: @networks.each_with_object({}) do |(_, v), r|
      r.merge! v.to_h
    end.stringfy_key,
    services: @services.each_with_object({}) do |s, r|
      r.merge! s.to_h
    end
  }
  ret
end
to_s() click to toggle source
# File lib/dkcomposer/stack.rb, line 100
    def to_s
      ret = <<-DUMP
stack(:#{name}, version: '#{version}',build_path:"#{build_path}") do
#{@volumes.map { |(_, v)| v.to_s }.join("\n")}
#{@networks.map { |(_, v)| v.to_s }.join("\n")}
#{@services.map(&:to_s).join("\n")}
end
    DUMP
      ret
    end
Also aliased as: dump
to_yaml() click to toggle source
# File lib/dkcomposer/stack.rb, line 89
def to_yaml
  Hash[to_h.collect { |k, v| [k.to_s, v] }].to_yaml
end
volume(name, **opts, &block) click to toggle source
# File lib/dkcomposer/stack.rb, line 25
def volume(name, **opts, &block)
  ret = if VOLUME[name]
          VOLUME[name].deep_clone
        else
          Volume.create(name)
        end
  ret.config(opts)
  ret.instance_exec(&block) if block
  @volumes[name] = ret
  ret
end