proctor 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. data/.rspec +1 -0
  2. data/TODO +28 -0
  3. data/bin/proctor +55 -85
  4. data/bin/showlog +5 -0
  5. data/bin/showtime +5 -0
  6. data/lib/proctor/command/asset_list_cmd.rb +56 -0
  7. data/lib/proctor/{presenter/show.rb → command/asset_show_cmd.rb} +7 -2
  8. data/lib/proctor/command/file_cleanup_cmd.rb +81 -0
  9. data/lib/proctor/command/file_export_cmd.rb +79 -0
  10. data/lib/proctor/command/helpers/command.rb +27 -0
  11. data/lib/proctor/command/render_group_cmd.rb +39 -0
  12. data/lib/proctor/command/render_service_cmd.rb +34 -0
  13. data/lib/proctor/command/start_cmd.rb +70 -0
  14. data/lib/proctor/config/app_file.rb +54 -0
  15. data/lib/proctor/config/app_files.rb +50 -0
  16. data/lib/proctor/config/env.rb +35 -0
  17. data/lib/proctor/config/template_file.rb +41 -0
  18. data/lib/proctor/config/template_files.rb +39 -0
  19. data/lib/proctor/manager.rb +36 -3
  20. data/lib/proctor/managers.rb +38 -0
  21. data/lib/proctor/node.rb +26 -0
  22. data/lib/proctor/nodes.rb +38 -0
  23. data/lib/proctor/resource/erb.rb +95 -0
  24. data/lib/proctor/resource/lookup.rb +82 -0
  25. data/lib/proctor/service.rb +28 -3
  26. data/lib/proctor/services.rb +38 -0
  27. data/lib/proctor/util/helpers.rb +13 -0
  28. data/lib/proctor/util/version.rb +3 -0
  29. data/proctor.gemspec +2 -1
  30. data/proctor/Proctorfile +35 -34
  31. data/proctor/templates/foreman_default_g.erb +3 -0
  32. data/proctor/templates/monit_default_s.erb +3 -6
  33. data/proctor/templates/monit_faye_s.erb +3 -3
  34. data/proctor/templates/upstart_default_g.erb +1 -0
  35. data/proctor/templates/upstart_default_s.erb +1 -3
  36. data/proctor/templates/upstart_passenger_s.erb +3 -0
  37. data/spec/acceptance/asset_list_spec.rb +16 -0
  38. data/spec/acceptance/asset_show_spec.rb +16 -0
  39. data/spec/acceptance/file_cleanup_spec.rb +16 -0
  40. data/spec/acceptance/file_export_spec.rb +16 -0
  41. data/spec/acceptance/render_group_spec.rb +15 -0
  42. data/spec/acceptance/render_service_spec.rb +16 -0
  43. data/spec/acceptance/start_spec.rb +16 -0
  44. data/spec/spec_helper.rb +22 -0
  45. data/spec/unit/command/file_export_cmd_spec.rb +46 -0
  46. data/spec/unit/command/file_list_cmd_spec.rb +30 -0
  47. data/spec/unit/command/render_group_cmd_spec.rb +44 -0
  48. data/spec/unit/command/render_service_cmd_spec.rb +42 -0
  49. data/spec/unit/{app_file_spec.rb → config/app_file_spec.rb} +27 -7
  50. data/spec/unit/config/app_files_spec.rb +55 -0
  51. data/spec/unit/config/env_spec.rb +37 -0
  52. data/spec/unit/config/template_file_spec.rb +55 -0
  53. data/spec/unit/config/template_files_spec.rb +32 -0
  54. data/spec/unit/manager_spec.rb +30 -10
  55. data/spec/unit/managers_spec.rb +40 -0
  56. data/spec/unit/node_spec.rb +34 -0
  57. data/spec/unit/nodes_spec.rb +36 -0
  58. data/spec/unit/service_spec.rb +31 -10
  59. data/spec/unit/services_spec.rb +34 -0
  60. metadata +86 -31
  61. data/Proctorfile +0 -4
  62. data/lib/proctor/app_config.rb +0 -23
  63. data/lib/proctor/app_file.rb +0 -44
  64. data/lib/proctor/cmd_state.rb +0 -39
  65. data/lib/proctor/presenter/list.rb +0 -67
  66. data/lib/proctor/presenter/render.rb +0 -39
  67. data/lib/proctor/template.rb +0 -5
  68. data/lib/proctor/template_config.rb +0 -22
  69. data/lib/proctor/template_file.rb +0 -44
  70. data/lib/proctor/util.rb +0 -12
  71. data/lib/proctor/version.rb +0 -3
  72. data/proctor/templates/foreman_default_n.erb +0 -9
  73. data/proctor/templates/monit_web_s.erb +0 -0
  74. data/proctor/templates/upstart_default_n.erb +0 -0
  75. data/spec/acceptance/help_spec.rb +0 -36
  76. data/spec/acceptance/list_spec.rb +0 -17
  77. data/spec/unit/app_config_spec.rb +0 -30
  78. data/spec/unit/template_config_spec.rb +0 -12
  79. data/spec/unit/template_file_spec.rb +0 -16
  80. data/spec/unit/template_spec.rb +0 -8
