foreman 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/foreman.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Foreman
2
2
 
3
- VERSION = "0.7.0"
3
+ VERSION = "0.7.1"
4
4
 
5
5
  class AppDoesNotExist < Exception; end
6
6
 
data/lib/foreman/cli.rb CHANGED
@@ -9,6 +9,7 @@ class Foreman::CLI < Thor
9
9
 
10
10
  desc "start [PROCESS]", "Start the application, or a specific process"
11
11
 
12
+ method_option :port, :type => :numeric, :aliases => "-p"
12
13
  method_option :concurrency, :type => :string, :aliases => "-c",
13
14
  :banner => '"alpha=5,bar=3"'
14
15
 
@@ -20,27 +20,14 @@ class Foreman::Engine
20
20
  @directory = File.expand_path(File.dirname(procfile))
21
21
  end
22
22
 
23
- def processes(concurrency=nil)
23
+ def processes
24
24
  @processes ||= begin
25
- concurrency = Foreman::Utils.parse_concurrency(concurrency)
26
-
27
25
  procfile.split("\n").inject({}) do |hash, line|
28
26
  next if line.strip == ""
29
27
  name, command = line.split(" ", 2)
30
-
31
- if concurrency[name] > 1 then
32
- 1.upto(concurrency[name]) do |num|
33
- process = Foreman::Process.new("#{name}.#{num}", command)
34
- process.color = next_color
35
- hash[process.name] = process
36
- end
37
- else
38
- process = Foreman::Process.new(name, command)
39
- process.color = next_color
40
- hash[process.name] = process
41
- end
42
-
43
- hash
28
+ process = Foreman::Process.new(name, command)
29
+ process.color = next_color
30
+ hash.update(process.name => process)
44
31
  end
45
32
  end
46
33
  end
@@ -48,8 +35,8 @@ class Foreman::Engine
48
35
  def start(options={})
49
36
  proctitle "ruby: foreman master"
50
37
 
51
- processes(options[:concurrency]).each do |name, process|
52
- fork process
38
+ processes.each do |name, process|
39
+ fork process, options
53
40
  end
54
41
 
55
42
  trap("TERM") { kill_and_exit("TERM") }
@@ -59,11 +46,7 @@ class Foreman::Engine
59
46
  end
60
47
 
61
48
  def execute(name, options={})
62
- processes(options[:concurrency]).values.select do |process|
63
- process.name =~ /\A#{name}\.?\d*\Z/
64
- end.each do |process|
65
- fork process
66
- end
49
+ fork processes[name], options
67
50
 
68
51
  trap("TERM") { kill_and_exit("TERM") }
69
52
  trap("INT") { kill_and_exit("INT") }
@@ -71,9 +54,25 @@ class Foreman::Engine
71
54
  watch_for_termination
72
55
  end
73
56
 
57
+ def port_for(process, num, base_port=nil)
58
+ base_port ||= 5000
59
+ offset = processes.keys.sort.index(process.name) * 100
60
+ base_port.to_i + offset + num - 1
61
+ end
62
+
74
63
  private ######################################################################
75
64
 
76
- def fork(process)
65
+ def fork(process, options={})
66
+ concurrency = Foreman::Utils.parse_concurrency(options[:concurrency])
67
+
68
+ 1.upto(concurrency[process.name]) do |num|
69
+ fork_individual(process, port_for(process, num, options[:port]))
70
+ end
71
+ end
72
+
73
+ def fork_individual(process, port)
74
+ ENV["PORT"] = port.to_s
75
+
77
76
  pid = Process.fork do
78
77
  run(process)
79
78
  end
@@ -127,8 +126,8 @@ private ######################################################################
127
126
  end
128
127
 
129
128
  def pad_process_name(process)
130
- name = process ? process.name : "system"
131
- name.ljust(longest_process_name)
129
+ name = process ? "#{process.name}:#{ENV["PORT"]}" : "system"
130
+ name.ljust(longest_process_name + 6) # add 6 for port padding
132
131
  end
133
132
 
134
133
  def print_info
@@ -27,12 +27,6 @@ private ######################################################################
27
27
  File.read(File.expand_path("../../../../export/#{name}", __FILE__))
28
28
  end
