proctor 0.0.3 → 0.0.4

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.
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,27 @@
1
+ module Proctor
2
+ module Command
3
+ module Helpers
4
+
5
+ module Command
6
+
7
+ def check_number_of_args(args, target_number, message, opts = {})
8
+ opts_txt = options_msg(opts)
9
+ if args.length != target_number
10
+ raise InvalidNumberOfArgs, "Usage '#{message}' #{opts_txt}"
11
+ end
12
+ end
13
+
14
+ def options_msg(hash)
15
+ hash.to_a.map do |i|
16
+ "\n #{i[0]} [#{i[1].join('|')}]"
17
+ end.join
18
+ end
19
+
20
+ class InvalidNumberOfArgs < RuntimeError
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,39 @@
1
+ require_relative "./helpers/command"
2
+ require_relative "../resource/erb"
3
+ require_relative "../resource/lookup"
4
+
5
+ module Proctor
6
+ module Command
7
+ class RenderGroupCmd
8
+
9
+ include Helpers::Command
10
+ include Proctor::Resource::Erb
11
+ include Proctor::Resource::Lookup
12
+
13
+ def initialize(global, options, args)
14
+ @manager = args[0]
15
+ @node = args[1]
16
+ @env = options['env']
17
+ opts = {'MANAGERS' => @env.managers.names, 'NODES' => @env.nodes.names}
18
+ check_number_of_args(args, 2, 'render_group MANAGER NODE', opts)
19
+ end
20
+
21
+ def render_string
22
+ manager = lookup_valid_manager(@manager, @env)
23
+ node = lookup_valid_node(@node, @env)
24
+ template = lookup_valid_group_template(@manager, @node, @env)
25
+ services = lookup_valid_services_hash(@node, @env)
26
+ render_group_template(manager, node, services, template, @env)
27
+ end
28
+
29
+ def group
30
+ puts render_string
31
+ end
32
+
33
+ def render
34
+ puts render_string
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,34 @@
1
+ require_relative "./helpers/command"
2
+ require_relative "../resource/erb"
3
+ require_relative "../resource/lookup"
4
+
5
+ module Proctor
6
+ module Command
7
+ class RenderServiceCmd
8
+
9
+ include Helpers::Command
10
+ include Proctor::Resource::Erb
11
+ include Proctor::Resource::Lookup
12
+
13
+ def initialize(global, options, args)
14
+ @manager = args[0]
15
+ @service = args[1]
16
+ @env = options['env']
17
+ opts = {'MANAGERS' => @env.managers.names, 'SERVICES' => @env.services.names}
18
+ check_number_of_args(args, 2, 'render_service MANAGER SERVICE', opts)
19
+ end
20
+
21
+ def render
22
+ puts render_string
23
+ end
24
+
25
+ def render_string
26
+ manager = lookup_valid_manager(@manager, @env)
27
+ service = lookup_valid_service(@service, @env)
28
+ template = lookup_valid_service_template(@manager, @service, @env)
29
+ render_service_template(manager, service, template, @env)
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,70 @@
1
+ require_relative "./helpers/command"
2
+ require_relative "../resource/erb"
3
+ require_relative "../resource/lookup"
4
+
5
+ module Proctor
6
+ module Command
7
+ class StartCmd
8
+
9
+ include Helpers::Command
10
+ include Proctor::Resource::Erb
11
+ include Proctor::Resource::Lookup
12
+
13
+ def initialize(global, options, args)
14
+ @env = options['env']
15
+ @manager = args[0]
16
+ @node = args[1]
17
+ opts = {'MANAGERS' => @env.managers.names, 'NODES' => @env.nodes.names}
18
+ check_number_of_args(args, 2, 'start MANAGER NODE', opts)
19
+ end
20
+
21
+ def start
22
+ env = @env
23
+ _manager = lookup_valid_manager(@manager, @env)
24
+ #update_manager_with_cl_options(manager)
25
+ manager = erb_ify(_manager, {}, env)
26
+ node = lookup_valid_node(@node, @env)
27
+ if manager.data["group_data"]
28
+ start_group(manager)
29
+ end
30
+ if manager.data["service_data"]
31
+ node.services.each do |service_name|
32
+ service = lookup_valid_service(service_name, @env)
33
+ start_service(manager, service, @env)
34
+ end
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def start_group(manager)
41
+ export_directory = manager.data["export_directory"]
42
+ start_command = manager.data["group_data"]["start_command"]
43
+ begin
44
+ cmd = "cd #{export_directory} ; #{start_command}"
45
+ system cmd
46
+ rescue
47
+ msg = "start problem"
48
+ raise StartError, msg
49
+ end
50
+ end
51
+
52
+ def start_service(manager, service, env)
53
+ export_directory = manager.data["export_directory"]
54
+ start_command = manager.data["service_data"]["start_command"]
55
+ begin
56
+ cmd = "cd #{export_directory} ; #{start_command}"
57
+ system cmd
58
+ rescue
59
+ msg = "start problem"
60
+ raise StartError, msg
61
+ end
62
+ end
63
+ end
64
+
65
+ class StartError < RuntimeError
66
+ end
67
+
68
+ end
69
+ end
70
+
@@ -0,0 +1,54 @@
1
+ require 'yaml'
2
+ require_relative '../util/helpers'
3
+
4
+ module Proctor
5
+ module Config
6
+ class AppFile
7
+
8
+ include Proctor::Config
9
+ include Util::Helpers
10
+
11
+ attr_reader :data, :handle, :name
12
+
13
+ def initialize(file_path)
14
+ validate_file_existence(file_path)
15
+ @name = file_path
16
+ @data = load_data(file_path)
17
+ @handle = md5_handle(file_path)
18
+ validate_data_format(file_path)
19
+ end
20
+
21
+ private
22
+
23
+ def load_data(file)
24
+ begin
25
+ @data = YAML.load_file(file)
26
+ rescue Psych::SyntaxError
27
+ error_msg = "invalid file format (expecting YAML - #{file})"
28
+ raise InvalidYamlException.new, error_msg
29
+ end
30
+ end
31
+
32
+ def validate_data_format(file)
33
+ raise InvalidDataType, "expecting hash data (#{file})" unless @data.is_a?(Hash)
34
+ end
35
+
36
+ def validate_file_existence(file)
37
+ error_msg = "missing app file (#{file})"
38
+ raise MissingAppFileException, error_msg unless File.exist?(file)
39
+ end
40
+
41
+ end
42
+
43
+ class MissingAppFileException < RuntimeError
44
+ end
45
+
46
+ class InvalidYamlException < RuntimeError
47
+ end
48
+
49
+ class InvalidDataType < RuntimeError
50
+ end
51
+
52
+ end
53
+
54
+ end
@@ -0,0 +1,50 @@
1
+ require 'hash_deep_merge'
2
+ require_relative './app_file'
3
+
4
+ module Proctor
5
+ module Config
6
+ class AppFiles
7
+
8
+ def initialize(params)
9
+ @all = path_list(params).map {|f| AppFile.new(f)}
10
+ end
11
+
12
+ def all
13
+ @all.sort {|a,b| a.name <=> b.name}
14
+ end
15
+
16
+ def merged_data
17
+ @all.reduce({}) { |a,v| a.deep_merge(v.data) }
18
+ end
19
+
20
+ def path_list(params)
21
+ gem_app_path + cwd_app_path + commandline_app_path(params)
22
+ end
23
+
24
+ def find_by_handle(handle)
25
+ @all.find {|app_file| app_file.handle == handle}
26
+ end
27
+
28
+ private
29
+
30
+ def commandline_app_path(params)
31
+ cl_name = params[0][:f]
32
+ cl_name.nil? ? [] : [cl_name]
33
+ end
34
+
35
+ def cwd_app_path
36
+ tgt_file = "#{Dir.pwd}/Proctorfile"
37
+ File.exist?(tgt_file) ? [tgt_file] : []
38
+ end
39
+
40
+ def gem_app_path
41
+ ["#{gem_base_dir}/proctor/Proctorfile"]
42
+ end
43
+
44
+ def gem_base_dir
45
+ File.expand_path('../../../', File.dirname(__FILE__))
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,35 @@
1
+ f1 = %w(./template_files ./app_files)
2
+ f2 = %w(../managers ../services ../nodes)
3
+
4
+ (f1 + f2).each {|f| require_relative f}
5
+
6
+ module Proctor
7
+
8
+ module Config
9
+
10
+ class Env
11
+
12
+ attr_reader :template_files
13
+ attr_reader :app_files, :managers, :services, :nodes
14
+ attr_reader :app
15
+
16
+ def initialize(params)
17
+ @template_files = TemplateFiles.new(params)
18
+ @app_files = AppFiles.new(params)
19
+ @managers = Managers.new(@app_files, params)
20
+ @services = Services.new(@app_files, params)
21
+ @nodes = Nodes.new(@app_files, params)
22
+ @app = {}
23
+ set_app_metadata
24
+ end
25
+
26
+ def set_app_metadata
27
+ @app['name'] = Dir.pwd.split('/').last
28
+ @app['gemdir'] = File.expand_path('../../../', File.dirname(__FILE__))
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,41 @@
1
+ require 'yaml'
2
+ require_relative '../util/helpers'
3
+
4
+ module Proctor
5
+ module Config
6
+ class TemplateFile
7
+
8
+ include Proctor::Config
9
+ include Util::Helpers
10
+
11
+ attr_reader :name, :path, :handle
12
+
13
+ def initialize(file_path)
14
+ validate_file_existence(file_path)
15
+ @name = file_name(file_path)
16
+ @path = file_path
17
+ @handle = md5_handle(file_path)
18
+ end
19
+
20
+ def text
21
+ File.read(@path)
22
+ end
23
+
24
+ private
25
+
26
+ def file_name(file_path)
27
+ File.basename(file_path, '.erb')
28
+ end
29
+
30
+ def validate_file_existence(file)
31
+ error_msg = "missing template file (#{file})"
32
+ raise MissingTemplateFileException, error_msg unless File.exist?(file)
33
+ end
34
+
35
+ end
36
+
37
+ class MissingTemplateFileException < RuntimeError
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,39 @@
1
+ require_relative './template_file'
2
+
3
+ module Proctor
4
+ module Config
5
+ class TemplateFiles
6
+
7
+ def initialize (params)
8
+ @all = path_list(params).map {|f| TemplateFile.new(f)}
9
+ end
10
+
11
+ def all
12
+ @all.sort {|a,b| a.name <=> b.name}
13
+ end
14
+
15
+ def find_by_name(file_name)
16
+ @all.find {|template_file| template_file.name == file_name}
17
+ end
18
+
19
+ def find_by_handle(handle)
20
+ @all.find {|template_file| template_file.handle == handle}
21
+ end
22
+
23
+ def names
24
+ @all.map {|template| template.name}
25
+ end
26
+
27
+ private
28
+
29
+ def path_list(params)
30
+ Dir.glob("#{gem_base_dir}/proctor/templates/*").map {|f| File.expand_path(f)}
31
+ end
32
+
33
+ def gem_base_dir
34
+ File.dirname(File.expand_path('../../../', __FILE__))
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -1,11 +1,44 @@
1
+ require_relative './util/helpers'
2
+
1
3
  module Proctor
2
4
  class Manager
3
- attr_reader :input_hash, :opts
4
5
 
5
- def initialize(hash = {})
6
- @input_hash = hash
6
+ include Proctor::Util::Helpers
7
+
8
+ attr_reader :name, :data, :handle
9
+
10
+ def initialize(name, data)
11
+ @name = name
12
+ @data = data
13
+ @handle = md5_handle(name)
14
+ validate_required_manager_fields(data)
7
15
  end
8
16
 
17
+ private
18
+
19
+ def validate_required_manager_fields(manager_hash)
20
+ required_fields = %w(export_directory)
21
+ required_fields.each do |field|
22
+ if manager_hash[field].nil?
23
+ raise MissingManagerField, "missing required service field (#{field})"
24
+ end
25
+ end
26
+ end
27
+
28
+ def validate_export_directory(manager_hash)
29
+ dir = manager_hash['export_directory']
30
+ unless Dir.exist?(dir)
31
+ raise MissingExportDirectory, "missing export directory (#{dir})"
32
+ end
33
+ end
34
+
35
+ end
36
+
37
+ class MissingManagerField < RuntimeError
9
38
  end
39
+
40
+ class MissingExportDirectory < RuntimeError
41
+ end
42
+
10
43
  end
11
44