You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
8.0 KiB
157 lines
8.0 KiB
# API Review Checklist |
|
|
|
This checklist is intended to be used when reviewing xDS API changes. |
|
Users who wish to contribute API changes should read this and proactively |
|
consider the answers to these questions before sending a PR. |
|
|
|
## Feature Enablement |
|
- Are the default values going to cause behavior changes for existing users |
|
who do not know about the change and have not updated the resources being |
|
served by their control plane? |
|
- If yes, do we have some estimate of how many users will be affected? |
|
- Why is it justified to change the default behavior, rather than making |
|
this feature opt-in? |
|
- Some possible justifications include security concerns with existing |
|
behavior, or a desire to eliminate legacy behavior. |
|
- What is the plan to make this change in a safe way? For example, is the |
|
transition going to be staged over the course of several minor xDS versions? |
|
- How will we warn users about this change? |
|
- Possible ways to do this include release notes, announcements, warnings |
|
from the code, etc. |
|
- Will users have a way to disable this change if it causes problems? |
|
- If not, why do we think that's okay? (It might be the case that we think |
|
it will not actually affect anyone, or no one will care.) |
|
- If so, is the mechanism to disable it part of the xDS API, or is it |
|
acceptable to have a separate knob for this in the client? (See also |
|
"Genericness" below -- if this is not part of the API, will every xDS |
|
client need to add a different knob? Is consistency across clients |
|
important for this?) |
|
- If the feature is modeled as a proto3 scalar, is it plausible that its |
|
default value may change in the future? If so, it should be wrapped with |
|
a Well-Known Type (WKT), e.g. `bool` becomes `google.protobuf.BoolValue`. |
|
|
|
## Style |
|
- Is the PR aligned with the [API style guidelines](STYLE.md)? |
|
|
|
## Validation Rules |
|
- Does the field have protocgen-validate rules to enforce constraints on |
|
its value? |
|
- Is the field mandatory? Does it have the required rule? |
|
- Is the field numeric? Is it bounded correctly? |
|
- Is the field repeated? Does it have the correct min/max items numbers? Are |
|
the values unique? |
|
- If a field may eventually be repeated but initially there is a desire to |
|
cap it to a single value, consider using repeated with a max length of 1, |
|
which is easier to relax in the future. |
|
|
|
## Deprecations |
|
- When a field or enum value is deprecated, according to the minor/patch |
|
versioning policy this implies a minor version for support removal. Is the |
|
work necessary to add support for the newer replacement field acceptable to |
|
known xDS clients in this time frame? |
|
- No deprecations are allowed when an alternative is "not ready yet" in any |
|
major known xDS client (Envoy or gRPC at this point), unless the |
|
maintainers of that xDS client have signed off on the change. If you are not |
|
sure about the current state of a feature in the major known xDS clients, |
|
ask one of the API shepherds. |
|
- Is this deprecated field documented in a way that points to the preferred |
|
newer method of configuration? |
|
|
|
## Extensibility |
|
- Is this feature being directly added into the API itself, or is it being |
|
introduced via an extension point (i.e., using `TypedExtensionConfig`)? |
|
- If not via an extension point, why not? |
|
- If no appropriate extension point currently exists, is this a good |
|
opportunity to add one? Can we move some existing "core" functionality |
|
into a set of standardized plugins for an extension point? |
|
- Do we have good documentation showing what to plug into the extension point? |
|
(At minimum, it should have a comment pointing to the common protos to |
|
be plugged into the extension point.) |
|
- If an enum is being introduced, should this be a oneof with empty messages |
|
for future API growth? |
|
- When a new field is introduced for a distinct purpose, should this be a |
|
message to allow for future API growth? |
|
|
|
## Consistency |
|
- Can the proposed API reuse part or all of other APIs? |
|
- Can some other API be refactored to be part of it, or vice versa? |
|
- Example: Can it use common types such as matcher or number? |
|
- Are there similar structures that already exist? |
|
- Is the naming convention consistent with other APIs? |
|
- If there are new proto messages being added, are they in the right |
|
place in the tree? Consider not just the current users of this proto |
|
but also other possible uses in the future. Would it make more sense |
|
to make the proto a generic type and put it in a common location, so |
|
that it can be used in other places in the future? |
|
|
|
## Interactions With Other Features |
|
- Will this feature interact in strange ways with other features, either |
|
existing or planned? |
|
- For example, if you are defining a new cluster type, how will the |
|
new type implement all of the features currently configured via CDS? |
|
- If this is a change in the upstream side of the API, will it work properly |
|
with LRS load reporting? |
|
- Will there be combinations of features that won't work properly? If so, |
|
please document each combination that won't work and justify why this is |
|
okay. Is there some other way to structure this feature that would not |
|
cause conflicts with other features? |
|
- If this change involves extension configuration, how will it interact |
|
with ECDS? |
|
|
|
## Genericness |
|
- Is this an Envoy-specific or proxy-specific feature? How will it apply to |
|
xDS clients other than Envoy (e.g., gRPC)? |
|
|
|
## Dependencies |
|
- Does this feature pull in any new dependencies for clients? |
|
- Are these dependencies optional or required? |
|
- Will the dependencies cause problems for any known xDS clients (e.g., |
|
[Envoy's dependency policy](https://github.com/envoyproxy/envoy/blob/main/DEPENDENCY_POLICY.md))? |
|
|
|
## Failure Modes |
|
- What is the failure mode if this feature is configured but is not working |
|
for some reason? |
|
- Is the failure mode what users will expect/want? |
|
- Is this failure mode specified in the API, or is each client expected to |
|
handle it on its own? Consistency across clients is preferred; if there's |
|
a reason this isn't feasible, please explain. |
|
|
|
## Scalability |
|
- Does this feature add new per-request functionality? How much overhead does |
|
it add on the per-request path? |
|
- Are there ways that the API could be structured differently to make it |
|
possible to implement the feature in more efficient ways? (Even if this |
|
efficiency is not needed now, it may be something we will need in the future, |
|
and we will save pain in the long run if we structure the API in a way that |
|
gives us the flexibility to change the implementation later.) |
|
- How does this feature affect config size? For example, instead of |
|
adding a huge mandatory proto to every single route entry, consider |
|
ways of setting it at the virtual host level and then overriding only |
|
the parts that change on a per-route basis. |
|
- Will the change require multiple round trips via the REST API? |
|
|
|
## Monitoring |
|
- Is there any behavior associated with this feature that will require |
|
monitoring? |
|
- How will the data be exposed to monitoring? |
|
- Is the monitoring configuration part of the xDS API, or is it client-specific? |
|
|
|
## Documentation |
|
- Can a user look at the docs and understand it without a bunch of extra |
|
context? |
|
- Pay special attention to documentation around extensions and `typed_config`. |
|
Users generally find this extremely confusing. There should be examples |
|
showing how to configure extension points and optimally all known public |
|
extensions (there is tooling work in progress to automate this). |
|
- Larger features should contain architecture overview documentation with |
|
relevant cross-linking. |
|
- Relevant differences between clients need to be documented (in the future |
|
we will build tooling to allow for common documentation as well as per-client |
|
documentation). |
|
|
|
## Where to Put New Protos |
|
- The xDS API is currently partly in the Envoy repo and partly in the |
|
cncf/xds repo. We will move pieces of the API to the latter repo |
|
slowly over time, as they become less Envoy-specific, until eventually |
|
the whole API has been moved there. If your change involves adding |
|
new protos, they should generally go in the new repo.
|
|
|