proctor 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +1 -0
- data/TODO +28 -0
- data/bin/proctor +55 -85
- data/bin/showlog +5 -0
- data/bin/showtime +5 -0
- data/lib/proctor/command/asset_list_cmd.rb +56 -0
- data/lib/proctor/{presenter/show.rb → command/asset_show_cmd.rb} +7 -2
- data/lib/proctor/command/file_cleanup_cmd.rb +81 -0
- data/lib/proctor/command/file_export_cmd.rb +79 -0
- data/lib/proctor/command/helpers/command.rb +27 -0
- data/lib/proctor/command/render_group_cmd.rb +39 -0
- data/lib/proctor/command/render_service_cmd.rb +34 -0
- data/lib/proctor/command/start_cmd.rb +70 -0
- data/lib/proctor/config/app_file.rb +54 -0
- data/lib/proctor/config/app_files.rb +50 -0
- data/lib/proctor/config/env.rb +35 -0
- data/lib/proctor/config/template_file.rb +41 -0
- data/lib/proctor/config/template_files.rb +39 -0
- data/lib/proctor/manager.rb +36 -3
- data/lib/proctor/managers.rb +38 -0
- data/lib/proctor/node.rb +26 -0
- data/lib/proctor/nodes.rb +38 -0
- data/lib/proctor/resource/erb.rb +95 -0
- data/lib/proctor/resource/lookup.rb +82 -0
- data/lib/proctor/service.rb +28 -3
- data/lib/proctor/services.rb +38 -0
- data/lib/proctor/util/helpers.rb +13 -0
- data/lib/proctor/util/version.rb +3 -0
- data/proctor.gemspec +2 -1
- data/proctor/Proctorfile +35 -34
- data/proctor/templates/foreman_default_g.erb +3 -0
- data/proctor/templates/monit_default_s.erb +3 -6
- data/proctor/templates/monit_faye_s.erb +3 -3
- data/proctor/templates/upstart_default_g.erb +1 -0
- data/proctor/templates/upstart_default_s.erb +1 -3
- data/proctor/templates/upstart_passenger_s.erb +3 -0
- data/spec/acceptance/asset_list_spec.rb +16 -0
- data/spec/acceptance/asset_show_spec.rb +16 -0
- data/spec/acceptance/file_cleanup_spec.rb +16 -0
- data/spec/acceptance/file_export_spec.rb +16 -0
- data/spec/acceptance/render_group_spec.rb +15 -0
- data/spec/acceptance/render_service_spec.rb +16 -0
- data/spec/acceptance/start_spec.rb +16 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/unit/command/file_export_cmd_spec.rb +46 -0
- data/spec/unit/command/file_list_cmd_spec.rb +30 -0
- data/spec/unit/command/render_group_cmd_spec.rb +44 -0
- data/spec/unit/command/render_service_cmd_spec.rb +42 -0
- data/spec/unit/{app_file_spec.rb → config/app_file_spec.rb} +27 -7
- data/spec/unit/config/app_files_spec.rb +55 -0
- data/spec/unit/config/env_spec.rb +37 -0
- data/spec/unit/config/template_file_spec.rb +55 -0
- data/spec/unit/config/template_files_spec.rb +32 -0
- data/spec/unit/manager_spec.rb +30 -10
- data/spec/unit/managers_spec.rb +40 -0
- data/spec/unit/node_spec.rb +34 -0
- data/spec/unit/nodes_spec.rb +36 -0
- data/spec/unit/service_spec.rb +31 -10
- data/spec/unit/services_spec.rb +34 -0
- metadata +86 -31
- data/Proctorfile +0 -4
- data/lib/proctor/app_config.rb +0 -23
- data/lib/proctor/app_file.rb +0 -44
- data/lib/proctor/cmd_state.rb +0 -39
- data/lib/proctor/presenter/list.rb +0 -67
- data/lib/proctor/presenter/render.rb +0 -39
- data/lib/proctor/template.rb +0 -5
- data/lib/proctor/template_config.rb +0 -22
- data/lib/proctor/template_file.rb +0 -44
- data/lib/proctor/util.rb +0 -12
- data/lib/proctor/version.rb +0 -3
- data/proctor/templates/foreman_default_n.erb +0 -9
- data/proctor/templates/monit_web_s.erb +0 -0
- data/proctor/templates/upstart_default_n.erb +0 -0
- data/spec/acceptance/help_spec.rb +0 -36
- data/spec/acceptance/list_spec.rb +0 -17
- data/spec/unit/app_config_spec.rb +0 -30
- data/spec/unit/template_config_spec.rb +0 -12
- data/spec/unit/template_file_spec.rb +0 -16
- data/spec/unit/template_spec.rb +0 -8
data/Proctorfile
DELETED
data/lib/proctor/app_config.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'hash_deep_merge'
|
2
|
-
|
3
|
-
module Proctor
|
4
|
-
class AppConfig
|
5
|
-
|
6
|
-
def self.load(global_options = {:f => "Proctorfile"})
|
7
|
-
app_files = self.app_files(global_options).map {|f| AppFile.new(f)}
|
8
|
-
app_files.reduce({}) { |a,v| a.deep_merge(v.config_data) }
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.app_files(global_options)
|
12
|
-
proctorfile = global_options[:f]
|
13
|
-
["#{base_dir}/proctor/Proctorfile", "#{Dir.pwd}/#{proctorfile}", ]
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def self.base_dir
|
19
|
-
File.expand_path(File.dirname(File.expand_path(__FILE__)) + '/../..')
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
end
|
data/lib/proctor/app_file.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
|
3
|
-
module Proctor
|
4
|
-
class AppFile
|
5
|
-
attr_reader :config_data
|
6
|
-
|
7
|
-
def initialize(filename)
|
8
|
-
check_file_existence(filename)
|
9
|
-
@config_data = load_data(filename)
|
10
|
-
check_data_format(filename)
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def load_data(file)
|
16
|
-
begin
|
17
|
-
@config_data = YAML.load_file(file)
|
18
|
-
rescue Psych::SyntaxError
|
19
|
-
error_msg = "invalid file format (expecting YAML - #{file})"
|
20
|
-
raise InvalidYamlException.new, error_msg
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def check_data_format(file)
|
25
|
-
raise InvalidDataType, "expecting hash data (#{file})" unless @config_data.is_a?(Hash)
|
26
|
-
end
|
27
|
-
|
28
|
-
def check_file_existence(file)
|
29
|
-
error_msg = "missing app file (#{file})"
|
30
|
-
raise MissingFileException, error_msg unless File.exist?(file)
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
class MissingFileException < RuntimeError
|
36
|
-
end
|
37
|
-
|
38
|
-
class InvalidYamlException < RuntimeError
|
39
|
-
end
|
40
|
-
|
41
|
-
class InvalidDataType < RuntimeError
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|
data/lib/proctor/cmd_state.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
module Proctor
|
2
|
-
|
3
|
-
class CmdState
|
4
|
-
|
5
|
-
def self.app_files(global, options, args)
|
6
|
-
AppConfig.app_files(global)
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.templates(global, options, args)
|
10
|
-
options[:templates].values.sort
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.nodes(global, options, args)
|
14
|
-
options[:app_config]['nodes']
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.node_names(global, options, args)
|
18
|
-
options[:app_config]['nodes'].keys
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.services(global, options, args)
|
22
|
-
options[:app_config]['services']
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.service_names(global, options, args)
|
26
|
-
options[:app_config]['services'].keys
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.managers(global, options, args)
|
30
|
-
options[:app_config]['managers']
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.manager_names(global, options, args)
|
34
|
-
options[:app_config]['managers'].keys
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
@@ -1,67 +0,0 @@
|
|
1
|
-
require 'digest/md5'
|
2
|
-
|
3
|
-
module Proctor
|
4
|
-
module Presenter
|
5
|
-
class List
|
6
|
-
|
7
|
-
def initialize(global, options, args)
|
8
|
-
@global = global
|
9
|
-
@options = options
|
10
|
-
@args = args
|
11
|
-
end
|
12
|
-
|
13
|
-
def render
|
14
|
-
case @options[:type]
|
15
|
-
when "appfiles" then render_appfiles
|
16
|
-
when "managers" then render_managers
|
17
|
-
when "services" then render_services
|
18
|
-
when "templates" then render_templates
|
19
|
-
when "node" then render_node
|
20
|
-
when "all" then render_all
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def handle(string)
|
25
|
-
Digest::MD5.hexdigest(string)[0..2]
|
26
|
-
end
|
27
|
-
|
28
|
-
def puts_handle(string)
|
29
|
-
puts "#{handle(string)}: #{string}"
|
30
|
-
end
|
31
|
-
|
32
|
-
def render_templates
|
33
|
-
puts "[Templates]"
|
34
|
-
CmdState.templates(@global, @options, @args).each {|v| puts_handle(v)}
|
35
|
-
end
|
36
|
-
|
37
|
-
def render_appfiles
|
38
|
-
puts "[AppFiles]"
|
39
|
-
CmdState.app_files(@global, @options, @args).each { |f| puts "#{handle(f)}: #{f}" }
|
40
|
-
end
|
41
|
-
|
42
|
-
def render_managers
|
43
|
-
puts "[Managers]"
|
44
|
-
CmdState.managers(@global, @options, @args).keys.each {|k| puts_handle(k)}
|
45
|
-
end
|
46
|
-
|
47
|
-
def render_services
|
48
|
-
puts "[Services]"
|
49
|
-
CmdState.services(@global, @options, @args).keys.each {|k| puts_handle(k)}
|
50
|
-
end
|
51
|
-
|
52
|
-
def render_node
|
53
|
-
puts "[Nodes]"
|
54
|
-
CmdState.nodes(@global, @options, @args).keys.each {|k| puts_handle(k)}
|
55
|
-
end
|
56
|
-
|
57
|
-
def render_all
|
58
|
-
render_templates
|
59
|
-
render_appfiles
|
60
|
-
render_managers
|
61
|
-
render_services
|
62
|
-
render_node
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
module Proctor
|
2
|
-
module Presenter
|
3
|
-
class Render
|
4
|
-
|
5
|
-
def initialize(global, options, args)
|
6
|
-
@global = global
|
7
|
-
@options = options
|
8
|
-
@args = args
|
9
|
-
@role = args[0]
|
10
|
-
@manager = args[1]
|
11
|
-
check_for_valid_role(@role)
|
12
|
-
check_for_valid_manager(@manager)
|
13
|
-
end
|
14
|
-
|
15
|
-
def check_for_valid_role(role)
|
16
|
-
roles = CmdState.roles(@global, @options, @args) + ["manifest"]
|
17
|
-
unless roles.include? role
|
18
|
-
raise "Invalid ROLE (#{role}) - use one of [#{roles.join('|')}]"
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def check_for_valid_manager(manager)
|
23
|
-
managers = CmdState.manager_names(@global, @options, @args)
|
24
|
-
unless managers.include? manager
|
25
|
-
raise "Invalid MANAGER (#{manager}) - use one of [#{managers.join('|')}]"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def render_template
|
30
|
-
puts "# Template #{@role} #{@manager}"
|
31
|
-
end
|
32
|
-
|
33
|
-
def render
|
34
|
-
render_template
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/lib/proctor/template.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
module Proctor
|
2
|
-
class TemplateConfig
|
3
|
-
|
4
|
-
def self.load(global_options = {})
|
5
|
-
template_files = self.files(global_options)
|
6
|
-
template_files.reduce({}) do |a, v|
|
7
|
-
a.merge({File.basename(v) => v})
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def self.files(global_options)
|
14
|
-
Dir.glob('proctor/templates/*').map {|f| File.expand_path(f)}
|
15
|
-
end
|
16
|
-
|
17
|
-
#def self.base_dir
|
18
|
-
# File.expand_path(File.dirname(File.expand_path(__FILE__)) + '/../..')
|
19
|
-
#end
|
20
|
-
|
21
|
-
end
|
22
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
|
3
|
-
module Proctor
|
4
|
-
class TemplateFile
|
5
|
-
attr_reader :config_data
|
6
|
-
|
7
|
-
def initialize(filename)
|
8
|
-
check_file_existence(filename)
|
9
|
-
@config_data = load_data(filename)
|
10
|
-
check_data_format(filename)
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def load_data(file)
|
16
|
-
begin
|
17
|
-
@config_data = YAML.load_file(file)
|
18
|
-
rescue Psych::SyntaxError
|
19
|
-
error_msg = "invalid file format (expecting YAML - #{file})"
|
20
|
-
raise InvalidYamlException.new, error_msg
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def check_data_format(file)
|
25
|
-
raise InvalidDataType, "expecting hash data (#{file})" unless @config_data.is_a?(Hash)
|
26
|
-
end
|
27
|
-
|
28
|
-
def check_file_existence(file)
|
29
|
-
error_msg = "missing app file (#{file})"
|
30
|
-
raise MissingFileException, error_msg unless File.exist?(file)
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
class MissingFileException < RuntimeError
|
36
|
-
end
|
37
|
-
|
38
|
-
class InvalidYamlException < RuntimeError
|
39
|
-
end
|
40
|
-
|
41
|
-
class InvalidDataType < RuntimeError
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|
data/lib/proctor/util.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
# 1.9 adds realpath to resolve symlinks; 1.8 doesn't
|
2
|
-
# have this method, so we add it so we get resolved symlinks
|
3
|
-
# and compatibility
|
4
|
-
unless File.respond_to? :realpath
|
5
|
-
class File #:nodoc:
|
6
|
-
def self.realpath path
|
7
|
-
return realpath(File.readlink(path)) if symlink?(path)
|
8
|
-
path
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
#$: << File.expand_path(File.dirname(File.realpath(__FILE__)) + '/../lib')
|
data/lib/proctor/version.rb
DELETED
File without changes
|
File without changes
|
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe 'start/help', :acceptance do
|
4
|
-
|
5
|
-
it 'returns text' do
|
6
|
-
start_simple
|
7
|
-
all_output.should include('proctor')
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'does not have an error' do
|
11
|
-
start_simple
|
12
|
-
last_exit_status.should == 0
|
13
|
-
all_output.should_not include('Error')
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'takes the help command' do
|
17
|
-
start_simple "help start"
|
18
|
-
all_output.should include('start')
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
describe "checking existence of App file" do
|
24
|
-
it "returns an error w/o the app file" do
|
25
|
-
clear_app_file do
|
26
|
-
start_simple "list", false
|
27
|
-
last_exit_status.should_not == 0
|
28
|
-
all_output.should include('error: missing app file')
|
29
|
-
end
|
30
|
-
end
|
31
|
-
it "returns an error when specifying an alternative proctorfile" do
|
32
|
-
start_simple "list -f Nofile", false
|
33
|
-
last_exit_status.should_not == 0
|
34
|
-
all_output.should include('error: missing app file')
|
35
|
-
end
|
36
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe 'list', :acceptance do
|
4
|
-
|
5
|
-
it 'returns help text' do
|
6
|
-
start_simple "help list"
|
7
|
-
all_output.should include('list')
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'raises an error with an unknown type' do
|
11
|
-
start_simple "list -t whatexxver", false
|
12
|
-
last_exit_status.should_not == 0
|
13
|
-
all_output.should include('error')
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require_relative "../../lib/proctor/app_config"
|
3
|
-
|
4
|
-
include Proctor
|
5
|
-
|
6
|
-
describe AppConfig do
|
7
|
-
it "loads data and generates a hash" do
|
8
|
-
result = AppConfig.load
|
9
|
-
result.should_not be_nil
|
10
|
-
result.should be_a(Hash)
|
11
|
-
end
|
12
|
-
it "has default values" do
|
13
|
-
app_data = "---\nmanagers:\n newstart:\n export_directory: '/tmp/test'"
|
14
|
-
clear_app_file do
|
15
|
-
File.open("Proctorfile", 'w') {|f| f.puts "#{app_data}"}
|
16
|
-
result = AppConfig.load
|
17
|
-
tst_value = result["managers"]["upstart"]["export_directory"]
|
18
|
-
tst_value.should == "/etc/init"
|
19
|
-
end
|
20
|
-
end
|
21
|
-
it "overwrites default values with local values" do
|
22
|
-
app_data = "---\nmanagers:\n upstart:\n export_directory: '/tmp/test'"
|
23
|
-
clear_app_file do
|
24
|
-
File.open("Proctorfile", 'w') {|f| f.puts "#{app_data}"}
|
25
|
-
result = AppConfig.load
|
26
|
-
tst_value = result["managers"]["upstart"]["export_directory"]
|
27
|
-
tst_value.should == "/tmp/test"
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require_relative "../../lib/proctor/template_config"
|
3
|
-
|
4
|
-
include Proctor
|
5
|
-
|
6
|
-
describe TemplateConfig do
|
7
|
-
it "loads data and generates a hash" do
|
8
|
-
result = TemplateConfig.load
|
9
|
-
result.should_not be_nil
|
10
|
-
result.should be_a(Hash)
|
11
|
-
end
|
12
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require_relative "../../lib/proctor/template_file"
|
3
|
-
|
4
|
-
include Proctor
|
5
|
-
|
6
|
-
describe TemplateFile do
|
7
|
-
|
8
|
-
describe "#new" do
|
9
|
-
|
10
|
-
end
|
11
|
-
|
12
|
-
#it "should have a list of valid object types"
|
13
|
-
#it "should raise warnings for invalid objects"
|
14
|
-
#it "should handle embedded ERB tags"
|
15
|
-
#it "reports if there is an ERB rendering error"
|
16
|
-
end
|