sigs.k8s.io/gateway-api@v1.0.0/geps/gep-1709.md (about)

     1  # GEP-1709: Conformance Profiles
     2  
     3  * Issue: [#1709](https://github.com/kubernetes-sigs/gateway-api/issues/1709)
     4  * Status: Experimental
     5  * Probationary Period: Re-evaluate in February 2024
     6  
     7  ## TLDR
     8  
     9  Add high level profiles for conformance tests which implementations can select
    10  when running the conformance test suite. Also add opt-in automated conformance
    11  reporting to the conformance test suite to report conformance results back to
    12  the Gateway API project and receive recognition (e.g. badges).
    13  
    14  ## Goals
    15  
    16  - Add high level profiles which downstream implementations can subscribe to in
    17    order to run tests for the associated supported feature sets.
    18  - Add a reporting mechanism where conformance results can be reported back to
    19    the Gateway API project and provide "badges" to visibly decorate the
    20    implementations as conformant according to their profiles.
    21  - Expand conformance testing documentation significantly so that it becomes the
    22    "landing zone" for new prospective implementations and provides a clear and
    23    iterative process for how to get started implementing Gateway API support.
    24  
    25  ## Non-Goals
    26  
    27  - We want to avoid adding any infrastructure for the reporting mechanism if
    28    feasible.
    29  - For this iteration we don't want to add configuration files for conformance
    30    tests, instead leaving that to future iterations and working on the raw
    31    machinery here (see [alternatives considered](#alternatives-considered)).
    32  - For this iteration we don't want to add container images for conformance test
    33    runs, instead leaving that to future iterations (see
    34    [alternatives considered](#alternatives-considered).
    35  
    36  ## Introduction
    37  
    38  Since our conformance test suite was conceived of it's been our desire to
    39  provide simple high level profiles that downstream implementations can
    40  subscribe to.
    41  
    42  Today we have `SupportedFeatures` which get us some of what we want in terms of
    43  easily configuring the conformance test suite, but in this GEP we will describe
    44  taking that a step further (and a level higher) to create named profiles which
    45  indicate a "level of conformance" which implementations can prove they satisfy
    46  and receive certification for.
    47  
    48  An API will be provided as the format for conformance test reports. We will
    49  provide tooling to assist with the reporting and certification process of
    50  submitting those reports and displaying the results.
    51  
    52  ## API
    53  
    54  The API for conformance profiles will include an API resource called
    55  `ConformanceReport` which will be at the center of a workflow that
    56  implementations can opt into to generate and submit those resources.
    57  
    58  The workflow implementers will follow will include the following high-level
    59  steps:
    60  
    61  1. select a [profile](#profiles)
    62  2. [integrate](#integration) tests in the downstream project
    63  3. [report results and get certified](#certification)
    64  
    65  The goal is to make selecting a conformance profile as simple and automatic of a
    66  process as feasible and support both the existing command line integration
    67  approach (e.g. `go test`) as well as a [Golang][go] approach using the
    68  conformance suite as a library.
    69  
    70  [go]:https://go.dev
    71  
    72  ### Profiles
    73  
    74  "Profiles" are effectively categories which represent the high level grouping of
    75  tests related to some feature (or feature set) of Gateway API. When conformance
    76  is reported using one of these profiles extra features can be covered according
    77  to support levels:
    78  
    79  - `core`
    80  - `extended`
    81  
    82  > **NOTE**: `implementation-specific` doesn't really have much in the way of
    83  > tests today, but it is something users want to be able to display. We leave
    84  > door open for it later and mention it in the [alternatives
    85  > considered](#alternatives-considered) section below.
    86  
    87  We will start with the following named profiles:
    88  
    89  - `HTTP`
    90  - `TLSPassthrough`
    91  
    92  These profiles correspond with `*Route` type APIs that we currently have tests
    93  for. As the tests roll in, we'll also eventually have:
    94  
    95  - `UDP`
    96  - `TCP`
    97  - `GRPC`
    98  
    99  > **NOTE**: In time we may have higher level groupings, like `Layer4` (which
   100  > would include at least `TCP` and `UDP`) but feedback from the community has
   101  > been strong for a preference on the `*Route` level (see the
   102  > [alternatives considered](#alternatives-considered) for some more notes on
   103  > this) for the moment.
   104  
   105  > **NOTE**: APIs that are referenced to or by `*Route` APIs will be tested as
   106  > a part of a profile. For instance, running the `HTTP` profile will also run
   107  > tests for `GatewayClass` and `Gateway` implicitly as these are required
   108  > components of supporting `HTTP`.
   109  
   110  The technical implementation of these profiles is very simple: effectively a
   111  "profile" is a static compilation of existing [SupportedFeatures][feat] which
   112  represent the named category. Features that aren't covered under a "core" level
   113  of support are opt-in.
   114  
   115  [feat]:https://github.com/kubernetes-sigs/gateway-api/blob/c61097edaa3b1fad29721e787fee4b02c35e3103/conformance/utils/suite/suite.go#L33
   116  
   117  ### Integration
   118  
   119  Integrating the test suite into your implementation can be done using one of
   120  the following methods:
   121  
   122  - The [go test][go-test] command line interface which enables projects of any
   123    language to run the test suite on any platform [Golang][go] supports.
   124  - Using the conformance test suite as a [Golang library][lib] within an already
   125    existing test suite.
   126  
   127  > **NOTE**: Usage as a library is already an established colloquialism in the
   128  > community, this effort simply intends to make that more official.
   129  
   130  Conformance profiles are passed as arguments when running the test suite. For
   131  instance when running via command line:
   132  
   133  ```console
   134  $ go test ./conformance/... -args -gateway-class=acme -conformance-profile=Layer7
   135  ```
   136  
   137  Or the equivalent configuration using the Golang library:
   138  
   139  ```go
   140  cSuite, err := suite.New(suite.Options{
   141      GatewayClassName: "acme",
   142      Profiles: sets.New(Layer7),
   143      // other options
   144  })
   145  require.NoError(t, err, "misconfigured conformance test suite")
   146  cSuite.Setup(t)
   147  
   148  for i := 0; i < len(tests.ConformanceTests); i++ {
   149      test := tests.ConformanceTests[i]
   150      test.Run(t, cSuite)
   151  }
   152  ```
   153  
   154  > **NOTE**: In the `suite.Options` above it's still possible to add `SkipTests`
   155  > but when used in conjunction with `Profile` this will result in a report that
   156  > the profile is not valid for reporting. Implementations in this state may be
   157  > able to report themselves as "in progress", see the
   158  > [certification section](#certification) for details.
   159  
   160  Alternatively for an `Extended` conformance profile where not all of the
   161  features are implemented (as described in the [profiles](#profiles) section
   162  above):
   163  
   164  ```console
   165  $ go test ./conformance/... -args \
   166      -gateway-class=acme \
   167      -conformance-profiles=HTTP,TCP \
   168      -unsupported-features=HTTPResponseHeaderModification,HTTPRouteMethodMatching,HTTPRouteQueryParamMatching,
   169  ```
   170  
   171  Or the equivalent configuration using the Golang library:
   172  
   173  ```go
   174  cSuite, err := suite.New(suite.Options{
   175      GatewayClassName: "acme",
   176      Profiles: sets.New(
   177          HTTP,
   178          TCP,
   179      ),
   180      UnsupportedFeatures: sets.New(
   181          suite.SupportHTTPResponseHeaderModification,
   182          suite.SupportHTTPRouteMethodMatching,
   183          suite.SupportHTTPRouteQueryParamMatching,
   184      ),
   185      // other options
   186  })
   187  require.NoError(t, err, "misconfigured conformance test suite")
   188  cSuite.Setup(t)
   189  
   190  for i := 0; i < len(tests.ConformanceTests); i++ {
   191      test := tests.ConformanceTests[i]
   192      test.Run(t, cSuite)
   193  }
   194  ```
   195  
   196  > **NOTE**: You can't disable features that are `Core` conformance as `Core` is
   197  > a minimum requirement for the profile to be considered fulfilled.
   198  
   199  Some implementations may support more or less extended features than others,
   200  so in some cases it could be cumbersome to have to list ALL features that you
   201  _don't_ support so we optionally and inversely allow `SupportedFeatures` so
   202  you can pick which option makes sense to you, and under the hood the
   203  expressions will compile to the same overall list:
   204  
   205  ```go
   206  cSuite, err := suite.New(suite.Options{
   207      GatewayClassName: "acme",
   208      Profiles: sets.New(
   209          HTTP,
   210          TCP,
   211      ),
   212      SupportedFeatures: sets.New(
   213          suite.SupportHTTPRouteMethodMatching,
   214      ),
   215      // other options
   216  })
   217  ```
   218  
   219  > **NOTE**: The `UnsupportedFeatures` and `SupportedFeatures` fields are
   220  > mutually exclusive.
   221  
   222  So to have your YAML report include details about extended features you support
   223  you must either opt-in using `SupportedFeatures` to the exact features you
   224  support, or opt-out of the features you _don't_ support using
   225  `UnsupportedFeatures`.
   226  
   227  Once an implementation has integrated with the conformance test suite, they can
   228  move on to [certification](#certification) to report the results.
   229  
   230  [go-test]:https://go.dev/doc/tutorial/add-a-test
   231  [go]:https://go.dev
   232  [lib]:https://pkg.go.dev/sigs.k8s.io/gateway-api@v0.6.2/conformance/utils/suite
   233  
   234  ### Gateway API version and channel
   235  
   236  The certification is related to a specific API version and a specific channel,
   237  therefore such information must be included in the final report. At test suite
   238  setup time, the conformance profile machinery gets all the CRDs with the field
   239  `.spec.group` equal to `gateway.networking.k8s.io`, and for each of them checks
   240  the annotations `gateway.networking.k8s.io/bundle-version` and
   241  `gateway.networking.k8s.io/channel`. If there are `CRD`s with different
   242  versions, the certification fails specifying that it's not possible to run the
   243  tests as there are different Gateway API versions installed in the cluster. If
   244  there are CRDs with different channels, the certification fails specifying that
   245  it's not possible to run the tests as there are different Gateway API channels
   246  installed in the cluster. If all the Gateway API `CRD`s have the same version
   247  and the same channel, the tests can be run and the detected version and channel
   248  will be set in the `GatewayAPIVersion` and `gatewayAPIChannel` fields of the
   249  final report. Furthermore, the suite must run all the experimental tests when
   250  the channel is `experimental`, and the related features are enabled.
   251  
   252  In addition to the `CRD`s version, the suite needs to check its version in
   253  relation to the `CRD`s one. To do so, a new `.go` file containing the current
   254  Gateway API version is introduced in the project and compiled with the
   255  conformance profile suite:
   256  
   257  ```go
   258  const GatewayAPIVersion = "0.7.0"
   259  ```
   260  
   261  At test suite setup time the conformance profile suite checks the `CRD`s version
   262  and the suite version; if the two versions differ, the certification fails. A
   263  new generator will be introduced in the project to generate the aforementioned
   264  `.go` file starting from a VERSION file contained in the root folder. Such a
   265  VERSION file contains the semver of the latest release and is manually bumped at
   266  release time. The script hack/verify-all.sh will be updated to ensure the
   267  generated `.go` file is up to date with the VERSION file.
   268  
   269  ### Certification
   270  
   271  Implementations will be able to report their conformance testing results using
   272  our [reporting process](#reporting-process). Implementations will be able to
   273  visibly demonstrate their conformance results on their downstream projects and
   274  repositories using our [certification process](#certification-process).
   275  
   276  #### Reporting Process
   277  
   278  When conformance tests are executed an argument can be provided to the test
   279  suite to emit `ConformanceReport` resource with the test results. This resource
   280  can be configured to emit to the test output itself, or to a specific file.
   281  
   282  The following is an example report:
   283  
   284  ```yaml
   285  apiVersion: v1alpha1
   286  kind: ConformanceReport
   287  implementation:
   288    organization: acme
   289    project: operator
   290    url: https://acme.com
   291    version: v1.0.0
   292    contact:
   293    - @acme/maintainers
   294  date: "2023-02-28 20:29:41+00:00"
   295  gatewayAPIVersion: v0.7.0
   296  gatewayAPIChannel: standard
   297  profiles:
   298    - name: tcp
   299      core:
   300        result: success
   301        summary: "all core functionality passed"
   302        statistics:
   303          passed: 4
   304          skipped: 0
   305          failed: 0
   306      extended:
   307        result: skipped
   308        summary: "no extended features supported"
   309        statistics:
   310          passed: 0
   311          skipped: 6
   312          failed: 0
   313        unsupportedFeatures:
   314        - ExtendedFeature1
   315        - ExtendedFeature2
   316        - ExtendedFeature3
   317    - name: http
   318      core:
   319        result: success
   320        summary: "all core functionality passed"
   321        statistics:
   322          passed: 20
   323          skipped: 0
   324          failed: 0
   325      extended:
   326        result: success
   327        summary: "all extended features supported"
   328        statistics:
   329          passed: 8
   330          skipped: 0
   331          failed: 0
   332        supportedFeatures:
   333        - ExtendedFeature1
   334        - ExtendedFeature2
   335        - ExtendedFeature3
   336        - ExtendedFeature4
   337        - ExtendedFeature5
   338  ```
   339  
   340  > **WARNING**: It is an important clarification that this is NOT a full
   341  > Kubernetes API. It uses `TypeMeta` for some fields that made sense to re-use
   342  > and were familiar, but otherwise has it's own structure. It is not a [Custom
   343  > Resource Definition (CRD)][crd] nor will it be made available along with our
   344  > CRDs. It will be used only by conformance test tooling.
   345  
   346  > **NOTE**: The `implementation` field in the above example includes an
   347  > `organization` and `project` field. Organizations can be an open source
   348  > organization, an individual, a company, e.t.c.. Organizations can
   349  > theoretically have multiple projects and should submit separate reports for
   350  > each of them.
   351  
   352  > **NOTE**: The `contact` field indicates the Github usernames or team
   353  > names of those who are responsible for maintaining this file, so they can be
   354  > easily contacted when needed (e.g. for relevant release announcements
   355  > regarding conformance, e.t.c.). Optionally, it can be an email address or
   356  > a support URL (e.g. Github new issue page).
   357  
   358  The above report describes an implementation that just released `v1` and has
   359  `Core` support for `TCP` functionality and fully supports both `Core` and
   360  `Extended` `HTTP` functionality.
   361  
   362  `ConformanceReports` can be stored as a list of reports in chronological order.
   363  The following shows previous releases of the `acme`/`operator` implementation and
   364  its feature progression:
   365  
   366  ```yaml
   367  apiVersion: v1alpha1
   368  kind: ConformanceReport
   369  implementation:
   370    organization: acme
   371    project: operator
   372    url: https://acme.com
   373    version: v0.91.0
   374    contact:
   375    - @acme/maintainers
   376  date: "2022-09-28 20:29:41+00:00"
   377  gatewayAPIVersion: v0.6.2
   378  gatewayAPIChannel: standard
   379  profiles:
   380    - name: tcp
   381      core:
   382        result: partial
   383        summary: "some tests were manually skipped"
   384        statistics:
   385          passed: 2
   386          skipped: 2
   387          failed: 0
   388        skippedTests:
   389        - TCPRouteBasics
   390        - UDPRouteBasics
   391      extended:
   392        result: skipped
   393        summary: "no extended features supported"
   394        statistics:
   395          passed: 0
   396          skipped: 4
   397          failed: 0
   398        unsupportedFeatures:
   399        - ExtendedFeature1
   400        - ExtendedFeature2
   401        - ExtendedFeature3
   402    - name: http
   403      core:
   404        result: success
   405        summary: "all core functionality passed"
   406        statistics:
   407          passed: 20
   408          skipped: 0
   409          failed: 0
   410      extended:
   411        result: success
   412        summary: "all extended features supported"
   413        statistics:
   414          passed: 5
   415          skipped: 3
   416          failed: 0
   417        supportedFeatures:
   418        - ExtendedFeature1
   419        - ExtendedFeature2
   420        - ExtendedFeature3
   421        unsupportedFeatures:
   422        - ExtendedFeature4
   423        - ExtendedFeature5
   424  ---
   425  apiVersion: v1alpha1
   426  kind: ConformanceReport
   427  implementation:
   428    organization: acme
   429    project: operator
   430    url: https://acmeorg.com
   431    version: v0.90.0
   432    contact:
   433    - @acme/maintainers
   434  date: "2022-08-28 20:29:41+00:00"
   435  gatewayAPIVersion: v0.6.1
   436  gatewayAPIChannel: standard
   437  profiles:
   438    - name: tcp
   439      core:
   440        result: failed
   441        summary: "all tests are failing"
   442        statistics:
   443          passed: 0
   444          skipped: 0
   445          failed: 4
   446        failedTests:
   447        - TCPRouteExampleTest1
   448        - TCPRouteExampleTest2
   449        - TCPRouteExampleTest3
   450        - TCPRouteExampleTest4
   451    - name: http
   452      core:
   453        result: success
   454        summary: "all core functionality passed"
   455        statistics:
   456          passed: 20
   457          skipped: 0
   458          failed: 0
   459      extended:
   460        result: skipped
   461        summary: "no extended features supported"
   462        statistics:
   463          passed: 2
   464          skipped: 6
   465          failed: 0
   466        supportedFeatures:
   467        - ExtendedFeature1
   468        unsupportedFeatures:
   469        - ExtendedFeature2
   470        - ExtendedFeature3
   471        - ExtendedFeature4
   472        - ExtendedFeature5
   473  ---
   474  apiVersion: v1alpha1
   475  kind: ConformanceReport
   476  implementation:
   477    organization: acme
   478    project: operator
   479    url: https://acmeorg.com
   480    version: v0.89.0
   481    contact:
   482    - @acme/maintainers
   483  date: "2022-07-28 20:29:41+00:00"
   484  gatewayAPIVersion: v0.6.0
   485  gatewayAPIChannel: standard
   486  profiles:
   487    - name: http
   488      core:
   489        result: partial
   490        summary: "some tests were skipped"
   491        statistics:
   492          passed: 16
   493          skipped: 2
   494          failed: 0
   495        skippedTests:
   496        - HTTPRouteTestExample1
   497        - HTTPRouteTestExample2
   498      extended:
   499        result: skipped
   500        summary: "no extended features supported"
   501        statistics:
   502          passed: 0
   503          skipped: 8
   504          failed: 0
   505        unsupportedFeatures:
   506        - ExtendedFeature1
   507        - ExtendedFeature2
   508        - ExtendedFeature3
   509        - ExtendedFeature4
   510        - ExtendedFeature5
   511  ```
   512  
   513  > **NOTE**: In the above you can see the `acme` implementation's progression. In
   514  > their release `v0.89.0` they had started adding `HTTP` support and added the
   515  > conformance tests to CI, but they were still skipping some core tests. In
   516  > their next release `v0.90.0` they completed adding `HTTP` `Core`
   517  > functionality (and even added one extended feature), and also starting adding
   518  > `TCP` functionality during `v0.90.0` (but it was failing at that time). In
   519  > `v0.91.0` they had completed core `HTTP` supported and added two more
   520  > `Extended` features, and also started to get their `TCP` functionality to
   521  > partially pass.
   522  
   523  Implementers can submit their reports upstream by creating a pull request to
   524  the Gateway API repository and adding new reports to a file specific to their
   525  implementation's organization and project name:
   526  
   527  ```console
   528  conformance/reports/<version>/<organization>-<project>.yaml
   529  ```
   530  
   531  The `<version>` directory in the above refers to the version of Gateway API. The
   532  `latest` release will include a symlink that points to the latest version
   533  directory.
   534  
   535  For instance:
   536  
   537  ```console
   538  conformance/reports/v0.7.1/acme-operator.yaml
   539  ```
   540  
   541  > **NOTE**: Implementations **MUST** report for a specific release version
   542  > (e.g. `v0.7.1`) and not use branches or Git SHAs. Some exceptions will be
   543  > made for initial reports to help make it easier for implementations to get
   544  > started, but as we move to standard everyone should be reporting on specific
   545  > releases.
   546  
   547  Creating a pull request to add the `ConformanceReport` will start the
   548  [certification process](#certification-process).
   549  
   550  > **NOTE**: No verification process (to prevent intentionally incorrect
   551  > conformance results) will be implemented at this time. We expect that this wont
   552  > be an issue in our community and even if someone were to try and "cheat" on
   553  > the reporting the reputation loss for being caught would make them look very
   554  > bad and would not be worth it.
   555  
   556  [crd]:https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/
   557  
   558  #### Certification Process
   559  
   560  For this initial iteration the raw report data of the `ConformanceReports` will
   561  live in its own directory and _is predominantly meant for machine consumption_.
   562  Report data will be compiled into human-friendly displays during the an
   563  automated certification process.
   564  
   565  Certification starts with the pull request described during the [reporting
   566  process](#reporting-process). Once the `ConformanceReport` is created or
   567  updated a display layer in the implementations page will need to be updated to
   568  point to the new data.
   569  
   570  > **NOTE**: The `ConformanceReport` API will be defined in Golang like our
   571  > other `apis/` so that we can utilize build tags from kubebuilder for defaults
   572  > and validation, and so that there exists a common Golang type for it in the
   573  > conformance test suite. When PRs are created the Gateway API repositories'
   574  > CI will run linting and validation against the reports.
   575  
   576  Maintainers will provide [badges][bdg] to implementations at the end of the process
   577  which link to the implementations page for that specific implementation and can
   578  be easily added via markdown to Git repositories.
   579  
   580  [impl]:https://gateway-api.sigs.k8s.io/implementations/
   581  [bdg]:https://shields.io
   582  
   583  ## Alternatives Considered
   584  
   585  ### Conformance Test Configuration File
   586  
   587  Conformance testing is currently done mainly through command line with
   588  `go test` or via use of the conformance test suite as a library in Golang
   589  projects. We considered whether adding the alternative to provide a
   590  configuration file to the test suite would be nice, but we haven't heard
   591  any specific demand for that from implementors yet so we're leaving the
   592  idea here for later iterations to consider.
   593  
   594  ### Conformance Test Container Image
   595  
   596  Providing a container image which could be fed deployment instructions for an
   597  implementation was considered while working on this GET but it seemed like a
   598  scope all unto itself so we're avoiding it here and perhaps a later iteration
   599  could take a look at that if there are asks in the community.
   600  
   601  ### Implementation-Specific Reporting
   602  
   603  Users have mentioned the desire to report on `implementation-specific` features
   604  they support as a part of conformance. At the time of writing, there's not much
   605  in the way of structure or testing for us to do this with but we remain open to
   606  the idea. The door is left open in the `ConformanceReport` API for a future
   607  iteration to add this if desired, but it probably warrants its own GEP as we
   608  need to make sure we have buy-in from multiple stakeholders with different
   609  implementations that are implementing those features.
   610  
   611  ### High Level Profiles
   612  
   613  We originally started with two high level profiles:
   614  
   615  - `Layer4`
   616  - `Layer7`
   617  
   618  However the overwhelming feedback from the community was to go a step down and
   619  define profiles at the level of each individual API (e.g. `HTTPRoute`,
   620  `TCPRoute`, `GRPCRoute`, e.t.c.). One of the main reasons for this was that we
   621  already have multiple known implementations of Gateway API which only support
   622  a single route type (`UDPRoute`, in particular as it turns out).
   623  
   624  We may consider in the future doing some of these higher level profiles if
   625  there's a technical reason or strong desire from implementers.
   626  
   627  ## Graduation Criteria
   628  
   629  The following are items that **MUST** be resolved to move this GEP to
   630  `Standard` status (and before the end of the probationary period):
   631  
   632  - [x] some kind of basic level of display for the report data needs to exist.
   633    It's OK for a more robust display layer to be part of a follow-up effort.
   634  - [ ] initially we were OK with storing reports in the Git repository as files.
   635    While this is probably sufficient during the `Experimental` phase, we need to
   636    re-evaluate this before `Standard` and see if this remains sufficient or if
   637    we want to store the data elsewhere.
   638  - [ ] We have been actively [gathering feedback from SIG
   639    Arch][sig-arch-feedback]. Some time during the `experimental` phase needs to
   640    be allowed to continue to engage with SIG Arch and incorporate their feedback
   641    into the test suite.
   642  
   643  [sig-arch-feedback]:https://groups.google.com/g/kubernetes-sig-architecture/c/YjrVZ4NJQiA/m/7Qg7ScddBwAJ
   644  
   645  ## References
   646  
   647  - https://github.com/kubernetes-sigs/gateway-api/issues/1709
   648  - https://github.com/kubernetes-sigs/gateway-api/issues/1329
   649