Skip to content

Latest commit

 

History

History
94 lines (69 loc) · 3.91 KB

STYLE.md

File metadata and controls

94 lines (69 loc) · 3.91 KB

API style guidelines

Generally follow guidance at https://cloud.google.com/apis/design/, in particular for proto3 as described at:

In addition, the following conventions should be followed:

  • For protos that are frozen, the following guidelines are followed:

    • Fields should not be renumbered or have their types changed. This is standard proto development procedure.
    • If fields are deleted, the following syntax should be put in their place:
    reserved <field index>;

    E.g.,

    reserved 15;
    • Renaming of fields or package namespaces for a proto must not occur. This is inherently dangerous, since:
      • Fields renames break wire compatibility. This is stricter than standard proto development procedure in the sense that it does not break binary wire format. However, it does break loading of YAML/JSON into protos as well as text protos. Since we consider YAML/JSON to be first class inputs, we must not change field names.

      • For service definitions, the gRPC endpoint URL is inferred from package namespace, so this will break client/server communication.

      • For a message embedded in an Any object, the type URL, which the package namespace is a part of, may be used by Envoy or other API consuming code. Currently, this applies to the top-level resources embedded in DiscoveryResponse objects, e.g. Cluster, Listener, etc.

      • Consuming code will break and require source change to match the changes.

  • Non-frozen fields should be tagged with [#not-implemented-hide:], [#not-implemented-warn:], [#proto-status: draft] or [#proto-status: experimental].

  • Every proto directory should have a README.md describing its content. See for example envoy.service.

  • The data plane APIs are primarily intended for machine generation and consumption. It is expected that the management server is responsible for mapping higher level configuration concepts to concrete API concepts. Similarly, static configuration fragments may be generated by tools and UIs, etc. The APIs and tools used to generate xDS configuration are beyond the scope of the definitions in this repository.

  • Use wrapped scalar types where there is a real need for the field to have a default value that does not match the proto3 defaults (0/false/""). This should not be done for fields where the proto3 defaults make sense. All things being equal, pick appropriate logic, e.g. enable vs. disable for a bool field, such that the proto3 defaults work, but only where this doesn't result in API gymnastics.

  • Always use plural field names for repeated fields, such as filters.

  • Always use upper camel case names for message types and enum types without embedded acronyms, such as HttpRequest.

  • Prefer oneof selections to boolean overloads of fields, for example, prefer:

    oneof path_secifier {
      string simple_path = 1;
      string regex_path = 2;
    }

    to

    string path = 1;
    bool path_is_regex = 2;

    This is more efficient, extendable and self-describing.

  • To represent percentage values, use the Percent message type defined in api/base.proto.

  • For enum types, if one of the enum values is used for most cases, make it the first enum value with 0 numeric value. Otherwise, define the first enum value like TYPE_NAME_UNSPECIFIED = 0, and treat it as an error. This design pattern forces developers to explicitly choose the correct enum value for their use case, and avoid misunderstanding of the default behavior.