diff --git a/data/export/circus/app.ini.erb b/data/export/circus/app.ini.erb new file mode 100644 index 0000000..c8089bf --- /dev/null +++ b/data/export/circus/app.ini.erb @@ -0,0 +1,25 @@ +[circus] +check_delay = 5 +endpoint = tcp://127.0.0.1:5555 +<% +engine.each_process do |name, process| + 1.upto(engine.formation[name]) do |num| + port = engine.port_for(process, num) + full_name = "#{app}-#{name}-#{num}" +%> +[watcher:<%= full_name %>] +cmd = <%= process.command %> +working_dir = <%= engine.root %> +uid = <%= user %> +stdout_stream.class = FileStream +stdout_stream.filename = <%= log %>/<%= name %>-<%= num %>.log +stderr_stream.class = FileStream +stderr_stream.filename = <%= log %>/<%= name %>-<%= num %>.error.log +copy_env = True + +[env:<%= full_name %>] +PORT = <%= port %> +<% + end +end +%> diff --git a/lib/foreman/export/circus.rb b/lib/foreman/export/circus.rb new file mode 100644 index 0000000..fb52dc6 --- /dev/null +++ b/lib/foreman/export/circus.rb @@ -0,0 +1,16 @@ +require "erb" +require "foreman/export" + +class Foreman::Export::Circus < Foreman::Export::Base + + def export + super + + Dir["#{location}/#{app}*.ini"].each do |file| + clean file + end + + write_template "circus/app.ini.erb", "#{app}.ini", binding + end + +end diff --git a/spec/foreman/export/circus_spec.rb b/spec/foreman/export/circus_spec.rb new file mode 100644 index 0000000..a2f8155 --- /dev/null +++ b/spec/foreman/export/circus_spec.rb @@ -0,0 +1,36 @@ +require "spec_helper" +require "foreman/engine" +require "foreman/export/circus" +require "tmpdir" + +describe Foreman::Export::Circus, :fakefs do + let(:procfile) { FileUtils.mkdir_p("/tmp/app"); write_procfile("/tmp/app/Procfile") } + let(:formation) { nil } + let(:engine) { Foreman::Engine.new(:formation => formation).load_procfile(procfile) } + let(:options) { Hash.new } + let(:circus) { Foreman::Export::Circus.new("/tmp/init", engine, options) } + + before(:each) { load_export_templates_into_fakefs("circus") } + before(:each) { stub(circus).say } + + it "exports to the filesystem" do + circus.export + File.read("/tmp/init/app.ini").should == example_export_file("circus/app-alpha-1.ini") + end + + it "cleans up if exporting into an existing dir" do + mock(FileUtils).rm("/tmp/init/app.ini") + circus.export + circus.export + end + + context "with concurrency" do + let(:formation) { "alpha=2" } + + it "exports to the filesystem with concurrency" do + circus.export + File.read("/tmp/init/app.ini").should == example_export_file("circus/app-alpha-2.ini") + end + end + +end diff --git a/spec/resources/export/circus/app-alpha-1.ini b/spec/resources/export/circus/app-alpha-1.ini new file mode 100644 index 0000000..e7776bf --- /dev/null +++ b/spec/resources/export/circus/app-alpha-1.ini @@ -0,0 +1,30 @@ +[circus] +check_delay = 5 +endpoint = tcp://127.0.0.1:5555 + +[watcher:app-alpha-1] +cmd = ./alpha +working_dir = /tmp/app +uid = app +stdout_stream.class = FileStream +stdout_stream.filename = /var/log/app/alpha-1.log +stderr_stream.class = FileStream +stderr_stream.filename = /var/log/app/alpha-1.error.log +copy_env = True + +[env:app-alpha-1] +PORT = 5000 + +[watcher:app-bravo-1] +cmd = ./bravo +working_dir = /tmp/app +uid = app +stdout_stream.class = FileStream +stdout_stream.filename = /var/log/app/bravo-1.log +stderr_stream.class = FileStream +stderr_stream.filename = /var/log/app/bravo-1.error.log +copy_env = True + +[env:app-bravo-1] +PORT = 5100 + diff --git a/spec/resources/export/circus/app-alpha-2.ini b/spec/resources/export/circus/app-alpha-2.ini new file mode 100644 index 0000000..fe03580 --- /dev/null +++ b/spec/resources/export/circus/app-alpha-2.ini @@ -0,0 +1,30 @@ +[circus] +check_delay = 5 +endpoint = tcp://127.0.0.1:5555 + +[watcher:app-alpha-1] +cmd = ./alpha +working_dir = /tmp/app +uid = app +stdout_stream.class = FileStream +stdout_stream.filename = /var/log/app/alpha-1.log +stderr_stream.class = FileStream +stderr_stream.filename = /var/log/app/alpha-1.error.log +copy_env = True + +[env:app-alpha-1] +PORT = 5000 + +[watcher:app-alpha-2] +cmd = ./alpha +working_dir = /tmp/app +uid = app +stdout_stream.class = FileStream +stdout_stream.filename = /var/log/app/alpha-2.log +stderr_stream.class = FileStream +stderr_stream.filename = /var/log/app/alpha-2.error.log +copy_env = True + +[env:app-alpha-2] +PORT = 5001 +