Repository: knative/serving
Pull request #10412 (2020-12-21 08:39:27)

Set httpoption in kingress spec from cm
Signed-off-by: Arghya Sadhu <arghya88@gmail.com>

Fixes https://github.com/knative/networking/issues/299

<!-- Please include the 'why' behind your changes if no issue exists -->
## Proposed Changes

* Set httpoption in kingress spec from config map

**Release Note**

<!-- Enter your extended release note in the below block. If the PR requires
additional action from users switching to the new release, include the string
"action required". If no release note is required, write "NONE". -->

```release-note

```


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

This pull-request has been approved by: *<a href="https://github.com/knative/serving/pull/10412#" title="Author self-approved">arghya88</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **markusthoemmes** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @markusthoemmes` 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%2Fserving).

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

- **[pkg/reconciler/route/OWNERS](https://github.com/knative/serving/blob/master/pkg/reconciler/route/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":["markusthoemmes"]} -->
arghya88: /cc @mattmoor 
knative-prow-robot: @arghya88: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-serving-unit-tests | d4d12cc19220ec8f5e13dbf439c6d97fef715397 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/10412/pull-knative-serving-unit-tests/1340940637997895680) | `/test pull-knative-serving-unit-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative_serving/10412). [Your PR dashboard](https://gubernator.knative.dev/pr/arghya88).

<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 -->
arghya88: @ZhiminXiang any suggestion around how to fix the failing test `TestReconcileEnableAutoTLSHTTPDisabled` ? It's comparing kingress spec(where `HTTPOption` is `Enabled` because the cm has that) which is created from the config map with an ingress spec which has been modified to set `cfg.Network.HTTPProtocol = network.HTTPDisabled` and reconcile where `HTTPOption` is empty.

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-serving-unit-tests | 063b525dfd340eb2824b5734f2711639aac881e8 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/10412/pull-knative-serving-unit-tests/1341418920803831808) | `/test pull-knative-serving-unit-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative_serving/10412). [Your PR dashboard](https://gubernator.knative.dev/pr/arghya88).

<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 -->
ZhiminXiang: 


> @ZhiminXiang any suggestion around how to fix the failing test `TestReconcileEnableAutoTLSHTTPDisabled` ? It's comparing kingress spec(where `HTTPOption` is `Enabled` because the cm has that) which is created from the config map with an ingress spec which has been modified to set `cfg.Network.HTTPProtocol = network.HTTPDisabled` and reconcile where `HTTPOption` is empty.

As we don't plan to support HTTPDisabled, I think it is fine to remove that test.
codecov[bot]: # [Codecov](https://codecov.io/gh/knative/serving/pull/10412?src=pr&el=h1) Report
> Merging [#10412](https://codecov.io/gh/knative/serving/pull/10412?src=pr&el=desc) (7e7d407) into [master](https://codecov.io/gh/knative/serving/commit/a552782a89f67189962d20d6fcc5b36ae43b172e?el=desc) (a552782) will **decrease** coverage by `0.11%`.
> The diff coverage is `50.00%`.

[![Impacted file tree graph](https://codecov.io/gh/knative/serving/pull/10412/graphs/tree.svg?width=650&height=150&src=pr&token=MPpDfAj4Ui)](https://codecov.io/gh/knative/serving/pull/10412?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master   #10412      +/-   ##
==========================================
- Coverage   88.06%   87.95%   -0.12%     
==========================================
  Files         186      186              
  Lines        8795     8805      +10     
==========================================
- Hits         7745     7744       -1     
- Misses        812      817       +5     
- Partials      238      244       +6     
```


