foreman-systemd 0.78.0
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.
- checksums.yaml +7 -0
- data/README.md +64 -0
- data/bin/foreman +7 -0
- data/bin/foreman-runner +41 -0
- data/data/example/Procfile +4 -0
- data/data/example/Procfile.without_colon +2 -0
- data/data/example/error +7 -0
- data/data/example/log/neverdie.log +4 -0
- data/data/example/spawnee +14 -0
- data/data/example/spawner +7 -0
- data/data/example/ticker +14 -0
- data/data/example/utf8 +11 -0
- data/data/export/bluepill/master.pill.erb +28 -0
- data/data/export/daemon/master.conf.erb +14 -0
- data/data/export/daemon/process.conf.erb +8 -0
- data/data/export/daemon/process_master.conf.erb +2 -0
- data/data/export/launchd/launchd.plist.erb +33 -0
- data/data/export/runit/log/run.erb +7 -0
- data/data/export/runit/run.erb +4 -0
- data/data/export/supervisord/app.conf.erb +28 -0
- data/data/export/systemd/master.target.erb +6 -0
- data/data/export/systemd/process.service.erb +16 -0
- data/data/export/systemd/process_master.target.erb +4 -0
- data/data/export/upstart/master.conf.erb +2 -0
- data/data/export/upstart/process.conf.erb +14 -0
- data/data/export/upstart/process_master.conf.erb +2 -0
- data/lib/foreman.rb +17 -0
- data/lib/foreman/cli.rb +161 -0
- data/lib/foreman/distribution.rb +9 -0
- data/lib/foreman/engine.rb +441 -0
- data/lib/foreman/engine/cli.rb +104 -0
- data/lib/foreman/env.rb +29 -0
- data/lib/foreman/export.rb +36 -0
- data/lib/foreman/export/base.rb +156 -0
- data/lib/foreman/export/bluepill.rb +12 -0
- data/lib/foreman/export/daemon.rb +28 -0
- data/lib/foreman/export/inittab.rb +42 -0
- data/lib/foreman/export/launchd.rb +22 -0
- data/lib/foreman/export/runit.rb +34 -0
- data/lib/foreman/export/supervisord.rb +16 -0
- data/lib/foreman/export/systemd.rb +32 -0
- data/lib/foreman/export/upstart.rb +43 -0
- data/lib/foreman/helpers.rb +45 -0
- data/lib/foreman/process.rb +80 -0
- data/lib/foreman/procfile.rb +92 -0
- data/lib/foreman/version.rb +5 -0
- data/man/foreman.1 +278 -0
- data/spec/foreman/cli_spec.rb +107 -0
- data/spec/foreman/engine_spec.rb +112 -0
- data/spec/foreman/export/base_spec.rb +19 -0
- data/spec/foreman/export/bluepill_spec.rb +37 -0
- data/spec/foreman/export/daemon_spec.rb +97 -0
- data/spec/foreman/export/inittab_spec.rb +40 -0
- data/spec/foreman/export/launchd_spec.rb +31 -0
- data/spec/foreman/export/runit_spec.rb +36 -0
- data/spec/foreman/export/supervisord_spec.rb +36 -0
- data/spec/foreman/export/systemd_spec.rb +91 -0
- data/spec/foreman/export/upstart_spec.rb +118 -0
- data/spec/foreman/export_spec.rb +24 -0
- data/spec/foreman/helpers_spec.rb +26 -0
- data/spec/foreman/process_spec.rb +71 -0
- data/spec/foreman/procfile_spec.rb +43 -0
- data/spec/foreman_spec.rb +16 -0
- data/spec/helper_spec.rb +19 -0
- data/spec/resources/Procfile +5 -0
- data/spec/resources/bin/echo +2 -0
- data/spec/resources/bin/env +2 -0
- data/spec/resources/bin/test +2 -0
- data/spec/resources/bin/utf8 +2 -0
- data/spec/resources/export/bluepill/app-concurrency.pill +49 -0
- data/spec/resources/export/bluepill/app.pill +81 -0
- data/spec/resources/export/daemon/app-alpha-1.conf +7 -0
- data/spec/resources/export/daemon/app-alpha-2.conf +7 -0
- data/spec/resources/export/daemon/app-alpha.conf +2 -0
- data/spec/resources/export/daemon/app-bravo-1.conf +7 -0
- data/spec/resources/export/daemon/app-bravo.conf +2 -0
- data/spec/resources/export/daemon/app.conf +14 -0
- data/spec/resources/export/inittab/inittab.concurrency +4 -0
- data/spec/resources/export/inittab/inittab.default +6 -0
- data/spec/resources/export/launchd/launchd-a.default +29 -0
- data/spec/resources/export/launchd/launchd-b.default +29 -0
- data/spec/resources/export/launchd/launchd-c.default +30 -0
- data/spec/resources/export/runit/app-alpha-1/log/run +7 -0
- data/spec/resources/export/runit/app-alpha-1/run +4 -0
- data/spec/resources/export/runit/app-alpha-2/log/run +7 -0
- data/spec/resources/export/runit/app-alpha-2/run +4 -0
- data/spec/resources/export/runit/app-bravo-1/log/run +7 -0
- data/spec/resources/export/runit/app-bravo-1/run +4 -0
- data/spec/resources/export/supervisord/app-alpha-1.conf +46 -0
- data/spec/resources/export/supervisord/app-alpha-2.conf +24 -0
- data/spec/resources/export/systemd/concurrency/app-alpha-1.service +14 -0
- data/spec/resources/export/systemd/concurrency/app-alpha-2.service +14 -0
- data/spec/resources/export/systemd/concurrency/app-alpha.target +3 -0
- data/spec/resources/export/systemd/concurrency/app.target +6 -0
- data/spec/resources/export/systemd/standard/app-alpha-1.service +14 -0
- data/spec/resources/export/systemd/standard/app-alpha.target +3 -0
- data/spec/resources/export/systemd/standard/app-bravo-1.service +14 -0
- data/spec/resources/export/systemd/standard/app-bravo.target +3 -0
- data/spec/resources/export/systemd/standard/app.target +6 -0
- data/spec/resources/export/upstart/app-alpha-1.conf +11 -0
- data/spec/resources/export/upstart/app-alpha-2.conf +11 -0
- data/spec/resources/export/upstart/app-alpha.conf +2 -0
- data/spec/resources/export/upstart/app-bravo-1.conf +11 -0
- data/spec/resources/export/upstart/app-bravo.conf +2 -0
- data/spec/resources/export/upstart/app.conf +2 -0
- data/spec/spec_helper.rb +166 -0
- metadata +164 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
require "foreman/cli"
|
|
3
|
+
|
|
4
|
+
describe "Foreman::CLI", :fakefs do
|
|
5
|
+
subject { Foreman::CLI.new }
|
|
6
|
+
|
|
7
|
+
describe ".foreman" do
|
|
8
|
+
before { File.open(".foreman", "w") { |f| f.puts "formation: alpha=2" } }
|
|
9
|
+
|
|
10
|
+
it "provides default options" do
|
|
11
|
+
expect(subject.send(:options)["formation"]).to eq("alpha=2")
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "is overridden by options at the cli" do
|
|
15
|
+
subject = Foreman::CLI.new([], :formation => "alpha=3")
|
|
16
|
+
expect(subject.send(:options)["formation"]).to eq("alpha=3")
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe "start" do
|
|
21
|
+
describe "when a Procfile doesnt exist", :fakefs do
|
|
22
|
+
it "displays an error" do
|
|
23
|
+
mock_error(subject, "Procfile does not exist.") do
|
|
24
|
+
dont_allow.instance_of(Foreman::Engine).start
|
|
25
|
+
subject.start
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe "with a valid Procfile" do
|
|
31
|
+
it "can run a single command" do
|
|
32
|
+
without_fakefs do
|
|
33
|
+
output = foreman("start env -f #{resource_path("Procfile")}")
|
|
34
|
+
expect(output).to match(/env.1/)
|
|
35
|
+
expect(output).not_to match(/test.1/)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "can run all commands" do
|
|
40
|
+
without_fakefs do
|
|
41
|
+
output = foreman("start -f #{resource_path("Procfile")} -e #{resource_path(".env")}")
|
|
42
|
+
expect(output).to match(/echo.1 \| echoing/)
|
|
43
|
+
expect(output).to match(/env.1 \| bar/)
|
|
44
|
+
expect(output).to match(/test.1 \| testing/)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "sets PS variable with the process name" do
|
|
49
|
+
without_fakefs do
|
|
50
|
+
output = foreman("start -f #{resource_path("Procfile")}")
|
|
51
|
+
expect(output).to match(/ps.1 \| PS env var is ps.1/)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
describe "check" do
|
|
58
|
+
it "with a valid Procfile displays the jobs" do
|
|
59
|
+
write_procfile
|
|
60
|
+
expect(foreman("check")).to eq("valid procfile detected (alpha, bravo, foo_bar, foo-bar)\n")
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "with a blank Procfile displays an error" do
|
|
64
|
+
FileUtils.touch "Procfile"
|
|
65
|
+
expect(foreman("check")).to eq("ERROR: no processes defined\n")
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "without a Procfile displays an error" do
|
|
69
|
+
FileUtils.rm_f "Procfile"
|
|
70
|
+
expect(foreman("check")).to eq("ERROR: Procfile does not exist.\n")
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
describe "run" do
|
|
75
|
+
it "can run a command" do
|
|
76
|
+
expect(forked_foreman("run echo 1")).to eq("1\n")
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "doesn't parse options for the command" do
|
|
80
|
+
expect(forked_foreman("run grep -e FOO #{resource_path(".env")}")).to eq("FOO=bar\n")
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it "includes the environment" do
|
|
84
|
+
expect(forked_foreman("run -e #{resource_path(".env")} #{resource_path("bin/env FOO")}")).to eq("bar\n")
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it "can run a command from the Procfile" do
|
|
88
|
+
expect(forked_foreman("run -f #{resource_path("Procfile")} test")).to eq("testing\n")
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it "exits with the same exit code as the command" do
|
|
92
|
+
expect(fork_and_get_exitstatus("run echo 1")).to eq(0)
|
|
93
|
+
expect(fork_and_get_exitstatus("run date 'invalid_date'")).to eq(1)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
describe "version" do
|
|
98
|
+
it "displays gem version" do
|
|
99
|
+
expect(foreman("version").chomp).to eq(Foreman::VERSION)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "displays gem version on shortcut command" do
|
|
103
|
+
expect(foreman("-v").chomp).to eq(Foreman::VERSION)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
require "foreman/engine"
|
|
3
|
+
|
|
4
|
+
class Foreman::Engine::Tester < Foreman::Engine
|
|
5
|
+
attr_reader :buffer
|
|
6
|
+
|
|
7
|
+
def startup
|
|
8
|
+
@buffer = ""
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def output(name, data)
|
|
12
|
+
@buffer += "#{name}: #{data}"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def shutdown
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
describe "Foreman::Engine", :fakefs do
|
|
20
|
+
subject do
|
|
21
|
+
write_procfile "Procfile"
|
|
22
|
+
Foreman::Engine::Tester.new.load_procfile("Procfile")
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe "initialize" do
|
|
26
|
+
describe "with a Procfile" do
|
|
27
|
+
before { write_procfile }
|
|
28
|
+
|
|
29
|
+
it "reads the processes" do
|
|
30
|
+
expect(subject.process("alpha").command).to eq("./alpha")
|
|
31
|
+
expect(subject.process("bravo").command).to eq("./bravo")
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe "start" do
|
|
37
|
+
it "forks the processes" do
|
|
38
|
+
mock(subject.process("alpha")).run(anything)
|
|
39
|
+
mock(subject.process("bravo")).run(anything)
|
|
40
|
+
mock(subject).watch_for_output
|
|
41
|
+
mock(subject).watch_for_termination
|
|
42
|
+
subject.start
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "handles concurrency" do
|
|
46
|
+
subject.options[:formation] = "alpha=2"
|
|
47
|
+
mock(subject.process("alpha")).run(anything).twice
|
|
48
|
+
mock(subject.process("bravo")).run(anything).never
|
|
49
|
+
mock(subject).watch_for_output
|
|
50
|
+
mock(subject).watch_for_termination
|
|
51
|
+
subject.start
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
describe "directories" do
|
|
56
|
+
it "has the directory default relative to the Procfile" do
|
|
57
|
+
write_procfile "/some/app/Procfile"
|
|
58
|
+
engine = Foreman::Engine.new.load_procfile("/some/app/Procfile")
|
|
59
|
+
expect(engine.root).to eq("/some/app")
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
describe "environment" do
|
|
64
|
+
it "should read env files" do
|
|
65
|
+
File.open("/tmp/env", "w") { |f| f.puts("FOO=baz") }
|
|
66
|
+
subject.load_env("/tmp/env")
|
|
67
|
+
expect(subject.env["FOO"]).to eq("baz")
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "should read more than one if specified" do
|
|
71
|
+
File.open("/tmp/env1", "w") { |f| f.puts("FOO=bar") }
|
|
72
|
+
File.open("/tmp/env2", "w") { |f| f.puts("BAZ=qux") }
|
|
73
|
+
subject.load_env "/tmp/env1"
|
|
74
|
+
subject.load_env "/tmp/env2"
|
|
75
|
+
expect(subject.env["FOO"]).to eq("bar")
|
|
76
|
+
expect(subject.env["BAZ"]).to eq("qux")
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "should handle quoted values" do
|
|
80
|
+
File.open("/tmp/env", "w") do |f|
|
|
81
|
+
f.puts 'FOO=bar'
|
|
82
|
+
f.puts 'BAZ="qux"'
|
|
83
|
+
f.puts "FRED='barney'"
|
|
84
|
+
f.puts 'OTHER="escaped\"quote"'
|
|
85
|
+
end
|
|
86
|
+
subject.load_env "/tmp/env"
|
|
87
|
+
expect(subject.env["FOO"]).to eq("bar")
|
|
88
|
+
expect(subject.env["BAZ"]).to eq("qux")
|
|
89
|
+
expect(subject.env["FRED"]).to eq("barney")
|
|
90
|
+
expect(subject.env["OTHER"]).to eq('escaped"quote')
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "should handle multiline strings" do
|
|
94
|
+
File.open("/tmp/env", "w") do |f|
|
|
95
|
+
f.puts 'FOO="bar\nbaz"'
|
|
96
|
+
end
|
|
97
|
+
subject.load_env "/tmp/env"
|
|
98
|
+
expect(subject.env["FOO"]).to eq("bar\nbaz")
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
it "should fail if specified and doesnt exist" do
|
|
102
|
+
expect { subject.load_env "/tmp/env" }.to raise_error(Errno::ENOENT)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it "should set port from .env if specified" do
|
|
106
|
+
File.open("/tmp/env", "w") { |f| f.puts("PORT=9000") }
|
|
107
|
+
subject.load_env "/tmp/env"
|
|
108
|
+
expect(subject.send(:base_port)).to eq(9000)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
require "foreman/engine"
|
|
3
|
+
require "foreman/export"
|
|
4
|
+
|
|
5
|
+
describe "Foreman::Export::Base", :fakefs do
|
|
6
|
+
let(:procfile) { FileUtils.mkdir_p("/tmp/app"); write_procfile("/tmp/app/Procfile") }
|
|
7
|
+
let(:location) { "/tmp/init" }
|
|
8
|
+
let(:engine) { Foreman::Engine.new().load_procfile(procfile) }
|
|
9
|
+
let(:subject) { Foreman::Export::Base.new(location, engine) }
|
|
10
|
+
|
|
11
|
+
it "has a say method for displaying info" do
|
|
12
|
+
mock(subject).puts("[foreman export] foo")
|
|
13
|
+
subject.send(:say, "foo")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "raises errors as a Foreman::Export::Exception" do
|
|
17
|
+
expect { subject.send(:error, "foo") }.to raise_error(Foreman::Export::Exception, "foo")
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
require "foreman/engine"
|
|
3
|
+
require "foreman/export/bluepill"
|
|
4
|
+
require "tmpdir"
|
|
5
|
+
|
|
6
|
+
describe Foreman::Export::Bluepill, :fakefs do
|
|
7
|
+
let(:procfile) { FileUtils.mkdir_p("/tmp/app"); write_procfile("/tmp/app/Procfile") }
|
|
8
|
+
let(:formation) { nil }
|
|
9
|
+
let(:engine) { Foreman::Engine.new(:formation => formation).load_procfile(procfile) }
|
|
10
|
+
let(:options) { Hash.new }
|
|
11
|
+
let(:bluepill) { Foreman::Export::Bluepill.new("/tmp/init", engine, options) }
|
|
12
|
+
|
|
13
|
+
before(:each) { load_export_templates_into_fakefs("bluepill") }
|
|
14
|
+
before(:each) { stub(bluepill).say }
|
|
15
|
+
|
|
16
|
+
it "exports to the filesystem" do
|
|
17
|
+
bluepill.export
|
|
18
|
+
expect(normalize_space(File.read("/tmp/init/app.pill"))).to eq(normalize_space(example_export_file("bluepill/app.pill")))
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "cleans up if exporting into an existing dir" do
|
|
22
|
+
mock(FileUtils).rm("/tmp/init/app.pill")
|
|
23
|
+
|
|
24
|
+
bluepill.export
|
|
25
|
+
bluepill.export
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
context "with a process formation" do
|
|
29
|
+
let(:formation) { "alpha=2" }
|
|
30
|
+
|
|
31
|
+
it "exports to the filesystem with concurrency" do
|
|
32
|
+
bluepill.export
|
|
33
|
+
expect(normalize_space(File.read("/tmp/init/app.pill"))).to eq(normalize_space(example_export_file("bluepill/app-concurrency.pill")))
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
require "foreman/engine"
|
|
3
|
+
require "foreman/export/daemon"
|
|
4
|
+
require "tmpdir"
|
|
5
|
+
|
|
6
|
+
describe Foreman::Export::Daemon, :fakefs do
|
|
7
|
+
let(:procfile) { write_procfile("/tmp/app/Procfile") }
|
|
8
|
+
let(:formation) { nil }
|
|
9
|
+
let(:engine) { Foreman::Engine.new(:formation => formation).load_procfile(procfile) }
|
|
10
|
+
let(:options) { Hash.new }
|
|
11
|
+
let(:daemon) { Foreman::Export::Daemon.new("/tmp/init", engine, options) }
|
|
12
|
+
|
|
13
|
+
before(:each) { load_export_templates_into_fakefs("daemon") }
|
|
14
|
+
before(:each) { stub(daemon).say }
|
|
15
|
+
|
|
16
|
+
it "exports to the filesystem" do
|
|
17
|
+
daemon.export
|
|
18
|
+
|
|
19
|
+
expect(File.read("/tmp/init/app.conf")).to eq(example_export_file("daemon/app.conf"))
|
|
20
|
+
expect(File.read("/tmp/init/app-alpha.conf")).to eq(example_export_file("daemon/app-alpha.conf"))
|
|
21
|
+
expect(File.read("/tmp/init/app-alpha-1.conf")).to eq(example_export_file("daemon/app-alpha-1.conf"))
|
|
22
|
+
expect(File.read("/tmp/init/app-bravo.conf")).to eq(example_export_file("daemon/app-bravo.conf"))
|
|
23
|
+
expect(File.read("/tmp/init/app-bravo-1.conf")).to eq(example_export_file("daemon/app-bravo-1.conf"))
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "cleans up if exporting into an existing dir" do
|
|
27
|
+
mock(FileUtils).rm("/tmp/init/app.conf")
|
|
28
|
+
mock(FileUtils).rm("/tmp/init/app-alpha.conf")
|
|
29
|
+
mock(FileUtils).rm("/tmp/init/app-alpha-1.conf")
|
|
30
|
+
mock(FileUtils).rm("/tmp/init/app-bravo.conf")
|
|
31
|
+
mock(FileUtils).rm("/tmp/init/app-bravo-1.conf")
|
|
32
|
+
mock(FileUtils).rm("/tmp/init/app-foo-bar.conf")
|
|
33
|
+
mock(FileUtils).rm("/tmp/init/app-foo-bar-1.conf")
|
|
34
|
+
mock(FileUtils).rm("/tmp/init/app-foo_bar.conf")
|
|
35
|
+
mock(FileUtils).rm("/tmp/init/app-foo_bar-1.conf")
|
|
36
|
+
|
|
37
|
+
daemon.export
|
|
38
|
+
daemon.export
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "does not delete exported files for similarly named applications" do
|
|
42
|
+
FileUtils.mkdir_p "/tmp/init"
|
|
43
|
+
|
|
44
|
+
["app2", "app2-alpha", "app2-alpha-1"].each do |name|
|
|
45
|
+
path = "/tmp/init/#{name}.conf"
|
|
46
|
+
FileUtils.touch(path)
|
|
47
|
+
dont_allow(FileUtils).rm(path)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
daemon.export
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
context "with a formation" do
|
|
54
|
+
let(:formation) { "alpha=2" }
|
|
55
|
+
|
|
56
|
+
it "exports to the filesystem with concurrency" do
|
|
57
|
+
daemon.export
|
|
58
|
+
|
|
59
|
+
expect(File.read("/tmp/init/app.conf")).to eq(example_export_file("daemon/app.conf"))
|
|
60
|
+
expect(File.read("/tmp/init/app-alpha.conf")).to eq(example_export_file("daemon/app-alpha.conf"))
|
|
61
|
+
expect(File.read("/tmp/init/app-alpha-1.conf")).to eq(example_export_file("daemon/app-alpha-1.conf"))
|
|
62
|
+
expect(File.read("/tmp/init/app-alpha-2.conf")).to eq(example_export_file("daemon/app-alpha-2.conf"))
|
|
63
|
+
expect(File.exists?("/tmp/init/app-bravo-1.conf")).to eq(false)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
context "with alternate templates" do
|
|
68
|
+
let(:template) { "/tmp/alternate" }
|
|
69
|
+
let(:options) { { :app => "app", :template => template } }
|
|
70
|
+
|
|
71
|
+
before do
|
|
72
|
+
FileUtils.mkdir_p template
|
|
73
|
+
File.open("#{template}/master.conf.erb", "w") { |f| f.puts "alternate_template" }
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it "can export with alternate template files" do
|
|
77
|
+
daemon.export
|
|
78
|
+
expect(File.read("/tmp/init/app.conf")).to eq("alternate_template\n")
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
context "with alternate templates from home dir" do
|
|
83
|
+
|
|
84
|
+
before do
|
|
85
|
+
FileUtils.mkdir_p File.expand_path("~/.foreman/templates/daemon")
|
|
86
|
+
File.open(File.expand_path("~/.foreman/templates/daemon/master.conf.erb"), "w") do |file|
|
|
87
|
+
file.puts "default_alternate_template"
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it "can export with alternate template files" do
|
|
92
|
+
daemon.export
|
|
93
|
+
expect(File.read("/tmp/init/app.conf")).to eq("default_alternate_template\n")
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
require "foreman/engine"
|
|
3
|
+
require "foreman/export/inittab"
|
|
4
|
+
require "tmpdir"
|
|
5
|
+
|
|
6
|
+
describe Foreman::Export::Inittab, :fakefs do
|
|
7
|
+
let(:procfile) { FileUtils.mkdir_p("/tmp/app"); write_procfile("/tmp/app/Procfile") }
|
|
8
|
+
let(:location) { "/tmp/inittab" }
|
|
9
|
+
let(:formation) { nil }
|
|
10
|
+
let(:engine) { Foreman::Engine.new(:formation => formation).load_procfile(procfile) }
|
|
11
|
+
let(:options) { Hash.new }
|
|
12
|
+
let(:inittab) { Foreman::Export::Inittab.new(location, engine, options) }
|
|
13
|
+
|
|
14
|
+
before(:each) { load_export_templates_into_fakefs("inittab") }
|
|
15
|
+
before(:each) { stub(inittab).say }
|
|
16
|
+
|
|
17
|
+
it "exports to the filesystem" do
|
|
18
|
+
inittab.export
|
|
19
|
+
expect(File.read("/tmp/inittab")).to eq(example_export_file("inittab/inittab.default"))
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context "to stdout" do
|
|
23
|
+
let(:location) { "-" }
|
|
24
|
+
|
|
25
|
+
it "exports to stdout" do
|
|
26
|
+
mock(inittab).puts example_export_file("inittab/inittab.default")
|
|
27
|
+
inittab.export
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context "with concurrency" do
|
|
32
|
+
let(:formation) { "alpha=2" }
|
|
33
|
+
|
|
34
|
+
it "exports to the filesystem with concurrency" do
|
|
35
|
+
inittab.export
|
|
36
|
+
expect(File.read("/tmp/inittab")).to eq(example_export_file("inittab/inittab.concurrency"))
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
require "foreman/engine"
|
|
3
|
+
require "foreman/export/launchd"
|
|
4
|
+
require "tmpdir"
|
|
5
|
+
|
|
6
|
+
describe Foreman::Export::Launchd, :fakefs do
|
|
7
|
+
let(:procfile) { FileUtils.mkdir_p("/tmp/app"); write_procfile("/tmp/app/Procfile") }
|
|
8
|
+
let(:options) { Hash.new }
|
|
9
|
+
let(:engine) { Foreman::Engine.new().load_procfile(procfile) }
|
|
10
|
+
let(:launchd) { Foreman::Export::Launchd.new("/tmp/init", engine, options) }
|
|
11
|
+
|
|
12
|
+
before(:each) { load_export_templates_into_fakefs("launchd") }
|
|
13
|
+
before(:each) { stub(launchd).say }
|
|
14
|
+
|
|
15
|
+
it "exports to the filesystem" do
|
|
16
|
+
launchd.export
|
|
17
|
+
expect(File.read("/tmp/init/app-alpha-1.plist")).to eq(example_export_file("launchd/launchd-a.default"))
|
|
18
|
+
expect(File.read("/tmp/init/app-bravo-1.plist")).to eq(example_export_file("launchd/launchd-b.default"))
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context "with multiple command arguments" do
|
|
22
|
+
let(:procfile) { FileUtils.mkdir_p("/tmp/app"); write_procfile("/tmp/app/Procfile", "charlie") }
|
|
23
|
+
|
|
24
|
+
it "splits each command argument" do
|
|
25
|
+
launchd.export
|
|
26
|
+
expect(File.read("/tmp/init/app-alpha-1.plist")).to eq(example_export_file("launchd/launchd-c.default"))
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|