chef-handler-sns 1.2.0 → 2.0.0
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.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +116 -170
- data/lib/chef/handler/sns.rb +245 -36
- data/lib/chef/handler/sns/config.rb +168 -36
- data/lib/chef/handler/sns/config/ohai.rb +90 -27
- data/lib/chef/handler/sns/version.rb +29 -2
- data/test/helper.rb +23 -2
- data/test/test_chef_handler_sns.rb +233 -141
- data/test/test_chef_handler_sns_config.rb +89 -71
- data/test/test_chef_handler_sns_config_ohai.rb +57 -47
- metadata +100 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c4942f7c8128f0db8c5fff746db6ce6c145633ec
|
4
|
+
data.tar.gz: 17e60816d695b726125920dfbed4dd8c2fdf4645
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8e752973f6478d533766d085c04a805ea805d9bcf06c7bba77450c6b3139517536021ead48e0d29904a9644f133d41b214a342139bb1292282768639ba36e97
|
7
|
+
data.tar.gz: bcc56c9011c521dc14f5fae3c92981cddf92c65da1021af89337d9c9f754ea5ef961cda784edbe17cae3d5acb16508c76e0fe45c7e80277f421a85b7ce654346
|
data/LICENSE
CHANGED
@@ -175,7 +175,7 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
175
175
|
|
176
176
|
END OF TERMS AND CONDITIONS
|
177
177
|
|
178
|
-
Copyright 2014
|
178
|
+
Copyright 2014 Xabier de Zuazo
|
179
179
|
|
180
180
|
Licensed under the Apache License, Version 2.0 (the "License");
|
181
181
|
you may not use this file except in compliance with the License.
|
data/README.md
CHANGED
@@ -1,30 +1,29 @@
|
|
1
1
|
# Chef Handler SNS
|
2
2
|
[](http://badge.fury.io/rb/chef-handler-sns)
|
3
|
-
[](http://www.rubydoc.info/gems/chef-handler-sns)
|
4
|
+
[](https://github.com/zuazo/chef-handler-sns)
|
5
|
+
[](#license-and-author)
|
6
|
+
|
7
|
+
[](https://gemnasium.com/zuazo/chef-handler-sns)
|
8
|
+
[](https://codeclimate.com/github/zuazo/chef-handler-sns)
|
9
|
+
[](https://travis-ci.org/zuazo/chef-handler-sns)
|
10
|
+
[](https://coveralls.io/r/zuazo/chef-handler-sns?branch=2.0.0)
|
11
|
+
[](http://inch-ci.org/github/zuazo/chef-handler-sns)
|
7
12
|
|
8
13
|
A simple Chef report handler that reports status of a Chef run through [Amazon SNS](http://aws.amazon.com/sns/), [including IAM roles support](#usage-with-amazon-iam-roles).
|
9
14
|
|
10
15
|
[Amazon SNS](http://aws.amazon.com/sns/) can send notifications by SMS, email, [Amazon SQS](http://aws.amazon.com/sqs/) queues or to any HTTP endpoint.
|
11
16
|
|
12
|
-
We recommend using the [chef_handler_sns cookbook](
|
17
|
+
We recommend using the [`chef_handler_sns` cookbook](https://supermarket.chef.io/cookbooks/chef_handler_sns) for easy installation.
|
13
18
|
|
14
19
|
This Chef Handler is heavily based on [Joshua Timberman](https://github.com/jtimberman) examples.
|
15
20
|
|
16
|
-
*
|
21
|
+
* https://docs.chef.io/handlers.html#exception-report-handlers
|
17
22
|
|
18
23
|
## Requirements
|
19
24
|
|
20
25
|
* Amazon AWS: uses Amazon SNS service.
|
21
|
-
*
|
22
|
-
* `aws-sdk` requires `nokogiri`, which also has the following requirements:
|
23
|
-
* `libxml2-dev` and `libxslt-dev` installed (optional).
|
24
|
-
* `gcc` and `make` installed (this will compile and install libxml2 and libxslt internally if not found).
|
25
|
-
* For `Ruby 1.8`, you need to install old versions of the following dependencies:
|
26
|
-
* `mime-types < 2.0`.
|
27
|
-
* `nokogiri < 1.6`.
|
26
|
+
* Ruby `2` or higher (recommended `2.1` or higher).
|
28
27
|
|
29
28
|
## Usage
|
30
29
|
|
@@ -34,190 +33,131 @@ You can install this handler in two ways:
|
|
34
33
|
|
35
34
|
You can install the RubyGem and configure Chef to use it:
|
36
35
|
|
37
|
-
gem install chef-handler-sns
|
36
|
+
$ gem install chef-handler-sns
|
38
37
|
|
39
38
|
Then add to the configuration (`/etc/chef/solo.rb` for chef-solo or `/etc/chef/client.rb` for chef-client):
|
40
39
|
|
41
40
|
```ruby
|
42
|
-
require
|
41
|
+
require 'chef/handler/sns'
|
43
42
|
|
44
43
|
# Create the handler
|
45
44
|
sns_handler = Chef::Handler::Sns.new
|
46
45
|
|
47
46
|
# Your Amazon AWS credentials
|
48
|
-
sns_handler.access_key
|
49
|
-
sns_handler.secret_key
|
47
|
+
sns_handler.access_key '***AMAZON-KEY***'
|
48
|
+
sns_handler.secret_key '***AMAZON-SECRET***'
|
50
49
|
|
51
50
|
# Some Amazon SNS configurations
|
52
|
-
sns_handler.topic_arn
|
53
|
-
sns_handler.region
|
51
|
+
sns_handler.topic_arn 'arn:aws:sns:***'
|
52
|
+
sns_handler.region 'us-east-1' # optional
|
54
53
|
|
55
54
|
# Add your handler
|
56
55
|
exception_handlers << sns_handler
|
57
56
|
```
|
58
57
|
|
59
|
-
### Method 2: in a Recipe with the chef_handler LWRP
|
58
|
+
### Method 2: in a Recipe with the `chef_handler` LWRP
|
60
59
|
|
61
60
|
**Note:** This method will not catch errors before the convergence phase. Use the previous method if you want to be able to report such errors.
|
62
61
|
|
63
|
-
Use the [chef_handler LWRP](
|
62
|
+
Use the [`chef_handler` LWRP](https://supermarket.chef.io/cookbooks/chef_handler), creating a recipe with the following:
|
64
63
|
|
65
64
|
```ruby
|
66
65
|
# Handler configuration options
|
67
66
|
argument_array = [
|
68
|
-
:
|
69
|
-
:
|
70
|
-
:
|
67
|
+
access_key: '***AMAZON-KEY***',
|
68
|
+
secret_key: '***AMAZON-SECRET***',
|
69
|
+
topic_arn: 'arn:aws:sns:***'
|
71
70
|
]
|
72
71
|
|
73
|
-
# Depends on the `xml` cookbook to install nokogiri
|
74
|
-
include_recipe "xml::ruby"
|
75
|
-
|
76
72
|
# Install the `chef-handler-sns` RubyGem during the compile phase
|
77
|
-
chef_gem
|
78
|
-
|
79
|
-
# Then activate the handler with the `chef_handler` LWRP
|
80
|
-
chef_handler "Chef::Handler::Sns" do
|
81
|
-
source "#{Gem::Specification.find_by_name("chef-handler-sns").lib_dirs_glob}/chef/handler/sns"
|
82
|
-
arguments argument_array
|
83
|
-
supports :exception => true
|
84
|
-
action :enable
|
73
|
+
chef_gem 'chef-handler-sns' do
|
74
|
+
compile_time true # Only for Chef 12
|
85
75
|
end
|
86
|
-
```
|
87
|
-
|
88
|
-
#### Method 2.1: in a Recipe with the chef_handler LWRP Using Gem < 1.8.6
|
89
|
-
|
90
|
-
If you have an old version of gem package (< 1.8.6) without `find_by_name` or old chef-client (< 0.10.10) without `chef_gem`, you can try creating a recipe similar to the following:
|
91
|
-
|
92
|
-
```ruby
|
93
|
-
# Handler configuration options
|
94
|
-
argument_array = [
|
95
|
-
:access_key => "***AMAZON-KEY***",
|
96
|
-
:secret_key => "***AMAZON-SECRET***",
|
97
|
-
:topic_arn => "arn:aws:sns:***",
|
98
|
-
]
|
99
|
-
|
100
|
-
# Depends on the `xml` cookbook to install nokogiri
|
101
|
-
include_recipe "xml::ruby"
|
102
|
-
|
103
|
-
# Install the `chef-handler-sns` RubyGem during the compile phase
|
104
|
-
if defined?(Chef::Resource::ChefGem)
|
105
|
-
chef_gem "chef-handler-sns"
|
106
|
-
else
|
107
|
-
gem_package("chef-handler-sns") do
|
108
|
-
action :nothing
|
109
|
-
end.run_action(:install)
|
110
|
-
end
|
111
|
-
|
112
|
-
# Get the installed `chef-handler-sns` gem path
|
113
|
-
sns_handler_path = Gem::Specification.respond_to?("find_by_name") ?
|
114
|
-
Gem::Specification.find_by_name("chef-handler-sns").lib_dirs_glob :
|
115
|
-
Gem.all_load_paths.grep(/chef-handler-sns/).first
|
116
76
|
|
117
77
|
# Then activate the handler with the `chef_handler` LWRP
|
118
|
-
chef_handler
|
119
|
-
source
|
78
|
+
chef_handler 'Chef::Handler::Sns' do
|
79
|
+
source 'chef/handler/sns'
|
120
80
|
arguments argument_array
|
121
|
-
supports :
|
81
|
+
supports exception: true
|
122
82
|
action :enable
|
123
83
|
end
|
124
84
|
```
|
125
85
|
|
126
|
-
|
86
|
+
See the [`chef_handler_sns` cookbook provider code](https://github.com/zuazo/chef_handler_sns-cookbook/blob/master/providers/default.rb) for a more complete working example.
|
127
87
|
|
128
|
-
|
88
|
+
### Method 3: Using the `chef-client` Cookbook
|
129
89
|
|
130
|
-
|
131
|
-
--------------
|
132
|
-
Could not find 'chef-handler-sns' (>= 0) among XX total gem(s)
|
133
|
-
|
134
|
-
To fix this error, you should get the handler installation path using a code similar to the following:
|
90
|
+
You can also use the `node['chef_client']['config']` attribute of the [`chef-client`](https://github.com/chef-cookbooks/chef-client/tree/v4.3.2#start-report-exception-handlers) cookbook:
|
135
91
|
|
136
92
|
```ruby
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
include_recipe "xml::ruby"
|
146
|
-
|
147
|
-
# Install the `chef-handler-sns` RubyGem during the compile phase
|
148
|
-
chef_gem "chef-handler-sns"
|
149
|
-
|
150
|
-
# Get the installed `chef-handler-sns` gem path from Bundler
|
151
|
-
sns_handler_path = nil
|
152
|
-
bundle_path = ::File.join(Bundler.bundle_path.to_s, "specifications")
|
153
|
-
Dir[::File.join(bundle_path, "*.gemspec")].each do |path|
|
154
|
-
spec = Gem::Specification.load(path.untaint)
|
155
|
-
if spec.name == "chef-handler-sns"
|
156
|
-
sns_handler_path = spec.lib_dirs_glob
|
157
|
-
end
|
158
|
-
end
|
159
|
-
if sns_handler_path.nil?
|
160
|
-
Chef::Application.fatal!("chef-handler-sns not found inside Bundler path: #{bundle_path}")
|
161
|
-
end
|
162
|
-
|
163
|
-
# Then activate the handler with the `chef_handler` LWRP
|
164
|
-
chef_handler "Chef::Handler::Sns" do
|
165
|
-
source "#{Gem::Specification.find_by_name("chef-handler-sns").lib_dirs_glob}/chef/handler/sns"
|
166
|
-
arguments argument_array
|
167
|
-
supports :exception => true
|
168
|
-
action :enable
|
169
|
-
end
|
93
|
+
node.default['chef_client']['config']['exception_handlers'] = [{
|
94
|
+
'class' => 'Chef::Handler::Sns',
|
95
|
+
'arguments' => {
|
96
|
+
access_key: '***AMAZON-KEY***',
|
97
|
+
secret_key: '***AMAZON-SECRET***',
|
98
|
+
topic_arn: 'arn:aws:sns:***'
|
99
|
+
}.map { |k, v| "#{k}: #{v.inspect}" }
|
100
|
+
}]
|
170
101
|
```
|
171
102
|
|
172
|
-
See the [`chef_handler_sns` cookbook provider code](https://github.com/onddo/chef_handler_sns-cookbook/blob/master/providers/default.rb) for a more complete working example.
|
173
|
-
|
174
103
|
### Usage with Amazon IAM Roles
|
175
104
|
|
176
105
|
If you are using AWS [IAM roles](http://docs.aws.amazon.com/IAM/latest/UserGuide/WorkingWithRoles.html) with your server, probably you only need to specify the `topic_arn` parameter. A few simple examples:
|
177
106
|
|
178
|
-
#### Method 1: in the Chef Config File
|
107
|
+
#### IAM Roles Method 1: in the Chef Config File
|
179
108
|
|
180
109
|
You can install the RubyGem and configure Chef to use it:
|
181
110
|
|
182
|
-
gem install chef-handler-sns
|
111
|
+
$ gem install chef-handler-sns
|
183
112
|
|
184
113
|
Then add to the configuration (`/etc/chef/solo.rb` for chef-solo or `/etc/chef/client.rb` for chef-client):
|
185
114
|
|
186
115
|
```ruby
|
187
|
-
require
|
116
|
+
require 'chef/handler/sns'
|
188
117
|
|
189
|
-
exception_handlers << Chef::Handler::Sns.new(
|
190
|
-
:
|
191
|
-
|
118
|
+
exception_handlers << Chef::Handler::Sns.new(
|
119
|
+
topic_arn: 'arn:aws:sns:us-east-1:12341234:MyTopicName'
|
120
|
+
)
|
192
121
|
```
|
193
122
|
|
194
|
-
#### Method 2: in a Recipe with the chef_handler LWRP
|
123
|
+
#### IAM Roles Method 2: in a Recipe with the `chef_handler` LWRP
|
195
124
|
|
196
|
-
Use the [chef_handler LWRP](
|
125
|
+
Use the [`chef_handler` LWRP](https://supermarket.chef.io/cookbooks/chef_handler), creating a recipe with the following:
|
197
126
|
|
198
127
|
```ruby
|
199
|
-
# Depends on the `xml` cookbook to install nokogiri
|
200
|
-
include_recipe "xml::ruby"
|
201
|
-
|
202
128
|
# Install the `chef-handler-sns` RubyGem during the compile phase
|
203
|
-
chef_gem
|
129
|
+
chef_gem 'chef-handler-sns' do
|
130
|
+
compile_time true # Only for Chef 12
|
131
|
+
end
|
204
132
|
|
205
133
|
# Then activate the handler with the `chef_handler` LWRP
|
206
|
-
chef_handler
|
207
|
-
source
|
208
|
-
arguments
|
209
|
-
supports :
|
134
|
+
chef_handler 'Chef::Handler::Sns' do
|
135
|
+
source 'chef/handler/sns'
|
136
|
+
arguments topic_arn: 'arn:aws:sns:us-east-1:12341234:MyTopicName'
|
137
|
+
supports exception: true
|
210
138
|
action :enable
|
211
139
|
end
|
212
140
|
```
|
213
141
|
|
142
|
+
### IAM Roles Method 3: Using the `chef-client` Cookbook
|
143
|
+
|
144
|
+
You can also use the `node['chef_client']['config']` attribute of the [`chef-client`](https://github.com/chef-cookbooks/chef-client/tree/v4.3.2#start-report-exception-handlers) cookbook:
|
145
|
+
|
146
|
+
```ruby
|
147
|
+
node.default['chef_client']['config']['exception_handlers'] = [{
|
148
|
+
'class' => 'Chef::Handler::Sns',
|
149
|
+
'arguments' => ['topic_arn: "arn:aws:sns:***"']
|
150
|
+
}]
|
151
|
+
```
|
152
|
+
|
214
153
|
#### OpsWorks: Filter Notifications by Activity
|
154
|
+
|
215
155
|
An optional array of OpsWorks activities can be supplied. If the array is set, notifications will
|
216
156
|
only be triggered for the activities in the array, everything else will be discarded.
|
217
157
|
|
218
158
|
```ruby
|
219
159
|
argument_array = [
|
220
|
-
:
|
160
|
+
filter_opsworks_activities: %w(deploy configure)
|
221
161
|
]
|
222
162
|
```
|
223
163
|
|
@@ -225,41 +165,46 @@ argument_array = [
|
|
225
165
|
|
226
166
|
The following options are available to configure the handler:
|
227
167
|
|
228
|
-
* `access_key` - AWS access key (required, but will try to read it from
|
229
|
-
* `secret_key` - AWS secret key (required, but will try to read it from
|
230
|
-
* `token` - AWS security token (optional, read from
|
168
|
+
* `access_key` - AWS access key (required, but will try to read it from Ohai with IAM roles).
|
169
|
+
* `secret_key` - AWS secret key (required, but will try to read it from Ohai with IAM roles).
|
170
|
+
* `token` - AWS security token (optional, read from Ohai with IAM roles). Set to `false` to disable the token detected by Ohai.
|
231
171
|
* `topic_arn` - AWS topic ARN name (required).
|
232
172
|
* `region` - AWS region (optional).
|
233
173
|
* `subject` - Message subject string in erubis format (optional).
|
234
174
|
* `body_template` - Full path of an erubis template file to use for the message body (optional).
|
235
175
|
* `filter_opsworks_activities` - An array of OpsWorks activities to be triggered with (optional). When set, everything else will be discarded.
|
236
176
|
|
237
|
-
**Note:** When the machine has an IAM role, will try to read the credentials from
|
177
|
+
**Note:** When the machine has an IAM role, will try to read the credentials from Ohai. So in the best case, you only need to specify the `topic_arn`.
|
238
178
|
|
239
|
-
### subject
|
179
|
+
### `subject` Configuration Option
|
240
180
|
|
241
181
|
Here is an example of the `subject` configuration option using the ruby configuration file (`solo.rb` or `client.rb`):
|
242
182
|
|
243
183
|
```ruby
|
244
|
-
sns_handler.subject
|
184
|
+
sns_handler.subject(
|
185
|
+
"Chef-run: <%= node.name %> - <%= run_status.success? ? 'ok' : 'error' %>"
|
186
|
+
)
|
245
187
|
```
|
246
188
|
|
247
|
-
Using the [chef_handler LWRP](
|
189
|
+
Using the [`chef_handler` LWRP](https://supermarket.chef.io/cookbooks/chef_handler):
|
190
|
+
|
248
191
|
```ruby
|
249
192
|
argument_array = [
|
250
|
-
:
|
251
|
-
:
|
252
|
-
:
|
253
|
-
|
193
|
+
access_key: '***AMAZON-KEY***',
|
194
|
+
secret_key: '***AMAZON-SECRET***',
|
195
|
+
topic_arn: 'arn:aws:sns:***',
|
196
|
+
subject:
|
197
|
+
"Chef-run: <%= node.name %> - <%= run_status.success? ? 'ok' : 'error' %>"
|
254
198
|
# [...]
|
255
199
|
]
|
256
|
-
|
200
|
+
|
201
|
+
chef_handler 'Chef::Handler::Sns' do
|
257
202
|
# [...]
|
258
203
|
arguments argument_array
|
259
204
|
end
|
260
205
|
```
|
261
206
|
|
262
|
-
The following variables are
|
207
|
+
The following variables are accessible inside the template:
|
263
208
|
|
264
209
|
* `start_time` - The time the chef run started.
|
265
210
|
* `end_time` - The time the chef run ended.
|
@@ -268,48 +213,49 @@ The following variables are accesible inside the template:
|
|
268
213
|
* `exception` - The uncaught Exception that terminated the chef run, or nil if the run completed successfully.
|
269
214
|
* `backtrace` - The backtrace captured by the uncaught exception that terminated the chef run, or nil if the run completed successfully.
|
270
215
|
* `node` - The Chef::Node for this client run.
|
271
|
-
* `all_resources` - An Array containing all resources in the chef
|
216
|
+
* `all_resources` - An Array containing all resources in the chef-run resource collection.
|
272
217
|
* `updated_resources` - An Array containing all resources that were updated during the chef run.
|
273
218
|
* `success?` - Was the chef run successful? True if the chef run did not raise an uncaught exception.
|
274
219
|
* `failed?` - Did the chef run fail? True if the chef run raised an uncaught exception.
|
275
220
|
|
276
|
-
### body_template
|
221
|
+
### `body_template` Configuration Option
|
277
222
|
|
278
|
-
This configuration option needs to contain the full path of an
|
223
|
+
This configuration option needs to contain the full path of an Erubis template. For example:
|
279
224
|
|
280
225
|
```ruby
|
281
|
-
# recipe
|
226
|
+
# recipe 'myapp::sns_handler'
|
282
227
|
|
283
|
-
cookbook_file
|
284
|
-
path
|
228
|
+
cookbook_file 'chef_handler_sns_body.erb' do
|
229
|
+
path '/tmp/chef_handler_sns_body.erb'
|
285
230
|
# [...]
|
286
231
|
end
|
287
232
|
|
288
233
|
argument_array = [
|
289
|
-
:
|
290
|
-
:
|
291
|
-
:
|
292
|
-
:
|
234
|
+
access_key: '***AMAZON-KEY***',
|
235
|
+
secret_key: '***AMAZON-SECRET***',
|
236
|
+
topic_arn: 'arn:aws:sns:***',
|
237
|
+
body_template: '/tmp/chef_handler_sns_body.erb'
|
293
238
|
# [...]
|
294
239
|
]
|
295
|
-
|
240
|
+
|
241
|
+
chef_handler 'Chef::Handler::Sns' do
|
296
242
|
# [...]
|
297
243
|
arguments argument_array
|
298
244
|
end
|
299
245
|
```
|
300
246
|
|
301
247
|
```erb
|
302
|
-
<%# file
|
248
|
+
<%# file 'myapp/files/default/chef_handler_sns_body.erb' %>
|
303
249
|
|
304
250
|
Node Name: <%= node.name %>
|
305
|
-
<% if node.attribute?(
|
251
|
+
<% if node.attribute?('fqdn') -%>
|
306
252
|
Hostname: <%= node.fqdn %>
|
307
253
|
<% end -%>
|
308
254
|
|
309
255
|
Chef Run List: <%= node.run_list.to_s %>
|
310
256
|
Chef Environment: <%= node.chef_environment %>
|
311
257
|
|
312
|
-
<% if node.attribute?(
|
258
|
+
<% if node.attribute?('ec2') -%>
|
313
259
|
Instance Id: <%= node.ec2.instance_id %>
|
314
260
|
Instance Public Hostname: <%= node.ec2.public_hostname %>
|
315
261
|
Instance Hostname: <%= node.ec2.hostname %>
|
@@ -329,15 +275,15 @@ Stacktrace:
|
|
329
275
|
<% end -%>
|
330
276
|
```
|
331
277
|
|
332
|
-
See the [subject](#subject) documentation for more details on the variables
|
278
|
+
See the [subject](#subject) documentation for more details on the variables accessible inside the template.
|
333
279
|
|
334
280
|
## IAM Role Credentials from Ohai
|
335
281
|
|
336
|
-
IAM Role information and credentials are gathered from
|
282
|
+
IAM Role information and credentials are gathered from Ohai by default if they exists.
|
337
283
|
|
338
|
-
No aditional
|
284
|
+
No aditional Ohai plugin is required. This is natively supported by Ohai since version `6.16.0` ([OHAI-400](https://tickets.opscode.com/browse/OHAI-400)).
|
339
285
|
|
340
|
-
These are the used
|
286
|
+
These are the used Ohai attributes:
|
341
287
|
|
342
288
|
```
|
343
289
|
ec2
|
@@ -350,29 +296,29 @@ ec2
|
|
350
296
|
└── Token
|
351
297
|
```
|
352
298
|
|
353
|
-
##
|
354
|
-
|
355
|
-
Minitest tests can be run as usual:
|
299
|
+
## Testing
|
356
300
|
|
357
|
-
|
301
|
+
See [TESTING.md](https://github.com/zuazo/chef-handler-sns/blob/master/TESTING.md).
|
358
302
|
|
359
303
|
## Contributing
|
360
304
|
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
305
|
+
Please do not hesitate to [open an issue](https://github.com/zuazo/chef-handler-sns/issues/new) with any questions or problems.
|
306
|
+
|
307
|
+
See [CONTRIBUTING.md](https://github.com/zuazo/chef-handler-sns/blob/master/CONTRIBUTING.md).
|
308
|
+
|
309
|
+
## TODO
|
310
|
+
|
311
|
+
See [TODO.md](https://github.com/zuazo/chef-handler-sns/blob/master/TODO.md).
|
367
312
|
|
368
313
|
## License and Author
|
369
314
|
|
370
315
|
| | |
|
371
316
|
|:---------------------|:-----------------------------------------|
|
372
|
-
| **Author:** | [Xabier de Zuazo](https://github.com/zuazo) (<xabier@
|
317
|
+
| **Author:** | [Xabier de Zuazo](https://github.com/zuazo) (<xabier@zuazo.org>)
|
373
318
|
| **Contributor:** | [Florian Holzhauer](https://github.com/fh)
|
374
319
|
| **Contributor:** | [Michael Hobbs](https://github.com/michaelshobbs)
|
375
|
-
| **Copyright:** | Copyright (c)
|
320
|
+
| **Copyright:** | Copyright (c) 2015 Xabier de Zuazo
|
321
|
+
| **Copyright:** | Copyright (c) 2013-2014 Onddo Labs, SL.
|
376
322
|
| **License:** | Apache License, Version 2.0
|
377
323
|
|
378
324
|
Licensed under the Apache License, Version 2.0 (the "License");
|