Class: Cumuli::Spawner::App

Inherits:
Object
  • Object
show all
Defined in:
lib/cumuli/spawner/app.rb

Constant Summary collapse

SIGNALS =
['TERM', 'INT', 'HUP']

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ App

Returns a new instance of App.



8
9
10
11
12
# File 'lib/cumuli/spawner/app.rb', line 8

def initialize(options={})
  @env = options[:env]
  @log_dir = options[:log_dir] || "#{Dir.pwd}/log"
  @app_dir = options[:app_dir] || Dir.pwd
end

Instance Attribute Details

#app_dirObject

Returns the value of attribute app_dir.



6
7
8
# File 'lib/cumuli/spawner/app.rb', line 6

def app_dir
  @app_dir
end

#envObject

Returns the value of attribute env.



6
7
8
# File 'lib/cumuli/spawner/app.rb', line 6

def env
  @env
end

#log_dirObject

Returns the value of attribute log_dir.



6
7
8
# File 'lib/cumuli/spawner/app.rb', line 6

def log_dir
  @log_dir
end

Instance Method Details

#appsObject



41
42
43
# File 'lib/cumuli/spawner/app.rb', line 41

def apps
  @apps ||= ProjectManager::Manager.new(app_dir).projects
end

#foreman_processObject



37
38
39
# File 'lib/cumuli/spawner/app.rb', line 37

def foreman_process
  @foreman_process ||= Spawner::ForemanProc.new(env, log_dir)
end

#listen_for_signalsObject



53
54
55
56
57
58
59
60
# File 'lib/cumuli/spawner/app.rb', line 53

def listen_for_signals
  SIGNALS.each do |signal|
    trap(signal) do
      puts "#{self.class}: trapped signal #{signal} in #{Process.pid} ... stopping"
      stop
    end
  end
end

#log_and_wait(app, direction) ⇒ Object



70
71
72
73
74
75
76
77
78
# File 'lib/cumuli/spawner/app.rb', line 70

def log_and_wait(app, direction)
  logger.print "#{direction}: waiting for app named '#{app.name}' at #{app.url}"
  app.send("wait_for_#{direction}")
  logger.print "#{direction}: application '#{app.name}' on #{app.url} complete"
  logger.add_space
rescue Exception => e
  stop
  raise e
end

#loggerObject



33
34
35
# File 'lib/cumuli/spawner/app.rb', line 33

def logger
  @logger = StdoutLogger.new
end

#pidObject



49
50
51
# File 'lib/cumuli/spawner/app.rb', line 49

def pid
  foreman_process.group_id
end

#process_pidsObject



45
46
47
# File 'lib/cumuli/spawner/app.rb', line 45

def process_pids
  PS.new.family
end

#startObject



14
15
16
17
18
19
20
21
22
23
# File 'lib/cumuli/spawner/app.rb', line 14

def start
  return if foreman_process.started?

  Dir.chdir(app_dir) do
    listen_for_signals
    logger.print "Starting ..."
    foreman_process.start
    wait_for_apps
  end
end

#stopObject



25
26
27
28
29
30
31
# File 'lib/cumuli/spawner/app.rb', line 25

def stop
  if foreman_process.started?
    foreman_process.stop
    wait_for_apps('stop')
    @foreman_process = nil
  end
end

#wait_for_apps(direction = 'start') ⇒ Object



62
63
64
65
66
67
68
# File 'lib/cumuli/spawner/app.rb', line 62

def wait_for_apps(direction = 'start')
  logger.add_space
  apps.each do |app|
    log_and_wait(app, direction)
  end
  logger.add_space
end