dtk-node-agent 0.7.7 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/README.md +21 -4
- data/bin/dtk-node-agent +17 -0
- data/lib/config/install.config +2 -2
- data/lib/dtk-node-agent/installer.rb +30 -25
- data/lib/dtk-node-agent/version.rb +18 -1
- metadata +23 -110
- data/mcollective_additions/debian.mcollective.init +0 -92
- data/mcollective_additions/plugins/README.md +0 -1
- data/mcollective_additions/plugins/v1.2/agent/discovery.rb +0 -39
- data/mcollective_additions/plugins/v1.2/agent/get_log_fragment.ddl +0 -15
- data/mcollective_additions/plugins/v1.2/agent/get_log_fragment.rb +0 -79
- data/mcollective_additions/plugins/v1.2/agent/git_access.ddl +0 -9
- data/mcollective_additions/plugins/v1.2/agent/git_access.rb +0 -79
- data/mcollective_additions/plugins/v1.2/agent/netstat.ddl +0 -9
- data/mcollective_additions/plugins/v1.2/agent/netstat.rb +0 -34
- data/mcollective_additions/plugins/v1.2/agent/puppet_apply.ddl +0 -9
- data/mcollective_additions/plugins/v1.2/agent/puppet_apply.rb +0 -630
- data/mcollective_additions/plugins/v1.2/agent/rpcutil.ddl +0 -204
- data/mcollective_additions/plugins/v1.2/agent/rpcutil.rb +0 -101
- data/mcollective_additions/plugins/v1.2/facts/pbuilder_facts.rb +0 -35
- data/mcollective_additions/plugins/v2.2/agent/action_agent.ddl +0 -9
- data/mcollective_additions/plugins/v2.2/agent/action_agent.rb +0 -47
- data/mcollective_additions/plugins/v2.2/agent/dev_manager.ddl +0 -9
- data/mcollective_additions/plugins/v2.2/agent/dev_manager.rb +0 -111
- data/mcollective_additions/plugins/v2.2/agent/discovery.rb +0 -39
- data/mcollective_additions/plugins/v2.2/agent/dtk_node_agent_git_client.rb +0 -94
- data/mcollective_additions/plugins/v2.2/agent/execute_tests.ddl +0 -9
- data/mcollective_additions/plugins/v2.2/agent/execute_tests.rb +0 -111
- data/mcollective_additions/plugins/v2.2/agent/execute_tests_v2.ddl +0 -9
- data/mcollective_additions/plugins/v2.2/agent/execute_tests_v2.rb +0 -131
- data/mcollective_additions/plugins/v2.2/agent/get_log_fragment.ddl +0 -15
- data/mcollective_additions/plugins/v2.2/agent/get_log_fragment.rb +0 -79
- data/mcollective_additions/plugins/v2.2/agent/git_access.ddl +0 -9
- data/mcollective_additions/plugins/v2.2/agent/git_access.rb +0 -61
- data/mcollective_additions/plugins/v2.2/agent/netstat.ddl +0 -9
- data/mcollective_additions/plugins/v2.2/agent/netstat.rb +0 -34
- data/mcollective_additions/plugins/v2.2/agent/ps.ddl +0 -9
- data/mcollective_additions/plugins/v2.2/agent/ps.rb +0 -37
- data/mcollective_additions/plugins/v2.2/agent/puppet_apply.ddl +0 -9
- data/mcollective_additions/plugins/v2.2/agent/puppet_apply.rb +0 -818
- data/mcollective_additions/plugins/v2.2/agent/puppet_cancel.ddl +0 -10
- data/mcollective_additions/plugins/v2.2/agent/puppet_cancel.rb +0 -78
- data/mcollective_additions/plugins/v2.2/agent/rpcutil.ddl +0 -204
- data/mcollective_additions/plugins/v2.2/agent/rpcutil.rb +0 -101
- data/mcollective_additions/plugins/v2.2/agent/ssh_agent.ddl +0 -13
- data/mcollective_additions/plugins/v2.2/agent/ssh_agent.rb +0 -97
- data/mcollective_additions/plugins/v2.2/agent/sync_agent_code.ddl +0 -10
- data/mcollective_additions/plugins/v2.2/agent/sync_agent_code.rb +0 -85
- data/mcollective_additions/plugins/v2.2/agent/tail.ddl +0 -11
- data/mcollective_additions/plugins/v2.2/agent/tail.rb +0 -67
- data/mcollective_additions/plugins/v2.2/audit/logfile.rb +0 -26
- data/mcollective_additions/plugins/v2.2/connector/r8stomp.rb +0 -238
- data/mcollective_additions/plugins/v2.2/connector/stomp.rb +0 -349
- data/mcollective_additions/plugins/v2.2/connector/stomp_em.rb +0 -191
- data/mcollective_additions/plugins/v2.2/data/agent_data.ddl +0 -22
- data/mcollective_additions/plugins/v2.2/data/agent_data.rb +0 -17
- data/mcollective_additions/plugins/v2.2/data/collective_data.ddl +0 -20
- data/mcollective_additions/plugins/v2.2/data/collective_data.rb +0 -9
- data/mcollective_additions/plugins/v2.2/data/fact_data.ddl +0 -28
- data/mcollective_additions/plugins/v2.2/data/fact_data.rb +0 -55
- data/mcollective_additions/plugins/v2.2/data/fstat_data.ddl +0 -89
- data/mcollective_additions/plugins/v2.2/data/fstat_data.rb +0 -56
- data/mcollective_additions/plugins/v2.2/discovery/flatfile.ddl +0 -11
- data/mcollective_additions/plugins/v2.2/discovery/flatfile.rb +0 -48
- data/mcollective_additions/plugins/v2.2/discovery/mc.ddl +0 -11
- data/mcollective_additions/plugins/v2.2/discovery/mc.rb +0 -30
- data/mcollective_additions/plugins/v2.2/discovery/stdin.ddl +0 -11
- data/mcollective_additions/plugins/v2.2/discovery/stdin.rb +0 -66
- data/mcollective_additions/plugins/v2.2/facts/pbuilder_facts.rb +0 -37
- data/mcollective_additions/plugins/v2.2/facts/yaml_facts.rb +0 -61
- data/mcollective_additions/plugins/v2.2/registration/agentlist.rb +0 -10
- data/mcollective_additions/plugins/v2.2/security/sshkey.ddl +0 -9
- data/mcollective_additions/plugins/v2.2/security/sshkey.rb +0 -362
- data/mcollective_additions/plugins/v2.2/util/puppetrunner.rb +0 -36
- data/mcollective_additions/plugins/v2.2/validator/array_validator.ddl +0 -7
- data/mcollective_additions/plugins/v2.2/validator/array_validator.rb +0 -9
- data/mcollective_additions/plugins/v2.2/validator/ipv4address_validator.ddl +0 -7
- data/mcollective_additions/plugins/v2.2/validator/ipv4address_validator.rb +0 -16
- data/mcollective_additions/plugins/v2.2/validator/ipv6address_validator.ddl +0 -7
- data/mcollective_additions/plugins/v2.2/validator/ipv6address_validator.rb +0 -16
- data/mcollective_additions/plugins/v2.2/validator/length_validator.ddl +0 -7
- data/mcollective_additions/plugins/v2.2/validator/length_validator.rb +0 -11
- data/mcollective_additions/plugins/v2.2/validator/regex_validator.ddl +0 -7
- data/mcollective_additions/plugins/v2.2/validator/regex_validator.rb +0 -9
- data/mcollective_additions/plugins/v2.2/validator/shellsafe_validator.ddl +0 -7
- data/mcollective_additions/plugins/v2.2/validator/shellsafe_validator.rb +0 -13
- data/mcollective_additions/plugins/v2.2/validator/typecheck_validator.ddl +0 -7
- data/mcollective_additions/plugins/v2.2/validator/typecheck_validator.rb +0 -28
- data/mcollective_additions/redhat.mcollective.init +0 -139
- data/mcollective_additions/redhat.mcollective.service +0 -14
- data/mcollective_additions/server.cfg +0 -22
- data/src/etc/logrotate.d/mcollective +0 -10
- data/src/etc/mcollective.default +0 -6
@@ -1,39 +0,0 @@
|
|
1
|
-
module MCollective
|
2
|
-
module Agent
|
3
|
-
# Discovery agent for The Marionette Collective
|
4
|
-
#
|
5
|
-
# Released under the Apache License, Version 2
|
6
|
-
class Discovery
|
7
|
-
attr_reader :timeout, :meta
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
config = Config.instance.pluginconf
|
11
|
-
|
12
|
-
@timeout = 5
|
13
|
-
@timeout = config["discovery.timeout"].to_i if config.include?("discovery.timeout")
|
14
|
-
|
15
|
-
@meta = {:license => "Apache License, Version 2",
|
16
|
-
:author => "R.I.Pienaar <rip@devco.net>",
|
17
|
-
:timeout => @timeout,
|
18
|
-
:name => "Discovery Agent",
|
19
|
-
:version => MCollective.version,
|
20
|
-
:url => "http://www.marionette-collective.org",
|
21
|
-
:description => "MCollective Discovery Agent"}
|
22
|
-
end
|
23
|
-
|
24
|
-
def handlemsg(msg, stomp)
|
25
|
-
reply = "unknown request"
|
26
|
-
|
27
|
-
case msg[:body]
|
28
|
-
when "ping"
|
29
|
-
reply = "pong"
|
30
|
-
|
31
|
-
else
|
32
|
-
reply = "Unknown Request: #{msg[:body]}"
|
33
|
-
end
|
34
|
-
|
35
|
-
reply
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
@@ -1,94 +0,0 @@
|
|
1
|
-
require 'grit'
|
2
|
-
module DTK
|
3
|
-
module NodeAgent
|
4
|
-
class GitClient
|
5
|
-
def initialize(repo_dir,opts={})
|
6
|
-
@repo_dir = repo_dir
|
7
|
-
@grit_repo = (opts[:create] ? ::Grit::Repo.init(repo_dir) : ::Grit::Repo.new(repo_dir))
|
8
|
-
end
|
9
|
-
|
10
|
-
def clone_branch(remote_repo,branch,opts={})
|
11
|
-
git_command__remote_add(remote_repo,branch)
|
12
|
-
git_command__checkout(opts[:sha]||branch)
|
13
|
-
end
|
14
|
-
|
15
|
-
def pull_and_checkout_branch?(branch,opts={})
|
16
|
-
sha = opts[:sha]
|
17
|
-
#shortcut
|
18
|
-
return if sha and (sha == current_branch_or_head())
|
19
|
-
|
20
|
-
unless remote_branch_exists?(branch)
|
21
|
-
git_command__remote_branch_add(branch)
|
22
|
-
git_command__fetch()
|
23
|
-
end
|
24
|
-
|
25
|
-
if branch_exists?(branch)
|
26
|
-
git_command__pull(branch)
|
27
|
-
git_command__checkout(sha) if sha
|
28
|
-
else
|
29
|
-
git_command__checkout(sha||branch)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
def git_command__remote_add(remote_repo,branch,remote_name=nil)
|
35
|
-
remote_name ||= default_remote()
|
36
|
-
git_command().remote(git_command_opts(),"add","-t", branch, "-f", remote_name, remote_repo)
|
37
|
-
end
|
38
|
-
|
39
|
-
def git_command__remote_branch_add(branch,remote_name=nil)
|
40
|
-
remote_name ||= default_remote()
|
41
|
-
git_command().remote(git_command_opts(),"set-branches", "--add", remote_name, branch)
|
42
|
-
end
|
43
|
-
|
44
|
-
def git_command__checkout(ref)
|
45
|
-
unless current_branch_or_head() == ref
|
46
|
-
git_command().checkout(git_command_opts(),ref)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def git_command__fetch(remote_name=nil)
|
51
|
-
remote_name ||= default_remote()
|
52
|
-
git_command().fetch(git_command_opts(),remote_name)
|
53
|
-
end
|
54
|
-
|
55
|
-
def git_command__pull(branch,remote_name=nil)
|
56
|
-
remote_name ||= default_remote()
|
57
|
-
git_command().pull(git_command_opts(),remote_name,branch)
|
58
|
-
end
|
59
|
-
|
60
|
-
def branch_exists?(branch)
|
61
|
-
@grit_repo.heads.find{|h|h.name == branch} ? true : nil
|
62
|
-
end
|
63
|
-
|
64
|
-
def remote_branch_exists?(branch,remote_name=nil)
|
65
|
-
remote_name ||= default_remote()
|
66
|
-
remote_branch = "#{remote_name}/#{branch}"
|
67
|
-
@grit_repo.remotes.find{|h|h.name == remote_branch} ? true : nil
|
68
|
-
end
|
69
|
-
|
70
|
-
def current_branch_or_head()
|
71
|
-
#this returns sha when detached head
|
72
|
-
if @grit_repo.head
|
73
|
-
@grit_repo.head.name
|
74
|
-
elsif @grit_repo.commit('HEAD')
|
75
|
-
@grit_repo.commit('HEAD').id
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def default_remote()
|
80
|
-
'origin'
|
81
|
-
end
|
82
|
-
|
83
|
-
def git_command_opts(opts={})
|
84
|
-
ret = {:raise => true, :timeout => 60}
|
85
|
-
ret.merge!(:chdir => @repo_dir) unless opts[:no_chdir]
|
86
|
-
end
|
87
|
-
|
88
|
-
def git_command()
|
89
|
-
@grit_repo.git
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
@@ -1,9 +0,0 @@
|
|
1
|
-
metadata :name => "component module tests executor",
|
2
|
-
:description => "Agent to executing component module infrastructure tests",
|
3
|
-
:author => "Reactor8",
|
4
|
-
:license => "",
|
5
|
-
:version => "",
|
6
|
-
:url => "",
|
7
|
-
:timeout => 10
|
8
|
-
action "execute_tests", :description => "execute all component module infrastructure tests" do
|
9
|
-
end
|
@@ -1,111 +0,0 @@
|
|
1
|
-
module MCollective
|
2
|
-
module Agent
|
3
|
-
class Execute_tests < RPC::Agent
|
4
|
-
def initialize()
|
5
|
-
super()
|
6
|
-
@log = Log.instance
|
7
|
-
end
|
8
|
-
|
9
|
-
def pull_modules(module_version_context, git_server)
|
10
|
-
ENV['GIT_SHELL'] = nil #This is put in because if vcsrepo Puppet module used it sets this
|
11
|
-
begin
|
12
|
-
repo_dir = "#{ModulePath}/#{module_version_context[:implementation]}"
|
13
|
-
remote_repo = "#{git_server}:#{module_version_context[:repo]}"
|
14
|
-
opts = Hash.new
|
15
|
-
begin
|
16
|
-
if File.exists?(repo_dir)
|
17
|
-
@log.info("Branch already exists. Checkout to branch and pull latest changes...")
|
18
|
-
git_repo = ::DTK::NodeAgent::GitClient.new(repo_dir)
|
19
|
-
git_repo.pull_and_checkout_branch?(module_version_context[:branch],opts)
|
20
|
-
else
|
21
|
-
@log.info("Branch does not exist. Cloning branch...")
|
22
|
-
git_repo = ::DTK::NodeAgent::GitClient.new(repo_dir,:create=>true)
|
23
|
-
git_repo.clone_branch(remote_repo,module_version_context[:branch],opts)
|
24
|
-
end
|
25
|
-
rescue Exception => e
|
26
|
-
log_error(e)
|
27
|
-
#to achieve idempotent behavior; fully remove directory if any problems
|
28
|
-
FileUtils.rm_rf repo_dir
|
29
|
-
raise e
|
30
|
-
end
|
31
|
-
rescue Exception => e
|
32
|
-
log_error(e)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def log_error(e)
|
37
|
-
log_error = ([e.inspect]+backtrace_subset(e)).join("\n")
|
38
|
-
@log.info("\n----------------error-----\n#{log_error}\n----------------error-----")
|
39
|
-
end
|
40
|
-
|
41
|
-
action "execute_tests" do
|
42
|
-
#Get list of component modules that have spec tests
|
43
|
-
list_output=`ls /etc/puppet/modules/*/dtk/serverspec/spec/localhost/*/*_spec.rb`
|
44
|
-
regex_pattern=/modules\/(.+)\/dtk\/serverspec\/spec\/localhost\/(.+)\//
|
45
|
-
ModuleInfo = Struct.new(:module_name, :component_name, :full_component_name)
|
46
|
-
modules_info = []
|
47
|
-
|
48
|
-
components = []
|
49
|
-
#Strip away node part (/)...leave only part which represent full component name
|
50
|
-
request[:components].each do |c|
|
51
|
-
if c.include? "/"
|
52
|
-
components << c.split("/").last
|
53
|
-
else
|
54
|
-
components << c
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
list_output.each do |line|
|
59
|
-
match = line.match(regex_pattern)
|
60
|
-
components.each do |c|
|
61
|
-
if c.include? "::"
|
62
|
-
stripped_c = c.split("::").last
|
63
|
-
modules_info << ModuleInfo.new(match[1],match[2],c) if stripped_c.eql? match[2]
|
64
|
-
elsif c.eql? match[2]
|
65
|
-
modules_info << ModuleInfo.new(match[1],match[2],c)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
all_spec_results = []
|
71
|
-
#filter out redundant module info if any
|
72
|
-
modules_info = modules_info.uniq
|
73
|
-
#Pull latest changes for modules if any
|
74
|
-
git_server = Facts["git-server"]
|
75
|
-
|
76
|
-
begin
|
77
|
-
modules_info.each do |module_info|
|
78
|
-
component_module = module_info[:module_name]
|
79
|
-
component_name = module_info[:component_name]
|
80
|
-
full_component_name = module_info[:full_component_name]
|
81
|
-
#Filter out version context for modules that don't exist on node
|
82
|
-
filtered_version_context = request[:version_context].select { |x| x[:implementation] == module_info[:module_name] }.first
|
83
|
-
pull_modules(filtered_version_context,git_server)
|
84
|
-
|
85
|
-
@log.info("Executing serverspec test: /etc/puppet/modules/#{component_module}/dtk/serverspec/spec/localhost/#{component_name}/*_spec.rb")
|
86
|
-
spec_results=`/opt/puppet-omnibus/embedded/bin/rspec /etc/puppet/modules/#{component_module}/dtk/serverspec/spec/localhost/#{component_name}/*_spec.rb --format j 2>&1`
|
87
|
-
raise spec_results unless spec_results_json = JSON.parse(spec_results)
|
88
|
-
|
89
|
-
spec_results_json['examples'].each do |spec|
|
90
|
-
spec_result = {}
|
91
|
-
spec_result.store(:module_name, component_module)
|
92
|
-
spec_result.store(:component_name, full_component_name)
|
93
|
-
spec_result.store(:test_result, spec['full_description'])
|
94
|
-
spec_result.store(:status, spec['status'])
|
95
|
-
all_spec_results << spec_result
|
96
|
-
end
|
97
|
-
end
|
98
|
-
reply[:data] = all_spec_results
|
99
|
-
reply[:pbuilderid] = Facts["pbuilderid"]
|
100
|
-
reply[:status] = :ok
|
101
|
-
rescue Exception => e
|
102
|
-
@log.info("Error while executing serverspec test")
|
103
|
-
@log.info(e.message)
|
104
|
-
reply[:data] = { :test_error => "#{e.message.lines.first}" }
|
105
|
-
reply[:pbuilderid] = Facts["pbuilderid"]
|
106
|
-
reply[:status] = :notok
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
@@ -1,9 +0,0 @@
|
|
1
|
-
metadata :name => "component module tests executor v2",
|
2
|
-
:description => "Agent to executing component module infrastructure tests v2",
|
3
|
-
:author => "Reactor8",
|
4
|
-
:license => "",
|
5
|
-
:version => "",
|
6
|
-
:url => "",
|
7
|
-
:timeout => 10
|
8
|
-
action "execute_tests_v2", :description => "execute all component module infrastructure tests v2" do
|
9
|
-
end
|
@@ -1,131 +0,0 @@
|
|
1
|
-
require 'rspec'
|
2
|
-
require 'rspec/core'
|
3
|
-
require 'rspec/core/formatters/json_formatter'
|
4
|
-
require 'json'
|
5
|
-
|
6
|
-
ModulePath = "/etc/puppet/modules"
|
7
|
-
ServerspecPath = "serverspec/spec/localhost"
|
8
|
-
|
9
|
-
module MCollective
|
10
|
-
module Agent
|
11
|
-
class ServerSpecHelper
|
12
|
-
def execute(spec_path, vars=[])
|
13
|
-
vars.each do |var|
|
14
|
-
var.each_pair do |k,v|
|
15
|
-
Thread.current[k] = v
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
config = RSpec.configuration
|
20
|
-
json_formatter = RSpec::Core::Formatters::JsonFormatter.new(config.output)
|
21
|
-
reporter = RSpec::Core::Reporter.new(json_formatter)
|
22
|
-
config.instance_variable_set(:@reporter, reporter)
|
23
|
-
begin
|
24
|
-
::RSpec::Core::Runner.run([spec_path,'--format','j'])
|
25
|
-
json_formatter.output_hash
|
26
|
-
rescue Exception => e
|
27
|
-
return e.message
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
class Execute_tests_v2 < RPC::Agent
|
33
|
-
def initialize()
|
34
|
-
super()
|
35
|
-
@log = Log.instance
|
36
|
-
end
|
37
|
-
|
38
|
-
def pull_modules(module_version_context, git_server)
|
39
|
-
ENV['GIT_SHELL'] = nil #This is put in because if vcsrepo Puppet module used it sets this
|
40
|
-
begin
|
41
|
-
repo_dir = "#{ModulePath}/#{module_version_context[:implementation]}"
|
42
|
-
remote_repo = "#{git_server}:#{module_version_context[:repo]}"
|
43
|
-
opts = Hash.new
|
44
|
-
begin
|
45
|
-
if File.exists?(repo_dir)
|
46
|
-
@log.info("Branch already exists. Checkout to branch and pull latest changes...")
|
47
|
-
git_repo = ::DTK::NodeAgent::GitClient.new(repo_dir)
|
48
|
-
git_repo.pull_and_checkout_branch?(module_version_context[:branch],opts)
|
49
|
-
else
|
50
|
-
@log.info("Branch does not exist. Cloning branch...")
|
51
|
-
git_repo = ::DTK::NodeAgent::GitClient.new(repo_dir,:create=>true)
|
52
|
-
git_repo.clone_branch(remote_repo,module_version_context[:branch],opts)
|
53
|
-
end
|
54
|
-
rescue Exception => e
|
55
|
-
log_error(e)
|
56
|
-
#to achieve idempotent behavior; fully remove directory if any problems
|
57
|
-
FileUtils.rm_rf repo_dir
|
58
|
-
raise e
|
59
|
-
end
|
60
|
-
rescue Exception => e
|
61
|
-
log_error(e)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def log_error(e)
|
66
|
-
log_error = ([e.inspect]+e.backtrace).join("\n")
|
67
|
-
@log.info("\n----------------error-----\n#{log_error}\n----------------error-----")
|
68
|
-
end
|
69
|
-
|
70
|
-
action "execute_tests_v2" do
|
71
|
-
spec_helper = ServerSpecHelper.new
|
72
|
-
all_spec_results = []
|
73
|
-
|
74
|
-
#Pull latest changes for modules if any
|
75
|
-
git_server = Facts["git-server"]
|
76
|
-
|
77
|
-
request[:components].each do |component|
|
78
|
-
#Filter version context for modules that exist on node
|
79
|
-
filtered_version_context = request[:version_context].select { |x| x[:implementation] == component[:module_name] }.first
|
80
|
-
pull_modules(filtered_version_context,git_server)
|
81
|
-
|
82
|
-
component_name = ""
|
83
|
-
if component[:component].include? "/"
|
84
|
-
component_name = component[:component].split("/").last
|
85
|
-
else
|
86
|
-
component_name = component[:component]
|
87
|
-
end
|
88
|
-
|
89
|
-
#all_tests needs to be calculated after the pull module done
|
90
|
-
all_tests = Dir["#{ModulePath}/*/#{ServerspecPath}/*.rb"]
|
91
|
-
test = all_tests.select { |test| (test.include? component[:test_name]) && (test.include? component[:module_name]) }
|
92
|
-
@log.info("Executing serverspec test: #{test.first}")
|
93
|
-
spec_results = spec_helper.execute(test.first, component[:params])
|
94
|
-
@log.info("Serverspec results: #{spec_results}")
|
95
|
-
|
96
|
-
if spec_results.is_a?(Hash)
|
97
|
-
spec_results[:examples].each do |spec|
|
98
|
-
spec_result = {}
|
99
|
-
spec_result.store(:module_name, component[:module_name])
|
100
|
-
spec_result.store(:component_name, component_name)
|
101
|
-
spec_result.store(:test_component_name, component[:test_component])
|
102
|
-
spec_result.store(:test_name, component[:test_name])
|
103
|
-
spec_result.store(:test_result, spec[:full_description])
|
104
|
-
spec_result.store(:status, spec[:status])
|
105
|
-
|
106
|
-
if spec[:status].include? "failed"
|
107
|
-
backtrace = spec[:exception][:backtrace].find { |x| x.include? component[:module_name] }
|
108
|
-
error = backtrace + " " + spec[:exception][:class] + ": " + spec[:exception][:message]
|
109
|
-
spec_result.store(:test_error, error)
|
110
|
-
end
|
111
|
-
all_spec_results << spec_result
|
112
|
-
end
|
113
|
-
else
|
114
|
-
spec_result = {}
|
115
|
-
spec_result.store(:module_name, component[:module_name])
|
116
|
-
spec_result.store(:component_name, component_name)
|
117
|
-
spec_result.store(:test_component_name, component[:test_component])
|
118
|
-
spec_result.store(:test_name, component[:test_name])
|
119
|
-
spec_result.store(:test_result, "N/A")
|
120
|
-
spec_result.store(:status, "failed")
|
121
|
-
spec_result.store(:test_error, spec_results)
|
122
|
-
all_spec_results << spec_result
|
123
|
-
end
|
124
|
-
end
|
125
|
-
reply[:data] = all_spec_results
|
126
|
-
reply[:pbuilderid] = Facts["pbuilderid"]
|
127
|
-
reply[:status] = :ok
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
metadata :name => "get log fragment",
|
2
|
-
:description => "get log fragment",
|
3
|
-
:author => "Reactor8",
|
4
|
-
:license => "",
|
5
|
-
:version => "",
|
6
|
-
:url => "",
|
7
|
-
:timeout => 20
|
8
|
-
action "get", :description => "get log data fragment" do
|
9
|
-
display :always
|
10
|
-
%w{status error data pbuilderid}.each do |k|
|
11
|
-
output k.to_sym,
|
12
|
-
:description => k.capitalize,
|
13
|
-
:display_as => k.capitalize
|
14
|
-
end
|
15
|
-
end
|
@@ -1,79 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
require 'rubygems'
|
3
|
-
|
4
|
-
module MCollective
|
5
|
-
#TODO: shoudl go in common area
|
6
|
-
LogFileHandles = {:task_id => Hash.new, :top_task_id => Hash.new}
|
7
|
-
|
8
|
-
module Agent
|
9
|
-
class Get_log_fragment < RPC::Agent
|
10
|
-
metadata :name => "get log fragment",
|
11
|
-
:description => "get log fragment",
|
12
|
-
:author => "Reactor8",
|
13
|
-
:license => "",
|
14
|
-
:version => "",
|
15
|
-
:url => "",
|
16
|
-
:timeout => 20
|
17
|
-
def initialize()
|
18
|
-
super()
|
19
|
-
@log = Log.instance
|
20
|
-
end
|
21
|
-
def get_action()
|
22
|
-
validate :key, String
|
23
|
-
validate :value, String
|
24
|
-
log_file_dir = "/var/log/puppet"
|
25
|
-
key = request[:key]
|
26
|
-
value = request[:value]
|
27
|
-
lines = get_log_fragment(log_file_dir,key,value)
|
28
|
-
pbuilderid = Facts["pbuilderid"]
|
29
|
-
if lines.nil?
|
30
|
-
error_msg = "Cannot find log fragment matching #{key}=#{value}"
|
31
|
-
error_response = {
|
32
|
-
:status => :failed,
|
33
|
-
:error => {
|
34
|
-
:message => error_msg
|
35
|
-
},
|
36
|
-
:pbuilderid => pbuilderid
|
37
|
-
}
|
38
|
-
@log.error(error_msg)
|
39
|
-
reply.data = error_response
|
40
|
-
else
|
41
|
-
ok_response = {
|
42
|
-
:status => :ok,
|
43
|
-
:data => lines,
|
44
|
-
:pbuilderid => pbuilderid
|
45
|
-
}
|
46
|
-
reply.data = ok_response
|
47
|
-
end
|
48
|
-
end
|
49
|
-
private
|
50
|
-
def get_log_fragment(log_file_dir,key,value)
|
51
|
-
#flush file if it is open
|
52
|
-
if file_handle = (LogFileHandles[key.to_sym]||{})[value]
|
53
|
-
file_handle.flush
|
54
|
-
end
|
55
|
-
|
56
|
-
delim = key.to_sym == :top_task_id ? "\\." : ":"
|
57
|
-
string_key = "#{key}:#{value.to_s}#{delim}"
|
58
|
-
ret = Array.new
|
59
|
-
matches = Dir["#{log_file_dir}/*.log"].grep(Regexp.new(string_key))
|
60
|
-
if matches.size == 0
|
61
|
-
return nil
|
62
|
-
end
|
63
|
-
matching_file = matches.size == 1 ?
|
64
|
-
matches.first :
|
65
|
-
#this finds teh most recent file
|
66
|
-
matches.map{|file|[file,File.mtime(file)]}.sort{|a,b|b[1]<=>a[1]}.first[0]
|
67
|
-
begin
|
68
|
-
f = File.open(matching_file)
|
69
|
-
until f.eof
|
70
|
-
ret << f.readline.chop
|
71
|
-
end
|
72
|
-
ensure
|
73
|
-
f.close
|
74
|
-
end
|
75
|
-
ret
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|