From bc1c5e4c74ecfdd0c9eb190bb7c7f5ab6b5c2e1c Mon Sep 17 00:00:00 2001 From: Chris Lowder Date: Mon, 16 Jan 2012 13:55:38 +0000 Subject: [PATCH] Extract commonality into the base class, make life easy for our plugin writers. --- lib/foreman/cli.rb | 2 +- lib/foreman/export/base.rb | 12 +++++++++--- lib/foreman/export/bluepill.rb | 10 ++++------ lib/foreman/export/inittab.rb | 12 +++++------- lib/foreman/export/runit.rb | 14 ++++++-------- lib/foreman/export/upstart.rb | 16 +++++++--------- spec/foreman/cli_spec.rb | 8 ++++++-- spec/foreman/export/bluepill_spec.rb | 2 +- spec/foreman/export/runit_spec.rb | 5 +++-- spec/foreman/export/upstart_spec.rb | 5 +++-- 10 files changed, 45 insertions(+), 41 deletions(-) diff --git a/lib/foreman/cli.rb b/lib/foreman/cli.rb index 8241314..8fa0997 100644 --- a/lib/foreman/cli.rb +++ b/lib/foreman/cli.rb @@ -49,7 +49,7 @@ class Foreman::CLI < Thor classy_format = classify(format) formatter = constantize("Foreman::Export::#{ classy_format }") - formatter.new(engine).export(location, options) + formatter.new(engine, options).export(location) rescue NameError => ex error "Unknown export format: #{format}." diff --git a/lib/foreman/export/base.rb b/lib/foreman/export/base.rb index 7bebd43..90ff462 100644 --- a/lib/foreman/export/base.rb +++ b/lib/foreman/export/base.rb @@ -3,10 +3,16 @@ require "foreman/utils" class Foreman::Export::Base - attr_reader :engine + attr_reader :engine, :app, :log, :port, :user, :template, :concurrency - def initialize(engine) - @engine = engine + def initialize(engine, options={}) + @engine = engine + @app = options[:app] + @log = options[:log] + @port = options[:port] + @user = options[:user] + @template = options[:template] + @concurrency = Foreman::Utils.parse_concurrency(options[:concurrency]) end def export diff --git a/lib/foreman/export/bluepill.rb b/lib/foreman/export/bluepill.rb index fae8a8b..7516ae3 100644 --- a/lib/foreman/export/bluepill.rb +++ b/lib/foreman/export/bluepill.rb @@ -8,18 +8,16 @@ class Foreman::Export::Bluepill < Foreman::Export::Base FileUtils.mkdir_p location - app = options[:app] || File.basename(engine.directory) - user = options[:user] || app - log_root = options[:log] || "/var/log/#{app}" - template_root = options[:template] + app = self.app || File.basename(engine.directory) + user = self.user || app + log_root = self.log || "/var/log/#{app}" + template_root = self.template Dir["#{location}/#{app}.pill"].each do |file| say "cleaning up: #{file}" FileUtils.rm(file) end - concurrency = Foreman::Utils.parse_concurrency(options[:concurrency]) - master_template = export_template("bluepill", "master.pill.erb", template_root) master_config = ERB.new(master_template).result(binding) write_file "#{location}/#{app}.pill", master_config diff --git a/lib/foreman/export/inittab.rb b/lib/foreman/export/inittab.rb index e8fb7a8..fe3ac6d 100644 --- a/lib/foreman/export/inittab.rb +++ b/lib/foreman/export/inittab.rb @@ -3,19 +3,17 @@ require "foreman/export" class Foreman::Export::Inittab < Foreman::Export::Base def export(fname=nil, options={}) - app = options[:app] || File.basename(engine.directory) - user = options[:user] || app - log_root = options[:log] || "/var/log/#{app}" - - concurrency = Foreman::Utils.parse_concurrency(options[:concurrency]) + app = self.app || File.basename(engine.directory) + user = self.user || app + log_root = self.log || "/var/log/#{app}" inittab = [] inittab << "# ----- foreman #{app} processes -----" engine.procfile.entries.inject(1) do |index, process| - 1.upto(concurrency[process.name]) do |num| + 1.upto(self.concurrency[process.name]) do |num| id = app.slice(0, 2).upcase + sprintf("%02d", index) - port = engine.port_for(process, num, options[:port]) + port = engine.port_for(process, num, self.port) inittab << "#{id}:4:respawn:/bin/su - #{user} -c 'PORT=#{port} #{process.command} >> #{log_root}/#{process.name}-#{num}.log 2>&1'" index += 1 end diff --git a/lib/foreman/export/runit.rb b/lib/foreman/export/runit.rb index b3c74cb..ab1b953 100644 --- a/lib/foreman/export/runit.rb +++ b/lib/foreman/export/runit.rb @@ -7,18 +7,16 @@ class Foreman::Export::Runit < Foreman::Export::Base def export(location, options={}) error("Must specify a location") unless location - app = options[:app] || File.basename(engine.directory) - user = options[:user] || app - log_root = options[:log] || "/var/log/#{app}" - template_root = options[:template] - - concurrency = Foreman::Utils.parse_concurrency(options[:concurrency]) + app = self.app || File.basename(engine.directory) + user = self.user || app + log_root = self.log || "/var/log/#{app}" + template_root = self.template run_template = export_template('runit', 'run.erb', template_root) log_run_template = export_template('runit', 'log_run.erb', template_root) engine.procfile.entries.each do |process| - 1.upto(concurrency[process.name]) do |num| + 1.upto(self.concurrency[process.name]) do |num| process_directory = "#{location}/#{app}-#{process.name}-#{num}" process_env_directory = "#{process_directory}/env" process_log_directory = "#{process_directory}/log" @@ -31,7 +29,7 @@ class Foreman::Export::Runit < Foreman::Export::Base write_file "#{process_directory}/run", run FileUtils.chmod 0755, "#{process_directory}/run" - port = engine.port_for(process, num, options[:port]) + port = engine.port_for(process, num, self.port) environment_variables = {'PORT' => port}. merge(engine.environment). merge(inline_variables(process.command)) diff --git a/lib/foreman/export/upstart.rb b/lib/foreman/export/upstart.rb index 9ae9717..e7df702 100644 --- a/lib/foreman/export/upstart.rb +++ b/lib/foreman/export/upstart.rb @@ -8,18 +8,16 @@ class Foreman::Export::Upstart < Foreman::Export::Base FileUtils.mkdir_p location - app = options[:app] || File.basename(engine.directory) - user = options[:user] || app - log_root = options[:log] || "/var/log/#{app}" - template_root = options[:template] + app = self.app || File.basename(engine.directory) + user = self.user || app + log_root = self.log || "/var/log/#{app}" + template_root = self.template Dir["#{location}/#{app}*.conf"].each do |file| say "cleaning up: #{file}" FileUtils.rm(file) end - concurrency = Foreman::Utils.parse_concurrency(options[:concurrency]) - master_template = export_template("upstart", "master.conf.erb", template_root) master_config = ERB.new(master_template).result(binding) write_file "#{location}/#{app}.conf", master_config @@ -27,13 +25,13 @@ class Foreman::Export::Upstart < Foreman::Export::Base process_template = export_template("upstart", "process.conf.erb", template_root) engine.procfile.entries.each do |process| - next if (conc = concurrency[process.name]) < 1 + next if (conc = self.concurrency[process.name]) < 1 process_master_template = export_template("upstart", "process_master.conf.erb", template_root) process_master_config = ERB.new(process_master_template).result(binding) write_file "#{location}/#{app}-#{process.name}.conf", process_master_config - 1.upto(concurrency[process.name]) do |num| - port = engine.port_for(process, num, options[:port]) + 1.upto(self.concurrency[process.name]) do |num| + port = engine.port_for(process, num, self.port) process_config = ERB.new(process_template).result(binding) write_file "#{location}/#{app}-#{process.name}-#{num}.conf", process_config end diff --git a/spec/foreman/cli_spec.rb b/spec/foreman/cli_spec.rb index 4170af9..ebe783c 100644 --- a/spec/foreman/cli_spec.rb +++ b/spec/foreman/cli_spec.rb @@ -30,7 +30,9 @@ describe "Foreman::CLI", :fakefs do it "respects --env" do write_procfile write_env("envfile") - mock.instance_of(Foreman::Export::Upstart).export("/upstart", { "env" => "envfile" }) + mock_export = mock(Foreman::Export::Upstart) + mock(Foreman::Export::Upstart).new(is_a(Foreman::Engine), { "env" => "envfile" }) { mock_export } + mock_export.export("/upstart") foreman %{ export upstart /upstart --env envfile } end end @@ -60,7 +62,9 @@ describe "Foreman::CLI", :fakefs do it "runs successfully" do dont_allow(subject).error - mock.instance_of(Foreman::Export::Upstart).export("/tmp/foo", {}) + mock_export = mock(Foreman::Export::Upstart) + mock(Foreman::Export::Upstart).new(is_a(Foreman::Engine), {}) { mock_export } + mock_export.export("/tmp/foo") subject.export("upstart", "/tmp/foo") end end diff --git a/spec/foreman/export/bluepill_spec.rb b/spec/foreman/export/bluepill_spec.rb index 5d2eefa..6125851 100644 --- a/spec/foreman/export/bluepill_spec.rb +++ b/spec/foreman/export/bluepill_spec.rb @@ -6,7 +6,7 @@ require "tmpdir" describe Foreman::Export::Bluepill, :fakefs do let(:procfile) { FileUtils.mkdir_p("/tmp/app"); write_procfile("/tmp/app/Procfile") } let(:engine) { Foreman::Engine.new(procfile) } - let(:bluepill) { Foreman::Export::Bluepill.new(engine) } + let(:bluepill) { Foreman::Export::Bluepill.new(engine, :concurrency => "alpha=2") } before(:each) { load_export_templates_into_fakefs("bluepill") } before(:each) { stub(bluepill).say } diff --git a/spec/foreman/export/runit_spec.rb b/spec/foreman/export/runit_spec.rb index 002a51e..0399ccd 100644 --- a/spec/foreman/export/runit_spec.rb +++ b/spec/foreman/export/runit_spec.rb @@ -6,7 +6,7 @@ require "tmpdir" describe Foreman::Export::Runit, :fakefs do let(:procfile) { FileUtils.mkdir_p("/tmp/app"); write_procfile("/tmp/app/Procfile", 'bar=baz') } let(:engine) { Foreman::Engine.new(procfile) } - let(:runit) { Foreman::Export::Runit.new(engine) } + let(:runit) { Foreman::Export::Runit.new(engine, :concurrency => 'alpha=2') } before(:each) { load_export_templates_into_fakefs("runit") } before(:each) { stub(runit).say } @@ -14,7 +14,8 @@ describe Foreman::Export::Runit, :fakefs do it "exports to the filesystem" do FileUtils.mkdir_p('/tmp/init') - runit.export('/tmp/init', :concurrency => "alpha=2,bravo=1") + + runit.export('/tmp/init') File.read("/tmp/init/app-alpha-1/run").should == example_export_file('runit/app-alpha-1-run') File.read("/tmp/init/app-alpha-1/log/run").should == diff --git a/spec/foreman/export/upstart_spec.rb b/spec/foreman/export/upstart_spec.rb index 39881ca..b656ba2 100644 --- a/spec/foreman/export/upstart_spec.rb +++ b/spec/foreman/export/upstart_spec.rb @@ -6,7 +6,7 @@ require "tmpdir" describe Foreman::Export::Upstart, :fakefs do let(:procfile) { FileUtils.mkdir_p("/tmp/app"); write_procfile("/tmp/app/Procfile") } let(:engine) { Foreman::Engine.new(procfile) } - let(:upstart) { Foreman::Export::Upstart.new(engine) } + let(:upstart) { Foreman::Export::Upstart.new(engine, :concurrency => "alpha=2") } before(:each) { load_export_templates_into_fakefs("upstart") } before(:each) { stub(upstart).say } @@ -33,6 +33,7 @@ describe Foreman::Export::Upstart, :fakefs do context "with alternate templates" do let(:template_root) { "/tmp/alternate" } + let(:upstart) { Foreman::Export::Upstart.new(engine, :template => template_root) } before do FileUtils.mkdir_p template_root @@ -40,7 +41,7 @@ describe Foreman::Export::Upstart, :fakefs do end it "can export with alternate template files" do - upstart.export("/tmp/init", :template => template_root) + upstart.export("/tmp/init") File.read("/tmp/init/app.conf").should == "alternate_template\n" end