Add coala support and fix/lint files
[integration/packaging/puppet-opendaylight.git] / CONTRIBUTING.markdown
1 # Contributing to the OpenDaylight Puppet Module
2
3 We work to make contributing easy. Please let us know if you spot something
4 we can do better.
5
6 #### Table of Contents
7
8 1. [Overview](#overview)
9 2. [Communication](#communication)
10    - [Issues](#issues)
11    - [IRC channel](#irc-channel)
12 3. [Patches](#patches)
13 4. [Testing](#testing)
14    - [Test Dependencies](#test-dependencies)
15    - [Syntax and Style Tests](#syntax-and-style-tests)
16    - [Unit Tests](#unit-tests)
17    - [System Tests](#system-tests)
18    - [Tests in Continuous Integration](#tests-in-continuous-integration)
19
20 ## Overview
21
22 We use [GitHub Issues][1] for most communication, including bug reports,
23 feature requests and questions.
24
25 We accept patches via [GitHub Pull Requests][2]. Please fork our repo,
26 make your changes, commit them to a feature branch and *submit a PR to
27 have it merged back into this project*. We'll give feedback and get it
28 merged ASAP.
29
30 ## Communication
31
32 *Please use public, documented communication instead of reaching out to
33 developers 1-1.*
34
35 Open Source projects benefit from always communicating in the open. Previously
36 answered questions end up becoming documentation for other people hitting
37 similar issues. More eyes may get your question answered faster. Doing
38 everything in the open keeps community members on an equal playing field
39 (`@<respected company>` email addresses don't get priority, good questions do).
40
41 We prefer [Issues][1] for most communication.
42
43 ### Issues
44
45 Please use our [GitHub Issues][1] freely, even for small things! They are the
46 primary method by which we track what's going on in the project.
47
48 The labels assigned to an issue can tell you important things about it.
49
50 For example, issues tagged [`good-for-beginners`][3] are likely to not require
51 much background knowledge and be fairly self-contained, perfect for people new
52 to the project who are looking to get involved.
53
54 The priority-related issue labels ([`prio:high`][4], [`piro:normal`][5]...)
55 are also important to note. They typically accurately reflect the next TODOs
56 the community will complete.
57
58 The `info:progress` labels may not always be up-to-date, but will be used when
59 appropriate (typically long-standing issues that take multiple commits).
60
61 Issues can be referenced and manipulated from git commit messages. Just
62 referencing the issue's number (`#42`) will link the commit and issue. Issues
63 can also be closed from commit messages with `closes #42` (and [a variety
64 of other key words][6]).
65
66 ### IRC channel
67
68 Feel free to join us at **#opendaylight-integration** on `chat.freenode.net`. You can also use web client for Freenode to join us at [webchat][19].
69
70 ## Patches
71
72 Please use [Pull Requests][2] to submit patches.
73
74 Basics of a pull request:
75
76 - Use the GitHub web UI to fork our repo.
77 - Clone your fork to your local system.
78 - Make your changes.
79 - Commit your changes, using a [good commit message][7] and referencing any
80   applicable issues.
81 - Push your commit.
82 - Submit a pull request against the project, again using GitHub's web UI.
83 - We'll give feedback and get your changed merged ASAP.
84 - You contributed! [Thank you][8]!
85
86 Other tips for submitting excellent pull requests:
87
88 - If you'd like to make more than one logically distinct change, please submit
89   them as different pull requests (if they don't depend on each other) or
90   different commits in the same PR (if they do).
91 - If your PR contains a number of commits that provide one logical change,
92   please squash them using `git rebase`.
93 - Please provide test coverage for your changes.
94 - If applicable, please provide documentation updates to reflect your changes.
95
96 ## Testing
97
98 ### Test Dependencies
99
100 The testing tools have a number of dependencies. We use [Bundler][9] to make
101 installing them easy.
102
103 ```
104 [~/puppet-opendaylight]$ sudo yum install -y rubygems ruby-devel gcc-c++ zlib-devel \
105                                              patch redhat-rpm-config make
106 [~/puppet-opendaylight]$ gem install bundler
107 [~/puppet-opendaylight]$ bundle install
108 [~/puppet-opendaylight]$ bundle update
109 ```
110
111 ### Syntax and Style Tests
112
113 We use [Puppet Lint][10], [Puppet Syntax][11] and [metadata-json-lint][12] to
114 validate the module's syntax and style.
115
116 ```
117 [~/puppet-opendaylight]$ bundle exec rake lint
118 [~/puppet-opendaylight]$ bundle exec rake syntax
119 [~/puppet-opendaylight]$ bundle exec rake metadata
120 ```
121
122 ### Unit Tests
123
124 We use rspec-puppet to provide unit test coverage.
125
126 To run the unit tests and generate a coverage report, use:
127
128 ```
129 [~/puppet-opendaylight]$ bundle exec rake spec
130 # Snip test output
131 Finished in 10.08 seconds (files took 0.50776 seconds to load)
132 537 examples, 0 failures
133
134
135 Total resources:   19
136 Touched resources: 19
137 Resource coverage: 100.00%
138 ```
139
140 Note that we have a very large number of tests and 100% test coverage.
141
142 To run the syntax, style and unit tests in one rake task (recommended), use:
143
144 ```
145 [~/puppet-opendaylight]$ bundle exec rake test
146 ```
147
148 ### System Tests
149
150 While the [unit tests](#unit-tests) are able to quickly find many errors,
151 they don't do much more than checking that the code compiles to a given state.
152 To verify that the Puppet module behaves as desired once applied to a real,
153 running system, we use [Beaker][13].
154
155 Beaker stands up virtual machines using Vagrant, applies the OpenDaylight
156 Puppet module with various combinations of params and uses [Serverspec][14]
157 to validate the resulting system state.
158
159 Beaker depends on Vagrant ([Vagrant downloads page][17]) for managing VMs,
160 which in turn depends on VirtualBox ([VirtualBox downloads page][18]) and
161 the `kmod-VirtualBox` package.
162
163 To run our Beaker tests against the primary target OS (CentOS 7) using the
164 recommended RPM-based install method, use:
165
166 ```
167 [~/puppet-opendaylight]$ bundle exec rake centos
168 ```
169
170 There are a number of pre-defined rake tasks to simplify running common
171 Beaker tests.
172
173 ```
174 [~/puppet-opendaylight]$ bundle exec rake centos_7_docker
175 [~/puppet-opendaylight]$ bundle exec rake centos
176 [~/puppet-opendaylight]$ bundle exec rake centos_tarball
177 [~/puppet-opendaylight]$ bundle exec rake fedora_22
178 [~/puppet-opendaylight]$ bundle exec rake ubuntu_1404
179 [~/puppet-opendaylight]$ bundle exec rake ubuntu_1404_docker
180 ```
181
182 If you'd like to preserve the Beaker VM after a test run, perhaps for manual
183 inspection or a quicker follow-up test run, use the `BEAKER_destroy`
184 environment variable.
185
186 ```
187 [~/puppet-opendaylight]$ BEAKER_destroy=no bundle exec rake centos
188 ```
189
190 You can then connect to the VM by navigating to the directory that contains
191 its Vagrantfile and using standard Vagrant commands.
192
193 ```
194 [~/puppet-opendaylight]$ cd .vagrant/beaker_vagrant_files/centos-7.yml
195 [~/puppet-opendaylight/.vagrant/beaker_vagrant_files/centos-7.yml]$ vagrant status
196 Current machine states:
197
198 centos-7                  running (virtualbox)
199 [~/puppet-opendaylight/.vagrant/beaker_vagrant_files/centos-7.yml]$ vagrant ssh
200 [vagrant@centos-7 ~]$ sudo systemctl status opendaylight
201 opendaylight.service - OpenDaylight SDN Controller
202    Loaded: loaded (/usr/lib/systemd/system/opendaylight.service; enabled)
203    Active: active (running) since Fri 2015-04-24 16:34:07 UTC; 1min 1s ago
204      Docs: https://wiki.opendaylight.org/view/Main_Page
205            http://www.opendaylight.org/
206 [vagrant@centos-7 ~]$ logout
207 [~/puppet-opendaylight/.vagrant/beaker_vagrant_files/centos-7.yml]$ vagrant destroy -f
208 ```
209
210 For more information about using Beaker, see [these docs][15].
211
212 ### Tests in Continuous Integration
213
214 We use [Travis CI][16] to run our unit, syntax and style tests against a
215 matrix of supported Ruby and Puppet versions at every commit. This currently
216 results in >8500 automated tests per commit.
217
218 [1]: https://github.com/dfarrell07/puppet-opendaylight/issues
219
220 [2]: https://github.com/dfarrell07/puppet-opendaylight/pulls
221
222 [3]: https://github.com/dfarrell07/puppet-opendaylight/labels/good-for-beginners
223
224 [4]: https://github.com/dfarrell07/puppet-opendaylight/labels/prio%3Ahigh
225
226 [5]: https://github.com/dfarrell07/puppet-opendaylight/labels/prio%3Anormal
227
228 [6]: https://help.github.com/articles/closing-issues-via-commit-messages/
229
230 [7]: http://chris.beams.io/posts/git-commit/
231
232 [8]: http://cdn3.volusion.com/74gtv.tjme9/v/vspfiles/photos/Delicious%20Dozen-1.jpg
233
234 [9]: http://bundler.io/
235
236 [10]: http://puppet-lint.com/
237
238 [11]: https://github.com/gds-operations/puppet-syntax
239
240 [12]: https://github.com/puppet-community/metadata-json-lint
241
242 [13]: https://github.com/puppetlabs/beaker
243
244 [14]: http://serverspec.org/resource_types.html
245
246 [15]: https://github.com/puppetlabs/beaker/wiki/How-to-Write-a-Beaker-Test-for-a-Module#typical-workflow
247
248 [16]: https://travis-ci.org/dfarrell07/puppet-opendaylight
249
250 [17]: https://www.vagrantup.com/downloads.html
251
252 [18]: www.virtualbox.org/wiki/Linux_Downloads
253
254 [19]: http://webchat.freenode.net/?channels=opendaylight-integration