@@ -0,0 +1,3 @@
1
+ <% node.services.each do |service| -%>
2
+ <%= service %>: <%= services[service].data["start_command"] %>
3
+ <% end -%>
@@ -1,6 +1,3 @@
1
- % mon = managers['monit']
2
- # Generated by Proctor at <%= Time.now %>
3
-
4
- check process <%= role_name %> with pidfile <%= pidfile %>
5
- start program = "<%= start_command %>"
6
- stop program = "<%= stop_command %>"
1
+ check process <%# role_name %> with pidfile <%# pidfile %>
2
+ start program = "<%# start_command %>"
3
+ stop program = "<%# stop_command %>"
@@ -1,7 +1,7 @@
1
1
  # Generated by Proctor at <%= Time.now %>
2
2
 
3
- check process <%= app_name %> with pidfile <%= pidfile %>
4
- start program "/etc/init.d/<%= app_name %> start"
5
- stop program "/etc/init.d/<%= app_name %> stop"
3
+ check process <%= Dir.pwd.split('/').last %> with pidfile <%= pidfile %>
4
+ start program "/etc/init.d/<%= Dir.pwd.split('/').last %> start"
5
+ stop program "/etc/init.d/<%= Dir.pwd.split('/').last %> stop"
6
6
  if failed port <%= port %> then restart
7
7
  if 5 restarts within 5 cycles then timeout
@@ -0,0 +1 @@
1
+ # TBD
@@ -1,7 +1,5 @@
1
- # Generated by Proctor at <%= Time.now %>
2
-
3
1
  start on runlevel [2345]
4
2
  stop on runlevel [!2345]
5
3
  expect daemon
6
4
  respawn
7
- exec <%= @start_command %>
5
+ exec <%= service.data["start_command"] %>
@@ -0,0 +1,3 @@
1
+ HELLO WORLD
2
+ <%= manager.data['export_directory'] %>
3
+ <%= manager.data['start_command'] %>
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'asset_list', :acceptance do
4
+
5
+ it 'returns help text' do
6
+ start_simple "help asset_list"
7
+ all_output.should include('list')
8
+ end
9
+
10
+ it 'runs' do
11
+ start_simple "asset_list"
12
+ last_exit_status.should == 0
13
+ end
14
+
15
+ end
16
+
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'asset_show', :acceptance do
4
+
5
+ it 'runs the command' do
6
+ start_simple "asset_show", false
7
+ last_exit_status.should_not == 0
8
+ end
9
+
10
+ it 'runs help' do
11
+ start_simple "help asset_show"
12
+ last_exit_status.should == 0
13
+ end
14
+
15
+ end
16
+
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'file_cleanup', :acceptance do
4
+
5
+ it 'runs the command' do
6
+ start_simple "file_cleanup", false
7
+ last_exit_status.should_not == 0
8
+ end
9
+
10
+ it 'runs help' do
11
+ start_simple "help file_cleanup"
12
+ last_exit_status.should == 0
13
+ end
14
+
15
+ end
16
+
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'file_export', :acceptance do
4
+
5
+ it 'runs the command' do
6
+ start_simple "file_export", false
7
+ last_exit_status.should_not == 0
8
+ end
9
+
10
+ it 'runs help' do
11
+ start_simple "help file_export"
12
+ last_exit_status.should == 0
13
+ end
14
+
15
+ end
16
+
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'render_group', :acceptance do
4
+
5
+ it 'runs the command' do
6
+ start_simple "g_group", false
7
+ last_exit_status.should_not == 0
8
+ end
9
+
10
+ it 'runs help' do
11
+ start_simple "help render_group"
12
+ last_exit_status.should == 0
13
+ end
14
+
15
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'render_service', :acceptance do
4
+
5
+ it 'runs the command' do
6
+ start_simple "render_service", false
7
+ last_exit_status.should_not == 0
8
+ end
9
+
10
+ it 'runs help' do
11
+ start_simple "help render_service"
12
+ last_exit_status.should == 0
13
+ end
14
+
15
+ end
16
+
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'clean', :acceptance do
4
+
5
+ it 'runs the command' do
6
+ start_simple "clean", false
7
+ last_exit_status.should_not == 0
8
+ end
9
+
10
+ it 'runs help' do
11
+ start_simple "help clean"
12
+ last_exit_status.should == 0
13
+ end
14
+
15
+ end
16
+
data/spec/spec_helper.rb CHANGED
@@ -11,6 +11,7 @@ Dir['./spec/support/*.rb'].map {|f| require f}
11
11
  RSpec.configure do |config|