29
29
 
30
- def port_for(base_port, app, num)
31
- base_port ||= 5000
32
- offset = engine.processes.keys.sort.index(app) * 100
33
- base_port.to_i + offset + num - 1
34
- end
35
-
36
30
  def write_file(filename, contents)
37
31
  say "writing: #{filename}"
38
32
 
@@ -7,7 +7,7 @@ class Foreman::Export::Inittab < Foreman::Export::Base
7
7
  user = options[:user] || app
8
8
  log_root = options[:log] || "/var/log/#{app}"
9
9
 
10
- concurrency = parse_concurrency(options[:concurrency])
10
+ concurrency = Foreman::Utils.parse_concurrency(options[:concurrency])
11
11
 
12
12
  inittab = []
13
13
  inittab << "# ----- foreman #{app} processes -----"
@@ -15,7 +15,7 @@ class Foreman::Export::Inittab < Foreman::Export::Base
15
15
  engine.processes.values.inject(1) do |index, process|
16
16
  1.upto(concurrency[process.name]) do |num|
17
17
  id = app.slice(0, 2).upcase + sprintf("%02d", index)
18
- port = port_for(options[:port], process.name, num)
18
+ port = engine.port_for(process, num, options[:port])
19
19
  inittab << "#{id}:4:respawn:/bin/su - #{user} -c 'PORT=#{port} #{process.command} >> #{log_root}/#{process.name}-#{num}.log 2>&1'"
20
20
  index += 1
21
21
  end
@@ -17,7 +17,7 @@ class Foreman::Export::Upstart < Foreman::Export::Base
17
17
  FileUtils.rm(file)
18
18
  end
19
19
 
20
- concurrency = parse_concurrency(options[:concurrency])
20
+ concurrency = Foreman::Utils.parse_concurrency(options[:concurrency])
21
21
 
22
22
  master_template = export_template("upstart/master.conf.erb")
23
23
  master_config = ERB.new(master_template).result(binding)
@@ -31,7 +31,7 @@ class Foreman::Export::Upstart < Foreman::Export::Base
31
31
  write_file "#{location}/#{app}-#{process.name}.conf", process_master_config
32
32
 
33
33
  1.upto(concurrency[process.name]) do |num|
34
- port = port_for(options[:port], process.name, num)
34
+ port = engine.port_for(process, num, options[:port])
35
35
  process_config = ERB.new(process_template).result(binding)
36
36
  write_file "#{location}/#{app}-#{process.name}-#{num}.conf", process_config
37
37
  end
@@ -23,17 +23,26 @@ describe "Foreman::Engine" do
23
23
  describe "start" do
24
24
  it "forks the processes" do
25
25
  write_procfile
26
- mock(subject).fork(subject.processes["alpha"])
27
- mock(subject).fork(subject.processes["bravo"])
26
+ mock(subject).fork(subject.processes["alpha"], {})
27
+ mock(subject).fork(subject.processes["bravo"], {})
28
28
  mock(subject).watch_for_termination
29
29
  subject.start
30
30
  end
31
+
32
+ it "handles concurrency" do
33
+ write_procfile
34
+ mock(subject).fork_individual(subject.processes["alpha"], 5000)
35
+ mock(subject).fork_individual(subject.processes["alpha"], 5001)
36
+ mock(subject).fork_individual(subject.processes["bravo"], 5100)
37
+ mock(subject).watch_for_termination
38
+ subject.start(:concurrency => "alpha=2")
39
+ end
31
40
  end
32
41
 
33
42
  describe "execute" do
34
43
  it "runs the processes" do
35
44
  write_procfile
36
- mock(subject).fork(subject.processes["alpha"])
45
+ mock(subject).fork(subject.processes["alpha"], {})
37
46
  mock(subject).watch_for_termination
38
47
  subject.execute("alpha")
39
48
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman
3
3
  version: !ruby/object:Gem::Version
4
- hash: 3
4
+ hash: 1
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 7
9
- - 0
10
- version: 0.7.0
9
+ - 1
10
+ version: 0.7.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - David Dollar
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-19 00:00:00 -07:00
18
+ date: 2010-07-20 00:00:00 -07:00
19
19
  default_executable: foreman
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency