| jrperritt | 9b7b9e6 | 2016-07-11 22:30:50 -0500 | [diff] [blame] | 1 | |
| 2 | ## On Pull Requests |
| 3 | |
| 4 | - Before you start a PR there needs to be a Github issue and a discussion about it |
| 5 | on that issue with a core contributor, even if it's just a 'SGTM'. |
| 6 | |
| 7 | - A PR's description must reference the issue it closes with a `For <ISSUE NUMBER>` (e.g. For #293). |
| 8 | |
| 9 | - A PR's description must contain link(s) to the line(s) in the OpenStack |
| 10 | source code (on Github) that prove(s) the PR code to be valid. Links to documentation |
| 11 | are not good enough. The link(s) should be to a non-`master` branch. For example, |
| 12 | a pull request implementing the creation of a Neutron v2 subnet might put the |
| 13 | following link in the description: |
| jrperritt | 792d51f | 2016-07-18 11:48:55 -0500 | [diff] [blame] | 14 | |
| jrperritt | 9b7b9e6 | 2016-07-11 22:30:50 -0500 | [diff] [blame] | 15 | https://github.com/openstack/neutron/blob/stable/mitaka/neutron/api/v2/attributes.py#L749 |
| jrperritt | 792d51f | 2016-07-18 11:48:55 -0500 | [diff] [blame] | 16 | |
| jrperritt | 9b7b9e6 | 2016-07-11 22:30:50 -0500 | [diff] [blame] | 17 | From that link, a reviewer (or user) can verify the fields in the request/response |
| 18 | objects in the PR. |
| 19 | |
| 20 | - A PR that is in-progress should have `[wip]` in front of the PR's title. When |
| 21 | ready for review, remove the `[wip]` and ping a core contributor with an `@`. |
| 22 | |
| jrperritt | c0df521 | 2017-01-20 14:14:37 -0600 | [diff] [blame] | 23 | - Forcing PRs to be small can have the effect of users submitting PRs in a hierarchical chain, with |
| 24 | one depending on the next. If a PR depends on another one, it should have a [Pending #PRNUM] |
| 25 | prefix in the PR title. In addition, it will be the PR submitter's responsibility to remove the |
| 26 | [Pending #PRNUM] tag once the PR has been updated with the merged, dependent PR. That will |
| 27 | let reviewers know it is ready to review. |
| 28 | |
| jrperritt | 9b7b9e6 | 2016-07-11 22:30:50 -0500 | [diff] [blame] | 29 | - A PR should be small. Even if you intend on implementing an entire |
| 30 | service, a PR should only be one route of that service |
| 31 | (e.g. create server or get server, but not both). |
| 32 | |
| 33 | - Unless explicitly asked, do not squash commits in the middle of a review; only |
| 34 | append. It makes it difficult for the reviewer to see what's changed from one |
| 35 | review to the next. |
| 36 | |
| 37 | ## On Code |
| 38 | |
| 39 | - In re design: follow as closely as is reasonable the code already in the library. |
| 40 | Most operations (e.g. create, delete) admit the same design. |
| 41 | |
| 42 | - Unit tests and acceptance (integration) tests must be written to cover each PR. |
| 43 | Tests for operations with several options (e.g. list, create) should include all |
| 44 | the options in the tests. This will allow users to verify an operation on their |
| 45 | own infrastructure and see an example of usage. |
| 46 | |
| 47 | - If in doubt, ask in-line on the PR. |
| jrperritt | 792d51f | 2016-07-18 11:48:55 -0500 | [diff] [blame] | 48 | |
| 49 | ### File Structure |
| 50 | |
| 51 | - The following should be used in most cases: |
| 52 | |
| 53 | - `requests.go`: contains all the functions that make HTTP requests and the |
| 54 | types associated with the HTTP request (parameters for URL, body, etc) |
| 55 | - `results.go`: contains all the response objects and their methods |
| 56 | - `urls.go`: contains the endpoints to which the requests are made |
| 57 | |
| 58 | ### Naming |
| 59 | |
| 60 | - For methods on a type in `response.go`, the receiver should be named `r` and the |
| 61 | variable into which it will be unmarshalled `s`. |
| 62 | |
| 63 | - Functions in `requests.go`, with the exception of functions that return a |
| 64 | `pagination.Pager`, should be named returns of the name `r`. |
| 65 | |
| 66 | - Functions in `requests.go` that accept request bodies should accept as their |
| 67 | last parameter an `interface` named `<Action>OptsBuilder` (eg `CreateOptsBuilder`). |
| 68 | This `interface` should have at the least a method named `To<Resource><Action>Map` |
| 69 | (eg `ToPortCreateMap`). |
| 70 | |
| 71 | - Functions in `requests.go` that accept query strings should accept as their |
| 72 | last parameter an `interface` named `<Action>OptsBuilder` (eg `ListOptsBuilder`). |
| 73 | This `interface` should have at the least a method named `To<Resource><Action>Query` |
| 74 | (eg `ToServerListQuery`). |