12
12
 
13
13
  config.color_enabled = true
14
+ config.fail_fast = true
14
15
  config.treat_symbols_as_metadata_keys_with_true_values = true
15
16
  config.run_all_when_everything_filtered = true
16
17
  config.include Aruba::Api, :example_group => {
@@ -19,9 +20,30 @@ RSpec.configure do |config|
19
20
 
20
21
  end
21
22
 
23
+ def lcl_file
24
+ <<-EOF
25
+ ---
26
+ managers:
27
+ upstart:
28
+ export_directory: "/tmp/proctor/upstart"
29
+ monit:
30
+ export_directory: "/tmp/proctor/monit"
31
+ foreman:
32
+ export_directory: "/tmp/proctor/monit"
33
+ EOF
34
+ end
35
+
22
36
  def clear_app_file(&block)
23
37
  system "mv Proctorfile /tmp/Proctorfile.#{$$}" if File.exist?("Proctorfile")
24
38
  yield
25
39
  system "rm -f Proctorfile"
26
40
  system "mv /tmp/Proctorfile.#{$$} Proctorfile" if File.exist?("/tmp/Proctorfile.#{$$}")
27
41
  end
42
+
43
+ def setup_lcl_file
44
+ File.open("Proctorfile", 'w') {|f| f.puts lcl_file}
45
+ end
46
+
47
+ def clear_lcl_file
48
+ system "rm -f Proctorfile"
49
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+ require_relative "../../../lib/proctor/command/file_export_cmd"
3
+
4
+ include Proctor::Command
5
+
6
+ describe FileExportCmd do
7
+ before(:all) do
8
+ setup_lcl_file; @options = {}
9
+ @options['env'] = Proctor::Config::Env.new([{}, {}, []])
10
+ end
11
+
12
+ after(:all) { clear_lcl_file }
13
+
14
+ def obj(args)
15
+ FileExportCmd.new({}, @options, args.split(' '))
16
+ end
17
+
18
+ describe "object creation" do
19
+ specify { -> {obj("")}.should raise_error }
20
+ end
21
+
22
+ describe "#export - foreman" do
23
+ specify { obj("foreman backup").export.should be_nil }
24
+ specify { obj("foreman development").export.should be_nil }
25
+ specify { obj("foreman production").export.should be_nil }
26
+ specify { obj("foreman staging").export.should be_nil }
27
+ specify { obj("foreman test").export.should be_nil }
28
+ end
29
+
30
+ describe "#export - upstart" do
31
+ specify { obj("upstart backup").export.should be_nil }
32
+ specify { obj("upstart development").export.should be_nil }
33
+ specify { obj("upstart production").export.should be_nil }
34
+ specify { obj("upstart staging").export.should be_nil }
35
+ specify { obj("upstart test").export.should be_nil }
36
+ end
37
+
38
+ describe "#export - monit" do
39
+ specify { obj("monit backup").export.should be_nil }
40
+ specify { obj("monit development").export.should be_nil }
41
+ specify { obj("monit production").export.should be_nil }
42
+ specify { obj("monit staging").export.should be_nil }
43
+ specify { obj("monit test").export.should be_nil }
44
+ end
45
+
46
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+ require_relative "../../../lib/proctor/command/asset_list_cmd"
3
+
4
+ include Proctor::Command
5
+
6
+ describe AssetListCmd do
7
+ before(:all) do
8
+ @options = {}
9
+ @options['env'] = Proctor::Config::Env.new([{}, {}, []])
10
+ end
11
+
12
+ before(:each) do
13
+ @args = ""
14
+ end
15
+
16
+ let(:obj) { AssetListCmd.new({}, @options, @args.split(' '))}
17
+
18
+ describe "object creation" do
19
+ specify { obj.should_not be_nil }
20
+ specify { obj.should be_a(AssetListCmd) }
21
+ end
22
+
23
+ describe "#list" do
24
+ before(:each) { @options[:type] = "all" }
25
+ specify { obj.gen_list.should_not be_nil }
26
+ specify { obj.gen_list.should be_a(String) }
27
+ end
28
+
29
+
30
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+ require_relative "../../../lib/proctor/command/render_service_cmd"
3
+
4
+ include Proctor::Command
5
+
6
+ describe RenderGroupCmd do
7
+ before(:all) do
8
+ @options = {:f => nil}
9
+ @options['env'] = Proctor::Config::Env.new([{}, {}, []])
10
+ end
11
+
12
+ def obj(args)
13
+ RenderGroupCmd.new({}, @options, args.split(' '))
14
+ end
15
+
16
+ describe "object creation" do
17
+ context "with no args" do
18
+ specify { -> {obj("")}.should raise_error }
19
+ end
20
+
21
+ context "with valid args" do
22
+ before(:all) { @args = "foreman test" }
23
+ specify { obj(@args).should_not be_nil }
24
+ specify { obj(@args).should be_a(RenderGroupCmd) }
25
+ end
26
+ end
27
+
28
+ describe "#render - foreman" do
29
+ specify { obj("foreman backup").render_string.should be_a(String) }
30
+ specify { obj("foreman development").render_string.should be_a(String) }
31
+ specify { obj("foreman production").render_string.should be_a(String) }
32
+ specify { obj("foreman staging").render_string.should be_a(String) }
33
+ specify { obj("foreman test").render_string.should be_a(String) }
34
+ end
35
+
36
+ describe "#render - upstart" do
37
+ specify { obj("upstart backup").render_string.should be_a(String) }
38
+ specify { obj("upstart development").render_string.should be_a(String) }
39
+ specify { obj("upstart production").render_string.should be_a(String) }
40
+ specify { obj("upstart staging").render_string.should be_a(String) }
41
+ specify { obj("upstart test").render_string.should be_a(String) }
42
+ end
43
+
44
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+ require_relative "../../../lib/proctor/command/render_service_cmd"
3
+
4
+ include Proctor::Command
5
+
6
+ describe RenderServiceCmd do
7
+ before(:all) do
8
+ @options = {:f => nil}
9
+ @options['env'] = Proctor::Config::Env.new([{}, {}, []])
10
+ end
11
+
12
+ def obj(args)
13
+ RenderServiceCmd.new({}, @options, args.split(' '))
14
+ end
15
+
16
+ describe "object creation" do
17
+ context "with no args" do
18
+ specify { -> {obj("")}.should raise_error }
19
+ end
20
+
21
+ context "with valid args" do
22
+ before(:all) { @args = "upstart showlog" }
23
+ specify { obj(@args).should_not be_nil }
24
+ specify { obj(@args).should be_a(RenderServiceCmd) }
25
+ end
26
+ end
27
+
28
+ describe "#render - upstart" do
29
+ specify { obj("upstart passenger").render_string.should be_a(String) }
30
+ specify { obj("upstart showlog").render_string.should be_a(String) }
31
+ specify { obj("upstart showtime").render_string.should be_a(String) }
32
+ specify { obj("upstart unicorn").render_string.should be_a(String) }
33
+ end
34
+
35
+ describe "#render - monit" do
36
+ specify { obj("monit passenger").render_string.should be_a(String) }
37
+ specify { obj("monit showlog").render_string.should be_a(String) }
38
+ specify { obj("monit showtime").render_string.should be_a(String) }
39
+ specify { obj("monit unicorn").render_string.should be_a(String) }
40
+ end
41
+
42
+ end
@@ -1,13 +1,13 @@
1
1
  require 'spec_helper'
2
- require_relative "../../lib/proctor/app_file"
2
+ require_relative "../../../lib/proctor/config/app_file"
3
3
 
4
- include Proctor
4
+ include Proctor::Config
5
5
 
6
6
  describe AppFile do
7
7
 
8
8
  describe "#new" do
9
9
  it "reports an error if the app file is missing" do
10
- lambda { AppFile.new("Unknown") }.should raise_error(MissingFileException)
10
+ lambda { AppFile.new("Unknown") }.should raise_error(MissingAppFileException)
11
11
  end
12
12
 
13
13
  it "reports an error if the app file YAML has a parser error" do
@@ -33,8 +33,28 @@ describe AppFile do
33
33
 
34
34
  end
35
35
 
36
- #it "should have a list of valid object types"
37
- #it "should raise warnings for invalid objects"
38
- #it "should handle embedded ERB tags"
39
- #it "reports if there is an ERB rendering error"
36
+ context "basic tests" do
37
+
38
+ before(:all) do
39
+ file = "/tmp/test.#{$$}"
40
+ system "echo '---\na:\n b: 1' > #{file}"
41
+ @obj = AppFile.new(file)
42
+ system "rm #{file}"
43
+ end
44
+
45
+ describe "#data" do
46
+ specify { @obj.should respond_to(:data) }
47
+ specify { @obj.data.should_not be_nil }
48
+ specify { @obj.data.should be_a(Hash) }
49
+ end
50
+
51
+ describe "#handle" do
52
+ specify { @obj.should respond_to(:handle) }
53
+ specify { @obj.handle.should_not be_nil }
54
+ specify { @obj.handle.should be_a(String) }
55
+ specify { @obj.handle.length.should == 3 }
56
+ end
57
+
58
+ end
59
+
40
60
  end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+ require_relative "../../../lib/proctor/config/app_files"
3
+
4
+ include Proctor::Config
5
+
6
+ describe AppFiles do
7
+
8
+ context "basic tests" do
9
+
10
+ before(:all) { @obj = AppFiles.new([{}, {}, []]) }
11
+
12
+ describe "#new" do
13
+ specify { @obj.should_not be_nil }
14
+ specify { @obj.should be_an(AppFiles) }
15
+ end
16
+
17
+ describe "#all" do
18
+ specify { @obj.should respond_to(:all) }
19
+ specify { @obj.all.should be_an(Array) }
20
+ specify { @obj.all.length.should == 1 }
21
+ end
22
+
23
+ describe "#merged_data" do
24
+ specify { @obj.should respond_to(:merged_data) }
25
+ specify { @obj.merged_data.should_not be_nil }
26
+ specify { @obj.merged_data.should be_a(Hash) }
27
+ end
28
+
29
+ end
30
+
31
+ #it "loads data and generates a hash" do
32
+ # result = AppConfig.load
33
+ # result.should_not be_nil
34
+ # result.should be_a(Hash)
35
+ #end
36
+ #it "has default values" do
37
+ # app_data = "---\nmanagers:\n newstart:\n export_directory: '/tmp/test'"
38
+ # clear_app_file do
39
+ # File.open("Proctorfile", 'w') {|f| f.puts "#{app_data}"}
40
+ # result = AppConfig.load
41
+ # tst_value = result["managers"]["upstart"]["export_directory"]
42
+ # tst_value.should == "/etc/init"
43
+ # end
44
+ #end
45
+ #it "overwrites default values with local values" do
46
+ # app_data = "---\nmanagers:\n upstart:\n export_directory: '/tmp/test'"
47
+ # clear_app_file do
48
+ # File.open("Proctorfile", 'w') {|f| f.puts "#{app_data}"}
49
+ # result = AppConfig.load
50
+ # tst_value = result["managers"]["upstart"]["export_directory"]
51
+ # tst_value.should == "/tmp/test"
52
+ # end
53
+ #end
54
+
55
+ end