| [Impacted Files](https://codecov.io/gh/knative/serving/pull/10412?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [pkg/reconciler/route/route.go](https://codecov.io/gh/knative/serving/pull/10412/diff?src=pr&el=tree#diff-cGtnL3JlY29uY2lsZXIvcm91dGUvcm91dGUuZ28=) | `76.31% <ø> (ø)` | |
| [pkg/reconciler/route/resources/ingress.go](https://codecov.io/gh/knative/serving/pull/10412/diff?src=pr&el=tree#diff-cGtnL3JlY29uY2lsZXIvcm91dGUvcmVzb3VyY2VzL2luZ3Jlc3MuZ28=) | `94.15% <50.00%> (-2.47%)` | :arrow_down: |
| [pkg/reconciler/configuration/configuration.go](https://codecov.io/gh/knative/serving/pull/10412/diff?src=pr&el=tree#diff-cGtnL3JlY29uY2lsZXIvY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLmdv) | `84.37% <0.00%> (-3.91%)` | :arrow_down: |
| [pkg/autoscaler/statforwarder/leases.go](https://codecov.io/gh/knative/serving/pull/10412/diff?src=pr&el=tree#diff-cGtnL2F1dG9zY2FsZXIvc3RhdGZvcndhcmRlci9sZWFzZXMuZ28=) | `76.97% <0.00%> (-1.44%)` | :arrow_down: |
| [pkg/reconciler/autoscaling/kpa/scaler.go](https://codecov.io/gh/knative/serving/pull/10412/diff?src=pr&el=tree#diff-cGtnL3JlY29uY2lsZXIvYXV0b3NjYWxpbmcva3BhL3NjYWxlci5nbw==) | `88.57% <0.00%> (-1.43%)` | :arrow_down: |
| [cmd/activator/main.go](https://codecov.io/gh/knative/serving/pull/10412/diff?src=pr&el=tree#diff-Y21kL2FjdGl2YXRvci9tYWluLmdv) | `0.00% <0.00%> (ø)` | |
| [pkg/reconciler/route/traffic/rollout.go](https://codecov.io/gh/knative/serving/pull/10412/diff?src=pr&el=tree#diff-cGtnL3JlY29uY2lsZXIvcm91dGUvdHJhZmZpYy9yb2xsb3V0Lmdv) | `100.00% <0.00%> (ø)` | |
| [pkg/reconciler/revision/reconcile\_resources.go](https://codecov.io/gh/knative/serving/pull/10412/diff?src=pr&el=tree#diff-cGtnL3JlY29uY2lsZXIvcmV2aXNpb24vcmVjb25jaWxlX3Jlc291cmNlcy5nbw==) | `83.13% <0.00%> (+2.40%)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/knative/serving/pull/10412?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/serving/pull/10412?src=pr&el=footer). Last update [a552782...7e7d407](https://codecov.io/gh/knative/serving/pull/10412?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-serving-istio-stable-no-mesh-tls | 7e7d407826154cfe55d931ca10ea41883d90a119 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/10412/pull-knative-serving-istio-stable-no-mesh-tls/1341961542312136704) | `/test pull-knative-serving-istio-stable-no-mesh-tls`

[Full PR test history](https://gubernator.knative.dev/pr/knative_serving/10412). [Your PR dashboard](https://gubernator.knative.dev/pr/arghya88).

<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 -->
arghya88: /retest
knative-prow-robot: @arghya88: 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>
nak3: @arghya88  Sorry to keep you waiting. Could you please rebase this PR?
arghya88: > @arghya88 Sorry to keep you waiting. Could you please rebase this PR?

Done
knative-prow-robot: @arghya88: 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-prow-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **markusthoemmes** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @markusthoemmes` 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%2Fserving).

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

- **[pkg/reconciler/route/OWNERS](https://github.com/knative/serving/blob/master/pkg/reconciler/route/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":["markusthoemmes"]} -->
knative-prow-robot: @arghya88: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-serving-istio-stable-no-mesh | 27991b9d590284a8a732f1a56332306a6fc3c07f | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/10412/pull-knative-serving-istio-stable-no-mesh/1368131280339734528) | `/test pull-knative-serving-istio-stable-no-mesh`

[Full PR test history](https://gubernator.knative.dev/pr/knative_serving/10412). [Your PR dashboard](https://gubernator.knative.dev/pr/arghya88).

<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 -->
arghya88: /retest
ZhiminXiang: /lgtm
knative-prow-robot: New changes are detected. LGTM label has been removed.
knative-prow-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **nak3** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @nak3` 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%2Fserving).

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

- **[pkg/reconciler/route/OWNERS](https://github.com/knative/serving/blob/main/pkg/reconciler/route/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":["nak3"]} -->

Patch:
diff --git a/docs/runtime-contract.md b/docs/runtime-contract.md
index 39a9171af..befa8a1c8 100644
--- a/docs/runtime-contract.md
+++ b/docs/runtime-contract.md
@@ -1,539 +1,4 @@
 # Knative Runtime Contract
 
-## Abstract
-
-The Knative serverless compute infrastructure extends the
-[Open Container Initiative Runtime Specification](https://github.com/opencontainers/runtime-spec/blob/master/spec.md)
-to describe the functionality and requirements for serverless execution
-workloads. In contrast to general-purpose containers, stateless
-request-triggered (i.e. on-demand) autoscaled containers have the following
-properties:
-
-- Little or no long-term runtime state (especially in cases where code might be
-  scaled to zero in the absence of request traffic).
-- Logging and monitoring aggregation (telemetry) is important for understanding
-  and debugging the system, as containers might be created or deleted at any
-  time in response to autoscaling.
-- Multitenancy is highly desirable to allow cost sharing for bursty applications
-  on relatively stable underlying hardware resources.
-
-This contract does not define the control surfaces over the runtime environment
-except by [reference to the Knative Kubernetes resources](spec/spec.md).
-Similarly, this contract does not define the implementation of metrics or
-logging aggregation, except to provide a contract for the collection of logging
-data. It is expected that access to the aggregated telemetry will be provided by
-the platform operator.
-
-## Background
-
-The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
-"SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" are to be
-interpreted as described in [RFC 2119](https://tools.ietf.org/html/rfc2119).
-
-The
-[OCI specification](https://github.com/opencontainers/runtime-spec/blob/master/spec.md)
-([v1.0.1](https://github.com/opencontainers/runtime-spec/blob/v1.0.1/spec.md))
-is the basis for this document. When this document and the OCI specification
-conflict, this document is assumed to override the general OCI recommendations.
-Where this document does not specify behavior, runtime implementations SHOULD be
-OCI compliant with respect to those features. Additionally, the core Knative
-definition assumes the
-[Linux Container Configuration](https://github.com/opencontainers/runtime-spec/blob/master/config-linux.md).
-
-In particular, the default Knative implementation relies on Kubernetes behavior
-to implement container operation. In some cases, current Kubernetes behavior in
-2018 is not as performant as envisioned in this documentation. The goal of the
-Knative authors is to push as much of the needed functionality into Kubernetes
-and/or HTTP routers as possible, rather than implementing reach-around layers.
-
-This document considers two users of a given Knative environment, and is
-particularly concerned with the expectations of _developers_ (and _language and
-tooling developers_, by extension) running code in the environment.
-
-- **Developers** write code which is packaged into a container which is run on
-  the Knative cluster.
-  - **Language and tooling developers** typically write tools used by
-    _developers_ to package code into containers. As such, they are concerned
-    that tooling which wraps developer code complies with this runtime contract.
-- **Operators** (also known as **platform providers**) provision the compute
-  resources and manage the software configuration of Knative and the underlying
-  abstractions (for example, Linux, Kubernetes, etc).
-
-## Runtime and Lifecycle
-
-Knative aims to minimize the amount of tuning and production configuration
-needed to run a service. Some of these production-friendly features include:
-
-1.  Stateless computation at request-scale or event-scale granularity.
-1.  Automatic scaling between 0 and many instances (the process scale-out
-    model).
-1.  Automatic adjustment of resource requirements based on observed behavior,
-    where possible.
-
-In order to achieve these properties, containers which are operated as part of a
-serverless platform are expected to observe the following properties:
-
-- Fast startup time (<1s until a request or event can be processed, given
-  container image layer caching),
-- Minimize local state (in support of autoscaling and scale to zero),
-- CPU usage only while requests are active (see
-  [this issue](https://github.com/knative/serving/issues/848) for reasons an
-  operator might want to de-allocate CPU between requests).
-
-### State
-
-In a highly-shared environment, containers might experience the following:
-
-- Containers with `status` of `stopped` MAY be immediately reclaimed by the
-  system.
-- The container process MAY be started as pid 0, through the use of PID
-  namespaces or other processes.
-
-### Lifecycle
-
-- The container MAY be killed when the container is inactive. Containers MUST be
-  considered "active" while they are handling at least one request, but other
-  conditions MAY also be used to determine that a container is active. The
-  container is sent a `SIGTERM` signal when it is killed via the
-  [OCI specification's `kill`](https://github.com/opencontainers/runtime-spec/blob/master/runtime.md#kill)
-  command to allow for a graceful shutdown of existing resources and
-  connections. If the container has not shut down after a defined grace period,
-  the container is forcibly killed via a `SIGKILL` signal.
-- The environment MAY restrict the use of `prestart`, `poststart`, and
-  `poststop` hooks to platform operators rather than developers. All of these
-  hooks are defined in the context of the runtime namespace, rather than the
-  container namespace, and might expose system-level information (and are
-  non-portable).
-- Failures of the developer-specified process MUST be logged to a
-  developer-visible logging system.
-
-In addition, some serverless environments MAY use an execution model other than
-docker in linux (for example, [runv](https://github.com/hyperhq/runv) or
-[Kata Containers](https://katacontainers.io/)). Implementations using an
-execution model beyond docker in linux MAY alter the lifecycle contract beyond
-the OCI specification as long as:
-
-1.  An OCI-compliant lifecycle contract is the default, regardless of how many
-    extensions are provided.
-1.  The implementation of an extended execution model or lifecycle MUST provide
-    documentation about the extended model or lifecycle **and** documentation
-    about how to opt in to the extended lifecycle contract.
-
-### Errors
-
-- Platforms MAY provide mechanisms for post-mortem viewing of filesystem
-  contents from a particular execution. Because containers (particularly failing
-  containers) can experience frequent starts, operators or platform providers
-  SHOULD limit the total space consumed by these failures.
-
-### Warnings
-
-As specified by OCI.
-
-### Operations
-
-It is expected that containers do not have direct access to the
-[OCI interface](https://github.com/opencontainers/runtime-spec/blob/v1.0.0-rc3/runtime.md#operations)
-as providing access allows containers to circumvent runtime restrictions that
-are enforced by the Knative control plane. The operator or platform provider MAY
-have the ability to directly interact with the OCI interface, but that is beyond
-the scope of this specification.
-
-An OPTIONAL method of invoking the `kill` operation MAY be exposed to developers
-to provide signalling to the container.
-
-### Hooks
-
-Operation hooks
-[SHOULD NOT](https://github.com/knative/serving/blob/main/test/conformance/runtime/container_test.go)
-be configurable by the Knative developer. Operators or platform providers MAY
-use hooks to implement their own lifecycle controls.
-
-### Linux Runtime
-
-#### File descriptors
-
-A read from the `stdin` file descriptor on the container
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/file_descriptor_test.go)
-always result in `EOF`. The `stdout` and `stderr` file descriptors on the
-container SHOULD be collected and retained in a developer-accessible logging
-repository. (TODO:[docs#902](https://github.com/knative/docs/issues/902)).
-
-Within the container, pipes and file descriptors can be used to communicate
-between processes running in the same container.
-
-#### Dev symbolic links
-
-As specified by OCI.
-
-## Network Environment
-
-For request-response functions, 0->many scaling is enabled by control of the
-inbound request path to enable capturing and stalling inbound requests until an
-autoscaled container is available to serve that request.
-
-### Inbound network connectivity
-
-Inbound network connectivity is assumed to use HTTP/1.1 compatible transport.
-
-#### Protocols and Ports
-
-The container MUST accept HTTP/1.1 requests from the environment. The
-environment SHOULD
-[offer an HTTP/2.0 upgrade option](https://httpwg.org/specs/rfc7540.html#discover-http)
-(`Upgrade: h2c` on either the initial request or an `OPTIONS` request) on the
-same port as HTTP/1.1. The developer MAY specify this port at deployment; if the
-developer does not specify a port, the platform provider MUST provide a default.
-Only one inbound `containerPort`
-[SHALL](https://github.com/knative/serving/blob/main/test/conformance/runtime/container_test.go)
-be specified in the
-[`core.v1.Container`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#containerport-v1-core)
-specification. The `hostPort` parameter
-[SHOULD NOT](https://github.com/knative/serving/blob/main/test/conformance/runtime/container_test.go)
-be set by the developer or the platform provider, as it can interfere with
-ingress autoscaling. Regardless of its source, the selected port will be made
-available in the `PORT` environment variable.
-
-The platform provider SHOULD configure the platform to perform HTTPS termination
-and protocol transformation e.g. between QUIC or HTTP/2 and HTTP/1.1. Developers
-ought not need to implement multiple transports between the platform and their
-code. Unless overridden by setting the
-[`name`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#containerport-v1-core)
-field on the inbound port, the platform will perform automatic detection as
-described above. If the
-[`core.v1.Container.ports[0].name`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#containerport-v1-core)
-is set to one of the following values, HTTP negotiation will be disabled and the
-following protocol will be used:
-
-- `http1`: HTTP/1.1 transport and will not attempt to upgrade to h2c..
-- `h2c`: HTTP/2 transport, as described in
-  [section 3.4 of the HTTP2 spec (Starting HTTP/2 with Prior Knowledge)](https://httpwg.org/specs/rfc7540.html#known-http)
-
-Developers ought to use automatic content negotiation where available, and MUST
-NOT set the `name` field to arbitrary values, as additional transports might be
-defined in the future. Developers can assume all traffic is intermediated by an
-L7 proxy. Developers can not assume a direct network connection between their
-server process and client processes.
-
-#### Headers
-
-As requests to the container will be proxied by the platform, all inbound
-request headers
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/header_test.go)
-be set to the same values as the incoming request. Some implementations MAY
-strip certain HTTP headers for security or other reasons; such implementations
-SHOULD document the set of stripped headers. Because the full set of HTTP
-headers is constantly evolving, it is RECOMMENDED that platforms which strip
-headers define a common prefix which covers all headers removed by the platform.
-
-In addition, the following base set of HTTP/1.1 headers
-[MUST](https://github.com/knative/serving/blob/main/test/conformance/runtime/header_test.go)
-be set on the request:
-
-- `Host` - As specified by
-  [RFC 7230 Section 5.4](https://tools.ietf.org/html/rfc7230#section-5.4)
-
-Also, the following proxy-specific request headers
-[MUST](https://github.com/knative/serving/blob/main/test/conformance/runtime/header_test.go)
-be set:
-
-- `Forwarded` - As specified by [RFC 7239](https://tools.ietf.org/html/rfc7239).
-
-Additionally, the following legacy headers
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/header_test.go)
-be set for compatibility with client software:
-
-- `X-Forwarded-For`
-- `X-Forwarded-Proto`
-
-In addition, the following headers
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/header_test.go)
-be set to enable tracing and observability features:
-
-- Trace headers - Platform providers SHOULD provide and document headers needed
-  to propagate trace contexts,
-  [in the absence of w3c standardization](https://www.w3.org/2018/04/distributed-tracing-wg-charter.html).
-
-Operators and platform providers MAY provide additional headers to provide
-environment specific information.
-
-#### Meta Requests
-
-The
-[`core.v1.Container`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#container-v1-core)
-object allows specifying both a
-[`readinessProbe`](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#define-readiness-probes)
-and a
-[`livenessProbe`](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#define-a-liveness-http-request).
-If not provided, container startup and listening on the declared HTTP socket is
-considered sufficient to declare the container "ready" and "live" (see the probe
-definition below). If specified, liveness and readiness probes are REQUIRED to
-be of the `httpGet` or `tcpSocket` types, and
-[MUST](https://github.com/knative/serving/blob/main/test/conformance/runtime/container_test.go)
-target the inbound container port; platform providers SHOULD disallow other
-probe methods.
-
-Because serverless platforms automatically scale instances based on inbound
-requests, and because noncompliant (or even failing) containers might be
-provided by developers, the following defaults SHOULD be applied by the platform
-provider if not set by the developer. The probes are intended to be trivially
-supportable by naive conforming containers while preventing interference with
-developer code. These settings apply to both `livenessProbe` and
-`readinessProbe`:
-
-- `tcpSocket` set to the container's port
-- `initialDelaySeconds` set to 0
-- `periodSeconds` set to platform-specific value
-
-Setting `initialDelaySeconds` to a value greater than 0 impacts container
-startup time (aka cold start time) as a container will not serve traffic until
-the probe succeeds.
-
-##### Deployment probe
-
-On the initial deployment, platform providers
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/readiness_probe_test.go)
-start an instance of the container to validate that the container is valid and
-will become ready. This startup
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/readiness_probe_test.go)
-occur even if the container would not serve any user requests. If a container
-cannot satisfy the `readinessProbe` during deployment startup, the Revision
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/readiness_probe_test.go)
-be marked as failed.
-
-Initial readiness probes allow the platform to avoid attempting to later
-provision or scale deployments (Revisions) which cannot become healthy, and act
-as a backstop to developer testing (via CI/CD or otherwise) which has been
-performed on the supplied container. Common causes of these failures can
-include: malformed dynamic code not tested in the container, environment
-differences between testing and deployment environment, and missing or
-misconfigured backends. This also provides an opportunity for the container to
-be run at least once despite scale-to-zero guarantees.
-
-### Outbound network connectivity
-
-OCI does not specify any properties of the network environment in which a
-container runs. The following items are OPTIONAL additions to the runtime
-contract which describe services which might be of particular value to platform
-providers.
-
-#### DNS
-
-Platform providers SHOULD override the DNS related configuration files under
-`/etc` to enable local DNS lookups in the target environment (see
-[Default Filesystems](#default-filesystems)).
-
-#### Metadata Services
-
-Platform providers MAY provide a network service to provide introspection and
-environment information to the running process. Such a network service SHOULD be
-an HTTP server with an operator- or provider-defined URL schema. If a metadata
-service is provided, the schema MUST be documented. Sample use cases for such
-metadata include:
-
-- Container information or control interfaces.
-- Host information, including maintenance or capability information.
-- Access to external configuration stores (such as the Kubernetes ConfigMap
-  APIs).
-- Access to secrets or identity tokens, to enable key rotation.
-
-## Configuration
-
-### Root
-
-Platform providers MAY set the `readonly` bit on the container to `true` in
-order to reduce the possible disk space provisioning and management of
-serverless workloads. Containers MUST use the provided temporary storage areas
-(see [Default Filesystems](#default-filesystems)) for working files and caches.
-
-### Mounts
-
-In general, stateless applications package their dependencies within the
-container and do not rely on mutable external state for templates, logging
-configuration, etc. In some cases, it might be necessary for certain application
-settings to be overridden at deploy time (for example, database backends or
-authentication credentials). When these settings need to be loaded via a file,
-read-only mounts of application configuration and secrets are supported by
-`ConfigMap` and `Secrets` volumes. Platform providers MAY apply updates to
-`Secrets` and `ConfigMaps` while the application is running; these updates could
-complicate rollout and rollback. It is up to the developer to choose appropriate
-policies for mounting and updating `ConfigMap` and `Secrets` which are mounted
-as volumes.
-
-As serverless applications are expected to scale horizontally and statelessly,
-per-container volumes are likely to introduce state and scaling bottlenecks and
-are NOT RECOMMENDED.
-
-### Process
-
-Serverless applications which scale horizontally are expected to be managed in a
-declarative fashion, and individual instances SHOULD NOT be interacted with or
-connected directly.
-
-- The `terminal` property
-  [SHOULD NOT](https://github.com/knative/serving/blob/main/test/conformance/runtime/filesystem_test.go)
-  be set to `true`.
-- The linux process specific properties MUST NOT be configurable by the
-  developer, and MAY set by the operator or platform provider.
-
-The following environment variables
-[MUST](https://github.com/knative/serving/blob/main/test/conformance/runtime/envvars_test.go)
-be set:
-
-| Name   | Meaning                                                                                                                                             |
-| ------ | --------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `PORT` | Ingress `containerPort` for ingress requests and health checks. See [Inbound network connectivity](#inbound-network-connectivity) for more details. |
-
-The following environment variables
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/envvars_test.go)
-be set:
-
-| Name              | Meaning                                                                                                          |
-| ----------------- | ---------------------------------------------------------------------------------------------------------------- |
-| `K_REVISION`      | Name of the current Revision.                                                                                    |
-| `K_CONFIGURATION` | Name of the Configuration that created the current Revision.                                                     |
-| `K_SERVICE`       | If the current Revision has been created by manipulating a Knative Service object, name of this Knative Service. |
-
-Platform providers MAY set additional environment variables. Standardization of
-such variables will follow demonstrated usage and utility.
-
-### User
-
-Developers MAY specify that containers be run as a specific user or group ID
-using the `runAsUser` container property. If specified, the runtime
-[MUST](https://github.com/knative/serving/blob/main/test/conformance/runtime/user_test.go)
-run the container as the specified user ID if allowed by the platform (see
-below). If no `runAsUser` is specified, a platform-specific default SHALL be
-used. Platform Providers SHOULD document this default behavior.
-
-Operators and Platform Providers MAY prohibit certain user IDs, such as `root`,
-from executing code. In this case, if the identity selected by the developer is
-invalid, the container execution
-[MUST](https://github.com/knative/serving/blob/main/test/conformance/runtime/container_test.go)
-be failed.
-
-### Default Filesystems
-
-The OCI specification describes a default container environment which can be
-used for many different purposes, including containerization of existing legacy
-or stateful processes which might store substantial amounts of on-disk state. In
-a scaled-out, stateless environment, container startup and teardown is
-accelerated when on-disk resources are kept to a minimum. Additionally,
-developers might not have access to the container's filesystems (or the
-containers might be rapidly recycled), so log aggregation SHOULD be provided.
-
-In addition to the filesystems recommended in the OCI, the following filesystems
-[MUST](https://github.com/knative/serving/blob/main/test/conformance/runtime/filesystem_test.go)
-be provided:
-
-| Mount      | Description                                                                                                                                                     |
-| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `/tmp`     | MUST be Read-write.<p>SHOULD be backed by tmpfs if disk load is a concern.                                                                                      |
-| `/var/log` | MAY be a directory with write permissions for logs storage. Implementations MAY permit the creation of additional subdirectories and log rotation and renaming. |
-
-To enable DNS resolution, the following files might be overwritten at runtime:
-
-| File               | Description                                                                                                                                                          |
-| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `/etc/hosts`       | MAY be overridden to provide host mappings for well-known or provider-specific resources.                                                                            |
-| `/etc/hostname`    | some environments MAY set this to a different value for each container, but other environments might use the same value for all containers.                          |
-| `/etc/resolv.conf` | SHOULD be set to a valid cluster-specific recursive resolver. Providers MAY provide additional default search domains to improve customer experience in the cluster. |
-
-Platform providers MAY provide additional platform-specific mount points
-(example: shared read-only object stores or DB connection brokers). If provided,
-the location and contents of the mount points SHOULD be documented by the
-platform provider.
-
-### Namespaces
-
-The namespace configuration MUST be provided by the operator or platform
-provider; developers or container providers MUST NOT set or assume a particular
-namespace configuration.
-
-### Devices
-
-Developers MUST NOT use OCI `devices` to request additional devices beyond the
-[OCI specification "Default Devices"](https://github.com/opencontainers/runtime-spec/blob/master/config-linux.md#default-devices).
-
-### Control Groups
-
-Control group (cgroups) controllers
-[MUST](https://github.com/knative/serving/blob/main/test/conformance/runtime/cgroup_test.go)
-be selected and configured by the operator or platform provider. The cgroup
-devices
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/cgroup_test.go)
-be mounted as read-only.
-
-#### Memory and CPU limits
-
-The serverless platform MAY automatically adjust the resource limits (e.g. CPU)
-based on observed resource usage. The limits enforced to a container
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/cgroup_test.go)
-be exposed in
-
-- `/sys/fs/cgroup/memory/memory.limit_in_bytes`
-- `/sys/fs/cgroup/cpu/cpu.cfs_period_us`
-- `/sys/fs/cgroup/cpu/cpu.cfs_quota_us`
-
-Additionally, operators or the platform MAY restrict or prevent CPU scheduling
-for instances when no requests are active,
-[where this capability is available](https://github.com/knative/serving/issues/848).
-The Knative authors are currently discussing the best implementations options
-for this feature with the Kubernetes SIG-Node team.
-
-### Sysctl
-
-The sysctl parameter applies system-wide kernel parameter tuning, which could
-interfere with other workloads on the host system. This is not appropriate for a
-shared environment, and
-[SHOULD NOT](https://github.com/knative/serving/blob/main/test/conformance/runtime/sysctl_test.go)
-be exposed for developer tuning.
-
-### Seccomp
-
-Seccomp provides a mechanism for further restricting the set of linux syscalls
-permitted to the processes running inside the container environment. A seccomp
-sandbox MAY be enforced by the platform operator; any such application profiles
-SHOULD be configured and applied in a consistent mechanism outside of the
-container specification. A seccomp policy MAY be part of the platform security
-configuration that operators can tune over time as the threat environment
-changes.
-
-### Rootfs Mount Propagation
-
-From the OCI spec:
-
-> `rootfsPropagation` (string, OPTIONAL) sets the rootfs's mount propagation.
-> Its value is either slave,<!-- wokeignore:rule=slave --> private, shared or
-> unbindable. The
-> [Shared Subtrees](https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt)
-> article in the kernel documentation has more information about mount
-> propagation.
-
-This option MAY be set by the operator or platform provider, and MUST NOT be
-configurable by the developer. Mount propagation MAY be part of the platform
-security configuration that operators can tune over time as the threat
-environment changes.
-
-### Masked Paths
-
-This option MAY be set by the operator or platform provider, and MUST NOT be
-configurable by the developer. Masked paths MAY be part of the platform security
-configuration that operators can tune over time as the threat environment
-changes.
-
-### Readonly Paths
-
-This option MAY only be set by the operator or platform provider, and MUST NOT
-be configurable by the developer.
-
-### Posix-platform Hooks
-
-Operation hooks
-[SHOULD NOT](https://github.com/knative/serving/blob/main/test/conformance/runtime/container_test.go)
-be configurable by the developer. Operators or platform providers MAY use hooks
-to implement their own lifecycle controls.
-
-### Annotations
-
-As specified by OCI.
+This file has been moved to the
+[Knative Specs Repository](https://github.com/knative/specs/blob/main/specs/serving/runtime-contract.md)
diff --git a/docs/spec/README.md b/docs/spec/README.md
index 13d641c6c..7b687428f 100644
--- a/docs/spec/README.md
+++ b/docs/spec/README.md
@@ -1,13 +1,4 @@
 # Knative Serving Specification
 
-The Knative Serving specifications have been moved. See the links below for
-document locations:
-
-- [Knative Serving API Specification](https://github.com/knative/docs/blob/main/docs/serving/spec/).
-- [Knative Serving Runtime Specification](https://github.com/knative/serving/blob/main/docs/runtime-contract.md)
-- [Knative Serving Conformance Tests](/test/conformance)
-
-Docs in this directory:
-
-- [Motivation and goals](motivation.md)
-- [Resource type overview](overview.md)
+This file has been moved to the
+[Knative Specs Repository](https://github.com/knative/specs/blob/main/specs/serving/README.md)
diff --git a/docs/spec/errors.md b/docs/spec/errors.md
index 9a3e676b9..7fcbef571 100644
--- a/docs/spec/errors.md
+++ b/docs/spec/errors.md
@@ -1,9 +1,4 @@
 # Error Conditions and Reporting
 
-This document has been replaced by the
-[Error Signalling](https://github.com/knative/docs/blob/main/docs/serving/spec/knative-api-specification-1.0.md#error-signalling)
-section of the
-[Knative API Specification](https://github.com/knative/docs/blob/main/docs/serving/spec/knative-api-specification-1.0.md).
-
-Specification documents can be found in the
-[Knative Docs Repository](https://github.com/knative/docs/tree/main/docs/serving/spec).
+This file has been moved to the
+[Knative Specs Repository](https://github.com/knative/specs/blob/main/specs/serving/errors.md)
diff --git a/docs/spec/motivation.md b/docs/spec/motivation.md
index d1ba87050..4e235ccf2 100644
--- a/docs/spec/motivation.md
+++ b/docs/spec/motivation.md
@@ -1,19 +1,4 @@
 # Motivation
 
-The goal of the Knative Serving project is to provide a common toolkit and API
-framework for serverless workloads.
-
-We define serverless workloads as computing workloads that are:
-
-- Stateless
-- Amenable to the process scale-out model
-- Primarily driven by application level (L7 -- HTTP, for example) request
-  traffic
-
-While Kubernetes provides basic primitives like Deployment, and Service in
-support of this model, our experience suggests that a more compact and richer
-opinionated model has substantial benefit for developers. In particular, by
-standardizing on higher-level primitives which perform substantial amounts of
-automation of common infrastructure, it should be possible to build consistent
-toolkits that provide a richer experience than updating yaml files with
-`kubectl`.
+This file has been moved to the
+[Knative Specs Repository](https://github.com/knative/specs/blob/main/specs/serving/motivation.md)
diff --git a/docs/spec/normative_examples.md b/docs/spec/normative_examples.md
index b4f11c05d..becc54bc8 100644
--- a/docs/spec/normative_examples.md
+++ b/docs/spec/normative_examples.md
@@ -1,4 +1,4 @@
 # Sample API Usage
 
-Serving client documentation can now be found in the
-[Knative Client Repository](https://github.com/knative/client).
+This file has been moved to the
+[Knative Specs Repository](https://github.com/knative/specs/blob/main/specs/serving/normative_examples.md)
diff --git a/docs/spec/overview.md b/docs/spec/overview.md
index ebdf6e17c..90e1b79bd 100644
--- a/docs/spec/overview.md
+++ b/docs/spec/overview.md
@@ -1,89 +1,4 @@
 # Resource Types
 
-The primary resources in the Knative Serving API are Routes, Revisions,
-Configurations, and Services:
-
-- A **Route** provides a named endpoint and a mechanism for routing traffic to
-
-- **Revisions**, which are immutable snapshots of code + config, created by a
-
-- **Configuration**, which acts as a stream of environments for Revisions.
-
-- **Service** acts as a top-level container for managing a Route and
-  Configuration which implement a network service.
-
-![Object model](images/object_model.png)
-
-## Route
-
-**Route** provides a network endpoint for a user's service (which consists of a
-series of software and configuration Revisions over time). A kubernetes
-namespace can have multiple routes. The route provides a long-lived, stable,
-named, HTTP-addressable endpoint that is backed by one or more **Revisions**.
-The default configuration is for the route to automatically route traffic to the
-latest revision created by a **Configuration**. For more complex scenarios, the
-API supports splitting traffic on a percentage basis, and CI tools could
-maintain multiple configurations for a single route (e.g. "golden path" and
-“experiments”) or reference multiple revisions directly to pin revisions during
-an incremental rollout and n-way traffic split. The route can optionally assign
-addressable subdomains to any or all backing revisions.
-
-## Revision
-
-**Revision** is an immutable snapshot of code and configuration. A revision
-references a container image. Revisions are created by updates to a
-**Configuration**.
-
-Revisions that are not addressable via a Route may be garbage collected and all
-underlying K8s resources will be deleted. Revisions that are addressable via a
-Route will have resource utilization proportional to the load they are under.
-
-## Configuration
-
-A **Configuration** describes the desired latest Revision state, and creates and
-tracks the status of Revisions as the desired state is updated. A configuration
-will reference a container image and associated execution metadata needed by the
-Revision. On updates to a Configuration's spec, a new Revision will be created;
-the Configuration's controller will track the status of created Revisions and
-makes the most recently created and most recently _ready_ Revisions available in
-the status section.
-
-## Service
-
-A **Service** encapsulates a **Route** and **Configuration** which together
-provide a software component. Service exists to provide a singular abstraction
-which can be access controlled, reasoned about, and which encapsulates software
-lifecycle decisions such as rollout policy and team resource ownership. Service
-acts only as an orchestrator of the underlying Route and Configuration (much as
-a kubernetes Deployment orchestrates ReplicaSets). Its usage is optional but
-recommended.
-
-The Service's controller will track the statuses of its owned Configuration and
-Route, reflecting their statuses and conditions as its own.
-
-The owned Configuration's Ready conditions are surfaced as the Service's
-ConfigurationsReady condition. The owned Routes' Ready conditions are surfaced
-as the Service's RoutesReady condition.
-
-## Orchestration
-
-Revisions are created indirectly when a Configuration is created or updated.
-This provides:
-
-- a single referenceable resource for the route to perform automated rollouts
-- a single resource that can be watched to see a history of all the revisions
-  created
-- PATCH semantics for revisions implemented server-side, minimizing
-  read-modify-write implemented across multiple clients, which could result in
-  optimistic concurrency errors
-- the ability to rollback to a known good configuration
-
-Update operations on the service enable scenarios such as:
-
-- _"Push image, keep config":_ Specifying a new revision with updated image,
-  inheriting configuration such as env vars from the configuration.
-- _"Update config, keep image"_: Specifying a new revision as just a change to
-  configuration, such as updating an env variable, inheriting all other
-  configuration and image.
-- _"Execute a controlled rollout"_: Updating the service's traffic spec allows
-  testing of revisions before making them live, and controlled rollouts.
+This file has been moved to the
+[Knative Specs Repository](https://github.com/knative/specs/blob/main/specs/serving/overview.md)
diff --git a/go.mod b/go.mod
index 7b93f3455..cf666aea2 100644
--- a/go.mod
+++ b/go.mod
@@ -15,7 +15,7 @@ require (
 	github.com/emicklei/go-restful v2.15.0+incompatible // indirect
 	github.com/go-openapi/spec v0.20.2 // indirect
 	github.com/gogo/protobuf v1.3.2
-	github.com/google/go-cmp v0.5.4
+	github.com/google/go-cmp v0.5.5
 	github.com/google/go-containerregistry v0.4.1-0.20210128200529-19c2b639fab1
 	github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20210129212729-5c4818de4025
 	github.com/google/gofuzz v1.2.0
@@ -28,7 +28,7 @@ require (
 	github.com/prometheus/client_model v0.2.0
 	github.com/sirupsen/logrus v1.7.0 // indirect
 	github.com/tsenart/vegeta/v12 v12.8.4
-	go.opencensus.io v0.22.6
+	go.opencensus.io v0.23.0
 	go.uber.org/atomic v1.7.0
 	go.uber.org/automaxprocs v1.4.0
 	go.uber.org/goleak v1.1.10
@@ -43,7 +43,7 @@ require (
 	golang.org/x/tools v0.1.0 // indirect
 	gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e // indirect
 	google.golang.org/api v0.36.0
-	google.golang.org/grpc v1.35.0
+	google.golang.org/grpc v1.36.0
 	gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
 	k8s.io/api v0.19.7
 	k8s.io/apimachinery v0.19.7
@@ -52,9 +52,9 @@ require (
 	k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027 // indirect
 	k8s.io/kube-openapi v0.0.0-20210113233702-8566a335510f
 	k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 // indirect
-	knative.dev/caching v0.0.0-20210311181225-4b366c7a9f99
-	knative.dev/hack v0.0.0-20210309141825-9b73a256fd9a
-	knative.dev/networking v0.0.0-20210311182125-f51c10d6fcf0
-	knative.dev/pkg v0.0.0-20210311174826-40488532be3f
+	knative.dev/caching v0.0.0-20210315185901-a31ce171642b
+	knative.dev/hack v0.0.0-20210317214554-58edbdc42966
+	knative.dev/networking v0.0.0-20210316192342-33105c61ff74
+	knative.dev/pkg v0.0.0-20210315160101-6a33a1ab29ac
 	sigs.k8s.io/yaml v1.2.0
 )
diff --git a/go.sum b/go.sum
index d826184d3..8e82096f7 100644
--- a/go.sum
+++ b/go.sum
@@ -379,6 +379,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M=
 github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-containerregistry v0.4.1-0.20210128200529-19c2b639fab1 h1:o2ykCuuhHeUwtzNg89pH2hi+821aqjLWkaREVR3ziTQ=
 github.com/google/go-containerregistry v0.4.1-0.20210128200529-19c2b639fab1/go.mod h1:GU9FUA/X9rd2cV3ZoUNaWihp27tki6/38EsVzL2Dyzc=
 github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20210129212729-5c4818de4025 h1:3o5qj2tOnL5eMB9b8YbcJ25sJI8oLrfy6Z0YYZl6lGY=
@@ -654,6 +656,8 @@ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt2
 github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
 github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM=
 github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
+github.com/prometheus/common v0.19.0 h1:Itb4+NjG9wRdkAWgVucbM/adyIXxEhbw0866e0uZE6A=
+github.com/prometheus/common v0.19.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
@@ -764,8 +768,8 @@ go.opencensus.io v0.22.4-0.20200608061201-1901b56b9515/go.mod h1:yxeiOL68Rb0Xd1d
 go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0=
 go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
-go.opencensus.io v0.22.6 h1:BdkrbWrzDlV9dnbzoP7sfN+dHheJ4J9JOaYxcUDL+ok=
-go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
+go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
+go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
 go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
@@ -1172,8 +1176,8 @@ google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM
 google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
 google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
 google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/grpc v1.35.0 h1:TwIQcH3es+MojMVojxxfQ3l3OF2KzlRxML2xZq0kRo8=
-google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.36.0 h1:o1bcQ6imQMIOpdrO3SWf2z5RV72WbDwdXuK0MDlc8As=
+google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -1282,14 +1286,16 @@ k8s.io/utils v0.0.0-20200729134348-d5654de09c73 h1:uJmqzgNWG7XyClnU/mLPBWwfKKF1K
 k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 h1:0T5IaWHO3sJTEmCP6mUlBvMukxPKUQWqiI/YuiBNMiQ=
 k8s.io/utils v0.0.0-20210111153108-fddb29f9d009/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-knative.dev/caching v0.0.0-20210311181225-4b366c7a9f99 h1:9Vk10+Eu7oXH+aZ4pVfeYo6A+N3tfKIU8n31tWDTFZk=
-knative.dev/caching v0.0.0-20210311181225-4b366c7a9f99/go.mod h1:OlAEAfCSUjHVetZp/hpMw3lzAGHfTEQyu2a5dgf/7Qo=
+knative.dev/caching v0.0.0-20210315185901-a31ce171642b h1:E6uZ2Xih+NBmuibPuO7r+9wMoUlXS9/jUpopGPQgr8o=
+knative.dev/caching v0.0.0-20210315185901-a31ce171642b/go.mod h1:JExFIO3iGOray3B4woPTLpzt8GKYevG9WYh0FSRNFLA=
 knative.dev/hack v0.0.0-20210309141825-9b73a256fd9a h1:0UGKyvFzY1Czu0lP9+0IrJhwtKe2oNLI2GYa7MIQ5c0=
 knative.dev/hack v0.0.0-20210309141825-9b73a256fd9a/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
-knative.dev/networking v0.0.0-20210311182125-f51c10d6fcf0 h1:TSc8t5E5UIjSqMltmPXIwuTqzx/NqzWhy286izs8I2I=
-knative.dev/networking v0.0.0-20210311182125-f51c10d6fcf0/go.mod h1:dBcp0JBxATXsbCKK43cA6LxTricz4Ur3dPHataW5J64=
-knative.dev/pkg v0.0.0-20210311174826-40488532be3f h1:WBgC84Ldkyvt+25osB1pfrNXH9LKoXvr3BptANZWvIE=
-knative.dev/pkg v0.0.0-20210311174826-40488532be3f/go.mod h1:pn/vClSL/iCW40TlFR91EhtmMmsyPQR2V2LavDAOOMs=
+knative.dev/hack v0.0.0-20210317214554-58edbdc42966 h1:qSnMQkq4gnhD5Hb8Mpfn7IrpkiQFhXXFPOA7uIl2lAc=
+knative.dev/hack v0.0.0-20210317214554-58edbdc42966/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
+knative.dev/networking v0.0.0-20210316192342-33105c61ff74 h1:6Ixdq/laiSkhpq46yba2R/sQXiFoBe5Hhj8oVGx2I/c=
+knative.dev/networking v0.0.0-20210316192342-33105c61ff74/go.mod h1:+sMDbs4w95CF/3sIXaOpHdLpdtEuhWmy/qfybQDt2ZA=
+knative.dev/pkg v0.0.0-20210315160101-6a33a1ab29ac h1:aGbaOcyNqxnvvujRtSMfkwehPER3TTsAw5mgCVqYZ08=
+knative.dev/pkg v0.0.0-20210315160101-6a33a1ab29ac/go.mod h1:7swdJzGy7U6iq8538vt2yFsZJqmnSAxMFexWK9Ktyes=
 modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=
 modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=
 modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=
diff --git a/pkg/reconciler/route/resources/ingress.go b/pkg/reconciler/route/resources/ingress.go
index ae82e4856..532a4a19f 100644
--- a/pkg/reconciler/route/resources/ingress.go
+++ b/pkg/reconciler/route/resources/ingress.go
@@ -193,9 +193,22 @@ func makeIngressSpec(
 		}
 	}
 
+	var httpOption netv1alpha1.HTTPOption
+
+	switch config.FromContext(ctx).Network.HTTPProtocol {
+	case network.HTTPEnabled:
+		httpOption = netv1alpha1.HTTPOptionEnabled
+	case network.HTTPRedirected:
+		httpOption = netv1alpha1.HTTPOptionRedirected
+	// This will be deprecated soon
+	case network.HTTPDisabled:
+		httpOption = ""
+	}
+
 	return netv1alpha1.IngressSpec{
-		Rules: rules,
-		TLS:   tls,
+		Rules:      rules,
+		TLS:        tls,
+		HTTPOption: httpOption,
 	}, nil
 }
 
diff --git a/pkg/reconciler/route/route.go b/pkg/reconciler/route/route.go
index b0aefd33e..e5d5ce919 100644
--- a/pkg/reconciler/route/route.go
+++ b/pkg/reconciler/route/route.go
@@ -148,7 +148,6 @@ func (c *Reconciler) ReconcileKind(ctx context.Context, r *v1.Route) pkgreconcil
 	if err != nil {
 		return err
 	}
-
 	// Reconcile ingress and its children resources.
 	ingress, effectiveRO, err := c.reconcileIngress(ctx, r, traffic, tls, ingressClassForRoute(ctx, r), acmeChallenges...)
 	if err != nil {
diff --git a/support/COMMUNITY_CONTACTS.md b/support/COMMUNITY_CONTACTS.md
index 0702c633d..c071c3bf4 100644
--- a/support/COMMUNITY_CONTACTS.md
+++ b/support/COMMUNITY_CONTACTS.md
@@ -34,11 +34,12 @@ community contact's duty (subject to change) is as followed:
 - Check the
   [knative-users@](https://groups.google.com/forum/#!forum/knative-users)
   mailing list and `@serving-help` on Slack for unanswered questions.
-- Check Serving
-  [unassigned issues / untriaged issues](https://github.com/knative/serving/issues?q=is%3Aopen+is%3Aissue+no%3Aassignee+no%3Amilestone)
-  for unanswered questions.
+- [Triage issues in the serving repo](./TRIAGE.md). Quick links:
+  - [Untriaged issues](https://github.com/knative/serving/issues?q=is%3Aissue+is%3Aopen+-label%3Atriage%2Faccepted+-label%3Atriage%2Fneeds-user-input)
+  - [User feedback issues updated more than 3 days ago](https://github.com/knative/serving/issues?q=is%3Aissue+is%3Aopen+label%3Atriage%2Fneeds-user-input+updated%3A%3C%3D2021-03-13)
+    -- **YOU NEED TO UPDATE THE DATE IN THE QUERY**
 - Check Docs
-  [unassigned issues / untriaged issues](https://github.com/knative/docs/issues?q=is%3Aopen+is%3Aissue+no%3Aassignee+no%3Amilestone)
+  [unassigned issues / untriaged issues](https://github.com/knative/docs/issues?q=is%3Aopen+is%3Aissue+label%3Akind%2Fserving+label%3Atriage%2Fneeds-eng-input)
   for unanswered questions.
 - Answer relevant
   [Stack Overflow Questions](https://stackoverflow.com/questions/tagged/knative-serving?tab=Newest)
@@ -67,21 +68,13 @@ rotation, feel free to send a PR to remove yourself.
 
 # Schedule
 
-| week       | contact                                             |
-| ---------- | --------------------------------------------------- |
-| 2020-12-14 | [tcnghia](https://github.com/tcnghia)               |
-| 2020-12-21 | [nak3](https://github.com/nak3)                     |
-| 2020-12-28 | [vagababov](https://github.com/vagababov)           |
-| 2021-01-04 | [mattmoor](https://github.com/mattmoor)             |
-| 2021-01-11 | [vagababov](https://github.com/vagababov)           |
-| 2021-01-18 | [markusthoemmes](https://github.com/markusthoemmes) |
-| 2021-01-25 | [julz](https://github.com/julz)                     |
-| 2021-02-01 | [ZhiminXiang](https://github.com/ZhiminXiang)       |
-| 2021-02-08 | [JRBANCEL](https://github.com/JRBANCEL)             |
-| 2021-02-15 | [nak3](https://github.com/nak3)                     |
-| 2021-02-22 | [yanweiguo](https://github.com/yanweiguo)           |
-| 2021-03-01 | [dprotaso](https://github.com/dprotaso)             |
-| 2021-03-08 | [tcnghia](https://github.com/tcnghia)               |
-| 2021-03-15 | [evankanderson](https://github.com/evankanderson)   |
-| 2021-03-22 | [ZhiminXiang](https://github.com/ZhiminXiang)       |
-| 2021-03-29 | [yanweiguo](https://github.com/yanweiguo)           |
+See [a machine-readable schedule here](schedule.rotation). The format is:
+
+```
+# comment lines are okay
+#@ metadata: value of the metadata
+RFC3339-date  |  username
+```
+
+You can see the current oncall at https://knative.party/ (which reads the
+machine-readable file).
diff --git a/support/TRIAGE.md b/support/TRIAGE.md
new file mode 100644
index 000000000..b7372ad6e
--- /dev/null
+++ b/support/TRIAGE.md
@@ -0,0 +1,54 @@
+# Triage process
+
+This is heavily inspired by [this blog post](https://apenwarr.ca/log/20171213),
+but that's a long read, so here's the short version.
+
+The goal of triage is to make sure that the following are handled quickly:
+
+- New bugs or issues, some of which might be high priority
+- Consumer (developer or administrator) updates to an issue which might not be
+  on the immediate radar of a contributor
+
+The goal is for the project to be responsive to outside requests, while
+shielding most of the team from the interrupt-y work of watching the triage
+queue. An additional goal is to protect and respect the time of the triager /
+support user.
+
+For triage, the goal is to handle _all_ the bugs on the following lists
+(searches):
+
+- [Untriaged issues](https://github.com/knative/serving/issues?q=is%3Aissue+is%3Aopen+-label%3Atriage%2Faccepted+-label%3Atriage%2Fneeds-user-input)
+- [User feedback issues updated more than 3 days ago](https://github.com/knative/serving/issues?q=is%3Aissue+is%3Aopen+label%3Atriage%2Fneeds-user-input+updated%3A%3C%3D2021-03-13)
+  -- **YOU NEED TO UPDATE THE DATE IN THE QUERY**
+
+When doing triage, the goal is to quickly process issues, getting them into the
+right "bin". For small issues and user questions, it's reasonable to reply in
+the issue with documentation or a reference to another issue, but you should
+avoid _fixing_ anything when triaging -- if you're making PRs during triage,
+you're doing it wrong.
+
+At the end of reading an issue, you should do one of the following:
+
+1. If the issue is clear and applies to serving, ensure it has the correct
+   `/kind` and `/area` assigned. If you know enough, feel free to `/assign` to
+   an individual, but area assignments should be sufficient for triage. Also
+   consider if it is a `/good-first-issue`. After this, also mark the issue as
+   `/triage accepted`, so it drops out of the list above.
+
+1. Move it to the correct repo (for example, Istio-specific questions should
+   probably go to `net-istio`). In some cases, you may need to create a new
+   issue in the new repo and link / copy the current issue. If you do this, be
+   sure to `@mention` the requestor and others on the old issue, and then
+   `/close` the issue is serving with a link to the other repo.
+
+1. If it's not clear what the problem or issue is, add a note for the requestor
+   (or occasionally some other user on the thread), make sure that there is a
+   reasonable `/kind` on the issue and mark it as `/triage needs-user-input` so
+   that it's off the list for a few days. If a `needs-user-input` issue persists
+   for longer than a week or so (past a second followup), it's reasonable to
+   `/close` the issue and encourage the requester to reopen if they have more
+   detail.
+
+1. If the request can be resolved with documentation, is infeasable, or
+   complete, follow up directly in the issue with the information, and `/close`
+   the issue.
diff --git a/support/support.rotation b/support/support.rotation
new file mode 100644
index 000000000..94abf28f8
--- /dev/null
+++ b/support/support.rotation
@@ -0,0 +1,23 @@
+# Serving community contacts
+#
+# Begin metadata
+#@ title: Serving
+#@ slack: #serving-questions
+#@ slacklink: https://knative.slack.com/archives/C0186KU7STW
+
+2020-12-14T01:00:00Z | tcnghia
+2020-12-21T01:00:00Z | nak3
+2020-12-28T01:00:00Z | vagababov
+2021-01-04T01:00:00Z | mattmoor
+2021-01-11T01:00:00Z | vagababov
+2021-01-18T01:00:00Z | markusthoemmes
+2021-01-25T01:00:00Z | julz
+2021-02-01T01:00:00Z | ZhiminXiang
+2021-02-08T01:00:00Z | JRBANCEL
+2021-02-15T01:00:00Z | nak3
+2021-02-22T01:00:00Z | yanweiguo
+2021-03-01T01:00:00Z | dprotaso
+2021-03-08T01:00:00Z | tcnghia
+2021-03-15T01:00:00Z | evankanderson
+2021-03-22T01:00:00Z | ZhiminXiang
+2021-03-29T01:00:00Z | yanweiguo
diff --git a/third_party/VENDOR-LICENSE/golang.org/x/xerrors/LICENSE b/third_party/VENDOR-LICENSE/golang.org/x/xerrors/LICENSE
deleted file mode 100644
index e4a47e17f..000000000
--- a/third_party/VENDOR-LICENSE/golang.org/x/xerrors/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2019 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-   * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-   * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
-   * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go
index 51ce36fb6..e4ffca838 100644
--- a/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go
+++ b/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go
@@ -11,7 +11,6 @@ import (
 	"time"
 
 	"github.com/google/go-cmp/cmp"
-	"golang.org/x/xerrors"
 )
 
 func equateAlways(_, _ interface{}) bool { return true }
@@ -147,10 +146,3 @@ func areConcreteErrors(x, y interface{}) bool {
 	_, ok2 := y.(error)
 	return ok1 && ok2
 }
-
-func compareErrors(x, y interface{}) bool {
-	xe := x.(error)
-	ye := y.(error)
-	// TODO(≥go1.13): Use standard definition of errors.Is.
-	return xerrors.Is(xe, ye) || xerrors.Is(ye, xe)
-}
diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/errors_go113.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/errors_go113.go
new file mode 100644
index 000000000..26fe25d6a
--- /dev/null
+++ b/vendor/github.com/google/go-cmp/cmp/cmpopts/errors_go113.go
@@ -0,0 +1,15 @@
+// Copyright 2021, The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.13
+
+package cmpopts
+
+import "errors"
+
+func compareErrors(x, y interface{}) bool {
+	xe := x.(error)
+	ye := y.(error)
+	return errors.Is(xe, ye) || errors.Is(ye, xe)
+}
diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/errors_xerrors.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/errors_xerrors.go
new file mode 100644
index 000000000..6eeb8d6e6
--- /dev/null
+++ b/vendor/github.com/google/go-cmp/cmp/cmpopts/errors_xerrors.go
@@ -0,0 +1,18 @@
+// Copyright 2021, The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !go1.13
+
+// TODO(≥go1.13): For support on <go1.13, we use the xerrors package.
+// Drop this file when we no longer support older Go versions.
+
+package cmpopts
+
+import "golang.org/x/xerrors"
+
+func compareErrors(x, y interface{}) bool {
+	xe := x.(error)
+	ye := y.(error)
+	return xerrors.Is(xe, ye) || xerrors.Is(ye, xe)
+}
diff --git a/vendor/github.com/google/go-cmp/cmp/report_compare.go b/vendor/github.com/google/go-cmp/cmp/report_compare.go
index a6c070cfc..104bb3053 100644
--- a/vendor/github.com/google/go-cmp/cmp/report_compare.go
+++ b/vendor/github.com/google/go-cmp/cmp/report_compare.go
@@ -79,7 +79,7 @@ func (opts formatOptions) verbosity() uint {
 	}
 }
 
-const maxVerbosityPreset = 3
+const maxVerbosityPreset = 6
 
 // verbosityPreset modifies the verbosity settings given an index
 // between 0 and maxVerbosityPreset, inclusive.
@@ -100,7 +100,7 @@ func verbosityPreset(opts formatOptions, i int) formatOptions {
 func (opts formatOptions) FormatDiff(v *valueNode, ptrs *pointerReferences) (out textNode) {
 	if opts.DiffMode == diffIdentical {
 		opts = opts.WithVerbosity(1)
-	} else {
+	} else if opts.verbosity() < 3 {
 		opts = opts.WithVerbosity(3)
 	}
 
diff --git a/vendor/github.com/google/go-cmp/cmp/report_slices.go b/vendor/github.com/google/go-cmp/cmp/report_slices.go
index da04caf16..168f92f3c 100644
--- a/vendor/github.com/google/go-cmp/cmp/report_slices.go
+++ b/vendor/github.com/google/go-cmp/cmp/report_slices.go
@@ -26,8 +26,6 @@ func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool {
 		return false // No differences detected
 	case !v.ValueX.IsValid() || !v.ValueY.IsValid():
 		return false // Both values must be valid
-	case v.Type.Kind() == reflect.Slice && (v.ValueX.Len() == 0 || v.ValueY.Len() == 0):
-		return false // Both slice values have to be non-empty
 	case v.NumIgnored > 0:
 		return false // Some ignore option was used
 	case v.NumTransformed > 0:
@@ -45,7 +43,16 @@ func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool {
 		return false
 	}
 
-	switch t := v.Type; t.Kind() {
+	// Check whether this is an interface with the same concrete types.
+	t := v.Type
+	vx, vy := v.ValueX, v.ValueY
+	if t.Kind() == reflect.Interface && !vx.IsNil() && !vy.IsNil() && vx.Elem().Type() == vy.Elem().Type() {
+		vx, vy = vx.Elem(), vy.Elem()
+		t = vx.Type()
+	}
+
+	// Check whether we provide specialized diffing for this type.
+	switch t.Kind() {
 	case reflect.String:
 	case reflect.Array, reflect.Slice:
 		// Only slices of primitive types have specialized handling.
@@ -57,6 +64,11 @@ func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool {
 			return false
 		}
 
+		// Both slice values have to be non-empty.
+		if t.Kind() == reflect.Slice && (vx.Len() == 0 || vy.Len() == 0) {
+			return false
+		}
+
 		// If a sufficient number of elements already differ,
 		// use specialized formatting even if length requirement is not met.
 		if v.NumDiff > v.NumSame {
@@ -68,7 +80,7 @@ func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool {
 
 	// Use specialized string diffing for longer slices or strings.
 	const minLength = 64
-	return v.ValueX.Len() >= minLength && v.ValueY.Len() >= minLength
+	return vx.Len() >= minLength && vy.Len() >= minLength
 }
 
 // FormatDiffSlice prints a diff for the slices (or strings) represented by v.
@@ -77,6 +89,11 @@ func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool {
 func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode {
 	assert(opts.DiffMode == diffUnknown)
 	t, vx, vy := v.Type, v.ValueX, v.ValueY
+	if t.Kind() == reflect.Interface {
+		vx, vy = vx.Elem(), vy.Elem()
+		t = vx.Type()
+		opts = opts.WithTypeMode(emitType)
+	}
 
 	// Auto-detect the type of the data.
 	var isLinedText, isText, isBinary bool
diff --git a/vendor/github.com/prometheus/common/model/time.go b/vendor/github.com/prometheus/common/model/time.go
index c40e6403c..e684ebd11 100644
--- a/vendor/github.com/prometheus/common/model/time.go
+++ b/vendor/github.com/prometheus/common/model/time.go
@@ -14,6 +14,7 @@
 package model
 
 import (
+	"encoding/json"
 	"fmt"
 	"math"
 	"regexp"
@@ -254,6 +255,37 @@ func (d Duration) String() string {
 	return r
 }
 
+// MarshalJSON implements the json.Marshaler interface.
+func (d Duration) MarshalJSON() ([]byte, error) {
+	return json.Marshal(d.String())
+}
+
+// UnmarshalJSON implements the json.Unmarshaler interface.
+func (d *Duration) UnmarshalJSON(bytes []byte) error {
+	var s string
+	if err := json.Unmarshal(bytes, &s); err != nil {
+		return err
+	}
+	dur, err := ParseDuration(s)
+	if err != nil {
+		return err
+	}
+	*d = dur
+	return nil
+}
+
+// MarshalText implements the encoding.TextMarshaler interface.
+func (d *Duration) MarshalText() ([]byte, error) {
+	return []byte(d.String()), nil
+}
+
+// UnmarshalText implements the encoding.TextUnmarshaler interface.
+func (d *Duration) UnmarshalText(text []byte) error {
+	var err error
+	*d, err = ParseDuration(string(text))
+	return err
+}
+
 // MarshalYAML implements the yaml.Marshaler interface.
 func (d Duration) MarshalYAML() (interface{}, error) {
 	return d.String(), nil
diff --git a/vendor/google.golang.org/grpc/balancer/grpclb/grpc_lb_v1/load_balancer_grpc.pb.go b/vendor/google.golang.org/grpc/balancer/grpclb/grpc_lb_v1/load_balancer_grpc.pb.go
index 41e7274a0..d56b77cca 100644
--- a/vendor/google.golang.org/grpc/balancer/grpclb/grpc_lb_v1/load_balancer_grpc.pb.go
+++ b/vendor/google.golang.org/grpc/balancer/grpclb/grpc_lb_v1/load_balancer_grpc.pb.go
@@ -11,6 +11,7 @@ import (
 
 // This is a compile-time assertion to ensure that this generated file
 // is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
 // LoadBalancerClient is the client API for LoadBalancer service.
diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.go b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.go
index 75bbf87dd..efdbd13fa 100644
--- a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.go
+++ b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.go
@@ -11,6 +11,7 @@ import (
 
 // This is a compile-time assertion to ensure that this generated file
 // is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
 // HandshakerServiceClient is the client API for HandshakerService service.
diff --git a/vendor/google.golang.org/grpc/encoding/proto/proto.go b/vendor/google.golang.org/grpc/encoding/proto/proto.go
index e1230fdd3..3009b35af 100644
--- a/vendor/google.golang.org/grpc/encoding/proto/proto.go
+++ b/vendor/google.golang.org/grpc/encoding/proto/proto.go
@@ -21,6 +21,8 @@
 package proto
 
 import (
+	"fmt"
+
 	"github.com/golang/protobuf/proto"
 	"google.golang.org/grpc/encoding"
 )
@@ -36,11 +38,19 @@ func init() {
 type codec struct{}
 
 func (codec) Marshal(v interface{}) ([]byte, error) {
-	return proto.Marshal(v.(proto.Message))
+	vv, ok := v.(proto.Message)
+	if !ok {
+		return nil, fmt.Errorf("failed to marshal, message is %T, want proto.Message", v)
+	}
+	return proto.Marshal(vv)
 }
 
 func (codec) Unmarshal(data []byte, v interface{}) error {
-	return proto.Unmarshal(data, v.(proto.Message))
+	vv, ok := v.(proto.Message)
+	if !ok {
+		return fmt.Errorf("failed to unmarshal, message is %T, want proto.Message", v)
+	}
+	return proto.Unmarshal(data, vv)
 }
 
 func (codec) Name() string {
diff --git a/vendor/google.golang.org/grpc/regenerate.sh b/vendor/google.golang.org/grpc/regenerate.sh
index ed52187df..fc6725b89 100644
--- a/vendor/google.golang.org/grpc/regenerate.sh
+++ b/vendor/google.golang.org/grpc/regenerate.sh
@@ -40,6 +40,9 @@ echo "go install cmd/protoc-gen-go-grpc"
 echo "git clone https://github.com/grpc/grpc-proto"
 git clone --quiet https://github.com/grpc/grpc-proto ${WORKDIR}/grpc-proto
 
+echo "git clone https://github.com/protocolbuffers/protobuf"
+git clone --quiet https://github.com/protocolbuffers/protobuf ${WORKDIR}/protobuf
+
 # Pull in code.proto as a proto dependency
 mkdir -p ${WORKDIR}/googleapis/google/rpc
 echo "curl https://raw.githubusercontent.com/googleapis/googleapis/master/google/rpc/code.proto"
@@ -87,6 +90,7 @@ for src in ${SOURCES[@]}; do
     -I"." \
     -I${WORKDIR}/grpc-proto \
     -I${WORKDIR}/googleapis \
+    -I${WORKDIR}/protobuf/src \
     -I${WORKDIR}/istio \
     ${src}
 done
@@ -97,6 +101,7 @@ for src in ${LEGACY_SOURCES[@]}; do
     -I"." \
     -I${WORKDIR}/grpc-proto \
     -I${WORKDIR}/googleapis \
+    -I${WORKDIR}/protobuf/src \
     -I${WORKDIR}/istio \
     ${src}
 done
diff --git a/vendor/google.golang.org/grpc/rpc_util.go b/vendor/google.golang.org/grpc/rpc_util.go
index ea5bb8d0c..c0a1208f2 100644
--- a/vendor/google.golang.org/grpc/rpc_util.go
+++ b/vendor/google.golang.org/grpc/rpc_util.go
@@ -888,8 +888,7 @@ type channelzData struct {
 // buffer files to ensure compatibility with the gRPC version used.  The latest
 // support package version is 7.
 //
-// Older versions are kept for compatibility. They may be removed if
-// compatibility cannot be maintained.
+// Older versions are kept for compatibility.
 //
 // These constants should not be referenced from any other code.
 const (
diff --git a/vendor/google.golang.org/grpc/status/status.go b/vendor/google.golang.org/grpc/status/status.go
index 01e182c30..54d187186 100644
--- a/vendor/google.golang.org/grpc/status/status.go
+++ b/vendor/google.golang.org/grpc/status/status.go
@@ -73,9 +73,11 @@ func FromProto(s *spb.Status) *Status {
 	return status.FromProto(s)
 }
 
-// FromError returns a Status representing err if it was produced from this
-// package or has a method `GRPCStatus() *Status`. Otherwise, ok is false and a
-// Status is returned with codes.Unknown and the original error message.
+// FromError returns a Status representing err if it was produced by this
+// package or has a method `GRPCStatus() *Status`.
+// If err is nil, a Status is returned with codes.OK and no message.
+// Otherwise, ok is false and a Status is returned with codes.Unknown and
+// the original error message.
 func FromError(err error) (s *Status, ok bool) {
 	if err == nil {
 		return nil, true
diff --git a/vendor/google.golang.org/grpc/version.go b/vendor/google.golang.org/grpc/version.go
index 685b91c70..51024d6b3 100644
--- a/vendor/google.golang.org/grpc/version.go
+++ b/vendor/google.golang.org/grpc/version.go
@@ -19,4 +19,4 @@
 package grpc
 
 // Version is the current grpc version.
-const Version = "1.35.0"
+const Version = "1.36.0"
diff --git a/vendor/knative.dev/hack/library.sh b/vendor/knative.dev/hack/library.sh
index f8f8b629c..d72bfe6b7 100644
--- a/vendor/knative.dev/hack/library.sh
+++ b/vendor/knative.dev/hack/library.sh
@@ -163,7 +163,7 @@ function wait_until_pods_running() {
   for i in {1..150}; do  # timeout after 5 minutes
     # List all pods. Ignore Terminating pods as those have either been replaced through
     # a deployment or terminated on purpose (through chaosduck for example).
-    local pods="$(kubectl get pods --no-headers -n $1 2>/dev/null | grep -v Terminating)"
+    local pods="$(kubectl get pods --no-headers -n $1 | grep -v Terminating)"
     # All pods must be running (ignore ImagePull error to allow the pod to retry)
     local not_running_pods=$(echo "${pods}" | grep -v Running | grep -v Completed | grep -v ErrImagePull | grep -v ImagePullBackOff)
     if [[ -n "${pods}" ]] && [[ -z "${not_running_pods}" ]]; then
diff --git a/vendor/modules.txt b/vendor/modules.txt
index bdc3dab65..e686947a1 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -167,7 +167,7 @@ github.com/golang/protobuf/ptypes/any
 github.com/golang/protobuf/ptypes/duration
 github.com/golang/protobuf/ptypes/timestamp
 github.com/golang/protobuf/ptypes/wrappers
-# github.com/google/go-cmp v0.5.4
+# github.com/google/go-cmp v0.5.5
 ## explicit
 github.com/google/go-cmp/cmp
 github.com/google/go-cmp/cmp/cmpopts
@@ -287,7 +287,7 @@ github.com/prometheus/client_golang/prometheus/promhttp
 # github.com/prometheus/client_model v0.2.0
 ## explicit
 github.com/prometheus/client_model/go
-# github.com/prometheus/common v0.15.0
+# github.com/prometheus/common v0.19.0
 github.com/prometheus/common/expfmt
 github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg
 github.com/prometheus/common/log
@@ -320,7 +320,7 @@ github.com/vdemeester/k8s-pkg-credentialprovider/aws
 github.com/vdemeester/k8s-pkg-credentialprovider/azure
 github.com/vdemeester/k8s-pkg-credentialprovider/gcp
 github.com/vdemeester/k8s-pkg-credentialprovider/secrets
-# go.opencensus.io v0.22.6
+# go.opencensus.io v0.23.0
 ## explicit
 go.opencensus.io
 go.opencensus.io/internal
@@ -498,7 +498,7 @@ google.golang.org/genproto/googleapis/monitoring/v3
 google.golang.org/genproto/googleapis/rpc/status
 google.golang.org/genproto/googleapis/type/calendarperiod
 google.golang.org/genproto/protobuf/field_mask
-# google.golang.org/grpc v1.35.0
+# google.golang.org/grpc v1.36.0
 ## explicit
 google.golang.org/grpc
 google.golang.org/grpc/attributes
@@ -997,7 +997,7 @@ k8s.io/utils/buffer
 k8s.io/utils/integer
 k8s.io/utils/pointer
 k8s.io/utils/trace
-# knative.dev/caching v0.0.0-20210311181225-4b366c7a9f99
+# knative.dev/caching v0.0.0-20210315185901-a31ce171642b
 ## explicit
 knative.dev/caching/config
 knative.dev/caching/pkg/apis/caching
@@ -1018,11 +1018,11 @@ knative.dev/caching/pkg/client/injection/informers/caching/v1alpha1/image/fake
 knative.dev/caching/pkg/client/injection/informers/factory
 knative.dev/caching/pkg/client/injection/informers/factory/fake
 knative.dev/caching/pkg/client/listers/caching/v1alpha1
-# knative.dev/hack v0.0.0-20210309141825-9b73a256fd9a
+# knative.dev/hack v0.0.0-20210317214554-58edbdc42966
 ## explicit
 knative.dev/hack
 knative.dev/hack/shell
-# knative.dev/networking v0.0.0-20210311182125-f51c10d6fcf0
+# knative.dev/networking v0.0.0-20210316192342-33105c61ff74
 ## explicit
 knative.dev/networking/config
 knative.dev/networking/pkg
@@ -1057,7 +1057,7 @@ knative.dev/networking/test/conformance/ingress
 knative.dev/networking/test/defaultsystem
 knative.dev/networking/test/test_images/grpc-ping/proto
 knative.dev/networking/test/types
-# knative.dev/pkg v0.0.0-20210311174826-40488532be3f
+# knative.dev/pkg v0.0.0-20210315160101-6a33a1ab29ac
 ## explicit
 knative.dev/pkg/apiextensions/storageversion
 knative.dev/pkg/apiextensions/storageversion/cmd/migrate


Test patch:
diff --git a/pkg/reconciler/route/route_test.go b/pkg/reconciler/route/route_test.go
index aea375ad4..d86e7d966 100644
--- a/pkg/reconciler/route/route_test.go
+++ b/pkg/reconciler/route/route_test.go
@@ -213,7 +213,8 @@ func TestCreateRouteForOneReserveRevision(t *testing.T) {
 
 	domain := strings.Join([]string{route.Name, route.Namespace, defaultDomainSuffix}, ".")
 	expectedSpec := v1alpha1.IngressSpec{
-		TLS: []v1alpha1.IngressTLS{},
+		HTTPOption: v1alpha1.HTTPOptionEnabled,
+		TLS:        []v1alpha1.IngressTLS{},
 		Rules: []v1alpha1.IngressRule{{
 			Hosts: []string{
 				"test-route.test",
@@ -342,7 +343,8 @@ func TestCreateRouteWithMultipleTargets(t *testing.T) {
 	ci := getRouteIngressFromClient(ctx, t, route)
 	domain := strings.Join([]string{route.Name, route.Namespace, defaultDomainSuffix}, ".")
 	expectedSpec := v1alpha1.IngressSpec{
-		TLS: []v1alpha1.IngressTLS{},
+		HTTPOption: v1alpha1.HTTPOptionEnabled,
+		TLS:        []v1alpha1.IngressTLS{},
 		Rules: []v1alpha1.IngressRule{{
 			Hosts: []string{
 				"test-route.test",
@@ -459,7 +461,8 @@ func TestCreateRouteWithOneTargetReserve(t *testing.T) {
 	ci := getRouteIngressFromClient(ctx, t, route)
 	domain := strings.Join([]string{route.Name, route.Namespace, defaultDomainSuffix}, ".")
 	expectedSpec := v1alpha1.IngressSpec{
-		TLS: []v1alpha1.IngressTLS{},
+		HTTPOption: v1alpha1.HTTPOptionEnabled,
+		TLS:        []v1alpha1.IngressTLS{},
 		Rules: []v1alpha1.IngressRule{{
 			Hosts: []string{
 				"test-route.test",
@@ -590,7 +593,8 @@ func TestCreateRouteWithDuplicateTargets(t *testing.T) {
 	ci := getRouteIngressFromClient(ctx, t, route)
 	domain := strings.Join([]string{route.Name, route.Namespace, defaultDomainSuffix}, ".")
 	expectedSpec := v1alpha1.IngressSpec{
-		TLS: []v1alpha1.IngressTLS{},
+		HTTPOption: v1alpha1.HTTPOptionEnabled,
+		TLS:        []v1alpha1.IngressTLS{},
 		Rules: []v1alpha1.IngressRule{{
 			Hosts: []string{
 				"test-route.test",
@@ -795,7 +799,8 @@ func TestCreateRouteWithNamedTargets(t *testing.T) {
 	ci := getRouteIngressFromClient(ctx, t, route)
 	domain := strings.Join([]string{route.Name, route.Namespace, defaultDomainSuffix}, ".")
 	expectedSpec := v1alpha1.IngressSpec{
-		TLS: []v1alpha1.IngressTLS{},
+		HTTPOption: v1alpha1.HTTPOptionEnabled,
+		TLS:        []v1alpha1.IngressTLS{},
 		Rules: []v1alpha1.IngressRule{{
 			Hosts: []string{
 				"test-route.test",
@@ -1003,7 +1008,8 @@ func TestCreateRouteWithNamedTargetsAndTagBasedRouting(t *testing.T) {
 	ci := getRouteIngressFromClient(ctx, t, route)
 	domain := strings.Join([]string{route.Name, route.Namespace, defaultDomainSuffix}, ".")
 	expectedSpec := v1alpha1.IngressSpec{
-		TLS: []v1alpha1.IngressTLS{},
+		HTTPOption: v1alpha1.HTTPOptionEnabled,
+		TLS:        []v1alpha1.IngressTLS{},
 		Rules: []v1alpha1.IngressRule{{
 			Hosts: []string{
 				"test-route.test",
diff --git a/pkg/reconciler/route/table_test.go b/pkg/reconciler/route/table_test.go
index 6637c273f..7d815d006 100644
--- a/pkg/reconciler/route/table_test.go
+++ b/pkg/reconciler/route/table_test.go
@@ -2553,103 +2553,6 @@ func wildcardCert(namespace string, domain string) *netv1alpha1.Certificate {
 	return cert
 }
 
-func TestReconcileEnableAutoTLSHTTPDisabled(t *testing.T) {
-	table := TableTest{{
-		Name: "check that Route is correctly updated when Certificate is not ready",
-		Objects: []runtime.Object{
-			Route("default", "becomes-ready", WithConfigTarget("config"), WithRouteUID("12-34")),
-			cfg("default", "config",
-				WithConfigGeneration(1), WithLatestCreated("config-00001"), WithLatestReady("config-00001")),
-			rev("default", "config", 1, MarkRevisionReady, WithRevName("config-00001"), WithK8sServiceName),
-			// MakeCertificates will create a certificate with DNS name "*.test-ns.example.com" which is not the host name
-			// needed by the input Route.
-			&netv1alpha1.Certificate{
-				ObjectMeta: metav1.ObjectMeta{
-					Name:      "route-12-34",
-					Namespace: "default",
-					Labels: map[string]string{
-						serving.RouteLabelKey: "becomes-ready",
-					},
-					OwnerReferences: []metav1.OwnerReference{*kmeta.NewControllerRef(
-						Route("default", "becomes-ready", WithConfigTarget("config"), WithRouteUID("12-34")))},
-					Annotations: map[string]string{
-						networking.CertificateClassAnnotationKey: network.CertManagerCertificateClassName,
-					},
-				},
-				Spec: netv1alpha1.CertificateSpec{
-					DNSNames: []string{"abc.test.example.com"},
-				},
-				Status: notReadyCertStatus(),
-			},
-		},
-		WantCreates: []runtime.Object{
-			ingressWithTLS(
-				Route("default", "becomes-ready", WithConfigTarget("config"), WithURL,
-					WithRouteUID("12-34")),
-				&traffic.Config{
-					Targets: map[string]traffic.RevisionTargets{
-						traffic.DefaultTarget: {{
-							TrafficTarget: v1.TrafficTarget{
-								LatestRevision:    ptr.Bool(true),
-								ConfigurationName: "config",
-								RevisionName:      "config-00001",
-								Percent:           ptr.Int64(100),
-							},
-						}},
-					},
-				}, nil, nil),
-			simpleK8sService(
-				Route("default", "becomes-ready", WithConfigTarget("config"), WithRouteUID("12-34")),
-				WithExternalName("becomes-ready.default.example.com"),
-			),
-		},
-		WantUpdates: []clientgotesting.UpdateActionImpl{{
-			Object: certificateWithStatus(resources.MakeCertificates(Route("default", "becomes-ready", WithConfigTarget("config"), WithURL, WithRouteUID("12-34")),
-				map[string]string{"becomes-ready.default.example.com": ""}, network.CertManagerCertificateClassName)[0], notReadyCertStatus()),
-		}},
-		WantStatusUpdates: []clientgotesting.UpdateActionImpl{{
-			Object: Route("default", "becomes-ready", WithConfigTarget("config"),
-				WithRouteUID("12-34"),
-				// Populated by reconciliation when all traffic has been assigned.
-				WithAddress, WithInitRouteConditions,
-				MarkTrafficAssigned, MarkIngressNotConfigured, WithStatusTraffic(
-					v1.TrafficTarget{
-						RevisionName:   "config-00001",
-						Percent:        ptr.Int64(100),
-						LatestRevision: ptr.Bool(true),
-					}), MarkCertificateNotReady, MarkIngressNotConfigured,
-				// The certificate is not ready. But we still want to have HTTPS URL.
-				WithHTTPSDomain),
-		}},
-		WantEvents: []string{
-			Eventf(corev1.EventTypeNormal, "Created", "Created placeholder service %q", "becomes-ready"),
-			Eventf(corev1.EventTypeNormal, "Updated", "Updated Spec for Certificate %s/%s", "default", "route-12-34"),
-			Eventf(corev1.EventTypeNormal, "Created", "Created Ingress %q", "becomes-ready"),
-		},
-		Key: "default/becomes-ready",
-	}}
-	table.Test(t, MakeFactory(func(ctx context.Context, listers *Listers, cmw configmap.Watcher) controller.Reconciler {
-		cfg := reconcilerTestConfig(true)
-		cfg.Network.HTTPProtocol = network.HTTPDisabled
-		r := &Reconciler{
-			kubeclient:          kubeclient.Get(ctx),
-			client:              servingclient.Get(ctx),
-			netclient:           networkingclient.Get(ctx),
-			configurationLister: listers.GetConfigurationLister(),
-			revisionLister:      listers.GetRevisionLister(),
-			serviceLister:       listers.GetK8sServiceLister(),
-			ingressLister:       listers.GetIngressLister(),
-			certificateLister:   listers.GetCertificateLister(),
-			tracker:             &NullTracker{},
-			clock:               clock.NewFakePassiveClock(fakeCurTime),
-		}
-
-		return routereconciler.NewReconciler(ctx, logging.FromContext(ctx), servingclient.Get(ctx),
-			listers.GetRouteLister(), controller.GetEventRecorder(ctx), r,
-			controller.Options{ConfigStore: &testConfigStore{config: cfg}})
-	}))
-}
-
 func cfg(namespace, name string, co ...ConfigOption) *v1.Configuration {
 	cfg := &v1.Configuration{
 		ObjectMeta: metav1.ObjectMeta{
diff --git a/third_party/cert-manager-latest/net-certmanager.yaml b/third_party/cert-manager-latest/net-certmanager.yaml
index a2636f33e..47af8f821 100644
--- a/third_party/cert-manager-latest/net-certmanager.yaml
+++ b/third_party/cert-manager-latest/net-certmanager.yaml
@@ -18,7 +18,7 @@ metadata:
   # These are the permissions needed by the `cert-manager` `Certificate` implementation.
   name: knative-serving-certmanager
   labels:
-    serving.knative.dev/release: "v20210310-3038fe98"
+    serving.knative.dev/release: "v20210315-56b7c1f3"
     serving.knative.dev/controller: "true"
     networking.knative.dev/certificate-provider: cert-manager
 rules:
@@ -49,7 +49,7 @@ kind: ValidatingWebhookConfiguration
 metadata:
   name: config.webhook.net-certmanager.networking.internal.knative.dev
   labels:
-    serving.knative.dev/release: "v20210310-3038fe98"
+    serving.knative.dev/release: "v20210315-56b7c1f3"
 webhooks:
   - admissionReviewVersions:
       - v1beta1
@@ -86,7 +86,7 @@ metadata:
   name: net-certmanager-webhook-certs
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210310-3038fe98"
+    serving.knative.dev/release: "v20210315-56b7c1f3"
 
 ---
 # Copyright 2020 The Knative Authors
@@ -109,7 +109,7 @@ metadata:
   name: config-certmanager
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210310-3038fe98"
+    serving.knative.dev/release: "v20210315-56b7c1f3"
     networking.knative.dev/certificate-provider: cert-manager
 data:
   _example: |
@@ -156,7 +156,7 @@ metadata:
   name: networking-certmanager
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210310-3038fe98"
+    serving.knative.dev/release: "v20210315-56b7c1f3"
     networking.knative.dev/certificate-provider: cert-manager
 spec:
   selector:
@@ -168,14 +168,14 @@ spec:
         cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
       labels:
         app: networking-certmanager
-        serving.knative.dev/release: "v20210310-3038fe98"
+        serving.knative.dev/release: "v20210315-56b7c1f3"
     spec:
       serviceAccountName: controller
       containers:
         - name: networking-certmanager
           # This is the Go import path for the binary that is containerized
           # and substituted here.
-          image: gcr.io/knative-nightly/knative.dev/net-certmanager/cmd/controller@sha256:396e562c2d723b93ec55cb53e4e3058acdae9de4a98267baf29d6dff6f477f10
+          image: gcr.io/knative-nightly/knative.dev/net-certmanager/cmd/controller@sha256:296339291d50e9323f3934ab9c1f58f059d3e8268d3cd1dae13c6708c1966db1
           resources:
             requests:
               cpu: 30m
@@ -213,7 +213,7 @@ kind: Service
 metadata:
   labels:
     app: networking-certmanager
-    serving.knative.dev/release: "v20210310-3038fe98"
+    serving.knative.dev/release: "v20210315-56b7c1f3"
     networking.knative.dev/certificate-provider: cert-manager
   name: networking-certmanager
   namespace: knative-serving
@@ -250,7 +250,7 @@ metadata:
   name: net-certmanager-webhook
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210310-3038fe98"
+    serving.knative.dev/release: "v20210315-56b7c1f3"
 spec:
   selector:
     matchLabels:
@@ -263,14 +263,14 @@ spec:
       labels:
         app: net-certmanager-webhook
         role: net-certmanager-webhook
-        serving.knative.dev/release: "v20210310-3038fe98"
+        serving.knative.dev/release: "v20210315-56b7c1f3"
     spec:
       serviceAccountName: controller
       containers:
         - name: webhook
           # This is the Go import path for the binary that is containerized
           # and substituted here.
-          image: gcr.io/knative-nightly/knative.dev/net-certmanager/cmd/webhook@sha256:620cebbf1401e9707d03da06e970e09030168bda1130affaa82b28815a9038ff
+          image: gcr.io/knative-nightly/knative.dev/net-certmanager/cmd/webhook@sha256:7d41e809c7c76fdcf24bbbc71b58f3dbf2043201d8934d580419b433197438c9
           resources:
             requests:
               cpu: 20m
@@ -329,7 +329,7 @@ metadata:
   namespace: knative-serving
   labels:
     role: net-certmanager-webhook
-    serving.knative.dev/release: "v20210310-3038fe98"
+    serving.knative.dev/release: "v20210315-56b7c1f3"
 spec:
   ports:
     # Define metrics and profiling for them to be accessible within service meshes.
diff --git a/third_party/contour-latest/contour.yaml b/third_party/contour-latest/contour.yaml
index 2af14a751..ded4de602 100644
--- a/third_party/contour-latest/contour.yaml
+++ b/third_party/contour-latest/contour.yaml
@@ -1789,7 +1789,7 @@ spec:
     spec:
       containers:
         - name: contour
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:36d1a4f55f1f983512474012d93f2c45678f92b426b507846272647ad95f54c3
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:4c6e257a2cba2821a0264f6fc4907ed8fe2560776013a006c330c28529b0693b
           imagePullPolicy: Always
           command:
             - contour
@@ -2024,7 +2024,7 @@ spec:
             - --contour-key-file=/certs/tls.key
             - --config-path=/config/contour.yaml
           command: ["contour"]
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:36d1a4f55f1f983512474012d93f2c45678f92b426b507846272647ad95f54c3
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:4c6e257a2cba2821a0264f6fc4907ed8fe2560776013a006c330c28529b0693b
           imagePullPolicy: IfNotPresent
           name: contour
           ports:
@@ -2113,7 +2113,7 @@ spec:
           args:
             - envoy
             - shutdown-manager
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:36d1a4f55f1f983512474012d93f2c45678f92b426b507846272647ad95f54c3
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:4c6e257a2cba2821a0264f6fc4907ed8fe2560776013a006c330c28529b0693b
           imagePullPolicy: IfNotPresent
           lifecycle:
             preStop:
@@ -2192,7 +2192,7 @@ spec:
             - --envoy-key-file=/certs/tls.key
           command:
             - contour
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:36d1a4f55f1f983512474012d93f2c45678f92b426b507846272647ad95f54c3
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:4c6e257a2cba2821a0264f6fc4907ed8fe2560776013a006c330c28529b0693b
           imagePullPolicy: IfNotPresent
           name: envoy-initconfig
           volumeMounts:
@@ -2450,7 +2450,7 @@ spec:
     spec:
       containers:
         - name: contour
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:36d1a4f55f1f983512474012d93f2c45678f92b426b507846272647ad95f54c3
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:4c6e257a2cba2821a0264f6fc4907ed8fe2560776013a006c330c28529b0693b
           imagePullPolicy: Always
           command:
             - contour
@@ -2570,7 +2570,7 @@ spec:
             - --contour-key-file=/certs/tls.key
             - --config-path=/config/contour.yaml
           command: ["contour"]
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:36d1a4f55f1f983512474012d93f2c45678f92b426b507846272647ad95f54c3
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:4c6e257a2cba2821a0264f6fc4907ed8fe2560776013a006c330c28529b0693b
           imagePullPolicy: IfNotPresent
           name: contour
           ports:
@@ -2659,7 +2659,7 @@ spec:
           args:
             - envoy
             - shutdown-manager
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:36d1a4f55f1f983512474012d93f2c45678f92b426b507846272647ad95f54c3
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:4c6e257a2cba2821a0264f6fc4907ed8fe2560776013a006c330c28529b0693b
           imagePullPolicy: IfNotPresent
           lifecycle:
             preStop:
@@ -2738,7 +2738,7 @@ spec:
             - --envoy-key-file=/certs/tls.key
           command:
             - contour
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:36d1a4f55f1f983512474012d93f2c45678f92b426b507846272647ad95f54c3
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:4c6e257a2cba2821a0264f6fc4907ed8fe2560776013a006c330c28529b0693b
           imagePullPolicy: IfNotPresent
           name: envoy-initconfig
           volumeMounts:
diff --git a/third_party/contour-latest/net-contour.yaml b/third_party/contour-latest/net-contour.yaml
index a90c738c7..49d31bc55 100644
--- a/third_party/contour-latest/net-contour.yaml
+++ b/third_party/contour-latest/net-contour.yaml
@@ -33,7 +33,7 @@ metadata:
   namespace: knative-serving
   labels:
     networking.knative.dev/ingress-provider: contour
-    serving.knative.dev/release: "v20210309-51e90c2e"
+    serving.knative.dev/release: "v20210314-28082d35"
 data:
   _example: |
     ################################
@@ -103,7 +103,7 @@ spec:
         - name: controller
           # This is the Go import path for the binary that is containerized
           # and substituted here.
-          image: gcr.io/knative-nightly/knative.dev/net-contour/cmd/controller@sha256:1710a98b53ec9ccd34e8844940f984a41a0fc2f3dc1e9e853c4ae0ca4b4c4bf7
+          image: gcr.io/knative-nightly/knative.dev/net-contour/cmd/controller@sha256:63c994ff4a95860e03e53fe072a12949a18d575f323f589f840f268424899cdc
           resources:
             requests:
               cpu: 40m
diff --git a/third_party/istio-latest/net-istio.yaml b/third_party/istio-latest/net-istio.yaml
index 7184dc5ae..b214fb523 100644
--- a/third_party/istio-latest/net-istio.yaml
+++ b/third_party/istio-latest/net-istio.yaml
@@ -1,4 +1,4 @@
-# Generated when HEAD was 4e84c3669f6ea8ddbf1d30d855842a9551618f4a
+# Generated when HEAD was 3a9a02e8a86f53950299608b39d04c76f3537e7d
 #
 # Copyright 2019 The Knative Authors
 #
@@ -20,7 +20,7 @@ metadata:
   # These are the permissions needed by the Istio Ingress implementation.
   name: knative-serving-istio
   labels:
-    serving.knative.dev/release: "v20210312-4e84c366"
+    serving.knative.dev/release: "v20210316-3a9a02e8"
     serving.knative.dev/controller: "true"
     networking.knative.dev/ingress-provider: istio
 rules:
@@ -50,7 +50,7 @@ metadata:
   name: knative-ingress-gateway
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210312-4e84c366"
+    serving.knative.dev/release: "v20210316-3a9a02e8"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -87,7 +87,7 @@ metadata:
   name: knative-local-gateway
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210312-4e84c366"
+    serving.knative.dev/release: "v20210316-3a9a02e8"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -106,7 +106,7 @@ metadata:
   name: knative-local-gateway
   namespace: istio-system
   labels:
-    serving.knative.dev/release: "v20210312-4e84c366"
+    serving.knative.dev/release: "v20210316-3a9a02e8"
     networking.knative.dev/ingress-provider: istio
 spec:
   type: ClusterIP
@@ -126,7 +126,7 @@ metadata:
   name: "webhook"
   namespace: "knative-serving"
   labels:
-    serving.knative.dev/release: "v20210312-4e84c366"
+    serving.knative.dev/release: "v20210316-3a9a02e8"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -142,7 +142,7 @@ metadata:
   name: "domainmapping-webhook"
   namespace: "knative-serving"
   labels:
-    serving.knative.dev/release: "v20210312-4e84c366"
+    serving.knative.dev/release: "v20210316-3a9a02e8"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -158,7 +158,7 @@ metadata:
   name: "istio-webhook"
   namespace: "knative-serving"
   labels:
-    serving.knative.dev/release: "v20210312-4e84c366"
+    serving.knative.dev/release: "v20210316-3a9a02e8"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -188,7 +188,7 @@ kind: MutatingWebhookConfiguration
 metadata:
   name: webhook.istio.networking.internal.knative.dev
   labels:
-    serving.knative.dev/release: "v20210312-4e84c366"
+    serving.knative.dev/release: "v20210316-3a9a02e8"
     networking.knative.dev/ingress-provider: istio
 webhooks:
   - admissionReviewVersions:
@@ -224,7 +224,7 @@ kind: ValidatingWebhookConfiguration
 metadata:
   name: config.webhook.istio.networking.internal.knative.dev
   labels:
-    serving.knative.dev/release: "v20210312-4e84c366"
+    serving.knative.dev/release: "v20210316-3a9a02e8"
     networking.knative.dev/ingress-provider: istio
 webhooks:
   - admissionReviewVersions:
@@ -262,7 +262,7 @@ metadata:
   name: istio-webhook-certs
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210312-4e84c366"
+    serving.knative.dev/release: "v20210316-3a9a02e8"
     networking.knative.dev/ingress-provider: istio
 
 ---
@@ -286,7 +286,7 @@ metadata:
   name: config-istio
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210312-4e84c366"
+    serving.knative.dev/release: "v20210316-3a9a02e8"
     networking.knative.dev/ingress-provider: istio
 data:
   _example: |
@@ -337,6 +337,10 @@ data:
     # If true, knative will use the Istio VirtualService's status to determine
     # endpoint readiness. Otherwise, probe as usual.
     enable-virtualservice-status: "false"
+
+    # If true, knative will add additional information to all deployed applications to
+    # make their pods directly accessible via their IPs even if mesh is enabled.
+    enable-mesh-pod-addressability: "false"
   # TODO(nghia): Extract the .svc.cluster.local suffix into its own config.
 
 ---
@@ -360,7 +364,7 @@ metadata:
   name: networking-istio
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210312-4e84c366"
+    serving.knative.dev/release: "v20210316-3a9a02e8"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -376,14 +380,14 @@ spec:
         sidecar.istio.io/inject: "false"
       labels:
         app: networking-istio
-        serving.knative.dev/release: "v20210312-4e84c366"
+        serving.knative.dev/release: "v20210316-3a9a02e8"
     spec:
       serviceAccountName: controller
       containers:
         - name: networking-istio
           # This is the Go import path for the binary that is containerized
           # and substituted here.
-          image: gcr.io/knative-nightly/knative.dev/net-istio/cmd/controller@sha256:41c7e94aa20a6c9ea28d97796c16e3e14ed68ca970aefefbee4793559246a257
+          image: gcr.io/knative-nightly/knative.dev/net-istio/cmd/controller@sha256:3b06baeccd3d6d9706d616136067c8152b0237b99da7b20f0b41c5946ebeafa6
           resources:
             requests:
               cpu: 30m
@@ -440,7 +444,7 @@ metadata:
   name: istio-webhook
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210312-4e84c366"
+    serving.knative.dev/release: "v20210316-3a9a02e8"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -454,14 +458,14 @@ spec:
       labels:
         app: istio-webhook
         role: istio-webhook
-        serving.knative.dev/release: "v20210312-4e84c366"
+        serving.knative.dev/release: "v20210316-3a9a02e8"
     spec:
       serviceAccountName: controller
       containers:
         - name: webhook
           # This is the Go import path for the binary that is containerized
           # and substituted here.
-          image: gcr.io/knative-nightly/knative.dev/net-istio/cmd/webhook@sha256:cf11231e86df4bb5877a8318b1dfcce3ce5177a0e9f9b562b05a54eec7a9fb5b
+          image: gcr.io/knative-nightly/knative.dev/net-istio/cmd/webhook@sha256:2fb64c5d39a479ea706ed9d8418a1d5d50e76499051bcc47cd21e72c5c1a07d2
           resources:
             requests:
               cpu: 20m
@@ -515,7 +519,7 @@ metadata:
   namespace: knative-serving
   labels:
     role: istio-webhook
-    serving.knative.dev/release: "v20210312-4e84c366"
+    serving.knative.dev/release: "v20210316-3a9a02e8"
     networking.knative.dev/ingress-provider: istio
 spec:
   ports:
diff --git a/third_party/kourier-latest/kourier.yaml b/third_party/kourier-latest/kourier.yaml
index 9a9cd327f..b5c585d26 100644
--- a/third_party/kourier-latest/kourier.yaml
+++ b/third_party/kourier-latest/kourier.yaml
@@ -18,7 +18,7 @@ metadata:
   name: kourier-system
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210312-d0124fe1"
+    serving.knative.dev/release: "v20210315-ec8f967f"
 
 ---
 # Copyright 2020 The Knative Authors
@@ -42,7 +42,7 @@ metadata:
   namespace: kourier-system
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210312-d0124fe1"
+    serving.knative.dev/release: "v20210315-ec8f967f"
 data:
   envoy-bootstrap.yaml: |
     dynamic_resources:
@@ -113,7 +113,7 @@ metadata:
   namespace: knative-serving
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210312-d0124fe1"
+    serving.knative.dev/release: "v20210315-ec8f967f"
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRole
@@ -122,7 +122,7 @@ metadata:
   namespace: knative-serving
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210312-d0124fe1"
+    serving.knative.dev/release: "v20210315-ec8f967f"
 rules:
   - apiGroups: [""]
     resources: ["events"]
@@ -149,7 +149,7 @@ metadata:
   name: 3scale-kourier
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210312-d0124fe1"
+    serving.knative.dev/release: "v20210315-ec8f967f"
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
@@ -181,7 +181,7 @@ metadata:
   namespace: knative-serving
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210312-d0124fe1"
+    serving.knative.dev/release: "v20210315-ec8f967f"
 spec:
   replicas: 1
   selector:
@@ -193,7 +193,7 @@ spec:
         app: 3scale-kourier-control
     spec:
       containers:
-        - image: gcr.io/knative-nightly/knative.dev/net-kourier/cmd/kourier@sha256:97de76e1dde3de30e7daf3a8bbdf5ca532c174cd5242885445c96045d04c9e73
+        - image: gcr.io/knative-nightly/knative.dev/net-kourier/cmd/kourier@sha256:bfa00c7b786e56b41a95dca2b2019ee6d32397063eceeb2a7c6bf9489c2cb1f0
           name: kourier-control
           env:
             - name: CERTS_SECRET_NAMESPACE
@@ -229,7 +229,7 @@ metadata:
   namespace: knative-serving
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210312-d0124fe1"
+    serving.knative.dev/release: "v20210315-ec8f967f"
 spec:
   ports:
     - name: grpc-xds
@@ -262,7 +262,7 @@ metadata:
   namespace: kourier-system
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210312-d0124fe1"
+    serving.knative.dev/release: "v20210315-ec8f967f"
 spec:
   selector:
     matchLabels:
@@ -328,7 +328,7 @@ metadata:
   namespace: kourier-system
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210312-d0124fe1"
+    serving.knative.dev/release: "v20210315-ec8f967f"
 spec:
   ports:
     - name: http2
@@ -350,7 +350,7 @@ metadata:
   namespace: kourier-system
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210312-d0124fe1"
+    serving.knative.dev/release: "v20210315-ec8f967f"
 spec:
   ports:
     - name: http2
diff --git a/vendor/knative.dev/hack/e2e-tests.sh b/vendor/knative.dev/hack/e2e-tests.sh
index 0b8548f66..c5906d610 100644
--- a/vendor/knative.dev/hack/e2e-tests.sh
+++ b/vendor/knative.dev/hack/e2e-tests.sh
@@ -37,12 +37,15 @@ function teardown_test_resources() {
 # Parameters: $1..$n - any go test flags, then directories containing the tests to run.
 function go_test_e2e() {
   local go_test_args=()
+  [[ ! " $*" == *" -tags="* ]] && go_test_args+=("-tags=e2e")
+  [[ ! " $*" == *" -count="* ]] && go_test_args+=("-count=1")
+  [[ ! " $*" == *" -race"* ]] && go_test_args+=("-race")
+
   # Remove empty args as `go test` will consider it as running tests for the current directory, which is not expected.
   for arg in "$@"; do
     [[ -n "$arg" ]] && go_test_args+=("$arg")
   done
-  [[ ! " $*" == *" -tags="* ]] && go_test_args+=("-tags=e2e")
-  report_go_test -race -count=1 "${go_test_args[@]}"
+  report_go_test "${go_test_args[@]}"
 }
 
 # Setup the test cluster for running the tests.
@@ -69,8 +72,8 @@ function setup_test_cluster() {
   # Acquire cluster admin role for the current user.
   acquire_cluster_admin_role "${k8s_cluster}"
 
-  # Setup KO_DOCKER_REPO if it is a GKE cluster. Incorporate an element of 
-  # randomness to ensure that each run properly publishes images. Don't 
+  # Setup KO_DOCKER_REPO if it is a GKE cluster. Incorporate an element of
+  # randomness to ensure that each run properly publishes images. Don't
   # owerwrite KO_DOCKER_REPO if already set.
   [ -z "${KO_DOCKER_REPO}" ] && \
     [[ "${k8s_cluster}" =~ ^gke_.* ]] && \
diff --git a/vendor/knative.dev/hack/presubmit-tests.sh b/vendor/knative.dev/hack/presubmit-tests.sh
index e873736be..fb50ac819 100644
--- a/vendor/knative.dev/hack/presubmit-tests.sh
+++ b/vendor/knative.dev/hack/presubmit-tests.sh
@@ -209,7 +209,7 @@ function run_unit_tests() {
 
 # Default unit test runner that runs all go tests in the repo.
 function default_unit_test_runner() {
-  report_go_test -race ./...
+  report_go_test -race -count 1 ./...
 }
 
 # Run integration tests. If there's no `integration_tests` function, run the