chef-handler-opsmatic 0.0.7 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -0
- data/chef-handler-opsmatic.gemspec +1 -1
- data/lib/chef/handler/opsmatic.rb +45 -0
- data/spec/opsmatic_spec.rb +50 -2
- data/spec/spec_helper.rb +1 -0
- metadata +2 -3
- data/lib/chef/handler/version.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 111a2d25c05ff91ddc37660487d6cf37d1dd9ad1
|
4
|
+
data.tar.gz: d3e54a7e30a4332c724176812477bbf56f9d9740
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a3fa5c15a7292e89e242d30aa5cba0acb2e3eac471620055691d8a8d9c42e7969eaa619345c318cfe9a36cf2623342c978902d80bbef06bba2aa49101305198
|
7
|
+
data.tar.gz: c5fed53a6e356fe2d1baae07455afc214b66672e3bdc13ed42f5a933b0380c66d4fbdd21b083aa9231022dd1f3e2a151c5263b17001e0461d2204d7499bf9c6f
|
data/README.md
CHANGED
@@ -7,6 +7,12 @@ The chef-handler-opsmatic gem is a Chef report and exception handler
|
|
7
7
|
The easiest way to install this handler in your Chef environment is with the `handler`
|
8
8
|
recipe in the [opsmatic-cookbook](https://github.com/opsmatic/opsmatic-cookbook) cookbook.
|
9
9
|
|
10
|
+
## Changelog
|
11
|
+
|
12
|
+
#### 0.0.9 (2014-08-19)
|
13
|
+
* adds support for generating a list of chef managed files for the Opsmatic agent to watch for changes
|
14
|
+
* adds sending chef-handler-opsmatic version in the user-agent string
|
15
|
+
|
10
16
|
## Contributing
|
11
17
|
|
12
18
|
1. Fork it ( https://github.com/[my-github-username]/chef-handler-opsmatic/fork )
|
@@ -7,10 +7,15 @@ require 'json'
|
|
7
7
|
class Chef
|
8
8
|
class Handler
|
9
9
|
class Opsmatic < ::Chef::Handler
|
10
|
+
VERSION = "0.0.9"
|
11
|
+
|
10
12
|
def initialize(config = {})
|
11
13
|
@config = config
|
14
|
+
@config[:agent_dir] ||= "/var/db/opsmatic-agent"
|
15
|
+
@watch_files = {}
|
12
16
|
end
|
13
17
|
|
18
|
+
# prepares a report of the current chef run
|
14
19
|
def report
|
15
20
|
if @config[:integration_token].nil? || @config[:integration_token].empty?
|
16
21
|
Chef::Log.warn("Opsmatic integraton integration_token missing, report handler disabled")
|
@@ -60,9 +65,48 @@ class Chef
|
|
60
65
|
opsmatic_event[:data][:exception] = clean_exception
|
61
66
|
end
|
62
67
|
|
68
|
+
# analyze and collect any potentially monitorable resources
|
69
|
+
collect_resources run_status.all_resources
|
70
|
+
|
71
|
+
# submit our event
|
63
72
|
submit opsmatic_event
|
64
73
|
end
|
65
74
|
|
75
|
+
# collects up details on file resources managed by chef on the host and writes
|
76
|
+
# the list to a directory for the opsmatic-agent to consume to hint at interesting
|
77
|
+
# files the agent can watch
|
78
|
+
def collect_resources(all_resources)
|
79
|
+
return unless File.directory?(@config[:agent_dir])
|
80
|
+
|
81
|
+
all_resources.each do |resource|
|
82
|
+
case resource
|
83
|
+
when Chef::Resource::CookbookFile
|
84
|
+
@watch_files[resource.path] = true
|
85
|
+
when Chef::Resource::Template
|
86
|
+
@watch_files[resource.path] = true
|
87
|
+
when Chef::Resource::RemoteFile
|
88
|
+
@watch_files[resource.path] = true
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
begin
|
93
|
+
data_dir = "#{@config[:agent_dir]}/external.d"
|
94
|
+
if not File.directory?(data_dir)
|
95
|
+
Dir.mkdir(data_dir)
|
96
|
+
end
|
97
|
+
File.open("#{data_dir}/chef_resources.json", "w") do |f|
|
98
|
+
watchlist = []
|
99
|
+
@watch_files.keys.each do |k|
|
100
|
+
watchlist << { "path" => k }
|
101
|
+
end
|
102
|
+
f.write({ "files" => watchlist }.to_json)
|
103
|
+
end
|
104
|
+
rescue Exception => msg
|
105
|
+
Chef::Log.warn("Unable to save opsmatic agent file watch list: #{msg}")
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# submit report to the opsmatic collector
|
66
110
|
def submit(event)
|
67
111
|
Chef::Log.info("Posting chef run report to Opsmatic")
|
68
112
|
|
@@ -80,6 +124,7 @@ class Chef
|
|
80
124
|
|
81
125
|
request = Net::HTTP::Post.new(url.request_uri)
|
82
126
|
request["Content-Type"] = "application/json"
|
127
|
+
request["User-Agent"] = "Opsmatic Chef Handler #{Chef::Handler::Opsmatic::VERSION}"
|
83
128
|
request.body = event.to_json
|
84
129
|
|
85
130
|
begin
|
data/spec/opsmatic_spec.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
|
3
2
|
require 'pp'
|
4
3
|
|
5
4
|
describe "Chef::Handler::Opsmatic" do
|
@@ -7,20 +6,36 @@ describe "Chef::Handler::Opsmatic" do
|
|
7
6
|
COLLECTOR_URL = "http://api.opsmatic.com/webhooks/events/chef"
|
8
7
|
INTEGRATION_TOKEN = "xxxxx-yyyyy"
|
9
8
|
HOSTNAME = "foo.example.com"
|
9
|
+
AGENT_DIR = "/var/tmp/opsmatic"
|
10
|
+
WATCHLIST_PATH = "external.d/chef_resources.json"
|
10
11
|
|
11
12
|
@handler = Chef::Handler::Opsmatic.new(
|
12
13
|
:integration_token => INTEGRATION_TOKEN,
|
13
|
-
:collector_url => COLLECTOR_URL
|
14
|
+
:collector_url => COLLECTOR_URL,
|
15
|
+
:agent_dir => "/var/tmp/opsmatic"
|
14
16
|
)
|
15
17
|
|
16
18
|
@node = Chef::Node.build(HOSTNAME)
|
17
19
|
@node.attributes.default[:fqdn] = HOSTNAME
|
20
|
+
|
21
|
+
unless File.directory?(AGENT_DIR)
|
22
|
+
Dir.mkdir(AGENT_DIR)
|
23
|
+
end
|
18
24
|
end
|
19
25
|
|
20
26
|
before (:each) do
|
21
27
|
@events = Chef::EventDispatch::Dispatcher.new
|
22
28
|
@run_context = Chef::RunContext.new(@node, {}, @events)
|
23
29
|
@run_status = Chef::RunStatus.new(@node, @events)
|
30
|
+
|
31
|
+
# mock some resources
|
32
|
+
template = Chef::Resource::Template.new "/etc/sudoers.d/deploy_user"
|
33
|
+
cookbook = Chef::Resource::CookbookFile.new "/etc/nginx/conf.d/ssl.conf"
|
34
|
+
remote_file = Chef::Resource::RemoteFile.new "/var/db/translations.db"
|
35
|
+
|
36
|
+
@all_resources = [ template, cookbook, remote_file ]
|
37
|
+
@run_context.resource_collection.all_resources.replace(@all_resources)
|
38
|
+
|
24
39
|
@run_status.start_clock
|
25
40
|
@run_status.stop_clock
|
26
41
|
@run_status.run_context = @run_context
|
@@ -37,4 +52,37 @@ describe "Chef::Handler::Opsmatic" do
|
|
37
52
|
@handler.run_report_unsafe(@run_status)
|
38
53
|
expect a_request(:post, COLLECTOR_URL)
|
39
54
|
end
|
55
|
+
|
56
|
+
it "should write a list of resources for the opsmatic agent to watch" do
|
57
|
+
@handler.run_report_unsafe(@run_status)
|
58
|
+
expect a_request(:post, COLLECTOR_URL)
|
59
|
+
expect(File.exists?("#{AGENT_DIR}/#{WATCHLIST_PATH}")).to be true
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should write a list of resources for the opsmatic agent to watch" do
|
63
|
+
@handler.run_report_unsafe(@run_status)
|
64
|
+
expect a_request(:post, COLLECTOR_URL)
|
65
|
+
expect(File.exists?("#{AGENT_DIR}/#{WATCHLIST_PATH}")).to be true
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should be valid json containing all the resources" do
|
69
|
+
@handler.run_report_unsafe(@run_status)
|
70
|
+
expect a_request(:post, COLLECTOR_URL)
|
71
|
+
|
72
|
+
watched_files = {}
|
73
|
+
result = JSON.parse(File.read("#{AGENT_DIR}/#{WATCHLIST_PATH}"))
|
74
|
+
result["files"].each do |file|
|
75
|
+
watched_files[file["path"]] = true
|
76
|
+
end
|
77
|
+
|
78
|
+
@all_resources.each do |resource|
|
79
|
+
watched_files.delete(resource.path)
|
80
|
+
end
|
81
|
+
|
82
|
+
expect(watched_files.length).to equal(0)
|
83
|
+
end
|
84
|
+
|
85
|
+
after(:all) do
|
86
|
+
FileUtils.rmtree(AGENT_DIR)
|
87
|
+
end
|
40
88
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef-handler-opsmatic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcus Barczak
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -94,7 +94,6 @@ files:
|
|
94
94
|
- Rakefile
|
95
95
|
- chef-handler-opsmatic.gemspec
|
96
96
|
- lib/chef/handler/opsmatic.rb
|
97
|
-
- lib/chef/handler/version.rb
|
98
97
|
- spec/opsmatic_spec.rb
|
99
98
|
- spec/spec_helper.rb
|
100
99
|
homepage: https://github.com/opsmatic/chef-handler-opsmatic
|