Repository: knative/pkg
Pull request #1302 (2020-05-05 22:57:16)

Implement the second wave of per-reconciler leaderelection
Detailed design: https://docs.google.com/document/d/1i_QHjQO2T3SNv49xjZLWlivcc0UvZN1Tbw2NKxThkyM/edit

Issue: https://github.com/knative/pkg/issues/1181

WIP until #1301 lands

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

This pull-request has been approved by: *<a href="https://github.com/knative/pkg/pull/1302#" title="Author self-approved">mattmoor</a>*

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

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/pkg/blob/master/OWNERS)~~ [mattmoor]

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-metrics-robot: The following is the coverage report on the affected files.
Say `/test pull-knative-pkg-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[controller/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1257806689344688130/artifacts/line-cov.html#file0) | 95.2% | 91.6% | -3.6
[leaderelection/context.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1257806689344688130/artifacts/line-cov.html#file1) | Do not exist | 78.8% | 
[reconciler/leader.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1257806689344688130/artifacts/line-cov.html#file2) | Do not exist | 100.0% | 
[webhook/certificates/certificates.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1257806689344688130/artifacts/line-cov.html#file3) | 86.2% | 83.9% | -2.3
[webhook/certificates/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1257806689344688130/artifacts/line-cov.html#file4) | 100.0% | 87.5% | -12.5
[webhook/configmaps/configmaps.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1257806689344688130/artifacts/line-cov.html#file5) | 93.9% | 91.3% | -2.6
[webhook/configmaps/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1257806689344688130/artifacts/line-cov.html#file6) | 100.0% | 91.7% | -8.3
[webhook/psbinding/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1257806689344688130/artifacts/line-cov.html#file7) | 100.0% | 92.3% | -7.7
[webhook/psbinding/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1257806689344688130/artifacts/line-cov.html#file9) | 79.6% | 78.7% | -0.9
[webhook/resourcesemantics/conversion/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1257806689344688130/artifacts/line-cov.html#file10) | 100.0% | 80.0% | -20.0
[webhook/resourcesemantics/conversion/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1257806689344688130/artifacts/line-cov.html#file11) | 96.4% | 90.3% | -6.1
[webhook/resourcesemantics/defaulting/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1257806689344688130/artifacts/line-cov.html#file12) | 100.0% | 90.9% | -9.1
[webhook/resourcesemantics/defaulting/defaulting.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1257806689344688130/artifacts/line-cov.html#file13) | 88.5% | 87.3% | -1.2
[webhook/resourcesemantics/validation/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1257806689344688130/artifacts/line-cov.html#file14) | 100.0% | 93.8% | -6.2
[webhook/resourcesemantics/validation/reconcile_config.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1257806689344688130/artifacts/line-cov.html#file15) | 95.5% | 91.5% | -4.0

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

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[controller/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1258835718508122112/artifacts/line-cov.html#file0) | 95.2% | 91.6% | -3.6
[leaderelection/context.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1258835718508122112/artifacts/line-cov.html#file1) | Do not exist | 78.8% | 
[reconciler/leader.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1258835718508122112/artifacts/line-cov.html#file2) | Do not exist | 100.0% | 
[webhook/certificates/certificates.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1258835718508122112/artifacts/line-cov.html#file3) | 86.2% | 83.9% | -2.3
[webhook/certificates/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1258835718508122112/artifacts/line-cov.html#file4) | 100.0% | 87.5% | -12.5
[webhook/configmaps/configmaps.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1258835718508122112/artifacts/line-cov.html#file5) | 93.9% | 91.3% | -2.6
[webhook/configmaps/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1258835718508122112/artifacts/line-cov.html#file6) | 100.0% | 91.7% | -8.3
[webhook/psbinding/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1258835718508122112/artifacts/line-cov.html#file7) | 100.0% | 92.3% | -7.7
[webhook/psbinding/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1258835718508122112/artifacts/line-cov.html#file9) | 79.6% | 78.7% | -0.9
[webhook/resourcesemantics/conversion/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1258835718508122112/artifacts/line-cov.html#file10) | 100.0% | 80.0% | -20.0
[webhook/resourcesemantics/conversion/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1258835718508122112/artifacts/line-cov.html#file11) | 96.4% | 90.3% | -6.1
[webhook/resourcesemantics/defaulting/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1258835718508122112/artifacts/line-cov.html#file12) | 100.0% | 90.9% | -9.1
[webhook/resourcesemantics/defaulting/defaulting.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1258835718508122112/artifacts/line-cov.html#file13) | 88.5% | 87.3% | -1.2
[webhook/resourcesemantics/validation/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1258835718508122112/artifacts/line-cov.html#file14) | 100.0% | 93.8% | -6.2
[webhook/resourcesemantics/validation/reconcile_config.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1258835718508122112/artifacts/line-cov.html#file15) | 95.5% | 91.5% | -4.0

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

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[controller/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259338783870947328/artifacts/line-cov.html#file0) | 95.2% | 91.6% | -3.6
[leaderelection/context.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259338783870947328/artifacts/line-cov.html#file1) | Do not exist | 78.8% | 
[reconciler/leader.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259338783870947328/artifacts/line-cov.html#file2) | Do not exist | 100.0% | 
[webhook/certificates/certificates.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259338783870947328/artifacts/line-cov.html#file3) | 86.2% | 83.9% | -2.3
[webhook/certificates/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259338783870947328/artifacts/line-cov.html#file4) | 100.0% | 87.5% | -12.5
[webhook/configmaps/configmaps.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259338783870947328/artifacts/line-cov.html#file5) | 93.9% | 91.3% | -2.6
[webhook/configmaps/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259338783870947328/artifacts/line-cov.html#file6) | 100.0% | 91.7% | -8.3
[webhook/psbinding/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259338783870947328/artifacts/line-cov.html#file7) | 100.0% | 92.3% | -7.7
[webhook/psbinding/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259338783870947328/artifacts/line-cov.html#file9) | 79.6% | 78.7% | -0.9
[webhook/resourcesemantics/conversion/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259338783870947328/artifacts/line-cov.html#file10) | 100.0% | 80.0% | -20.0
[webhook/resourcesemantics/conversion/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259338783870947328/artifacts/line-cov.html#file11) | 96.4% | 90.3% | -6.1
[webhook/resourcesemantics/defaulting/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259338783870947328/artifacts/line-cov.html#file12) | 100.0% | 90.9% | -9.1
[webhook/resourcesemantics/defaulting/defaulting.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259338783870947328/artifacts/line-cov.html#file13) | 88.5% | 87.3% | -1.2
[webhook/resourcesemantics/validation/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259338783870947328/artifacts/line-cov.html#file14) | 100.0% | 93.8% | -6.2
[webhook/resourcesemantics/validation/reconcile_config.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259338783870947328/artifacts/line-cov.html#file15) | 95.5% | 91.5% | -4.0

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

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[controller/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259861100237688832/artifacts/line-cov.html#file0) | 95.2% | 91.6% | -3.6
[leaderelection/context.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259861100237688832/artifacts/line-cov.html#file1) | Do not exist | 78.8% | 
[reconciler/leader.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259861100237688832/artifacts/line-cov.html#file2) | Do not exist | 100.0% | 
[webhook/certificates/certificates.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259861100237688832/artifacts/line-cov.html#file3) | 86.2% | 83.9% | -2.3
[webhook/certificates/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259861100237688832/artifacts/line-cov.html#file4) | 100.0% | 87.5% | -12.5
[webhook/configmaps/configmaps.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259861100237688832/artifacts/line-cov.html#file5) | 93.9% | 91.3% | -2.6
[webhook/configmaps/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259861100237688832/artifacts/line-cov.html#file6) | 100.0% | 91.7% | -8.3
[webhook/psbinding/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259861100237688832/artifacts/line-cov.html#file7) | 100.0% | 92.3% | -7.7
[webhook/psbinding/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259861100237688832/artifacts/line-cov.html#file9) | 79.6% | 78.7% | -0.9
[webhook/resourcesemantics/conversion/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259861100237688832/artifacts/line-cov.html#file10) | 100.0% | 80.0% | -20.0
[webhook/resourcesemantics/conversion/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259861100237688832/artifacts/line-cov.html#file11) | 96.4% | 90.3% | -6.1
[webhook/resourcesemantics/defaulting/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259861100237688832/artifacts/line-cov.html#file12) | 100.0% | 90.9% | -9.1
[webhook/resourcesemantics/defaulting/defaulting.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259861100237688832/artifacts/line-cov.html#file13) | 88.5% | 87.3% | -1.2
[webhook/resourcesemantics/validation/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259861100237688832/artifacts/line-cov.html#file14) | 100.0% | 93.8% | -6.2
[webhook/resourcesemantics/validation/reconcile_config.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1259861100237688832/artifacts/line-cov.html#file15) | 95.5% | 91.5% | -4.0

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

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[controller/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1260075253476888577/artifacts/line-cov.html#file0) | 95.2% | 91.3% | -3.9
[leaderelection/context.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1260075253476888577/artifacts/line-cov.html#file1) | Do not exist | 82.2% | 
[reconciler/leader.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1260075253476888577/artifacts/line-cov.html#file2) | Do not exist | 100.0% | 
[webhook/certificates/certificates.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1260075253476888577/artifacts/line-cov.html#file3) | 86.2% | 83.9% | -2.3
[webhook/certificates/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1260075253476888577/artifacts/line-cov.html#file4) | 100.0% | 87.5% | -12.5
[webhook/configmaps/configmaps.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1260075253476888577/artifacts/line-cov.html#file5) | 93.9% | 91.3% | -2.6
[webhook/configmaps/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1260075253476888577/artifacts/line-cov.html#file6) | 100.0% | 91.7% | -8.3
[webhook/psbinding/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1260075253476888577/artifacts/line-cov.html#file7) | 100.0% | 92.3% | -7.7
[webhook/psbinding/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1260075253476888577/artifacts/line-cov.html#file9) | 79.6% | 78.7% | -0.9
[webhook/resourcesemantics/conversion/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1260075253476888577/artifacts/line-cov.html#file10) | 100.0% | 80.0% | -20.0
[webhook/resourcesemantics/conversion/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1260075253476888577/artifacts/line-cov.html#file11) | 96.4% | 90.3% | -6.1
[webhook/resourcesemantics/defaulting/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1260075253476888577/artifacts/line-cov.html#file12) | 100.0% | 90.9% | -9.1
[webhook/resourcesemantics/defaulting/defaulting.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1260075253476888577/artifacts/line-cov.html#file13) | 88.5% | 87.3% | -1.2
[webhook/resourcesemantics/validation/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1260075253476888577/artifacts/line-cov.html#file14) | 100.0% | 93.8% | -6.2
[webhook/resourcesemantics/validation/reconcile_config.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1260075253476888577/artifacts/line-cov.html#file15) | 95.5% | 91.5% | -4.0

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

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[controller/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1261025695912431618/artifacts/line-cov.html#file0) | 95.2% | 91.3% | -3.9
[leaderelection/config.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1261025695912431618/artifacts/line-cov.html#file1) | 68.8% | 82.5% | 13.7
[leaderelection/context.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1261025695912431618/artifacts/line-cov.html#file2) | Do not exist | 81.8% | 
[reconciler/leader.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1261025695912431618/artifacts/line-cov.html#file3) | Do not exist | 100.0% | 
[webhook/certificates/certificates.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1261025695912431618/artifacts/line-cov.html#file4) | 86.2% | 83.9% | -2.3
[webhook/certificates/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1261025695912431618/artifacts/line-cov.html#file5) | 100.0% | 87.5% | -12.5
[webhook/configmaps/configmaps.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1261025695912431618/artifacts/line-cov.html#file6) | 93.9% | 91.3% | -2.6
[webhook/configmaps/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1261025695912431618/artifacts/line-cov.html#file7) | 100.0% | 91.7% | -8.3
[webhook/psbinding/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1261025695912431618/artifacts/line-cov.html#file8) | 100.0% | 92.3% | -7.7
[webhook/psbinding/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1261025695912431618/artifacts/line-cov.html#file10) | 79.6% | 78.7% | -0.9
[webhook/resourcesemantics/conversion/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1261025695912431618/artifacts/line-cov.html#file11) | 100.0% | 80.0% | -20.0
[webhook/resourcesemantics/conversion/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1261025695912431618/artifacts/line-cov.html#file12) | 96.4% | 90.3% | -6.1
[webhook/resourcesemantics/defaulting/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1261025695912431618/artifacts/line-cov.html#file13) | 100.0% | 90.9% | -9.1
[webhook/resourcesemantics/defaulting/defaulting.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1261025695912431618/artifacts/line-cov.html#file14) | 88.5% | 87.3% | -1.2
[webhook/resourcesemantics/validation/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1261025695912431618/artifacts/line-cov.html#file15) | 100.0% | 93.8% | -6.2
[webhook/resourcesemantics/validation/reconcile_config.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1261025695912431618/artifacts/line-cov.html#file16) | 95.5% | 91.5% | -4.0

knative-prow-robot: @mattmoor: PR needs rebase.

<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>
knative-metrics-robot: The following is the coverage report on the affected files.
Say `/test pull-knative-pkg-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[controller/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266498252648222721/artifacts/line-cov.html#file1) | 92.9% | 91.3% | -1.6
[leaderelection/config.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266498252648222721/artifacts/line-cov.html#file2) | 56.5% | 72.0% | 15.5
[leaderelection/context.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266498252648222721/artifacts/line-cov.html#file3) | Do not exist | 81.8% | 
[reconciler/leader.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266498252648222721/artifacts/line-cov.html#file4) | Do not exist | 100.0% | 
[webhook/certificates/certificates.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266498252648222721/artifacts/line-cov.html#file5) | 86.2% | 83.9% | -2.3
[webhook/certificates/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266498252648222721/artifacts/line-cov.html#file6) | 100.0% | 87.5% | -12.5
[webhook/configmaps/configmaps.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266498252648222721/artifacts/line-cov.html#file7) | 93.9% | 91.3% | -2.6
[webhook/configmaps/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266498252648222721/artifacts/line-cov.html#file8) | 100.0% | 91.7% | -8.3
[webhook/psbinding/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266498252648222721/artifacts/line-cov.html#file9) | 100.0% | 92.3% | -7.7
[webhook/psbinding/psbinding.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266498252648222721/artifacts/line-cov.html#file10) | 88.1% | 87.4% | -0.7
[webhook/psbinding/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266498252648222721/artifacts/line-cov.html#file11) | 79.6% | 78.7% | -0.9
[webhook/resourcesemantics/conversion/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266498252648222721/artifacts/line-cov.html#file12) | 100.0% | 80.0% | -20.0
[webhook/resourcesemantics/conversion/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266498252648222721/artifacts/line-cov.html#file13) | 96.4% | 90.3% | -6.1
[webhook/resourcesemantics/defaulting/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266498252648222721/artifacts/line-cov.html#file14) | 100.0% | 90.9% | -9.1
[webhook/resourcesemantics/defaulting/defaulting.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266498252648222721/artifacts/line-cov.html#file15) | 88.5% | 87.3% | -1.2
[webhook/resourcesemantics/validation/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266498252648222721/artifacts/line-cov.html#file16) | 100.0% | 93.8% | -6.2
[webhook/resourcesemantics/validation/reconcile_config.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266498252648222721/artifacts/line-cov.html#file17) | 95.5% | 91.5% | -4.0

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

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[leaderelection/config.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266503914811822082/artifacts/line-cov.html#file1) | 56.5% | 72.0% | 15.5
[leaderelection/context.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266503914811822082/artifacts/line-cov.html#file2) | Do not exist | 81.8% | 
[reconciler/leader.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266503914811822082/artifacts/line-cov.html#file3) | Do not exist | 100.0% | 
[webhook/certificates/certificates.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266503914811822082/artifacts/line-cov.html#file4) | 86.2% | 83.9% | -2.3
[webhook/certificates/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266503914811822082/artifacts/line-cov.html#file5) | 100.0% | 87.5% | -12.5
[webhook/configmaps/configmaps.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266503914811822082/artifacts/line-cov.html#file6) | 93.9% | 91.3% | -2.6
[webhook/configmaps/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266503914811822082/artifacts/line-cov.html#file7) | 100.0% | 91.7% | -8.3
[webhook/psbinding/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266503914811822082/artifacts/line-cov.html#file8) | 100.0% | 92.3% | -7.7
[webhook/psbinding/psbinding.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266503914811822082/artifacts/line-cov.html#file9) | 88.1% | 87.4% | -0.7
[webhook/psbinding/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266503914811822082/artifacts/line-cov.html#file10) | 79.6% | 78.7% | -0.9
[webhook/resourcesemantics/conversion/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266503914811822082/artifacts/line-cov.html#file11) | 100.0% | 80.0% | -20.0
[webhook/resourcesemantics/conversion/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266503914811822082/artifacts/line-cov.html#file12) | 96.4% | 90.3% | -6.1
[webhook/resourcesemantics/defaulting/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266503914811822082/artifacts/line-cov.html#file13) | 100.0% | 90.9% | -9.1
[webhook/resourcesemantics/defaulting/defaulting.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266503914811822082/artifacts/line-cov.html#file14) | 88.5% | 87.3% | -1.2
[webhook/resourcesemantics/validation/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266503914811822082/artifacts/line-cov.html#file15) | 100.0% | 93.8% | -6.2
[webhook/resourcesemantics/validation/reconcile_config.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266503914811822082/artifacts/line-cov.html#file16) | 95.5% | 91.5% | -4.0

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-pkg-unit-tests | 89c6f2273d5ec47e9e361ab2d2eef1ac633033b5 | [link](https://prow.knative.dev/view/gcs/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-unit-tests/1266503914811822081) | `/test pull-knative-pkg-unit-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative_pkg/1302). [Your PR dashboard](https://gubernator.knative.dev/pr/mattmoor).

<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-pkg-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[controller/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266518888804257793/artifacts/line-cov.html#file1) | 92.9% | 91.3% | -1.6
[leaderelection/config.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266518888804257793/artifacts/line-cov.html#file2) | 56.5% | 72.0% | 15.5
[leaderelection/context.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266518888804257793/artifacts/line-cov.html#file3) | Do not exist | 81.8% | 
[reconciler/leader.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266518888804257793/artifacts/line-cov.html#file4) | Do not exist | 100.0% | 
[webhook/certificates/certificates.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266518888804257793/artifacts/line-cov.html#file5) | 86.2% | 83.9% | -2.3
[webhook/certificates/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266518888804257793/artifacts/line-cov.html#file6) | 100.0% | 87.5% | -12.5
[webhook/configmaps/configmaps.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266518888804257793/artifacts/line-cov.html#file7) | 93.9% | 91.3% | -2.6
[webhook/configmaps/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266518888804257793/artifacts/line-cov.html#file8) | 100.0% | 91.7% | -8.3
[webhook/psbinding/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266518888804257793/artifacts/line-cov.html#file9) | 100.0% | 92.3% | -7.7
[webhook/psbinding/psbinding.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266518888804257793/artifacts/line-cov.html#file10) | 88.1% | 87.4% | -0.7
[webhook/psbinding/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266518888804257793/artifacts/line-cov.html#file11) | 79.6% | 78.7% | -0.9
[webhook/resourcesemantics/conversion/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266518888804257793/artifacts/line-cov.html#file12) | 100.0% | 80.0% | -20.0
[webhook/resourcesemantics/conversion/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266518888804257793/artifacts/line-cov.html#file13) | 96.4% | 90.3% | -6.1
[webhook/resourcesemantics/defaulting/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266518888804257793/artifacts/line-cov.html#file14) | 100.0% | 90.9% | -9.1
[webhook/resourcesemantics/defaulting/defaulting.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266518888804257793/artifacts/line-cov.html#file15) | 88.5% | 87.3% | -1.2
[webhook/resourcesemantics/validation/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266518888804257793/artifacts/line-cov.html#file16) | 100.0% | 93.8% | -6.2
[webhook/resourcesemantics/validation/reconcile_config.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1266518888804257793/artifacts/line-cov.html#file17) | 95.5% | 91.5% | -4.0

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

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[controller/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1269370877540044802/artifacts/line-cov.html#file1) | 92.9% | 91.3% | -1.5
[leaderelection/config.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1269370877540044802/artifacts/line-cov.html#file2) | 56.5% | 72.0% | 15.5
[leaderelection/context.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1269370877540044802/artifacts/line-cov.html#file3) | Do not exist | 81.8% | 
[reconciler/leader.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1269370877540044802/artifacts/line-cov.html#file4) | Do not exist | 100.0% | 
[webhook/certificates/certificates.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1269370877540044802/artifacts/line-cov.html#file5) | 86.2% | 83.9% | -2.3
[webhook/certificates/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1269370877540044802/artifacts/line-cov.html#file6) | 100.0% | 87.5% | -12.5
[webhook/configmaps/configmaps.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1269370877540044802/artifacts/line-cov.html#file7) | 94.3% | 91.8% | -2.5
[webhook/configmaps/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1269370877540044802/artifacts/line-cov.html#file8) | 100.0% | 91.7% | -8.3
[webhook/psbinding/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1269370877540044802/artifacts/line-cov.html#file9) | 100.0% | 92.3% | -7.7
[webhook/psbinding/psbinding.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1269370877540044802/artifacts/line-cov.html#file10) | 88.1% | 87.4% | -0.7
[webhook/psbinding/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1269370877540044802/artifacts/line-cov.html#file11) | 79.6% | 78.7% | -0.9
[webhook/resourcesemantics/conversion/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1269370877540044802/artifacts/line-cov.html#file12) | 100.0% | 80.0% | -20.0
[webhook/resourcesemantics/conversion/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1269370877540044802/artifacts/line-cov.html#file13) | 96.4% | 90.3% | -6.1
[webhook/resourcesemantics/defaulting/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1269370877540044802/artifacts/line-cov.html#file14) | 100.0% | 90.9% | -9.1
[webhook/resourcesemantics/defaulting/defaulting.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1269370877540044802/artifacts/line-cov.html#file15) | 88.5% | 87.3% | -1.2
[webhook/resourcesemantics/validation/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1269370877540044802/artifacts/line-cov.html#file16) | 100.0% | 93.8% | -6.2
[webhook/resourcesemantics/validation/reconcile_config.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1269370877540044802/artifacts/line-cov.html#file17) | 95.5% | 91.5% | -4.0

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-pkg-unit-tests | 4edf76782fd358391b3dac0f398f59a8ec25c142 | [link](https://prow.knative.dev/view/gcs/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-unit-tests/1269370877544239105) | `/test pull-knative-pkg-unit-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative_pkg/1302). [Your PR dashboard](https://gubernator.knative.dev/pr/mattmoor).

<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: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/knative/pkg/pull/1302#" title="Author self-approved">mattmoor</a>*

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

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:

- ~~[webhook/OWNERS](https://github.com/knative/pkg/blob/master/webhook/OWNERS)~~ [mattmoor]

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-metrics-robot: The following is the coverage report on the affected files.
Say `/test pull-knative-pkg-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[webhook/certificates/certificates.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273803455630151682/artifacts/line-cov.html#file0) | 86.2% | 83.9% | -2.3
[webhook/certificates/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273803455630151682/artifacts/line-cov.html#file1) | 100.0% | 77.8% | -22.2
[webhook/configmaps/configmaps.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273803455630151682/artifacts/line-cov.html#file2) | 94.2% | 91.7% | -2.5
[webhook/configmaps/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273803455630151682/artifacts/line-cov.html#file3) | 100.0% | 84.6% | -15.4
[webhook/psbinding/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273803455630151682/artifacts/line-cov.html#file4) | 100.0% | 85.7% | -14.3
[webhook/psbinding/psbinding.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273803455630151682/artifacts/line-cov.html#file5) | 88.1% | 87.4% | -0.7
[webhook/psbinding/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273803455630151682/artifacts/line-cov.html#file6) | 79.6% | 78.7% | -0.9
[webhook/resourcesemantics/conversion/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273803455630151682/artifacts/line-cov.html#file7) | 100.0% | 75.0% | -25.0
[webhook/resourcesemantics/conversion/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273803455630151682/artifacts/line-cov.html#file8) | 96.4% | 90.3% | -6.1
[webhook/resourcesemantics/defaulting/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273803455630151682/artifacts/line-cov.html#file9) | 100.0% | 83.3% | -16.7
[webhook/resourcesemantics/defaulting/defaulting.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273803455630151682/artifacts/line-cov.html#file10) | 88.6% | 87.4% | -1.2
[webhook/resourcesemantics/validation/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273803455630151682/artifacts/line-cov.html#file11) | 100.0% | 88.2% | -11.8
[webhook/resourcesemantics/validation/reconcile_config.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273803455630151682/artifacts/line-cov.html#file12) | 95.6% | 91.7% | -3.9

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

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[webhook/certificates/certificates.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273994464838291457/artifacts/line-cov.html#file0) | 86.2% | 83.9% | -2.3
[webhook/certificates/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273994464838291457/artifacts/line-cov.html#file1) | 100.0% | 80.0% | -20.0
[webhook/configmaps/configmaps.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273994464838291457/artifacts/line-cov.html#file2) | 94.2% | 91.7% | -2.5
[webhook/configmaps/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273994464838291457/artifacts/line-cov.html#file3) | 100.0% | 85.7% | -14.3
[webhook/psbinding/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273994464838291457/artifacts/line-cov.html#file4) | 100.0% | 85.7% | -14.3
[webhook/psbinding/psbinding.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273994464838291457/artifacts/line-cov.html#file5) | 88.1% | 87.4% | -0.7
[webhook/psbinding/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273994464838291457/artifacts/line-cov.html#file6) | 79.6% | 78.7% | -0.9
[webhook/resourcesemantics/conversion/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273994464838291457/artifacts/line-cov.html#file7) | 100.0% | 75.0% | -25.0
[webhook/resourcesemantics/conversion/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273994464838291457/artifacts/line-cov.html#file8) | 96.4% | 90.3% | -6.1
[webhook/resourcesemantics/defaulting/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273994464838291457/artifacts/line-cov.html#file9) | 100.0% | 84.6% | -15.4
[webhook/resourcesemantics/defaulting/defaulting.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273994464838291457/artifacts/line-cov.html#file10) | 88.6% | 87.4% | -1.2
[webhook/resourcesemantics/validation/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273994464838291457/artifacts/line-cov.html#file11) | 100.0% | 88.2% | -11.8
[webhook/resourcesemantics/validation/reconcile_config.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1273994464838291457/artifacts/line-cov.html#file12) | 95.6% | 91.7% | -3.9

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

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[webhook/certificates/certificates.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1274007676610678787/artifacts/line-cov.html#file0) | 86.2% | 83.9% | -2.3
[webhook/configmaps/configmaps.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1274007676610678787/artifacts/line-cov.html#file2) | 94.2% | 91.7% | -2.5
[webhook/psbinding/psbinding.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1274007676610678787/artifacts/line-cov.html#file5) | 88.1% | 87.4% | -0.7
[webhook/psbinding/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1274007676610678787/artifacts/line-cov.html#file6) | 79.6% | 78.7% | -0.9
[webhook/resourcesemantics/conversion/controller.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1274007676610678787/artifacts/line-cov.html#file7) | 100.0% | 75.0% | -25.0
[webhook/resourcesemantics/conversion/reconciler.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1274007676610678787/artifacts/line-cov.html#file8) | 96.4% | 90.3% | -6.1
[webhook/resourcesemantics/defaulting/defaulting.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1274007676610678787/artifacts/line-cov.html#file10) | 88.6% | 87.4% | -1.2
[webhook/resourcesemantics/validation/reconcile_config.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_pkg/1302/pull-knative-pkg-go-coverage/1274007676610678787/artifacts/line-cov.html#file12) | 95.6% | 91.7% | -3.9

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

This pull-request has been approved by: *<a href="https://github.com/knative/pkg/pull/1302#pullrequestreview-434206677" title="Approved">dprotaso</a>*, *<a href="https://github.com/knative/pkg/pull/1302#" title="Author self-approved">mattmoor</a>*

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

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:

- ~~[webhook/OWNERS](https://github.com/knative/pkg/blob/master/webhook/OWNERS)~~ [dprotaso,mattmoor]

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":[]} -->
vaikas: /lgtm
/approve
knative-prow-robot: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/knative/pkg/pull/1302#pullrequestreview-434206677" title="Approved">dprotaso</a>*, *<a href="https://github.com/knative/pkg/pull/1302#" title="Author self-approved">mattmoor</a>*, *<a href="https://github.com/knative/pkg/pull/1302#issuecomment-646744143" title="Approved">vaikas</a>*

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

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:

- ~~[webhook/OWNERS](https://github.com/knative/pkg/blob/master/webhook/OWNERS)~~ [dprotaso,mattmoor,vaikas]

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":[]} -->

Patch:
diff --git a/webhook/certificates/certificates.go b/webhook/certificates/certificates.go
index 275bec9e3..5e698d762 100644
--- a/webhook/certificates/certificates.go
+++ b/webhook/certificates/certificates.go
@@ -23,11 +23,12 @@ import (
 	"time"
 
 	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/kubernetes"
 	corelisters "k8s.io/client-go/listers/core/v1"
 	"knative.dev/pkg/controller"
 	"knative.dev/pkg/logging"
-	"knative.dev/pkg/system"
+	pkgreconciler "knative.dev/pkg/reconciler"
 	certresources "knative.dev/pkg/webhook/certificates/resources"
 )
 
@@ -37,39 +38,46 @@ const (
 )
 
 type reconciler struct {
+	pkgreconciler.LeaderAwareFuncs
+
 	client       kubernetes.Interface
 	secretlister corelisters.SecretLister
-	secretName   string
+	key          types.NamespacedName
 	serviceName  string
 }
 
 var _ controller.Reconciler = (*reconciler)(nil)
+var _ pkgreconciler.LeaderAware = (*reconciler)(nil)
 
 // Reconcile implements controller.Reconciler
 func (r *reconciler) Reconcile(ctx context.Context, key string) error {
-	return r.reconcileCertificate(ctx)
+	if r.IsLeaderFor(r.key) {
+		// only reconciler the certificate when we are leader.
+		return r.reconcileCertificate(ctx)
+	}
+	return nil
 }
 
 func (r *reconciler) reconcileCertificate(ctx context.Context) error {
 	logger := logging.FromContext(ctx)
 
-	secret, err := r.secretlister.Secrets(system.Namespace()).Get(r.secretName)
+	secret, err := r.secretlister.Secrets(r.key.Namespace).Get(r.key.Name)
 	if apierrors.IsNotFound(err) {
 		// The secret should be created explicitly by a higher-level system
 		// that's responsible for install/updates.  We simply populate the
 		// secret information.
 		return nil
 	} else if err != nil {
-		logger.Errorf("Error accessing certificate secret %q: %v", r.secretName, err)
+		logger.Errorf("Error accessing certificate secret %q: %v", r.key.Name, err)
 		return err
 	}
 
 	if _, haskey := secret.Data[certresources.ServerKey]; !haskey {
-		logger.Infof("Certificate secret %q is missing key %q", r.secretName, certresources.ServerKey)
+		logger.Infof("Certificate secret %q is missing key %q", r.key.Name, certresources.ServerKey)
 	} else if _, haskey := secret.Data[certresources.ServerCert]; !haskey {
-		logger.Infof("Certificate secret %q is missing key %q", r.secretName, certresources.ServerCert)
+		logger.Infof("Certificate secret %q is missing key %q", r.key.Name, certresources.ServerCert)
 	} else if _, haskey := secret.Data[certresources.CACert]; !haskey {
-		logger.Infof("Certificate secret %q is missing key %q", r.secretName, certresources.CACert)
+		logger.Infof("Certificate secret %q is missing key %q", r.key.Name, certresources.CACert)
 	} else {
 		// Check the expiration date of the certificate to see if it needs to be updated
 		cert, err := tls.X509KeyPair(secret.Data[certresources.ServerCert], secret.Data[certresources.ServerKey])
@@ -88,7 +96,7 @@ func (r *reconciler) reconcileCertificate(ctx context.Context) error {
 	secret = secret.DeepCopy()
 
 	// One of the secret's keys is missing, so synthesize a new one and update the secret.
-	newSecret, err := certresources.MakeSecret(ctx, r.secretName, system.Namespace(), r.serviceName)
+	newSecret, err := certresources.MakeSecret(ctx, r.key.Name, r.key.Namespace, r.serviceName)
 	if err != nil {
 		return err
 	}
diff --git a/webhook/certificates/controller.go b/webhook/certificates/controller.go
index b8f408111..a50acb39a 100644
--- a/webhook/certificates/controller.go
+++ b/webhook/certificates/controller.go
@@ -23,10 +23,12 @@ import (
 	kubeclient "knative.dev/pkg/client/injection/kube/client"
 	secretinformer "knative.dev/pkg/injection/clients/namespacedkube/informers/core/v1/secret"
 
+	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/tools/cache"
 	"knative.dev/pkg/configmap"
 	"knative.dev/pkg/controller"
 	"knative.dev/pkg/logging"
+	pkgreconciler "knative.dev/pkg/reconciler"
 	"knative.dev/pkg/system"
 	"knative.dev/pkg/webhook"
 )
@@ -44,20 +46,31 @@ func NewController(
 	secretInformer := secretinformer.Get(ctx)
 	options := webhook.GetOptions(ctx)
 
+	key := types.NamespacedName{
+		Namespace: system.Namespace(),
+		Name:      options.SecretName,
+	}
+
 	wh := &reconciler{
-		secretName:  options.SecretName,
+		LeaderAwareFuncs: pkgreconciler.LeaderAwareFuncs{
+			// Enqueue the key whenever we become leader.
+			PromoteFunc: func(bkt pkgreconciler.Bucket, enq func(pkgreconciler.Bucket, types.NamespacedName)) error {
+				enq(bkt, key)
+				return nil
+			},
+		},
+		key:         key,
 		serviceName: options.ServiceName,
 
 		client:       client,
 		secretlister: secretInformer.Lister(),
 	}
 
-	logger := logging.FromContext(ctx)
-	c := controller.NewImpl(wh, logger, "WebhookCertificates")
+	c := controller.NewImpl(wh, logging.FromContext(ctx), "WebhookCertificates")
 
 	// Reconcile when the cert bundle changes.
 	secretInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
-		FilterFunc: controller.FilterWithNameAndNamespace(system.Namespace(), wh.secretName),
+		FilterFunc: controller.FilterWithNameAndNamespace(key.Namespace, key.Name),
 		// It doesn't matter what we enqueue because we will always Reconcile
 		// the named MWH resource.
 		Handler: controller.HandleAll(c.Enqueue),
diff --git a/webhook/configmaps/configmaps.go b/webhook/configmaps/configmaps.go
index 4d466aa8f..c2e7da0e6 100644
--- a/webhook/configmaps/configmaps.go
+++ b/webhook/configmaps/configmaps.go
@@ -28,6 +28,7 @@ import (
 	admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/kubernetes"
 	admissionlisters "k8s.io/client-go/listers/admissionregistration/v1"
 	corelisters "k8s.io/client-go/listers/core/v1"
@@ -37,6 +38,7 @@ import (
 	"knative.dev/pkg/kmp"
 	"knative.dev/pkg/logging"
 	"knative.dev/pkg/ptr"
+	pkgreconciler "knative.dev/pkg/reconciler"
 	"knative.dev/pkg/system"
 	"knative.dev/pkg/webhook"
 	certresources "knative.dev/pkg/webhook/certificates/resources"
@@ -45,8 +47,9 @@ import (
 // reconciler implements the AdmissionController for ConfigMaps
 type reconciler struct {
 	webhook.StatelessAdmissionImpl
+	pkgreconciler.LeaderAwareFuncs
 
-	name         string
+	key          types.NamespacedName
 	path         string
 	constructors map[string]reflect.Value
 
@@ -58,6 +61,7 @@ type reconciler struct {
 }
 
 var _ controller.Reconciler = (*reconciler)(nil)
+var _ pkgreconciler.LeaderAware = (*reconciler)(nil)
 var _ webhook.AdmissionController = (*reconciler)(nil)
 var _ webhook.StatelessAdmissionController = (*reconciler)(nil)
 
@@ -65,6 +69,11 @@ var _ webhook.StatelessAdmissionController = (*reconciler)(nil)
 func (ac *reconciler) Reconcile(ctx context.Context, key string) error {
 	logger := logging.FromContext(ctx)
 
+	if !ac.IsLeaderFor(ac.key) {
+		logger.Debugf("Skipping key %q, not the leader.", ac.key)
+		return nil
+	}
+
 	secret, err := ac.secretlister.Secrets(system.Namespace()).Get(ac.secretName)
 	if err != nil {
 		logger.Errorf("Error fetching secret: %v", err)
@@ -120,7 +129,7 @@ func (ac *reconciler) reconcileValidatingWebhook(ctx context.Context, caCert []b
 		},
 	}}
 
-	configuredWebhook, err := ac.vwhlister.Get(ac.name)
+	configuredWebhook, err := ac.vwhlister.Get(ac.key.Name)
 	if err != nil {
 		return fmt.Errorf("error retrieving webhook: %w", err)
 	}
diff --git a/webhook/configmaps/controller.go b/webhook/configmaps/controller.go
index bf1b7b039..895d07af7 100644
--- a/webhook/configmaps/controller.go
+++ b/webhook/configmaps/controller.go
@@ -24,11 +24,13 @@ import (
 	kubeclient "knative.dev/pkg/client/injection/kube/client"
 	vwhinformer "knative.dev/pkg/client/injection/kube/informers/admissionregistration/v1/validatingwebhookconfiguration"
 	secretinformer "knative.dev/pkg/injection/clients/namespacedkube/informers/core/v1/secret"
+	"knative.dev/pkg/logging"
+	pkgreconciler "knative.dev/pkg/reconciler"
 
+	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/tools/cache"
 	"knative.dev/pkg/configmap"
 	"knative.dev/pkg/controller"
-	"knative.dev/pkg/logging"
 	"knative.dev/pkg/system"
 	"knative.dev/pkg/webhook"
 )
@@ -45,8 +47,18 @@ func NewAdmissionController(
 	secretInformer := secretinformer.Get(ctx)
 	options := webhook.GetOptions(ctx)
 
+	key := types.NamespacedName{Name: name}
+
 	wh := &reconciler{
-		name: name,
+		LeaderAwareFuncs: pkgreconciler.LeaderAwareFuncs{
+			// Have this reconciler enqueue our singleton whenever it becomes leader.
+			PromoteFunc: func(bkt pkgreconciler.Bucket, enq func(pkgreconciler.Bucket, types.NamespacedName)) error {
+				enq(bkt, key)
+				return nil
+			},
+		},
+
+		key:  key,
 		path: path,
 
 		constructors: make(map[string]reflect.Value),
@@ -61,8 +73,7 @@ func NewAdmissionController(
 		wh.registerConfig(configName, constructor)
 	}
 
-	logger := logging.FromContext(ctx)
-	c := controller.NewImpl(wh, logger, "ConfigMapWebhook")
+	c := controller.NewImpl(wh, logging.FromContext(ctx), "ConfigMapWebhook")
 
 	// Reconcile when the named ValidatingWebhookConfiguration changes.
 	vwhInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
diff --git a/webhook/psbinding/controller.go b/webhook/psbinding/controller.go
index 567ddaefc..3967c053b 100644
--- a/webhook/psbinding/controller.go
+++ b/webhook/psbinding/controller.go
@@ -30,6 +30,7 @@ import (
 	duckv1 "knative.dev/pkg/apis/duck/v1"
 	"knative.dev/pkg/controller"
 	"knative.dev/pkg/logging"
+	pkgreconciler "knative.dev/pkg/reconciler"
 	"knative.dev/pkg/system"
 	"knative.dev/pkg/webhook"
 )
@@ -66,6 +67,8 @@ type GetListAll func(context.Context, cache.ResourceEventHandler) ListAll
 // to NewAdmissionController and BaseReconciler.
 type BindableContext func(context.Context, Bindable) (context.Context, error)
 
+var sentinel = types.NamespacedName{}
+
 // NewAdmissionController constructs the webhook portion of the pair of
 // reconcilers that implement the semantics of our Binding.
 func NewAdmissionController(
@@ -86,9 +89,15 @@ func NewAdmissionController(
 	wh := NewReconciler(name, path, options.SecretName, client, mwhInformer.Lister(), secretInformer.Lister(), withContext, reconcilerOptions...)
 	c := controller.NewImpl(wh, logging.FromContext(ctx), name)
 
+	// Enqueue a sentinel when we become leader.
+	wh.PromoteFunc = func(bkt pkgreconciler.Bucket, enq func(pkgreconciler.Bucket, types.NamespacedName)) error {
+		enq(bkt, sentinel)
+		return nil
+	}
+
 	// It doesn't matter what we enqueue because we will always Reconcile
 	// the named MWH resource.
-	handler := controller.HandleAll(c.EnqueueSentinel(types.NamespacedName{}))
+	handler := controller.HandleAll(c.EnqueueSentinel(sentinel))
 
 	// Reconcile when the named MutatingWebhookConfiguration changes.
 	mwhInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
diff --git a/webhook/psbinding/psbinding.go b/webhook/psbinding/psbinding.go
index 3b28ea84e..0b89705c7 100644
--- a/webhook/psbinding/psbinding.go
+++ b/webhook/psbinding/psbinding.go
@@ -41,6 +41,7 @@ import (
 	"knative.dev/pkg/controller"
 	"knative.dev/pkg/logging"
 	"knative.dev/pkg/ptr"
+	pkgreconciler "knative.dev/pkg/reconciler"
 	"knative.dev/pkg/system"
 	"knative.dev/pkg/webhook"
 	certresources "knative.dev/pkg/webhook/certificates/resources"
@@ -97,6 +98,8 @@ func NewReconciler(
 //  2. Admit: which leverages the index built by the Reconciler to apply
 //     mutations to resources.
 type Reconciler struct {
+	pkgreconciler.LeaderAwareFuncs
+
 	Name        string
 	HandlerPath string
 	SecretName  string
@@ -120,6 +123,7 @@ type Reconciler struct {
 }
 
 var _ controller.Reconciler = (*Reconciler)(nil)
+var _ pkgreconciler.LeaderAware = (*Reconciler)(nil)
 var _ webhook.AdmissionController = (*Reconciler)(nil)
 
 // We need to specifically exclude our deployment(s) from consideration, but this provides a way
@@ -302,6 +306,12 @@ func (ac *Reconciler) reconcileMutatingWebhook(ctx context.Context, caCert []byt
 		ac.inexact = inexact
 	}()
 
+	// After we've updated our indices, bail out unless we are the leader.
+	// Only the leader should be mutating the webhook.
+	if !ac.IsLeaderFor(sentinel) {
+		return nil
+	}
+
 	rules := make([]admissionregistrationv1.RuleWithOperations, 0, len(gks))
 	for gk, versions := range gks {
 		plural := strings.ToLower(inflect.Pluralize(gk.Kind))
diff --git a/webhook/psbinding/reconciler.go b/webhook/psbinding/reconciler.go
index 28e2dd258..eced30b4a 100644
--- a/webhook/psbinding/reconciler.go
+++ b/webhook/psbinding/reconciler.go
@@ -41,6 +41,7 @@ import (
 	"knative.dev/pkg/controller"
 	"knative.dev/pkg/kmeta"
 	"knative.dev/pkg/logging"
+	pkgreconciler "knative.dev/pkg/reconciler"
 	"knative.dev/pkg/tracker"
 )
 
@@ -52,6 +53,8 @@ var jsonLabelPatch = map[string]interface{}{
 
 // BaseReconciler helps implement controller.Reconciler for Binding resources.
 type BaseReconciler struct {
+	pkgreconciler.LeaderAwareFuncs
+
 	// The GVR of the "primary key" resource for this reconciler.
 	// This is used along with the DynamicClient for updating the status
 	// and managing finalizers of the resources being reconciled.
@@ -89,6 +92,7 @@ type BaseReconciler struct {
 
 // Check that our Reconciler implements controller.Reconciler
 var _ controller.Reconciler = (*BaseReconciler)(nil)
+var _ pkgreconciler.LeaderAware = (*BaseReconciler)(nil)
 
 // Reconcile implements controller.Reconciler
 func (r *BaseReconciler) Reconcile(ctx context.Context, key string) error {
@@ -99,6 +103,15 @@ func (r *BaseReconciler) Reconcile(ctx context.Context, key string) error {
 		return nil
 	}
 
+	// Only the leader should reconcile binding resources.
+	if !r.IsLeaderFor(types.NamespacedName{
+		Namespace: namespace,
+		Name:      name,
+	}) {
+		logging.FromContext(ctx).Debugf("Skipping key %q, not the leader.", key)
+		return nil
+	}
+
 	// Get the resource with this namespace/name.
 	original, err := r.Get(namespace, name)
 	if apierrs.IsNotFound(err) {
diff --git a/webhook/resourcesemantics/conversion/controller.go b/webhook/resourcesemantics/conversion/controller.go
index cd8f6884d..a53915a87 100644
--- a/webhook/resourcesemantics/conversion/controller.go
+++ b/webhook/resourcesemantics/conversion/controller.go
@@ -29,6 +29,7 @@ import (
 	"knative.dev/pkg/controller"
 	secretinformer "knative.dev/pkg/injection/clients/namespacedkube/informers/core/v1/secret"
 	"knative.dev/pkg/logging"
+	pkgreconciler "knative.dev/pkg/reconciler"
 	"knative.dev/pkg/system"
 	"knative.dev/pkg/webhook"
 )
@@ -89,13 +90,23 @@ func NewConversionController(
 	withContext func(context.Context) context.Context,
 ) *controller.Impl {
 
-	logger := logging.FromContext(ctx)
 	secretInformer := secretinformer.Get(ctx)
 	crdInformer := crdinformer.Get(ctx)
 	client := apixclient.Get(ctx)
 	options := webhook.GetOptions(ctx)
 
 	r := &reconciler{
+		LeaderAwareFuncs: pkgreconciler.LeaderAwareFuncs{
+			// Have this reconciler enqueue our types whenever it becomes leader.
+			PromoteFunc: func(bkt pkgreconciler.Bucket, enq func(pkgreconciler.Bucket, types.NamespacedName)) error {
+				for _, gkc := range kinds {
+					name := gkc.DefinitionName
+					enq(bkt, types.NamespacedName{Name: name})
+				}
+				return nil
+			},
+		},
+
 		kinds:       kinds,
 		path:        path,
 		secretName:  options.SecretName,
@@ -106,7 +117,7 @@ func NewConversionController(
 		crdLister:    crdInformer.Lister(),
 	}
 
-	c := controller.NewImpl(r, logger, "ConversionWebhook")
+	c := controller.NewImpl(r, logging.FromContext(ctx), "ConversionWebhook")
 
 	// Reconciler when the named CRDs change.
 	for _, gkc := range kinds {
diff --git a/webhook/resourcesemantics/conversion/reconciler.go b/webhook/resourcesemantics/conversion/reconciler.go
index 0d5d29bde..e2709ee80 100644
--- a/webhook/resourcesemantics/conversion/reconciler.go
+++ b/webhook/resourcesemantics/conversion/reconciler.go
@@ -24,17 +24,21 @@ import (
 	apixclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
 	apixlisters "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
 	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/types"
 	corelisters "k8s.io/client-go/listers/core/v1"
 	"knative.dev/pkg/controller"
 	"knative.dev/pkg/kmp"
 	"knative.dev/pkg/logging"
 	"knative.dev/pkg/ptr"
+	pkgreconciler "knative.dev/pkg/reconciler"
 	"knative.dev/pkg/system"
 	"knative.dev/pkg/webhook"
 	certresources "knative.dev/pkg/webhook/certificates/resources"
 )
 
 type reconciler struct {
+	pkgreconciler.LeaderAwareFuncs
+
 	kinds       map[schema.GroupKind]GroupKindConversion
 	path        string
 	secretName  string
@@ -47,6 +51,7 @@ type reconciler struct {
 
 var _ webhook.ConversionController = (*reconciler)(nil)
 var _ controller.Reconciler = (*reconciler)(nil)
+var _ pkgreconciler.LeaderAware = (*reconciler)(nil)
 
 // Path implements webhook.ConversionController
 func (r *reconciler) Path() string {
@@ -57,6 +62,11 @@ func (r *reconciler) Path() string {
 func (r *reconciler) Reconcile(ctx context.Context, key string) error {
 	logger := logging.FromContext(ctx)
 
+	if !r.IsLeaderFor(types.NamespacedName{Name: key}) {
+		logger.Debugf("Skipping key %q, not the leader.", key)
+		return nil
+	}
+
 	// Look up the webhook secret, and fetch the CA cert bundle.
 	secret, err := r.secretLister.Secrets(system.Namespace()).Get(r.secretName)
 	if err != nil {
diff --git a/webhook/resourcesemantics/defaulting/controller.go b/webhook/resourcesemantics/defaulting/controller.go
index 3f7a4822f..b33140588 100644
--- a/webhook/resourcesemantics/defaulting/controller.go
+++ b/webhook/resourcesemantics/defaulting/controller.go
@@ -23,11 +23,13 @@ import (
 	kubeclient "knative.dev/pkg/client/injection/kube/client"
 	mwhinformer "knative.dev/pkg/client/injection/kube/informers/admissionregistration/v1/mutatingwebhookconfiguration"
 	secretinformer "knative.dev/pkg/injection/clients/namespacedkube/informers/core/v1/secret"
+	"knative.dev/pkg/logging"
+	pkgreconciler "knative.dev/pkg/reconciler"
 
 	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/tools/cache"
 	"knative.dev/pkg/controller"
-	"knative.dev/pkg/logging"
 	"knative.dev/pkg/system"
 	"knative.dev/pkg/webhook"
 	"knative.dev/pkg/webhook/resourcesemantics"
@@ -47,8 +49,18 @@ func NewAdmissionController(
 	secretInformer := secretinformer.Get(ctx)
 	options := webhook.GetOptions(ctx)
 
+	key := types.NamespacedName{Name: name}
+
 	wh := &reconciler{
-		name:     name,
+		LeaderAwareFuncs: pkgreconciler.LeaderAwareFuncs{
+			// Have this reconciler enqueue our singleton whenever it becomes leader.
+			PromoteFunc: func(bkt pkgreconciler.Bucket, enq func(pkgreconciler.Bucket, types.NamespacedName)) error {
+				enq(bkt, key)
+				return nil
+			},
+		},
+
+		key:      key,
 		path:     path,
 		handlers: handlers,
 
diff --git a/webhook/resourcesemantics/defaulting/defaulting.go b/webhook/resourcesemantics/defaulting/defaulting.go
index 96081f40d..80d1dcc9a 100644
--- a/webhook/resourcesemantics/defaulting/defaulting.go
+++ b/webhook/resourcesemantics/defaulting/defaulting.go
@@ -32,6 +32,7 @@ import (
 	admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/kubernetes"
 	admissionlisters "k8s.io/client-go/listers/admissionregistration/v1"
 	corelisters "k8s.io/client-go/listers/core/v1"
@@ -41,6 +42,7 @@ import (
 	"knative.dev/pkg/kmp"
 	"knative.dev/pkg/logging"
 	"knative.dev/pkg/ptr"
+	pkgreconciler "knative.dev/pkg/reconciler"
 	"knative.dev/pkg/system"
 	"knative.dev/pkg/webhook"
 	certresources "knative.dev/pkg/webhook/certificates/resources"
@@ -52,8 +54,9 @@ var errMissingNewObject = errors.New("the new object may not be nil")
 // reconciler implements the AdmissionController for resources
 type reconciler struct {
 	webhook.StatelessAdmissionImpl
+	pkgreconciler.LeaderAwareFuncs
 
-	name     string
+	key      types.NamespacedName
 	path     string
 	handlers map[schema.GroupVersionKind]resourcesemantics.GenericCRD
 
@@ -68,6 +71,7 @@ type reconciler struct {
 }
 
 var _ controller.Reconciler = (*reconciler)(nil)
+var _ pkgreconciler.LeaderAware = (*reconciler)(nil)
 var _ webhook.AdmissionController = (*reconciler)(nil)
 var _ webhook.StatelessAdmissionController = (*reconciler)(nil)
 
@@ -75,6 +79,11 @@ var _ webhook.StatelessAdmissionController = (*reconciler)(nil)
 func (ac *reconciler) Reconcile(ctx context.Context, key string) error {
 	logger := logging.FromContext(ctx)
 
+	if !ac.IsLeaderFor(ac.key) {
+		logger.Debugf("Skipping key %q, not the leader.", ac.key)
+		return nil
+	}
+
 	// Look up the webhook secret, and fetch the CA cert bundle.
 	secret, err := ac.secretlister.Secrets(system.Namespace()).Get(ac.secretName)
 	if err != nil {
@@ -157,7 +166,7 @@ func (ac *reconciler) reconcileMutatingWebhook(ctx context.Context, caCert []byt
 		return lhs.Resources[0] < rhs.Resources[0]
 	})
 
-	configuredWebhook, err := ac.mwhlister.Get(ac.name)
+	configuredWebhook, err := ac.mwhlister.Get(ac.key.Name)
 	if err != nil {
 		return fmt.Errorf("error retrieving webhook: %w", err)
 	}
diff --git a/webhook/resourcesemantics/validation/controller.go b/webhook/resourcesemantics/validation/controller.go
index e86574f82..14cf6dd73 100644
--- a/webhook/resourcesemantics/validation/controller.go
+++ b/webhook/resourcesemantics/validation/controller.go
@@ -23,11 +23,13 @@ import (
 	kubeclient "knative.dev/pkg/client/injection/kube/client"
 	vwhinformer "knative.dev/pkg/client/injection/kube/informers/admissionregistration/v1/validatingwebhookconfiguration"
 	secretinformer "knative.dev/pkg/injection/clients/namespacedkube/informers/core/v1/secret"
+	"knative.dev/pkg/logging"
+	pkgreconciler "knative.dev/pkg/reconciler"
 
 	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/tools/cache"
 	"knative.dev/pkg/controller"
-	"knative.dev/pkg/logging"
 	"knative.dev/pkg/system"
 	"knative.dev/pkg/webhook"
 	"knative.dev/pkg/webhook/resourcesemantics"
@@ -62,7 +64,17 @@ func NewAdmissionController(
 	}
 
 	wh := &reconciler{
-		name:      name,
+		LeaderAwareFuncs: pkgreconciler.LeaderAwareFuncs{
+			// Have this reconciler enqueue our singleton whenever it becomes leader.
+			PromoteFunc: func(bkt pkgreconciler.Bucket, enq func(pkgreconciler.Bucket, types.NamespacedName)) error {
+				enq(bkt, types.NamespacedName{Name: name})
+				return nil
+			},
+		},
+
+		key: types.NamespacedName{
+			Name: name,
+		},
 		path:      path,
 		handlers:  handlers,
 		callbacks: unwrappedCallbacks,
diff --git a/webhook/resourcesemantics/validation/reconcile_config.go b/webhook/resourcesemantics/validation/reconcile_config.go
index a6818fa27..1537adc78 100644
--- a/webhook/resourcesemantics/validation/reconcile_config.go
+++ b/webhook/resourcesemantics/validation/reconcile_config.go
@@ -27,6 +27,7 @@ import (
 	admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/kubernetes"
 	admissionlisters "k8s.io/client-go/listers/admissionregistration/v1"
 	corelisters "k8s.io/client-go/listers/core/v1"
@@ -34,6 +35,7 @@ import (
 	"knative.dev/pkg/kmp"
 	"knative.dev/pkg/logging"
 	"knative.dev/pkg/ptr"
+	pkgreconciler "knative.dev/pkg/reconciler"
 	"knative.dev/pkg/system"
 	"knative.dev/pkg/webhook"
 	certresources "knative.dev/pkg/webhook/certificates/resources"
@@ -43,8 +45,9 @@ import (
 // reconciler implements the AdmissionController for resources
 type reconciler struct {
 	webhook.StatelessAdmissionImpl
+	pkgreconciler.LeaderAwareFuncs
 
-	name      string
+	key       types.NamespacedName
 	path      string
 	handlers  map[schema.GroupVersionKind]resourcesemantics.GenericCRD
 	callbacks map[schema.GroupVersionKind]Callback
@@ -60,6 +63,7 @@ type reconciler struct {
 }
 
 var _ controller.Reconciler = (*reconciler)(nil)
+var _ pkgreconciler.LeaderAware = (*reconciler)(nil)
 var _ webhook.AdmissionController = (*reconciler)(nil)
 var _ webhook.StatelessAdmissionController = (*reconciler)(nil)
 
@@ -72,6 +76,11 @@ func (ac *reconciler) Path() string {
 func (ac *reconciler) Reconcile(ctx context.Context, key string) error {
 	logger := logging.FromContext(ctx)
 
+	if !ac.IsLeaderFor(ac.key) {
+		logger.Debugf("Skipping key %q, not the leader.", ac.key)
+		return nil
+	}
+
 	// Look up the webhook secret, and fetch the CA cert bundle.
 	secret, err := ac.secretlister.Secrets(system.Namespace()).Get(ac.secretName)
 	if err != nil {
@@ -120,7 +129,7 @@ func (ac *reconciler) reconcileValidatingWebhook(ctx context.Context, caCert []b
 		return lhs.Resources[0] < rhs.Resources[0]
 	})
 
-	configuredWebhook, err := ac.vwhlister.Get(ac.name)
+	configuredWebhook, err := ac.vwhlister.Get(ac.key.Name)
 	if err != nil {
 		return fmt.Errorf("error retrieving webhook: %w", err)
 	}


Test patch:
diff --git a/webhook/certificates/certificates_test.go b/webhook/certificates/certificates_test.go
index 37cf580c9..a61936c75 100644
--- a/webhook/certificates/certificates_test.go
+++ b/webhook/certificates/certificates_test.go
@@ -24,10 +24,12 @@ import (
 
 	kubeclient "knative.dev/pkg/client/injection/kube/client/fake"
 	_ "knative.dev/pkg/injection/clients/namespacedkube/informers/core/v1/secret/fake"
+	pkgreconciler "knative.dev/pkg/reconciler"
 
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/types"
 	clientgotesting "k8s.io/client-go/testing"
 	"knative.dev/pkg/configmap"
 	"knative.dev/pkg/controller"
@@ -136,8 +138,11 @@ func TestReconcile(t *testing.T) {
 		return &reconciler{
 			client:       kubeclient.Get(ctx),
 			secretlister: listers.GetSecretLister(),
-			secretName:   secretName,
-			serviceName:  serviceName,
+			key: types.NamespacedName{
+				Namespace: system.Namespace(),
+				Name:      secretName,
+			},
+			serviceName: serviceName,
 		}
 	}))
 }
@@ -202,8 +207,11 @@ func TestReconcileMakeSecretFailure(t *testing.T) {
 		return &reconciler{
 			client:       kubeclient.Get(ctx),
 			secretlister: listers.GetSecretLister(),
-			secretName:   secretName,
-			serviceName:  serviceName,
+			key: types.NamespacedName{
+				Namespace: system.Namespace(),
+				Name:      secretName,
+			},
+			serviceName: serviceName,
 		}
 	}))
 }
@@ -216,6 +224,23 @@ func TestNew(t *testing.T) {
 	if c == nil {
 		t.Fatal("Expected NewController to return a non-nil value")
 	}
+
+	if want, got := 0, c.WorkQueue.Len(); want != got {
+		t.Errorf("WorkQueue.Len() = %d, wanted %d", got, want)
+	}
+
+	la, ok := c.Reconciler.(pkgreconciler.LeaderAware)
+	if !ok {
+		t.Fatalf("%T is not leader aware", c.Reconciler)
+	}
+
+	if err := la.Promote(pkgreconciler.UniversalBucket(), c.MaybeEnqueueBucketKey); err != nil {
+		t.Errorf("Promote() = %v", err)
+	}
+
+	if want, got := 1, c.WorkQueue.Len(); want != got {
+		t.Errorf("WorkQueue.Len() = %d, wanted %d", got, want)
+	}
 }
 
 func secretWithCertData(t *testing.T, expiration time.Time) *corev1.Secret {
diff --git a/webhook/configmaps/table_test.go b/webhook/configmaps/table_test.go
index c5953c6d3..d22e12817 100644
--- a/webhook/configmaps/table_test.go
+++ b/webhook/configmaps/table_test.go
@@ -23,11 +23,13 @@ import (
 
 	kubeclient "knative.dev/pkg/client/injection/kube/client/fake"
 	_ "knative.dev/pkg/injection/clients/namespacedkube/informers/core/v1/secret/fake"
+	pkgreconciler "knative.dev/pkg/reconciler"
 
 	admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/types"
 	clientgotesting "k8s.io/client-go/testing"
 	"knative.dev/pkg/configmap"
 	"knative.dev/pkg/controller"
@@ -293,7 +295,9 @@ func TestReconcile(t *testing.T) {
 
 	table.Test(t, MakeFactory(func(ctx context.Context, listers *Listers, cmw configmap.Watcher) controller.Reconciler {
 		wh := &reconciler{
-			name: name,
+			key: types.NamespacedName{
+				Name: name,
+			},
 			path: path,
 
 			client:       kubeclient.Get(ctx),
@@ -320,4 +324,21 @@ func TestNew(t *testing.T) {
 	if c == nil {
 		t.Fatal("Expected NewController to return a non-nil value")
 	}
+
+	if want, got := 0, c.WorkQueue.Len(); want != got {
+		t.Errorf("WorkQueue.Len() = %d, wanted %d", got, want)
+	}
+
+	la, ok := c.Reconciler.(pkgreconciler.LeaderAware)
+	if !ok {
+		t.Fatalf("%T is not leader aware", c.Reconciler)
+	}
+
+	if err := la.Promote(pkgreconciler.UniversalBucket(), c.MaybeEnqueueBucketKey); err != nil {
+		t.Errorf("Promote() = %v", err)
+	}
+
+	if want, got := 1, c.WorkQueue.Len(); want != got {
+		t.Errorf("WorkQueue.Len() = %d, wanted %d", got, want)
+	}
 }
diff --git a/webhook/psbinding/table_test.go b/webhook/psbinding/table_test.go
index 9ee1bb392..bd77d98f6 100644
--- a/webhook/psbinding/table_test.go
+++ b/webhook/psbinding/table_test.go
@@ -34,6 +34,7 @@ import (
 	dynamicclient "knative.dev/pkg/injection/clients/dynamicclient/fake"
 	secretinformer "knative.dev/pkg/injection/clients/namespacedkube/informers/core/v1/secret"
 	_ "knative.dev/pkg/injection/clients/namespacedkube/informers/core/v1/secret/fake"
+	pkgreconciler "knative.dev/pkg/reconciler"
 	"knative.dev/pkg/tracker"
 
 	admissionv1 "k8s.io/api/admission/v1"
@@ -1036,6 +1037,23 @@ func TestNew(t *testing.T) {
 	if c == nil {
 		t.Fatal("Expected NewController to return a non-nil value")
 	}
+
+	if want, got := 0, c.WorkQueue.Len(); want != got {
+		t.Errorf("WorkQueue.Len() = %d, wanted %d", got, want)
+	}
+
+	la, ok := c.Reconciler.(pkgreconciler.LeaderAware)
+	if !ok {
+		t.Fatalf("%T is not leader aware", c.Reconciler)
+	}
+
+	if err := la.Promote(pkgreconciler.UniversalBucket(), c.MaybeEnqueueBucketKey); err != nil {
+		t.Errorf("Promote() = %v", err)
+	}
+
+	if want, got := 1, c.WorkQueue.Len(); want != got {
+		t.Errorf("WorkQueue.Len() = %d, wanted %d", got, want)
+	}
 }
 
 func TestNewReconciler(t *testing.T) {
diff --git a/webhook/resourcesemantics/defaulting/table_test.go b/webhook/resourcesemantics/defaulting/table_test.go
index 6ac9aeb1e..36ab3bcab 100644
--- a/webhook/resourcesemantics/defaulting/table_test.go
+++ b/webhook/resourcesemantics/defaulting/table_test.go
@@ -22,12 +22,14 @@ import (
 
 	kubeclient "knative.dev/pkg/client/injection/kube/client/fake"
 	_ "knative.dev/pkg/injection/clients/namespacedkube/informers/core/v1/secret/fake"
+	pkgreconciler "knative.dev/pkg/reconciler"
 
 	admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/types"
 	clientgotesting "k8s.io/client-go/testing"
 	"knative.dev/pkg/configmap"
 	"knative.dev/pkg/controller"
@@ -324,7 +326,9 @@ func TestReconcile(t *testing.T) {
 
 	table.Test(t, MakeFactory(func(ctx context.Context, listers *Listers, cmw configmap.Watcher) controller.Reconciler {
 		return &reconciler{
-			name: name,
+			key: types.NamespacedName{
+				Name: name,
+			},
 			path: path,
 
 			handlers: handlers,
@@ -350,4 +354,21 @@ func TestNew(t *testing.T) {
 	if c == nil {
 		t.Fatal("Expected NewController to return a non-nil value")
 	}
+
+	if want, got := 0, c.WorkQueue.Len(); want != got {
+		t.Errorf("WorkQueue.Len() = %d, wanted %d", got, want)
+	}
+
+	la, ok := c.Reconciler.(pkgreconciler.LeaderAware)
+	if !ok {
+		t.Fatalf("%T is not leader aware", c.Reconciler)
+	}
+
+	if err := la.Promote(pkgreconciler.UniversalBucket(), c.MaybeEnqueueBucketKey); err != nil {
+		t.Errorf("Promote() = %v", err)
+	}
+
+	if want, got := 1, c.WorkQueue.Len(); want != got {
+		t.Errorf("WorkQueue.Len() = %d, wanted %d", got, want)
+	}
 }
diff --git a/webhook/resourcesemantics/validation/reconcile_config_test.go b/webhook/resourcesemantics/validation/reconcile_config_test.go
index 6dc98f461..9e7589411 100644
--- a/webhook/resourcesemantics/validation/reconcile_config_test.go
+++ b/webhook/resourcesemantics/validation/reconcile_config_test.go
@@ -22,12 +22,14 @@ import (
 
 	kubeclient "knative.dev/pkg/client/injection/kube/client/fake"
 	_ "knative.dev/pkg/injection/clients/namespacedkube/informers/core/v1/secret/fake"
+	pkgreconciler "knative.dev/pkg/reconciler"
 
 	admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/types"
 	clientgotesting "k8s.io/client-go/testing"
 	"knative.dev/pkg/configmap"
 	"knative.dev/pkg/controller"
@@ -324,7 +326,9 @@ func TestReconcile(t *testing.T) {
 
 	table.Test(t, MakeFactory(func(ctx context.Context, listers *Listers, cmw configmap.Watcher) controller.Reconciler {
 		return &reconciler{
-			name: name,
+			key: types.NamespacedName{
+				Name: name,
+			},
 			path: path,
 
 			handlers: handlers,
@@ -351,4 +355,21 @@ func TestNew(t *testing.T) {
 	if c == nil {
 		t.Fatal("Expected NewController to return a non-nil value")
 	}
+
+	if want, got := 0, c.WorkQueue.Len(); want != got {
+		t.Errorf("WorkQueue.Len() = %d, wanted %d", got, want)
+	}
+
+	la, ok := c.Reconciler.(pkgreconciler.LeaderAware)
+	if !ok {
+		t.Fatalf("%T is not leader aware", c.Reconciler)
+	}
+
+	if err := la.Promote(pkgreconciler.UniversalBucket(), c.MaybeEnqueueBucketKey); err != nil {
+		t.Errorf("Promote() = %v", err)
+	}
+
+	if want, got := 1, c.WorkQueue.Len(); want != got {
+		t.Errorf("WorkQueue.Len() = %d, wanted %d", got, want)
+	}
 }
diff --git a/webhook/resourcesemantics/validation/validation_admit_test.go b/webhook/resourcesemantics/validation/validation_admit_test.go
index ad48ebce7..53ca6f387 100644
--- a/webhook/resourcesemantics/validation/validation_admit_test.go
+++ b/webhook/resourcesemantics/validation/validation_admit_test.go
@@ -26,6 +26,7 @@ import (
 	_ "knative.dev/pkg/client/injection/kube/client/fake"
 	_ "knative.dev/pkg/client/injection/kube/informers/admissionregistration/v1/validatingwebhookconfiguration/fake"
 	_ "knative.dev/pkg/injection/clients/namespacedkube/informers/core/v1/secret/fake"
+	pkgreconciler "knative.dev/pkg/reconciler"
 
 	admissionv1 "k8s.io/api/admission/v1"
 	admissionregistrationv1 "k8s.io/api/admissionregistration/v1beta1"
@@ -634,10 +635,33 @@ func NewTestResourceAdmissionController(t *testing.T) *reconciler {
 	ctx = webhook.WithOptions(ctx, webhook.Options{
 		SecretName: "webhook-secret",
 	})
-	return NewAdmissionController(
+
+	c := NewAdmissionController(
 		ctx, testResourceValidationName, testResourceValidationPath,
 		handlers,
 		func(ctx context.Context) context.Context {
 			return ctx
-		}, true, callbacks).Reconciler.(*reconciler)
+		}, true, callbacks)
+	if c == nil {
+		t.Fatal("Expected NewController to return a non-nil value")
+	}
+
+	if want, got := 0, c.WorkQueue.Len(); want != got {
+		t.Errorf("WorkQueue.Len() = %d, wanted %d", got, want)
+	}
+
+	la, ok := c.Reconciler.(pkgreconciler.LeaderAware)
+	if !ok {
+		t.Fatalf("%T is not leader aware", c.Reconciler)
+	}
+
+	if err := la.Promote(pkgreconciler.UniversalBucket(), c.MaybeEnqueueBucketKey); err != nil {
+		t.Errorf("Promote() = %v", err)
+	}
+
+	if want, got := 1, c.WorkQueue.Len(); want != got {
+		t.Errorf("WorkQueue.Len() = %d, wanted %d", got, want)
+	}
+
+	return c.Reconciler.(*reconciler)
 }
diff --git a/webhook/testing/factory.go b/webhook/testing/factory.go
index 26d35db35..ad74000a6 100644
--- a/webhook/testing/factory.go
+++ b/webhook/testing/factory.go
@@ -24,6 +24,7 @@ import (
 	fakeapixclient "knative.dev/pkg/client/injection/apiextensions/client/fake"
 	fakekubeclient "knative.dev/pkg/client/injection/kube/client/fake"
 	fakedynamicclient "knative.dev/pkg/injection/clients/dynamicclient/fake"
+	"knative.dev/pkg/reconciler"
 
 	"knative.dev/pkg/configmap"
 	"knative.dev/pkg/controller"
@@ -33,6 +34,7 @@ import (
 	"k8s.io/apimachinery/pkg/api/meta"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/types"
 	ktesting "k8s.io/client-go/testing"
 	"k8s.io/client-go/tools/record"
 
@@ -99,6 +101,11 @@ func MakeFactory(ctor Ctor) rtesting.Factory {
 		// Update the context with the stuff we decorated it with.
 		r.Ctx = ctx
 
+		// If the reconcilers is leader aware, then promote it.
+		if la, ok := c.(reconciler.LeaderAware); ok {
+			la.Promote(reconciler.UniversalBucket(), func(reconciler.Bucket, types.NamespacedName) {})
+		}
+
 		for _, reactor := range r.WithReactors {
 			kubeClient.PrependReactor("*", "*", reactor)
 			apixClient.PrependReactor("*", "*", reactor)