Repository: knative-sandbox/eventing-kafka
Pull request #133 (2020-10-22 09:16:43)

Update for channel metrics
## Proposed Changes
<!-- Please include the 'why' behind your changes if no issue exists -->

- Adds part of #115 and it is a rebased version of #97 
Produced via: 

```
./hack/update-deps.sh --upgrade
./hack/update-codegen.sh
```

/cc @matzew 

knative-prow-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/knative-sandbox/eventing-kafka/pull/133#" title="Author self-approved">skonto</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **davyodom** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @davyodom` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=knative-sandbox%2Feventing-kafka).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/knative-sandbox/eventing-kafka/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["davyodom"]} -->
knative-prow-robot: Hi @skonto. Thanks for your PR.

I'm waiting for a [knative-sandbox](https://github.com/orgs/knative-sandbox/people) member to verify that this patch is reasonable to test. If it is, they should reply with `/ok-to-test` on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should [join the org](https://github.com/orgs/knative-sandbox/people) to skip this step.

Once the patch is verified, the new status will be reflected by the `ok-to-test` label.

I understand the commands that are listed [here](https://go.k8s.io/bot-commands?repo=knative-sandbox%2Feventing-kafka).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
</details>

pierDipi: /ok-to-test
pierDipi: /cc matzew slinkydeveloper 
codecov[bot]: # [Codecov](https://codecov.io/gh/knative-sandbox/eventing-kafka/pull/133?src=pr&el=h1) Report
> Merging [#133](https://codecov.io/gh/knative-sandbox/eventing-kafka/pull/133?src=pr&el=desc) into [master](https://codecov.io/gh/knative-sandbox/eventing-kafka/commit/fc0ce343034836a126d773144b61bfb388d1e9d0?el=desc) will **decrease** coverage by `0.28%`.
> The diff coverage is `28.00%`.

[![Impacted file tree graph](https://codecov.io/gh/knative-sandbox/eventing-kafka/pull/133/graphs/tree.svg?width=650&height=150&src=pr&token=W765CT93QC)](https://codecov.io/gh/knative-sandbox/eventing-kafka/pull/133?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master     #133      +/-   ##
==========================================
- Coverage   74.97%   74.69%   -0.29%     
==========================================
  Files         110      110              
  Lines        3944     3967      +23     
==========================================
+ Hits         2957     2963       +6     
- Misses        804      816      +12     
- Partials      183      188       +5     
```


| [Impacted Files](https://codecov.io/gh/knative-sandbox/eventing-kafka/pull/133?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [pkg/channel/consolidated/dispatcher/dispatcher.go](https://codecov.io/gh/knative-sandbox/eventing-kafka/pull/133/diff?src=pr&el=tree#diff-cGtnL2NoYW5uZWwvY29uc29saWRhdGVkL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlci5nbw==) | `47.36% <0.00%> (-2.03%)` | :arrow_down: |
| [.../channel/distributed/dispatcher/env/environment.go](https://codecov.io/gh/knative-sandbox/eventing-kafka/pull/133/diff?src=pr&el=tree#diff-cGtnL2NoYW5uZWwvZGlzdHJpYnV0ZWQvZGlzcGF0Y2hlci9lbnYvZW52aXJvbm1lbnQuZ28=) | `84.61% <33.33%> (-15.39%)` | :arrow_down: |
| [...kg/channel/distributed/receiver/env/environment.go](https://codecov.io/gh/knative-sandbox/eventing-kafka/pull/133/diff?src=pr&el=tree#diff-cGtnL2NoYW5uZWwvZGlzdHJpYnV0ZWQvcmVjZWl2ZXIvZW52L2Vudmlyb25tZW50Lmdv) | `86.66% <33.33%> (-13.34%)` | :arrow_down: |
| [...annel/distributed/dispatcher/dispatcher/handler.go](https://codecov.io/gh/knative-sandbox/eventing-kafka/pull/133/diff?src=pr&el=tree#diff-cGtnL2NoYW5uZWwvZGlzdHJpYnV0ZWQvZGlzcGF0Y2hlci9kaXNwYXRjaGVyL2hhbmRsZXIuZ28=) | `90.32% <100.00%> (+0.15%)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/knative-sandbox/eventing-kafka/pull/133?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/knative-sandbox/eventing-kafka/pull/133?src=pr&el=footer). Last update [fc0ce34...b48b16e](https://codecov.io/gh/knative-sandbox/eventing-kafka/pull/133?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

knative-metrics-robot: The following is the coverage report on the affected files.
Say `/test pull-knative-sandbox-eventing-kafka-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[pkg/channel/consolidated/dispatcher/dispatcher.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319207274085879808/artifacts/line-cov.html#file0) | 63.1% | 60.1% | -3.0
[pkg/channel/distributed/dispatcher/dispatcher/handler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319207274085879808/artifacts/line-cov.html#file1) | 93.9% | 94.0% | 0.1
[pkg/channel/distributed/dispatcher/env/environment.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319207274085879808/artifacts/line-cov.html#file2) | 100.0% | 92.3% | -7.7
[pkg/channel/distributed/receiver/env/environment.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319207274085879808/artifacts/line-cov.html#file3) | 100.0% | 93.3% | -6.7

knative-prow-robot: @skonto: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-sandbox-eventing-kafka-build-tests | b48b16eb76a4ccb0fbe636fe1b2a37010b016fab | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-build-tests/1319207274085879809) | `/test pull-knative-sandbox-eventing-kafka-build-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative-sandbox_eventing-kafka/133). [Your PR dashboard](https://gubernator.knative.dev/pr/skonto).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
knative-prow-robot: @skonto: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-sandbox-eventing-kafka-build-tests | b48b16eb76a4ccb0fbe636fe1b2a37010b016fab | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-build-tests/1319207274085879809) | `/test pull-knative-sandbox-eventing-kafka-build-tests`
pull-knative-sandbox-eventing-kafka-integration-tests | b48b16eb76a4ccb0fbe636fe1b2a37010b016fab | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-integration-tests/1319207274085879810) | `/test pull-knative-sandbox-eventing-kafka-integration-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative-sandbox_eventing-kafka/133). [Your PR dashboard](https://gubernator.knative.dev/pr/skonto).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
knative-metrics-robot: The following is the coverage report on the affected files.
Say `/test pull-knative-sandbox-eventing-kafka-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[pkg/channel/consolidated/dispatcher/dispatcher.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319219604572082178/artifacts/line-cov.html#file0) | 63.1% | 60.1% | -3.0
[pkg/channel/distributed/dispatcher/dispatcher/handler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319219604572082178/artifacts/line-cov.html#file1) | 93.9% | 94.0% | 0.1
[pkg/channel/distributed/dispatcher/env/environment.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319219604572082178/artifacts/line-cov.html#file2) | 100.0% | 92.3% | -7.7
[pkg/channel/distributed/receiver/env/environment.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319219604572082178/artifacts/line-cov.html#file3) | 100.0% | 93.3% | -6.7

knative-metrics-robot: The following is the coverage report on the affected files.
Say `/test pull-knative-sandbox-eventing-kafka-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[pkg/channel/consolidated/dispatcher/dispatcher.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319220737038356481/artifacts/line-cov.html#file0) | 63.1% | 60.1% | -3.0
[pkg/channel/distributed/dispatcher/dispatcher/handler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319220737038356481/artifacts/line-cov.html#file1) | 93.9% | 92.0% | -1.9
[pkg/channel/distributed/dispatcher/env/environment.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319220737038356481/artifacts/line-cov.html#file2) | 100.0% | 92.3% | -7.7
[pkg/channel/distributed/receiver/env/environment.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319220737038356481/artifacts/line-cov.html#file3) | 100.0% | 93.3% | -6.7

knative-metrics-robot: The following is the coverage report on the affected files.
Say `/test pull-knative-sandbox-eventing-kafka-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[pkg/channel/consolidated/dispatcher/dispatcher.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319222876741570562/artifacts/line-cov.html#file0) | 63.1% | 60.1% | -3.0
[pkg/channel/distributed/dispatcher/dispatcher/handler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319222876741570562/artifacts/line-cov.html#file1) | 93.9% | 94.0% | 0.1
[pkg/channel/distributed/dispatcher/env/environment.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319222876741570562/artifacts/line-cov.html#file2) | 100.0% | 92.3% | -7.7
[pkg/channel/distributed/receiver/env/environment.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319222876741570562/artifacts/line-cov.html#file3) | 100.0% | 93.3% | -6.7

knative-prow-robot: @skonto: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-sandbox-eventing-kafka-integration-tests | 9d280a3a8fcf603cc494e944e406fafa6d1b3a1a | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-integration-tests/1319222876741570560) | `/test pull-knative-sandbox-eventing-kafka-integration-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative-sandbox_eventing-kafka/133). [Your PR dashboard](https://gubernator.knative.dev/pr/skonto).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
skonto: @matzew hitting ` test_runner.go:159: Couldn't initialize clients: error while retrieving the config-tracing config map: configmaps "config-tracing" ` in integration tests any idea?
knative-metrics-robot: The following is the coverage report on the affected files.
Say `/test pull-knative-sandbox-eventing-kafka-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[pkg/channel/consolidated/dispatcher/dispatcher.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319235459217362947/artifacts/line-cov.html#file0) | 63.1% | 60.1% | -3.0
[pkg/channel/distributed/dispatcher/dispatcher/handler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319235459217362947/artifacts/line-cov.html#file1) | 93.9% | 94.0% | 0.1

matzew: /lgtm
/approve
knative-prow-robot: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/knative-sandbox/eventing-kafka/pull/133#issuecomment-714429192" title="Approved">matzew</a>*, *<a href="https://github.com/knative-sandbox/eventing-kafka/pull/133#" title="Author self-approved">skonto</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=knative-sandbox%2Feventing-kafka).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/knative-sandbox/eventing-kafka/blob/master/OWNERS)~~ [matzew]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
knative-prow-robot: @skonto: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-sandbox-eventing-kafka-integration-tests | d39a6cb4682bfcaf5592a88d093ba9469d62bfbb | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-integration-tests/1319235459217362944) | `/test pull-knative-sandbox-eventing-kafka-integration-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative-sandbox_eventing-kafka/133). [Your PR dashboard](https://gubernator.knative.dev/pr/skonto).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
knative-prow-robot: New changes are detected. LGTM label has been removed.
knative-metrics-robot: The following is the coverage report on the affected files.
Say `/test pull-knative-sandbox-eventing-kafka-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[pkg/channel/consolidated/dispatcher/dispatcher.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319246783687168000/artifacts/line-cov.html#file0) | 63.1% | 60.1% | -3.0
[pkg/channel/distributed/dispatcher/dispatcher/handler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319246783687168000/artifacts/line-cov.html#file1) | 93.9% | 94.0% | 0.1

knative-prow-robot: @skonto: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-sandbox-eventing-kafka-integration-tests | 54ea8fd455a3cae1bfd3b57cceb463cd03f92a61 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-integration-tests/1319246783687168001) | `/test pull-knative-sandbox-eventing-kafka-integration-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative-sandbox_eventing-kafka/133). [Your PR dashboard](https://gubernator.knative.dev/pr/skonto).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
knative-metrics-robot: The following is the coverage report on the affected files.
Say `/test pull-knative-sandbox-eventing-kafka-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[pkg/channel/consolidated/dispatcher/dispatcher.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319288307980439553/artifacts/line-cov.html#file0) | 63.1% | 60.1% | -3.0
[pkg/channel/distributed/dispatcher/dispatcher/handler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319288307980439553/artifacts/line-cov.html#file1) | 93.9% | 94.0% | 0.1

knative-metrics-robot: The following is the coverage report on the affected files.
Say `/test pull-knative-sandbox-eventing-kafka-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[pkg/channel/consolidated/dispatcher/dispatcher.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319295227961282561/artifacts/line-cov.html#file0) | 63.1% | 60.1% | -3.0
[pkg/channel/distributed/dispatcher/dispatcher/handler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319295227961282561/artifacts/line-cov.html#file1) | 93.9% | 94.0% | 0.1

skonto: @matzew @pierDipi the coverage tests in the previous run passed, not sure why it is unstable, my last commit didnt affect yet them they report failure :)
knative-prow-robot: @skonto: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-sandbox-eventing-kafka-integration-tests | 1846259ec3c63ac7c5ea60c257b52c7a77beef0b | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-integration-tests/1319295227961282560) | `/test pull-knative-sandbox-eventing-kafka-integration-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative-sandbox_eventing-kafka/133). [Your PR dashboard](https://gubernator.knative.dev/pr/skonto).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
skonto: /retest
skonto: /test pull-knative-sandbox-eventing-kafka-go-coverage
knative-metrics-robot: The following is the coverage report on the affected files.
Say `/test pull-knative-sandbox-eventing-kafka-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[pkg/channel/consolidated/dispatcher/dispatcher.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319301771016802304/artifacts/line-cov.html#file0) | 63.1% | 60.1% | -3.0
[pkg/channel/distributed/dispatcher/dispatcher/handler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-go-coverage/1319301771016802304/artifacts/line-cov.html#file1) | 93.9% | 94.0% | 0.1

knative-prow-robot: @skonto: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-sandbox-eventing-kafka-integration-tests | 1846259ec3c63ac7c5ea60c257b52c7a77beef0b | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka/133/pull-knative-sandbox-eventing-kafka-integration-tests/1319301394347331590) | `/test pull-knative-sandbox-eventing-kafka-integration-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative-sandbox_eventing-kafka/133). [Your PR dashboard](https://gubernator.knative.dev/pr/skonto).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
matzew: /lgtm

/test pull-knative-sandbox-eventing-kafka-integration-tests

Patch:
diff --git a/cmd/channel/distributed/receiver/main.go b/cmd/channel/distributed/receiver/main.go
index 45212587a..1ed8d158d 100644
--- a/cmd/channel/distributed/receiver/main.go
+++ b/cmd/channel/distributed/receiver/main.go
@@ -24,6 +24,7 @@ import (
 	"strings"
 
 	"github.com/cloudevents/sdk-go/v2/binding"
+	"github.com/google/uuid"
 	"go.uber.org/zap"
 	v1 "k8s.io/api/core/v1"
 	commonconfig "knative.dev/eventing-kafka/pkg/channel/distributed/common/config"
@@ -37,6 +38,7 @@ import (
 	channelhealth "knative.dev/eventing-kafka/pkg/channel/distributed/receiver/health"
 	"knative.dev/eventing-kafka/pkg/channel/distributed/receiver/producer"
 	eventingchannel "knative.dev/eventing/pkg/channel"
+	"knative.dev/pkg/kmeta"
 	"knative.dev/pkg/logging"
 	eventingmetrics "knative.dev/pkg/metrics"
 )
@@ -119,8 +121,10 @@ func main() {
 	}
 	defer kafkaProducer.Close()
 
+	channelReporter := eventingchannel.NewStatsReporter(environment.ContainerName, kmeta.ChildName(environment.PodName, uuid.New().String()))
+
 	// Create A New Knative Eventing MessageReceiver (Parses The Channel From The Host Header)
-	messageReceiver, err := eventingchannel.NewMessageReceiver(handleMessage, logger, eventingchannel.ResolveMessageChannelFromHostHeader(eventingchannel.ParseChannel))
+	messageReceiver, err := eventingchannel.NewMessageReceiver(handleMessage, logger, channelReporter, eventingchannel.ResolveMessageChannelFromHostHeader(eventingchannel.ParseChannel))
 	if err != nil {
 		logger.Fatal("Failed To Create MessageReceiver", zap.Error(err))
 	}
diff --git a/config/channel/consolidated/deployments/dispatcher.yaml b/config/channel/consolidated/deployments/dispatcher.yaml
index c7bc361c8..6bc888d3f 100644
--- a/config/channel/consolidated/deployments/dispatcher.yaml
+++ b/config/channel/consolidated/deployments/dispatcher.yaml
@@ -53,6 +53,8 @@ spec:
           value: "config-logging"
         - name: CONFIG_LEADERELECTION_NAME
           value: "config-leader-election-kafka"
+        - name: CONTAINER_NAME
+          value: dispatcher
         ports:
         - containerPort: 9090
           name: metrics
diff --git a/go.mod b/go.mod
index a8851f333..49619d977 100644
--- a/go.mod
+++ b/go.mod
@@ -11,6 +11,7 @@ require (
 	github.com/ghodss/yaml v1.0.0
 	github.com/golang/protobuf v1.4.2
 	github.com/google/go-cmp v0.5.2
+	github.com/google/gofuzz v1.1.0
 	github.com/google/uuid v1.1.1
 	github.com/influxdata/tdigest v0.0.1 // indirect
 	github.com/kelseyhightower/envconfig v1.4.0
@@ -25,9 +26,9 @@ require (
 	k8s.io/apimachinery v0.18.8
 	k8s.io/client-go v11.0.1-0.20190805182717-6502b5e7b1b5+incompatible
 	k8s.io/utils v0.0.0-20200603063816-c1c6865ac451
-	knative.dev/eventing v0.18.1-0.20201015095656-0a79d05b949a
-	knative.dev/pkg v0.0.0-20201014184531-9e655c6b02f6
-	knative.dev/test-infra v0.0.0-20201014021030-ae3984a33f82
+	knative.dev/eventing v0.18.1-0.20201022075137-c29798077cfc
+	knative.dev/pkg v0.0.0-20201022015237-8139298650a4
+	knative.dev/test-infra v0.0.0-20201022003632-7d3ea6019158
 	pack.ag/amqp v0.12.4 // indirect
 )
 
diff --git a/go.sum b/go.sum
index 3668da7fd..88093a968 100644
--- a/go.sum
+++ b/go.sum
@@ -204,6 +204,7 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMx
 github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
 github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
 github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
+github.com/alecthomas/jsonschema v0.0.0-20180308105923-f2c93856175a/go.mod h1:qpebaTNSsyUn5rPSJMsfqEtDw71TTggXM6stUDI16HA=
 github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
@@ -272,6 +273,7 @@ github.com/blang/semver v3.5.0+incompatible h1:CGxCgetQ64DKk7rdZ++Vfnb1+ogGNnB17
 github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
 github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
 github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
+github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
 github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
 github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
 github.com/bmizerany/perks v0.0.0-20141205001514-d9a9656a3a4b h1:AP/Y7sqYicnjGDfD5VcY4CIfh1hRXBUavxrvELjTiOE=
@@ -285,6 +287,7 @@ github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8n
 github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
 github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
 github.com/bwmarrin/snowflake v0.0.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
+github.com/c2h5oh/datasize v0.0.0-20171227191756-4eba002a5eae/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M=
 github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGrrHhcQw=
 github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo=
 github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A=
@@ -361,6 +364,7 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm
 github.com/dgryski/go-gk v0.0.0-20140819190930-201884a44051/go.mod h1:qm+vckxRlDt0aOla0RYJJVeqHZlWfOm2UIxHaqPB46E=
 github.com/dgryski/go-gk v0.0.0-20200319235926-a69029f61654 h1:XOPLOMn/zT4jIgxfxSsoXPxkrzz0FaCHwp33x5POJ+Q=
 github.com/dgryski/go-gk v0.0.0-20200319235926-a69029f61654/go.mod h1:qm+vckxRlDt0aOla0RYJJVeqHZlWfOm2UIxHaqPB46E=
+github.com/dgryski/go-lttb v0.0.0-20180810165845-318fcdf10a77/go.mod h1:Va5MyIzkU0rAM92tn3hb3Anb7oz7KcnixF49+2wOMe4=
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 github.com/dimchansky/utfbom v1.0.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
 github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4=
@@ -407,6 +411,7 @@ github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkg
 github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
 github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk=
 github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
+github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
 github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
 github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
 github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
@@ -446,9 +451,12 @@ github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0
 github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I=
 github.com/go-critic/go-critic v0.4.1/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g=
 github.com/go-critic/go-critic v0.4.3/go.mod h1:j4O3D4RoIwRqlZw5jJpx0BNfXWWbpcJoKu5cYSe4YmQ=
+github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4=
 github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
+github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM=
 github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
 github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
+github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk=
 github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
@@ -621,6 +629,15 @@ github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAO
 github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8=
 github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk=
 github.com/gomodule/redigo v1.7.0/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
+github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc=
+github.com/gonum/diff v0.0.0-20181124234638-500114f11e71/go.mod h1:22dM4PLscQl+Nzf64qNBurVJvfyvZELT0iRW2l/NN70=
+github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg=
+github.com/gonum/integrate v0.0.0-20181209220457-a422b5c0fdf2/go.mod h1:pDgmNM6seYpwvPos3q+zxlXMsbve6mOIPucUnUOrI7Y=
+github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks=
+github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9/go.mod h1:XA3DeT6rxh2EAE789SSiSJNqxPaC0aE9J8NTOI0Jo/A=
+github.com/gonum/mathext v0.0.0-20181121095525-8a4bf007ea55/go.mod h1:fmo8aiSEWkJeiGXUJf+sPvuDgEFgqIoZSs843ePKrGg=
+github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw=
+github.com/gonum/stat v0.0.0-20181125101827-41a0da705a5b/go.mod h1:Z4GIJBJO3Wa4gD4vbwQxXXZ+WHmW6E9ixmNrwvs0iZs=
 github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
@@ -803,6 +820,7 @@ github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ
 github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 github.com/influxdata/influxdb v0.0.0-20161215172503-049f9b42e9a5/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY=
+github.com/influxdata/tdigest v0.0.0-20180711151920-a7d76c6f093a/go.mod h1:9GkyshztGufsdPQWjH+ifgnIr3xNUL5syI70g2dzU1o=
 github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9 h1:MHTrDWmQpHq/hkq+7cw9oYAt2PqUw52TZazRA0N7PGE=
 github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0=
 github.com/influxdata/tdigest v0.0.0-20191024211133-5d87a7585faa h1:uTXDyxdRKGnqGXTFbonsFjugRQjNDrENr7c3fnfHda4=
@@ -810,6 +828,7 @@ github.com/influxdata/tdigest v0.0.0-20191024211133-5d87a7585faa/go.mod h1:Z0kXn
 github.com/influxdata/tdigest v0.0.1 h1:XpFptwYmnEKUqmkcDjrzffswZ3nvNeevbUSLPP/ZzIY=
 github.com/influxdata/tdigest v0.0.1/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y=
 github.com/jarcoal/httpmock v1.0.5/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik=
+github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
 github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
 github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
 github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem8=
@@ -856,10 +875,12 @@ github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfE
 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
 github.com/kelseyhightower/envconfig v1.3.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=
 github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=
 github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=
+github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY=
 github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
 github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
@@ -954,6 +975,7 @@ github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88J
 github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
 github.com/mholt/archiver/v3 v3.3.0/go.mod h1:YnQtqsp+94Rwd0D/rk5cnLrxusUBUXg+08Ebtr1Mqao=
 github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/miekg/dns v1.1.17/go.mod h1:WgzbA6oji13JREwiNsRDNfl7jYdPnmz+VEuLrA+/48M=
 github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
 github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
 github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
@@ -1180,6 +1202,7 @@ github.com/securego/gosec v0.0.0-20200103095621-79fbf3af8d83/go.mod h1:vvbZ2Ae7A
 github.com/securego/gosec v0.0.0-20200401082031-e946c8c39989/go.mod h1:i9l/TNj+yDFh9SZXUTvspXTjbFXgZGP/UvhU1S65A4A=
 github.com/securego/gosec/v2 v2.3.0/go.mod h1:UzeVyUXbxukhLeHKV3VVqo7HdoQR9MrRfFmZYotn8ME=
 github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
+github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
 github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
 github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc=
 github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
@@ -1287,9 +1310,11 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1
 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/tommy-muehle/go-mnd v1.1.1/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig=
 github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig=
+github.com/tsenart/go-tsz v0.0.0-20180814232043-cdeb9e1e981e/go.mod h1:SWZznP1z5Ki7hDT2ioqiFKEse8K9tU2OUvaRI0NeGQo=
 github.com/tsenart/vegeta v12.7.0+incompatible/go.mod h1:Smz/ZWfhKRcyDDChZkG3CyTHdj87lHzio/HOCkbndXM=
 github.com/tsenart/vegeta v12.7.1-0.20190725001342-b5f4fca92137+incompatible h1:ErZrHhRveAoznVW80gbrxz+qxJNydpA2fcQxTPHkZbU=
 github.com/tsenart/vegeta v12.7.1-0.20190725001342-b5f4fca92137+incompatible/go.mod h1:Smz/ZWfhKRcyDDChZkG3CyTHdj87lHzio/HOCkbndXM=
+github.com/tsenart/vegeta/v12 v12.8.4/go.mod h1:ZiJtwLn/9M4fTPdMY7bdbIeyNeFVE8/AHbWFqCsUuho=
 github.com/ugorji/go v1.1.1/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
 github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
 github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
@@ -1314,6 +1339,7 @@ github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59b
 github.com/wavesoftware/go-ensure v1.0.0/go.mod h1:K2UAFSwMTvpiRGay/M3aEYYuurcR8S4A6HkQlJPV8k4=
 github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug=
 github.com/xanzy/go-gitlab v0.32.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug=
+github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70=
 github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4=
 github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
 github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
@@ -1404,6 +1430,7 @@ golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -1663,6 +1690,7 @@ golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDq
 golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
 golang.org/x/tools v0.0.0-20190807223507-b346f7fd45de/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -1911,6 +1939,7 @@ gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQb
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
+gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
 gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
 gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
@@ -2008,8 +2037,8 @@ k8s.io/utils v0.0.0-20200603063816-c1c6865ac451 h1:v8ud2Up6QK1lNOKFgiIVrZdMg7Mpm
 k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 knative.dev/caching v0.0.0-20190719140829-2032732871ff/go.mod h1:dHXFU6CGlLlbzaWc32g80cR92iuBSpsslDNBWI8C7eg=
 knative.dev/caching v0.0.0-20200116200605-67bca2c83dfa/go.mod h1:dHXFU6CGlLlbzaWc32g80cR92iuBSpsslDNBWI8C7eg=
-knative.dev/eventing v0.18.1-0.20201015095656-0a79d05b949a h1:mZlsNSWW7XQzTxlHWuFO70YmH2M5QXvkGLHf6FpejHE=
-knative.dev/eventing v0.18.1-0.20201015095656-0a79d05b949a/go.mod h1:bupOIz7yrt5GTl8+8qlwnHBXjYV+5We0iy61f1DA0KU=
+knative.dev/eventing v0.18.1-0.20201022075137-c29798077cfc h1:P+a8DhKtWzzHAzQZzbVoB+s9l0cCvsvJe6+xSX77tmo=
+knative.dev/eventing v0.18.1-0.20201022075137-c29798077cfc/go.mod h1:dvY28ncAhsKpY/u5vbiC3HCVw2+XsLO6glWIyQEZB0w=
 knative.dev/eventing-contrib v0.6.1-0.20190723221543-5ce18048c08b/go.mod h1:SnXZgSGgMSMLNFTwTnpaOH7hXDzTFtw0J8OmHflNx3g=
 knative.dev/eventing-contrib v0.11.2/go.mod h1:SnXZgSGgMSMLNFTwTnpaOH7hXDzTFtw0J8OmHflNx3g=
 knative.dev/pkg v0.0.0-20191101194912-56c2594e4f11/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q=
@@ -2020,17 +2049,17 @@ knative.dev/pkg v0.0.0-20200505191044-3da93ebb24c2/go.mod h1:Q6sL35DdGs8hIQZKdaC
 knative.dev/pkg v0.0.0-20200515002500-16d7b963416f/go.mod h1:tMOHGbxtRz8zYFGEGpV/bpoTEM1o89MwYFC4YJXl3GY=
 knative.dev/pkg v0.0.0-20200528142800-1c6815d7e4c9/go.mod h1:QgNZTxnwpB/oSpNcfnLVlw+WpEwwyKAvJlvR3hgeltA=
 knative.dev/pkg v0.0.0-20200711004937-22502028e31a/go.mod h1:AqAJV6rYi8IGikDjJ/9ZQd9qKdkXVlesVnVjwx62YB8=
-knative.dev/pkg v0.0.0-20201014184531-9e655c6b02f6 h1:yUP8KB8nf/FmovzKfGNei+ivXeTM8vwscSZCjC4LbBY=
-knative.dev/pkg v0.0.0-20201014184531-9e655c6b02f6/go.mod h1:Vt8wg4OLNbZiW+ibtfysciKMgHkXfkxa8pAGXzHg8HI=
+knative.dev/pkg v0.0.0-20201021200832-f492d0877abf/go.mod h1:8Ryvgpx71FnHPVaB+DEXEKOJfA/sc9iO8mjoKxsrIiE=
+knative.dev/pkg v0.0.0-20201022015237-8139298650a4 h1:qw8FhkwYizQb8ZSuR2PMvcOrAV1g5Kaz35MTpHlhTNc=
+knative.dev/pkg v0.0.0-20201022015237-8139298650a4/go.mod h1:pc2VrtK69NrLtGMc6Gu0BL8IOfmph6KNvIDVrFqqW3Q=
 knative.dev/test-infra v0.0.0-20200407185800-1b88cb3b45a5/go.mod h1:xcdUkMJrLlBswIZqL5zCuBFOC22WIPMQoVX1L35i0vQ=
 knative.dev/test-infra v0.0.0-20200505052144-5ea2f705bb55/go.mod h1:WqF1Azka+FxPZ20keR2zCNtiQA1MP9ZB4BH4HuI+SIU=
 knative.dev/test-infra v0.0.0-20200513011557-d03429a76034/go.mod h1:aMif0KXL4g19YCYwsy4Ocjjz5xgPlseYV+B95Oo4JGE=
 knative.dev/test-infra v0.0.0-20200519015156-82551620b0a9/go.mod h1:A5b2OAXTOeHT3hHhVQm3dmtbuWvIDP7qzgtqxA3/2pE=
 knative.dev/test-infra v0.0.0-20200707183444-aed09e56ddc7/go.mod h1:RjYAhXnZqeHw9+B0zsbqSPlae0lCvjekO/nw5ZMpLCs=
-knative.dev/test-infra v0.0.0-20201013100530-45e0761df397 h1:4TDu2+B8Rr6Wdcb5++tmj2UVx0mnh+DCP5Rg/iblTBk=
-knative.dev/test-infra v0.0.0-20201013100530-45e0761df397/go.mod h1:PwM5WCaFn0HlVlosnbH0dE+IzvwXbuLZ/2jCQzDX3i0=
-knative.dev/test-infra v0.0.0-20201014021030-ae3984a33f82 h1:/HZKnJdqoGjknSM50+SLHDASF6wVDYOOEXsXXLzD1QU=
-knative.dev/test-infra v0.0.0-20201014021030-ae3984a33f82/go.mod h1:lm0U0k6ARXr8Po0LcSTCfETg63LOF3ajUxcoqy5JSH0=
+knative.dev/test-infra v0.0.0-20201020210659-8f5dc4814ac3/go.mod h1:lm0U0k6ARXr8Po0LcSTCfETg63LOF3ajUxcoqy5JSH0=
+knative.dev/test-infra v0.0.0-20201022003632-7d3ea6019158 h1:i6DIeWY1imJVNS6OH+VcBvYpVOkYWDe/AR2rUYTxcxE=
+knative.dev/test-infra v0.0.0-20201022003632-7d3ea6019158/go.mod h1:lm0U0k6ARXr8Po0LcSTCfETg63LOF3ajUxcoqy5JSH0=
 mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
 mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
 mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw=
@@ -2041,6 +2070,7 @@ pack.ag/amqp v0.11.0/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4=
 pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4=
 pack.ag/amqp v0.12.4 h1:t6sCQTAnJALWkMV1tNjepl7fE9DR1ihG2yLlI1zr/JA=
 pack.ag/amqp v0.12.4/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4=
+pgregory.net/rapid v0.3.3/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY=
 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
diff --git a/pkg/apis/sources/v1alpha1/kafka_conversion.go b/pkg/apis/sources/v1alpha1/kafka_conversion.go
index 11595c4ad..683b63d57 100644
--- a/pkg/apis/sources/v1alpha1/kafka_conversion.go
+++ b/pkg/apis/sources/v1alpha1/kafka_conversion.go
@@ -44,12 +44,17 @@ func (source *KafkaSource) ConvertTo(ctx context.Context, obj apis.Convertible)
 			Topics:        source.Spec.Topics,
 			ConsumerGroup: source.Spec.ConsumerGroup,
 		}
-		sink.Status.Status = source.Status.Status
-		source.Status.Status.ConvertTo(ctx, &sink.Status.Status)
+		source.Status.Status.DeepCopyInto(&sink.Status.Status)
+
 		// Optionals
 		if source.Spec.Sink != nil {
 			sink.Spec.Sink = *source.Spec.Sink.DeepCopy()
 		}
+
+		if source.Spec.CloudEventOverrides != nil {
+			sink.Spec.CloudEventOverrides = source.Spec.CloudEventOverrides.DeepCopy()
+		}
+
 		if source.Status.SinkURI != nil {
 			sink.Status.SinkURI = source.Status.SinkURI.DeepCopy()
 		}
@@ -83,12 +88,18 @@ func (sink *KafkaSource) ConvertFrom(ctx context.Context, obj apis.Convertible)
 		if reflect.DeepEqual(*sink.Spec.Sink, duckv1.Destination{}) {
 			sink.Spec.Sink = nil
 		}
-		sink.Status.Status = source.Status.Status
-		source.Status.Status.ConvertTo(ctx, &source.Status.Status)
+
+		source.Status.Status.DeepCopyInto(&sink.Status.Status)
+
 		// Optionals
 		if source.Status.SinkURI != nil {
 			sink.Status.SinkURI = source.Status.SinkURI.DeepCopy()
 		}
+
+		if source.Spec.CloudEventOverrides != nil {
+			sink.Spec.CloudEventOverrides = source.Spec.CloudEventOverrides.DeepCopy()
+		}
+
 		if source.Status.CloudEventAttributes != nil {
 			sink.Status.CloudEventAttributes = make([]duckv1.CloudEventAttributes, len(source.Status.CloudEventAttributes))
 			copy(sink.Status.CloudEventAttributes, source.Status.CloudEventAttributes)
diff --git a/pkg/apis/sources/v1alpha1/kafka_types.go b/pkg/apis/sources/v1alpha1/kafka_types.go
index 644c2b1fc..4734201c8 100644
--- a/pkg/apis/sources/v1alpha1/kafka_types.go
+++ b/pkg/apis/sources/v1alpha1/kafka_types.go
@@ -89,6 +89,12 @@ type KafkaSourceSpec struct {
 	// Resource limits and Request specifications of the Receive Adapter Deployment
 	// Deprecated: v1beta1 drops this field.
 	Resources KafkaResourceSpec `json:"resources,omitempty"`
+
+	// CloudEventOverrides defines overrides to control the output format and
+	// modifications of the event sent to the sink.
+	// +optional
+	// Needed for supporting round-tripping
+	CloudEventOverrides *duckv1.CloudEventOverrides `json:"ceOverrides,omitempty"`
 }
 
 const (
diff --git a/pkg/apis/sources/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/sources/v1alpha1/zz_generated.deepcopy.go
index 382c218ba..c1ef4f7c3 100644
--- a/pkg/apis/sources/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/sources/v1alpha1/zz_generated.deepcopy.go
@@ -151,6 +151,11 @@ func (in *KafkaSourceSpec) DeepCopyInto(out *KafkaSourceSpec) {
 		(*in).DeepCopyInto(*out)
 	}
 	out.Resources = in.Resources
+	if in.CloudEventOverrides != nil {
+		in, out := &in.CloudEventOverrides, &out.CloudEventOverrides
+		*out = new(v1.CloudEventOverrides)
+		(*in).DeepCopyInto(*out)
+	}
 	return
 }
 
diff --git a/pkg/apis/sources/v1beta1/fuzzer.go b/pkg/apis/sources/v1beta1/fuzzer.go
new file mode 100644
index 000000000..52b8cc35b
--- /dev/null
+++ b/pkg/apis/sources/v1beta1/fuzzer.go
@@ -0,0 +1,45 @@
+/*
+Copyright 2020 The Knative Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1beta1
+
+import (
+	fuzz "github.com/google/gofuzz"
+	"k8s.io/apimachinery/pkg/api/apitesting/fuzzer"
+	"k8s.io/apimachinery/pkg/runtime/serializer"
+	pkgfuzzer "knative.dev/pkg/apis/testing/fuzzer"
+)
+
+// FuzzerFuncs includes fuzzing funcs for sources.knative.dev v1beta1 types
+//
+// For other examples see
+// https://github.com/kubernetes/apimachinery/blob/master/pkg/apis/meta/fuzzer/fuzzer.go
+var FuzzerFuncs = fuzzer.MergeFuzzerFuncs(
+	func(codecs serializer.CodecFactory) []interface{} {
+		return []interface{}{
+			func(s *KafkaSourceStatus, c fuzz.Continue) {
+				c.FuzzNoCustom(s) // fuzz the status object
+
+				// Clear the random fuzzed condition
+				s.Status.SetConditions(nil)
+
+				// Fuzz the known conditions except their type value
+				s.InitializeConditions()
+				pkgfuzzer.FuzzConditions(&s.Status, c)
+			},
+		}
+	},
+)
diff --git a/pkg/channel/consolidated/dispatcher/dispatcher.go b/pkg/channel/consolidated/dispatcher/dispatcher.go
index c3c9b2940..cbc46b3b1 100644
--- a/pkg/channel/consolidated/dispatcher/dispatcher.go
+++ b/pkg/channel/consolidated/dispatcher/dispatcher.go
@@ -27,14 +27,17 @@ import (
 	"github.com/Shopify/sarama"
 	protocolkafka "github.com/cloudevents/sdk-go/protocol/kafka_sarama/v2"
 	"github.com/cloudevents/sdk-go/v2/binding"
+	"github.com/google/uuid"
 	"go.opencensus.io/trace"
 	"go.uber.org/zap"
 	"k8s.io/apimachinery/pkg/types"
 	"knative.dev/eventing-kafka/pkg/channel/consolidated/utils"
+	"knative.dev/eventing-kafka/pkg/channel/distributed/common/env"
 	"knative.dev/eventing-kafka/pkg/common/consumer"
 	eventingchannels "knative.dev/eventing/pkg/channel"
 	"knative.dev/eventing/pkg/channel/fanout"
 	"knative.dev/eventing/pkg/kncloudevents"
+	"knative.dev/pkg/kmeta"
 )
 
 type KafkaDispatcher struct {
@@ -102,6 +105,16 @@ func NewDispatcher(ctx context.Context, args *KafkaDispatcherArgs) (*KafkaDispat
 		logger:               args.Logger,
 		topicFunc:            args.TopicFunc,
 	}
+
+	podName, err := env.GetRequiredConfigValue(args.Logger.Desugar(), env.PodNameEnvVarKey)
+	if err != nil {
+		return nil, err
+	}
+	containerName, err := env.GetRequiredConfigValue(args.Logger.Desugar(), env.ContainerNameEnvVarKEy)
+	if err != nil {
+		return nil, err
+	}
+	reporter := eventingchannels.NewStatsReporter(containerName, kmeta.ChildName(podName, uuid.New().String()))
 	receiverFunc, err := eventingchannels.NewMessageReceiver(
 		func(ctx context.Context, channel eventingchannels.ChannelReference, message binding.Message, transformers []binding.Transformer, _ nethttp.Header) error {
 			kafkaProducerMessage := sarama.ProducerMessage{
@@ -120,6 +133,7 @@ func NewDispatcher(ctx context.Context, args *KafkaDispatcherArgs) (*KafkaDispat
 			return nil
 		},
 		args.Logger.Desugar(),
+		reporter,
 		eventingchannels.ResolveMessageChannelFromHostHeader(dispatcher.getChannelReferenceFromHost))
 	if err != nil {
 		return nil, err
@@ -168,7 +182,7 @@ func (c consumerMessageHandler) Handle(ctx context.Context, consumerMessage *sar
 	ctx, span := startTraceFromMessage(c.logger, ctx, message, consumerMessage.Topic)
 	defer span.End()
 
-	err := c.dispatcher.DispatchMessageWithRetries(
+	_, err := c.dispatcher.DispatchMessageWithRetries(
 		ctx,
 		message,
 		nil,
diff --git a/pkg/channel/distributed/common/env/constants.go b/pkg/channel/distributed/common/env/constants.go
index a87c5d120..17484837e 100644
--- a/pkg/channel/distributed/common/env/constants.go
+++ b/pkg/channel/distributed/common/env/constants.go
@@ -24,6 +24,8 @@ const (
 	MetricsPortEnvVarKey    = "METRICS_PORT"
 	MetricsDomainEnvVarKey  = "METRICS_DOMAIN"
 	HealthPortEnvVarKey     = "HEALTH_PORT"
+	PodNameEnvVarKey        = "POD_NAME"
+	ContainerNameEnvVarKEy  = "CONTAINER_NAME"
 
 	// Kafka Authorization
 	KafkaBrokerEnvVarKey   = "KAFKA_BROKERS"
diff --git a/pkg/channel/distributed/dispatcher/dispatcher/handler.go b/pkg/channel/distributed/dispatcher/dispatcher/handler.go
index 00208cf0f..4b63b5bf0 100644
--- a/pkg/channel/distributed/dispatcher/dispatcher/handler.go
+++ b/pkg/channel/distributed/dispatcher/dispatcher/handler.go
@@ -141,7 +141,8 @@ func (h *Handler) consumeMessage(consumerMessage *sarama.ConsumerMessage, destin
 	}
 
 	// Dispatch The Message With Configured Retries & Return Any Errors
-	return h.MessageDispatcher.DispatchMessageWithRetries(context.Background(), message, nil, destinationURL, replyURL, deadLetterURL, retryConfig)
+	_, dispatchError := h.MessageDispatcher.DispatchMessageWithRetries(context.Background(), message, nil, destinationURL, replyURL, deadLetterURL, retryConfig)
+	return dispatchError
 }
 
 //
diff --git a/pkg/channel/distributed/dispatcher/env/environment.go b/pkg/channel/distributed/dispatcher/env/environment.go
index b267e1b5a..447fd5464 100644
--- a/pkg/channel/distributed/dispatcher/env/environment.go
+++ b/pkg/channel/distributed/dispatcher/env/environment.go
@@ -28,6 +28,10 @@ type Environment struct {
 	MetricsPort   int    // Required
 	MetricsDomain string // Required
 
+	// Pod information to be used by the metrics reporter
+	PodName       string // Required
+	ContainerName string // Required
+
 	// Health Configuration
 	HealthPort int // Required
 
@@ -63,6 +67,18 @@ func GetEnvironment(logger *zap.Logger) (*Environment, error) {
 		return nil, err
 	}
 
+	// Get The Required PodName Config Value
+	environment.PodName, err = env.GetRequiredConfigValue(logger, env.PodNameEnvVarKey)
+	if err != nil {
+		return nil, err
+	}
+
+	// Get The Required ContainerName Config Value
+	environment.ContainerName, err = env.GetRequiredConfigValue(logger, env.ContainerNameEnvVarKEy)
+	if err != nil {
+		return nil, err
+	}
+
 	// Get The Required HealthPort Port Config Value & Convert To Int
 	environment.HealthPort, err = env.GetRequiredConfigInt(logger, env.HealthPortEnvVarKey, "HealthPort")
 	if err != nil {
diff --git a/pkg/channel/distributed/receiver/env/environment.go b/pkg/channel/distributed/receiver/env/environment.go
index d0659ff24..ecab1a250 100644
--- a/pkg/channel/distributed/receiver/env/environment.go
+++ b/pkg/channel/distributed/receiver/env/environment.go
@@ -28,6 +28,10 @@ type Environment struct {
 	MetricsPort   int    // Required
 	MetricsDomain string // Required
 
+	// Pod information to be used by the metrics reporter
+	PodName       string // Required
+	ContainerName string // Required
+
 	// Health Configuration
 	HealthPort int // Required
 
@@ -61,6 +65,18 @@ func GetEnvironment(logger *zap.Logger) (*Environment, error) {
 		return nil, err
 	}
 
+	// Get The Required PodName Config Value
+	environment.PodName, err = env.GetRequiredConfigValue(logger, env.PodNameEnvVarKey)
+	if err != nil {
+		return nil, err
+	}
+
+	// Get The Required ContainerName Config Value
+	environment.ContainerName, err = env.GetRequiredConfigValue(logger, env.ContainerNameEnvVarKEy)
+	if err != nil {
+		return nil, err
+	}
+
 	// Get The Required HealthPort Port Config Value & Convert To Int
 	environment.HealthPort, err = env.GetRequiredConfigInt(logger, env.HealthPortEnvVarKey, "HealthPort")
 	if err != nil {
diff --git a/pkg/client/injection/reconciler/bindings/v1alpha1/kafkabinding/reconciler.go b/pkg/client/injection/reconciler/bindings/v1alpha1/kafkabinding/reconciler.go
index 97d97db56..5437e2868 100644
--- a/pkg/client/injection/reconciler/bindings/v1alpha1/kafkabinding/reconciler.go
+++ b/pkg/client/injection/reconciler/bindings/v1alpha1/kafkabinding/reconciler.go
@@ -179,7 +179,7 @@ func (r *reconcilerImpl) Reconcile(ctx context.Context, key string) error {
 	logger := logging.FromContext(ctx)
 
 	// Initialize the reconciler state. This will convert the namespace/name
-	// string into a distinct namespace and name, determin if this instance of
+	// string into a distinct namespace and name, determine if this instance of
 	// the reconciler is the leader, and any additional interfaces implemented
 	// by the reconciler. Returns an error is the resource key is invalid.
 	s, err := newState(key, r)
diff --git a/pkg/client/injection/reconciler/bindings/v1beta1/kafkabinding/reconciler.go b/pkg/client/injection/reconciler/bindings/v1beta1/kafkabinding/reconciler.go
index 414e4135d..c31fa4a49 100644
--- a/pkg/client/injection/reconciler/bindings/v1beta1/kafkabinding/reconciler.go
+++ b/pkg/client/injection/reconciler/bindings/v1beta1/kafkabinding/reconciler.go
@@ -179,7 +179,7 @@ func (r *reconcilerImpl) Reconcile(ctx context.Context, key string) error {
 	logger := logging.FromContext(ctx)
 
 	// Initialize the reconciler state. This will convert the namespace/name
-	// string into a distinct namespace and name, determin if this instance of
+	// string into a distinct namespace and name, determine if this instance of
 	// the reconciler is the leader, and any additional interfaces implemented
 	// by the reconciler. Returns an error is the resource key is invalid.
 	s, err := newState(key, r)
diff --git a/pkg/client/injection/reconciler/messaging/v1alpha1/kafkachannel/reconciler.go b/pkg/client/injection/reconciler/messaging/v1alpha1/kafkachannel/reconciler.go
index fe0d5dc0a..e3cea0c2d 100644
--- a/pkg/client/injection/reconciler/messaging/v1alpha1/kafkachannel/reconciler.go
+++ b/pkg/client/injection/reconciler/messaging/v1alpha1/kafkachannel/reconciler.go
@@ -179,7 +179,7 @@ func (r *reconcilerImpl) Reconcile(ctx context.Context, key string) error {
 	logger := logging.FromContext(ctx)
 
 	// Initialize the reconciler state. This will convert the namespace/name
-	// string into a distinct namespace and name, determin if this instance of
+	// string into a distinct namespace and name, determine if this instance of
 	// the reconciler is the leader, and any additional interfaces implemented
 	// by the reconciler. Returns an error is the resource key is invalid.
 	s, err := newState(key, r)
diff --git a/pkg/client/injection/reconciler/messaging/v1beta1/kafkachannel/reconciler.go b/pkg/client/injection/reconciler/messaging/v1beta1/kafkachannel/reconciler.go
index 8d1e27c85..24d29ea9d 100644
--- a/pkg/client/injection/reconciler/messaging/v1beta1/kafkachannel/reconciler.go
+++ b/pkg/client/injection/reconciler/messaging/v1beta1/kafkachannel/reconciler.go
@@ -179,7 +179,7 @@ func (r *reconcilerImpl) Reconcile(ctx context.Context, key string) error {
 	logger := logging.FromContext(ctx)
 
 	// Initialize the reconciler state. This will convert the namespace/name
-	// string into a distinct namespace and name, determin if this instance of
+	// string into a distinct namespace and name, determine if this instance of
 	// the reconciler is the leader, and any additional interfaces implemented
 	// by the reconciler. Returns an error is the resource key is invalid.
 	s, err := newState(key, r)
diff --git a/pkg/client/injection/reconciler/sources/v1alpha1/kafkasource/reconciler.go b/pkg/client/injection/reconciler/sources/v1alpha1/kafkasource/reconciler.go
index 42ef67e97..cbddc50df 100644
--- a/pkg/client/injection/reconciler/sources/v1alpha1/kafkasource/reconciler.go
+++ b/pkg/client/injection/reconciler/sources/v1alpha1/kafkasource/reconciler.go
@@ -179,7 +179,7 @@ func (r *reconcilerImpl) Reconcile(ctx context.Context, key string) error {
 	logger := logging.FromContext(ctx)
 
 	// Initialize the reconciler state. This will convert the namespace/name
-	// string into a distinct namespace and name, determin if this instance of
+	// string into a distinct namespace and name, determine if this instance of
 	// the reconciler is the leader, and any additional interfaces implemented
 	// by the reconciler. Returns an error is the resource key is invalid.
 	s, err := newState(key, r)
diff --git a/pkg/client/injection/reconciler/sources/v1beta1/kafkasource/reconciler.go b/pkg/client/injection/reconciler/sources/v1beta1/kafkasource/reconciler.go
index 9d69f44c3..05adc7eb7 100644
--- a/pkg/client/injection/reconciler/sources/v1beta1/kafkasource/reconciler.go
+++ b/pkg/client/injection/reconciler/sources/v1beta1/kafkasource/reconciler.go
@@ -179,7 +179,7 @@ func (r *reconcilerImpl) Reconcile(ctx context.Context, key string) error {
 	logger := logging.FromContext(ctx)
 
 	// Initialize the reconciler state. This will convert the namespace/name
-	// string into a distinct namespace and name, determin if this instance of
+	// string into a distinct namespace and name, determine if this instance of
 	// the reconciler is the leader, and any additional interfaces implemented
 	// by the reconciler. Returns an error is the resource key is invalid.
 	s, err := newState(key, r)
diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer/fuzzer.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer/fuzzer.go
new file mode 100644
index 000000000..68cf673b7
--- /dev/null
+++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer/fuzzer.go
@@ -0,0 +1,331 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package fuzzer
+
+import (
+	"fmt"
+	"math/rand"
+	"sort"
+	"strconv"
+	"strings"
+
+	fuzz "github.com/google/gofuzz"
+
+	apitesting "k8s.io/apimachinery/pkg/api/apitesting"
+	"k8s.io/apimachinery/pkg/api/apitesting/fuzzer"
+	"k8s.io/apimachinery/pkg/api/resource"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1"
+	"k8s.io/apimachinery/pkg/runtime"
+	runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer"
+	"k8s.io/apimachinery/pkg/types"
+)
+
+func genericFuzzerFuncs(codecs runtimeserializer.CodecFactory) []interface{} {
+	return []interface{}{
+		func(q *resource.Quantity, c fuzz.Continue) {
+			*q = *resource.NewQuantity(c.Int63n(1000), resource.DecimalExponent)
+		},
+		func(j *int, c fuzz.Continue) {
+			*j = int(c.Int31())
+		},
+		func(j **int, c fuzz.Continue) {
+			if c.RandBool() {
+				i := int(c.Int31())
+				*j = &i
+			} else {
+				*j = nil
+			}
+		},
+		func(j *runtime.TypeMeta, c fuzz.Continue) {
+			// We have to customize the randomization of TypeMetas because their
+			// APIVersion and Kind must remain blank in memory.
+			j.APIVersion = ""
+			j.Kind = ""
+		},
+		func(j *runtime.Object, c fuzz.Continue) {
+			// TODO: uncomment when round trip starts from a versioned object
+			if true { //c.RandBool() {
+				*j = &runtime.Unknown{
+					// We do not set TypeMeta here because it is not carried through a round trip
+					Raw:         []byte(`{"apiVersion":"unknown.group/unknown","kind":"Something","someKey":"someValue"}`),
+					ContentType: runtime.ContentTypeJSON,
+				}
+			} else {
+				types := []runtime.Object{&metav1.Status{}, &metav1.APIGroup{}}
+				t := types[c.Rand.Intn(len(types))]
+				c.Fuzz(t)
+				*j = t
+			}
+		},
+		func(r *runtime.RawExtension, c fuzz.Continue) {
+			// Pick an arbitrary type and fuzz it
+			types := []runtime.Object{&metav1.Status{}, &metav1.APIGroup{}}
+			obj := types[c.Rand.Intn(len(types))]
+			c.Fuzz(obj)
+
+			// Find a codec for converting the object to raw bytes.  This is necessary for the
+			// api version and kind to be correctly set be serialization.
+			var codec = apitesting.TestCodec(codecs, metav1.SchemeGroupVersion)
+
+			// Convert the object to raw bytes
+			bytes, err := runtime.Encode(codec, obj)
+			if err != nil {
+				panic(fmt.Sprintf("Failed to encode object: %v", err))
+			}
+
+			// strip trailing newlines which do not survive roundtrips
+			for len(bytes) >= 1 && bytes[len(bytes)-1] == 10 {
+				bytes = bytes[:len(bytes)-1]
+			}
+
+			// Set the bytes field on the RawExtension
+			r.Raw = bytes
+		},
+	}
+}
+
+// taken from gofuzz internals for RandString
+type charRange struct {
+	first, last rune
+}
+
+func (c *charRange) choose(r *rand.Rand) rune {
+	count := int64(c.last - c.first + 1)
+	ch := c.first + rune(r.Int63n(count))
+
+	return ch
+}
+
+// randomLabelPart produces a valid random label value or name-part
+// of a label key.
+func randomLabelPart(c fuzz.Continue, canBeEmpty bool) string {
+	validStartEnd := []charRange{{'0', '9'}, {'a', 'z'}, {'A', 'Z'}}
+	validMiddle := []charRange{{'0', '9'}, {'a', 'z'}, {'A', 'Z'},
+		{'.', '.'}, {'-', '-'}, {'_', '_'}}
+
+	partLen := c.Rand.Intn(64) // len is [0, 63]
+	if !canBeEmpty {
+		partLen = c.Rand.Intn(63) + 1 // len is [1, 63]
+	}
+
+	runes := make([]rune, partLen)
+	if partLen == 0 {
+		return string(runes)
+	}
+
+	runes[0] = validStartEnd[c.Rand.Intn(len(validStartEnd))].choose(c.Rand)
+	for i := range runes[1:] {
+		runes[i+1] = validMiddle[c.Rand.Intn(len(validMiddle))].choose(c.Rand)
+	}
+	runes[len(runes)-1] = validStartEnd[c.Rand.Intn(len(validStartEnd))].choose(c.Rand)
+
+	return string(runes)
+}
+
+func randomDNSLabel(c fuzz.Continue) string {
+	validStartEnd := []charRange{{'0', '9'}, {'a', 'z'}}
+	validMiddle := []charRange{{'0', '9'}, {'a', 'z'}, {'-', '-'}}
+
+	partLen := c.Rand.Intn(63) + 1 // len is [1, 63]
+	runes := make([]rune, partLen)
+
+	runes[0] = validStartEnd[c.Rand.Intn(len(validStartEnd))].choose(c.Rand)
+	for i := range runes[1:] {
+		runes[i+1] = validMiddle[c.Rand.Intn(len(validMiddle))].choose(c.Rand)
+	}
+	runes[len(runes)-1] = validStartEnd[c.Rand.Intn(len(validStartEnd))].choose(c.Rand)
+
+	return string(runes)
+}
+
+func randomLabelKey(c fuzz.Continue) string {
+	namePart := randomLabelPart(c, false)
+	prefixPart := ""
+
+	usePrefix := c.RandBool()
+	if usePrefix {
+		// we can fit, with dots, at most 3 labels in the 253 allotted characters
+		prefixPartsLen := c.Rand.Intn(2) + 1
+		prefixParts := make([]string, prefixPartsLen)
+		for i := range prefixParts {
+			prefixParts[i] = randomDNSLabel(c)
+		}
+		prefixPart = strings.Join(prefixParts, ".") + "/"
+	}
+
+	return prefixPart + namePart
+}
+
+func v1FuzzerFuncs(codecs runtimeserializer.CodecFactory) []interface{} {
+
+	return []interface{}{
+		func(j *metav1.TypeMeta, c fuzz.Continue) {
+			// We have to customize the randomization of TypeMetas because their
+			// APIVersion and Kind must remain blank in memory.
+			j.APIVersion = ""
+			j.Kind = ""
+		},
+		func(j *metav1.ObjectMeta, c fuzz.Continue) {
+			c.FuzzNoCustom(j)
+
+			j.ResourceVersion = strconv.FormatUint(c.RandUint64(), 10)
+			j.UID = types.UID(c.RandString())
+
+			var sec, nsec int64
+			c.Fuzz(&sec)
+			c.Fuzz(&nsec)
+			j.CreationTimestamp = metav1.Unix(sec, nsec).Rfc3339Copy()
+
+			if j.DeletionTimestamp != nil {
+				c.Fuzz(&sec)
+				c.Fuzz(&nsec)
+				t := metav1.Unix(sec, nsec).Rfc3339Copy()
+				j.DeletionTimestamp = &t
+			}
+
+			if len(j.Labels) == 0 {
+				j.Labels = nil
+			} else {
+				delete(j.Labels, "")
+			}
+			if len(j.Annotations) == 0 {
+				j.Annotations = nil
+			} else {
+				delete(j.Annotations, "")
+			}
+			if len(j.OwnerReferences) == 0 {
+				j.OwnerReferences = nil
+			}
+			if len(j.Finalizers) == 0 {
+				j.Finalizers = nil
+			}
+		},
+		func(j *metav1.ListMeta, c fuzz.Continue) {
+			j.ResourceVersion = strconv.FormatUint(c.RandUint64(), 10)
+			j.SelfLink = c.RandString()
+		},
+		func(j *metav1.LabelSelector, c fuzz.Continue) {
+			c.FuzzNoCustom(j)
+			// we can't have an entirely empty selector, so force
+			// use of MatchExpression if necessary
+			if len(j.MatchLabels) == 0 && len(j.MatchExpressions) == 0 {
+				j.MatchExpressions = make([]metav1.LabelSelectorRequirement, c.Rand.Intn(2)+1)
+			}
+
+			if j.MatchLabels != nil {
+				fuzzedMatchLabels := make(map[string]string, len(j.MatchLabels))
+				for i := 0; i < len(j.MatchLabels); i++ {
+					fuzzedMatchLabels[randomLabelKey(c)] = randomLabelPart(c, true)
+				}
+				j.MatchLabels = fuzzedMatchLabels
+			}
+
+			validOperators := []metav1.LabelSelectorOperator{
+				metav1.LabelSelectorOpIn,
+				metav1.LabelSelectorOpNotIn,
+				metav1.LabelSelectorOpExists,
+				metav1.LabelSelectorOpDoesNotExist,
+			}
+
+			if j.MatchExpressions != nil {
+				// NB: the label selector parser code sorts match expressions by key, and sorts the values,
+				// so we need to make sure ours are sorted as well here to preserve round-trip comparison.
+				// In practice, not sorting doesn't hurt anything...
+
+				for i := range j.MatchExpressions {
+					req := metav1.LabelSelectorRequirement{}
+					c.Fuzz(&req)
+					req.Key = randomLabelKey(c)
+					req.Operator = validOperators[c.Rand.Intn(len(validOperators))]
+					if req.Operator == metav1.LabelSelectorOpIn || req.Operator == metav1.LabelSelectorOpNotIn {
+						if len(req.Values) == 0 {
+							// we must have some values here, so randomly choose a short length
+							req.Values = make([]string, c.Rand.Intn(2)+1)
+						}
+						for i := range req.Values {
+							req.Values[i] = randomLabelPart(c, true)
+						}
+						sort.Strings(req.Values)
+					} else {
+						req.Values = nil
+					}
+					j.MatchExpressions[i] = req
+				}
+
+				sort.Slice(j.MatchExpressions, func(a, b int) bool { return j.MatchExpressions[a].Key < j.MatchExpressions[b].Key })
+			}
+		},
+		func(j *metav1.ManagedFieldsEntry, c fuzz.Continue) {
+			c.FuzzNoCustom(j)
+			j.FieldsV1 = nil
+		},
+	}
+}
+
+func v1beta1FuzzerFuncs(codecs runtimeserializer.CodecFactory) []interface{} {
+	return []interface{}{
+		func(r *metav1beta1.TableOptions, c fuzz.Continue) {
+			c.FuzzNoCustom(r)
+			// NoHeaders is not serialized to the wire but is allowed within the versioned
+			// type because we don't use meta internal types in the client and API server.
+			r.NoHeaders = false
+		},
+		func(r *metav1beta1.TableRow, c fuzz.Continue) {
+			c.Fuzz(&r.Object)
+			c.Fuzz(&r.Conditions)
+			if len(r.Conditions) == 0 {
+				r.Conditions = nil
+			}
+			n := c.Intn(10)
+			if n > 0 {
+				r.Cells = make([]interface{}, n)
+			}
+			for i := range r.Cells {
+				t := c.Intn(6)
+				switch t {
+				case 0:
+					r.Cells[i] = c.RandString()
+				case 1:
+					r.Cells[i] = c.Int63()
+				case 2:
+					r.Cells[i] = c.RandBool()
+				case 3:
+					x := map[string]interface{}{}
+					for j := c.Intn(10) + 1; j >= 0; j-- {
+						x[c.RandString()] = c.RandString()
+					}
+					r.Cells[i] = x
+				case 4:
+					x := make([]interface{}, c.Intn(10))
+					for i := range x {
+						x[i] = c.Int63()
+					}
+					r.Cells[i] = x
+				default:
+					r.Cells[i] = nil
+				}
+			}
+		},
+	}
+}
+
+var Funcs = fuzzer.MergeFuzzerFuncs(
+	genericFuzzerFuncs,
+	v1FuzzerFuncs,
+	v1beta1FuzzerFuncs,
+)
diff --git a/vendor/knative.dev/eventing/pkg/apis/config/defaults.go b/vendor/knative.dev/eventing/pkg/apis/config/defaults.go
index bf9857612..7375511ef 100644
--- a/vendor/knative.dev/eventing/pkg/apis/config/defaults.go
+++ b/vendor/knative.dev/eventing/pkg/apis/config/defaults.go
@@ -21,6 +21,8 @@ import (
 	"errors"
 	"fmt"
 
+	eventingduckv1 "knative.dev/eventing/pkg/apis/duck/v1"
+
 	"github.com/ghodss/yaml"
 
 	corev1 "k8s.io/api/core/v1"
@@ -70,34 +72,42 @@ func NewDefaultsConfigFromConfigMap(config *corev1.ConfigMap) (*Defaults, error)
 type Defaults struct {
 	// NamespaceDefaultsConfig are the default Broker Configs for each namespace.
 	// Namespace is the key, the value is the KReference to the config.
-	NamespaceDefaultsConfig map[string]*ClassAndKRef `json:"namespaceDefaults,omitempty"`
+	NamespaceDefaultsConfig map[string]*ClassAndBrokerConfig `json:"namespaceDefaults,omitempty"`
 
 	// ClusterDefaultBrokerConfig is the default broker config for all the namespaces that
 	// are not in NamespaceDefaultBrokerConfigs.
-	ClusterDefault *ClassAndKRef `json:"clusterDefault,omitempty"`
+	ClusterDefault *ClassAndBrokerConfig `json:"clusterDefault,omitempty"`
+}
+
+// ClassAndBrokerConfig contains configuration for a given namespace for broker. Allows
+// configuring the Class of the Broker, the reference to the
+// config it should use and it's delivery.
+type ClassAndBrokerConfig struct {
+	BrokerClass   string `json:"brokerClass,omitempty"`
+	*BrokerConfig `json:",inline"`
 }
 
-// ClassAndKRef contains configuration for a given namespace for broker. Allows
-// configuring both the Class of the Broker as well as the reference to the
-// config it should use
-type ClassAndKRef struct {
-	BrokerClass        string `json:"brokerClass,omitempty"`
+// BrokerConfig contains configuration for a given namespace for broker. Allows
+// configuring the reference to the
+// config it should use and it's delivery.
+type BrokerConfig struct {
 	*duckv1.KReference `json:",inline"`
+	Delivery           *eventingduckv1.DeliverySpec `json:"delivery,omitempty"`
 }
 
 // GetBrokerConfig returns a namespace specific Broker Configuration, and if
 // that doesn't exist, return a Cluster Default and if that doesn't exist
 // return an error.
-func (d *Defaults) GetBrokerConfig(ns string) (*duckv1.KReference, error) {
+func (d *Defaults) GetBrokerConfig(ns string) (*BrokerConfig, error) {
 	if d == nil {
 		return nil, errors.New("Defaults are nil")
 	}
 	value, present := d.NamespaceDefaultsConfig[ns]
-	if present && value.KReference != nil {
-		return value.KReference, nil
+	if present && value.BrokerConfig != nil {
+		return value.BrokerConfig, nil
 	}
-	if d.ClusterDefault != nil && d.ClusterDefault.KReference != nil {
-		return d.ClusterDefault.KReference, nil
+	if d.ClusterDefault != nil && d.ClusterDefault.BrokerConfig != nil {
+		return d.ClusterDefault.BrokerConfig, nil
 	}
 	return nil, errors.New("Defaults for Broker Configurations have not been set up.")
 }
diff --git a/vendor/knative.dev/eventing/pkg/apis/config/zz_generated.deepcopy.go b/vendor/knative.dev/eventing/pkg/apis/config/zz_generated.deepcopy.go
index bb1f1cb1a..d0e499453 100644
--- a/vendor/knative.dev/eventing/pkg/apis/config/zz_generated.deepcopy.go
+++ b/vendor/knative.dev/eventing/pkg/apis/config/zz_generated.deepcopy.go
@@ -21,26 +21,53 @@ limitations under the License.
 package config
 
 import (
+	duckv1 "knative.dev/eventing/pkg/apis/duck/v1"
 	v1 "knative.dev/pkg/apis/duck/v1"
 )
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ClassAndKRef) DeepCopyInto(out *ClassAndKRef) {
+func (in *BrokerConfig) DeepCopyInto(out *BrokerConfig) {
 	*out = *in
 	if in.KReference != nil {
 		in, out := &in.KReference, &out.KReference
 		*out = new(v1.KReference)
 		**out = **in
 	}
+	if in.Delivery != nil {
+		in, out := &in.Delivery, &out.Delivery
+		*out = new(duckv1.DeliverySpec)
+		(*in).DeepCopyInto(*out)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BrokerConfig.
+func (in *BrokerConfig) DeepCopy() *BrokerConfig {
+	if in == nil {
+		return nil
+	}
+	out := new(BrokerConfig)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ClassAndBrokerConfig) DeepCopyInto(out *ClassAndBrokerConfig) {
+	*out = *in
+	if in.BrokerConfig != nil {
+		in, out := &in.BrokerConfig, &out.BrokerConfig
+		*out = new(BrokerConfig)
+		(*in).DeepCopyInto(*out)
+	}
 	return
 }
 
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClassAndKRef.
-func (in *ClassAndKRef) DeepCopy() *ClassAndKRef {
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClassAndBrokerConfig.
+func (in *ClassAndBrokerConfig) DeepCopy() *ClassAndBrokerConfig {
 	if in == nil {
 		return nil
 	}
-	out := new(ClassAndKRef)
+	out := new(ClassAndBrokerConfig)
 	in.DeepCopyInto(out)
 	return out
 }
@@ -50,14 +77,14 @@ func (in *Defaults) DeepCopyInto(out *Defaults) {
 	*out = *in
 	if in.NamespaceDefaultsConfig != nil {
 		in, out := &in.NamespaceDefaultsConfig, &out.NamespaceDefaultsConfig
-		*out = make(map[string]*ClassAndKRef, len(*in))
+		*out = make(map[string]*ClassAndBrokerConfig, len(*in))
 		for key, val := range *in {
-			var outVal *ClassAndKRef
+			var outVal *ClassAndBrokerConfig
 			if val == nil {
 				(*out)[key] = nil
 			} else {
 				in, out := &val, &outVal
-				*out = new(ClassAndKRef)
+				*out = new(ClassAndBrokerConfig)
 				(*in).DeepCopyInto(*out)
 			}
 			(*out)[key] = outVal
@@ -65,7 +92,7 @@ func (in *Defaults) DeepCopyInto(out *Defaults) {
 	}
 	if in.ClusterDefault != nil {
 		in, out := &in.ClusterDefault, &out.ClusterDefault
-		*out = new(ClassAndKRef)
+		*out = new(ClassAndBrokerConfig)
 		(*in).DeepCopyInto(*out)
 	}
 	return
diff --git a/vendor/knative.dev/eventing/pkg/apis/duck/v1/fuzzer.go b/vendor/knative.dev/eventing/pkg/apis/duck/v1/fuzzer.go
index 5c21458ed..919324b97 100644
--- a/vendor/knative.dev/eventing/pkg/apis/duck/v1/fuzzer.go
+++ b/vendor/knative.dev/eventing/pkg/apis/duck/v1/fuzzer.go
@@ -41,7 +41,7 @@ var FuzzerFuncs = fuzzer.MergeFuzzerFuncs(
 				if ds.BackoffPolicy != nil && *ds.BackoffPolicy == "" {
 					ds.BackoffPolicy = nil
 				} else {
-					// nolint:gosec // Cryptographic randomness is not necessary.
+					//nolint:gosec // Cryptographic randomness is not necessary.
 					ds.BackoffPolicy = bops[rand.Intn(3)]
 				}
 			},
diff --git a/vendor/knative.dev/eventing/pkg/apis/duck/v1alpha1/subscribable_types.go b/vendor/knative.dev/eventing/pkg/apis/duck/v1alpha1/subscribable_types.go
index 50084245f..6589b71e1 100644
--- a/vendor/knative.dev/eventing/pkg/apis/duck/v1alpha1/subscribable_types.go
+++ b/vendor/knative.dev/eventing/pkg/apis/duck/v1alpha1/subscribable_types.go
@@ -117,7 +117,7 @@ var (
 // This is w.r.t https://github.com/knative/eventing/pull/1685#discussion_r314797276
 // Due to change in the API, we support reading of SubscribableTypeStatus#DeprecatedSubscribableStatus in a logical way
 // where we read the V2 value first and if the value is absent then we read the V1 value,
-// Having this function here makes it convinient to read the default value at runtime.
+// Having this function here makes it convenient to read the default value at runtime.
 func (s *SubscribableTypeStatus) GetSubscribableTypeStatus() *SubscribableStatus {
 	return s.SubscribableStatus
 }
diff --git a/vendor/knative.dev/eventing/pkg/apis/eventing/v1/broker_defaults.go b/vendor/knative.dev/eventing/pkg/apis/eventing/v1/broker_defaults.go
index 2ae42be8e..468964bb6 100644
--- a/vendor/knative.dev/eventing/pkg/apis/eventing/v1/broker_defaults.go
+++ b/vendor/knative.dev/eventing/pkg/apis/eventing/v1/broker_defaults.go
@@ -19,6 +19,8 @@ package v1
 import (
 	"context"
 
+	eventingduckv1 "knative.dev/eventing/pkg/apis/duck/v1"
+
 	"knative.dev/eventing/pkg/apis/config"
 	"knative.dev/eventing/pkg/apis/eventing"
 	"knative.dev/pkg/apis"
@@ -32,16 +34,23 @@ func (b *Broker) SetDefaults(ctx context.Context) {
 }
 
 func (bs *BrokerSpec) SetDefaults(ctx context.Context) {
-	if bs.Config != nil {
-		// Default the namespace if not given
-		bs.Config.SetDefaults(ctx)
-		return
-	}
-
 	cfg := config.FromContextOrDefaults(ctx)
 	c, err := cfg.Defaults.GetBrokerConfig(apis.ParentMeta(ctx).Namespace)
 	if err == nil {
-		c.SetDefaults(ctx)
-		bs.Config = c
+		if bs.Config == nil {
+			bs.Config = c.KReference
+		}
+		if bs.Delivery == nil && c.Delivery != nil {
+			bs.Delivery = &eventingduckv1.DeliverySpec{
+				DeadLetterSink: c.Delivery.DeadLetterSink,
+				Retry:          c.Delivery.Retry,
+				BackoffPolicy:  c.Delivery.BackoffPolicy,
+				BackoffDelay:   c.Delivery.BackoffDelay,
+			}
+		}
+	}
+	// Default the namespace if not given
+	if bs.Config != nil {
+		bs.Config.SetDefaults(ctx)
 	}
 }
diff --git a/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/broker_defaults.go b/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/broker_defaults.go
index 49e877970..8ec18d5c9 100644
--- a/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/broker_defaults.go
+++ b/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/broker_defaults.go
@@ -19,6 +19,8 @@ package v1beta1
 import (
 	"context"
 
+	eventingduckv1beta1 "knative.dev/eventing/pkg/apis/duck/v1beta1"
+
 	"knative.dev/eventing/pkg/apis/config"
 	"knative.dev/eventing/pkg/apis/eventing"
 	"knative.dev/pkg/apis"
@@ -32,16 +34,19 @@ func (b *Broker) SetDefaults(ctx context.Context) {
 }
 
 func (bs *BrokerSpec) SetDefaults(ctx context.Context) {
-	if bs.Config != nil {
-		// Default the namespace if not given
-		bs.Config.SetDefaults(ctx)
-		return
-	}
-
 	cfg := config.FromContextOrDefaults(ctx)
 	c, err := cfg.Defaults.GetBrokerConfig(apis.ParentMeta(ctx).Namespace)
 	if err == nil {
-		c.SetDefaults(ctx)
-		bs.Config = c
+		if bs.Config == nil {
+			bs.Config = c.KReference
+		}
+		if bs.Delivery == nil && c.Delivery != nil {
+			bs.Delivery = &eventingduckv1beta1.DeliverySpec{}
+			bs.Delivery.ConvertFrom(ctx, c.Delivery)
+		}
+	}
+	// Default the namespace if not given
+	if bs.Config != nil {
+		bs.Config.SetDefaults(ctx)
 	}
 }
diff --git a/vendor/knative.dev/eventing/pkg/apis/messaging/register.go b/vendor/knative.dev/eventing/pkg/apis/messaging/register.go
index 0574359ea..be3366f7c 100644
--- a/vendor/knative.dev/eventing/pkg/apis/messaging/register.go
+++ b/vendor/knative.dev/eventing/pkg/apis/messaging/register.go
@@ -26,7 +26,7 @@ const (
 )
 
 var (
-	// SubscriptionssResource represents a Knative Subscription
+	// SubscriptionsResource represents a Knative Subscription
 	SubscriptionsResource = schema.GroupResource{
 		Group:    GroupName,
 		Resource: "subscriptions",
diff --git a/vendor/knative.dev/eventing/pkg/apis/messaging/v1/in_memory_channel_lifecycle.go b/vendor/knative.dev/eventing/pkg/apis/messaging/v1/in_memory_channel_lifecycle.go
index ca3379469..971d7e42f 100644
--- a/vendor/knative.dev/eventing/pkg/apis/messaging/v1/in_memory_channel_lifecycle.go
+++ b/vendor/knative.dev/eventing/pkg/apis/messaging/v1/in_memory_channel_lifecycle.go
@@ -31,7 +31,7 @@ const (
 	InMemoryChannelConditionReady = apis.ConditionReady
 
 	// InMemoryChannelConditionDispatcherReady has status True when a Dispatcher deployment is ready
-	// Keyed off appsv1.DeploymentAvaialble, which means minimum available replicas required are up
+	// Keyed off appsv1.DeploymentAvailable, which means minimum available replicas required are up
 	// and running for at least minReadySeconds.
 	InMemoryChannelConditionDispatcherReady apis.ConditionType = "DispatcherReady"
 
diff --git a/vendor/knative.dev/eventing/pkg/apis/messaging/v1beta1/in_memory_channel_lifecycle.go b/vendor/knative.dev/eventing/pkg/apis/messaging/v1beta1/in_memory_channel_lifecycle.go
index 7ff31f0d3..66f3476e2 100644
--- a/vendor/knative.dev/eventing/pkg/apis/messaging/v1beta1/in_memory_channel_lifecycle.go
+++ b/vendor/knative.dev/eventing/pkg/apis/messaging/v1beta1/in_memory_channel_lifecycle.go
@@ -31,7 +31,7 @@ const (
 	InMemoryChannelConditionReady = apis.ConditionReady
 
 	// InMemoryChannelConditionDispatcherReady has status True when a Dispatcher deployment is ready
-	// Keyed off appsv1.DeploymentAvaialble, which means minimum available replicas required are up
+	// Keyed off appsv1.DeploymentAvailable, which means minimum available replicas required are up
 	// and running for at least minReadySeconds.
 	InMemoryChannelConditionDispatcherReady apis.ConditionType = "DispatcherReady"
 
diff --git a/vendor/knative.dev/eventing/pkg/channel/fanout/fanout_message_handler.go b/vendor/knative.dev/eventing/pkg/channel/fanout/fanout_message_handler.go
index 3b79fe6a8..11c7bf0f3 100644
--- a/vendor/knative.dev/eventing/pkg/channel/fanout/fanout_message_handler.go
+++ b/vendor/knative.dev/eventing/pkg/channel/fanout/fanout_message_handler.go
@@ -68,20 +68,22 @@ type MessageHandler struct {
 	// rather than a member variable.
 	timeout time.Duration
 
-	logger *zap.Logger
+	reporter channel.StatsReporter
+	logger   *zap.Logger
 }
 
 // NewMessageHandler creates a new fanout.MessageHandler.
-func NewMessageHandler(logger *zap.Logger, messageDispatcher channel.MessageDispatcher, config Config) (*MessageHandler, error) {
+func NewMessageHandler(logger *zap.Logger, messageDispatcher channel.MessageDispatcher, config Config, reporter channel.StatsReporter) (*MessageHandler, error) {
 	handler := &MessageHandler{
 		logger:     logger,
 		config:     config,
 		dispatcher: messageDispatcher,
 		timeout:    defaultTimeout,
+		reporter:   reporter,
 	}
 	// The receiver function needs to point back at the handler itself, so set it up after
 	// initialization.
-	receiver, err := channel.NewMessageReceiver(createMessageReceiverFunction(handler), logger)
+	receiver, err := channel.NewMessageReceiver(createMessageReceiverFunction(handler), logger, reporter)
 	if err != nil {
 		return nil, err
 	}
@@ -120,7 +122,7 @@ func SubscriberSpecToFanoutConfig(sub eventingduckv1.SubscriberSpec) (*Subscript
 
 func createMessageReceiverFunction(f *MessageHandler) func(context.Context, channel.ChannelReference, binding.Message, []binding.Transformer, nethttp.Header) error {
 	if f.config.AsyncHandler {
-		return func(ctx context.Context, _ channel.ChannelReference, message binding.Message, transformers []binding.Transformer, additionalHeaders nethttp.Header) error {
+		return func(ctx context.Context, ref channel.ChannelReference, message binding.Message, transformers []binding.Transformer, additionalHeaders nethttp.Header) error {
 			if len(f.config.Subscriptions) == 0 {
 				// Nothing to do here, finish the message and return
 				_ = message.Finish(nil)
@@ -128,30 +130,40 @@ func createMessageReceiverFunction(f *MessageHandler) func(context.Context, chan
 			}
 
 			parentSpan := trace.FromContext(ctx)
+			te := kncloudevents.TypeExtractorTransformer("")
+			transformers = append(transformers, &te)
 			// Message buffering here is done before starting the dispatch goroutine
 			// Because the message could be closed before the buffering happens
 			bufferedMessage, err := buffering.CopyMessage(ctx, message, transformers...)
 			if err != nil {
 				return err
 			}
+
+			reportArgs := channel.ReportArgs{}
+			reportArgs.EventType = string(te)
+			reportArgs.Ns = ref.Namespace
+
 			// We don't need the original message anymore
 			_ = message.Finish(nil)
-			go func(m binding.Message, h nethttp.Header, s *trace.Span) {
+			go func(m binding.Message, h nethttp.Header, s *trace.Span, r *channel.StatsReporter, args *channel.ReportArgs) {
 				// Run async dispatch with background context.
 				ctx = trace.NewContext(context.Background(), s)
 				// Any returned error is already logged in f.dispatch().
-				_ = f.dispatch(ctx, m, h)
-			}(bufferedMessage, additionalHeaders, parentSpan)
+				dispatchResultForFanout := f.dispatch(ctx, m, h)
+				_ = parseFanoutResultAndReportMetrics(dispatchResultForFanout, *r, *args)
+			}(bufferedMessage, additionalHeaders, parentSpan, &f.reporter, &reportArgs)
 			return nil
 		}
 	}
-	return func(ctx context.Context, _ channel.ChannelReference, message binding.Message, transformers []binding.Transformer, additionalHeaders nethttp.Header) error {
+	return func(ctx context.Context, ref channel.ChannelReference, message binding.Message, transformers []binding.Transformer, additionalHeaders nethttp.Header) error {
 		if len(f.config.Subscriptions) == 0 {
 			// Nothing to do here, finish the message and return
 			_ = message.Finish(nil)
 			return nil
 		}
 
+		te := kncloudevents.TypeExtractorTransformer("")
+		transformers = append(transformers, &te)
 		// We buffer the message to send it several times
 		bufferedMessage, err := buffering.CopyMessage(ctx, message, transformers...)
 		if err != nil {
@@ -159,7 +171,12 @@ func createMessageReceiverFunction(f *MessageHandler) func(context.Context, chan
 		}
 		// We don't need the original message anymore
 		_ = message.Finish(nil)
-		return f.dispatch(ctx, bufferedMessage, additionalHeaders)
+
+		reportArgs := channel.ReportArgs{}
+		reportArgs.EventType = string(te)
+		reportArgs.Ns = ref.Namespace
+		dispatchResultForFanout := f.dispatch(ctx, bufferedMessage, additionalHeaders)
+		return parseFanoutResultAndReportMetrics(dispatchResultForFanout, f.reporter, reportArgs)
 	}
 }
 
@@ -167,40 +184,80 @@ func (f *MessageHandler) ServeHTTP(response nethttp.ResponseWriter, request *net
 	f.receiver.ServeHTTP(response, request)
 }
 
+func parseFanoutResultAndReportMetrics(result dispatchResult, reporter channel.StatsReporter, reportArgs channel.ReportArgs) error {
+	if result.info != nil && result.info.Time > channel.NoDuration {
+		if result.info.ResponseCode > channel.NoResponse {
+			_ = reporter.ReportEventDispatchTime(&reportArgs, result.info.ResponseCode, result.info.Time)
+		} else {
+			_ = reporter.ReportEventDispatchTime(&reportArgs, nethttp.StatusInternalServerError, result.info.Time)
+		}
+	}
+	err := result.err
+	if err != nil {
+		channel.ReportEventCountMetricsForDispatchError(err, reporter, &reportArgs)
+	} else {
+		if result.info != nil {
+			_ = reporter.ReportEventCount(&reportArgs, result.info.ResponseCode)
+		}
+	}
+	return err
+}
+
 // dispatch takes the event, fans it out to each subscription in f.config. If all the fanned out
 // events return successfully, then return nil. Else, return an error.
-func (f *MessageHandler) dispatch(ctx context.Context, bufferedMessage binding.Message, additionalHeaders nethttp.Header) error {
+func (f *MessageHandler) dispatch(ctx context.Context, bufferedMessage binding.Message, additionalHeaders nethttp.Header) dispatchResult {
 	subs := len(f.config.Subscriptions)
 
 	// Bind the lifecycle of the buffered message to the number of subs
 	bufferedMessage = buffering.WithAcksBeforeFinish(bufferedMessage, subs)
 
-	errorCh := make(chan error, subs)
+	errorCh := make(chan dispatchResult, subs)
 	for _, sub := range f.config.Subscriptions {
 		go func(s Subscription) {
-			errorCh <- f.makeFanoutRequest(ctx, bufferedMessage, additionalHeaders, s)
+			dispatchedResultPerSub, err := f.makeFanoutRequest(ctx, bufferedMessage, additionalHeaders, s)
+			errorCh <- dispatchResult{err: err, info: dispatchedResultPerSub}
 		}(sub)
 	}
 
+	var totalDispatchTimeForFanout time.Duration = channel.NoDuration
+	dispatchResultForFanout := dispatchResult{
+		info: &channel.DispatchExecutionInfo{
+			Time:         channel.NoDuration,
+			ResponseCode: channel.NoResponse,
+		},
+	}
 	for range f.config.Subscriptions {
 		select {
-		case err := <-errorCh:
-			if err != nil {
-				f.logger.Error("Fanout had an error", zap.Error(err))
-				return err
+		case dispatchResult := <-errorCh:
+			if dispatchResult.info != nil {
+				if dispatchResult.info.Time > channel.NoDuration {
+					if totalDispatchTimeForFanout > channel.NoDuration {
+						totalDispatchTimeForFanout += dispatchResult.info.Time
+					} else {
+						totalDispatchTimeForFanout = dispatchResult.info.Time
+					}
+				}
+				dispatchResultForFanout.info.Time = totalDispatchTimeForFanout
+				dispatchResultForFanout.info.ResponseCode = dispatchResult.info.ResponseCode
+			}
+			if dispatchResult.err != nil {
+				f.logger.Error("Fanout had an error", zap.Error(dispatchResult.err))
+				dispatchResultForFanout.err = dispatchResult.err
+				return dispatchResultForFanout
 			}
 		case <-time.After(f.timeout):
 			f.logger.Error("Fanout timed out")
-			return errors.New("fanout timed out")
+			dispatchResultForFanout.err = errors.New("fanout timed out")
+			return dispatchResultForFanout
 		}
 	}
 	// All Subscriptions returned err = nil.
-	return nil
+	return dispatchResultForFanout
 }
 
 // makeFanoutRequest sends the request to exactly one subscription. It handles both the `call` and
 // the `sink` portions of the subscription.
-func (f *MessageHandler) makeFanoutRequest(ctx context.Context, message binding.Message, additionalHeaders nethttp.Header, sub Subscription) error {
+func (f *MessageHandler) makeFanoutRequest(ctx context.Context, message binding.Message, additionalHeaders nethttp.Header, sub Subscription) (*channel.DispatchExecutionInfo, error) {
 	return f.dispatcher.DispatchMessageWithRetries(
 		ctx,
 		message,
@@ -211,3 +268,8 @@ func (f *MessageHandler) makeFanoutRequest(ctx context.Context, message binding.
 		sub.RetryConfig,
 	)
 }
+
+type dispatchResult struct {
+	err  error
+	info *channel.DispatchExecutionInfo
+}
diff --git a/vendor/knative.dev/eventing/pkg/channel/message_dispatcher.go b/vendor/knative.dev/eventing/pkg/channel/message_dispatcher.go
index 07da58f41..8607b6ca4 100644
--- a/vendor/knative.dev/eventing/pkg/channel/message_dispatcher.go
+++ b/vendor/knative.dev/eventing/pkg/channel/message_dispatcher.go
@@ -21,6 +21,7 @@ import (
 	"fmt"
 	nethttp "net/http"
 	"net/url"
+	"time"
 
 	cloudevents "github.com/cloudevents/sdk-go/v2"
 	"github.com/cloudevents/sdk-go/v2/binding"
@@ -33,16 +34,22 @@ import (
 	"knative.dev/eventing/pkg/utils"
 )
 
+const (
+	// noDuration signals that the dispatch step hasn't started
+	NoDuration = -1
+	NoResponse = -1
+)
+
 type MessageDispatcher interface {
 	// DispatchMessage dispatches an event to a destination over HTTP.
 	//
 	// The destination and reply are URLs.
-	DispatchMessage(ctx context.Context, message cloudevents.Message, additionalHeaders nethttp.Header, destination *url.URL, reply *url.URL, deadLetter *url.URL) error
+	DispatchMessage(ctx context.Context, message cloudevents.Message, additionalHeaders nethttp.Header, destination *url.URL, reply *url.URL, deadLetter *url.URL) (*DispatchExecutionInfo, error)
 
 	// DispatchMessageWithRetries dispatches an event to a destination over HTTP.
 	//
 	// The destination and reply are URLs.
-	DispatchMessageWithRetries(ctx context.Context, message cloudevents.Message, additionalHeaders nethttp.Header, destination *url.URL, reply *url.URL, deadLetter *url.URL, config *kncloudevents.RetryConfig) error
+	DispatchMessageWithRetries(ctx context.Context, message cloudevents.Message, additionalHeaders nethttp.Header, destination *url.URL, reply *url.URL, deadLetter *url.URL, config *kncloudevents.RetryConfig) (*DispatchExecutionInfo, error)
 }
 
 // MessageDispatcherImpl is the 'real' MessageDispatcher used everywhere except unit tests.
@@ -56,6 +63,11 @@ type MessageDispatcherImpl struct {
 	logger *zap.Logger
 }
 
+type DispatchExecutionInfo struct {
+	Time         time.Duration
+	ResponseCode int
+}
+
 // NewMessageDispatcher creates a new Message dispatcher that can dispatch
 // events to HTTP destinations.
 func NewMessageDispatcher(logger *zap.Logger) *MessageDispatcherImpl {
@@ -80,12 +92,11 @@ func NewMessageDispatcherFromSender(logger *zap.Logger, sender *kncloudevents.HT
 	}
 }
 
-func (d *MessageDispatcherImpl) DispatchMessage(ctx context.Context, message cloudevents.Message, additionalHeaders nethttp.Header, destination *url.URL, reply *url.URL, deadLetter *url.URL) error {
+func (d *MessageDispatcherImpl) DispatchMessage(ctx context.Context, message cloudevents.Message, additionalHeaders nethttp.Header, destination *url.URL, reply *url.URL, deadLetter *url.URL) (*DispatchExecutionInfo, error) {
 	return d.DispatchMessageWithRetries(ctx, message, additionalHeaders, destination, reply, deadLetter, nil)
 }
 
-func (d *MessageDispatcherImpl) DispatchMessageWithRetries(ctx context.Context, message cloudevents.Message, additionalHeaders nethttp.Header, destination *url.URL, reply *url.URL, deadLetter *url.URL, retriesConfig *kncloudevents.RetryConfig) error {
-
+func (d *MessageDispatcherImpl) DispatchMessageWithRetries(ctx context.Context, message cloudevents.Message, additionalHeaders nethttp.Header, destination *url.URL, reply *url.URL, deadLetter *url.URL, retriesConfig *kncloudevents.RetryConfig) (*DispatchExecutionInfo, error) {
 	// All messages that should be finished at the end of this function
 	// are placed in this slice
 	var messagesToFinish []binding.Message
@@ -104,29 +115,28 @@ func (d *MessageDispatcherImpl) DispatchMessageWithRetries(ctx context.Context,
 	// Otherwise, they are filled with the original message
 	var responseMessage cloudevents.Message
 	var responseAdditionalHeaders nethttp.Header
-
+	var dispatchExecutionInfo *DispatchExecutionInfo
 	if destination != nil {
 		var err error
 		// Try to send to destination
 		messagesToFinish = append(messagesToFinish, message)
 
-		ctx, responseMessage, responseAdditionalHeaders, err = d.executeRequest(ctx, destination, message, additionalHeaders, retriesConfig)
+		ctx, responseMessage, responseAdditionalHeaders, dispatchExecutionInfo, err = d.executeRequest(ctx, destination, message, additionalHeaders, retriesConfig)
 		if err != nil {
 			// DeadLetter is configured, send the message to it
 			if deadLetter != nil {
-
-				_, deadLetterResponse, _, deadLetterErr := d.executeRequest(ctx, deadLetter, message, additionalHeaders, retriesConfig)
+				_, deadLetterResponse, _, dispatchExecutionInfo, deadLetterErr := d.executeRequest(ctx, deadLetter, message, additionalHeaders, retriesConfig)
 				if deadLetterErr != nil {
-					return fmt.Errorf("unable to complete request to either %s (%v) or %s (%v)", destination, err, deadLetter, deadLetterErr)
+					return dispatchExecutionInfo, fmt.Errorf("unable to complete request to either %s (%v) or %s (%v)", destination, err, deadLetter, deadLetterErr)
 				}
 				if deadLetterResponse != nil {
 					messagesToFinish = append(messagesToFinish, deadLetterResponse)
 				}
 
-				return nil
+				return dispatchExecutionInfo, nil
 			}
 			// No DeadLetter, just fail
-			return fmt.Errorf("unable to complete request to %s: %v", destination, err)
+			return dispatchExecutionInfo, fmt.Errorf("unable to complete request to %s: %v", destination, err)
 		}
 	} else {
 		// No destination url, try to send to reply if available
@@ -136,49 +146,53 @@ func (d *MessageDispatcherImpl) DispatchMessageWithRetries(ctx context.Context,
 
 	// No response, dispatch completed
 	if responseMessage == nil {
-		return nil
+		return dispatchExecutionInfo, nil
 	}
 
 	messagesToFinish = append(messagesToFinish, responseMessage)
 
 	if reply == nil {
 		d.logger.Debug("cannot forward response as reply is empty")
-		return nil
+		return dispatchExecutionInfo, nil
 	}
 
-	ctx, responseResponseMessage, _, err := d.executeRequest(ctx, reply, responseMessage, responseAdditionalHeaders, retriesConfig)
+	ctx, responseResponseMessage, _, dispatchExecutionInfo, err := d.executeRequest(ctx, reply, responseMessage, responseAdditionalHeaders, retriesConfig)
 	if err != nil {
 		// DeadLetter is configured, send the message to it
 		if deadLetter != nil {
-			_, deadLetterResponse, _, deadLetterErr := d.executeRequest(ctx, deadLetter, message, responseAdditionalHeaders, retriesConfig)
+			_, deadLetterResponse, _, dispatchExecutionInfo, deadLetterErr := d.executeRequest(ctx, deadLetter, message, responseAdditionalHeaders, retriesConfig)
 			if deadLetterErr != nil {
-				return fmt.Errorf("failed to forward reply to %s (%v) and failed to send it to the dead letter sink %s (%v)", reply, err, deadLetter, deadLetterErr)
+				return dispatchExecutionInfo, fmt.Errorf("failed to forward reply to %s (%v) and failed to send it to the dead letter sink %s (%v)", reply, err, deadLetter, deadLetterErr)
 			}
 			if deadLetterResponse != nil {
 				messagesToFinish = append(messagesToFinish, deadLetterResponse)
 			}
 
-			return nil
+			return dispatchExecutionInfo, nil
 		}
 		// No DeadLetter, just fail
-		return fmt.Errorf("failed to forward reply to %s: %v", reply, err)
+		return dispatchExecutionInfo, fmt.Errorf("failed to forward reply to %s: %v", reply, err)
 	}
 	if responseResponseMessage != nil {
 		messagesToFinish = append(messagesToFinish, responseResponseMessage)
 	}
 
-	return nil
+	return dispatchExecutionInfo, nil
 }
 
-func (d *MessageDispatcherImpl) executeRequest(ctx context.Context, url *url.URL, message cloudevents.Message, additionalHeaders nethttp.Header, configs *kncloudevents.RetryConfig) (context.Context, cloudevents.Message, nethttp.Header, error) {
+func (d *MessageDispatcherImpl) executeRequest(ctx context.Context, url *url.URL, message cloudevents.Message, additionalHeaders nethttp.Header, configs *kncloudevents.RetryConfig) (context.Context, cloudevents.Message, nethttp.Header, *DispatchExecutionInfo, error) {
 	d.logger.Debug("Dispatching event", zap.String("url", url.String()))
 
+	execInfo := DispatchExecutionInfo{
+		Time:         NoDuration,
+		ResponseCode: NoResponse,
+	}
 	ctx, span := trace.StartSpan(ctx, "knative.dev", trace.WithSpanKind(trace.SpanKindClient))
 	defer span.End()
 
 	req, err := d.sender.NewCloudEventRequestWithTarget(ctx, url.String())
 	if err != nil {
-		return ctx, nil, nil, err
+		return ctx, nil, nil, &execInfo, err
 	}
 
 	if span.IsRecordingEvents() {
@@ -187,25 +201,35 @@ func (d *MessageDispatcherImpl) executeRequest(ctx context.Context, url *url.URL
 		err = kncloudevents.WriteHTTPRequestWithAdditionalHeaders(ctx, message, req, additionalHeaders)
 	}
 	if err != nil {
-		return ctx, nil, nil, err
+		return ctx, nil, nil, &execInfo, err
 	}
 
+	start := time.Now()
 	response, err := d.sender.SendWithRetries(req, configs)
+	dispatchTime := time.Since(start)
 	if err != nil {
-		return ctx, nil, nil, err
+		execInfo.Time = dispatchTime
+		execInfo.ResponseCode = nethttp.StatusInternalServerError
+		return ctx, nil, nil, &execInfo, err
 	}
+
+	if response != nil {
+		execInfo.ResponseCode = response.StatusCode
+	}
+	execInfo.Time = dispatchTime
+
 	if isFailure(response.StatusCode) {
 		_ = response.Body.Close()
 		// Reject non-successful responses.
-		return ctx, nil, nil, fmt.Errorf("unexpected HTTP response, expected 2xx, got %d", response.StatusCode)
+		return ctx, nil, nil, &execInfo, fmt.Errorf("unexpected HTTP response, expected 2xx, got %d", response.StatusCode)
 	}
 	responseMessage := http.NewMessageFromHttpResponse(response)
 	if responseMessage.ReadEncoding() == binding.EncodingUnknown {
 		_ = response.Body.Close()
 		d.logger.Debug("Response is a non event, discarding it", zap.Int("status_code", response.StatusCode))
-		return ctx, nil, nil, nil
+		return ctx, nil, nil, &execInfo, nil
 	}
-	return ctx, responseMessage, utils.PassThroughHeaders(response.Header), nil
+	return ctx, responseMessage, utils.PassThroughHeaders(response.Header), &execInfo, nil
 }
 
 func (d *MessageDispatcherImpl) sanitizeURL(u *url.URL) *url.URL {
diff --git a/vendor/knative.dev/eventing/pkg/channel/message_receiver.go b/vendor/knative.dev/eventing/pkg/channel/message_receiver.go
index 6546c7b51..d124e38f6 100644
--- a/vendor/knative.dev/eventing/pkg/channel/message_receiver.go
+++ b/vendor/knative.dev/eventing/pkg/channel/message_receiver.go
@@ -57,6 +57,7 @@ type MessageReceiver struct {
 	receiverFunc         UnbufferedMessageReceiverFunc
 	logger               *zap.Logger
 	hostToChannelFunc    ResolveChannelFromHostFunc
+	reporter             StatsReporter
 }
 
 // UnbufferedMessageReceiverFunc is the function to be called for handling the message.
@@ -84,13 +85,14 @@ func ResolveMessageChannelFromHostHeader(hostToChannelFunc ResolveChannelFromHos
 
 // NewMessageReceiver creates an event receiver passing new events to the
 // receiverFunc.
-func NewMessageReceiver(receiverFunc UnbufferedMessageReceiverFunc, logger *zap.Logger, opts ...MessageReceiverOptions) (*MessageReceiver, error) {
+func NewMessageReceiver(receiverFunc UnbufferedMessageReceiverFunc, logger *zap.Logger, reporter StatsReporter, opts ...MessageReceiverOptions) (*MessageReceiver, error) {
 	bindingsReceiver := kncloudevents.NewHTTPMessageReceiver(8080)
 	receiver := &MessageReceiver{
 		httpBindingsReceiver: bindingsReceiver,
 		receiverFunc:         receiverFunc,
 		hostToChannelFunc:    ResolveChannelFromHostFunc(ParseChannel),
 		logger:               logger,
+		reporter:             reporter,
 	}
 	for _, opt := range opts {
 		if err := opt(receiver); err != nil {
@@ -123,7 +125,7 @@ func (r *MessageReceiver) Start(ctx context.Context) error {
 	}
 
 	// Done channel has been closed, we need to gracefully shutdown r.ceClient. The cancel() method will start its
-	// shutdown, if it hasn't finished in a reasonable amount of time, just return an error.
+	// shutdown, if it hasn't finished in a reasonable amount of Time, just return an error.
 	cancel()
 	select {
 	case err := <-errCh:
@@ -145,6 +147,8 @@ func (r *MessageReceiver) ServeHTTP(response nethttp.ResponseWriter, request *ne
 		return
 	}
 
+	args := ReportArgs{}
+
 	// The response status codes:
 	//   202 - the event was sent to subscribers
 	//   404 - the request was for an unknown channel
@@ -160,18 +164,20 @@ func (r *MessageReceiver) ServeHTTP(response nethttp.ResponseWriter, request *ne
 			r.logger.Info("Could not extract channel", zap.Error(err))
 			response.WriteHeader(nethttp.StatusInternalServerError)
 		}
+		ReportEventCountMetricsForDispatchError(err, r.reporter, &args)
 		return
 	}
 	r.logger.Debug("Request mapped to channel", zap.String("channel", channel.String()))
 
-	message := http.NewMessageFromHttpRequest(request)
+	args.Ns = channel.Namespace
 
+	message := http.NewMessageFromHttpRequest(request)
 	if message.ReadEncoding() == binding.EncodingUnknown {
 		r.logger.Info("Cannot determine the cloudevent message encoding")
 		response.WriteHeader(nethttp.StatusBadRequest)
+		r.reporter.ReportEventCount(&args, nethttp.StatusBadRequest)
 		return
 	}
-
 	err = r.receiverFunc(request.Context(), channel, message, []binding.Transformer{AddHistory(host)}, utils.PassThroughHeaders(request.Header))
 	if err != nil {
 		if _, ok := err.(*UnknownChannelError); ok {
@@ -182,8 +188,15 @@ func (r *MessageReceiver) ServeHTTP(response nethttp.ResponseWriter, request *ne
 		}
 		return
 	}
-
 	response.WriteHeader(nethttp.StatusAccepted)
 }
 
+func ReportEventCountMetricsForDispatchError(err error, reporter StatsReporter, args *ReportArgs) {
+	if _, ok := err.(*UnknownChannelError); ok {
+		_ = reporter.ReportEventCount(args, nethttp.StatusNotFound)
+	} else {
+		_ = reporter.ReportEventCount(args, nethttp.StatusInternalServerError)
+	}
+}
+
 var _ nethttp.Handler = (*MessageReceiver)(nil)
diff --git a/vendor/knative.dev/eventing/pkg/channel/stats_reporter.go b/vendor/knative.dev/eventing/pkg/channel/stats_reporter.go
new file mode 100644
index 000000000..ae9232108
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/channel/stats_reporter.go
@@ -0,0 +1,151 @@
+/*
+Copyright 2020 The Knative Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package channel
+
+import (
+	"context"
+	"log"
+	"strconv"
+	"time"
+
+	"go.opencensus.io/stats"
+	"go.opencensus.io/stats/view"
+	"go.opencensus.io/tag"
+	"knative.dev/pkg/metrics"
+	"knative.dev/pkg/metrics/metricskey"
+)
+
+var (
+	// eventCountM is a counter which records the number of events received
+	// by the in-memory Channel.
+	eventCountM = stats.Int64(
+		"event_count",
+		"Number of events dispatched by the in-memory channel",
+		stats.UnitDimensionless,
+	)
+
+	// dispatchTimeInMsecM records the Time spent dispatching an event to
+	// a Channel, in milliseconds.
+	dispatchTimeInMsecM = stats.Float64(
+		"event_dispatch_latencies",
+		"The Time spent dispatching an event from a in-memoryChannel",
+		stats.UnitMilliseconds,
+	)
+
+	// Create the tag keys that will be used to add tags to our measurements.
+	// Tag keys must conform to the restrictions described in
+	// go.opencensus.io/tag/validate.go. Currently those restrictions are:
+	// - length between 1 and 255 inclusive
+	// - characters are printable US-ASCII
+	namespaceKey         = tag.MustNewKey(metricskey.LabelNamespaceName)
+	eventTypeKey         = tag.MustNewKey(metricskey.LabelEventType)
+	responseCodeKey      = tag.MustNewKey(metricskey.LabelResponseCode)
+	responseCodeClassKey = tag.MustNewKey(metricskey.LabelResponseCodeClass)
+)
+
+type ReportArgs struct {
+	Ns        string
+	EventType string
+}
+
+func init() {
+	register()
+}
+
+type StatsReporter interface {
+	ReportEventCount(args *ReportArgs, responseCode int) error
+	ReportEventDispatchTime(args *ReportArgs, responseCode int, d time.Duration) error
+}
+
+var _ StatsReporter = (*reporter)(nil)
+var emptyContext = context.Background()
+
+// Reporter holds cached metric objects to report channel metrics.
+type reporter struct {
+	container  string
+	uniqueName string
+}
+
+// NewStatsReporter creates a reporter that collects and reports channel metrics.
+func NewStatsReporter(container, uniqueName string) StatsReporter {
+	return &reporter{
+		container:  container,
+		uniqueName: uniqueName,
+	}
+}
+
+func register() {
+	tagKeys := []tag.Key{
+		namespaceKey,
+		eventTypeKey,
+		responseCodeKey,
+		responseCodeClassKey,
+		UniqueTagKey,
+		ContainerTagKey,
+	}
+
+	// Create view to see our measurements.
+	err := metrics.RegisterResourceView(
+		&view.View{
+			Description: eventCountM.Description(),
+			Measure:     eventCountM,
+			Aggregation: view.Count(),
+			TagKeys:     tagKeys,
+		},
+		&view.View{
+			Description: dispatchTimeInMsecM.Description(),
+			Measure:     dispatchTimeInMsecM,
+			Aggregation: view.Distribution(metrics.Buckets125(1, 10000)...), // 1, 2, 5, 10, 20, 50, 100, 500, 1000, 5000, 10000
+			TagKeys:     tagKeys,
+		},
+	)
+	if err != nil {
+		log.Print("failed to register opencensus views, " + err.Error())
+	}
+}
+
+// ReportEventCount captures the event count.
+func (r *reporter) ReportEventCount(args *ReportArgs, responseCode int) error {
+	ctx, err := r.generateTag(args, responseCode)
+	if err != nil {
+		return err
+	}
+	metrics.Record(ctx, eventCountM.M(1))
+	return nil
+}
+
+// ReportEventDispatchTime captures dispatch times.
+func (r *reporter) ReportEventDispatchTime(args *ReportArgs, responseCode int, d time.Duration) error {
+	ctx, err := r.generateTag(args, responseCode)
+	if err != nil {
+		return err
+	}
+	// convert Time.Duration in nanoseconds to milliseconds.
+	metrics.Record(ctx, dispatchTimeInMsecM.M(float64(d/time.Millisecond)))
+	return nil
+}
+
+func (r *reporter) generateTag(args *ReportArgs, responseCode int) (context.Context, error) {
+	return tag.New(
+		emptyContext,
+		tag.Insert(namespaceKey, args.Ns),
+		tag.Insert(eventTypeKey, args.EventType),
+		tag.Insert(responseCodeKey, strconv.Itoa(responseCode)),
+		tag.Insert(responseCodeClassKey, metrics.ResponseCodeClass(responseCode)),
+		tag.Insert(ContainerTagKey, r.container),
+		tag.Insert(UniqueTagKey, r.uniqueName))
+}
diff --git a/vendor/knative.dev/eventing/pkg/client/injection/reconciler/eventing/v1/broker/reconciler.go b/vendor/knative.dev/eventing/pkg/client/injection/reconciler/eventing/v1/broker/reconciler.go
index d9f45b56a..81c6aa3f5 100644
--- a/vendor/knative.dev/eventing/pkg/client/injection/reconciler/eventing/v1/broker/reconciler.go
+++ b/vendor/knative.dev/eventing/pkg/client/injection/reconciler/eventing/v1/broker/reconciler.go
@@ -183,7 +183,7 @@ func (r *reconcilerImpl) Reconcile(ctx context.Context, key string) error {
 	logger := logging.FromContext(ctx)
 
 	// Initialize the reconciler state. This will convert the namespace/name
-	// string into a distinct namespace and name, determin if this instance of
+	// string into a distinct namespace and name, determine if this instance of
 	// the reconciler is the leader, and any additional interfaces implemented
 	// by the reconciler. Returns an error is the resource key is invalid.
 	s, err := newState(key, r)
diff --git a/vendor/knative.dev/eventing/pkg/client/injection/reconciler/eventing/v1beta1/broker/reconciler.go b/vendor/knative.dev/eventing/pkg/client/injection/reconciler/eventing/v1beta1/broker/reconciler.go
index 4787f967c..33db1c92a 100644
--- a/vendor/knative.dev/eventing/pkg/client/injection/reconciler/eventing/v1beta1/broker/reconciler.go
+++ b/vendor/knative.dev/eventing/pkg/client/injection/reconciler/eventing/v1beta1/broker/reconciler.go
@@ -183,7 +183,7 @@ func (r *reconcilerImpl) Reconcile(ctx context.Context, key string) error {
 	logger := logging.FromContext(ctx)
 
 	// Initialize the reconciler state. This will convert the namespace/name
-	// string into a distinct namespace and name, determin if this instance of
+	// string into a distinct namespace and name, determine if this instance of
 	// the reconciler is the leader, and any additional interfaces implemented
 	// by the reconciler. Returns an error is the resource key is invalid.
 	s, err := newState(key, r)
diff --git a/vendor/knative.dev/eventing/pkg/kncloudevents/utils.go b/vendor/knative.dev/eventing/pkg/kncloudevents/utils.go
index 3fb4fae10..c97a3cae9 100644
--- a/vendor/knative.dev/eventing/pkg/kncloudevents/utils.go
+++ b/vendor/knative.dev/eventing/pkg/kncloudevents/utils.go
@@ -21,7 +21,9 @@ import (
 	nethttp "net/http"
 
 	"github.com/cloudevents/sdk-go/v2/binding"
+	"github.com/cloudevents/sdk-go/v2/binding/spec"
 	"github.com/cloudevents/sdk-go/v2/protocol/http"
+	"github.com/cloudevents/sdk-go/v2/types"
 )
 
 func WriteHTTPRequestWithAdditionalHeaders(ctx context.Context, message binding.Message, req *nethttp.Request,
@@ -37,3 +39,17 @@ func WriteHTTPRequestWithAdditionalHeaders(ctx context.Context, message binding.
 
 	return nil
 }
+
+type TypeExtractorTransformer string
+
+func (a *TypeExtractorTransformer) Transform(reader binding.MessageMetadataReader, _ binding.MessageMetadataWriter) error {
+	_, ty := reader.GetAttribute(spec.Type)
+	if ty != nil {
+		tyParsed, err := types.ToString(ty)
+		if err != nil {
+			return err
+		}
+		*a = TypeExtractorTransformer(tyParsed)
+	}
+	return nil
+}
diff --git a/vendor/knative.dev/pkg/apis/duck/README.md b/vendor/knative.dev/pkg/apis/duck/README.md
index 688f54246..f26325694 100644
--- a/vendor/knative.dev/pkg/apis/duck/README.md
+++ b/vendor/knative.dev/pkg/apis/duck/README.md
@@ -6,7 +6,7 @@ three duck types that are used throughout Knative: `Addressable`, `Binding`, and
 `Source`.
 
 For APIs leveraging `ObjectReference`, the context of the resource in question
-identifies the duck-type. To enable the case where no `ObjectRefrence` is used,
+identifies the duck-type. To enable the case where no `ObjectReference` is used,
 we have labeled the Custom Resource Definition with the duck-type. Those labels
 are as follows:
 
diff --git a/vendor/knative.dev/pkg/apis/field_error.go b/vendor/knative.dev/pkg/apis/field_error.go
index e807ec781..4a5242851 100644
--- a/vendor/knative.dev/pkg/apis/field_error.go
+++ b/vendor/knative.dev/pkg/apis/field_error.go
@@ -317,7 +317,7 @@ func ErrDisallowedUpdateDeprecatedFields(fieldPaths ...string) *FieldError {
 	}
 }
 
-// ErrInvalidArrayValue constructs a FieldError for a repetetive `field`
+// ErrInvalidArrayValue constructs a FieldError for a repetitive `field`
 // at `index` that has received an invalid value.
 func ErrInvalidArrayValue(value interface{}, field string, index int) *FieldError {
 	return ErrInvalidValue(value, CurrentField).ViaFieldIndex(field, index)
diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_reconciler.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_reconciler.go
index 47b5167bf..ad7b72684 100644
--- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_reconciler.go
+++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_reconciler.go
@@ -363,7 +363,7 @@ func (r *reconcilerImpl) Reconcile(ctx {{.contextContext|raw}}, key string) erro
 	logger := {{.loggingFromContext|raw}}(ctx)
 
 	// Initialize the reconciler state. This will convert the namespace/name
-	// string into a distinct namespace and name, determin if this instance of
+	// string into a distinct namespace and name, determine if this instance of
 	// the reconciler is the leader, and any additional interfaces implemented
 	// by the reconciler. Returns an error is the resource key is invalid.
 	s, err := newState(key, r)
diff --git a/vendor/knative.dev/pkg/controller/controller.go b/vendor/knative.dev/pkg/controller/controller.go
index cee68931d..8ccee7a14 100644
--- a/vendor/knative.dev/pkg/controller/controller.go
+++ b/vendor/knative.dev/pkg/controller/controller.go
@@ -207,7 +207,7 @@ type Impl struct {
 
 // ControllerOptions encapsulates options for creating a new controller,
 // including throttling and stats behavior.
-type ControllerOptions struct { //nolint for backcompat.
+type ControllerOptions struct { //nolint // for backcompat.
 	WorkQueueName string
 	Logger        *zap.SugaredLogger
 	Reporter      StatsReporter
@@ -270,7 +270,7 @@ func (c *Impl) EnqueueSlowKey(key types.NamespacedName) {
 			safeKey(key), c.workQueue.Len(), c.workQueue.SlowLane().Len())
 }
 
-// EnqueueSlow extracts namesspeced name from the object and enqueues it on the slow
+// EnqueueSlow extracts namespaced name from the object and enqueues it on the slow
 // work queue.
 func (c *Impl) EnqueueSlow(obj interface{}) {
 	object, err := kmeta.DeletionHandlingAccessor(obj)
diff --git a/vendor/knative.dev/pkg/controller/two_lane_queue.go b/vendor/knative.dev/pkg/controller/two_lane_queue.go
index 919cc9006..d3656285b 100644
--- a/vendor/knative.dev/pkg/controller/two_lane_queue.go
+++ b/vendor/knative.dev/pkg/controller/two_lane_queue.go
@@ -122,7 +122,7 @@ func (tlq *twoLaneQueue) runConsumer() {
 	}
 }
 
-// Shutdown implements workqueue.Interace.
+// Shutdown implements workqueue.Interface.
 // Shutdown shuts down both queues.
 func (tlq *twoLaneQueue) ShutDown() {
 	tlq.RateLimitingInterface.ShutDown()
diff --git a/vendor/knative.dev/pkg/hash/doc.go b/vendor/knative.dev/pkg/hash/doc.go
index 5cb01faa6..8b849cd3e 100644
--- a/vendor/knative.dev/pkg/hash/doc.go
+++ b/vendor/knative.dev/pkg/hash/doc.go
@@ -21,7 +21,7 @@ limitations under the License.
 //   target.
 // - BucketSet is a bucketer library which uses ChooseSubset under the
 //   the hood in order to implement consistent mapping between keys and
-//   set of buckets, indentified by unique names. Compared to basic bucket
-//   implementtion which just does hash%num_buckets, when the number of
+//   set of buckets, identified by unique names. Compared to basic bucket
+//   implementation which just does hash%num_buckets, when the number of
 //   buckets change only a small subset of keys are supposed to migrate.
 package hash
diff --git a/vendor/knative.dev/pkg/injection/config.go b/vendor/knative.dev/pkg/injection/config.go
index bae2b2e25..6bcd38550 100644
--- a/vendor/knative.dev/pkg/injection/config.go
+++ b/vendor/knative.dev/pkg/injection/config.go
@@ -24,41 +24,68 @@ import (
 	"os"
 	"os/user"
 	"path/filepath"
+	"sync"
 
 	"k8s.io/client-go/rest"
 	"k8s.io/client-go/tools/clientcmd"
 	"k8s.io/klog"
 )
 
+// Environment holds the config for flag based config.
+type Environment struct {
+	// ServerURL - The address of the Kubernetes API server. Overrides any value in kubeconfig.
+	ServerURL string
+	// Kubeconfig - Path to a kubeconfig.
+	Kubeconfig string // Note: named Kubeconfig because of legacy reasons vs KubeConfig.
+	// Burst - Maximum burst for throttle.
+	Burst int
+	// QPS - Maximum QPS to the server from the client.
+	QPS float64
+}
+
+var (
+	env  *Environment
+	once sync.Once
+)
+
+func Flags() *Environment {
+	once.Do(func() {
+		env = new(Environment)
+
+		flag.StringVar(&env.ServerURL, "server", "",
+			"The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.")
+
+		flag.StringVar(&env.Kubeconfig, "kubeconfig", os.Getenv("KUBECONFIG"),
+			"Path to a kubeconfig. Only required if out-of-cluster.")
+
+		flag.IntVar(&env.Burst, "kube-api-burst", 0, "Maximum burst for throttle.")
+
+		flag.Float64Var(&env.QPS, "kube-api-qps", 0, "Maximum QPS to the server from the client.")
+	})
+	return env
+}
+
 // ParseAndGetRESTConfigOrDie parses the rest config flags and creates a client or
 // dies by calling log.Fatalf.
 func ParseAndGetRESTConfigOrDie() *rest.Config {
-	var (
-		serverURL = flag.String("server", "",
-			"The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.")
-		kubeconfig = flag.String("kubeconfig", "",
-			"Path to a kubeconfig. Only required if out-of-cluster.")
+	env := Flags()
 
-		burst = flag.Int("kube-api-burst", 0, "Maximum burst for throttle.")
-		qps   = flag.Float64("kube-api-qps", 0, "Maximum QPS to the server from the client.")
-	)
 	klog.InitFlags(flag.CommandLine)
 	flag.Parse()
+	if env.Burst < 0 {
+		log.Fatal("Invalid burst value", env.Burst)
+	}
+	if env.QPS < 0 || env.QPS > math.MaxFloat32 {
+		log.Fatal("Invalid QPS value", env.QPS)
+	}
 
-	cfg, err := GetRESTConfig(*serverURL, *kubeconfig)
+	cfg, err := GetRESTConfig(env.ServerURL, env.Kubeconfig)
 	if err != nil {
 		log.Fatal("Error building kubeconfig: ", err)
 	}
 
-	if *burst < 0 {
-		log.Fatal("Invalid burst value", *burst)
-	}
-	if *qps < 0 || *qps > math.MaxFloat32 {
-		log.Fatal("Invalid QPS value", *qps)
-	}
-
-	cfg.Burst = *burst
-	cfg.QPS = float32(*qps)
+	cfg.Burst = env.Burst
+	cfg.QPS = float32(env.QPS)
 
 	return cfg
 }
@@ -70,10 +97,6 @@ func ParseAndGetRESTConfigOrDie() *rest.Config {
 //   3. Fallback to in-cluster config.
 //   4. Fallback to the ~/.kube/config.
 func GetRESTConfig(serverURL, kubeconfig string) (*rest.Config, error) {
-	if kubeconfig == "" {
-		kubeconfig = os.Getenv("KUBECONFIG")
-	}
-
 	// If we have an explicit indication of where the kubernetes config lives, read that.
 	if kubeconfig != "" {
 		c, err := clientcmd.BuildConfigFromFlags(serverURL, kubeconfig)
diff --git a/vendor/knative.dev/pkg/injection/sharedmain/main.go b/vendor/knative.dev/pkg/injection/sharedmain/main.go
index 1f104d88d..f9b66efb4 100644
--- a/vendor/knative.dev/pkg/injection/sharedmain/main.go
+++ b/vendor/knative.dev/pkg/injection/sharedmain/main.go
@@ -202,7 +202,7 @@ func MainWithConfig(ctx context.Context, component string, cfg *rest.Config, cto
 	eg.Go(profilingServer.ListenAndServe)
 
 	// Many of the webhooks rely on configuration, e.g. configurable defaults, feature flags.
-	// So make sure that we have synchonized our configuration state before launching the
+	// So make sure that we have synchronized our configuration state before launching the
 	// webhooks, so that things are properly initialized.
 	logger.Info("Starting configuration manager...")
 	if err := cmw.Start(ctx.Done()); err != nil {
diff --git a/vendor/knative.dev/pkg/kmeta/names.go b/vendor/knative.dev/pkg/kmeta/names.go
index 43d12de80..eeaa57aef 100644
--- a/vendor/knative.dev/pkg/kmeta/names.go
+++ b/vendor/knative.dev/pkg/kmeta/names.go
@@ -17,7 +17,7 @@ limitations under the license.
 package kmeta
 
 import (
-	"crypto/md5" // nolint:gosec // No strong cryptography needed.
+	"crypto/md5" //nolint:gosec // No strong cryptography needed.
 	"fmt"
 	"strings"
 )
@@ -42,7 +42,7 @@ func ChildName(parent, suffix string) string {
 		// If the suffix is longer than the longest allowed suffix, then
 		// we hash the whole combined string and use that as the suffix.
 		if head-len(suffix) <= 0 {
-			// nolint:gosec // No strong cryptography needed.
+			//nolint:gosec // No strong cryptography needed.
 			h := md5.Sum([]byte(parent + suffix))
 			// 1. trim parent, if needed
 			if head < len(parent) {
@@ -59,7 +59,7 @@ func ChildName(parent, suffix string) string {
 			// remove it.
 			return strings.TrimRight(ret, "-")
 		}
-		// nolint:gosec // No strong cryptography needed.
+		//nolint:gosec // No strong cryptography needed.
 		n = fmt.Sprintf("%s%x", parent[:head-len(suffix)], md5.Sum([]byte(parent)))
 	}
 	return n + suffix
diff --git a/vendor/knative.dev/pkg/kmeta/ownerrefable_accessor.go b/vendor/knative.dev/pkg/kmeta/ownerrefable_accessor.go
index 822a7ac0c..8f633b246 100644
--- a/vendor/knative.dev/pkg/kmeta/ownerrefable_accessor.go
+++ b/vendor/knative.dev/pkg/kmeta/ownerrefable_accessor.go
@@ -13,10 +13,11 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 */
+
 package kmeta
 
 // OwnerRefableAccessor is a combination of OwnerRefable interface and Accessor interface
-// which inidcates that it has 1) sufficient information to produce a metav1.OwnerReference to an object,
+// which indicates that it has 1) sufficient information to produce a metav1.OwnerReference to an object,
 // 2) and a collection of interfaces from metav1.TypeMeta runtime.Object and metav1.Object that Kubernetes API types
 // registered with runtime.Scheme must support.
 type OwnerRefableAccessor interface {
diff --git a/vendor/knative.dev/pkg/leaderelection/context.go b/vendor/knative.dev/pkg/leaderelection/context.go
index a00aacd2c..c3301b7bf 100644
--- a/vendor/knative.dev/pkg/leaderelection/context.go
+++ b/vendor/knative.dev/pkg/leaderelection/context.go
@@ -198,7 +198,7 @@ type statefulSetBuilder struct {
 
 func (b *statefulSetBuilder) buildElector(ctx context.Context, la reconciler.LeaderAware, enq func(reconciler.Bucket, types.NamespacedName)) (Elector, error) {
 	logger := logging.FromContext(ctx)
-	logger.Infof("%s will run in StatefulSet ordinal assignement mode with bucket name %s",
+	logger.Infof("%s will run in StatefulSet ordinal assignment mode with bucket name %s",
 		b.lec.Component, b.bkt.Name())
 
 	return &unopposedElector{
diff --git a/vendor/knative.dev/pkg/logging/config.go b/vendor/knative.dev/pkg/logging/config.go
index d8c4b609b..9d4eda896 100644
--- a/vendor/knative.dev/pkg/logging/config.go
+++ b/vendor/knative.dev/pkg/logging/config.go
@@ -69,10 +69,10 @@ func NewLogger(configJSON string, levelOverride string, opts ...zap.Option) (*za
 }
 
 func enrichLoggerWithCommitID(logger *zap.Logger) *zap.SugaredLogger {
-	commmitID, err := changeset.Get()
+	commitID, err := changeset.Get()
 	if err == nil {
 		// Enrich logs with GitHub commit ID.
-		return logger.With(zap.String(logkey.GitHubCommitID, commmitID)).Sugar()
+		return logger.With(zap.String(logkey.GitHubCommitID, commitID)).Sugar()
 	}
 
 	logger.Info("Fetch GitHub commit ID from kodata failed", zap.Error(err))
diff --git a/vendor/knative.dev/pkg/metrics/config.go b/vendor/knative.dev/pkg/metrics/config.go
index 8eb829775..8214bde40 100644
--- a/vendor/knative.dev/pkg/metrics/config.go
+++ b/vendor/knative.dev/pkg/metrics/config.go
@@ -346,7 +346,7 @@ func prometheusPort() (int, error) {
 
 // JsonToMetricsOptions converts a json string of a
 // ExporterOptions. Returns a non-nil ExporterOptions always.
-func JsonToMetricsOptions(jsonOpts string) (*ExporterOptions, error) { // nolint No rename due to backwards incompatibility.
+func JsonToMetricsOptions(jsonOpts string) (*ExporterOptions, error) { //nolint // No rename due to backwards incompatibility.
 	var opts ExporterOptions
 	if jsonOpts == "" {
 		return nil, errors.New("json options string is empty")
@@ -360,7 +360,7 @@ func JsonToMetricsOptions(jsonOpts string) (*ExporterOptions, error) { // nolint
 }
 
 // MetricsOptionsToJson converts a ExporterOptions to a json string.
-func MetricsOptionsToJson(opts *ExporterOptions) (string, error) { // nolint No rename due to backwards incompatibility.
+func MetricsOptionsToJson(opts *ExporterOptions) (string, error) { //nolint // No rename due to backwards incompatibility.
 	if opts == nil {
 		return "", nil
 	}
diff --git a/vendor/knative.dev/pkg/metrics/config_observability.go b/vendor/knative.dev/pkg/metrics/config_observability.go
index 62ad60030..ae622c928 100644
--- a/vendor/knative.dev/pkg/metrics/config_observability.go
+++ b/vendor/knative.dev/pkg/metrics/config_observability.go
@@ -27,7 +27,8 @@ import (
 
 const (
 	// The following is used to set the default log url template
-	DefaultLogURLTemplate = "http://localhost:8001/api/v1/namespaces/knative-monitoring/services/kibana-logging/proxy/app/kibana#/discover?_a=(query:(match:(kubernetes.labels.knative-dev%2FrevisionUID:(query:'${REVISION_UID}',type:phrase))))"
+	DefaultLogURLTemplate = ""
+
 	// DefaultRequestLogTemplate is the default format for emitting request logs.
 	DefaultRequestLogTemplate = `{"httpRequest": {"requestMethod": "{{.Request.Method}}", "requestUrl": "{{js .Request.RequestURI}}", "requestSize": "{{.Request.ContentLength}}", "status": {{.Response.Code}}, "responseSize": "{{.Response.Size}}", "userAgent": "{{js .Request.UserAgent}}", "remoteIp": "{{js .Request.RemoteAddr}}", "serverIp": "{{.Revision.PodIP}}", "referer": "{{js .Request.Referer}}", "latency": "{{.Response.Latency}}s", "protocol": "{{.Request.Proto}}"}, "traceId": "{{index .Request.Header "X-B3-Traceid"}}"}`
 
diff --git a/vendor/knative.dev/pkg/metrics/exporter.go b/vendor/knative.dev/pkg/metrics/exporter.go
index a606c8ad2..a7411fccb 100644
--- a/vendor/knative.dev/pkg/metrics/exporter.go
+++ b/vendor/knative.dev/pkg/metrics/exporter.go
@@ -196,7 +196,7 @@ func newMetricsExporter(config *metricsConfig, logger *zap.SugaredLogger) (view.
 	// If there is a Prometheus Exporter server running, stop it.
 	resetCurPromSrv()
 
-	// TODO(https://github.com/knative/pkg/issues/866): Move Stackdriver and Promethus
+	// TODO(https://github.com/knative/pkg/issues/866): Move Stackdriver and Prometheus
 	// operations before stopping to an interface.
 	if se, ok := curMetricsExporter.(stoppable); ok {
 		se.StopMetricsExporter()
@@ -213,7 +213,7 @@ func newMetricsExporter(config *metricsConfig, logger *zap.SugaredLogger) (view.
 
 	ff := factory[config.backendDestination]
 	if ff == nil {
-		return nil, nil, fmt.Errorf("unsuppored metrics backend %v", config.backendDestination)
+		return nil, nil, fmt.Errorf("unsupported metrics backend %v", config.backendDestination)
 	}
 	return ff(config, logger)
 }
diff --git a/vendor/knative.dev/pkg/network/network.go b/vendor/knative.dev/pkg/network/network.go
index c98879abd..66766266c 100644
--- a/vendor/knative.dev/pkg/network/network.go
+++ b/vendor/knative.dev/pkg/network/network.go
@@ -26,7 +26,7 @@ const (
 	// DefaultConnTimeout specifies a short default connection timeout
 	// to avoid hitting the issue fixed in
 	// https://github.com/kubernetes/kubernetes/pull/72534 but only
-	// avalailable after Kubernetes 1.14.
+	// available after Kubernetes 1.14.
 	//
 	// Our connections are usually between pods in the same cluster
 	// like activator <-> queue-proxy, or even between containers
diff --git a/vendor/knative.dev/pkg/reconciler/events.go b/vendor/knative.dev/pkg/reconciler/events.go
index 262b26222..54a6e52a2 100644
--- a/vendor/knative.dev/pkg/reconciler/events.go
+++ b/vendor/knative.dev/pkg/reconciler/events.go
@@ -62,7 +62,7 @@ func NewEvent(eventtype, reason, messageFmt string, args ...interface{}) Event {
 
 // ReconcilerEvent wraps the fields required for recorders to create a
 // kubernetes recorder Event.
-type ReconcilerEvent struct { //nolint for backcompat.
+type ReconcilerEvent struct { //nolint:golint // for backcompat.
 	EventType string
 	Reason    string
 	Format    string
diff --git a/vendor/knative.dev/pkg/tracing/config/tracing.go b/vendor/knative.dev/pkg/tracing/config/tracing.go
index 2a9305faf..14f7aa435 100644
--- a/vendor/knative.dev/pkg/tracing/config/tracing.go
+++ b/vendor/knative.dev/pkg/tracing/config/tracing.go
@@ -136,7 +136,7 @@ func NewTracingConfigFromConfigMap(config *corev1.ConfigMap) (*Config, error) {
 
 // JsonToTracingConfig converts a json string of a Config.
 // Returns a non-nil Config always and an eventual error.
-func JsonToTracingConfig(jsonCfg string) (*Config, error) { //nolint:stylecheck for backcompat.
+func JsonToTracingConfig(jsonCfg string) (*Config, error) { //nolint // for backcompat.
 
 	if jsonCfg == "" {
 		return NoopConfig(), errors.New("empty json tracing config")
@@ -155,7 +155,7 @@ func JsonToTracingConfig(jsonCfg string) (*Config, error) { //nolint:stylecheck
 }
 
 // TracingConfigToJson converts a Config to a json string.
-func TracingConfigToJson(cfg *Config) (string, error) { //nolint:stylecheck for backcompat.
+func TracingConfigToJson(cfg *Config) (string, error) { //nolint // for backcompat.
 	if cfg == nil {
 		return "", nil
 	}
diff --git a/vendor/knative.dev/pkg/tracing/opencensus.go b/vendor/knative.dev/pkg/tracing/opencensus.go
index 48ca00875..4346593ba 100644
--- a/vendor/knative.dev/pkg/tracing/opencensus.go
+++ b/vendor/knative.dev/pkg/tracing/opencensus.go
@@ -122,7 +122,7 @@ func WithExporter(name string, logger *zap.SugaredLogger) ConfigOption {
 // the host name must be able to be resolved.
 // e.g)
 //   "name" is a service name like activator-service.
-//   "host" is a endpoint IP like activator-service's endpint IP.
+//   "host" is a endpoint IP like activator-service's endpoint IP.
 func WithExporterFull(name, host string, logger *zap.SugaredLogger) ConfigOption {
 	return func(cfg *config.Config) error {
 		var (
diff --git a/vendor/knative.dev/pkg/webhook/psbinding/reconciler.go b/vendor/knative.dev/pkg/webhook/psbinding/reconciler.go
index fa054ba7d..10f42dac9 100644
--- a/vendor/knative.dev/pkg/webhook/psbinding/reconciler.go
+++ b/vendor/knative.dev/pkg/webhook/psbinding/reconciler.go
@@ -393,7 +393,7 @@ func (r *BaseReconciler) ReconcileSubject(ctx context.Context, fb Bindable, muta
 	for _, ps := range referents {
 		ps := ps
 		eg.Go(func() error {
-			// Do the binding to the pod speccable.
+			// Do the binding to the pod specable.
 			orig := ps.DeepCopy()
 			mutation(ctx, ps)
 
diff --git a/vendor/knative.dev/pkg/webhook/resourcesemantics/conversion/controller.go b/vendor/knative.dev/pkg/webhook/resourcesemantics/conversion/controller.go
index a53915a87..3b404ba97 100644
--- a/vendor/knative.dev/pkg/webhook/resourcesemantics/conversion/controller.go
+++ b/vendor/knative.dev/pkg/webhook/resourcesemantics/conversion/controller.go
@@ -62,7 +62,7 @@ type GroupKindConversion struct {
 	DefinitionName string
 
 	// HubVersion specifies which version of the CustomResource supports
-	// convertions to and from all types
+	// conversions to and from all types
 	//
 	// It is expected that the Zygotes map contains an entry for the
 	// specified HubVersion
diff --git a/vendor/knative.dev/pkg/webhook/resourcesemantics/validation/controller.go b/vendor/knative.dev/pkg/webhook/resourcesemantics/validation/controller.go
index 14cf6dd73..567515843 100644
--- a/vendor/knative.dev/pkg/webhook/resourcesemantics/validation/controller.go
+++ b/vendor/knative.dev/pkg/webhook/resourcesemantics/validation/controller.go
@@ -52,7 +52,7 @@ func NewAdmissionController(
 
 	// This not ideal, we are using a variadic argument to effectively make callbacks optional
 	// This allows this addition to be non-breaking to consumers of /pkg
-	// TODO: once all sub-repos have adoped this, we might move this back to a traditional param.
+	// TODO: once all sub-repos have adopted this, we might move this back to a traditional param.
 	var unwrappedCallbacks map[schema.GroupVersionKind]Callback
 	switch len(callbacks) {
 	case 0:
diff --git a/vendor/knative.dev/pkg/webhook/resourcesemantics/validation/validation_admit.go b/vendor/knative.dev/pkg/webhook/resourcesemantics/validation/validation_admit.go
index ebea25ad3..f2d7ad9bf 100644
--- a/vendor/knative.dev/pkg/webhook/resourcesemantics/validation/validation_admit.go
+++ b/vendor/knative.dev/pkg/webhook/resourcesemantics/validation/validation_admit.go
@@ -157,7 +157,7 @@ func (ac *reconciler) decodeRequestAndPrepareContext(
 func validate(ctx context.Context, resource resourcesemantics.GenericCRD, req *admissionv1.AdmissionRequest) error {
 	logger := logging.FromContext(ctx)
 
-	// Only run validation for supported create and update validaiton.
+	// Only run validation for supported create and update validation.
 	switch req.Operation {
 	case admissionv1.Create, admissionv1.Update:
 		// Supported verbs
diff --git a/vendor/knative.dev/pkg/webhook/stats_reporter.go b/vendor/knative.dev/pkg/webhook/stats_reporter.go
index 4c6d72134..9d64634fe 100644
--- a/vendor/knative.dev/pkg/webhook/stats_reporter.go
+++ b/vendor/knative.dev/pkg/webhook/stats_reporter.go
@@ -69,7 +69,7 @@ type reporter struct {
 	ctx context.Context
 }
 
-// NewStatsReporter creaters a reporter for webhook metrics
+// NewStatsReporter creates a reporter for webhook metrics
 func NewStatsReporter() (StatsReporter, error) {
 	ctx, err := tag.New(
 		context.Background(),
diff --git a/vendor/knative.dev/pkg/webhook/webhook.go b/vendor/knative.dev/pkg/webhook/webhook.go
index 55726c5f5..ba04b8e1a 100644
--- a/vendor/knative.dev/pkg/webhook/webhook.go
+++ b/vendor/knative.dev/pkg/webhook/webhook.go
@@ -63,7 +63,7 @@ type Options struct {
 }
 
 // Operation is the verb being operated on
-// it is aliasde in Validation from the k8s admission package
+// it is aliased in Validation from the k8s admission package
 type Operation = admissionv1.Operation
 
 // Operation types
diff --git a/vendor/modules.txt b/vendor/modules.txt
index c07d6969a..b0e70af76 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -208,6 +208,7 @@ github.com/google/go-github/v27/github
 # github.com/google/go-querystring v1.0.0
 github.com/google/go-querystring/query
 # github.com/google/gofuzz v1.1.0
+## explicit
 github.com/google/gofuzz
 # github.com/google/mako v0.0.0-20190821191249-122f8dcef9e3
 github.com/google/mako/clients/proto/analyzers/threshold_analyzer_go_proto
@@ -722,12 +723,15 @@ k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1
 k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1
 # k8s.io/apimachinery v0.18.8 => k8s.io/apimachinery v0.18.8
 ## explicit
+k8s.io/apimachinery/pkg/api/apitesting
 k8s.io/apimachinery/pkg/api/apitesting/fuzzer
+k8s.io/apimachinery/pkg/api/apitesting/roundtrip
 k8s.io/apimachinery/pkg/api/equality
 k8s.io/apimachinery/pkg/api/errors
 k8s.io/apimachinery/pkg/api/meta
 k8s.io/apimachinery/pkg/api/resource
 k8s.io/apimachinery/pkg/api/validation
+k8s.io/apimachinery/pkg/apis/meta/fuzzer
 k8s.io/apimachinery/pkg/apis/meta/internalversion
 k8s.io/apimachinery/pkg/apis/meta/v1
 k8s.io/apimachinery/pkg/apis/meta/v1/unstructured
@@ -1049,7 +1053,7 @@ k8s.io/utils/buffer
 k8s.io/utils/integer
 k8s.io/utils/pointer
 k8s.io/utils/trace
-# knative.dev/eventing v0.18.1-0.20201015095656-0a79d05b949a
+# knative.dev/eventing v0.18.1-0.20201022075137-c29798077cfc
 ## explicit
 knative.dev/eventing/pkg/adapter/v2
 knative.dev/eventing/pkg/adapter/v2/util/crstatusevent
@@ -1176,7 +1180,7 @@ knative.dev/eventing/test/test_images/heartbeats
 knative.dev/eventing/test/test_images/performance
 knative.dev/eventing/test/test_images/print
 knative.dev/eventing/test/test_images/recordevents
-# knative.dev/pkg v0.0.0-20201014184531-9e655c6b02f6
+# knative.dev/pkg v0.0.0-20201022015237-8139298650a4
 ## explicit
 knative.dev/pkg/apis
 knative.dev/pkg/apis/duck
@@ -1186,6 +1190,7 @@ knative.dev/pkg/apis/duck/v1alpha1
 knative.dev/pkg/apis/duck/v1beta1
 knative.dev/pkg/apis/testing
 knative.dev/pkg/apis/testing/fuzzer
+knative.dev/pkg/apis/testing/roundtrip
 knative.dev/pkg/changeset
 knative.dev/pkg/client/injection/apiextensions/client
 knative.dev/pkg/client/injection/apiextensions/client/fake
@@ -1243,6 +1248,7 @@ knative.dev/pkg/source
 knative.dev/pkg/system
 knative.dev/pkg/system/testing
 knative.dev/pkg/test
+knative.dev/pkg/test/flags
 knative.dev/pkg/test/gcs
 knative.dev/pkg/test/ghutil
 knative.dev/pkg/test/helpers
@@ -1272,7 +1278,7 @@ knative.dev/pkg/webhook/resourcesemantics
 knative.dev/pkg/webhook/resourcesemantics/conversion
 knative.dev/pkg/webhook/resourcesemantics/defaulting
 knative.dev/pkg/webhook/resourcesemantics/validation
-# knative.dev/test-infra v0.0.0-20201014021030-ae3984a33f82
+# knative.dev/test-infra v0.0.0-20201022003632-7d3ea6019158
 ## explicit
 knative.dev/test-infra/scripts
 # pack.ag/amqp v0.12.4


Test patch:
diff --git a/pkg/apis/sources/v1alpha1/roundtrip_test.go b/pkg/apis/sources/v1alpha1/roundtrip_test.go
new file mode 100644
index 000000000..a4f3777fe
--- /dev/null
+++ b/pkg/apis/sources/v1alpha1/roundtrip_test.go
@@ -0,0 +1,63 @@
+/*
+Copyright 2020 The Knative Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1alpha1
+
+import (
+	"testing"
+
+	"k8s.io/apimachinery/pkg/api/apitesting/fuzzer"
+	"k8s.io/apimachinery/pkg/runtime"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	pkgfuzzer "knative.dev/pkg/apis/testing/fuzzer"
+	"knative.dev/pkg/apis/testing/roundtrip"
+
+	"knative.dev/eventing-kafka/pkg/apis/sources/v1beta1"
+)
+
+func TestSourcesRoundTripTypesToJSON(t *testing.T) {
+	scheme := runtime.NewScheme()
+	utilruntime.Must(AddToScheme(scheme))
+
+	fuzzerFuncs := fuzzer.MergeFuzzerFuncs(
+		pkgfuzzer.Funcs,
+		v1beta1.FuzzerFuncs,
+	)
+	roundtrip.ExternalTypesViaJSON(t, scheme, fuzzerFuncs)
+}
+
+func TestSourceRoundTripTypesToAlphaHub(t *testing.T) {
+	scheme := runtime.NewScheme()
+
+	sb := runtime.SchemeBuilder{
+		AddToScheme,
+		v1beta1.AddToScheme,
+	}
+
+	utilruntime.Must(sb.AddToScheme(scheme))
+
+	hubs := runtime.NewScheme()
+	hubs.AddKnownTypes(SchemeGroupVersion,
+		&KafkaSource{},
+	)
+
+	fuzzerFuncs := fuzzer.MergeFuzzerFuncs(
+		pkgfuzzer.Funcs,
+		v1beta1.FuzzerFuncs,
+	)
+
+	roundtrip.ExternalTypesViaHub(t, scheme, hubs, fuzzerFuncs)
+}
diff --git a/pkg/apis/sources/v1beta1/roundtrip_test.go b/pkg/apis/sources/v1beta1/roundtrip_test.go
new file mode 100644
index 000000000..4d505c122
--- /dev/null
+++ b/pkg/apis/sources/v1beta1/roundtrip_test.go
@@ -0,0 +1,38 @@
+/*
+Copyright 2020 The Knative Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1beta1
+
+import (
+	"testing"
+
+	"k8s.io/apimachinery/pkg/api/apitesting/fuzzer"
+	"k8s.io/apimachinery/pkg/runtime"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	pkgfuzzer "knative.dev/pkg/apis/testing/fuzzer"
+	"knative.dev/pkg/apis/testing/roundtrip"
+)
+
+func TestSourcesRoundTripTypesToJSON(t *testing.T) {
+	scheme := runtime.NewScheme()
+	utilruntime.Must(AddToScheme(scheme))
+
+	fuzzerFuncs := fuzzer.MergeFuzzerFuncs(
+		pkgfuzzer.Funcs,
+		FuzzerFuncs,
+	)
+	roundtrip.ExternalTypesViaJSON(t, scheme, fuzzerFuncs)
+}
diff --git a/pkg/channel/consolidated/dispatcher/dispatcher_test.go b/pkg/channel/consolidated/dispatcher/dispatcher_test.go
index 3410efd8a..1027dd3bc 100644
--- a/pkg/channel/consolidated/dispatcher/dispatcher_test.go
+++ b/pkg/channel/consolidated/dispatcher/dispatcher_test.go
@@ -422,7 +422,7 @@ func TestUnsubscribeUnknownSub(t *testing.T) {
 
 func TestKafkaDispatcher_Start(t *testing.T) {
 	d := &KafkaDispatcher{}
-
+	reporter := eventingchannels.NewStatsReporter("testcontainer", "testpod")
 	err := d.Start(context.TODO())
 	if err == nil {
 		t.Errorf("Expected error want %s, got %s", "message receiver is not set", err)
@@ -433,6 +433,7 @@ func TestKafkaDispatcher_Start(t *testing.T) {
 			return nil
 		},
 		zap.NewNop(),
+		reporter,
 		eventingchannels.ResolveMessageChannelFromHostHeader(d.getChannelReferenceFromHost))
 	if err != nil {
 		t.Fatalf("Error creating new message receiver. Error:%s", err)
diff --git a/pkg/channel/distributed/dispatcher/env/environment_test.go b/pkg/channel/distributed/dispatcher/env/environment_test.go
index dc9bc4eff..14ecc828e 100644
--- a/pkg/channel/distributed/dispatcher/env/environment_test.go
+++ b/pkg/channel/distributed/dispatcher/env/environment_test.go
@@ -39,6 +39,8 @@ const (
 	serviceName   = "TestServiceName"
 	kafkaUsername = "TestKafkaUsername"
 	kafkaPassword = "TestKafkaPassword"
+	podName       = "TestPod"
+	containerName = "TestContainer"
 )
 
 // Define The TestCase Struct
@@ -53,6 +55,8 @@ type TestCase struct {
 	serviceName   string
 	kafkaUsername string
 	kafkaPassword string
+	podName       string
+	containerName string
 	expectedError error
 }
 
@@ -112,6 +116,16 @@ func TestGetEnvironment(t *testing.T) {
 	testCase.expectedError = getMissingRequiredEnvironmentVariableError(commonenv.ServiceNameEnvVarKey)
 	testCases = append(testCases, testCase)
 
+	testCase = getValidTestCase("Missing Required Config - PodName")
+	testCase.podName = ""
+	testCase.expectedError = getMissingRequiredEnvironmentVariableError(commonenv.PodNameEnvVarKey)
+	testCases = append(testCases, testCase)
+
+	testCase = getValidTestCase("Missing Required Config - ContainerName")
+	testCase.containerName = ""
+	testCase.expectedError = getMissingRequiredEnvironmentVariableError(commonenv.ContainerNameEnvVarKEy)
+	testCases = append(testCases, testCase)
+
 	// Loop Over All The TestCases
 	for _, testCase := range testCases {
 
@@ -126,6 +140,8 @@ func TestGetEnvironment(t *testing.T) {
 		assertSetenv(t, commonenv.ServiceNameEnvVarKey, testCase.serviceName)
 		assertSetenv(t, commonenv.KafkaUsernameEnvVarKey, testCase.kafkaUsername)
 		assertSetenv(t, commonenv.KafkaPasswordEnvVarKey, testCase.kafkaPassword)
+		assertSetenv(t, commonenv.PodNameEnvVarKey, testCase.podName)
+		assertSetenv(t, commonenv.ContainerNameEnvVarKEy, testCase.containerName)
 
 		// Perform The Test
 		environment, err := GetEnvironment(logger)
@@ -143,6 +159,8 @@ func TestGetEnvironment(t *testing.T) {
 			assert.Equal(t, testCase.serviceName, environment.ServiceName)
 			assert.Equal(t, testCase.kafkaUsername, environment.KafkaUsername)
 			assert.Equal(t, testCase.kafkaPassword, environment.KafkaPassword)
+			assert.Equal(t, testCase.podName, environment.PodName)
+			assert.Equal(t, testCase.containerName, environment.ContainerName)
 
 		} else {
 			assert.Equal(t, testCase.expectedError, err)
@@ -175,6 +193,8 @@ func getValidTestCase(name string) TestCase {
 		serviceName:   serviceName,
 		kafkaUsername: kafkaUsername,
 		kafkaPassword: kafkaPassword,
+		podName:       podName,
+		containerName: containerName,
 		expectedError: nil,
 	}
 }
diff --git a/pkg/channel/distributed/dispatcher/testing/mocks.go b/pkg/channel/distributed/dispatcher/testing/mocks.go
index d827dd2a3..6875bdd08 100644
--- a/pkg/channel/distributed/dispatcher/testing/mocks.go
+++ b/pkg/channel/distributed/dispatcher/testing/mocks.go
@@ -69,11 +69,11 @@ func NewMockMessageDispatcher(t *testing.T,
 	}
 }
 
-func (m *MockMessageDispatcher) DispatchMessage(ctx context.Context, message cloudevents.Message, additionalHeaders http.Header, destination *url.URL, reply *url.URL, deadLetter *url.URL) error {
+func (m *MockMessageDispatcher) DispatchMessage(ctx context.Context, message cloudevents.Message, additionalHeaders http.Header, destination *url.URL, reply *url.URL, deadLetter *url.URL) (*channel.DispatchExecutionInfo, error) {
 	panic("implement me")
 }
 
-func (m *MockMessageDispatcher) DispatchMessageWithRetries(ctx context.Context, message cloudevents.Message, headers http.Header, destinationUrl *url.URL, replyUrl *url.URL, deadLetterUrl *url.URL, retryConfig *kncloudevents.RetryConfig) error {
+func (m *MockMessageDispatcher) DispatchMessageWithRetries(ctx context.Context, message cloudevents.Message, headers http.Header, destinationUrl *url.URL, replyUrl *url.URL, deadLetterUrl *url.URL, retryConfig *kncloudevents.RetryConfig) (*channel.DispatchExecutionInfo, error) {
 
 	// Validate The Expected Args
 	assert.NotNil(m.t, ctx)
@@ -88,7 +88,7 @@ func (m *MockMessageDispatcher) DispatchMessageWithRetries(ctx context.Context,
 	m.message = message
 
 	// Return The Desired Error Response
-	return m.response
+	return &channel.DispatchExecutionInfo{}, m.response
 }
 
 func (m *MockMessageDispatcher) Message() cloudevents.Message {
diff --git a/pkg/channel/distributed/receiver/env/environment_test.go b/pkg/channel/distributed/receiver/env/environment_test.go
index e590023c7..23a7b6e77 100644
--- a/pkg/channel/distributed/receiver/env/environment_test.go
+++ b/pkg/channel/distributed/receiver/env/environment_test.go
@@ -37,6 +37,8 @@ const (
 	serviceName   = "TestServiceName"
 	kafkaUsername = "TestKafkaUsername"
 	kafkaPassword = "TestKafkaPassword"
+	podName       = "TestPod"
+	containerName = "TestContainer"
 )
 
 // Define The TestCase Struct
@@ -49,6 +51,8 @@ type TestCase struct {
 	serviceName   string
 	kafkaUsername string
 	kafkaPassword string
+	podName       string
+	containerName string
 	expectedError error
 }
 
@@ -98,6 +102,16 @@ func TestGetEnvironment(t *testing.T) {
 	testCase.expectedError = getMissingRequiredEnvironmentVariableError(env.ServiceNameEnvVarKey)
 	testCases = append(testCases, testCase)
 
+	testCase = getValidTestCase("Missing Required Config - PodName")
+	testCase.podName = ""
+	testCase.expectedError = getMissingRequiredEnvironmentVariableError(env.PodNameEnvVarKey)
+	testCases = append(testCases, testCase)
+
+	testCase = getValidTestCase("Missing Required Config - ContainerName")
+	testCase.containerName = ""
+	testCase.expectedError = getMissingRequiredEnvironmentVariableError(env.ContainerNameEnvVarKEy)
+	testCases = append(testCases, testCase)
+
 	// Loop Over All The TestCases
 	for _, testCase := range testCases {
 
@@ -110,6 +124,8 @@ func TestGetEnvironment(t *testing.T) {
 		assertSetenv(t, env.ServiceNameEnvVarKey, testCase.serviceName)
 		assertSetenv(t, env.KafkaUsernameEnvVarKey, testCase.kafkaUsername)
 		assertSetenv(t, env.KafkaPasswordEnvVarKey, testCase.kafkaPassword)
+		assertSetenv(t, env.PodNameEnvVarKey, testCase.podName)
+		assertSetenv(t, env.ContainerNameEnvVarKEy, testCase.containerName)
 
 		// Perform The Test
 		environment, err := GetEnvironment(logger)
@@ -125,6 +141,8 @@ func TestGetEnvironment(t *testing.T) {
 			assert.Equal(t, testCase.serviceName, environment.ServiceName)
 			assert.Equal(t, testCase.kafkaUsername, environment.KafkaUsername)
 			assert.Equal(t, testCase.kafkaPassword, environment.KafkaPassword)
+			assert.Equal(t, testCase.podName, environment.PodName)
+			assert.Equal(t, testCase.containerName, environment.ContainerName)
 
 		} else {
 			assert.Equal(t, testCase.expectedError, err)
@@ -155,6 +173,8 @@ func getValidTestCase(name string) TestCase {
 		serviceName:   serviceName,
 		kafkaUsername: kafkaUsername,
 		kafkaPassword: kafkaPassword,
+		podName:       podName,
+		containerName: containerName,
 		expectedError: nil,
 	}
 }
diff --git a/test/conformance/main_test.go b/test/conformance/main_test.go
index 66c35a0b4..575948b59 100644
--- a/test/conformance/main_test.go
+++ b/test/conformance/main_test.go
@@ -27,7 +27,7 @@ import (
 	"knative.dev/eventing-kafka/test/lib/setupclientoptions"
 	eventingTest "knative.dev/eventing/test"
 	testlib "knative.dev/eventing/test/lib"
-	"knative.dev/eventing/test/lib/resources"
+	"knative.dev/pkg/system"
 	"knative.dev/pkg/test/zipkin"
 )
 
@@ -58,7 +58,7 @@ func TestMain(m *testing.M) {
 		// place that cleans it up. If an individual test calls this instead, then it will break other
 		// tests that need the tracing in place.
 		defer zipkin.CleanupZipkinTracingSetup(log.Printf)
-		defer testlib.ExportLogs(testlib.SystemLogsDir, resources.SystemNamespace)
+		defer testlib.ExportLogs(testlib.SystemLogsDir, system.Namespace())
 
 		return m.Run()
 	}())
diff --git a/test/e2e-tests.sh b/test/e2e-tests.sh
index f864895df..14a9274d9 100755
--- a/test/e2e-tests.sh
+++ b/test/e2e-tests.sh
@@ -203,6 +203,8 @@ function kafka_teardown() {
 
 initialize $@ --skip-istio-addon
 
+export SYSTEM_NAMESPACE
+
 go_test_e2e -timeout=30m -parallel=12 ./test/e2e -channels=messaging.knative.dev/v1alpha1:KafkaChannel,messaging.knative.dev/v1beta1:KafkaChannel  || fail_test
 
 go_test_e2e -timeout=5m -parallel=12 ./test/conformance -channels=messaging.knative.dev/v1beta1:KafkaChannel -sources=sources.knative.dev/v1beta1:KafkaSource || fail_test
diff --git a/test/e2e/main_test.go b/test/e2e/main_test.go
index 4b82e7ccd..ba3a4cc20 100644
--- a/test/e2e/main_test.go
+++ b/test/e2e/main_test.go
@@ -24,7 +24,7 @@ import (
 	"knative.dev/eventing-kafka/test"
 	eventingTest "knative.dev/eventing/test"
 	testlib "knative.dev/eventing/test/lib"
-	"knative.dev/eventing/test/lib/resources"
+	"knative.dev/pkg/system"
 )
 
 var channelTestRunner testlib.ComponentsTestRunner
@@ -36,7 +36,7 @@ func TestMain(m *testing.M) {
 		ComponentsToTest:    eventingTest.EventingFlags.Channels,
 	}
 	os.Exit(func() int {
-		defer testlib.ExportLogs(testlib.SystemLogsDir, resources.SystemNamespace)
+		defer testlib.ExportLogs(testlib.SystemLogsDir, system.Namespace())
 
 		return m.Run()
 	}())
diff --git a/test/lib/listers.go b/test/lib/listers.go
index d209b566a..5cd8ab254 100644
--- a/test/lib/listers.go
+++ b/test/lib/listers.go
@@ -19,7 +19,6 @@ package lib
 import (
 	"k8s.io/apimachinery/pkg/runtime"
 	fakekubeclientset "k8s.io/client-go/kubernetes/fake"
-	"k8s.io/client-go/tools/cache"
 	fakeeventingclientset "knative.dev/eventing/pkg/client/clientset/versioned/fake"
 	"knative.dev/pkg/reconciler/testing"
 )
@@ -58,10 +57,6 @@ func NewListers(objs []runtime.Object) Listers {
 	return ls
 }
 
-func (l Listers) indexerFor(obj runtime.Object) cache.Indexer {
-	return l.sorter.IndexerForObjectType(obj)
-}
-
 func (l Listers) GetKubeObjects() []runtime.Object {
 	return l.sorter.ObjectsForSchemeFunc(fakekubeclientset.AddToScheme)
 }
diff --git a/vendor/k8s.io/apimachinery/pkg/api/apitesting/codec.go b/vendor/k8s.io/apimachinery/pkg/api/apitesting/codec.go
new file mode 100644
index 000000000..542b0aa27
--- /dev/null
+++ b/vendor/k8s.io/apimachinery/pkg/api/apitesting/codec.go
@@ -0,0 +1,116 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package apitesting
+
+import (
+	"fmt"
+	"mime"
+	"os"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer"
+	"k8s.io/apimachinery/pkg/runtime/serializer/recognizer"
+)
+
+var (
+	testCodecMediaType        string
+	testStorageCodecMediaType string
+)
+
+// TestCodec returns the codec for the API version to test against, as set by the
+// KUBE_TEST_API_TYPE env var.
+func TestCodec(codecs runtimeserializer.CodecFactory, gvs ...schema.GroupVersion) runtime.Codec {
+	if len(testCodecMediaType) != 0 {
+		serializerInfo, ok := runtime.SerializerInfoForMediaType(codecs.SupportedMediaTypes(), testCodecMediaType)
+		if !ok {
+			panic(fmt.Sprintf("no serializer for %s", testCodecMediaType))
+		}
+		return codecs.CodecForVersions(serializerInfo.Serializer, codecs.UniversalDeserializer(), schema.GroupVersions(gvs), nil)
+	}
+	return codecs.LegacyCodec(gvs...)
+}
+
+// TestStorageCodec returns the codec for the API version to test against used in storage, as set by the
+// KUBE_TEST_API_STORAGE_TYPE env var.
+func TestStorageCodec(codecs runtimeserializer.CodecFactory, gvs ...schema.GroupVersion) runtime.Codec {
+	if len(testStorageCodecMediaType) != 0 {
+		serializerInfo, ok := runtime.SerializerInfoForMediaType(codecs.SupportedMediaTypes(), testStorageCodecMediaType)
+		if !ok {
+			panic(fmt.Sprintf("no serializer for %s", testStorageCodecMediaType))
+		}
+
+		// etcd2 only supports string data - we must wrap any result before returning
+		// TODO: remove for etcd3 / make parameterizable
+		serializer := serializerInfo.Serializer
+		if !serializerInfo.EncodesAsText {
+			serializer = runtime.NewBase64Serializer(serializer, serializer)
+		}
+
+		decoder := recognizer.NewDecoder(serializer, codecs.UniversalDeserializer())
+		return codecs.CodecForVersions(serializer, decoder, schema.GroupVersions(gvs), nil)
+
+	}
+	return codecs.LegacyCodec(gvs...)
+}
+
+func init() {
+	var err error
+	if apiMediaType := os.Getenv("KUBE_TEST_API_TYPE"); len(apiMediaType) > 0 {
+		testCodecMediaType, _, err = mime.ParseMediaType(apiMediaType)
+		if err != nil {
+			panic(err)
+		}
+	}
+
+	if storageMediaType := os.Getenv("KUBE_TEST_API_STORAGE_TYPE"); len(storageMediaType) > 0 {
+		testStorageCodecMediaType, _, err = mime.ParseMediaType(storageMediaType)
+		if err != nil {
+			panic(err)
+		}
+	}
+}
+
+// InstallOrDieFunc mirrors install functions that require success
+type InstallOrDieFunc func(scheme *runtime.Scheme)
+
+// SchemeForInstallOrDie builds a simple test scheme and codecfactory pair for easy unit testing from higher level install methods
+func SchemeForInstallOrDie(installFns ...InstallOrDieFunc) (*runtime.Scheme, runtimeserializer.CodecFactory) {
+	scheme := runtime.NewScheme()
+	codecFactory := runtimeserializer.NewCodecFactory(scheme)
+	for _, installFn := range installFns {
+		installFn(scheme)
+	}
+
+	return scheme, codecFactory
+}
+
+// InstallFunc mirrors install functions that can return an error
+type InstallFunc func(scheme *runtime.Scheme) error
+
+// SchemeForOrDie builds a simple test scheme and codecfactory pair for easy unit testing from the bare registration methods.
+func SchemeForOrDie(installFns ...InstallFunc) (*runtime.Scheme, runtimeserializer.CodecFactory) {
+	scheme := runtime.NewScheme()
+	codecFactory := runtimeserializer.NewCodecFactory(scheme)
+	for _, installFn := range installFns {
+		if err := installFn(scheme); err != nil {
+			panic(err)
+		}
+	}
+
+	return scheme, codecFactory
+}
diff --git a/vendor/k8s.io/apimachinery/pkg/api/apitesting/roundtrip/compatibility.go b/vendor/k8s.io/apimachinery/pkg/api/apitesting/roundtrip/compatibility.go
new file mode 100644
index 000000000..c65525330
--- /dev/null
+++ b/vendor/k8s.io/apimachinery/pkg/api/apitesting/roundtrip/compatibility.go
@@ -0,0 +1,537 @@
+/*
+Copyright 2019 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package roundtrip
+
+import (
+	"bytes"
+	"io/ioutil"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"sort"
+	"strconv"
+	"strings"
+	"testing"
+	"time"
+
+	"github.com/google/go-cmp/cmp"
+	fuzz "github.com/google/gofuzz"
+
+	apiequality "k8s.io/apimachinery/pkg/api/equality"
+	apimeta "k8s.io/apimachinery/pkg/api/meta"
+	genericfuzzer "k8s.io/apimachinery/pkg/apis/meta/fuzzer"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/runtime/serializer"
+	"k8s.io/apimachinery/pkg/runtime/serializer/json"
+	"k8s.io/apimachinery/pkg/runtime/serializer/protobuf"
+	"k8s.io/apimachinery/pkg/util/intstr"
+	"k8s.io/apimachinery/pkg/util/sets"
+)
+
+// CompatibilityTestOptions holds configuration for running a compatibility test using in-memory objects
+// and serialized files on disk representing the current code and serialized data from previous versions.
+//
+// Example use: `NewCompatibilityTestOptions(scheme).Complete(t).Run(t)`
+type CompatibilityTestOptions struct {
+	// Scheme is used to create new objects for fuzzing, decoding, and for constructing serializers.
+	// Required.
+	Scheme *runtime.Scheme
+
+	// TestDataDir points to a directory containing compatibility test data.
+	// Complete() populates this with "testdata" if unset.
+	TestDataDir string
+
+	// TestDataDirCurrentVersion points to a directory containing compatibility test data for the current version.
+	// Complete() populates this with "<TestDataDir>/HEAD" if unset.
+	// Within this directory, `<group>.<version>.<kind>.[json|yaml|pb]` files are required to exist, and are:
+	// * verified to match serialized FuzzedObjects[GVK]
+	// * verified to decode without error
+	// * verified to round-trip byte-for-byte when re-encoded
+	// * verified to be semantically equal when decoded into memory
+	TestDataDirCurrentVersion string
+
+	// TestDataDirsPreviousVersions is a list of directories containing compatibility test data for previous versions.
+	// Complete() populates this with "<TestDataDir>/v*" directories if nil.
+	// Within these directories, `<group>.<version>.<kind>.[json|yaml|pb]` files are optional. If present, they are:
+	// * verified to decode without error
+	// * verified to round-trip byte-for-byte when re-encoded (or to match a `<group>.<version>.<kind>.[json|yaml|pb].after_roundtrip.[json|yaml|pb]` file if it exists)
+	// * verified to be semantically equal when decoded into memory
+	TestDataDirsPreviousVersions []string
+
+	// Kinds is a list of fully qualified kinds to test.
+	// Complete() populates this with Scheme.AllKnownTypes() if unset.
+	Kinds []schema.GroupVersionKind
+
+	// FuzzedObjects is an optional set of fuzzed objects to use for verifying HEAD fixtures.
+	// Complete() populates this with the result of CompatibilityTestObject(Kinds[*], Scheme, FuzzFuncs) for any missing kinds.
+	// Objects must be deterministically fuzzed and identical on every invocation.
+	FuzzedObjects map[schema.GroupVersionKind]runtime.Object
+
+	// FuzzFuncs is an optional set of custom fuzzing functions to use to construct FuzzedObjects.
+	// They *must* not use any random source other than the passed-in fuzzer.
+	FuzzFuncs []interface{}
+
+	JSON  runtime.Serializer
+	YAML  runtime.Serializer
+	Proto runtime.Serializer
+}
+
+func NewCompatibilityTestOptions(scheme *runtime.Scheme) *CompatibilityTestOptions {
+	return &CompatibilityTestOptions{Scheme: scheme}
+}
+
+// coreKinds includes kinds that typically only need to be tested in a single API group
+var coreKinds = sets.NewString(
+	"CreateOptions", "UpdateOptions", "PatchOptions", "DeleteOptions",
+	"GetOptions", "ListOptions", "ExportOptions",
+	"WatchEvent",
+)
+
+func (c *CompatibilityTestOptions) Complete(t *testing.T) *CompatibilityTestOptions {
+	t.Helper()
+
+	// Verify scheme
+	if c.Scheme == nil {
+		t.Fatal("scheme is required")
+	}
+
+	// Populate testdata dirs
+	if c.TestDataDir == "" {
+		c.TestDataDir = "testdata"
+	}
+	if c.TestDataDirCurrentVersion == "" {
+		c.TestDataDirCurrentVersion = filepath.Join(c.TestDataDir, "HEAD")
+	}
+	if c.TestDataDirsPreviousVersions == nil {
+		dirs, err := filepath.Glob(filepath.Join(c.TestDataDir, "v*"))
+		if err != nil {
+			t.Fatal(err)
+		}
+		sort.Strings(dirs)
+		c.TestDataDirsPreviousVersions = dirs
+	}
+
+	// Populate kinds
+	if len(c.Kinds) == 0 {
+		gvks := []schema.GroupVersionKind{}
+		for gvk := range c.Scheme.AllKnownTypes() {
+			if gvk.Version == "" || gvk.Version == runtime.APIVersionInternal {
+				// only test external types
+				continue
+			}
+			if strings.HasSuffix(gvk.Kind, "List") {
+				// omit list types
+				continue
+			}
+			if gvk.Group != "" && coreKinds.Has(gvk.Kind) {
+				// only test options types in the core API group
+				continue
+			}
+			gvks = append(gvks, gvk)
+		}
+		c.Kinds = gvks
+	}
+
+	// Sort kinds to get deterministic test order
+	sort.Slice(c.Kinds, func(i, j int) bool {
+		if c.Kinds[i].Group != c.Kinds[j].Group {
+			return c.Kinds[i].Group < c.Kinds[j].Group
+		}
+		if c.Kinds[i].Version != c.Kinds[j].Version {
+			return c.Kinds[i].Version < c.Kinds[j].Version
+		}
+		if c.Kinds[i].Kind != c.Kinds[j].Kind {
+			return c.Kinds[i].Kind < c.Kinds[j].Kind
+		}
+		return false
+	})
+
+	// Fuzz any missing objects
+	if c.FuzzedObjects == nil {
+		c.FuzzedObjects = map[schema.GroupVersionKind]runtime.Object{}
+	}
+	for _, gvk := range c.Kinds {
+		if _, ok := c.FuzzedObjects[gvk]; ok {
+			continue
+		}
+		obj, err := CompatibilityTestObject(c.Scheme, gvk, c.FuzzFuncs)
+		if err != nil {
+			t.Fatal(err)
+		}
+		c.FuzzedObjects[gvk] = obj
+	}
+
+	if c.JSON == nil {
+		c.JSON = json.NewSerializer(json.DefaultMetaFactory, c.Scheme, c.Scheme, true)
+	}
+	if c.YAML == nil {
+		c.YAML = json.NewYAMLSerializer(json.DefaultMetaFactory, c.Scheme, c.Scheme)
+	}
+	if c.Proto == nil {
+		c.Proto = protobuf.NewSerializer(c.Scheme, c.Scheme)
+	}
+
+	return c
+}
+
+// CompatibilityTestObject returns a deterministically fuzzed object for the specified GVK
+func CompatibilityTestObject(scheme *runtime.Scheme, gvk schema.GroupVersionKind, fuzzFuncs []interface{}) (runtime.Object, error) {
+	// Construct the object
+	obj, err := scheme.New(gvk)
+	if err != nil {
+		return nil, err
+	}
+
+	// Fuzz it
+	CompatibilityTestFuzzer(scheme, fuzzFuncs).Fuzz(obj)
+
+	// Set the kind and apiVersion
+	if typeAcc, err := apimeta.TypeAccessor(obj); err != nil {
+		return nil, err
+	} else {
+		typeAcc.SetKind(gvk.Kind)
+		typeAcc.SetAPIVersion(gvk.GroupVersion().String())
+	}
+
+	return obj, nil
+}
+
+// CompatibilityTestFuzzer returns a fuzzer for the given scheme:
+// - fixed seed (deterministic output that lets us generate the same fixtures on every run)
+// - 0 nil chance (populate all fields)
+// - 1 numelements (populate and bound all lists)
+// - 20 max depth (don't recurse infinitely)
+// - meta fuzzing functions added
+// - custom fuzzing functions to make strings and managedFields more readable in fixtures
+func CompatibilityTestFuzzer(scheme *runtime.Scheme, fuzzFuncs []interface{}) *fuzz.Fuzzer {
+	fuzzer := fuzz.NewWithSeed(0).NilChance(0).NumElements(1, 1).MaxDepth(20)
+	fuzzer = fuzzer.Funcs(genericfuzzer.Funcs(serializer.NewCodecFactory(scheme))...)
+	fuzzString := 1
+	fuzzIntOrString := 1
+	fuzzMicroTime := int64(1)
+	fuzzer.Funcs(
+		// avoid crazy strings
+		func(s *string, c fuzz.Continue) {
+			fuzzString++
+			*s = strconv.Itoa(fuzzString)
+		},
+		func(i **intstr.IntOrString, c fuzz.Continue) {
+			fuzzIntOrString++
+			tmp := intstr.FromInt(fuzzIntOrString)
+			_ = tmp
+			*i = &tmp
+		},
+		func(t **metav1.MicroTime, c fuzz.Continue) {
+			if t != nil && *t != nil {
+				// use type-defined fuzzing for non-nil objects
+				(*t).Fuzz(c)
+				return
+			}
+			fuzzMicroTime++
+			tmp := metav1.NewMicroTime(time.Unix(fuzzMicroTime, 0))
+			*t = &tmp
+		},
+		// limit managed fields to two levels
+		func(f *[]metav1.ManagedFieldsEntry, c fuzz.Continue) {
+			field := metav1.ManagedFieldsEntry{}
+			c.Fuzz(&field)
+			if field.FieldsV1 != nil {
+				field.FieldsV1.Raw = []byte("{}")
+			}
+			*f = []metav1.ManagedFieldsEntry{field}
+		},
+		func(r *runtime.RawExtension, c fuzz.Continue) {
+			// generate a raw object in normalized form
+			// TODO: test non-normalized round-tripping... YAMLToJSON normalizes and makes exact comparisons fail
+			r.Raw = []byte(`{"apiVersion":"example.com/v1","kind":"CustomType","spec":{"replicas":1},"status":{"available":1}}`)
+		},
+	)
+	fuzzer.Funcs(fuzzFuncs...)
+	return fuzzer
+}
+
+func (c *CompatibilityTestOptions) Run(t *testing.T) {
+	for _, gvk := range c.Kinds {
+		t.Run(makeName(gvk), func(t *testing.T) {
+
+			t.Run("HEAD", func(t *testing.T) {
+				c.runCurrentVersionTest(t, gvk)
+			})
+
+			for _, previousVersionDir := range c.TestDataDirsPreviousVersions {
+				t.Run(filepath.Base(previousVersionDir), func(t *testing.T) {
+					c.runPreviousVersionTest(t, gvk, previousVersionDir)
+				})
+			}
+
+		})
+	}
+}
+
+func (c *CompatibilityTestOptions) runCurrentVersionTest(t *testing.T, gvk schema.GroupVersionKind) {
+	expectedObject := c.FuzzedObjects[gvk]
+	expectedJSON, expectedYAML, expectedProto := c.encode(t, expectedObject)
+
+	actualJSON, actualYAML, actualProto, err := read(c.TestDataDirCurrentVersion, gvk, "")
+	if err != nil && !os.IsNotExist(err) {
+		t.Fatal(err)
+	}
+
+	needsUpdate := false
+	if os.IsNotExist(err) {
+		t.Errorf("current version compatibility files did not exist: %v", err)
+		needsUpdate = true
+	} else {
+		if !bytes.Equal(expectedJSON, actualJSON) {
+			t.Errorf("json differs")
+			t.Log(cmp.Diff(string(actualJSON), string(expectedJSON)))
+			needsUpdate = true
+		}
+
+		if !bytes.Equal(expectedYAML, actualYAML) {
+			t.Errorf("yaml differs")
+			t.Log(cmp.Diff(string(actualYAML), string(expectedYAML)))
+			needsUpdate = true
+		}
+
+		if !bytes.Equal(expectedProto, actualProto) {
+			t.Errorf("proto differs")
+			needsUpdate = true
+			t.Log(cmp.Diff(dumpProto(t, actualProto[4:]), dumpProto(t, expectedProto[4:])))
+			// t.Logf("json (for locating the offending field based on surrounding data): %s", string(expectedJSON))
+		}
+	}
+
+	if needsUpdate {
+		const updateEnvVar = "UPDATE_COMPATIBILITY_FIXTURE_DATA"
+		if os.Getenv(updateEnvVar) == "true" {
+			writeFile(t, c.TestDataDirCurrentVersion, gvk, "", "json", expectedJSON)
+			writeFile(t, c.TestDataDirCurrentVersion, gvk, "", "yaml", expectedYAML)
+			writeFile(t, c.TestDataDirCurrentVersion, gvk, "", "pb", expectedProto)
+			t.Logf("wrote expected compatibility data... verify, commit, and rerun tests")
+		} else {
+			t.Logf("if the diff is expected because of a new type or a new field, re-run with %s=true to update the compatibility data", updateEnvVar)
+		}
+		return
+	}
+
+	emptyObj, err := c.Scheme.New(gvk)
+	if err != nil {
+		t.Fatal(err)
+	}
+	{
+		jsonDecoded := emptyObj.DeepCopyObject()
+		jsonDecoded, _, err = c.JSON.Decode(actualJSON, &gvk, jsonDecoded)
+		if err != nil {
+			t.Error(err)
+		} else if !apiequality.Semantic.DeepEqual(expectedObject, jsonDecoded) {
+			t.Errorf("expected and decoded json objects differed:\n%s", cmp.Diff(expectedObject, jsonDecoded))
+		}
+	}
+	{
+		yamlDecoded := emptyObj.DeepCopyObject()
+		yamlDecoded, _, err = c.YAML.Decode(actualYAML, &gvk, yamlDecoded)
+		if err != nil {
+			t.Error(err)
+		} else if !apiequality.Semantic.DeepEqual(expectedObject, yamlDecoded) {
+			t.Errorf("expected and decoded yaml objects differed:\n%s", cmp.Diff(expectedObject, yamlDecoded))
+		}
+	}
+	{
+		protoDecoded := emptyObj.DeepCopyObject()
+		protoDecoded, _, err = c.Proto.Decode(actualProto, &gvk, protoDecoded)
+		if err != nil {
+			t.Error(err)
+		} else if !apiequality.Semantic.DeepEqual(expectedObject, protoDecoded) {
+			t.Errorf("expected and decoded proto objects differed:\n%s", cmp.Diff(expectedObject, protoDecoded))
+		}
+	}
+}
+
+func (c *CompatibilityTestOptions) encode(t *testing.T, obj runtime.Object) (json, yaml, proto []byte) {
+	jsonBytes := bytes.NewBuffer(nil)
+	if err := c.JSON.Encode(obj, jsonBytes); err != nil {
+		t.Fatalf("error encoding json: %v", err)
+	}
+	yamlBytes := bytes.NewBuffer(nil)
+	if err := c.YAML.Encode(obj, yamlBytes); err != nil {
+		t.Fatalf("error encoding yaml: %v", err)
+	}
+	protoBytes := bytes.NewBuffer(nil)
+	if err := c.Proto.Encode(obj, protoBytes); err != nil {
+		t.Fatalf("error encoding proto: %v", err)
+	}
+	return jsonBytes.Bytes(), yamlBytes.Bytes(), protoBytes.Bytes()
+}
+
+func read(dir string, gvk schema.GroupVersionKind, suffix string) (json, yaml, proto []byte, err error) {
+	actualJSON, jsonErr := ioutil.ReadFile(filepath.Join(dir, makeName(gvk)+suffix+".json"))
+	actualYAML, yamlErr := ioutil.ReadFile(filepath.Join(dir, makeName(gvk)+suffix+".yaml"))
+	actualProto, protoErr := ioutil.ReadFile(filepath.Join(dir, makeName(gvk)+suffix+".pb"))
+	if jsonErr != nil {
+		return actualJSON, actualYAML, actualProto, jsonErr
+	}
+	if yamlErr != nil {
+		return actualJSON, actualYAML, actualProto, yamlErr
+	}
+	if protoErr != nil {
+		return actualJSON, actualYAML, actualProto, protoErr
+	}
+	return actualJSON, actualYAML, actualProto, nil
+}
+
+func writeFile(t *testing.T, dir string, gvk schema.GroupVersionKind, suffix, extension string, data []byte) {
+	if err := os.MkdirAll(dir, os.FileMode(0755)); err != nil {
+		t.Fatal("error making directory", err)
+	}
+	if err := ioutil.WriteFile(filepath.Join(dir, makeName(gvk)+suffix+"."+extension), data, os.FileMode(0644)); err != nil {
+		t.Fatalf("error writing %s: %v", extension, err)
+	}
+}
+
+func (c *CompatibilityTestOptions) runPreviousVersionTest(t *testing.T, gvk schema.GroupVersionKind, previousVersionDir string) {
+	jsonBeforeRoundTrip, yamlBeforeRoundTrip, protoBeforeRoundTrip, err := read(previousVersionDir, gvk, "")
+	if os.IsNotExist(err) || (len(jsonBeforeRoundTrip) == 0 && len(yamlBeforeRoundTrip) == 0 && len(protoBeforeRoundTrip) == 0) {
+		t.SkipNow()
+		return
+	}
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	emptyObj, err := c.Scheme.New(gvk)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	jsonDecoded := emptyObj.DeepCopyObject()
+	jsonDecoded, _, err = c.JSON.Decode(jsonBeforeRoundTrip, &gvk, jsonDecoded)
+	if err != nil {
+		t.Fatal(err)
+	}
+	jsonBytes := bytes.NewBuffer(nil)
+	if err := c.JSON.Encode(jsonDecoded, jsonBytes); err != nil {
+		t.Fatalf("error encoding json: %v", err)
+	}
+	jsonAfterRoundTrip := jsonBytes.Bytes()
+
+	yamlDecoded := emptyObj.DeepCopyObject()
+	yamlDecoded, _, err = c.YAML.Decode(yamlBeforeRoundTrip, &gvk, yamlDecoded)
+	if err != nil {
+		t.Fatal(err)
+	} else if !apiequality.Semantic.DeepEqual(jsonDecoded, yamlDecoded) {
+		t.Errorf("decoded json and yaml objects differ:\n%s", cmp.Diff(jsonDecoded, yamlDecoded))
+	}
+	yamlBytes := bytes.NewBuffer(nil)
+	if err := c.YAML.Encode(yamlDecoded, yamlBytes); err != nil {
+		t.Fatalf("error encoding yaml: %v", err)
+	}
+	yamlAfterRoundTrip := yamlBytes.Bytes()
+
+	protoDecoded := emptyObj.DeepCopyObject()
+	protoDecoded, _, err = c.Proto.Decode(protoBeforeRoundTrip, &gvk, protoDecoded)
+	if err != nil {
+		t.Fatal(err)
+	} else if !apiequality.Semantic.DeepEqual(jsonDecoded, protoDecoded) {
+		t.Errorf("decoded json and proto objects differ:\n%s", cmp.Diff(jsonDecoded, protoDecoded))
+	}
+	protoBytes := bytes.NewBuffer(nil)
+	if err := c.Proto.Encode(protoDecoded, protoBytes); err != nil {
+		t.Fatalf("error encoding proto: %v", err)
+	}
+	protoAfterRoundTrip := protoBytes.Bytes()
+
+	expectedJSONAfterRoundTrip, expectedYAMLAfterRoundTrip, expectedProtoAfterRoundTrip, _ := read(previousVersionDir, gvk, ".after_roundtrip")
+	if len(expectedJSONAfterRoundTrip) == 0 {
+		expectedJSONAfterRoundTrip = jsonBeforeRoundTrip
+	}
+	if len(expectedYAMLAfterRoundTrip) == 0 {
+		expectedYAMLAfterRoundTrip = yamlBeforeRoundTrip
+	}
+	if len(expectedProtoAfterRoundTrip) == 0 {
+		expectedProtoAfterRoundTrip = protoBeforeRoundTrip
+	}
+
+	jsonNeedsUpdate := false
+	yamlNeedsUpdate := false
+	protoNeedsUpdate := false
+
+	if !bytes.Equal(expectedJSONAfterRoundTrip, jsonAfterRoundTrip) {
+		t.Errorf("json differs")
+		t.Log(cmp.Diff(string(expectedJSONAfterRoundTrip), string(jsonAfterRoundTrip)))
+		jsonNeedsUpdate = true
+	}
+
+	if !bytes.Equal(expectedYAMLAfterRoundTrip, yamlAfterRoundTrip) {
+		t.Errorf("yaml differs")
+		t.Log(cmp.Diff(string(expectedYAMLAfterRoundTrip), string(yamlAfterRoundTrip)))
+		yamlNeedsUpdate = true
+	}
+
+	if !bytes.Equal(expectedProtoAfterRoundTrip, protoAfterRoundTrip) {
+		t.Errorf("proto differs")
+		protoNeedsUpdate = true
+		t.Log(cmp.Diff(dumpProto(t, expectedProtoAfterRoundTrip[4:]), dumpProto(t, protoAfterRoundTrip[4:])))
+		// t.Logf("json (for locating the offending field based on surrounding data): %s", string(expectedJSON))
+	}
+
+	if jsonNeedsUpdate || yamlNeedsUpdate || protoNeedsUpdate {
+		const updateEnvVar = "UPDATE_COMPATIBILITY_FIXTURE_DATA"
+		if os.Getenv(updateEnvVar) == "true" {
+			if jsonNeedsUpdate {
+				writeFile(t, previousVersionDir, gvk, ".after_roundtrip", "json", jsonAfterRoundTrip)
+			}
+			if yamlNeedsUpdate {
+				writeFile(t, previousVersionDir, gvk, ".after_roundtrip", "yaml", yamlAfterRoundTrip)
+			}
+			if protoNeedsUpdate {
+				writeFile(t, previousVersionDir, gvk, ".after_roundtrip", "pb", protoAfterRoundTrip)
+			}
+			t.Logf("wrote expected compatibility data... verify, commit, and rerun tests")
+		} else {
+			t.Logf("if the diff is expected because of a new type or a new field, re-run with %s=true to update the compatibility data", updateEnvVar)
+		}
+		return
+	}
+}
+
+func makeName(gvk schema.GroupVersionKind) string {
+	g := gvk.Group
+	if g == "" {
+		g = "core"
+	}
+	return g + "." + gvk.Version + "." + gvk.Kind
+}
+
+func dumpProto(t *testing.T, data []byte) string {
+	t.Helper()
+	protoc, err := exec.LookPath("protoc")
+	if err != nil {
+		t.Log(err)
+		return ""
+	}
+	cmd := exec.Command(protoc, "--decode_raw")
+	cmd.Stdin = bytes.NewBuffer(data)
+	d, err := cmd.CombinedOutput()
+	if err != nil {
+		t.Log(err)
+		return ""
+	}
+	return string(d)
+}
diff --git a/vendor/k8s.io/apimachinery/pkg/api/apitesting/roundtrip/roundtrip.go b/vendor/k8s.io/apimachinery/pkg/api/apitesting/roundtrip/roundtrip.go
new file mode 100644
index 000000000..f7961043a
--- /dev/null
+++ b/vendor/k8s.io/apimachinery/pkg/api/apitesting/roundtrip/roundtrip.go
@@ -0,0 +1,438 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package roundtrip
+
+import (
+	"bytes"
+	"encoding/hex"
+	"math/rand"
+	"reflect"
+	"strings"
+	"testing"
+
+	"github.com/davecgh/go-spew/spew"
+	"github.com/golang/protobuf/proto"
+	fuzz "github.com/google/gofuzz"
+	flag "github.com/spf13/pflag"
+
+	apitesting "k8s.io/apimachinery/pkg/api/apitesting"
+	"k8s.io/apimachinery/pkg/api/apitesting/fuzzer"
+	apiequality "k8s.io/apimachinery/pkg/api/equality"
+	apimeta "k8s.io/apimachinery/pkg/api/meta"
+	metafuzzer "k8s.io/apimachinery/pkg/apis/meta/fuzzer"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer"
+	"k8s.io/apimachinery/pkg/runtime/serializer/json"
+	"k8s.io/apimachinery/pkg/runtime/serializer/protobuf"
+	"k8s.io/apimachinery/pkg/util/diff"
+	"k8s.io/apimachinery/pkg/util/sets"
+)
+
+type InstallFunc func(scheme *runtime.Scheme)
+
+// RoundTripTestForAPIGroup is convenient to call from your install package to make sure that a "bare" install of your group provides
+// enough information to round trip
+func RoundTripTestForAPIGroup(t *testing.T, installFn InstallFunc, fuzzingFuncs fuzzer.FuzzerFuncs) {
+	scheme := runtime.NewScheme()
+	installFn(scheme)
+
+	RoundTripTestForScheme(t, scheme, fuzzingFuncs)
+}
+
+// RoundTripTestForScheme is convenient to call if you already have a scheme and want to make sure that its well-formed
+func RoundTripTestForScheme(t *testing.T, scheme *runtime.Scheme, fuzzingFuncs fuzzer.FuzzerFuncs) {
+	codecFactory := runtimeserializer.NewCodecFactory(scheme)
+	f := fuzzer.FuzzerFor(
+		fuzzer.MergeFuzzerFuncs(metafuzzer.Funcs, fuzzingFuncs),
+		rand.NewSource(rand.Int63()),
+		codecFactory,
+	)
+	RoundTripTypesWithoutProtobuf(t, scheme, codecFactory, f, nil)
+}
+
+// RoundTripProtobufTestForAPIGroup is convenient to call from your install package to make sure that a "bare" install of your group provides
+// enough information to round trip
+func RoundTripProtobufTestForAPIGroup(t *testing.T, installFn InstallFunc, fuzzingFuncs fuzzer.FuzzerFuncs) {
+	scheme := runtime.NewScheme()
+	installFn(scheme)
+
+	RoundTripProtobufTestForScheme(t, scheme, fuzzingFuncs)
+}
+
+// RoundTripProtobufTestForScheme is convenient to call if you already have a scheme and want to make sure that its well-formed
+func RoundTripProtobufTestForScheme(t *testing.T, scheme *runtime.Scheme, fuzzingFuncs fuzzer.FuzzerFuncs) {
+	codecFactory := runtimeserializer.NewCodecFactory(scheme)
+	fuzzer := fuzzer.FuzzerFor(
+		fuzzer.MergeFuzzerFuncs(metafuzzer.Funcs, fuzzingFuncs),
+		rand.NewSource(rand.Int63()),
+		codecFactory,
+	)
+	RoundTripTypes(t, scheme, codecFactory, fuzzer, nil)
+}
+
+var FuzzIters = flag.Int("fuzz-iters", 20, "How many fuzzing iterations to do.")
+
+// globalNonRoundTrippableTypes are kinds that are effectively reserved across all GroupVersions
+// They don't roundtrip
+var globalNonRoundTrippableTypes = sets.NewString(
+	"ExportOptions",
+	"GetOptions",
+	// WatchEvent does not include kind and version and can only be deserialized
+	// implicitly (if the caller expects the specific object). The watch call defines
+	// the schema by content type, rather than via kind/version included in each
+	// object.
+	"WatchEvent",
+	// ListOptions is now part of the meta group
+	"ListOptions",
+	// Delete options is only read in metav1
+	"DeleteOptions",
+)
+
+// GlobalNonRoundTrippableTypes returns the kinds that are effectively reserved across all GroupVersions.
+// They don't roundtrip and thus can be excluded in any custom/downstream roundtrip tests
+//
+//  kinds := scheme.AllKnownTypes()
+//  for gvk := range kinds {
+//      if roundtrip.GlobalNonRoundTrippableTypes().Has(gvk.Kind) {
+//          continue
+//      }
+//      t.Run(gvk.Group+"."+gvk.Version+"."+gvk.Kind, func(t *testing.T) {
+//          // roundtrip test
+//      })
+//  }
+//
+func GlobalNonRoundTrippableTypes() sets.String {
+	return sets.NewString(globalNonRoundTrippableTypes.List()...)
+}
+
+// RoundTripTypesWithoutProtobuf applies the round-trip test to all round-trippable Kinds
+// in the scheme.  It will skip all the GroupVersionKinds in the skip list.
+func RoundTripTypesWithoutProtobuf(t *testing.T, scheme *runtime.Scheme, codecFactory runtimeserializer.CodecFactory, fuzzer *fuzz.Fuzzer, nonRoundTrippableTypes map[schema.GroupVersionKind]bool) {
+	roundTripTypes(t, scheme, codecFactory, fuzzer, nonRoundTrippableTypes, true)
+}
+
+func RoundTripTypes(t *testing.T, scheme *runtime.Scheme, codecFactory runtimeserializer.CodecFactory, fuzzer *fuzz.Fuzzer, nonRoundTrippableTypes map[schema.GroupVersionKind]bool) {
+	roundTripTypes(t, scheme, codecFactory, fuzzer, nonRoundTrippableTypes, false)
+}
+
+func roundTripTypes(t *testing.T, scheme *runtime.Scheme, codecFactory runtimeserializer.CodecFactory, fuzzer *fuzz.Fuzzer, nonRoundTrippableTypes map[schema.GroupVersionKind]bool, skipProtobuf bool) {
+	for _, group := range groupsFromScheme(scheme) {
+		t.Logf("starting group %q", group)
+		internalVersion := schema.GroupVersion{Group: group, Version: runtime.APIVersionInternal}
+		internalKindToGoType := scheme.KnownTypes(internalVersion)
+
+		for kind := range internalKindToGoType {
+			if globalNonRoundTrippableTypes.Has(kind) {
+				continue
+			}
+
+			internalGVK := internalVersion.WithKind(kind)
+			roundTripSpecificKind(t, internalGVK, scheme, codecFactory, fuzzer, nonRoundTrippableTypes, skipProtobuf)
+		}
+
+		t.Logf("finished group %q", group)
+	}
+}
+
+// RoundTripExternalTypes applies the round-trip test to all external round-trippable Kinds
+// in the scheme.  It will skip all the GroupVersionKinds in the nonRoundTripExternalTypes list .
+func RoundTripExternalTypes(t *testing.T, scheme *runtime.Scheme, codecFactory runtimeserializer.CodecFactory, fuzzer *fuzz.Fuzzer, nonRoundTrippableTypes map[schema.GroupVersionKind]bool) {
+	kinds := scheme.AllKnownTypes()
+	for gvk := range kinds {
+		if gvk.Version == runtime.APIVersionInternal || globalNonRoundTrippableTypes.Has(gvk.Kind) {
+			continue
+		}
+		t.Run(gvk.Group+"."+gvk.Version+"."+gvk.Kind, func(t *testing.T) {
+			roundTripSpecificKind(t, gvk, scheme, codecFactory, fuzzer, nonRoundTrippableTypes, false)
+		})
+	}
+}
+
+// RoundTripExternalTypesWithoutProtobuf applies the round-trip test to all external round-trippable Kinds
+// in the scheme.  It will skip all the GroupVersionKinds in the nonRoundTripExternalTypes list.
+func RoundTripExternalTypesWithoutProtobuf(t *testing.T, scheme *runtime.Scheme, codecFactory runtimeserializer.CodecFactory, fuzzer *fuzz.Fuzzer, nonRoundTrippableTypes map[schema.GroupVersionKind]bool) {
+	kinds := scheme.AllKnownTypes()
+	for gvk := range kinds {
+		if gvk.Version == runtime.APIVersionInternal || globalNonRoundTrippableTypes.Has(gvk.Kind) {
+			continue
+		}
+		t.Run(gvk.Group+"."+gvk.Version+"."+gvk.Kind, func(t *testing.T) {
+			roundTripSpecificKind(t, gvk, scheme, codecFactory, fuzzer, nonRoundTrippableTypes, true)
+		})
+	}
+}
+
+func RoundTripSpecificKindWithoutProtobuf(t *testing.T, gvk schema.GroupVersionKind, scheme *runtime.Scheme, codecFactory runtimeserializer.CodecFactory, fuzzer *fuzz.Fuzzer, nonRoundTrippableTypes map[schema.GroupVersionKind]bool) {
+	roundTripSpecificKind(t, gvk, scheme, codecFactory, fuzzer, nonRoundTrippableTypes, true)
+}
+
+func RoundTripSpecificKind(t *testing.T, gvk schema.GroupVersionKind, scheme *runtime.Scheme, codecFactory runtimeserializer.CodecFactory, fuzzer *fuzz.Fuzzer, nonRoundTrippableTypes map[schema.GroupVersionKind]bool) {
+	roundTripSpecificKind(t, gvk, scheme, codecFactory, fuzzer, nonRoundTrippableTypes, false)
+}
+
+func roundTripSpecificKind(t *testing.T, gvk schema.GroupVersionKind, scheme *runtime.Scheme, codecFactory runtimeserializer.CodecFactory, fuzzer *fuzz.Fuzzer, nonRoundTrippableTypes map[schema.GroupVersionKind]bool, skipProtobuf bool) {
+	if nonRoundTrippableTypes[gvk] {
+		t.Logf("skipping %v", gvk)
+		return
+	}
+
+	// Try a few times, since runTest uses random values.
+	for i := 0; i < *FuzzIters; i++ {
+		if gvk.Version == runtime.APIVersionInternal {
+			roundTripToAllExternalVersions(t, scheme, codecFactory, fuzzer, gvk, nonRoundTrippableTypes, skipProtobuf)
+		} else {
+			roundTripOfExternalType(t, scheme, codecFactory, fuzzer, gvk, skipProtobuf)
+		}
+		if t.Failed() {
+			break
+		}
+	}
+}
+
+// fuzzInternalObject fuzzes an arbitrary runtime object using the appropriate
+// fuzzer registered with the apitesting package.
+func fuzzInternalObject(t *testing.T, fuzzer *fuzz.Fuzzer, object runtime.Object) runtime.Object {
+	fuzzer.Fuzz(object)
+
+	j, err := apimeta.TypeAccessor(object)
+	if err != nil {
+		t.Fatalf("Unexpected error %v for %#v", err, object)
+	}
+	j.SetKind("")
+	j.SetAPIVersion("")
+
+	return object
+}
+
+func groupsFromScheme(scheme *runtime.Scheme) []string {
+	ret := sets.String{}
+	for gvk := range scheme.AllKnownTypes() {
+		ret.Insert(gvk.Group)
+	}
+	return ret.List()
+}
+
+func roundTripToAllExternalVersions(t *testing.T, scheme *runtime.Scheme, codecFactory runtimeserializer.CodecFactory, fuzzer *fuzz.Fuzzer, internalGVK schema.GroupVersionKind, nonRoundTrippableTypes map[schema.GroupVersionKind]bool, skipProtobuf bool) {
+	object, err := scheme.New(internalGVK)
+	if err != nil {
+		t.Fatalf("Couldn't make a %v? %v", internalGVK, err)
+	}
+	if _, err := apimeta.TypeAccessor(object); err != nil {
+		t.Fatalf("%q is not a TypeMeta and cannot be tested - add it to nonRoundTrippableInternalTypes: %v", internalGVK, err)
+	}
+
+	fuzzInternalObject(t, fuzzer, object)
+
+	// find all potential serializations in the scheme.
+	// TODO fix this up to handle kinds that cross registered with different names.
+	for externalGVK, externalGoType := range scheme.AllKnownTypes() {
+		if externalGVK.Version == runtime.APIVersionInternal {
+			continue
+		}
+		if externalGVK.GroupKind() != internalGVK.GroupKind() {
+			continue
+		}
+		if nonRoundTrippableTypes[externalGVK] {
+			t.Logf("\tskipping  %v %v", externalGVK, externalGoType)
+			continue
+		}
+		t.Logf("\tround tripping to %v %v", externalGVK, externalGoType)
+
+		roundTrip(t, scheme, apitesting.TestCodec(codecFactory, externalGVK.GroupVersion()), object)
+
+		// TODO remove this hack after we're past the intermediate steps
+		if !skipProtobuf && externalGVK.Group != "kubeadm.k8s.io" {
+			s := protobuf.NewSerializer(scheme, scheme)
+			protobufCodec := codecFactory.CodecForVersions(s, s, externalGVK.GroupVersion(), nil)
+			roundTrip(t, scheme, protobufCodec, object)
+		}
+	}
+}
+
+func roundTripOfExternalType(t *testing.T, scheme *runtime.Scheme, codecFactory runtimeserializer.CodecFactory, fuzzer *fuzz.Fuzzer, externalGVK schema.GroupVersionKind, skipProtobuf bool) {
+	object, err := scheme.New(externalGVK)
+	if err != nil {
+		t.Fatalf("Couldn't make a %v? %v", externalGVK, err)
+	}
+	typeAcc, err := apimeta.TypeAccessor(object)
+	if err != nil {
+		t.Fatalf("%q is not a TypeMeta and cannot be tested - add it to nonRoundTrippableInternalTypes: %v", externalGVK, err)
+	}
+
+	fuzzInternalObject(t, fuzzer, object)
+
+	typeAcc.SetKind(externalGVK.Kind)
+	typeAcc.SetAPIVersion(externalGVK.GroupVersion().String())
+
+	roundTrip(t, scheme, json.NewSerializer(json.DefaultMetaFactory, scheme, scheme, false), object)
+
+	// TODO remove this hack after we're past the intermediate steps
+	if !skipProtobuf {
+		roundTrip(t, scheme, protobuf.NewSerializer(scheme, scheme), object)
+	}
+}
+
+// roundTrip applies a single round-trip test to the given runtime object
+// using the given codec.  The round-trip test ensures that an object can be
+// deep-copied, converted, marshaled and back without loss of data.
+//
+// For internal types this means
+//
+//   internal -> external -> json/protobuf -> external -> internal.
+//
+// For external types this means
+//
+//   external -> json/protobuf -> external.
+func roundTrip(t *testing.T, scheme *runtime.Scheme, codec runtime.Codec, object runtime.Object) {
+	printer := spew.ConfigState{DisableMethods: true}
+	original := object
+
+	// deep copy the original object
+	object = object.DeepCopyObject()
+	name := reflect.TypeOf(object).Elem().Name()
+	if !apiequality.Semantic.DeepEqual(original, object) {
+		t.Errorf("%v: DeepCopy altered the object, diff: %v", name, diff.ObjectReflectDiff(original, object))
+		t.Errorf("%s", spew.Sdump(original))
+		t.Errorf("%s", spew.Sdump(object))
+		return
+	}
+
+	// encode (serialize) the deep copy using the provided codec
+	data, err := runtime.Encode(codec, object)
+	if err != nil {
+		if runtime.IsNotRegisteredError(err) {
+			t.Logf("%v: not registered: %v (%s)", name, err, printer.Sprintf("%#v", object))
+		} else {
+			t.Errorf("%v: %v (%s)", name, err, printer.Sprintf("%#v", object))
+		}
+		return
+	}
+
+	// ensure that the deep copy is equal to the original; neither the deep
+	// copy or conversion should alter the object
+	// TODO eliminate this global
+	if !apiequality.Semantic.DeepEqual(original, object) {
+		t.Errorf("%v: encode altered the object, diff: %v", name, diff.ObjectReflectDiff(original, object))
+		return
+	}
+
+	// encode (serialize) a second time to verify that it was not varying
+	secondData, err := runtime.Encode(codec, object)
+	if err != nil {
+		if runtime.IsNotRegisteredError(err) {
+			t.Logf("%v: not registered: %v (%s)", name, err, printer.Sprintf("%#v", object))
+		} else {
+			t.Errorf("%v: %v (%s)", name, err, printer.Sprintf("%#v", object))
+		}
+		return
+	}
+
+	// serialization to the wire must be stable to ensure that we don't write twice to the DB
+	// when the object hasn't changed.
+	if !bytes.Equal(data, secondData) {
+		t.Errorf("%v: serialization is not stable: %s", name, printer.Sprintf("%#v", object))
+	}
+
+	// decode (deserialize) the encoded data back into an object
+	obj2, err := runtime.Decode(codec, data)
+	if err != nil {
+		t.Errorf("%v: %v\nCodec: %#v\nData: %s\nSource: %#v", name, err, codec, dataAsString(data), printer.Sprintf("%#v", object))
+		panic("failed")
+	}
+
+	// ensure that the object produced from decoding the encoded data is equal
+	// to the original object
+	if !apiequality.Semantic.DeepEqual(original, obj2) {
+		t.Errorf("%v: diff: %v\nCodec: %#v\nSource:\n\n%#v\n\nEncoded:\n\n%s\n\nFinal:\n\n%#v", name, diff.ObjectReflectDiff(original, obj2), codec, printer.Sprintf("%#v", original), dataAsString(data), printer.Sprintf("%#v", obj2))
+		return
+	}
+
+	// decode the encoded data into a new object (instead of letting the codec
+	// create a new object)
+	obj3 := reflect.New(reflect.TypeOf(object).Elem()).Interface().(runtime.Object)
+	if err := runtime.DecodeInto(codec, data, obj3); err != nil {
+		t.Errorf("%v: %v", name, err)
+		return
+	}
+
+	// special case for kinds which are internal and external at the same time (many in meta.k8s.io are). For those
+	// runtime.DecodeInto above will return the external variant and set the APIVersion and kind, while the input
+	// object might be internal. Hence, we clear those values for obj3 for that case to correctly compare.
+	intAndExt, err := internalAndExternalKind(scheme, object)
+	if err != nil {
+		t.Errorf("%v: %v", name, err)
+		return
+	}
+	if intAndExt {
+		typeAcc, err := apimeta.TypeAccessor(object)
+		if err != nil {
+			t.Fatalf("%v: error accessing TypeMeta: %v", name, err)
+		}
+		if len(typeAcc.GetAPIVersion()) == 0 {
+			typeAcc, err := apimeta.TypeAccessor(obj3)
+			if err != nil {
+				t.Fatalf("%v: error accessing TypeMeta: %v", name, err)
+			}
+			typeAcc.SetAPIVersion("")
+			typeAcc.SetKind("")
+		}
+	}
+
+	// ensure that the new runtime object is equal to the original after being
+	// decoded into
+	if !apiequality.Semantic.DeepEqual(object, obj3) {
+		t.Errorf("%v: diff: %v\nCodec: %#v", name, diff.ObjectReflectDiff(object, obj3), codec)
+		return
+	}
+
+	// do structure-preserving fuzzing of the deep-copied object. If it shares anything with the original,
+	// the deep-copy was actually only a shallow copy. Then original and obj3 will be different after fuzzing.
+	// NOTE: we use the encoding+decoding here as an alternative, guaranteed deep-copy to compare against.
+	fuzzer.ValueFuzz(object)
+	if !apiequality.Semantic.DeepEqual(original, obj3) {
+		t.Errorf("%v: fuzzing a copy altered the original, diff: %v", name, diff.ObjectReflectDiff(original, obj3))
+		return
+	}
+}
+
+func internalAndExternalKind(scheme *runtime.Scheme, object runtime.Object) (bool, error) {
+	kinds, _, err := scheme.ObjectKinds(object)
+	if err != nil {
+		return false, err
+	}
+	internal, external := false, false
+	for _, k := range kinds {
+		if k.Version == runtime.APIVersionInternal {
+			internal = true
+		} else {
+			external = true
+		}
+	}
+	return internal && external, nil
+}
+
+// dataAsString returns the given byte array as a string; handles detecting
+// protocol buffers.
+func dataAsString(data []byte) string {
+	dataString := string(data)
+	if !strings.HasPrefix(dataString, "{") {
+		dataString = "\n" + hex.Dump(data)
+		proto.NewBuffer(make([]byte, 0, 1024)).DebugPrint("decoded object", data)
+	}
+	return dataString
+}
diff --git a/vendor/knative.dev/eventing/test/lib/resources/variables.go b/vendor/knative.dev/eventing/pkg/channel/metrics.go
similarity index 58%
rename from vendor/knative.dev/eventing/test/lib/resources/variables.go
rename to vendor/knative.dev/eventing/pkg/channel/metrics.go
index 27d957375..749a23c25 100644
--- a/vendor/knative.dev/eventing/test/lib/resources/variables.go
+++ b/vendor/knative.dev/eventing/pkg/channel/metrics.go
@@ -14,17 +14,19 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package resources
+package channel
 
-import "os"
+import "go.opencensus.io/tag"
 
-// SystemNamespace is the namespace where Eventing is installed, it's default to be knative-eventing.
-var SystemNamespace = getenv("TEST_EVENTING_NAMESPACE", "knative-eventing")
+const (
+	// LabelUniqueName is the label for the unique name per stats_reporter instance.
+	LabelUniqueName = "unique_name"
 
-func getenv(name, defaultValue string) string {
-	value, set := os.LookupEnv(name)
-	if !set {
-		value = defaultValue
-	}
-	return value
-}
+	// LabelContainerName is the label for the immutable name of the container.
+	LabelContainerName = "container_name"
+)
+
+var (
+	ContainerTagKey = tag.MustNewKey(LabelContainerName)
+	UniqueTagKey    = tag.MustNewKey(LabelUniqueName)
+)
diff --git a/vendor/knative.dev/eventing/pkg/reconciler/testing/containersource.go b/vendor/knative.dev/eventing/pkg/reconciler/testing/containersource.go
deleted file mode 100644
index 7690bcd60..000000000
--- a/vendor/knative.dev/eventing/pkg/reconciler/testing/containersource.go
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
-Copyright 2020 The Knative Authors
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package testing
-
-import (
-	"context"
-	"time"
-
-	sourcesv1alpha2 "knative.dev/eventing/pkg/apis/sources/v1alpha2"
-
-	sourcesv1beta1 "knative.dev/eventing/pkg/apis/sources/v1beta1"
-
-	appsv1 "k8s.io/api/apps/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/types"
-)
-
-// ContainerSourceV1Alpha2Option enables further configuration of a ContainerSource.
-type ContainerSourceV1Alpha2Option func(*sourcesv1alpha2.ContainerSource)
-
-// ContainerSourceV1Beta1Option enables further configuration of a ContainerSource.
-type ContainerSourceV1Beta1Option func(*sourcesv1beta1.ContainerSource)
-
-// NewContainerSource creates a v1alpha2 ContainerSource with ContainerSourceOptions
-func NewContainerSourceV1Alpha2(name, namespace string, o ...ContainerSourceV1Alpha2Option) *sourcesv1alpha2.ContainerSource {
-	c := &sourcesv1alpha2.ContainerSource{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      name,
-			Namespace: namespace,
-		},
-	}
-	for _, opt := range o {
-		opt(c)
-	}
-	c.SetDefaults(context.Background())
-	return c
-}
-
-// NewContainerSource creates a v1beta1 ContainerSource with ContainerSourceOptions
-func NewContainerSourceV1Beta1(name, namespace string, o ...ContainerSourceV1Beta1Option) *sourcesv1beta1.ContainerSource {
-	c := &sourcesv1beta1.ContainerSource{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      name,
-			Namespace: namespace,
-		},
-	}
-	for _, opt := range o {
-		opt(c)
-	}
-	c.SetDefaults(context.Background())
-	return c
-}
-
-func WithContainerSourceUIDV1B1(uid types.UID) ContainerSourceV1Beta1Option {
-	return func(s *sourcesv1beta1.ContainerSource) {
-		s.UID = uid
-	}
-}
-
-// WithInitContainerSourceConditions initializes the ContainerSource's conditions.
-func WithInitContainerSourceConditionsV1B1(s *sourcesv1beta1.ContainerSource) {
-	s.Status.InitializeConditions()
-}
-
-func WithContainerSourcePropagateReceiveAdapterStatusV1B1(d *appsv1.Deployment) ContainerSourceV1Beta1Option {
-	return func(s *sourcesv1beta1.ContainerSource) {
-		s.Status.PropagateReceiveAdapterStatus(d)
-	}
-}
-
-func WithContainerSourcePropagateSinkbindingStatusV1B1(status *sourcesv1beta1.SinkBindingStatus) ContainerSourceV1Beta1Option {
-	return func(s *sourcesv1beta1.ContainerSource) {
-		s.Status.PropagateSinkBindingStatus(status)
-	}
-}
-
-func WithContainerSourceDeleted(c *sourcesv1beta1.ContainerSource) {
-	t := metav1.NewTime(time.Unix(1e9, 0))
-	c.ObjectMeta.SetDeletionTimestamp(&t)
-}
-
-func WithContainerSourceSpecV1A2(spec sourcesv1alpha2.ContainerSourceSpec) ContainerSourceV1Alpha2Option {
-	return func(c *sourcesv1alpha2.ContainerSource) {
-		c.Spec = spec
-	}
-}
-
-func WithContainerSourceSpecV1B1(spec sourcesv1beta1.ContainerSourceSpec) ContainerSourceV1Beta1Option {
-	return func(c *sourcesv1beta1.ContainerSource) {
-		c.Spec = spec
-	}
-}
-
-func WithContainerSourceLabelsV1B1(labels map[string]string) ContainerSourceV1Beta1Option {
-	return func(c *sourcesv1beta1.ContainerSource) {
-		c.Labels = labels
-	}
-}
-
-func WithContainerSourceAnnotationsV1B1(annotations map[string]string) ContainerSourceV1Beta1Option {
-	return func(c *sourcesv1beta1.ContainerSource) {
-		c.Annotations = annotations
-	}
-}
-
-func WithContainerSourceStatusObservedGenerationV1B1(generation int64) ContainerSourceV1Beta1Option {
-	return func(c *sourcesv1beta1.ContainerSource) {
-		c.Status.ObservedGeneration = generation
-	}
-}
-
-func WithContainerSourceObjectMetaGenerationV1B1(generation int64) ContainerSourceV1Beta1Option {
-	return func(c *sourcesv1beta1.ContainerSource) {
-		c.ObjectMeta.Generation = generation
-	}
-}
-
-func WithContainerUnobservedGenerationV1B1() ContainerSourceV1Beta1Option {
-	return func(c *sourcesv1beta1.ContainerSource) {
-		condSet := c.GetConditionSet()
-		condSet.Manage(&c.Status).MarkUnknown(
-			condSet.GetTopLevelConditionType(), "NewObservedGenFailure", "unsuccessfully observed a new generation")
-	}
-}
diff --git a/vendor/knative.dev/eventing/pkg/reconciler/testing/listers.go b/vendor/knative.dev/eventing/pkg/reconciler/testing/listers.go
index e993e4fc2..8e2692e03 100644
--- a/vendor/knative.dev/eventing/pkg/reconciler/testing/listers.go
+++ b/vendor/knative.dev/eventing/pkg/reconciler/testing/listers.go
@@ -168,14 +168,6 @@ func (l *Listers) GetPingSourceV1beta1Lister() sourcev1beta1listers.PingSourceLi
 	return sourcev1beta1listers.NewPingSourceLister(l.indexerFor(&sourcesv1beta1.PingSource{}))
 }
 
-func (l *Listers) GetContainerSourceV1alpha2Lister() sourcev1alpha2listers.ContainerSourceLister {
-	return sourcev1alpha2listers.NewContainerSourceLister(l.indexerFor(&sourcesv1alpha2.ContainerSource{}))
-}
-
-func (l *Listers) GetContainerSourceV1beta1Lister() sourcev1beta1listers.ContainerSourceLister {
-	return sourcev1beta1listers.NewContainerSourceLister(l.indexerFor(&sourcesv1beta1.ContainerSource{}))
-}
-
 func (l *Listers) GetSinkBindingV1alpha2Lister() sourcev1alpha2listers.SinkBindingLister {
 	return sourcev1alpha2listers.NewSinkBindingLister(l.indexerFor(&sourcesv1alpha2.SinkBinding{}))
 }
diff --git a/vendor/knative.dev/eventing/pkg/reconciler/testing/v1/containersource.go b/vendor/knative.dev/eventing/pkg/reconciler/testing/v1/containersource.go
new file mode 100644
index 000000000..5eaaeec1a
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/reconciler/testing/v1/containersource.go
@@ -0,0 +1,94 @@
+/*
+Copyright 2020 The Knative Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package testing
+
+import (
+	"context"
+
+	v1 "knative.dev/eventing/pkg/apis/sources/v1"
+
+	appsv1 "k8s.io/api/apps/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/types"
+)
+
+// ContainerSourceOption enables further configuration of a ContainerSource.
+type ContainerSourceOption func(*v1.ContainerSource)
+
+// NewContainerSource creates a v1 ContainerSource with ContainerSourceOptions
+func NewContainerSource(name, namespace string, o ...ContainerSourceOption) *v1.ContainerSource {
+	c := &v1.ContainerSource{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      name,
+			Namespace: namespace,
+		},
+	}
+	for _, opt := range o {
+		opt(c)
+	}
+	c.SetDefaults(context.Background())
+	return c
+}
+
+func WithContainerSourceUID(uid types.UID) ContainerSourceOption {
+	return func(s *v1.ContainerSource) {
+		s.UID = uid
+	}
+}
+
+// WithInitContainerSourceConditions initializes the ContainerSource's conditions.
+func WithInitContainerSourceConditions(s *v1.ContainerSource) {
+	s.Status.InitializeConditions()
+}
+
+func WithContainerSourcePropagateReceiveAdapterStatus(d *appsv1.Deployment) ContainerSourceOption {
+	return func(s *v1.ContainerSource) {
+		s.Status.PropagateReceiveAdapterStatus(d)
+	}
+}
+
+func WithContainerSourcePropagateSinkbindingStatus(status *v1.SinkBindingStatus) ContainerSourceOption {
+	return func(s *v1.ContainerSource) {
+		s.Status.PropagateSinkBindingStatus(status)
+	}
+}
+
+func WithContainerSourceSpec(spec v1.ContainerSourceSpec) ContainerSourceOption {
+	return func(c *v1.ContainerSource) {
+		c.Spec = spec
+	}
+}
+
+func WithContainerSourceStatusObservedGeneration(generation int64) ContainerSourceOption {
+	return func(c *v1.ContainerSource) {
+		c.Status.ObservedGeneration = generation
+	}
+}
+
+func WithContainerSourceObjectMetaGeneration(generation int64) ContainerSourceOption {
+	return func(c *v1.ContainerSource) {
+		c.ObjectMeta.Generation = generation
+	}
+}
+
+func WithContainerUnobservedGeneration() ContainerSourceOption {
+	return func(c *v1.ContainerSource) {
+		condSet := c.GetConditionSet()
+		condSet.Manage(&c.Status).MarkUnknown(
+			condSet.GetTopLevelConditionType(), "NewObservedGenFailure", "unsuccessfully observed a new generation")
+	}
+}
diff --git a/vendor/knative.dev/eventing/pkg/reconciler/testing/v1/listers.go b/vendor/knative.dev/eventing/pkg/reconciler/testing/v1/listers.go
index 97b28dd66..973e0641a 100644
--- a/vendor/knative.dev/eventing/pkg/reconciler/testing/v1/listers.go
+++ b/vendor/knative.dev/eventing/pkg/reconciler/testing/v1/listers.go
@@ -145,6 +145,15 @@ func (l *Listers) GetParallelLister() flowslisters.ParallelLister {
 func (l *Listers) GetApiServerSourceLister() sourcelisters.ApiServerSourceLister {
 	return sourcelisters.NewApiServerSourceLister(l.indexerFor(&sourcesv1.ApiServerSource{}))
 }
+
+func (l *Listers) GetSinkBindingLister() sourcelisters.SinkBindingLister {
+	return sourcelisters.NewSinkBindingLister(l.indexerFor(&sourcesv1.SinkBinding{}))
+}
+
+func (l *Listers) GetContainerSourceLister() sourcelisters.ContainerSourceLister {
+	return sourcelisters.NewContainerSourceLister(l.indexerFor(&sourcesv1.ContainerSource{}))
+}
+
 func (l *Listers) GetDeploymentLister() appsv1listers.DeploymentLister {
 	return appsv1listers.NewDeploymentLister(l.indexerFor(&appsv1.Deployment{}))
 }
diff --git a/vendor/knative.dev/eventing/pkg/reconciler/testing/v1beta1/containersource.go b/vendor/knative.dev/eventing/pkg/reconciler/testing/v1beta1/containersource.go
new file mode 100644
index 000000000..78f4b4008
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/reconciler/testing/v1beta1/containersource.go
@@ -0,0 +1,112 @@
+/*
+Copyright 2020 The Knative Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package testing
+
+import (
+	"context"
+	"time"
+
+	"knative.dev/eventing/pkg/apis/sources/v1beta1"
+
+	appsv1 "k8s.io/api/apps/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/types"
+)
+
+// ContainerSourceOption enables further configuration of a ContainerSource.
+type ContainerSourceOption func(*v1beta1.ContainerSource)
+
+// NewContainerSource creates a v1beta1 ContainerSource with ContainerSourceOptions
+func NewContainerSource(name, namespace string, o ...ContainerSourceOption) *v1beta1.ContainerSource {
+	c := &v1beta1.ContainerSource{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      name,
+			Namespace: namespace,
+		},
+	}
+	for _, opt := range o {
+		opt(c)
+	}
+	c.SetDefaults(context.Background())
+	return c
+}
+
+func WithContainerSourceUID(uid types.UID) ContainerSourceOption {
+	return func(s *v1beta1.ContainerSource) {
+		s.UID = uid
+	}
+}
+
+// WithInitContainerSourceConditions initializes the ContainerSource's conditions.
+func WithInitContainerSourceConditions(s *v1beta1.ContainerSource) {
+	s.Status.InitializeConditions()
+}
+
+func WithContainerSourcePropagateReceiveAdapterStatus(d *appsv1.Deployment) ContainerSourceOption {
+	return func(s *v1beta1.ContainerSource) {
+		s.Status.PropagateReceiveAdapterStatus(d)
+	}
+}
+
+func WithContainerSourcePropagateSinkbindingStatus(status *v1beta1.SinkBindingStatus) ContainerSourceOption {
+	return func(s *v1beta1.ContainerSource) {
+		s.Status.PropagateSinkBindingStatus(status)
+	}
+}
+
+func WithContainerSourceDeleted(c *v1beta1.ContainerSource) {
+	t := metav1.NewTime(time.Unix(1e9, 0))
+	c.ObjectMeta.SetDeletionTimestamp(&t)
+}
+
+func WithContainerSourceSpec(spec v1beta1.ContainerSourceSpec) ContainerSourceOption {
+	return func(c *v1beta1.ContainerSource) {
+		c.Spec = spec
+	}
+}
+
+func WithContainerSourceLabels(labels map[string]string) ContainerSourceOption {
+	return func(c *v1beta1.ContainerSource) {
+		c.Labels = labels
+	}
+}
+
+func WithContainerSourceAnnotations(annotations map[string]string) ContainerSourceOption {
+	return func(c *v1beta1.ContainerSource) {
+		c.Annotations = annotations
+	}
+}
+
+func WithContainerSourceStatusObservedGeneration(generation int64) ContainerSourceOption {
+	return func(c *v1beta1.ContainerSource) {
+		c.Status.ObservedGeneration = generation
+	}
+}
+
+func WithContainerSourceObjectMetaGeneration(generation int64) ContainerSourceOption {
+	return func(c *v1beta1.ContainerSource) {
+		c.ObjectMeta.Generation = generation
+	}
+}
+
+func WithContainerUnobservedGeneration() ContainerSourceOption {
+	return func(c *v1beta1.ContainerSource) {
+		condSet := c.GetConditionSet()
+		condSet.Manage(&c.Status).MarkUnknown(
+			condSet.GetTopLevelConditionType(), "NewObservedGenFailure", "unsuccessfully observed a new generation")
+	}
+}
diff --git a/vendor/knative.dev/eventing/test/README.md b/vendor/knative.dev/eventing/test/README.md
index ea9d29acc..e8cab3cdd 100644
--- a/vendor/knative.dev/eventing/test/README.md
+++ b/vendor/knative.dev/eventing/test/README.md
@@ -92,7 +92,7 @@ go test -v -tags=e2e -count=1 ./test/e2e
 ```
 
 By default, tests run against images with the `latest` tag. To override this
-bevavior you can specify a different tag through `-tag`:
+behavior you can specify a different tag through `-tag`:
 
 ```bash
 go test -v -tags=e2e -count=1 ./test/e2e -tag e2e
diff --git a/vendor/knative.dev/eventing/test/conformance/helpers/broker_tracing_test_helper.go b/vendor/knative.dev/eventing/test/conformance/helpers/broker_tracing_test_helper.go
index 4cf68a42a..77c413bb7 100644
--- a/vendor/knative.dev/eventing/test/conformance/helpers/broker_tracing_test_helper.go
+++ b/vendor/knative.dev/eventing/test/conformance/helpers/broker_tracing_test_helper.go
@@ -21,8 +21,6 @@ import (
 	"fmt"
 	"testing"
 
-	"knative.dev/pkg/network"
-
 	cloudevents "github.com/cloudevents/sdk-go/v2"
 	cetest "github.com/cloudevents/sdk-go/v2/test"
 	"github.com/openzipkin/zipkin-go/model"
@@ -57,7 +55,7 @@ func BrokerTracingTestHelperWithChannelTestRunner(
 // 4. Sender Pod which sends a 'foo' event.
 // It returns a string that is expected to be sent by the SendEvents Pod and should be present in
 // the LogEvents Pod logs.
-func setupBrokerTracing(ctx context.Context, brokerClass string) SetupTracingTestInfrastructureFunc {
+func setupBrokerTracing(_ context.Context, brokerClass string) SetupTracingTestInfrastructureFunc {
 	const (
 		etTransformer = "transformer"
 		etLogger      = "logger"
@@ -72,6 +70,7 @@ func setupBrokerTracing(ctx context.Context, brokerClass string) SetupTracingTes
 		client *testlib.Client,
 		loggerPodName string,
 		senderPublishTrace bool,
+		clusterDomain string,
 	) (tracinghelper.TestSpanTree, cetest.EventMatcher) {
 		// Create a configmap used by the broker.
 		client.CreateBrokerConfigMapOrFail("br", channel)
@@ -133,8 +132,6 @@ func setupBrokerTracing(ctx context.Context, brokerClass string) SetupTracingTes
 			client.SendEventToAddressable(ctx, senderName, broker.Name, testlib.BrokerTypeMeta, event)
 		}
 
-		domain := network.GetClusterDomainName()
-
 		// We expect the following spans:
 		// 1. Send pod sends event to the Broker Ingress (only if the sending pod generates a span).
 		// 2. Broker Ingress receives the event from the sending pod.
@@ -144,8 +141,8 @@ func setupBrokerTracing(ctx context.Context, brokerClass string) SetupTracingTes
 		// 6. Logger pod receives the event from the Broker Filter for the "logger" trigger.
 
 		// Useful constants we will use below.
-		loggerSVCHost := k8sServiceHost(domain, client.Namespace, loggerPodName)
-		transformerSVCHost := k8sServiceHost(domain, client.Namespace, eventTransformerPod.Name)
+		loggerSVCHost := k8sServiceHost(clusterDomain, client.Namespace, loggerPodName)
+		transformerSVCHost := k8sServiceHost(clusterDomain, client.Namespace, eventTransformerPod.Name)
 
 		transformerEventSentFromTrChannelToTransformer := tracinghelper.TestSpanTree{
 			Note: "3. Broker Filter for the 'transformer' trigger sends the event to the transformer pod.",
diff --git a/vendor/knative.dev/eventing/test/conformance/helpers/channel_tracing_test_helper.go b/vendor/knative.dev/eventing/test/conformance/helpers/channel_tracing_test_helper.go
index 323ce8c67..44d0b403d 100644
--- a/vendor/knative.dev/eventing/test/conformance/helpers/channel_tracing_test_helper.go
+++ b/vendor/knative.dev/eventing/test/conformance/helpers/channel_tracing_test_helper.go
@@ -60,6 +60,7 @@ func setupChannelTracingWithReply(
 	client *testlib.Client,
 	recordEventsPodName string,
 	senderPublishTrace bool,
+	clusterDomain string,
 ) (tracinghelper.TestSpanTree, cetest.EventMatcher) {
 	eventSource := "sender"
 	// Create the Channels.
@@ -137,7 +138,7 @@ func setupChannelTracingWithReply(
 		Span: tracinghelper.MatchHTTPSpanNoReply(
 			model.Server,
 			tracinghelper.WithHTTPHostAndPath(
-				fmt.Sprintf("%s-kn-channel.%s.svc.cluster.local", channelName, client.Namespace),
+				fmt.Sprintf("%s-kn-channel.%s.svc.%s", channelName, client.Namespace, clusterDomain),
 				"/",
 			),
 		),
@@ -147,7 +148,7 @@ func setupChannelTracingWithReply(
 				Span: tracinghelper.MatchHTTPSpanWithReply(
 					model.Client,
 					tracinghelper.WithHTTPHostAndPath(
-						fmt.Sprintf("%s.%s.svc.cluster.local", transformerPod.Name, client.Namespace),
+						fmt.Sprintf("%s.%s.svc.%s", transformerPod.Name, client.Namespace, clusterDomain),
 						"/",
 					),
 				),
@@ -157,7 +158,7 @@ func setupChannelTracingWithReply(
 						Span: tracinghelper.MatchHTTPSpanWithReply(
 							model.Server,
 							tracinghelper.WithHTTPHostAndPath(
-								fmt.Sprintf("%s.%s.svc.cluster.local", transformerPod.Name, client.Namespace),
+								fmt.Sprintf("%s.%s.svc.%s", transformerPod.Name, client.Namespace, clusterDomain),
 								"/",
 							),
 							tracinghelper.WithLocalEndpointServiceName(transformerPod.Name),
@@ -170,7 +171,7 @@ func setupChannelTracingWithReply(
 				Span: tracinghelper.MatchHTTPSpanNoReply(
 					model.Client,
 					tracinghelper.WithHTTPHostAndPath(
-						fmt.Sprintf("%s-kn-channel.%s.svc.cluster.local", replyChannelName, client.Namespace),
+						fmt.Sprintf("%s-kn-channel.%s.svc.%s", replyChannelName, client.Namespace, clusterDomain),
 						"",
 					),
 				),
@@ -180,7 +181,7 @@ func setupChannelTracingWithReply(
 						Span: tracinghelper.MatchHTTPSpanNoReply(
 							model.Server,
 							tracinghelper.WithHTTPHostAndPath(
-								fmt.Sprintf("%s-kn-channel.%s.svc.cluster.local", replyChannelName, client.Namespace),
+								fmt.Sprintf("%s-kn-channel.%s.svc.%s", replyChannelName, client.Namespace, clusterDomain),
 								"/",
 							),
 						),
@@ -190,7 +191,7 @@ func setupChannelTracingWithReply(
 								Span: tracinghelper.MatchHTTPSpanNoReply(
 									model.Client,
 									tracinghelper.WithHTTPHostAndPath(
-										fmt.Sprintf("%s.%s.svc.cluster.local", recordEventsPod.Name, client.Namespace),
+										fmt.Sprintf("%s.%s.svc.%s", recordEventsPod.Name, client.Namespace, clusterDomain),
 										"/",
 									),
 								),
@@ -200,7 +201,7 @@ func setupChannelTracingWithReply(
 										Span: tracinghelper.MatchHTTPSpanNoReply(
 											model.Server,
 											tracinghelper.WithHTTPHostAndPath(
-												fmt.Sprintf("%s.%s.svc.cluster.local", recordEventsPod.Name, client.Namespace),
+												fmt.Sprintf("%s.%s.svc.%s", recordEventsPod.Name, client.Namespace, clusterDomain),
 												"/",
 											),
 											tracinghelper.WithLocalEndpointServiceName(recordEventsPod.Name),
@@ -221,7 +222,7 @@ func setupChannelTracingWithReply(
 			Span: tracinghelper.MatchHTTPSpanNoReply(
 				model.Client,
 				tracinghelper.WithHTTPHostAndPath(
-					fmt.Sprintf("%s-kn-channel.%s.svc.cluster.local", channelName, client.Namespace),
+					fmt.Sprintf("%s-kn-channel.%s.svc.%s", channelName, client.Namespace, clusterDomain),
 					"",
 				),
 				tracinghelper.WithLocalEndpointServiceName("sender"),
diff --git a/vendor/knative.dev/eventing/test/conformance/helpers/tracing/zipkin.go b/vendor/knative.dev/eventing/test/conformance/helpers/tracing/zipkin.go
index 3e12a4c4f..1631c701a 100644
--- a/vendor/knative.dev/eventing/test/conformance/helpers/tracing/zipkin.go
+++ b/vendor/knative.dev/eventing/test/conformance/helpers/tracing/zipkin.go
@@ -18,14 +18,70 @@ package tracing
 
 import (
 	"context"
+	"fmt"
+	"net/url"
+	"strings"
 	"testing"
 
+	"knative.dev/pkg/system"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/client-go/kubernetes"
+	tracingconfig "knative.dev/pkg/tracing/config"
+
 	testlib "knative.dev/eventing/test/lib"
-	"knative.dev/eventing/test/lib/resources"
 	"knative.dev/pkg/test/zipkin"
 )
 
 // Setup sets up port forwarding to Zipkin.
 func Setup(t *testing.T, client *testlib.Client) {
-	zipkin.SetupZipkinTracingFromConfigTracingOrFail(context.Background(), t, client.Kube, resources.SystemNamespace)
+	zipkin.SetupZipkinTracingFromConfigTracingOrFail(context.Background(), t, client.Kube, system.Namespace())
+}
+
+// GetClusterDomain gets the Cluster's domain, e.g. 'cluster.local'.
+func GetClusterDomain(t *testing.T, client *testlib.Client) string {
+	d, err := getClusterDomain(context.Background(), client.Kube, system.Namespace())
+	if err != nil {
+		t.Fatal("Unable to get cluster domain:", err)
+	}
+	return d
+}
+
+func getClusterDomain(ctx context.Context, kubeClientset kubernetes.Interface, configMapNamespace string) (string, error) {
+	// This a lightly altered version of knative.dev/pkg/test/zipkin/util.go's
+	// SetupZipkinTracingFromConfigTracing.
+	// TODO Move this function to knative/pkg.
+	cm, err := kubeClientset.CoreV1().ConfigMaps(configMapNamespace).Get(ctx, "config-tracing", metav1.GetOptions{})
+	if err != nil {
+		return "", fmt.Errorf("error while retrieving config-tracing config map: %w", err)
+	}
+	c, err := tracingconfig.NewTracingConfigFromConfigMap(cm)
+	if err != nil {
+		return "", fmt.Errorf("error while parsing config-tracing config map: %w", err)
+	}
+	zipkinEndpointURL, err := url.Parse(c.ZipkinEndpoint)
+	if err != nil {
+		return "", fmt.Errorf("error while parsing the zipkin endpoint in config-tracing config map: %w", err)
+	}
+	domain, err := parseClusterDomainFromHostname(zipkinEndpointURL.Host)
+	if err != nil {
+		return "", fmt.Errorf("error while parsing the Zipkin endpoint in config-tracing config map: %w", err)
+	}
+
+	return domain, nil
+}
+
+func parseClusterDomainFromHostname(hostname string) (string, error) {
+	// hostname will be something like 'name.ns.svc.clusterDomain:port' where clusterDomain is something
+	// like 'cluster.local'.
+	hostAndPort := strings.SplitN(hostname, ":", 2)
+	host := hostAndPort[0]
+	parts := strings.SplitN(host, ".", 4)
+	if len(parts) < 3 || parts[2] != "svc" {
+		return "", fmt.Errorf("could not extract namespace/name from %s", hostname)
+	}
+	if len(parts) == 3 {
+		return "", nil
+	}
+	return parts[3], nil
 }
diff --git a/vendor/knative.dev/eventing/test/conformance/helpers/tracing_test_helper.go b/vendor/knative.dev/eventing/test/conformance/helpers/tracing_test_helper.go
index f3e476f9f..1ffbb1f4b 100644
--- a/vendor/knative.dev/eventing/test/conformance/helpers/tracing_test_helper.go
+++ b/vendor/knative.dev/eventing/test/conformance/helpers/tracing_test_helper.go
@@ -42,6 +42,7 @@ type SetupTracingTestInfrastructureFunc func(
 	client *testlib.Client,
 	loggerPodName string,
 	senderPublishTrace bool,
+	clusterDomain string,
 ) (tracinghelper.TestSpanTree, cetest.EventMatcher)
 
 // tracingTest bootstraps the test and then executes the assertions on the received event and on the spans
@@ -62,9 +63,10 @@ func tracingTest(
 	// Do NOT call zipkin.CleanupZipkinTracingSetup. That will be called exactly once in
 	// TestMain.
 	tracinghelper.Setup(t, client)
+	clusterDomain := tracinghelper.GetClusterDomain(t, client)
 
 	// Setup the test infrastructure
-	expectedTestSpan, eventMatcher := setupInfrastructure(ctx, t, &channel, client, recordEventsPodName, true)
+	expectedTestSpan, eventMatcher := setupInfrastructure(ctx, t, &channel, client, recordEventsPodName, true, clusterDomain)
 
 	// Start the event info store and assert the event was received correctly
 	targetTracker, err := recordevents.NewEventInfoStore(client, recordEventsPodName, client.Namespace)
diff --git a/vendor/knative.dev/eventing/test/e2e-common.sh b/vendor/knative.dev/eventing/test/e2e-common.sh
index e1e344a80..72bd6be62 100644
--- a/vendor/knative.dev/eventing/test/e2e-common.sh
+++ b/vendor/knative.dev/eventing/test/e2e-common.sh
@@ -1,6 +1,6 @@
-#!/bin/bash
+#!/usr/bin/env bash
 
-# Copyright 2019 The Knative Authors
+# Copyright 2020 The Knative Authors
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -47,6 +47,9 @@ readonly SUGAR_CONTROLLER_CONFIG="config/sugar/500-controller.yaml"
 # Config tracing config.
 readonly CONFIG_TRACING_CONFIG="test/config/config-tracing.yaml"
 
+# Installs Zipkin for tracing tests.
+readonly KNATIVE_EVENTING_MONITORING_YAML="test/config/monitoring.yaml"
+
 # PreInstall script for v0.18
 readonly PRE_INSTALL_V018="config/pre-install/v0.18.0"
 
@@ -61,8 +64,8 @@ readonly TMP_DIR
 readonly KNATIVE_DEFAULT_NAMESPACE="knative-eventing"
 
 # This the namespace used to install and test Knative Eventing.
-export TEST_EVENTING_NAMESPACE
-TEST_EVENTING_NAMESPACE="${TEST_EVENTING_NAMESPACE:-"knative-eventing-"$(cat /dev/urandom \
+export SYSTEM_NAMESPACE
+SYSTEM_NAMESPACE="${SYSTEM_NAMESPACE:-"knative-eventing-"$(cat /dev/urandom \
   | tr -dc 'a-z0-9' | fold -w 10 | head -n 1)}"
 
 latest_version() {
@@ -93,21 +96,32 @@ function knative_setup() {
 function scale_controlplane() {
   for deployment in "$@"; do
     # Make sure all pods run in leader-elected mode.
-    kubectl -n "${TEST_EVENTING_NAMESPACE}" scale deployment "$deployment" --replicas=0 || failed=1
+    kubectl -n "${SYSTEM_NAMESPACE}" scale deployment "$deployment" --replicas=0 || failed=1
     # Give it time to kill the pods.
     sleep 5
     # Scale up components for HA tests
-    kubectl -n "${TEST_EVENTING_NAMESPACE}" scale deployment "$deployment" --replicas="${REPLICAS}" || failed=1
+    kubectl -n "${SYSTEM_NAMESPACE}" scale deployment "$deployment" --replicas="${REPLICAS}" || failed=1
   done
 }
 
+# Install Knative Monitoring in the current cluster.
+# Parameters: $1 - Knative Monitoring manifest.
+# This is a lightly modified verion of start_knative_monitoring() from test-infra's library.sh.
+function start_knative_eventing_monitoring() {
+  header "Starting Knative Eventing Monitoring"
+  subheader "Installing Knative Eventing Monitoring"
+  echo "Installing Monitoring from $1"
+  kubectl apply -f "$1" || return 1
+  wait_until_pods_running knative-eventing || return 1
+}
+
 # This installs everything from the config dir but then removes the Channel Based Broker.
 # TODO: This should only install the core.
 # Args:
 #  - $1 - if passed, it will be used as eventing config directory
 function install_knative_eventing() {
-  echo ">> Creating ${TEST_EVENTING_NAMESPACE} namespace if it does not exist"
-  kubectl get ns ${TEST_EVENTING_NAMESPACE} || kubectl create namespace ${TEST_EVENTING_NAMESPACE}
+  echo ">> Creating ${SYSTEM_NAMESPACE} namespace if it does not exist"
+  kubectl get ns ${SYSTEM_NAMESPACE} || kubectl create namespace ${SYSTEM_NAMESPACE}
   local kne_config
   kne_config="${1:-${EVENTING_CONFIG}}"
   # Install Knative Eventing in the current cluster.
@@ -116,7 +130,7 @@ function install_knative_eventing() {
     local TMP_CONFIG_DIR=${TMP_DIR}/config
     mkdir -p ${TMP_CONFIG_DIR}
     cp -r ${kne_config}/* ${TMP_CONFIG_DIR}
-    find ${TMP_CONFIG_DIR} -type f -name "*.yaml" -exec sed -i "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${TEST_EVENTING_NAMESPACE}/g" {} +
+    find ${TMP_CONFIG_DIR} -type f -name "*.yaml" -exec sed -i "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${SYSTEM_NAMESPACE}/g" {} +
     ko apply --strict -f "${TMP_CONFIG_DIR}" || return $?
   else
     local EVENTING_RELEASE_YAML=${TMP_DIR}/"eventing-${LATEST_RELEASE_VERSION}.yaml"
@@ -125,7 +139,7 @@ function install_knative_eventing() {
       || fail_test "Unable to download latest knative/eventing file."
 
     # Replace the default system namespace with the test's system namespace.
-    sed -i "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${TEST_EVENTING_NAMESPACE}/g" ${EVENTING_RELEASE_YAML}
+    sed -i "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${SYSTEM_NAMESPACE}/g" ${EVENTING_RELEASE_YAML}
 
     echo "Knative EVENTING YAML: ${EVENTING_RELEASE_YAML}"
 
@@ -135,15 +149,15 @@ function install_knative_eventing() {
 
   # Setup config tracing for tracing tests
   local TMP_CONFIG_TRACING_CONFIG=${TMP_DIR}/${CONFIG_TRACING_CONFIG##*/}
-  sed "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${TEST_EVENTING_NAMESPACE}/g" ${CONFIG_TRACING_CONFIG} > ${TMP_CONFIG_TRACING_CONFIG}
+  sed "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${SYSTEM_NAMESPACE}/g" ${CONFIG_TRACING_CONFIG} > ${TMP_CONFIG_TRACING_CONFIG}
   kubectl replace -f ${TMP_CONFIG_TRACING_CONFIG}
 
   scale_controlplane eventing-webhook eventing-controller
 
-  wait_until_pods_running ${TEST_EVENTING_NAMESPACE} || fail_test "Knative Eventing did not come up"
+  wait_until_pods_running ${SYSTEM_NAMESPACE} || fail_test "Knative Eventing did not come up"
 
   echo "check the config map"
-  kubectl get configmaps -n ${TEST_EVENTING_NAMESPACE}
+  kubectl get configmaps -n ${SYSTEM_NAMESPACE}
   if ! (( DEPLOY_KNATIVE_MONITORING )); then return 0; fi
 
   # Ensure knative monitoring is installed only once
@@ -152,8 +166,8 @@ function install_knative_eventing() {
     --field-selector status.phase=Running 2> /dev/null | tail -n +2 | wc -l)
   if ! [[ ${knative_monitoring_pods} -gt 0 ]]; then
     echo ">> Installing Knative Monitoring"
-    start_knative_monitoring "${KNATIVE_MONITORING_RELEASE}" || fail_test "Knative Monitoring did not come up"
-    UNINSTALL_LIST+=( "${KNATIVE_MONITORING_RELEASE}" )
+    start_knative_eventing_monitoring "${KNATIVE_EVENTING_MONITORING_YAML}" || fail_test "Knative Monitoring did not come up"
+    UNINSTALL_LIST+=( "${KNATIVE_EVENTING_MONITORING_YAML}" )
   else
     echo ">> Knative Monitoring seems to be running, pods running: ${knative_monitoring_pods}."
   fi
@@ -180,49 +194,49 @@ function run_preinstall_V018() {
   local TMP_PRE_INSTALL_V018=${TMP_DIR}/pre_install
   mkdir -p ${TMP_PRE_INSTALL_V018}
   cp -r ${PRE_INSTALL_V018}/* ${TMP_PRE_INSTALL_V018}
-  find ${TMP_PRE_INSTALL_V018} -type f -name "*.yaml" -exec sed -i "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${TEST_EVENTING_NAMESPACE}/g" {} +
+  find ${TMP_PRE_INSTALL_V018} -type f -name "*.yaml" -exec sed -i "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${SYSTEM_NAMESPACE}/g" {} +
   ko apply --strict -f "${TMP_PRE_INSTALL_V018}" || return 1
-  wait_until_batch_job_complete ${TEST_EVENTING_NAMESPACE} || return 1
+  wait_until_batch_job_complete ${SYSTEM_NAMESPACE} || return 1
 }
 
 function install_mt_broker() {
   local TMP_MT_CHANNEL_BASED_BROKER_DEFAULT_CONFIG=${TMP_DIR}/${MT_CHANNEL_BASED_BROKER_DEFAULT_CONFIG##*/}
-  sed "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${TEST_EVENTING_NAMESPACE}/g" ${MT_CHANNEL_BASED_BROKER_DEFAULT_CONFIG} > ${TMP_MT_CHANNEL_BASED_BROKER_DEFAULT_CONFIG}
+  sed "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${SYSTEM_NAMESPACE}/g" ${MT_CHANNEL_BASED_BROKER_DEFAULT_CONFIG} > ${TMP_MT_CHANNEL_BASED_BROKER_DEFAULT_CONFIG}
   ko apply --strict -f ${TMP_MT_CHANNEL_BASED_BROKER_DEFAULT_CONFIG} || return 1
 
   local TMP_MT_CHANNEL_BASED_BROKER_CONFIG_DIR=${TMP_DIR}/channel_based_config
   mkdir -p ${TMP_MT_CHANNEL_BASED_BROKER_CONFIG_DIR}
   cp -r ${MT_CHANNEL_BASED_BROKER_CONFIG_DIR}/* ${TMP_MT_CHANNEL_BASED_BROKER_CONFIG_DIR}
-  find ${TMP_MT_CHANNEL_BASED_BROKER_CONFIG_DIR} -type f -name "*.yaml" -exec sed -i "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${TEST_EVENTING_NAMESPACE}/g" {} +
+  find ${TMP_MT_CHANNEL_BASED_BROKER_CONFIG_DIR} -type f -name "*.yaml" -exec sed -i "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${SYSTEM_NAMESPACE}/g" {} +
   ko apply --strict -f ${TMP_MT_CHANNEL_BASED_BROKER_CONFIG_DIR} || return 1
 
   scale_controlplane mt-broker-controller
 
-  wait_until_pods_running ${TEST_EVENTING_NAMESPACE} || fail_test "Knative Eventing with MT Broker did not come up"
+  wait_until_pods_running ${SYSTEM_NAMESPACE} || fail_test "Knative Eventing with MT Broker did not come up"
 }
 
 function install_sugar() {
   local TMP_SUGAR_CONTROLLER_CONFIG_DIR=${TMP_DIR}/${SUGAR_CONTROLLER_CONFIG_DIR}
   mkdir -p ${TMP_SUGAR_CONTROLLER_CONFIG_DIR}
   cp -r ${SUGAR_CONTROLLER_CONFIG_DIR}/* ${TMP_SUGAR_CONTROLLER_CONFIG_DIR}
-  find ${TMP_SUGAR_CONTROLLER_CONFIG_DIR} -type f -name "*.yaml" -exec sed -i "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${TEST_EVENTING_NAMESPACE}/g" {} +
+  find ${TMP_SUGAR_CONTROLLER_CONFIG_DIR} -type f -name "*.yaml" -exec sed -i "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${SYSTEM_NAMESPACE}/g" {} +
   ko apply --strict -f ${TMP_SUGAR_CONTROLLER_CONFIG_DIR} || return 1
-  kubectl -n ${TEST_EVENTING_NAMESPACE} set env deployment/sugar-controller BROKER_INJECTION_DEFAULT=true || return 1
+  kubectl -n ${SYSTEM_NAMESPACE} set env deployment/sugar-controller BROKER_INJECTION_DEFAULT=true || return 1
 
   scale_controlplane sugar-controller
 
-  wait_until_pods_running ${TEST_EVENTING_NAMESPACE} || fail_test "Knative Eventing Sugar Controller did not come up"
+  wait_until_pods_running ${SYSTEM_NAMESPACE} || fail_test "Knative Eventing Sugar Controller did not come up"
 }
 
 function unleash_duck() {
   echo "enable debug logging"
   cat test/config/config-logging.yaml | \
-    sed "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${TEST_EVENTING_NAMESPACE}/g" | \
+    sed "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${SYSTEM_NAMESPACE}/g" | \
     ko apply --strict -f - || return $?
 
   echo "unleash the duck"
   cat test/config/chaosduck.yaml | \
-    sed "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${TEST_EVENTING_NAMESPACE}/g" | \
+    sed "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${SYSTEM_NAMESPACE}/g" | \
     ko apply --strict -f - || return $?
 }
 
@@ -231,7 +245,7 @@ function knative_teardown() {
   echo ">> Stopping Knative Eventing"
   echo "Uninstalling Knative Eventing"
   ko delete --ignore-not-found=true --now --timeout 60s -f ${EVENTING_CONFIG}
-  wait_until_object_does_not_exist namespaces ${TEST_EVENTING_NAMESPACE}
+  wait_until_object_does_not_exist namespaces ${SYSTEM_NAMESPACE}
 
   echo ">> Uninstalling dependencies"
   for i in ${!UNINSTALL_LIST[@]}; do
@@ -295,13 +309,13 @@ function install_channel_crds() {
   local TMP_IN_MEMORY_CHANNEL_CONFIG_DIR=${TMP_DIR}/in_memory_channel_config
   mkdir -p ${TMP_IN_MEMORY_CHANNEL_CONFIG_DIR}
   cp -r ${IN_MEMORY_CHANNEL_CRD_CONFIG_DIR}/* ${TMP_IN_MEMORY_CHANNEL_CONFIG_DIR}
-  find ${TMP_IN_MEMORY_CHANNEL_CONFIG_DIR} -type f -name "*.yaml" -exec sed -i "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${TEST_EVENTING_NAMESPACE}/g" {} +
+  find ${TMP_IN_MEMORY_CHANNEL_CONFIG_DIR} -type f -name "*.yaml" -exec sed -i "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${SYSTEM_NAMESPACE}/g" {} +
   ko apply --strict -f ${TMP_IN_MEMORY_CHANNEL_CONFIG_DIR} || return 1
 
   # TODO(https://github.com/knative/eventing/issues/3590): Enable once IMC chaos issues are fixed.
   # scale_controlplane imc-controller imc-dispatcher
 
-  wait_until_pods_running ${TEST_EVENTING_NAMESPACE} || fail_test "Failed to install the In-Memory Channel CRD"
+  wait_until_pods_running ${SYSTEM_NAMESPACE} || fail_test "Failed to install the In-Memory Channel CRD"
 }
 
 function uninstall_channel_crds() {
@@ -313,7 +327,7 @@ function uninstall_channel_crds() {
 function dump_extra_cluster_state() {
   # Collecting logs from all knative's eventing pods.
   echo "============================================================"
-  local namespace=${TEST_EVENTING_NAMESPACE}
+  local namespace=${SYSTEM_NAMESPACE}
   for pod in $(kubectl get pod -n $namespace | grep Running | awk '{print $1}'); do
     for container in $(kubectl get pod "${pod}" -n $namespace -ojsonpath='{.spec.containers[*].name}'); do
       echo "Namespace, Pod, Container: ${namespace}, ${pod}, ${container}"
diff --git a/vendor/knative.dev/eventing/test/e2e/helpers/broker_channel_flow_helper.go b/vendor/knative.dev/eventing/test/e2e/helpers/broker_channel_flow_helper.go
index de0d4648e..35e053110 100644
--- a/vendor/knative.dev/eventing/test/e2e/helpers/broker_channel_flow_helper.go
+++ b/vendor/knative.dev/eventing/test/e2e/helpers/broker_channel_flow_helper.go
@@ -45,7 +45,7 @@ EventSource ---> Broker ---> Trigger1 -------> Service(Transformation)
                    |-------> Trigger3 -------> Channel --------> Subscription --------> Service(Logger2)
 
 Explanation:
-Trigger1 filters the orignal event and tranforms it to a new event,
+Trigger1 filters the orignal event and transforms it to a new event,
 Trigger2 logs all events,
 Trigger3 filters the transformed event and sends it to Channel.
 
diff --git a/vendor/knative.dev/eventing/test/e2e/helpers/channel_defaulter_test_helper.go b/vendor/knative.dev/eventing/test/e2e/helpers/channel_defaulter_test_helper.go
index 630091294..97b3f48ae 100644
--- a/vendor/knative.dev/eventing/test/e2e/helpers/channel_defaulter_test_helper.go
+++ b/vendor/knative.dev/eventing/test/e2e/helpers/channel_defaulter_test_helper.go
@@ -22,6 +22,8 @@ import (
 	"testing"
 	"time"
 
+	"knative.dev/pkg/system"
+
 	cloudevents "github.com/cloudevents/sdk-go/v2"
 	. "github.com/cloudevents/sdk-go/v2/test"
 	"github.com/ghodss/yaml"
@@ -162,7 +164,7 @@ func defaultChannelTestHelper(ctx context.Context, t *testing.T, client *testlib
 
 // updateDefaultChannelCM will update the default channel configmap
 func updateDefaultChannelCM(client *testlib.Client, updateConfig func(config *config.ChannelDefaults)) error {
-	cmInterface := client.Kube.CoreV1().ConfigMaps(resources.SystemNamespace)
+	cmInterface := client.Kube.CoreV1().ConfigMaps(system.Namespace())
 
 	err := reconciler.RetryUpdateConflicts(func(attempts int) (err error) {
 		// get the defaultchannel configmap
diff --git a/vendor/knative.dev/eventing/test/e2e/helpers/channel_event_tranformation_test_helper.go b/vendor/knative.dev/eventing/test/e2e/helpers/channel_event_tranformation_test_helper.go
index b32d076d9..0e857bf7f 100644
--- a/vendor/knative.dev/eventing/test/e2e/helpers/channel_event_tranformation_test_helper.go
+++ b/vendor/knative.dev/eventing/test/e2e/helpers/channel_event_tranformation_test_helper.go
@@ -31,7 +31,7 @@ import (
 	"knative.dev/eventing/test/lib/resources"
 )
 
-// EventTransformationForSubscriptionTestHelper is the helper function for channel_event_tranformation_test
+// EventTransformationForSubscriptionTestHelper is the helper function for channel_event_transformation_test
 func EventTransformationForSubscriptionTestHelper(
 	ctx context.Context,
 	t *testing.T,
diff --git a/vendor/knative.dev/eventing/test/e2e/helpers/parallel_test_helper.go b/vendor/knative.dev/eventing/test/e2e/helpers/parallel_test_helper.go
index 4c4c4416c..2ccd4d576 100644
--- a/vendor/knative.dev/eventing/test/e2e/helpers/parallel_test_helper.go
+++ b/vendor/knative.dev/eventing/test/e2e/helpers/parallel_test_helper.go
@@ -74,13 +74,20 @@ func ParallelTestHelper(
 			for branchNumber, cse := range tc.branchesConfig {
 				// construct filter services
 				filterPodName := fmt.Sprintf("parallel-%s-branch-%d-filter", tc.name, branchNumber)
-				filterPod := resources.EventFilteringPod(filterPodName, cse.filter)
-				client.CreatePodOrFail(filterPod, testlib.WithService(filterPodName))
+				if cse.filter {
+					recordevents.DeployEventRecordOrFail(ctx, client, filterPodName)
+				} else {
+					recordevents.DeployEventRecordOrFail(ctx, client, filterPodName, recordevents.EchoEvent)
+				}
 
 				// construct branch subscriber
 				subPodName := fmt.Sprintf("parallel-%s-branch-%d-sub", tc.name, branchNumber)
-				subPod := resources.SequenceStepperPod(subPodName, subPodName)
-				client.CreatePodOrFail(subPod, testlib.WithService(subPodName))
+				recordevents.DeployEventRecordOrFail(
+					ctx,
+					client,
+					subPodName,
+					recordevents.ReplyWithAppendedData(subPodName),
+				)
 
 				parallelBranches[branchNumber] = v1beta1.ParallelBranch{
 					Filter: &duckv1.Destination{
@@ -183,13 +190,20 @@ func ParallelV1TestHelper(
 			for branchNumber, cse := range tc.branchesConfig {
 				// construct filter services
 				filterPodName := fmt.Sprintf("parallel-%s-branch-%d-filter", tc.name, branchNumber)
-				filterPod := resources.EventFilteringPod(filterPodName, cse.filter)
-				client.CreatePodOrFail(filterPod, testlib.WithService(filterPodName))
+				if cse.filter {
+					recordevents.DeployEventRecordOrFail(ctx, client, filterPodName)
+				} else {
+					recordevents.DeployEventRecordOrFail(ctx, client, filterPodName, recordevents.EchoEvent)
+				}
 
 				// construct branch subscriber
 				subPodName := fmt.Sprintf("parallel-%s-branch-%d-sub", tc.name, branchNumber)
-				subPod := resources.SequenceStepperPod(subPodName, subPodName)
-				client.CreatePodOrFail(subPod, testlib.WithService(subPodName))
+				recordevents.DeployEventRecordOrFail(
+					ctx,
+					client,
+					subPodName,
+					recordevents.ReplyWithAppendedData(subPodName),
+				)
 
 				parallelBranches[branchNumber] = flowsv1.ParallelBranch{
 					Filter: &duckv1.Destination{
diff --git a/vendor/knative.dev/eventing/test/e2e_flags.go b/vendor/knative.dev/eventing/test/e2e_flags.go
index e53f9caca..5074120b1 100644
--- a/vendor/knative.dev/eventing/test/e2e_flags.go
+++ b/vendor/knative.dev/eventing/test/e2e_flags.go
@@ -30,16 +30,16 @@ import (
 
 const (
 	ChannelUsage = "The names of the channel type metas, separated by comma. " +
-		"Example: \"messaging.knative.dev/v1alpha1:InMemoryChannel," +
-		"messaging.cloud.google.com/v1alpha1:Channel,messaging.knative.dev/v1alpha1:KafkaChannel\"."
+		`Example: "messaging.knative.dev/v1alpha1:InMemoryChannel,` +
+		`messaging.cloud.google.com/v1alpha1:Channel,messaging.knative.dev/v1alpha1:KafkaChannel".`
 	BrokerClassUsage = "Which brokerclass to test, requires the proper Broker " +
 		"implementation to have been installed, and only one value. brokerclass " +
 		"must be (for now) 'MTChannelBasedBroker'."
 	SourceUsage = "The names of the source type metas, separated by comma. " +
-		"Example: \"sources.knative.dev/v1alpha1:ApiServerSource," +
-		"sources.knative.dev/v1alpha1:PingSource\"."
+		`Example: "sources.knative.dev/v1alpha1:ApiServerSource,` +
+		`sources.knative.dev/v1alpha1:PingSource".`
 	BrokerUsage = "The name of the broker type metas, separated by comma. " +
-		"Example: \"eventing.knative.dev/v1beta1:MTChannelBasedBroker"
+		`Example: "eventing.knative.dev/v1beta1:MTChannelBasedBroker`
 	BrokerNameUsage = "When testing a pre-existing broker, specify the Broker name so the conformance tests " +
 		"won't create their own."
 	BrokerNamespaceUsage = "When testing a pre-existing broker, this variable specifies the namespace the broker can be found in."
diff --git a/vendor/knative.dev/eventing/test/flags/parsing.go b/vendor/knative.dev/eventing/test/flags/parsing.go
index 6fba01876..4c3567000 100644
--- a/vendor/knative.dev/eventing/test/flags/parsing.go
+++ b/vendor/knative.dev/eventing/test/flags/parsing.go
@@ -31,7 +31,7 @@ func csvToObjects(csvObjects string, validator Validator) []metav1.TypeMeta {
 		object := strings.TrimSpace(object)
 		split := strings.Split(object, ":")
 		if len(split) != 2 {
-			log.Fatalf("The given object name %q is invalid, it needs to be in the form \"apiVersion:Kind\".", object)
+			log.Fatalf(`The given object name %q is invalid, it needs to be in the form "apiVersion:Kind".`, object)
 		}
 		tm := metav1.TypeMeta{
 			APIVersion: split[0],
diff --git a/vendor/knative.dev/eventing/test/lib/client.go b/vendor/knative.dev/eventing/test/lib/client.go
index 1d342c714..29ee18179 100644
--- a/vendor/knative.dev/eventing/test/lib/client.go
+++ b/vendor/knative.dev/eventing/test/lib/client.go
@@ -24,7 +24,7 @@ import (
 	"fmt"
 	"testing"
 
-	"knative.dev/eventing/test/lib/resources"
+	"knative.dev/pkg/system"
 
 	"github.com/pkg/errors"
 	corev1 "k8s.io/api/core/v1"
@@ -133,7 +133,7 @@ func (c *Client) runCleanup() (err error) {
 }
 
 func getTracingConfig(c kubernetes.Interface) (corev1.EnvVar, error) {
-	cm, err := c.CoreV1().ConfigMaps(resources.SystemNamespace).Get(context.Background(), configtracing.ConfigName, metav1.GetOptions{})
+	cm, err := c.CoreV1().ConfigMaps(system.Namespace()).Get(context.Background(), configtracing.ConfigName, metav1.GetOptions{})
 	if err != nil {
 		return corev1.EnvVar{}, fmt.Errorf("error while retrieving the %s config map: %+v", configtracing.ConfigName, errors.WithStack(err))
 	}
diff --git a/vendor/knative.dev/eventing/test/lib/creation.go b/vendor/knative.dev/eventing/test/lib/creation.go
index adb817616..69cc26290 100644
--- a/vendor/knative.dev/eventing/test/lib/creation.go
+++ b/vendor/knative.dev/eventing/test/lib/creation.go
@@ -661,6 +661,23 @@ func (c *Client) CreateContainerSourceV1Beta1OrFail(containerSource *sourcesv1be
 	c.Tracker.AddObj(containerSource)
 }
 
+// CreateContainerSourceV1OrFail will create a v1 ContainerSource.
+func (c *Client) CreateContainerSourceV1OrFail(containerSource *sourcesv1.ContainerSource) {
+	c.T.Logf("Creating containersource %+v", containerSource)
+	containerInterface := c.Eventing.SourcesV1().ContainerSources(c.Namespace)
+	err := c.RetryWebhookErrors(func(attempts int) (err error) {
+		_, e := containerInterface.Create(context.Background(), containerSource, metav1.CreateOptions{})
+		if e != nil {
+			c.T.Logf("Failed to create containersource %q: %v", containerSource.Name, e)
+		}
+		return e
+	})
+	if err != nil && !errors.IsAlreadyExists(err) {
+		c.T.Fatalf("Failed to create containersource %q: %v", containerSource.Name, err)
+	}
+	c.Tracker.AddObj(containerSource)
+}
+
 // CreatePingSourceV1Alpha2OrFail will create an PingSource
 func (c *Client) CreatePingSourceV1Alpha2OrFail(pingSource *sourcesv1alpha2.PingSource) {
 	c.T.Logf("Creating pingsource %+v", pingSource)
diff --git a/vendor/knative.dev/eventing/test/lib/duck/resource_checks.go b/vendor/knative.dev/eventing/test/lib/duck/resource_checks.go
index 43a8755b5..d33259d16 100644
--- a/vendor/knative.dev/eventing/test/lib/duck/resource_checks.go
+++ b/vendor/knative.dev/eventing/test/lib/duck/resource_checks.go
@@ -24,13 +24,13 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/util/wait"
 	"k8s.io/client-go/dynamic"
+	"knative.dev/eventing/test/lib/resources"
 	"knative.dev/pkg/apis"
 	duckv1beta1 "knative.dev/pkg/apis/duck/v1beta1"
-
-	"knative.dev/eventing/test/lib/resources"
 )
 
 const (
@@ -43,24 +43,42 @@ const (
 // it is done, returns an error or timeout.
 func WaitForResourceReady(dynamicClient dynamic.Interface, obj *resources.MetaResource) error {
 	return wait.PollImmediate(interval, timeout, func() (bool, error) {
-		untyped, err := GetGenericObject(dynamicClient, obj, &duckv1beta1.KResource{})
-		return isResourceReady(untyped, err)
+		return checkResourceReady(dynamicClient, obj)
 	})
 }
 
 // WaitForResourcesReady waits until all the specified resources in the given namespace are ready.
 func WaitForResourcesReady(dynamicClient dynamic.Interface, objList *resources.MetaResourceList) error {
 	return wait.PollImmediate(interval, timeout, func() (bool, error) {
-		untypeds, err := GetGenericObjectList(dynamicClient, objList, &duckv1beta1.KResource{})
-		for _, untyped := range untypeds {
-			if isReady, err := isResourceReady(untyped, err); !isReady {
-				return isReady, err
-			}
-		}
-		return true, nil
+		return checkResourcesReady(dynamicClient, objList)
+
 	})
 }
 
+func getGenericResource(tm metav1.TypeMeta) runtime.Object {
+	if tm.APIVersion == "v1" && tm.Kind == "Pod" {
+		return &corev1.Pod{}
+	}
+	return &duckv1beta1.KResource{}
+}
+
+func checkResourceReady(dynamicClient dynamic.Interface, obj *resources.MetaResource) (bool, error) {
+	gr := getGenericResource(obj.TypeMeta)
+	untyped, err := GetGenericObject(dynamicClient, obj, gr)
+	return isResourceReady(untyped, err)
+}
+
+func checkResourcesReady(dynamicClient dynamic.Interface, objList *resources.MetaResourceList) (bool, error) {
+	gr := getGenericResource(objList.TypeMeta)
+	untypeds, err := GetGenericObjectList(dynamicClient, objList, gr)
+	for _, untyped := range untypeds {
+		if isReady, err := isResourceReady(untyped, err); !isReady || err != nil {
+			return isReady, err
+		}
+	}
+	return true, nil
+}
+
 // isResourceReady leverage duck-type to check if the given obj is in ready state
 func isResourceReady(obj runtime.Object, err error) (bool, error) {
 	if k8serrors.IsNotFound(err) {
diff --git a/vendor/knative.dev/eventing/test/lib/duck/resource_getters.go b/vendor/knative.dev/eventing/test/lib/duck/resource_getters.go
index 35812337d..4dbde6285 100644
--- a/vendor/knative.dev/eventing/test/lib/duck/resource_getters.go
+++ b/vendor/knative.dev/eventing/test/lib/duck/resource_getters.go
@@ -29,7 +29,6 @@ import (
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/client-go/dynamic"
 	"k8s.io/client-go/util/retry"
-	"knative.dev/pkg/apis"
 	"knative.dev/pkg/apis/duck"
 
 	"knative.dev/eventing/test/lib/resources"
@@ -59,7 +58,7 @@ func RetryWebhookErrors(updater func(int) error) error {
 func GetGenericObject(
 	dynamicClient dynamic.Interface,
 	obj *resources.MetaResource,
-	rtype apis.Listable,
+	rtype runtime.Object,
 ) (runtime.Object, error) {
 	// get the resource's namespace and gvr
 	gvr, _ := meta.UnsafeGuessKindToResource(obj.GroupVersionKind())
@@ -90,7 +89,7 @@ func GetGenericObject(
 func GetGenericObjectList(
 	dynamicClient dynamic.Interface,
 	objList *resources.MetaResourceList,
-	rtype apis.Listable,
+	rtype runtime.Object,
 ) ([]runtime.Object, error) {
 	// get the resource's namespace and gvr
 	gvr, _ := meta.UnsafeGuessKindToResource(objList.GroupVersionKind())
diff --git a/vendor/knative.dev/eventing/test/lib/recordevents/event_info.go b/vendor/knative.dev/eventing/test/lib/recordevents/event_info.go
index d9dbbdae8..cd1735b1a 100644
--- a/vendor/knative.dev/eventing/test/lib/recordevents/event_info.go
+++ b/vendor/knative.dev/eventing/test/lib/recordevents/event_info.go
@@ -50,7 +50,7 @@ func (ei *EventInfo) String() string {
 	if ei.Event != nil {
 		return ei.Event.String()
 	} else {
-		return fmt.Sprintf("invalid event \"%s\"", ei.Error)
+		return fmt.Sprintf("invalid event %q", ei.Error)
 	}
 }
 
diff --git a/vendor/knative.dev/eventing/test/lib/recordevents/event_info_store.go b/vendor/knative.dev/eventing/test/lib/recordevents/event_info_store.go
index 2a3d5fda9..491d0a7ec 100644
--- a/vendor/knative.dev/eventing/test/lib/recordevents/event_info_store.go
+++ b/vendor/knative.dev/eventing/test/lib/recordevents/event_info_store.go
@@ -52,7 +52,7 @@ func StartEventRecordOrFail(ctx context.Context, client *testlib.Client, podName
 
 // Stateful store of events received by the recordevents pod it is pointed at.
 // This pulls events from the pod during any Find or Wait call, storing them
-// locally and triming them from the remote pod store.
+// locally and trimming them from the remote pod store.
 type EventInfoStore struct {
 	tb testing.TB
 
diff --git a/vendor/knative.dev/eventing/test/lib/resources/kube.go b/vendor/knative.dev/eventing/test/lib/resources/kube.go
index d8f065821..a0f68094d 100644
--- a/vendor/knative.dev/eventing/test/lib/resources/kube.go
+++ b/vendor/knative.dev/eventing/test/lib/resources/kube.go
@@ -27,7 +27,6 @@ import (
 	rbacv1 "k8s.io/api/rbac/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/intstr"
-	"k8s.io/apimachinery/pkg/util/uuid"
 	pkgTest "knative.dev/pkg/test"
 )
 
@@ -66,54 +65,6 @@ func WithLabelsForPod(labels map[string]string) PodOption {
 	}
 }
 
-// SequenceStepperPod creates a Pod that can be used as a step in testing Sequence.
-// Note event data used in the test must be BaseData, and this Pod as a Subscriber will receive the event,
-// and return a new event with eventMsgAppender added to data.Message.
-func SequenceStepperPod(name, eventMsgAppender string) *corev1.Pod {
-	const imageName = "sequencestepper"
-	return &corev1.Pod{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:   name,
-			Labels: map[string]string{"e2etest": string(uuid.NewUUID())},
-		},
-		Spec: corev1.PodSpec{
-			Containers: []corev1.Container{{
-				Name:            imageName,
-				Image:           pkgTest.ImagePath(imageName),
-				ImagePullPolicy: corev1.PullIfNotPresent,
-				Args: []string{
-					"-msg-appender",
-					eventMsgAppender,
-				},
-			}},
-			RestartPolicy: corev1.RestartPolicyAlways,
-		},
-	}
-}
-
-// EventFilteringPod creates a Pod that either filter or send the received CloudEvent
-func EventFilteringPod(name string, filter bool) *corev1.Pod {
-	const imageName = "filterevents"
-	pod := &corev1.Pod{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:   name,
-			Labels: map[string]string{"e2etest": string(uuid.NewUUID())},
-		},
-		Spec: corev1.PodSpec{
-			Containers: []corev1.Container{{
-				Name:            imageName,
-				Image:           pkgTest.ImagePath(imageName),
-				ImagePullPolicy: corev1.PullIfNotPresent,
-			}},
-			RestartPolicy: corev1.RestartPolicyAlways,
-		},
-	}
-	if filter {
-		pod.Spec.Containers[0].Args = []string{"-filter"}
-	}
-	return pod
-}
-
 const (
 	PerfConsumerService   = "perf-consumer"
 	PerfAggregatorService = "perf-aggregator"
diff --git a/vendor/knative.dev/eventing/test/lib/test_runner.go b/vendor/knative.dev/eventing/test/lib/test_runner.go
index 1f0ae67f0..402067fee 100644
--- a/vendor/knative.dev/eventing/test/lib/test_runner.go
+++ b/vendor/knative.dev/eventing/test/lib/test_runner.go
@@ -20,6 +20,7 @@ import (
 	"context"
 	"fmt"
 	"path/filepath"
+	"strings"
 	"testing"
 	"time"
 
@@ -193,7 +194,7 @@ func TearDown(client *Client) {
 		client.T.Logf("Could not list events in the namespace %q: %v", client.Namespace, err)
 	} else {
 		for _, e := range el.Items {
-			client.T.Logf("EVENT: %v", e)
+			client.T.Log(formatEvent(&e))
 		}
 	}
 
@@ -213,6 +214,27 @@ func TearDown(client *Client) {
 	}
 }
 
+func formatEvent(e *corev1.Event) string {
+	return strings.Join([]string{`Event{`,
+		`ObjectMeta:` + strings.Replace(strings.Replace(e.ObjectMeta.String(), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1),
+		`InvolvedObject:` + strings.Replace(strings.Replace(e.InvolvedObject.String(), "ObjectReference", "ObjectReference", 1), `&`, ``, 1),
+		`Reason:` + e.Reason,
+		`Message:` + e.Message,
+		`Source:` + strings.Replace(strings.Replace(e.Source.String(), "EventSource", "EventSource", 1), `&`, ``, 1),
+		`FirstTimestamp:` + e.FirstTimestamp.String(),
+		`LastTimestamp:` + e.LastTimestamp.String(),
+		`Count:` + fmt.Sprintf("%d", e.Count),
+		`Type:` + e.Type,
+		`EventTime:` + e.EventTime.String(),
+		`Series:` + strings.Replace(e.Series.String(), "EventSeries", "EventSeries", 1),
+		`Action:` + e.Action,
+		`Related:` + strings.Replace(e.Related.String(), "ObjectReference", "ObjectReference", 1),
+		`ReportingController:` + e.ReportingController,
+		`ReportingInstance:` + e.ReportingInstance,
+		`}`,
+	}, "\n")
+}
+
 // CreateNamespaceIfNeeded creates a new namespace if it does not exist.
 func CreateNamespaceIfNeeded(t *testing.T, client *Client, namespace string) {
 	_, err := client.Kube.CoreV1().Namespaces().Get(context.Background(), namespace, metav1.GetOptions{})
diff --git a/vendor/knative.dev/eventing/test/lib/typemeta.go b/vendor/knative.dev/eventing/test/lib/typemeta.go
index f71dadf64..e09268052 100644
--- a/vendor/knative.dev/eventing/test/lib/typemeta.go
+++ b/vendor/knative.dev/eventing/test/lib/typemeta.go
@@ -62,7 +62,7 @@ var FlowsParallelTypeMeta = FlowsTypeMeta(resources.FlowsParallelKind)
 // FlowsSequenceTypeMeta is the TypeMeta ref for Sequence (in flows.knative.dev).
 var FlowsSequenceTypeMeta = FlowsTypeMeta(resources.FlowsSequenceKind)
 
-// FlowsTypeMeta returns the TypeMeta ref for an eventing messaing resource.
+// FlowsTypeMeta returns the TypeMeta ref for an eventing messaging resource.
 func FlowsTypeMeta(kind string) *metav1.TypeMeta {
 	return &metav1.TypeMeta{
 		Kind:       kind,
diff --git a/vendor/knative.dev/eventing/test/performance/infra/receiver/receiver.go b/vendor/knative.dev/eventing/test/performance/infra/receiver/receiver.go
index a8c4ed203..088da7a65 100644
--- a/vendor/knative.dev/eventing/test/performance/infra/receiver/receiver.go
+++ b/vendor/knative.dev/eventing/test/performance/infra/receiver/receiver.go
@@ -104,7 +104,7 @@ func (r *Receiver) Run(ctx context.Context) {
 		}
 	}()
 
-	// When the testing service is degradated, there is a chance that the end message is not received
+	// When the testing service is degraded, there is a chance that the end message is not received
 	// This timer sends to endCh a signal to stop processing events and start tear down of receiver
 	timeoutTimer := time.AfterFunc(r.timeout, func() {
 		log.Printf("Receiver timeout")
diff --git a/vendor/knative.dev/eventing/test/presubmit-tests.sh b/vendor/knative.dev/eventing/test/presubmit-tests.sh
index 564fbcf21..e4e33988d 100644
--- a/vendor/knative.dev/eventing/test/presubmit-tests.sh
+++ b/vendor/knative.dev/eventing/test/presubmit-tests.sh
@@ -1,6 +1,6 @@
-#!/bin/bash
+#!/usr/bin/env bash
 
-# Copyright 2018 The Knative Authors
+# Copyright 2020 The Knative Authors
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/vendor/knative.dev/pkg/apis/testing/conditions.go b/vendor/knative.dev/pkg/apis/testing/conditions.go
index 68b0018ab..8b0ac4547 100644
--- a/vendor/knative.dev/pkg/apis/testing/conditions.go
+++ b/vendor/knative.dev/pkg/apis/testing/conditions.go
@@ -20,9 +20,13 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 	"knative.dev/pkg/apis"
-	"knative.dev/pkg/test"
 )
 
+type ti interface {
+	Helper()
+	Error(args ...interface{})
+}
+
 // CheckCondition checks if condition `c` on `cc` has value `cs`.
 func CheckCondition(a apis.ConditionAccessor, c apis.ConditionType, cs corev1.ConditionStatus) error {
 	cond := a.GetCondition(c)
@@ -36,7 +40,7 @@ func CheckCondition(a apis.ConditionAccessor, c apis.ConditionType, cs corev1.Co
 }
 
 // CheckConditionOngoing checks if the condition is in state `Unknown`.
-func CheckConditionOngoing(a apis.ConditionAccessor, c apis.ConditionType, t test.T) {
+func CheckConditionOngoing(a apis.ConditionAccessor, c apis.ConditionType, t ti) {
 	t.Helper()
 	if err := CheckCondition(a, c, corev1.ConditionUnknown); err != nil {
 		t.Error(err)
@@ -44,7 +48,7 @@ func CheckConditionOngoing(a apis.ConditionAccessor, c apis.ConditionType, t tes
 }
 
 // CheckConditionFailed checks if the condition is in state `False`.
-func CheckConditionFailed(a apis.ConditionAccessor, c apis.ConditionType, t test.T) {
+func CheckConditionFailed(a apis.ConditionAccessor, c apis.ConditionType, t ti) {
 	t.Helper()
 	if err := CheckCondition(a, c, corev1.ConditionFalse); err != nil {
 		t.Error(err)
@@ -52,7 +56,7 @@ func CheckConditionFailed(a apis.ConditionAccessor, c apis.ConditionType, t test
 }
 
 // CheckConditionSucceeded checks if the condition is in state `True`.
-func CheckConditionSucceeded(a apis.ConditionAccessor, c apis.ConditionType, t test.T) {
+func CheckConditionSucceeded(a apis.ConditionAccessor, c apis.ConditionType, t ti) {
 	t.Helper()
 	if err := CheckCondition(a, c, corev1.ConditionTrue); err != nil {
 		t.Error(err)
diff --git a/vendor/knative.dev/pkg/apis/testing/roundtrip/roundtrip.go b/vendor/knative.dev/pkg/apis/testing/roundtrip/roundtrip.go
new file mode 100644
index 000000000..ed4fc02d8
--- /dev/null
+++ b/vendor/knative.dev/pkg/apis/testing/roundtrip/roundtrip.go
@@ -0,0 +1,256 @@
+/*
+Copyright 2020 The Knative Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package roundtrip
+
+import (
+	"context"
+	"math/rand"
+	"net/url"
+	"reflect"
+	"regexp"
+	"testing"
+
+	"github.com/google/go-cmp/cmp"
+	"github.com/google/go-cmp/cmp/cmpopts"
+	fuzz "github.com/google/gofuzz"
+	"k8s.io/apimachinery/pkg/api/apitesting/fuzzer"
+	"k8s.io/apimachinery/pkg/api/apitesting/roundtrip"
+	apiequality "k8s.io/apimachinery/pkg/api/equality"
+	apimeta "k8s.io/apimachinery/pkg/api/meta"
+	metafuzzer "k8s.io/apimachinery/pkg/apis/meta/fuzzer"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/runtime/serializer"
+	"k8s.io/apimachinery/pkg/util/sets"
+	"knative.dev/pkg/apis"
+)
+
+type convertibleObject interface {
+	runtime.Object
+	apis.Convertible
+}
+
+// globalNonRoundTrippableTypes are kinds that are effectively reserved
+// across all GroupVersions. They don't roundtrip
+//
+// This list comes from k8s.io/apimachinery. We can drop this constant when
+// the PR (https://github.com/kubernetes/kubernetes/pull/86959) merges and
+// we bump to a version that has the change
+var globalNonRoundTrippableTypes = sets.NewString(
+	"ExportOptions",
+	"GetOptions",
+	// WatchEvent does not include kind and version and can only be deserialized
+	// implicitly (if the caller expects the specific object). The watch call defines
+	// the schema by content type, rather than via kind/version included in each
+	// object.
+	"WatchEvent",
+	// ListOptions is now part of the meta group
+	"ListOptions",
+	// Delete options is only read in metav1
+	"DeleteOptions",
+)
+
+var (
+	metaV1Types    map[reflect.Type]struct{}
+	metaV1ListType = reflect.TypeOf((*metav1.ListMetaAccessor)(nil)).Elem()
+)
+
+func init() {
+	gv := schema.GroupVersion{Group: "roundtrip.group", Version: "v1"}
+
+	scheme := runtime.NewScheme()
+
+	metav1.AddToGroupVersion(scheme, gv)
+	metaV1Types = make(map[reflect.Type]struct{})
+
+	// Build up a list of types to ignore
+	for _, t := range scheme.KnownTypes(gv) {
+		metaV1Types[t] = struct{}{}
+	}
+}
+
+// ExternalTypesViaJSON applies the round-trip test to all external round-trippable Kinds
+// in the scheme. This is effectively testing the scenario:
+//
+//    external -> json -> external
+//
+func ExternalTypesViaJSON(t *testing.T, scheme *runtime.Scheme, fuzzerFuncs fuzzer.FuzzerFuncs) {
+	codecFactory := serializer.NewCodecFactory(scheme)
+
+	f := fuzzer.FuzzerFor(
+		fuzzer.MergeFuzzerFuncs(metafuzzer.Funcs, fuzzerFuncs),
+		rand.NewSource(rand.Int63()),
+		codecFactory,
+	)
+
+	f.SkipFieldsWithPattern(regexp.MustCompile("DeprecatedGeneration"))
+
+	kinds := scheme.AllKnownTypes()
+	for gvk := range kinds {
+		if gvk.Version == runtime.APIVersionInternal || globalNonRoundTrippableTypes.Has(gvk.Kind) {
+			continue
+		}
+		t.Run(gvk.Group+"."+gvk.Version+"."+gvk.Kind, func(t *testing.T) {
+			roundtrip.RoundTripSpecificKindWithoutProtobuf(t, gvk, scheme, codecFactory, f, nil)
+		})
+	}
+}
+
+// ExternalTypesViaHub applies the round-trip test to all external round-trippable Kinds
+// in the scheme. This is effectively testing the scenario:
+//
+//    external version -> hub version -> external version
+//
+func ExternalTypesViaHub(t *testing.T, scheme, hubs *runtime.Scheme, fuzzerFuncs fuzzer.FuzzerFuncs) {
+	f := fuzzer.FuzzerFor(
+		fuzzer.MergeFuzzerFuncs(metafuzzer.Funcs, fuzzerFuncs),
+		rand.NewSource(rand.Int63()),
+		// This seems to be used for protobuf not json
+		serializer.NewCodecFactory(scheme),
+	)
+
+	f.SkipFieldsWithPattern(regexp.MustCompile("DeprecatedGeneration"))
+
+	for gvk, objType := range scheme.AllKnownTypes() {
+		if gvk.Version == runtime.APIVersionInternal ||
+			gvk.Group == "" || // K8s group
+			globalNonRoundTrippableTypes.Has(gvk.Kind) {
+			continue
+		}
+
+		if _, ok := metaV1Types[objType]; ok {
+			continue
+		}
+
+		if reflect.PtrTo(objType).AssignableTo(metaV1ListType) {
+			continue
+		}
+
+		if hubs.Recognizes(gvk) {
+			continue
+		}
+
+		t.Run(gvk.Group+"."+gvk.Version+"."+gvk.Kind, func(t *testing.T) {
+			for i := 0; i < *roundtrip.FuzzIters; i++ {
+				roundTripViaHub(t, gvk, scheme, hubs, f)
+
+				if t.Failed() {
+					break
+				}
+			}
+		})
+	}
+}
+
+func roundTripViaHub(t *testing.T, gvk schema.GroupVersionKind, scheme, hubs *runtime.Scheme, f *fuzz.Fuzzer) {
+	ctx := context.Background()
+
+	hub, hubGVK := hubInstanceForGK(t, hubs, gvk.GroupKind())
+	obj := objForGVK(t, gvk, scheme)
+
+	fuzzObject(t, f, gvk, obj)
+
+	original := obj
+	obj = obj.DeepCopyObject().(convertibleObject)
+
+	if !apiequality.Semantic.DeepEqual(original, obj) {
+		t.Error("DeepCopy modified the original object (DeepCopy should not have side-effects), diff:", diff(original, obj))
+		return
+	}
+
+	if err := hub.ConvertFrom(ctx, obj); err != nil {
+		t.Errorf("Conversion to hub (%s) failed: %s", hubGVK, err)
+	}
+
+	if !apiequality.Semantic.DeepEqual(original, obj) {
+		t.Errorf("Conversion to hub (%s) modified the original object (ConvertFrom should not have side-effects), diff: %v", hubGVK, diff(original, obj))
+		return
+	}
+
+	newObj := objForGVK(t, gvk, scheme)
+	if err := hub.ConvertTo(ctx, newObj); err != nil {
+		t.Errorf("Conversion from hub (%s) failed: %s", hubGVK, err)
+		t.Errorf("object: %#v", obj)
+		return
+	}
+
+	if !apiequality.Semantic.DeepEqual(obj, newObj) {
+		t.Errorf("round trip through hub (%s) produced a diff: %s", hubGVK, diff(original, newObj))
+		return
+	}
+}
+
+func diff(obj1, obj2 interface{}) string {
+	// knative.dev/pkg/apis.URL is an alias to net.URL which embeds a
+	// url.Userinfo that has an unexported field
+	return cmp.Diff(obj1, obj2, cmpopts.IgnoreUnexported(url.Userinfo{}))
+}
+
+func objForGVK(t *testing.T,
+	gvk schema.GroupVersionKind,
+	scheme *runtime.Scheme,
+) convertibleObject {
+
+	t.Helper()
+
+	obj, err := scheme.New(gvk)
+	if err != nil {
+		t.Fatal("unable to create object instance for type", err)
+	}
+
+	objType, err := apimeta.TypeAccessor(obj)
+	if err != nil {
+		t.Fatalf("%q is not a TypeMeta and cannot be tested: %v", gvk, err)
+	}
+	objType.SetKind(gvk.Kind)
+	objType.SetAPIVersion(gvk.GroupVersion().String())
+	return obj.(convertibleObject)
+}
+
+func fuzzObject(t *testing.T, fuzzer *fuzz.Fuzzer, gvk schema.GroupVersionKind, obj interface{}) {
+	fuzzer.Fuzz(obj)
+
+	objType, err := apimeta.TypeAccessor(obj)
+	if err != nil {
+		t.Fatalf("%q is not a TypeMeta and cannot be tested: %v", gvk, err)
+	}
+	objType.SetKind(gvk.Kind)
+	objType.SetAPIVersion(gvk.GroupVersion().String())
+}
+
+func hubInstanceForGK(t *testing.T,
+	hubs *runtime.Scheme,
+	gk schema.GroupKind,
+) (apis.Convertible, schema.GroupVersionKind) {
+
+	t.Helper()
+
+	for hubGVK := range hubs.AllKnownTypes() {
+		if hubGVK.GroupKind() == gk {
+			obj, err := hubs.New(hubGVK)
+			if err != nil {
+				t.Fatal("error creating objects", err)
+			}
+
+			return obj.(apis.Convertible), hubGVK
+		}
+	}
+
+	t.Fatalf("hub type not found")
+	return nil, schema.GroupVersionKind{}
+}
diff --git a/vendor/knative.dev/pkg/test/clients.go b/vendor/knative.dev/pkg/test/clients.go
index dd5c6e301..e35a39045 100644
--- a/vendor/knative.dev/pkg/test/clients.go
+++ b/vendor/knative.dev/pkg/test/clients.go
@@ -23,6 +23,8 @@ import (
 	"fmt"
 	"strings"
 
+	"knative.dev/pkg/test/flags"
+
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/kubernetes"
@@ -40,10 +42,10 @@ type KubeClient struct {
 }
 
 // NewSpoofingClient returns a spoofing client to make requests
-func NewSpoofingClient(ctx context.Context, client *KubeClient, logf logging.FormatLogger,
+func NewSpoofingClient(ctx context.Context, client kubernetes.Interface, logf logging.FormatLogger,
 	domain string, resolvable bool, opts ...spoof.TransportOption) (*spoof.SpoofingClient, error) {
-	return spoof.New(ctx, client, logf, domain, resolvable, Flags.IngressEndpoint,
-		Flags.SpoofRequestInterval, Flags.SpoofRequestTimeout, opts...)
+	return spoof.New(ctx, client, logf, domain, resolvable, flags.Flags().IngressEndpoint,
+		flags.Flags().SpoofRequestInterval, flags.Flags().SpoofRequestTimeout, opts...)
 }
 
 // NewKubeClient instantiates and returns several clientsets required for making request to the
diff --git a/vendor/knative.dev/pkg/test/e2e_flags.go b/vendor/knative.dev/pkg/test/e2e_flags.go
index bc6f90bff..55a59582b 100644
--- a/vendor/knative.dev/pkg/test/e2e_flags.go
+++ b/vendor/knative.dev/pkg/test/e2e_flags.go
@@ -22,74 +22,47 @@ package test
 import (
 	"bytes"
 	"flag"
-	"os"
 	"os/user"
-	"path"
+	"path/filepath"
 	"text/template"
-	"time"
 
+	"knative.dev/pkg/injection"
+	testflags "knative.dev/pkg/test/flags"
 	"knative.dev/pkg/test/logging"
 )
 
 var (
 	// Flags holds the command line flags or defaults for settings in the user's environment.
 	// See EnvironmentFlags for a list of supported fields.
+	// Deprecated: use test/flags.Flags()
 	Flags = initializeFlags()
 )
 
 // EnvironmentFlags define the flags that are needed to run the e2e tests.
+// Deprecated: use test/flags.Flags() or injection.Flags()
 type EnvironmentFlags struct {
-	Cluster              string        // K8s cluster (defaults to cluster in kubeconfig)
-	Kubeconfig           string        // Path to kubeconfig (defaults to ./kube/config)
-	Namespace            string        // K8s namespace (blank by default, to be overwritten by test suite)
-	IngressEndpoint      string        // Host to use for ingress endpoint
-	ImageTemplate        string        // Template to build the image reference (defaults to {{.Repository}}/{{.Name}}:{{.Tag}})
-	DockerRepo           string        // Docker repo (defaults to $KO_DOCKER_REPO)
-	Tag                  string        // Tag for test images
-	SpoofRequestInterval time.Duration // SpoofRequestInterval is the interval between requests in SpoofingClient
-	SpoofRequestTimeout  time.Duration // SpoofRequestTimeout is the timeout for polling requests in SpoofingClient
+	*injection.Environment
+	*testflags.TestEnvironment
 }
 
 func initializeFlags() *EnvironmentFlags {
-	var f EnvironmentFlags
-	flag.StringVar(&f.Cluster, "cluster", "",
-		"Provide the cluster to test against. Defaults to the current cluster in kubeconfig.")
+	f := new(EnvironmentFlags)
 
-	// Use KUBECONFIG if available
-	defaultKubeconfig := os.Getenv("KUBECONFIG")
+	testflags.InitFlags(flag.CommandLine)
 
-	// If KUBECONFIG env var isn't set then look for $HOME/.kube/config
-	if defaultKubeconfig == "" {
+	f.TestEnvironment = testflags.Flags()
+	f.Environment = injection.Flags()
+
+	// We want to do this defaulting for tests only. The flags are reused between tests
+	// and production code and we want to make sure that production code defaults to
+	// the in-cluster config correctly.
+	if f.Environment.Kubeconfig == "" {
 		if usr, err := user.Current(); err == nil {
-			defaultKubeconfig = path.Join(usr.HomeDir, ".kube/config")
+			f.Environment.Kubeconfig = filepath.Join(usr.HomeDir, ".kube", "config")
 		}
 	}
 
-	// Allow for --kubeconfig on the cmd line to override the above logic
-	flag.StringVar(&f.Kubeconfig, "kubeconfig", defaultKubeconfig,
-		"Provide the path to the `kubeconfig` file you'd like to use for these tests. The `current-context` will be used.")
-
-	flag.StringVar(&f.Namespace, "namespace", "",
-		"Provide the namespace you would like to use for these tests.")
-
-	flag.StringVar(&f.IngressEndpoint, "ingressendpoint", "", "Provide a static endpoint url to the ingress server used during tests.")
-
-	flag.StringVar(&f.ImageTemplate, "imagetemplate", "{{.Repository}}/{{.Name}}:{{.Tag}}",
-		"Provide a template to generate the reference to an image from the test. Defaults to `{{.Repository}}/{{.Name}}:{{.Tag}}`.")
-
-	flag.DurationVar(&f.SpoofRequestInterval, "spoofinterval", 1*time.Second,
-		"Provide an interval between requests for the SpoofingClient")
-
-	flag.DurationVar(&f.SpoofRequestTimeout, "spooftimeout", 5*time.Minute,
-		"Provide a request timeout for the SpoofingClient")
-
-	defaultRepo := os.Getenv("KO_DOCKER_REPO")
-	flag.StringVar(&f.DockerRepo, "dockerrepo", defaultRepo,
-		"Provide the uri of the docker repo you have uploaded the test image to using `uploadtestimage.sh`. Defaults to $KO_DOCKER_REPO")
-
-	flag.StringVar(&f.Tag, "tag", "latest", "Provide the version tag for the test images.")
-
-	return &f
+	return f
 }
 
 // TODO(coryrc): Remove once other repos are moved to call logging.InitializeLogger() directly
@@ -99,7 +72,7 @@ func SetupLoggingFlags() {
 
 // ImagePath is a helper function to transform an image name into an image reference that can be pulled.
 func ImagePath(name string) string {
-	tpl, err := template.New("image").Parse(Flags.ImageTemplate)
+	tpl, err := template.New("image").Parse(testflags.Flags().ImageTemplate)
 	if err != nil {
 		panic("could not parse image template: " + err.Error())
 	}
@@ -110,9 +83,9 @@ func ImagePath(name string) string {
 		Name       string
 		Tag        string
 	}{
-		Repository: Flags.DockerRepo,
+		Repository: testflags.Flags().DockerRepo,
 		Name:       name,
-		Tag:        Flags.Tag,
+		Tag:        testflags.Flags().Tag,
 	}); err != nil {
 		panic("could not apply the image template: " + err.Error())
 	}
diff --git a/vendor/knative.dev/pkg/test/flags/e2e_flags.go b/vendor/knative.dev/pkg/test/flags/e2e_flags.go
new file mode 100644
index 000000000..fc9032a78
--- /dev/null
+++ b/vendor/knative.dev/pkg/test/flags/e2e_flags.go
@@ -0,0 +1,79 @@
+/*
+Copyright 2020 The Knative Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// This file contains logic to encapsulate flags which are needed to specify
+// what cluster, etc. to use for e2e tests.
+
+package flags
+
+import (
+	"flag"
+	"os"
+	"time"
+)
+
+// TestEnvironment define the config that are needed to run the e2e tests.
+type TestEnvironment struct {
+	Cluster              string        // K8s cluster (defaults to cluster in kubeconfig)
+	Namespace            string        // K8s namespace (blank by default, to be overwritten by test suite)
+	IngressEndpoint      string        // Host to use for ingress endpoint
+	ImageTemplate        string        // Template to build the image reference (defaults to {{.Repository}}/{{.Name}}:{{.Tag}})
+	DockerRepo           string        // Docker repo (defaults to $KO_DOCKER_REPO)
+	Tag                  string        // Tag for test images
+	SpoofRequestInterval time.Duration // SpoofRequestInterval is the interval between requests in SpoofingClient
+	SpoofRequestTimeout  time.Duration // SpoofRequestTimeout is the timeout for polling requests in SpoofingClient
+}
+
+var f *TestEnvironment
+
+// InitFlags is for explicitly initializing the flags.
+func InitFlags(flagset *flag.FlagSet) {
+	if flagset == nil {
+		flagset = flag.CommandLine
+	}
+
+	f = new(TestEnvironment)
+
+	flagset.StringVar(&f.Cluster, "cluster", "",
+		"Provide the cluster to test against. Defaults to the current cluster in kubeconfig.")
+
+	flagset.StringVar(&f.Namespace, "namespace", "",
+		"Provide the namespace you would like to use for these tests.")
+
+	flagset.StringVar(&f.IngressEndpoint, "ingressendpoint", "", "Provide a static endpoint url to the ingress server used during tests.")
+
+	flagset.StringVar(&f.ImageTemplate, "imagetemplate", "{{.Repository}}/{{.Name}}:{{.Tag}}",
+		"Provide a template to generate the reference to an image from the test. Defaults to `{{.Repository}}/{{.Name}}:{{.Tag}}`.")
+
+	flagset.DurationVar(&f.SpoofRequestInterval, "spoofinterval", 1*time.Second,
+		"Provide an interval between requests for the SpoofingClient")
+
+	flagset.DurationVar(&f.SpoofRequestTimeout, "spooftimeout", 5*time.Minute,
+		"Provide a request timeout for the SpoofingClient")
+
+	defaultRepo := os.Getenv("KO_DOCKER_REPO")
+	flagset.StringVar(&f.DockerRepo, "dockerrepo", defaultRepo,
+		"Provide the uri of the docker repo you have uploaded the test image to using `uploadtestimage.sh`. Defaults to $KO_DOCKER_REPO")
+
+	flagset.StringVar(&f.Tag, "tag", "latest", "Provide the version tag for the test images.")
+}
+
+// Flags returns the command line flags or defaults for settings in the user's
+// environment. See TestEnvironment for a list of supported fields.
+// Caller must call InitFlags() and flags.Parse() before calling Flags().
+func Flags() *TestEnvironment {
+	return f
+}
diff --git a/vendor/knative.dev/pkg/test/gcs/gcs.go b/vendor/knative.dev/pkg/test/gcs/gcs.go
index f1b9a695a..693fc110a 100644
--- a/vendor/knative.dev/pkg/test/gcs/gcs.go
+++ b/vendor/knative.dev/pkg/test/gcs/gcs.go
@@ -31,7 +31,7 @@ import (
 	"google.golang.org/api/option"
 )
 
-//nolint — there's also Client so they collide.
+//nolint // there's also Client so they collide.
 type GCSClient struct {
 	*storage.Client
 }
@@ -164,7 +164,7 @@ func (g *GCSClient) ListChildrenFiles(ctx context.Context, bucketName, dirPath s
 func (g *GCSClient) ListDirectChildren(ctx context.Context, bucketName, dirPath string) ([]string, error) {
 	// If there are 2 directories named "foo" and "foobar",
 	// then given storagePath "foo" will get files both under "foo" and "foobar".
-	// Add trailling slash to storagePath, so that only gets children under given directory.
+	// Add trailing slash to storagePath, so that only gets children under given directory.
 	return g.listChildren(ctx, bucketName, dirPath, "/")
 }
 
diff --git a/vendor/knative.dev/pkg/test/logging/tlogger.go b/vendor/knative.dev/pkg/test/logging/tlogger.go
index 42891bc21..f6e05c5ce 100644
--- a/vendor/knative.dev/pkg/test/logging/tlogger.go
+++ b/vendor/knative.dev/pkg/test/logging/tlogger.go
@@ -160,7 +160,7 @@ func (o *TLogger) interfacesToFields(things ...interface{}) []interface{} {
 	return fields
 }
 
-func (o *TLogger) errorWithRuntimeCheck(stringThenKeysAndValues ...interface{}) (error, string, []interface{}) { //nolint Returning the error first is okay and expected here.
+func (o *TLogger) errorWithRuntimeCheck(stringThenKeysAndValues ...interface{}) (error, string, []interface{}) { //nolint // Returning the error first is okay and expected here.
 	if len(stringThenKeysAndValues) == 0 {
 		return nil, "", nil
 	}
diff --git a/vendor/knative.dev/pkg/test/mako/alerter/github/issue.go b/vendor/knative.dev/pkg/test/mako/alerter/github/issue.go
index a40cc67cb..245900850 100644
--- a/vendor/knative.dev/pkg/test/mako/alerter/github/issue.go
+++ b/vendor/knative.dev/pkg/test/mako/alerter/github/issue.go
@@ -278,7 +278,7 @@ func (gih *IssueHandler) addComment(issueNumber int, commentBody string) error {
 // editComment will edit the comment to the new body.
 func (gih *IssueHandler) editComment(issueNumber int, commentID int64, commentBody string) error {
 	return helpers.Run(
-		fmt.Sprintf("editting comment to %q for issue %d in %q", commentBody, issueNumber, gih.config.repo),
+		fmt.Sprintf("editing comment to %q for issue %d in %q", commentBody, issueNumber, gih.config.repo),
 		func() error {
 			return gih.client.EditComment(gih.config.org, gih.config.repo, commentID, commentBody)
 		},
diff --git a/vendor/knative.dev/pkg/test/mako/config/benchmark.go b/vendor/knative.dev/pkg/test/mako/config/benchmark.go
index 8f22a865c..74bcbe928 100644
--- a/vendor/knative.dev/pkg/test/mako/config/benchmark.go
+++ b/vendor/knative.dev/pkg/test/mako/config/benchmark.go
@@ -23,7 +23,7 @@ import (
 	"os"
 	"path/filepath"
 
-	"github.com/golang/protobuf/proto" //nolint apis incompatible with the new version
+	"github.com/golang/protobuf/proto" //nolint // apis incompatible with the new version
 	mpb "github.com/google/mako/spec/proto/mako_go_proto"
 )
 
diff --git a/vendor/knative.dev/pkg/test/mako/config/configmap.go b/vendor/knative.dev/pkg/test/mako/config/configmap.go
index 8fb48e19c..22d983cff 100644
--- a/vendor/knative.dev/pkg/test/mako/config/configmap.go
+++ b/vendor/knative.dev/pkg/test/mako/config/configmap.go
@@ -37,7 +37,7 @@ type Config struct {
 	// Repository holds the name of the repository that runs the benchmarks.
 	Repository string
 
-	// Environment holds the name of the environement,
+	// Environment holds the name of the environment,
 	// where the test runs, e.g. `dev`.
 	Environment string
 
diff --git a/vendor/knative.dev/pkg/test/mako/sidecar.go b/vendor/knative.dev/pkg/test/mako/sidecar.go
index cf801977d..ad1531f34 100644
--- a/vendor/knative.dev/pkg/test/mako/sidecar.go
+++ b/vendor/knative.dev/pkg/test/mako/sidecar.go
@@ -44,7 +44,7 @@ const (
 	// assorted preprocessing.
 	sidecarAddress = "localhost:9813"
 
-	// org is the orgnization name that is used by Github client
+	// org is the organization name that is used by Github client
 	org = "knative"
 
 	// slackUserName is the slack user name that is used by Slack client
@@ -85,7 +85,7 @@ func EscapeTag(tag string) string {
 }
 
 // SetupHelper sets up the mako client for the provided benchmarkKey.
-// It will add a few common tags and allow each benchmark to add custm tags as well.
+// It will add a few common tags and allow each benchmark to add custom tags as well.
 // It returns the mako client handle to store metrics, a method to close the connection
 // to mako server once done and error in case of failures.
 func SetupHelper(ctx context.Context, benchmarkKey *string, benchmarkName *string, extraTags ...string) (*Client, error) {
diff --git a/vendor/knative.dev/pkg/test/monitoring/doc.go b/vendor/knative.dev/pkg/test/monitoring/doc.go
index 662f3c7e4..2d5a31343 100644
--- a/vendor/knative.dev/pkg/test/monitoring/doc.go
+++ b/vendor/knative.dev/pkg/test/monitoring/doc.go
@@ -22,7 +22,7 @@ This package exposes following methods:
 	CheckPortAvailability(port int) error
 		Checks if the given port is available
 	GetPods(kubeClientset kubernetes.Interface, app string) (*v1.PodList, error)
-		Gets the list of pods that satisfy the lable selector app=<app>
+		Gets the list of pods that satisfy the label selector app=<app>
 	Cleanup(pid int) error
 		Kill the current port forwarding process running in the background
 	PortForward(logf logging.FormatLogger, podList *v1.PodList, localPort, remotePort int) (int, error)
diff --git a/vendor/knative.dev/pkg/test/request.go b/vendor/knative.dev/pkg/test/request.go
index 334eec7e3..8b546d970 100644
--- a/vendor/knative.dev/pkg/test/request.go
+++ b/vendor/knative.dev/pkg/test/request.go
@@ -27,7 +27,10 @@ import (
 	"sync"
 	"time"
 
+	"knative.dev/pkg/test/flags"
+
 	"k8s.io/apimachinery/pkg/util/sets"
+	"k8s.io/client-go/kubernetes"
 	"knative.dev/pkg/test/logging"
 	"knative.dev/pkg/test/spoof"
 )
@@ -163,7 +166,7 @@ func MatchesAllOf(checkers ...spoof.ResponseChecker) spoof.ResponseChecker {
 // domain to get into the state checked by inState.  Commas in `desc` must be escaped.
 func WaitForEndpointState(
 	ctx context.Context,
-	kubeClient *KubeClient,
+	kubeClient kubernetes.Interface,
 	logf logging.FormatLogger,
 	url *url.URL,
 	inState spoof.ResponseChecker,
@@ -171,7 +174,7 @@ func WaitForEndpointState(
 	resolvable bool,
 	opts ...interface{}) (*spoof.Response, error) {
 	return WaitForEndpointStateWithTimeout(ctx, kubeClient, logf, url, inState,
-		desc, resolvable, Flags.SpoofRequestTimeout, opts...)
+		desc, resolvable, flags.Flags().SpoofRequestTimeout, opts...)
 }
 
 // WaitForEndpointStateWithTimeout will poll an endpoint until inState indicates the state is achieved
@@ -182,7 +185,7 @@ func WaitForEndpointState(
 // domain to get into the state checked by inState.  Commas in `desc` must be escaped.
 func WaitForEndpointStateWithTimeout(
 	ctx context.Context,
-	kubeClient *KubeClient,
+	kubeClient kubernetes.Interface,
 	logf logging.FormatLogger,
 	url *url.URL,
 	inState spoof.ResponseChecker,
diff --git a/vendor/knative.dev/pkg/test/spoof/spoof.go b/vendor/knative.dev/pkg/test/spoof/spoof.go
index 47d522564..f8c5b9498 100644
--- a/vendor/knative.dev/pkg/test/spoof/spoof.go
+++ b/vendor/knative.dev/pkg/test/spoof/spoof.go
@@ -56,7 +56,7 @@ func (r *Response) String() string {
 // https://medium.com/stupid-gopher-tricks/ensuring-go-interface-satisfaction-at-compile-time-1ed158e8fa17
 var dialContext = (&net.Dialer{}).DialContext
 
-// ResponseChecker is used to determine when SpoofinClient.Poll is done polling.
+// ResponseChecker is used to determine when SpoofingClient.Poll is done polling.
 // This allows you to predicate wait.PollImmediate on the request's http.Response.
 //
 // See the apimachinery wait package:
diff --git a/vendor/knative.dev/pkg/test/tinterface.go b/vendor/knative.dev/pkg/test/tinterface.go
index 3b2d72bb6..4cda2c90a 100644
--- a/vendor/knative.dev/pkg/test/tinterface.go
+++ b/vendor/knative.dev/pkg/test/tinterface.go
@@ -16,10 +16,11 @@ limitations under the License.
 
 // Defines an interface of commonality between testing.T and logging.TLogger
 // Allows most library functions to be shared
-// Simplifies coexistance with TLogger
+// Simplifies coexistence with TLogger
 
 package test
 
+// Deprecated: Do not use this. Define your own interface.
 type T interface {
 	Name() string
 	Helper()
@@ -29,6 +30,7 @@ type T interface {
 	Error(args ...interface{})
 }
 
+// Deprecated: Do not use this. Define your own interface.
 type TLegacy interface {
 	T
 	Logf(fmt string, args ...interface{}) // It gets passed to things in logstream
diff --git a/vendor/knative.dev/test-infra/scripts/library.sh b/vendor/knative.dev/test-infra/scripts/library.sh
index b11cd33be..ebb488ae9 100644
--- a/vendor/knative.dev/test-infra/scripts/library.sh
+++ b/vendor/knative.dev/test-infra/scripts/library.sh
@@ -399,21 +399,6 @@ function start_knative_serving() {
   wait_until_pods_running knative-serving || return 1
 }
 
-# Install Knative Monitoring in the current cluster.
-# Parameters: $1 - Knative Monitoring manifest.
-function start_knative_monitoring() {
-  header "Starting Knative Monitoring"
-  subheader "Installing Knative Monitoring"
-  # namespace istio-system needs to be created first, due to the comment
-  # mentioned in
-  # https://github.com/knative/serving/blob/4202efc0dc12052edc0630515b101cbf8068a609/config/monitoring/tracing/zipkin/100-zipkin.yaml#L21
-  kubectl create namespace istio-system 2>/dev/null
-  echo "Installing Monitoring from $1"
-  kubectl apply -f "$1" || return 1
-  wait_until_pods_running knative-monitoring || return 1
-  wait_until_pods_running istio-system || return 1
-}
-
 # Install the stable release Knative/serving in the current cluster.
 # Parameters: $1 - Knative Serving version number, e.g. 0.6.0.
 function start_release_knative_serving() {
@@ -521,6 +506,7 @@ function add_trap {
 #                         "master".
 # Additional dependencies can be included in the upgrade by providing them in a
 # global env var: FLOATING_DEPS
+# --upgrade will set GOPROXY to direct unless it is already set.
 function go_update_deps() {
   cd "${REPO_ROOT_DIR}" || return 1
 
@@ -541,10 +527,20 @@ function go_update_deps() {
     shift
   done
 
-  if (( UPGRADE )); then
+  if [[ $UPGRADE == 1 ]]; then
     echo "--- Upgrading to ${VERSION}"
+    # From shell parameter expansion:
+    # ${parameter:+word}
+    # If parameter is null or unset, nothing is substituted, otherwise the expansion of word is substituted.
+    # -z is if the length of the string, so skip setting GOPROXY if GOPROXY is already set.
+    if [[ -z ${GOPROXY:+skip} ]]; then
+      export GOPROXY=direct
+      echo "Using 'GOPROXY=direct'."
+    else
+      echo "Respecting 'GOPROXY=${GOPROXY}'."
+    fi
     FLOATING_DEPS+=( $(run_go_tool knative.dev/test-infra/buoy buoy float ${REPO_ROOT_DIR}/go.mod --release ${VERSION} --domain knative.dev) )
-    if (( ${#FLOATING_DEPS[@]} )); then
+    if [[ ${#FLOATING_DEPS[@]} > 0 ]]; then
       echo "Floating deps to ${FLOATING_DEPS[@]}"
       go get -d ${FLOATING_DEPS[@]}
     else
@@ -727,7 +723,7 @@ function get_latest_knative_yaml_source() {
 function shellcheck_new_files() {
   declare -a array_of_files
   local failed=0
-  readarray -t -d '\n' array_of_files < <(list_changed_files)
+  readarray -t array_of_files < <(list_changed_files)
   for filename in "${array_of_files[@]}"; do
     if echo "${filename}" | grep -q "^vendor/"; then
       continue
@@ -758,5 +754,4 @@ readonly KNATIVE_SERVING_RELEASE_CRDS="$(get_latest_knative_yaml_source "serving
 readonly KNATIVE_SERVING_RELEASE_CORE="$(get_latest_knative_yaml_source "serving" "serving-core")"
 readonly KNATIVE_NET_ISTIO_RELEASE="$(get_latest_knative_yaml_source "net-istio" "net-istio")"
 readonly KNATIVE_EVENTING_RELEASE="$(get_latest_knative_yaml_source "eventing" "eventing")"
-readonly KNATIVE_MONITORING_RELEASE="$(get_latest_knative_yaml_source "serving" "monitoring")"
 readonly KNATIVE_EVENTING_SUGAR_CONTROLLER_RELEASE="$(get_latest_knative_yaml_source "eventing" "eventing-sugar-controller")"
diff --git a/vendor/knative.dev/test-infra/scripts/shellcheck-presubmit.sh b/vendor/knative.dev/test-infra/scripts/shellcheck-presubmit.sh
index d9c48129a..d916db020 100644
--- a/vendor/knative.dev/test-infra/scripts/shellcheck-presubmit.sh
+++ b/vendor/knative.dev/test-infra/scripts/shellcheck-presubmit.sh
@@ -29,4 +29,6 @@ if (( ! IS_PROW )); then
   echo " and/or currently staged."
 fi
 
-shellcheck_new_files
+if [[ "$1" == "--run" ]]; then
+  shellcheck_new_files
+fi