From ed4a32518fe323d6083803237628c1a709b2b3a4 Mon Sep 17 00:00:00 2001 From: Chris Lowder Date: Mon, 16 Jan 2012 11:56:55 +0000 Subject: [PATCH 1/7] Removing the hard coding of export formats allowing the user to 'plug-in' their own export format. --- lib/foreman/cli.rb | 16 ++++++++------ lib/foreman/helpers.rb | 50 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 lib/foreman/helpers.rb diff --git a/lib/foreman/cli.rb b/lib/foreman/cli.rb index 45f01aa..8241314 100644 --- a/lib/foreman/cli.rb +++ b/lib/foreman/cli.rb @@ -1,10 +1,14 @@ require "foreman" +require "foreman/helpers" require "foreman/engine" require "foreman/export" require "thor" require "yaml" class Foreman::CLI < Thor + include Foreman::Helpers + + class_option :procfile, :type => :string, :aliases => "-f", :desc => "Default: Procfile" desc "start", "Start the application" @@ -42,16 +46,14 @@ class Foreman::CLI < Thor def export(format, location=nil) check_procfile! - formatter = case format - when "inittab" then Foreman::Export::Inittab - when "upstart" then Foreman::Export::Upstart - when "bluepill" then Foreman::Export::Bluepill - when "runit" then Foreman::Export::Runit - else error "Unknown export format: #{format}." - end + classy_format = classify(format) + formatter = constantize("Foreman::Export::#{ classy_format }") formatter.new(engine).export(location, options) + rescue NameError => ex + error "Unknown export format: #{format}." + raise ex rescue Foreman::Export::Exception => ex error ex.message end diff --git a/lib/foreman/helpers.rb b/lib/foreman/helpers.rb new file mode 100644 index 0000000..4b5625d --- /dev/null +++ b/lib/foreman/helpers.rb @@ -0,0 +1,50 @@ +module Foreman::Helpers + # Copied whole sale from, https://github.com/defunkt/resque/ + + # Given a word with dashes, returns a camel cased version of it. + # + # classify('job-name') # => 'JobName' + def classify(dashed_word) + dashed_word.split('-').each { |part| part[0] = part[0].chr.upcase }.join + end + + # Tries to find a constant with the name specified in the argument string: + # + # constantize("Module") # => Module + # constantize("Test::Unit") # => Test::Unit + # + # The name is assumed to be the one of a top-level constant, no matter + # whether it starts with "::" or not. No lexical context is taken into + # account: + # + # C = 'outside' + # module M + # C = 'inside' + # C # => 'inside' + # constantize("C") # => 'outside', same as ::C + # end + # + # NameError is raised when the constant is unknown. + def constantize(camel_cased_word) + camel_cased_word = camel_cased_word.to_s + + if camel_cased_word.include?('-') + camel_cased_word = classify(camel_cased_word) + end + + names = camel_cased_word.split('::') + names.shift if names.empty? || names.first.empty? + + constant = Object + names.each do |name| + args = Module.method(:const_get).arity != 1 ? [false] : [] + + if constant.const_defined?(name, *args) + constant = constant.const_get(name) + else + constant = constant.const_missing(name) + end + end + constant + end +end \ No newline at end of file From bc1c5e4c74ecfdd0c9eb190bb7c7f5ab6b5c2e1c Mon Sep 17 00:00:00 2001 From: Chris Lowder Date: Mon, 16 Jan 2012 13:55:38 +0000 Subject: [PATCH 2/7] 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 From d54b46806ced796702da8b34e258c804f70a7f22 Mon Sep 17 00:00:00 2001 From: Chris Lowder Date: Mon, 16 Jan 2012 17:48:32 +0000 Subject: [PATCH 3/7] Catching more than we need to. --- lib/foreman/cli.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/foreman/cli.rb b/lib/foreman/cli.rb index 8fa0997..d94205b 100644 --- a/lib/foreman/cli.rb +++ b/lib/foreman/cli.rb @@ -46,14 +46,14 @@ class Foreman::CLI < Thor def export(format, location=nil) check_procfile! - classy_format = classify(format) - formatter = constantize("Foreman::Export::#{ classy_format }") + begin + classy_format = classify(format) + formatter = constantize("Foreman::Export::#{ classy_format }") + rescue NameError => ex + error "Unknown export format: #{format} (no class Foreman::Export::#{ classy_format })." + end formatter.new(engine, options).export(location) - - rescue NameError => ex - error "Unknown export format: #{format}." - raise ex rescue Foreman::Export::Exception => ex error ex.message end From 84c49ae2b882f62e8b1fe21e40655638f2fe6a3f Mon Sep 17 00:00:00 2001 From: Chris Lowder Date: Tue, 17 Jan 2012 14:59:57 +0000 Subject: [PATCH 4/7] Attempt to require the custom export class. --- lib/foreman/cli.rb | 3 +++ spec/foreman/cli_spec.rb | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/foreman/cli.rb b/lib/foreman/cli.rb index d94205b..81aa59a 100644 --- a/lib/foreman/cli.rb +++ b/lib/foreman/cli.rb @@ -47,10 +47,13 @@ class Foreman::CLI < Thor check_procfile! begin + require "foreman/export/#{ format.tr('-', '_') }" classy_format = classify(format) formatter = constantize("Foreman::Export::#{ classy_format }") rescue NameError => ex error "Unknown export format: #{format} (no class Foreman::Export::#{ classy_format })." + rescue LoadError => ex + error "Unknown export format: #{format} (unable to load file 'foreman/export/#{ format.tr('-', '_') }')." end formatter.new(engine, options).export(location) diff --git a/spec/foreman/cli_spec.rb b/spec/foreman/cli_spec.rb index ebe783c..2800437 100644 --- a/spec/foreman/cli_spec.rb +++ b/spec/foreman/cli_spec.rb @@ -51,7 +51,7 @@ describe "Foreman::CLI", :fakefs do describe "with an invalid formatter" do it "prints an error" do - mock_error(subject, "Unknown export format: invalidformatter.") do + mock_error(subject, "Unknown export format: invalidformatter (unable to load file 'foreman/export/invalidformatter').") do subject.export("invalidformatter") end end From 4080b3f1f263c304dad0e8621a8c719b90ab5afa Mon Sep 17 00:00:00 2001 From: Chris Lowder Date: Wed, 18 Jan 2012 17:04:57 +0000 Subject: [PATCH 5/7] Add ZenTest as a development dependency, there is an autotest folder but the gem is missing. --- Gemfile | 1 + Gemfile.lock | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Gemfile b/Gemfile index 28cb64a..e0c2716 100644 --- a/Gemfile +++ b/Gemfile @@ -18,6 +18,7 @@ group :development do gem 'rcov', '~> 0.9.8' gem 'rr', '~> 1.0.2' gem 'rspec', '~> 2.0' + gem 'ZenTest' gem 'aws-s3' gem "rubyzip" end diff --git a/Gemfile.lock b/Gemfile.lock index 00dd40c..a63ebb6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,6 +8,7 @@ PATH GEM remote: http://rubygems.org/ specs: + ZenTest (4.6.2) aws-s3 (0.6.2) builder mime-types @@ -56,6 +57,7 @@ PLATFORMS x86-mingw32 DEPENDENCIES + ZenTest aws-s3 fakefs (~> 0.3.2) foreman! From 1b701cddf3dd50e9eb07eeeb7ee1c52a01e6486e Mon Sep 17 00:00:00 2001 From: Chris Lowder Date: Wed, 18 Jan 2012 17:06:09 +0000 Subject: [PATCH 6/7] Simplify subclassing by adding all arguments to the initializer. Also, clean up the method signatures for existing exporters. --- lib/foreman/cli.rb | 2 +- lib/foreman/export/base.rb | 6 ++++-- lib/foreman/export/bluepill.rb | 2 +- lib/foreman/export/inittab.rb | 2 +- lib/foreman/export/runit.rb | 2 +- lib/foreman/export/upstart.rb | 2 +- spec/foreman/cli_spec.rb | 8 +++---- spec/foreman/export/bluepill_spec.rb | 17 +++++++++------ spec/foreman/export/runit_spec.rb | 6 +++--- spec/foreman/export/upstart_spec.rb | 31 ++++++++++++++++------------ 10 files changed, 45 insertions(+), 33 deletions(-) diff --git a/lib/foreman/cli.rb b/lib/foreman/cli.rb index 81aa59a..7dc1f3c 100644 --- a/lib/foreman/cli.rb +++ b/lib/foreman/cli.rb @@ -56,7 +56,7 @@ class Foreman::CLI < Thor error "Unknown export format: #{format} (unable to load file 'foreman/export/#{ format.tr('-', '_') }')." end - formatter.new(engine, options).export(location) + formatter.new(location, engine, options).export rescue Foreman::Export::Exception => ex error ex.message end diff --git a/lib/foreman/export/base.rb b/lib/foreman/export/base.rb index 90ff462..03477bb 100644 --- a/lib/foreman/export/base.rb +++ b/lib/foreman/export/base.rb @@ -3,10 +3,12 @@ require "foreman/utils" class Foreman::Export::Base - attr_reader :engine, :app, :log, :port, :user, :template, :concurrency + attr_reader :location, :engine, :options, :app, :log, :port, :user, :template, :concurrency - def initialize(engine, options={}) + def initialize(location, engine, options={}) + @location = location @engine = engine + @options = options @app = options[:app] @log = options[:log] @port = options[:port] diff --git a/lib/foreman/export/bluepill.rb b/lib/foreman/export/bluepill.rb index 7516ae3..b72da2e 100644 --- a/lib/foreman/export/bluepill.rb +++ b/lib/foreman/export/bluepill.rb @@ -3,7 +3,7 @@ require "foreman/export" class Foreman::Export::Bluepill < Foreman::Export::Base - def export(location, options={}) + def export error("Must specify a location") unless location FileUtils.mkdir_p location diff --git a/lib/foreman/export/inittab.rb b/lib/foreman/export/inittab.rb index fe3ac6d..de04e30 100644 --- a/lib/foreman/export/inittab.rb +++ b/lib/foreman/export/inittab.rb @@ -2,7 +2,7 @@ require "foreman/export" class Foreman::Export::Inittab < Foreman::Export::Base - def export(fname=nil, options={}) + def export app = self.app || File.basename(engine.directory) user = self.user || app log_root = self.log || "/var/log/#{app}" diff --git a/lib/foreman/export/runit.rb b/lib/foreman/export/runit.rb index ab1b953..b71b279 100644 --- a/lib/foreman/export/runit.rb +++ b/lib/foreman/export/runit.rb @@ -4,7 +4,7 @@ require "foreman/export" class Foreman::Export::Runit < Foreman::Export::Base ENV_VARIABLE_REGEX = /([a-zA-Z_]+[a-zA-Z0-9_]*)=(\S+)/ - def export(location, options={}) + def export error("Must specify a location") unless location app = self.app || File.basename(engine.directory) diff --git a/lib/foreman/export/upstart.rb b/lib/foreman/export/upstart.rb index e7df702..e3ba2d4 100644 --- a/lib/foreman/export/upstart.rb +++ b/lib/foreman/export/upstart.rb @@ -3,7 +3,7 @@ require "foreman/export" class Foreman::Export::Upstart < Foreman::Export::Base - def export(location, options={}) + def export error("Must specify a location") unless location FileUtils.mkdir_p location diff --git a/spec/foreman/cli_spec.rb b/spec/foreman/cli_spec.rb index 2800437..430fa84 100644 --- a/spec/foreman/cli_spec.rb +++ b/spec/foreman/cli_spec.rb @@ -31,8 +31,8 @@ describe "Foreman::CLI", :fakefs do write_procfile write_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") + mock(Foreman::Export::Upstart).new("/upstart", is_a(Foreman::Engine), { "env" => "envfile" }) { mock_export } + mock_export.export foreman %{ export upstart /upstart --env envfile } end end @@ -63,8 +63,8 @@ describe "Foreman::CLI", :fakefs do it "runs successfully" do dont_allow(subject).error mock_export = mock(Foreman::Export::Upstart) - mock(Foreman::Export::Upstart).new(is_a(Foreman::Engine), {}) { mock_export } - mock_export.export("/tmp/foo") + mock(Foreman::Export::Upstart).new("/tmp/foo", is_a(Foreman::Engine), {}) { mock_export } + mock_export.export subject.export("upstart", "/tmp/foo") end end diff --git a/spec/foreman/export/bluepill_spec.rb b/spec/foreman/export/bluepill_spec.rb index 6125851..7ced939 100644 --- a/spec/foreman/export/bluepill_spec.rb +++ b/spec/foreman/export/bluepill_spec.rb @@ -5,20 +5,25 @@ 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, :concurrency => "alpha=2") } + let(:engine) { Foreman::Engine.new(procfile) } + let(:options) { Hash.new } + let(:bluepill) { Foreman::Export::Bluepill.new("/tmp/init", engine, options) } before(:each) { load_export_templates_into_fakefs("bluepill") } before(:each) { stub(bluepill).say } it "exports to the filesystem" do - bluepill.export("/tmp/init") + bluepill.export normalize_space(File.read("/tmp/init/app.pill")).should == normalize_space(example_export_file("bluepill/app.pill")) end - it "exports to the filesystem with concurrency" do - bluepill.export("/tmp/init", :concurrency => "alpha=2") + context "with concurrency" do + let(:options) { Hash[:concurrency => "alpha=2"] } - normalize_space(File.read("/tmp/init/app.pill")).should == normalize_space(example_export_file("bluepill/app-concurrency.pill")) + it "exports to the filesystem with concurrency" do + bluepill.export + normalize_space(File.read("/tmp/init/app.pill")).should == normalize_space(example_export_file("bluepill/app-concurrency.pill")) + end end + end diff --git a/spec/foreman/export/runit_spec.rb b/spec/foreman/export/runit_spec.rb index 0399ccd..6d04ae6 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, :concurrency => 'alpha=2') } + let(:runit) { Foreman::Export::Runit.new('/tmp/init', engine, :concurrency => 'alpha=2,bravo=1') } before(:each) { load_export_templates_into_fakefs("runit") } before(:each) { stub(runit).say } @@ -15,7 +15,7 @@ describe Foreman::Export::Runit, :fakefs do it "exports to the filesystem" do FileUtils.mkdir_p('/tmp/init') - runit.export('/tmp/init') + runit.export 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 == @@ -36,6 +36,6 @@ describe Foreman::Export::Runit, :fakefs do end it "creates a full path to the export directory" do - expect { runit.export('/tmp/init', :concurrency => "alpha=2,bravo=1") }.to_not raise_error(Errno::ENOENT) + expect { runit.export }.to_not raise_error(Errno::ENOENT) end end diff --git a/spec/foreman/export/upstart_spec.rb b/spec/foreman/export/upstart_spec.rb index b656ba2..fb7b5d4 100644 --- a/spec/foreman/export/upstart_spec.rb +++ b/spec/foreman/export/upstart_spec.rb @@ -5,14 +5,15 @@ 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, :concurrency => "alpha=2") } + let(:engine) { Foreman::Engine.new(procfile) } + let(:options) { Hash.new } + let(:upstart) { Foreman::Export::Upstart.new("/tmp/init", engine, options) } before(:each) { load_export_templates_into_fakefs("upstart") } before(:each) { stub(upstart).say } it "exports to the filesystem" do - upstart.export("/tmp/init") + upstart.export File.read("/tmp/init/app.conf").should == example_export_file("upstart/app.conf") File.read("/tmp/init/app-alpha.conf").should == example_export_file("upstart/app-alpha.conf") @@ -21,19 +22,23 @@ describe Foreman::Export::Upstart, :fakefs do File.read("/tmp/init/app-bravo-1.conf").should == example_export_file("upstart/app-bravo-1.conf") end - it "exports to the filesystem with concurrency" do - upstart.export("/tmp/init", :concurrency => "alpha=2") + context "with concurrency" do + let(:options) { Hash[:concurrency => "alpha=2"] } - File.read("/tmp/init/app.conf").should == example_export_file("upstart/app.conf") - File.read("/tmp/init/app-alpha.conf").should == example_export_file("upstart/app-alpha.conf") - File.read("/tmp/init/app-alpha-1.conf").should == example_export_file("upstart/app-alpha-1.conf") - File.read("/tmp/init/app-alpha-2.conf").should == example_export_file("upstart/app-alpha-2.conf") - File.exists?("/tmp/init/app-bravo-1.conf").should == false + it "exports to the filesystem with concurrency" do + upstart.export + + File.read("/tmp/init/app.conf").should == example_export_file("upstart/app.conf") + File.read("/tmp/init/app-alpha.conf").should == example_export_file("upstart/app-alpha.conf") + File.read("/tmp/init/app-alpha-1.conf").should == example_export_file("upstart/app-alpha-1.conf") + File.read("/tmp/init/app-alpha-2.conf").should == example_export_file("upstart/app-alpha-2.conf") + File.exists?("/tmp/init/app-bravo-1.conf").should == false + end end context "with alternate templates" do let(:template_root) { "/tmp/alternate" } - let(:upstart) { Foreman::Export::Upstart.new(engine, :template => template_root) } + let(:upstart) { Foreman::Export::Upstart.new("/tmp/init", engine, :template => template_root) } before do FileUtils.mkdir_p template_root @@ -41,7 +46,7 @@ describe Foreman::Export::Upstart, :fakefs do end it "can export with alternate template files" do - upstart.export("/tmp/init") + upstart.export File.read("/tmp/init/app.conf").should == "alternate_template\n" end @@ -62,7 +67,7 @@ describe Foreman::Export::Upstart, :fakefs do end it "can export with alternate template files" do - upstart.export("/tmp/init") + upstart.export File.read("/tmp/init/app.conf").should == "default_alternate_template\n" end From a0a2dd945486cd11525060da3f0a69943e5d53e9 Mon Sep 17 00:00:00 2001 From: Chris Lowder Date: Wed, 18 Jan 2012 17:17:30 +0000 Subject: [PATCH 7/7] Don't expose the options hash. --- data/export/bluepill/master.pill.erb | 2 +- lib/foreman/export/base.rb | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/data/export/bluepill/master.pill.erb b/data/export/bluepill/master.pill.erb index 2b56d9d..69da4d7 100644 --- a/data/export/bluepill/master.pill.erb +++ b/data/export/bluepill/master.pill.erb @@ -5,7 +5,7 @@ Bluepill.application("<%= app %>", :foreground => false, :log_file => "/var/log/ <% engine.procfile.entries.each do |process| %> <% 1.upto(concurrency[process.name]) do |num| %> -<% port = engine.port_for(process, num, options[:port]) %> +<% port = engine.port_for(process, num, self.port) %> app.process("<%= process.name %>-<%=num%>") do |process| process.start_command = "<%= process.command.gsub("$PORT", port.to_s) %>" diff --git a/lib/foreman/export/base.rb b/lib/foreman/export/base.rb index 03477bb..c17f9d9 100644 --- a/lib/foreman/export/base.rb +++ b/lib/foreman/export/base.rb @@ -3,12 +3,11 @@ require "foreman/utils" class Foreman::Export::Base - attr_reader :location, :engine, :options, :app, :log, :port, :user, :template, :concurrency + attr_reader :location, :engine, :app, :log, :port, :user, :template, :concurrency def initialize(location, engine, options={}) @location = location @engine = engine - @options = options @app = options[:app] @log = options[:log] @port = options[:port]