Repository: knative/serving
Pull request #9329 (2020-09-08 11:51:13)

Unpluralize ContainerStatuses type
The array is plural, the array elements shouldn't be.

<!--
Request Prow to automatically lint any go code in this PR:

/lint
-->


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

This pull-request has been approved by: *<a href="https://github.com/knative/serving/pull/9329#" title="Author self-approved">julz</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **dprotaso**
You can assign the PR to them by writing `/assign @dprotaso` 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/apis/OWNERS](https://github.com/knative/serving/blob/master/pkg/apis/OWNERS)**
- **[pkg/reconciler/OWNERS](https://github.com/knative/serving/blob/master/pkg/reconciler/OWNERS)**
- ~~[pkg/testing/OWNERS](https://github.com/knative/serving/blob/master/pkg/testing/OWNERS)~~ [julz]

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

Patch:
diff --git a/.github/workflows/knative-lint.yaml b/.github/workflows/knative-lint.yaml
index 42d5e66f1..6eb30c60c 100644
--- a/.github/workflows/knative-lint.yaml
+++ b/.github/workflows/knative-lint.yaml
@@ -30,4 +30,3 @@ jobs:
         uses: golangci/golangci-lint-action@v2
         with:
           version: v1.30
-          args: --timeout 5m --disable errcheck --enable unconvert,prealloc --build-tags="e2e performance probe preupgrade postupgrade postdowngrade istio" --skip-files ".pb.go$" --skip-dirs "pkg/client"
diff --git a/.golangci.yaml b/.golangci.yaml
new file mode 100644
index 000000000..b03b8ca7f
--- /dev/null
+++ b/.golangci.yaml
@@ -0,0 +1,24 @@
+run:
+  timeout: 5m
+
+  build-tags:
+    - e2e
+    - performance
+    - probe
+    - preupgrade
+    - postupgrade
+    - postdowngrade
+    - istio
+
+  skip-dirs:
+    - pkg/client
+
+  skip-files:
+    - ".pb.go$"
+
+linters:
+  enable:
+    - unconvert
+    - prealloc
+  disable:
+    - errcheck
diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md
index 5b972a571..c9e1acd27 100644
--- a/DEVELOPMENT.md
+++ b/DEVELOPMENT.md
@@ -116,6 +116,8 @@ Once you've [setup your development environment](#prerequisites), stand up
 redeploying the new version should work fine, but if you run into trouble, you
 can easily [clean your cluster up](#clean-up) and try again.
 
+Enter the `serving` directory to install the following components.
+
 ### Setup cluster admin
 
 Your user must be a cluster admin to perform the setup needed for Knative. This
diff --git a/cmd/activator/main.go b/cmd/activator/main.go
index 0b2447cfd..c8814af98 100644
--- a/cmd/activator/main.go
+++ b/cmd/activator/main.go
@@ -19,7 +19,6 @@ package main
 import (
 	"context"
 	"errors"
-	"flag"
 	"fmt"
 	"log"
 	"net/http"
@@ -29,7 +28,6 @@ import (
 	"time"
 
 	"github.com/kelseyhightower/envconfig"
-	"go.opencensus.io/stats/view"
 	"go.uber.org/zap"
 
 	gorillawebsocket "github.com/gorilla/websocket"
@@ -72,12 +70,6 @@ const (
 	autoscalerPort = ":8080"
 )
 
-var (
-	masterURL = flag.String("master", "", "The address of the Kubernetes API server. "+
-		"Overrides any value in kubeconfig. Only required if out-of-cluster.")
-	kubeconfig = flag.String("kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.")
-)
-
 func statReporter(statSink *websocket.ManagedConnection, statChan <-chan []asmetrics.StatMessage,
 	logger *zap.SugaredLogger) {
 	for sms := range statChan {
@@ -99,26 +91,22 @@ func statReporter(statSink *websocket.ManagedConnection, statChan <-chan []asmet
 type config struct {
 	PodName string `split_words:"true" required:"true"`
 	PodIP   string `split_words:"true" required:"true"`
+
+	// These are here to allow configuring higher values of keep-alive for larger environments.
+	// TODO: run loadtests using these flags to determine optimal default values.
+	MaxIdleProxyConns        int `split_words:"true" default:"1000"`
+	MaxIdleProxyConnsPerHost int `split_words:"true" default:"100"`
 }
 
 func main() {
-	flag.Parse()
-
 	// Set up a context that we can cancel to tell informers and other subprocesses to stop.
 	ctx, cancel := context.WithCancel(context.Background())
 	defer cancel()
 
 	// Report stats on Go memory usage every 30 seconds.
-	msp := metrics.NewMemStatsAll()
-	msp.Start(ctx, 30*time.Second)
-	if err := view.Register(msp.DefaultViews()...); err != nil {
-		log.Fatal("Error exporting go memstats view: ", err)
-	}
+	sharedmain.MemStatsOrDie(ctx)
 
-	cfg, err := sharedmain.GetConfig(*masterURL, *kubeconfig)
-	if err != nil {
-		log.Fatal("Error building kubeconfig: ", err)
-	}
+	cfg := sharedmain.ParseAndGetConfigOrDie()
 
 	log.Printf("Registering %d clients", len(injection.Default.GetClients()))
 	log.Printf("Registering %d informer factories", len(injection.Default.GetInformerFactories()))
@@ -134,6 +122,7 @@ func main() {
 	kubeClient := kubeclient.Get(ctx)
 
 	// We sometimes startup faster than we can reach kube-api. Poll on failure to prevent us terminating
+	var err error
 	if perr := wait.PollImmediate(time.Second, 60*time.Second, func() (bool, error) {
 		if err = version.CheckMinimumVersion(kubeClient.Discovery()); err != nil {
 			log.Print("Failed to get k8s version ", err)
@@ -195,13 +184,8 @@ func main() {
 	concurrencyReporter := activatorhandler.NewConcurrencyReporter(ctx, env.PodName, statCh)
 	go concurrencyReporter.Run(ctx.Done())
 
-	// This is here to allow configuring higher values of keep-alive for larger environments.
-	// TODO: run loadtests using these flags to determine optimal default values.
-	maxIdleProxyConns := intFromEnv(logger, "MAX_IDLE_PROXY_CONNS", 1000)
-	maxIdleProxyConnsPerHost := intFromEnv(logger, "MAX_IDLE_PROXY_CONNS_PER_HOST", 100)
-	logger.Debugf("MaxIdleProxyConns: %d, MaxIdleProxyConnsPerHost: %d", maxIdleProxyConns, maxIdleProxyConnsPerHost)
-
-	proxyTransport := pkgnet.NewAutoTransport(maxIdleProxyConns, maxIdleProxyConnsPerHost)
+	logger.Debugf("MaxIdleProxyConns: %d, MaxIdleProxyConnsPerHost: %d", env.MaxIdleProxyConns, env.MaxIdleProxyConnsPerHost)
+	proxyTransport := pkgnet.NewAutoTransport(env.MaxIdleProxyConns, env.MaxIdleProxyConnsPerHost)
 
 	// Create activation handler chain
 	// Note: innermost handlers are specified first, ie. the last handler in the chain will be executed first
@@ -308,18 +292,3 @@ func flush(logger *zap.SugaredLogger) {
 	os.Stderr.Sync()
 	metrics.FlushExporter()
 }
-
-func intFromEnv(logger *zap.SugaredLogger, envName string, defaultValue int) int {
-	env := os.Getenv(envName)
-	if env == "" {
-		return defaultValue
-	}
-
-	parsed, err := strconv.Atoi(env)
-	if err != nil {
-		logger.Warnf("parse %q env var as int: %v", envName, err)
-		return defaultValue
-	}
-
-	return parsed
-}
diff --git a/cmd/autoscaler/main.go b/cmd/autoscaler/main.go
index 4802234fc..a3b55b2c2 100644
--- a/cmd/autoscaler/main.go
+++ b/cmd/autoscaler/main.go
@@ -19,13 +19,11 @@ package main
 
 import (
 	"context"
-	"flag"
 	"fmt"
 	"log"
 	"net/http"
 	"time"
 
-	"go.opencensus.io/stats/view"
 	"go.uber.org/zap"
 	"golang.org/x/sync/errgroup"
 
@@ -64,26 +62,14 @@ const (
 	controllerNum   = 2
 )
 
-var (
-	masterURL  = flag.String("master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.")
-	kubeconfig = flag.String("kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.")
-)
-
 func main() {
 	// Set up signals so we handle the first shutdown signal gracefully.
 	ctx := signals.NewContext()
 
 	// Report stats on Go memory usage every 30 seconds.
-	msp := metrics.NewMemStatsAll()
-	msp.Start(ctx, 30*time.Second)
-	if err := view.Register(msp.DefaultViews()...); err != nil {
-		log.Fatal("Error exporting go memstats view: ", err)
-	}
+	sharedmain.MemStatsOrDie(ctx)
 
-	cfg, err := sharedmain.GetConfig(*masterURL, *kubeconfig)
-	if err != nil {
-		log.Fatal("Error building kubeconfig: ", err)
-	}
+	cfg := sharedmain.ParseAndGetConfigOrDie()
 
 	log.Printf("Registering %d clients", len(injection.Default.GetClients()))
 	log.Printf("Registering %d informer factories", len(injection.Default.GetInformerFactories()))
@@ -99,6 +85,7 @@ func main() {
 	kubeClient := kubeclient.Get(ctx)
 
 	// We sometimes startup faster than we can reach kube-api. Poll on failure to prevent us terminating
+	var err error
 	if perr := wait.PollImmediate(time.Second, 60*time.Second, func() (bool, error) {
 		if err = version.CheckMinimumVersion(kubeClient.Discovery()); err != nil {
 			log.Print("Failed to get k8s version ", err)
@@ -147,7 +134,8 @@ func main() {
 	}
 
 	// Set up a statserver.
-	statsServer := statserver.New(statsServerAddr, statsCh, logger)
+	// TODO(yanweiguo): Populate the isBktOwner from statfowarder.Forwarder.
+	statsServer := statserver.New(statsServerAddr, statsCh, logger, nil /* isBktOwner*/)
 
 	// Start watching the configs.
 	if err := cmw.Start(ctx.Done()); err != nil {
diff --git a/cmd/default-domain/main.go b/cmd/default-domain/main.go
index c3fdb417b..38ba65584 100644
--- a/cmd/default-domain/main.go
+++ b/cmd/default-domain/main.go
@@ -45,7 +45,7 @@ import (
 )
 
 var (
-	masterURL  = flag.String("master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.")
+	serverURL  = flag.String("server", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.")
 	kubeconfig = flag.String("kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.")
 	magicDNS   = flag.String("magic-dns", "", "The hostname for the magic DNS service, e.g. xip.io or nip.io")
 )
@@ -59,7 +59,7 @@ const (
 )
 
 func clientsFromFlags() (*kubernetes.Clientset, *versioned.Clientset, error) {
-	cfg, err := clientcmd.BuildConfigFromFlags(*masterURL, *kubeconfig)
+	cfg, err := clientcmd.BuildConfigFromFlags(*serverURL, *kubeconfig)
 	if err != nil {
 		return nil, nil, fmt.Errorf("error building kubeconfig: %w", err)
 	}
diff --git a/config/core/configmaps/features.yaml b/config/core/configmaps/features.yaml
index 478cc7d0d..317e1b1d8 100644
--- a/config/core/configmaps/features.yaml
+++ b/config/core/configmaps/features.yaml
@@ -20,7 +20,7 @@ metadata:
   labels:
     serving.knative.dev/release: devel
   annotations:
-    knative.dev/example-checksum: "7f1b7e2d"
+    knative.dev/example-checksum: "6a69cdef"
 data:
   _example: |
     ################################
@@ -105,10 +105,7 @@ data:
     # feature labels revisions in real-time as they become referenced and
     # dereferenced by Routes. This allows us to reap revisions shortly after
     # they are no longer active.
-    #
-    # ALPHA WARNING: This feature is not yet stable or complete. Enabling it
-    # should be used for testing purposes only.
-    responsive-revision-gc: "disabled"
+    responsive-revision-gc: "allowed"
 
     # Controls whether tag header based routing feature are enabled or not.
     # 1. Enabled: enabling tag header based routing
diff --git a/go.mod b/go.mod
index 550f49772..439db4052 100644
--- a/go.mod
+++ b/go.mod
@@ -31,10 +31,10 @@ require (
 	k8s.io/client-go v11.0.1-0.20190805182717-6502b5e7b1b5+incompatible
 	k8s.io/code-generator v0.18.6
 	k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29
-	knative.dev/caching v0.0.0-20200903155132-15c804a0eff7
-	knative.dev/networking v0.0.0-20200906233632-d51e1796d270
-	knative.dev/pkg v0.0.0-20200907175532-3ff7bcc42259
-	knative.dev/test-infra v0.0.0-20200905234932-1d8a4814fd68
+	knative.dev/caching v0.0.0-20200909143351-1c094a1d6eb7
+	knative.dev/networking v0.0.0-20200910005051-91f8ce8c55f7
+	knative.dev/pkg v0.0.0-20200910010051-a79a813ce123
+	knative.dev/test-infra v0.0.0-20200909211651-72eb6ae3c773
 )
 
 replace (
diff --git a/go.sum b/go.sum
index 9dc1d0e68..f4efaea6a 100644
--- a/go.sum
+++ b/go.sum
@@ -1797,12 +1797,12 @@ k8s.io/utils v0.0.0-20200603063816-c1c6865ac451 h1:v8ud2Up6QK1lNOKFgiIVrZdMg7Mpm
 k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 knative.dev/caching v0.0.0-20190719140829-2032732871ff/go.mod h1:dHXFU6CGlLlbzaWc32g80cR92iuBSpsslDNBWI8C7eg=
 knative.dev/caching v0.0.0-20200116200605-67bca2c83dfa/go.mod h1:dHXFU6CGlLlbzaWc32g80cR92iuBSpsslDNBWI8C7eg=
-knative.dev/caching v0.0.0-20200903155132-15c804a0eff7 h1:tSn7+fEFvn0e8Mcs2hoHgzxMQsQ9Gkjp9vOPhzeB8pw=
-knative.dev/caching v0.0.0-20200903155132-15c804a0eff7/go.mod h1:5V2/0AagUm0RX4CsCDOY9FwLRnnF2c5IaaA+kqXbqAc=
+knative.dev/caching v0.0.0-20200909143351-1c094a1d6eb7 h1:E95fhRv/kFHta9HBqsDeeYQ2M3C7xLoP4wrppc9huJ8=
+knative.dev/caching v0.0.0-20200909143351-1c094a1d6eb7/go.mod h1:nYF4RioVWBBmESrsFxoHagAdIrRmwce5VqYfAdnaRRs=
 knative.dev/eventing-contrib v0.6.1-0.20190723221543-5ce18048c08b/go.mod h1:SnXZgSGgMSMLNFTwTnpaOH7hXDzTFtw0J8OmHflNx3g=
 knative.dev/eventing-contrib v0.11.2/go.mod h1:SnXZgSGgMSMLNFTwTnpaOH7hXDzTFtw0J8OmHflNx3g=
-knative.dev/networking v0.0.0-20200906233632-d51e1796d270 h1:G4fR1A22ddZO/TyEMiHyNkgl5wubJsVxdhnvY0emO+w=
-knative.dev/networking v0.0.0-20200906233632-d51e1796d270/go.mod h1:XWL/3cPOuat95etJ12t0MfsVAxwRVQNkKUa+U2WrSaA=
+knative.dev/networking v0.0.0-20200910005051-91f8ce8c55f7 h1:i94Mj0Z+HinkfQs8qeH/mtomgKTTl/SNhXKV1oA9+G8=
+knative.dev/networking v0.0.0-20200910005051-91f8ce8c55f7/go.mod h1:dvbKqbY4Fa54TecwSESpJmrKUTOTAir/XLpBzuA45sY=
 knative.dev/pkg v0.0.0-20191101194912-56c2594e4f11/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q=
 knative.dev/pkg v0.0.0-20191111150521-6d806b998379/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q=
 knative.dev/pkg v0.0.0-20200207155214-fef852970f43/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q=
@@ -1811,25 +1811,23 @@ knative.dev/pkg v0.0.0-20200505191044-3da93ebb24c2/go.mod h1:Q6sL35DdGs8hIQZKdaC
 knative.dev/pkg v0.0.0-20200515002500-16d7b963416f/go.mod h1:tMOHGbxtRz8zYFGEGpV/bpoTEM1o89MwYFC4YJXl3GY=
 knative.dev/pkg v0.0.0-20200528142800-1c6815d7e4c9/go.mod h1:QgNZTxnwpB/oSpNcfnLVlw+WpEwwyKAvJlvR3hgeltA=
 knative.dev/pkg v0.0.0-20200711004937-22502028e31a/go.mod h1:AqAJV6rYi8IGikDjJ/9ZQd9qKdkXVlesVnVjwx62YB8=
-knative.dev/pkg v0.0.0-20200831094608-e9da10bc8a18 h1:BJTbbN0/J0BY76tzHE6/oko4lw6GEeahMrZUfigySyc=
-knative.dev/pkg v0.0.0-20200831094608-e9da10bc8a18/go.mod h1:vOVUMtkIWK+hq1+KwlLYBSYVjz5SNIP1vMj3/5SNGZw=
-knative.dev/pkg v0.0.0-20200901225315-2ee0e988033c h1:UHXZjWBNozXgKsLP9fvOBsjHQSFC0MOxTpIiA+5YHV4=
-knative.dev/pkg v0.0.0-20200901225315-2ee0e988033c/go.mod h1:q+4+Cm768P6vsAvsD9J+cZ1hoy4aHyHSfRTvaFyPd3g=
-knative.dev/pkg v0.0.0-20200907175532-3ff7bcc42259 h1:qNeVGACTmFe+6t4IrQnZTzfhaty0HTQz1BwW7m1M9TQ=
-knative.dev/pkg v0.0.0-20200907175532-3ff7bcc42259/go.mod h1:q+4+Cm768P6vsAvsD9J+cZ1hoy4aHyHSfRTvaFyPd3g=
+knative.dev/pkg v0.0.0-20200908235250-56fba14ba7df h1:5J1YYhiU5g8a2pdnPFiRy+vtPsUHbdoLflJe1RqZnHk=
+knative.dev/pkg v0.0.0-20200908235250-56fba14ba7df/go.mod h1:q+4+Cm768P6vsAvsD9J+cZ1hoy4aHyHSfRTvaFyPd3g=
+knative.dev/pkg v0.0.0-20200909225950-616884240072 h1:yOEYlrjQmPcNGKmJRx6dvwz1mNSzOa81alNlyuTdjh8=
+knative.dev/pkg v0.0.0-20200909225950-616884240072/go.mod h1:q+4+Cm768P6vsAvsD9J+cZ1hoy4aHyHSfRTvaFyPd3g=
+knative.dev/pkg v0.0.0-20200910010051-a79a813ce123 h1:vmsCAlZi/R7FMkgDdb5pMK27wDHFCIwqVR9XYbDOS80=
+knative.dev/pkg v0.0.0-20200910010051-a79a813ce123/go.mod h1:q+4+Cm768P6vsAvsD9J+cZ1hoy4aHyHSfRTvaFyPd3g=
 knative.dev/test-infra v0.0.0-20200407185800-1b88cb3b45a5/go.mod h1:xcdUkMJrLlBswIZqL5zCuBFOC22WIPMQoVX1L35i0vQ=
 knative.dev/test-infra v0.0.0-20200505052144-5ea2f705bb55/go.mod h1:WqF1Azka+FxPZ20keR2zCNtiQA1MP9ZB4BH4HuI+SIU=
 knative.dev/test-infra v0.0.0-20200513011557-d03429a76034/go.mod h1:aMif0KXL4g19YCYwsy4Ocjjz5xgPlseYV+B95Oo4JGE=
 knative.dev/test-infra v0.0.0-20200519015156-82551620b0a9/go.mod h1:A5b2OAXTOeHT3hHhVQm3dmtbuWvIDP7qzgtqxA3/2pE=
 knative.dev/test-infra v0.0.0-20200707183444-aed09e56ddc7/go.mod h1:RjYAhXnZqeHw9+B0zsbqSPlae0lCvjekO/nw5ZMpLCs=
-knative.dev/test-infra v0.0.0-20200825022047-cb4bb218c5e5 h1:iqbpe5rccMW2r1Mu1Prw4gJ9xi7yqahmtxzckTUHBeI=
-knative.dev/test-infra v0.0.0-20200825022047-cb4bb218c5e5/go.mod h1:Pmg2c7Z7q7BGFUV/GOpU5BlrD3ePJft4MPqx8AYBplc=
 knative.dev/test-infra v0.0.0-20200828211307-9d4372c9b1c7 h1:yIzao6i9Hu51SCdpyqBEnhpt7G12FqFrxHK6ZnQnu8o=
 knative.dev/test-infra v0.0.0-20200828211307-9d4372c9b1c7/go.mod h1:Pmg2c7Z7q7BGFUV/GOpU5BlrD3ePJft4MPqx8AYBplc=
-knative.dev/test-infra v0.0.0-20200831235415-fac473dda98b h1:jafH61XDC6EkogEyR70h/sjYLx2Nf3qKVzPP2MCqEQ4=
-knative.dev/test-infra v0.0.0-20200831235415-fac473dda98b/go.mod h1:Pmg2c7Z7q7BGFUV/GOpU5BlrD3ePJft4MPqx8AYBplc=
-knative.dev/test-infra v0.0.0-20200905234932-1d8a4814fd68 h1:LAnw774lO1Cg9NOef/9X1xacmmiV366HVIIk5FQypNg=
-knative.dev/test-infra v0.0.0-20200905234932-1d8a4814fd68/go.mod h1:Pmg2c7Z7q7BGFUV/GOpU5BlrD3ePJft4MPqx8AYBplc=
+knative.dev/test-infra v0.0.0-20200908182932-5a8105609141 h1:bgtLzFLtOYETW03Dm4i9TLZ7m9ycYNTAGZixsZdcn7Q=
+knative.dev/test-infra v0.0.0-20200908182932-5a8105609141/go.mod h1:Pmg2c7Z7q7BGFUV/GOpU5BlrD3ePJft4MPqx8AYBplc=
+knative.dev/test-infra v0.0.0-20200909211651-72eb6ae3c773 h1:R/kYdvSoein2a6BwY1FSZH8wk0aHQ9gN3GQf94AGqcs=
+knative.dev/test-infra v0.0.0-20200909211651-72eb6ae3c773/go.mod h1:Pmg2c7Z7q7BGFUV/GOpU5BlrD3ePJft4MPqx8AYBplc=
 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/apis/autoscaling/register.go b/pkg/apis/autoscaling/register.go
index 42968bda3..960e264ee 100644
--- a/pkg/apis/autoscaling/register.go
+++ b/pkg/apis/autoscaling/register.go
@@ -169,8 +169,4 @@ const (
 	// PanicThresholdPercentageMax is the counterpart to the PanicThresholdPercentageMin
 	// but bounding from above.
 	PanicThresholdPercentageMax = 1000.0
-
-	// KPALabelKey is the label key attached to a K8s Service to hint to the KPA
-	// which services/endpoints should trigger reconciles.
-	KPALabelKey = GroupName + "/kpa"
 )
diff --git a/pkg/apis/config/features.go b/pkg/apis/config/features.go
index 4174ff112..22f3becc4 100644
--- a/pkg/apis/config/features.go
+++ b/pkg/apis/config/features.go
@@ -48,7 +48,7 @@ func defaultFeaturesConfig() *Features {
 		PodSpecRuntimeClassName: Disabled,
 		PodSpecSecurityContext:  Disabled,
 		PodSpecTolerations:      Disabled,
-		ResponsiveRevisionGC:    Disabled,
+		ResponsiveRevisionGC:    Allowed,
 		TagHeaderBasedRouting:   Disabled,
 	}
 }
diff --git a/pkg/apis/serving/v1/revision_types.go b/pkg/apis/serving/v1/revision_types.go
index 36696ea15..36cd3a346 100644
--- a/pkg/apis/serving/v1/revision_types.go
+++ b/pkg/apis/serving/v1/revision_types.go
@@ -152,11 +152,11 @@ type RevisionStatus struct {
 	// for both serving and non serving containers.
 	// ref: http://bit.ly/image-digests
 	// +optional
-	ContainerStatuses []ContainerStatuses `json:"containerStatuses,omitempty"`
+	ContainerStatuses []ContainerStatus `json:"containerStatuses,omitempty"`
 }
 
-// ContainerStatuses holds the information of container name and image digest value
-type ContainerStatuses struct {
+// ContainerStatus holds the information of container name and image digest value
+type ContainerStatus struct {
 	Name        string `json:"name,omitempty"`
 	ImageDigest string `json:"imageDigest,omitempty"`
 }
diff --git a/pkg/apis/serving/v1/zz_generated.deepcopy.go b/pkg/apis/serving/v1/zz_generated.deepcopy.go
index a8d09cb10..d1dc8be44 100644
--- a/pkg/apis/serving/v1/zz_generated.deepcopy.go
+++ b/pkg/apis/serving/v1/zz_generated.deepcopy.go
@@ -139,17 +139,17 @@ func (in *ConfigurationStatusFields) DeepCopy() *ConfigurationStatusFields {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ContainerStatuses) DeepCopyInto(out *ContainerStatuses) {
+func (in *ContainerStatus) DeepCopyInto(out *ContainerStatus) {
 	*out = *in
 	return
 }
 
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerStatuses.
-func (in *ContainerStatuses) DeepCopy() *ContainerStatuses {
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerStatus.
+func (in *ContainerStatus) DeepCopy() *ContainerStatus {
 	if in == nil {
 		return nil
 	}
-	out := new(ContainerStatuses)
+	out := new(ContainerStatus)
 	in.DeepCopyInto(out)
 	return out
 }
@@ -248,7 +248,7 @@ func (in *RevisionStatus) DeepCopyInto(out *RevisionStatus) {
 	in.Status.DeepCopyInto(&out.Status)
 	if in.ContainerStatuses != nil {
 		in, out := &in.ContainerStatuses, &out.ContainerStatuses
-		*out = make([]ContainerStatuses, len(*in))
+		*out = make([]ContainerStatus, len(*in))
 		copy(*out, *in)
 	}
 	return
diff --git a/pkg/apis/serving/v1alpha1/revision_conversion.go b/pkg/apis/serving/v1alpha1/revision_conversion.go
index 37d41cd2b..65535029e 100644
--- a/pkg/apis/serving/v1alpha1/revision_conversion.go
+++ b/pkg/apis/serving/v1alpha1/revision_conversion.go
@@ -76,14 +76,14 @@ func (source *RevisionStatus) ConvertTo(ctx context.Context, sink *v1.RevisionSt
 	sink.ServiceName = source.ServiceName
 	sink.LogURL = source.LogURL
 	sink.DeprecatedImageDigest = source.DeprecatedImageDigest
-	sink.ContainerStatuses = make([]v1.ContainerStatuses, len(source.ContainerStatuses))
+	sink.ContainerStatuses = make([]v1.ContainerStatus, len(source.ContainerStatuses))
 	for i := range source.ContainerStatuses {
 		source.ContainerStatuses[i].ConvertTo(ctx, &sink.ContainerStatuses[i])
 	}
 }
 
 // ConvertTo helps implement apis.Convertible
-func (source *ContainerStatuses) ConvertTo(ctx context.Context, sink *v1.ContainerStatuses) {
+func (source *ContainerStatus) ConvertTo(ctx context.Context, sink *v1.ContainerStatus) {
 	sink.Name = source.Name
 	sink.ImageDigest = source.ImageDigest
 }
@@ -118,14 +118,14 @@ func (sink *RevisionStatus) ConvertFrom(ctx context.Context, source v1.RevisionS
 	sink.ServiceName = source.ServiceName
 	sink.LogURL = source.LogURL
 	sink.DeprecatedImageDigest = source.DeprecatedImageDigest
-	sink.ContainerStatuses = make([]ContainerStatuses, len(source.ContainerStatuses))
+	sink.ContainerStatuses = make([]ContainerStatus, len(source.ContainerStatuses))
 	for i := range sink.ContainerStatuses {
 		sink.ContainerStatuses[i].ConvertFrom(ctx, &source.ContainerStatuses[i])
 	}
 }
 
 // ConvertFrom helps implement apis.Convertible
-func (sink *ContainerStatuses) ConvertFrom(ctx context.Context, source *v1.ContainerStatuses) {
+func (sink *ContainerStatus) ConvertFrom(ctx context.Context, source *v1.ContainerStatus) {
 	sink.Name = source.Name
 	sink.ImageDigest = source.ImageDigest
 }
diff --git a/pkg/apis/serving/v1alpha1/revision_types.go b/pkg/apis/serving/v1alpha1/revision_types.go
index c241604b2..50dcf572c 100644
--- a/pkg/apis/serving/v1alpha1/revision_types.go
+++ b/pkg/apis/serving/v1alpha1/revision_types.go
@@ -176,11 +176,11 @@ type RevisionStatus struct {
 	// for both serving and non serving containers.
 	// ref: http://bit.ly/image-digests
 	// +optional
-	ContainerStatuses []ContainerStatuses `json:"containerStatuses,omitempty"`
+	ContainerStatuses []ContainerStatus `json:"containerStatuses,omitempty"`
 }
 
-// ContainerStatuses holds the information of container name and image digest value
-type ContainerStatuses struct {
+// ContainerStatus holds the information of container name and image digest value
+type ContainerStatus struct {
 	Name        string `json:"name,omitempty"`
 	ImageDigest string `json:"imageDigest,omitempty"`
 }
diff --git a/pkg/apis/serving/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/serving/v1alpha1/zz_generated.deepcopy.go
index 7158264c0..2529b4a69 100644
--- a/pkg/apis/serving/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/serving/v1alpha1/zz_generated.deepcopy.go
@@ -170,17 +170,17 @@ func (in *ConfigurationStatusFields) DeepCopy() *ConfigurationStatusFields {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ContainerStatuses) DeepCopyInto(out *ContainerStatuses) {
+func (in *ContainerStatus) DeepCopyInto(out *ContainerStatus) {
 	*out = *in
 	return
 }
 
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerStatuses.
-func (in *ContainerStatuses) DeepCopy() *ContainerStatuses {
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerStatus.
+func (in *ContainerStatus) DeepCopy() *ContainerStatus {
 	if in == nil {
 		return nil
 	}
-	out := new(ContainerStatuses)
+	out := new(ContainerStatus)
 	in.DeepCopyInto(out)
 	return out
 }
@@ -329,7 +329,7 @@ func (in *RevisionStatus) DeepCopyInto(out *RevisionStatus) {
 	in.Status.DeepCopyInto(&out.Status)
 	if in.ContainerStatuses != nil {
 		in, out := &in.ContainerStatuses, &out.ContainerStatuses
-		*out = make([]ContainerStatuses, len(*in))
+		*out = make([]ContainerStatus, len(*in))
 		copy(*out, *in)
 	}
 	return
diff --git a/pkg/autoscaler/bucket/bucket.go b/pkg/autoscaler/bucket/bucket.go
new file mode 100644
index 000000000..4d8a459e3
--- /dev/null
+++ b/pkg/autoscaler/bucket/bucket.go
@@ -0,0 +1,31 @@
+/*
+Copyright 2020 The Knative Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package bucket
+
+import (
+	"strings"
+)
+
+const prefix = "autoscaler-bucket"
+
+// IsBucketHost returns true if the given host is a host of a K8S Service
+// of a bucket.
+func IsBucketHost(host string) bool {
+	// Currently checking prefix is ok as only requests sent via bucket service
+	// have host with the prefix. Maybe use regexp for improvement.
+	return strings.HasPrefix(host, prefix)
+}
diff --git a/pkg/autoscaler/bucket/doc.go b/pkg/autoscaler/bucket/doc.go
new file mode 100644
index 000000000..d069c4453
--- /dev/null
+++ b/pkg/autoscaler/bucket/doc.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2020 The Knative Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Package bucket provides helper functions for Autoscaler buckets. The
+// buckets are used in Leader Election to support multiple Autoscaler pods.
+package bucket
diff --git a/pkg/autoscaler/statforwarder/forwarder.go b/pkg/autoscaler/statforwarder/forwarder.go
index 6b168a79b..4226754c1 100644
--- a/pkg/autoscaler/statforwarder/forwarder.go
+++ b/pkg/autoscaler/statforwarder/forwarder.go
@@ -22,7 +22,6 @@ import (
 	"sync"
 	"time"
 
-	gorillawebsocket "github.com/gorilla/websocket"
 	"go.uber.org/zap"
 	coordinationv1 "k8s.io/api/coordination/v1"
 	v1 "k8s.io/api/core/v1"
@@ -54,17 +53,6 @@ const (
 // statProcessor is a function to process a single StatMessage.
 type statProcessor func(sm asmetrics.StatMessage)
 
-// bucketProcessor includes the information about how to process
-// the StatMessage owned by a bucket.
-type bucketProcessor struct {
-	// holder is the HolderIdentity for a bucket from the Lease.
-	holder string
-	// conn is the WebSocket connection to the holder pod.
-	conn *websocket.ManagedConnection
-	// proc is the function to process the StatMessage owned by the bucket.
-	proc statProcessor
-}
-
 // Forwarder does the following things:
 // 1. Watches the change of Leases for Autoscaler buckets. Stores the
 //    Lease -> IP mapping.
@@ -293,14 +281,10 @@ func (f *Forwarder) setProcessor(bkt string, p *bucketProcessor) {
 func (f *Forwarder) createProcessor(bkt, holder string) *bucketProcessor {
 	if holder == f.selfIP {
 		return &bucketProcessor{
+			bkt:    bkt,
+			logger: f.logger.With(zap.String("bucket", bkt)),
 			holder: holder,
-			proc: func(sm asmetrics.StatMessage) {
-				l := f.logger.With(zap.String("revision", sm.Key.String()))
-				l.Debug("Accept stat as owner of bucket ", bkt)
-				if f.accept != nil {
-					f.accept(sm)
-				}
-			},
+			accept: f.accept,
 		}
 	}
 
@@ -308,25 +292,12 @@ func (f *Forwarder) createProcessor(bkt, holder string) *bucketProcessor {
 	// is mesh. Need to fall back to connection via Service.
 	dns := fmt.Sprintf("ws://%s:%d", holder, autoscalerPort)
 	f.logger.Info("Connecting to Autoscaler bucket at ", dns)
-	c := websocket.NewDurableSendingConnection(dns, f.logger)
 	f.processingWg.Add(1)
 	return &bucketProcessor{
+		bkt:    bkt,
+		logger: f.logger.With(zap.String("bucket", bkt)),
 		holder: holder,
-		conn:   c,
-		proc: func(sm asmetrics.StatMessage) {
-			l := f.logger.With(zap.String("revision", sm.Key.String()))
-			l.Debugf("Forward stat of bucket %s to the holder %s", bkt, holder)
-			wsms := asmetrics.ToWireStatMessages([]asmetrics.StatMessage{sm})
-			b, err := wsms.Marshal()
-			if err != nil {
-				l.Errorw("Error while marshaling stats", zap.Error(err))
-				return
-			}
-
-			if err := c.SendRaw(gorillawebsocket.BinaryMessage, b); err != nil {
-				l.Errorw("Error while sending stats", zap.Error(err))
-			}
-		},
+		conn:   websocket.NewDurableSendingConnection(dns, f.logger),
 	}
 }
 
@@ -344,7 +315,7 @@ func (f *Forwarder) Process(sm asmetrics.StatMessage) {
 		return
 	}
 
-	p.proc(sm)
+	p.process(sm)
 }
 
 func (f *Forwarder) shutdown(p *bucketProcessor) {
diff --git a/pkg/autoscaler/statforwarder/processor.go b/pkg/autoscaler/statforwarder/processor.go
new file mode 100644
index 000000000..1d4a7fbdb
--- /dev/null
+++ b/pkg/autoscaler/statforwarder/processor.go
@@ -0,0 +1,61 @@
+/*
+Copyright 2020 The Knative Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package statforwarder
+
+import (
+	gorillawebsocket "github.com/gorilla/websocket"
+	"go.uber.org/zap"
+
+	"knative.dev/pkg/websocket"
+	asmetrics "knative.dev/serving/pkg/autoscaler/metrics"
+)
+
+// bucketProcessor includes the information about how to process
+// the StatMessage owned by a bucket.
+type bucketProcessor struct {
+	logger *zap.SugaredLogger
+	// The name of the bucket
+	bkt string
+	// holder is the HolderIdentity for a bucket from the Lease.
+	holder string
+	// conn is the WebSocket connection to the holder pod.
+	conn *websocket.ManagedConnection
+	// `accept` is the function to process a StatMessage which doesn't need
+	// to be forwarded.
+	accept statProcessor
+}
+
+func (p *bucketProcessor) process(sm asmetrics.StatMessage) {
+	l := p.logger.With(zap.String("revision", sm.Key.String()))
+	if p.accept != nil {
+		l.Debug("Accept stat as owner of bucket ", p.bkt)
+		p.accept(sm)
+		return
+	}
+
+	l.Debugf("Forward stat of bucket %s to the holder %s", p.bkt, p.holder)
+	wsms := asmetrics.ToWireStatMessages([]asmetrics.StatMessage{sm})
+	b, err := wsms.Marshal()
+	if err != nil {
+		l.Errorw("Error while marshaling stats", zap.Error(err))
+		return
+	}
+
+	if err := p.conn.SendRaw(gorillawebsocket.BinaryMessage, b); err != nil {
+		l.Errorw("Error while sending stats", zap.Error(err))
+	}
+}
diff --git a/pkg/autoscaler/statserver/server.go b/pkg/autoscaler/statserver/server.go
index c5b788ea3..b05560060 100644
--- a/pkg/autoscaler/statserver/server.go
+++ b/pkg/autoscaler/statserver/server.go
@@ -22,17 +22,24 @@ import (
 	"encoding/json"
 	"net"
 	"net/http"
+	"strings"
 	"sync"
 	"time"
 
 	"github.com/gorilla/websocket"
 	"go.uber.org/zap"
 	network "knative.dev/networking/pkg"
+	"knative.dev/serving/pkg/autoscaler/bucket"
 	"knative.dev/serving/pkg/autoscaler/metrics"
 )
 
 const closeCodeServiceRestart = 1012 // See https://www.iana.org/assignments/websocket/websocket.xhtml
 
+// isBucketHost is the function deciding whether a host of a request is
+// of an Autoscaler bucket service. It is set to bucket.IsBucketHost
+// in production while can be overriden for testing.
+var isBucketHost = bucket.IsBucketHost
+
 // Server receives autoscaler statistics over WebSocket and sends them to a channel.
 type Server struct {
 	addr        string
@@ -41,17 +48,19 @@ type Server struct {
 	stopCh      chan struct{}
 	statsCh     chan<- metrics.StatMessage
 	openClients sync.WaitGroup
+	isBktOwner  func(bktName string) bool
 	logger      *zap.SugaredLogger
 }
 
 // New creates a Server which will receive autoscaler statistics and forward them to statsCh until Shutdown is called.
-func New(statsServerAddr string, statsCh chan<- metrics.StatMessage, logger *zap.SugaredLogger) *Server {
+func New(statsServerAddr string, statsCh chan<- metrics.StatMessage, logger *zap.SugaredLogger, isBktOwner func(bktName string) bool) *Server {
 	svr := Server{
 		addr:        statsServerAddr,
 		servingCh:   make(chan struct{}),
 		stopCh:      make(chan struct{}),
 		statsCh:     statsCh,
 		openClients: sync.WaitGroup{},
+		isBktOwner:  isBktOwner,
 		logger:      logger.Named("stats-websocket-server").With("address", statsServerAddr),
 	}
 
@@ -113,6 +122,16 @@ func (s *Server) Handler(w http.ResponseWriter, r *http.Request) {
 	if handleHealthz(w, r) {
 		return
 	}
+
+	if s.isBktOwner != nil && isBucketHost(r.Host) {
+		bkt := strings.SplitN(r.Host, ".", 2)[0]
+		// It won't affect connections via Autoscaler service (used by Activator) or IP address.
+		if !s.isBktOwner(bkt) {
+			s.logger.Warn("Closing websocket because not the owner of the bucket ", bkt)
+			return
+		}
+	}
+
 	var upgrader websocket.Upgrader
 	conn, err := upgrader.Upgrade(w, r, nil)
 	if err != nil {
@@ -131,7 +150,7 @@ func (s *Server) Handler(w http.ResponseWriter, r *http.Request) {
 			s.logger.Debug("Sending close message to client")
 			err := conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(closeCodeServiceRestart, "Restarting"))
 			if err != nil {
-				s.logger.Errorf("Failed to send close message to client: %#v", err)
+				s.logger.Warnw("Failed to send close message to client", zap.Error(err))
 			}
 			conn.Close()
 		case <-handlerCh:
diff --git a/pkg/metrics/key.go b/pkg/metrics/key.go
index f5987bad8..2bc7ec9a4 100644
--- a/pkg/metrics/key.go
+++ b/pkg/metrics/key.go
@@ -27,10 +27,6 @@ import (
 // - length between 1 and 255 inclusive
 // - characters are printable US-ASCII
 var (
-	NamespaceTagKey      = tag.MustNewKey(metricskey.LabelNamespaceName)
-	ServiceTagKey        = tag.MustNewKey(metricskey.LabelServiceName)
-	ConfigTagKey         = tag.MustNewKey(metricskey.LabelConfigurationName)
-	RevisionTagKey       = tag.MustNewKey(metricskey.LabelRevisionName)
 	PodTagKey            = tag.MustNewKey(metricskey.PodName)
 	ContainerTagKey      = tag.MustNewKey(metricskey.ContainerName)
 	ResponseCodeKey      = tag.MustNewKey(metricskey.LabelResponseCode)
diff --git a/pkg/reconciler/revision/revision.go b/pkg/reconciler/revision/revision.go
index 4f7d9d61f..f5d5be3d4 100644
--- a/pkg/reconciler/revision/revision.go
+++ b/pkg/reconciler/revision/revision.go
@@ -68,14 +68,14 @@ var _ revisionreconciler.Interface = (*Reconciler)(nil)
 
 func (c *Reconciler) reconcileDigest(ctx context.Context, rev *v1.Revision) error {
 	if rev.Status.ContainerStatuses == nil {
-		rev.Status.ContainerStatuses = make([]v1.ContainerStatuses, 0, len(rev.Spec.Containers))
+		rev.Status.ContainerStatuses = make([]v1.ContainerStatus, 0, len(rev.Spec.Containers))
 	}
 
 	if rev.Status.DeprecatedImageDigest != "" {
 		// Default old revisions to have ContainerStatuses filled in.
 		// This path should only be taken by "old" revisions that have exactly one container.
 		if len(rev.Status.ContainerStatuses) == 0 {
-			rev.Status.ContainerStatuses = append(rev.Status.ContainerStatuses, v1.ContainerStatuses{
+			rev.Status.ContainerStatuses = append(rev.Status.ContainerStatuses, v1.ContainerStatus{
 				Name:        rev.Spec.Containers[0].Name,
 				ImageDigest: rev.Status.DeprecatedImageDigest,
 			})
@@ -99,7 +99,7 @@ func (c *Reconciler) reconcileDigest(ctx context.Context, rev *v1.Revision) erro
 	}
 
 	var digestGrp errgroup.Group
-	containerStatuses := make([]v1.ContainerStatuses, len(rev.Spec.Containers))
+	containerStatuses := make([]v1.ContainerStatus, len(rev.Spec.Containers))
 	for i, container := range rev.Spec.Containers {
 		container := container // Standard Go concurrency pattern.
 		i := i
@@ -117,7 +117,7 @@ func (c *Reconciler) reconcileDigest(ctx context.Context, rev *v1.Revision) erro
 				rev.Status.DeprecatedImageDigest = digest
 			}
 
-			containerStatuses[i] = v1.ContainerStatuses{
+			containerStatuses[i] = v1.ContainerStatus{
 				Name:        container.Name,
 				ImageDigest: digest,
 			}
diff --git a/pkg/reconciler/service/resources/configuration.go b/pkg/reconciler/service/resources/configuration.go
index e98d6c6b5..52ecdab89 100644
--- a/pkg/reconciler/service/resources/configuration.go
+++ b/pkg/reconciler/service/resources/configuration.go
@@ -32,7 +32,7 @@ import (
 
 // MakeConfiguration creates a Configuration from a Service object.
 func MakeConfiguration(service *v1.Service) (*v1.Configuration, error) {
-	return MakeConfigurationFromExisting(service, &v1.Configuration{}, cfgmap.Disabled)
+	return MakeConfigurationFromExisting(service, &v1.Configuration{}, cfgmap.Allowed)
 }
 
 // MakeConfigurationFromExisting creates a Configuration from a Service object given an existing Configuration.
diff --git a/pkg/reconciler/service/service.go b/pkg/reconciler/service/service.go
index e3955abf2..9c3f5dd82 100644
--- a/pkg/reconciler/service/service.go
+++ b/pkg/reconciler/service/service.go
@@ -43,11 +43,6 @@ import (
 	resourcenames "knative.dev/serving/pkg/reconciler/service/resources/names"
 )
 
-const (
-	// ReconcilerName is the name of the reconciler
-	ReconcilerName = "Services"
-)
-
 // Reconciler implements controller.Reconciler for Service resources.
 type Reconciler struct {
 	client clientset.Interface
diff --git a/third_party/cert-manager-0.12.0/net-certmanager.yaml b/third_party/cert-manager-0.12.0/net-certmanager.yaml
index 746836101..2c00acbf3 100644
--- a/third_party/cert-manager-0.12.0/net-certmanager.yaml
+++ b/third_party/cert-manager-0.12.0/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: "v20200907-f33fbfc"
+    serving.knative.dev/release: "v20200909-42dae3b"
     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: "v20200907-f33fbfc"
+    serving.knative.dev/release: "v20200909-42dae3b"
 webhooks:
 - admissionReviewVersions:
   - v1beta1
@@ -86,7 +86,7 @@ metadata:
   name: net-certmanager-webhook-certs
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200907-f33fbfc"
+    serving.knative.dev/release: "v20200909-42dae3b"
 
 ---
 # Copyright 2020 The Knative Authors
@@ -109,7 +109,7 @@ metadata:
   name: config-certmanager
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200907-f33fbfc"
+    serving.knative.dev/release: "v20200909-42dae3b"
     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: "v20200907-f33fbfc"
+    serving.knative.dev/release: "v20200909-42dae3b"
     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: "v20200907-f33fbfc"
+        serving.knative.dev/release: "v20200909-42dae3b"
     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:bd3a8a2dad97d9b339e6cfc6a6903a840a46ab5d4db7b134634a380749233a4a
+        image: gcr.io/knative-nightly/knative.dev/net-certmanager/cmd/controller@sha256:78ccda2859dfe4dde83d94d2d838f20e958d38201cae218b4a887a0e152b97b3
         resources:
           requests:
             cpu: 30m
@@ -208,7 +208,7 @@ kind: Service
 metadata:
   labels:
     app: networking-certmanager
-    serving.knative.dev/release: "v20200907-f33fbfc"
+    serving.knative.dev/release: "v20200909-42dae3b"
     networking.knative.dev/certificate-provider: cert-manager
   name: networking-certmanager
   namespace: knative-serving
@@ -245,7 +245,7 @@ metadata:
   name: net-certmanager-webhook
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200907-f33fbfc"
+    serving.knative.dev/release: "v20200909-42dae3b"
 spec:
   selector:
     matchLabels:
@@ -258,14 +258,14 @@ spec:
       labels:
         app: net-certmanager-webhook
         role: net-certmanager-webhook
-        serving.knative.dev/release: "v20200907-f33fbfc"
+        serving.knative.dev/release: "v20200909-42dae3b"
     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:5e4203ee7a2196f00abe25393423753591bb0e8dde94175db547672e1b62f436
+        image: gcr.io/knative-nightly/knative.dev/net-certmanager/cmd/webhook@sha256:59882d31389172e43dab687752655661bc6f896893f407621e4bc1870e2c6607
         resources:
           requests:
             cpu: 20m
@@ -319,7 +319,7 @@ metadata:
   namespace: knative-serving
   labels:
     role: net-certmanager-webhook
-    serving.knative.dev/release: "v20200907-f33fbfc"
+    serving.knative.dev/release: "v20200909-42dae3b"
 spec:
   ports:
   - # Define metrics and profiling for them to be accessible within service meshes.
diff --git a/third_party/net-istio.yaml b/third_party/net-istio.yaml
index 7fad3e89d..7581349ee 100644
--- a/third_party/net-istio.yaml
+++ b/third_party/net-istio.yaml
@@ -18,7 +18,7 @@ metadata:
   # These are the permissions needed by the Istio Ingress implementation.
   name: knative-serving-istio
   labels:
-    serving.knative.dev/release: "v20200907-1e7400a9"
+    serving.knative.dev/release: "v20200909-771dc544"
     serving.knative.dev/controller: "true"
     networking.knative.dev/ingress-provider: istio
 rules:
@@ -48,7 +48,7 @@ metadata:
   name: knative-ingress-gateway
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200907-1e7400a9"
+    serving.knative.dev/release: "v20200909-771dc544"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -85,7 +85,7 @@ metadata:
   name: cluster-local-gateway
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200907-1e7400a9"
+    serving.knative.dev/release: "v20200909-771dc544"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -104,7 +104,7 @@ metadata:
   name: knative-local-gateway
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200907-1e7400a9"
+    serving.knative.dev/release: "v20200909-771dc544"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -123,7 +123,7 @@ metadata:
   name: knative-local-gateway
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200907-1e7400a9"
+    serving.knative.dev/release: "v20200909-771dc544"
     networking.knative.dev/ingress-provider: istio
 spec:
   type: ClusterIP
@@ -181,7 +181,7 @@ kind: MutatingWebhookConfiguration
 metadata:
   name: webhook.istio.networking.internal.knative.dev
   labels:
-    serving.knative.dev/release: "v20200907-1e7400a9"
+    serving.knative.dev/release: "v20200909-771dc544"
     networking.knative.dev/ingress-provider: istio
 webhooks:
 - admissionReviewVersions:
@@ -217,7 +217,7 @@ kind: ValidatingWebhookConfiguration
 metadata:
   name: config.webhook.istio.networking.internal.knative.dev
   labels:
-    serving.knative.dev/release: "v20200907-1e7400a9"
+    serving.knative.dev/release: "v20200909-771dc544"
     networking.knative.dev/ingress-provider: istio
 webhooks:
 - admissionReviewVersions:
@@ -255,7 +255,7 @@ metadata:
   name: istio-webhook-certs
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200907-1e7400a9"
+    serving.knative.dev/release: "v20200909-771dc544"
     networking.knative.dev/ingress-provider: istio
 
 ---
@@ -279,7 +279,7 @@ metadata:
   name: config-istio
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200907-1e7400a9"
+    serving.knative.dev/release: "v20200909-771dc544"
     networking.knative.dev/ingress-provider: istio
 data:
   _example: |
@@ -349,7 +349,7 @@ metadata:
   name: networking-istio
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200907-1e7400a9"
+    serving.knative.dev/release: "v20200909-771dc544"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -365,14 +365,14 @@ spec:
         sidecar.istio.io/inject: "false"
       labels:
         app: networking-istio
-        serving.knative.dev/release: "v20200907-1e7400a9"
+        serving.knative.dev/release: "v20200909-771dc544"
     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:3009d5d5421f6658e7516ce686405e9326a9ea58bcec2a34895ae63228a31d3d
+        image: gcr.io/knative-nightly/knative.dev/net-istio/cmd/controller@sha256:f08906e9578c828513d0ccae5ec2b15e0b6e06a0b36d6bbe8088bc8fbda9e6ef
         resources:
           requests:
             cpu: 30m
@@ -424,7 +424,7 @@ metadata:
   name: istio-webhook
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200907-1e7400a9"
+    serving.knative.dev/release: "v20200909-771dc544"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -438,14 +438,14 @@ spec:
       labels:
         app: istio-webhook
         role: istio-webhook
-        serving.knative.dev/release: "v20200907-1e7400a9"
+        serving.knative.dev/release: "v20200909-771dc544"
     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:eb933a471ed285b1f2edd864de02ba5bbe1fad3010ac3885b848977a4108a223
+        image: gcr.io/knative-nightly/knative.dev/net-istio/cmd/webhook@sha256:e01542da733da5d24d7a7ba84fe077f357dca7ba19e57930e939c52813942dba
         resources:
           requests:
             cpu: 20m
@@ -499,7 +499,7 @@ metadata:
   namespace: knative-serving
   labels:
     role: istio-webhook
-    serving.knative.dev/release: "v20200907-1e7400a9"
+    serving.knative.dev/release: "v20200909-771dc544"
     networking.knative.dev/ingress-provider: istio
 spec:
   ports:
diff --git a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_lifecycle.go b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_lifecycle.go
index 1db93318d..527d3f719 100644
--- a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_lifecycle.go
+++ b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_lifecycle.go
@@ -47,7 +47,7 @@ func (is *IngressStatus) GetCondition(t apis.ConditionType) *apis.Condition {
 func (is *IngressStatus) InitializeConditions() {
 	ingressCondSet.Manage(is).InitializeConditions()
 
-	// Deprecatd, do not set.
+	// Deprecated, do not set.
 	is.DeprecatedLoadBalancer = nil
 }
 
diff --git a/vendor/knative.dev/pkg/apiextensions/storageversion/cmd/migrate/config.go b/vendor/knative.dev/pkg/apiextensions/storageversion/cmd/migrate/config.go
index 2507e737d..5d3bb5560 100644
--- a/vendor/knative.dev/pkg/apiextensions/storageversion/cmd/migrate/config.go
+++ b/vendor/knative.dev/pkg/apiextensions/storageversion/cmd/migrate/config.go
@@ -31,7 +31,7 @@ import (
 
 func configOrDie() *rest.Config {
 	var (
-		masterURL = flag.String("master", "",
+		serverURL = flag.String("server", "",
 			"The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.")
 		kubeconfig = flag.String("kubeconfig", "",
 			"Path to a kubeconfig. Only required if out-of-cluster.")
@@ -39,7 +39,7 @@ func configOrDie() *rest.Config {
 
 	flag.Parse()
 
-	cfg, err := getConfig(*masterURL, *kubeconfig)
+	cfg, err := getConfig(*serverURL, *kubeconfig)
 	if err != nil {
 		panic(fmt.Sprintf("Error building kubeconfig: %v", err))
 	}
@@ -49,17 +49,17 @@ func configOrDie() *rest.Config {
 
 // getConfig returns a rest.Config to be used for kubernetes client creation.
 // It does so in the following order:
-//   1. Use the passed kubeconfig/masterURL.
+//   1. Use the passed kubeconfig/serverURL.
 //   2. Fallback to the KUBECONFIG environment variable.
 //   3. Fallback to in-cluster config.
 //   4. Fallback to the ~/.kube/config.
-func getConfig(masterURL, kubeconfig string) (*rest.Config, error) {
+func getConfig(serverURL, kubeconfig string) (*rest.Config, error) {
 	if kubeconfig == "" {
 		kubeconfig = os.Getenv("KUBECONFIG")
 	}
 	// If we have an explicit indication of where the kubernetes config lives, read that.
 	if kubeconfig != "" {
-		return clientcmd.BuildConfigFromFlags(masterURL, kubeconfig)
+		return clientcmd.BuildConfigFromFlags(serverURL, kubeconfig)
 	}
 	// If not, try the in-cluster config.
 	if c, err := rest.InClusterConfig(); err == nil {
diff --git a/vendor/knative.dev/pkg/injection/sharedmain/main.go b/vendor/knative.dev/pkg/injection/sharedmain/main.go
index af1baa774..e27bb8763 100644
--- a/vendor/knative.dev/pkg/injection/sharedmain/main.go
+++ b/vendor/knative.dev/pkg/injection/sharedmain/main.go
@@ -58,11 +58,11 @@ import (
 
 // GetConfig returns a rest.Config to be used for kubernetes client creation.
 // It does so in the following order:
-//   1. Use the passed kubeconfig/masterURL.
+//   1. Use the passed kubeconfig/serverURL.
 //   2. Fallback to the KUBECONFIG environment variable.
 //   3. Fallback to in-cluster config.
 //   4. Fallback to the ~/.kube/config.
-func GetConfig(masterURL, kubeconfig string) (*rest.Config, error) {
+func GetConfig(serverURL, kubeconfig string) (*rest.Config, error) {
 	if kubeconfig == "" {
 		kubeconfig = os.Getenv("KUBECONFIG")
 	}
@@ -75,7 +75,7 @@ func GetConfig(masterURL, kubeconfig string) (*rest.Config, error) {
 
 	// If we have an explicit indication of where the kubernetes config lives, read that.
 	if kubeconfig != "" {
-		c, err := clientcmd.BuildConfigFromFlags(masterURL, kubeconfig)
+		c, err := clientcmd.BuildConfigFromFlags(serverURL, kubeconfig)
 		if err != nil {
 			return nil, err
 		}
@@ -305,7 +305,7 @@ func flush(logger *zap.SugaredLogger) {
 // dies by calling log.Fatalf.
 func ParseAndGetConfigOrDie() *rest.Config {
 	var (
-		masterURL = flag.String("master", "",
+		serverURL = flag.String("server", "",
 			"The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.")
 		kubeconfig = flag.String("kubeconfig", "",
 			"Path to a kubeconfig. Only required if out-of-cluster.")
@@ -313,7 +313,7 @@ func ParseAndGetConfigOrDie() *rest.Config {
 	klog.InitFlags(flag.CommandLine)
 	flag.Parse()
 
-	cfg, err := GetConfig(*masterURL, *kubeconfig)
+	cfg, err := GetConfig(*serverURL, *kubeconfig)
 	if err != nil {
 		log.Fatalf("Error building kubeconfig: %v", err)
 	}
diff --git a/vendor/knative.dev/pkg/leaderelection/chaosduck/main.go b/vendor/knative.dev/pkg/leaderelection/chaosduck/main.go
index eeb20383f..5f21d4cb6 100644
--- a/vendor/knative.dev/pkg/leaderelection/chaosduck/main.go
+++ b/vendor/knative.dev/pkg/leaderelection/chaosduck/main.go
@@ -35,6 +35,7 @@ import (
 	kubeclient "knative.dev/pkg/client/injection/kube/client"
 	"knative.dev/pkg/injection/sharedmain"
 	"knative.dev/pkg/kflag"
+	"knative.dev/pkg/signals"
 	"knative.dev/pkg/system"
 )
 
@@ -115,7 +116,8 @@ func quack(ctx context.Context, kc kubernetes.Interface, component string, leade
 }
 
 func main() {
-	ctx := sharedmain.EnableInjectionOrDie(nil, nil)
+	ctx := signals.NewContext()
+	ctx = sharedmain.EnableInjectionOrDie(ctx, nil)
 
 	kc := kubeclient.Get(ctx)
 
diff --git a/vendor/knative.dev/pkg/metrics/config_observability.go b/vendor/knative.dev/pkg/metrics/config_observability.go
index 12df827de..177b35cb1 100644
--- a/vendor/knative.dev/pkg/metrics/config_observability.go
+++ b/vendor/knative.dev/pkg/metrics/config_observability.go
@@ -35,9 +35,13 @@ const (
 	defaultRequestMetricsBackend = "prometheus"
 
 	// The env var name for config-observability
-	configMapNameEnv  = "CONFIG_OBSERVABILITY_NAME"
-	reqLogTemplateKey = "logging.request-log-template"
-	enableReqLogKey   = "logging.enable-request-log"
+	configMapNameEnv = "CONFIG_OBSERVABILITY_NAME"
+
+	// ReqLogTemplateKey is the CM key for the request log template.
+	ReqLogTemplateKey = "logging.request-log-template"
+
+	// EnableReqLogKey is the CM key to enable request log.
+	EnableReqLogKey = "logging.enable-request-log"
 )
 
 // ObservabilityConfig contains the configuration defined in the observability ConfigMap.
@@ -88,8 +92,8 @@ func NewObservabilityConfigFromConfigMap(configMap *corev1.ConfigMap) (*Observab
 	if err := cm.Parse(configMap.Data,
 		cm.AsBool("logging.enable-var-log-collection", &oc.EnableVarLogCollection),
 		cm.AsString("logging.revision-url-template", &oc.LoggingURLTemplate),
-		cm.AsString(reqLogTemplateKey, &oc.RequestLogTemplate),
-		cm.AsBool(enableReqLogKey, &oc.EnableRequestLog),
+		cm.AsString(ReqLogTemplateKey, &oc.RequestLogTemplate),
+		cm.AsBool(EnableReqLogKey, &oc.EnableRequestLog),
 		cm.AsBool("logging.enable-probe-request-log", &oc.EnableProbeRequestLog),
 		cm.AsString("metrics.request-metrics-backend-destination", &oc.RequestMetricsBackend),
 		cm.AsBool("profiling.enable", &oc.EnableProfiling),
@@ -99,7 +103,7 @@ func NewObservabilityConfigFromConfigMap(configMap *corev1.ConfigMap) (*Observab
 	}
 
 	if oc.RequestLogTemplate == "" && oc.EnableRequestLog {
-		return nil, fmt.Errorf("%q was set to true, but no %q was specified", enableReqLogKey, reqLogTemplateKey)
+		return nil, fmt.Errorf("%q was set to true, but no %q was specified", EnableReqLogKey, ReqLogTemplateKey)
 	}
 
 	if oc.RequestLogTemplate != "" {
diff --git a/vendor/knative.dev/pkg/reconciler/retry.go b/vendor/knative.dev/pkg/reconciler/retry.go
index dd9d41455..1a50406b1 100644
--- a/vendor/knative.dev/pkg/reconciler/retry.go
+++ b/vendor/knative.dev/pkg/reconciler/retry.go
@@ -16,16 +16,51 @@ limitations under the License.
 package reconciler
 
 import (
+	"strings"
+
+	apierrs "k8s.io/apimachinery/pkg/api/errors"
 	"k8s.io/client-go/util/retry"
 )
 
 // RetryUpdateConflicts retries the inner function if it returns conflict errors.
 // This can be used to retry status updates without constantly reenqueuing keys.
 func RetryUpdateConflicts(updater func(int) error) error {
+	return RetryErrors(updater, apierrs.IsConflict)
+}
+
+// RetryErrors retries the inner function if it returns matching errors.
+func RetryErrors(updater func(int) error, fns ...func(error) bool) error {
 	attempts := 0
-	return retry.RetryOnConflict(retry.DefaultRetry, func() error {
+	return retry.OnError(retry.DefaultRetry, func(err error) bool {
+		for _, fn := range fns {
+			if fn(err) {
+				return true
+			}
+		}
+		return false
+	}, func() error {
 		err := updater(attempts)
 		attempts++
 		return err
 	})
 }
+
+// RetryTestErrors retries the inner function if it hits an error type that is
+// common in our test environments.
+func RetryTestErrors(updater func(int) error) error {
+	return RetryErrors(updater,
+		// Example: conflicts updating `gke-resource-quotas` (implicit on Service/Pod/Ingress creations)
+		apierrs.IsConflict,
+
+		// Example: https://github.com/knative/test-infra/issues/2346#issuecomment-687220045
+		func(err error) bool {
+			return strings.Contains(err.Error(), "gke-resource-quotas")
+		},
+
+		// Example: `etcdserver: request timed out`
+		// TODO(mattmoor): Does apierrs.IsServerTimeout catch the above?
+		func(err error) bool {
+			return strings.Contains(err.Error(), "etcdserver")
+		},
+	)
+}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 5d0aed016..a7d6bafe2 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -1040,7 +1040,7 @@ k8s.io/utils/buffer
 k8s.io/utils/integer
 k8s.io/utils/pointer
 k8s.io/utils/trace
-# knative.dev/caching v0.0.0-20200903155132-15c804a0eff7
+# knative.dev/caching v0.0.0-20200909143351-1c094a1d6eb7
 ## explicit
 knative.dev/caching/config
 knative.dev/caching/pkg/apis/caching
@@ -1061,7 +1061,7 @@ 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/networking v0.0.0-20200906233632-d51e1796d270
+# knative.dev/networking v0.0.0-20200910005051-91f8ce8c55f7
 ## explicit
 knative.dev/networking/pkg
 knative.dev/networking/pkg/apis/networking
@@ -1088,7 +1088,7 @@ knative.dev/networking/pkg/client/injection/informers/networking/v1alpha1/server
 knative.dev/networking/pkg/client/injection/reconciler/networking/v1alpha1/serverlessservice
 knative.dev/networking/pkg/client/listers/networking/v1alpha1
 knative.dev/networking/pkg/ingress
-# knative.dev/pkg v0.0.0-20200907175532-3ff7bcc42259
+# knative.dev/pkg v0.0.0-20200910010051-a79a813ce123
 ## explicit
 knative.dev/pkg/apiextensions/storageversion
 knative.dev/pkg/apiextensions/storageversion/cmd/migrate
@@ -1214,7 +1214,7 @@ knative.dev/pkg/webhook/resourcesemantics/conversion
 knative.dev/pkg/webhook/resourcesemantics/defaulting
 knative.dev/pkg/webhook/resourcesemantics/validation
 knative.dev/pkg/websocket
-# knative.dev/test-infra v0.0.0-20200905234932-1d8a4814fd68
+# knative.dev/test-infra v0.0.0-20200909211651-72eb6ae3c773
 ## explicit
 knative.dev/test-infra/scripts
 # sigs.k8s.io/yaml v1.2.0


Test patch:
diff --git a/cmd/activator/request_log_test.go b/cmd/activator/request_log_test.go
index 89ad3081c..9a879004b 100644
--- a/cmd/activator/request_log_test.go
+++ b/cmd/activator/request_log_test.go
@@ -24,7 +24,12 @@ import (
 
 	"github.com/google/go-cmp/cmp"
 
-	testing2 "knative.dev/pkg/logging/testing"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/util/uuid"
+
+	ltesting "knative.dev/pkg/logging/testing"
+	"knative.dev/pkg/metrics"
 	rtesting "knative.dev/pkg/reconciler/testing"
 	"knative.dev/serving/pkg/activator"
 	"knative.dev/serving/pkg/apis/serving"
@@ -33,8 +38,6 @@ import (
 	fakerevisioninformer "knative.dev/serving/pkg/client/injection/informers/serving/v1/revision/fake"
 	servinglisters "knative.dev/serving/pkg/client/listers/serving/v1"
 	pkghttp "knative.dev/serving/pkg/http"
-
-	corev1 "k8s.io/api/core/v1"
 )
 
 const (
@@ -58,78 +61,65 @@ func TestUpdateRequestLogFromConfigMap(t *testing.T) {
 	tests := []struct {
 		name string
 		url  string
-		body string
 		data map[string]string
 		want string
 	}{{
 		name: "empty template",
 		url:  "http://example.com/testpage",
-		body: "test",
 		data: map[string]string{
-			"logging.request-log-template": "",
+			metrics.ReqLogTemplateKey: "",
 		},
-		want: "",
 	}, {
 		name: "template with new line",
 		url:  "http://example.com/testpage",
-		body: "test",
 		data: map[string]string{
-			"logging.request-log-template": "{{.Request.URL}}\n",
-			"logging.enable-request-log":   "true",
+			metrics.ReqLogTemplateKey: "{{.Request.URL}}\n",
+			metrics.EnableReqLogKey:   "true",
 		},
 		want: "http://example.com/testpage\n",
 	}, {
 		name: "invalid template",
 		url:  "http://example.com",
-		body: "test",
 		data: map[string]string{
-			"logging.request-log-template": "{{}}",
+			metrics.ReqLogTemplateKey: "{{}}",
 		},
 		want: "http://example.com\n",
 	}, {
 		name: "revision info",
 		url:  "http://example.com",
-		body: "test",
 		data: map[string]string{
-			"logging.request-log-template": "{{.Revision.Name}}, {{.Revision.Namespace}}, {{.Revision.Service}}, {{.Revision.Configuration}}, {{.Revision.PodName}}, {{.Revision.PodIP}}",
-			"logging.enable-request-log":   "true",
+			metrics.ReqLogTemplateKey: "{{.Revision.Name}}, {{.Revision.Namespace}}, {{.Revision.Service}}, {{.Revision.Configuration}}, {{.Revision.PodName}}, {{.Revision.PodIP}}",
+			metrics.EnableReqLogKey:   "true",
 		},
 		want: "testRevision, testNs, testSvc, testConfig, , \n",
 	}, {
 		name: "empty template 2",
 		url:  "http://example.com/testpage",
-		body: "test",
 		data: map[string]string{
-			"logging.request-log-template": "",
+			metrics.ReqLogTemplateKey: "",
 		},
-		want: "",
 	}, {
 		name: "explicitly enable request logging",
 		url:  "http://example.com/testpage",
-		body: "test",
 		data: map[string]string{
-			"logging.request-log-template": "{{.Request.URL}}\n",
-			"logging.enable-request-log":   "true",
+			metrics.ReqLogTemplateKey: "{{.Request.URL}}\n",
+			metrics.EnableReqLogKey:   "true",
 		},
 		want: "http://example.com/testpage\n",
 	}, {
 		name: "explicitly disable request logging",
 		url:  "http://example.com/testpage",
-		body: "test",
 		data: map[string]string{
-			"logging.request-log-template": "{{.Request.URL}}\n",
-			"logging.enable-request-log":   "false",
+			metrics.ReqLogTemplateKey: "{{.Request.URL}}\n",
+			metrics.EnableReqLogKey:   "false",
 		},
-		want: "",
 	}, {
 		name: "explicitly enable request logging with empty template",
 		url:  "http://example.com/testpage",
-		body: "test",
 		data: map[string]string{
-			"logging.request-log-template": "",
-			"logging.enable-request-log":   "true",
+			metrics.ReqLogTemplateKey: "",
+			metrics.EnableReqLogKey:   "true",
 		},
-		want: "",
 	}}
 
 	for _, test := range tests {
@@ -137,9 +127,10 @@ func TestUpdateRequestLogFromConfigMap(t *testing.T) {
 			buf.Reset()
 			cm := &corev1.ConfigMap{}
 			cm.Data = test.data
-			(updateRequestLogFromConfigMap(testing2.TestLogger(t), handler))(cm)
+			(updateRequestLogFromConfigMap(ltesting.TestLogger(t), handler))(cm)
 			resp := httptest.NewRecorder()
-			req := httptest.NewRequest(http.MethodPost, test.url, bytes.NewBufferString(test.body))
+			rs := string(uuid.NewUUID())
+			req := httptest.NewRequest(http.MethodPost, test.url, bytes.NewBufferString(rs))
 			req.Header = map[string][]string{
 				activator.RevisionHeaderName:      {testRevisionName},
 				activator.RevisionHeaderNamespace: {testNamespaceName},
@@ -204,7 +195,7 @@ func TestRequestLogTemplateInputGetter(t *testing.T) {
 		t.Run(test.name, func(t *testing.T) {
 			got := test.getter(test.request, test.response)
 			if !cmp.Equal(*got.Revision, test.want) {
-				t.Errorf("Got = %v, want: %v, diff: %s", got.Revision, test.want, cmp.Diff(got.Revision, test.want))
+				t.Errorf("Got = %v, want: %v, diff:\n%s", got.Revision, test.want, cmp.Diff(got.Revision, test.want))
 			}
 			if got.Request != test.request {
 				t.Errorf("Got = %v, want: %v", got.Request, test.request)
@@ -217,9 +208,12 @@ func TestRequestLogTemplateInputGetter(t *testing.T) {
 }
 
 func revisionLister(t *testing.T, addLabels bool) servinglisters.RevisionLister {
-	rev := &v1.Revision{}
-	rev.Name = testRevisionName
-	rev.Namespace = testNamespaceName
+	rev := &v1.Revision{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      testRevisionName,
+			Namespace: testNamespaceName,
+		},
+	}
 	if addLabels {
 		rev.Labels = map[string]string{
 			serving.ConfigurationLabelKey: testConfigName,
diff --git a/pkg/apis/serving/v1alpha1/revision_conversion_test.go b/pkg/apis/serving/v1alpha1/revision_conversion_test.go
index 875e3dbf2..82009a289 100644
--- a/pkg/apis/serving/v1alpha1/revision_conversion_test.go
+++ b/pkg/apis/serving/v1alpha1/revision_conversion_test.go
@@ -92,7 +92,7 @@ func TestRevisionConversion(t *testing.T) {
 				},
 				ServiceName:       "foo-bar",
 				LogURL:            "http://logger.io",
-				ContainerStatuses: []ContainerStatuses{},
+				ContainerStatuses: []ContainerStatus{},
 			},
 		},
 	}}
@@ -187,7 +187,7 @@ func TestRevisionConversionForMultiContainer(t *testing.T) {
 			},
 			ServiceName:       "foo-bar",
 			LogURL:            "http://logger.io",
-			ContainerStatuses: []ContainerStatuses{},
+			ContainerStatuses: []ContainerStatus{},
 		},
 	}
 	beta := &v1beta1.Revision{}
diff --git a/pkg/autoscaler/bucket/bucket_test.go b/pkg/autoscaler/bucket/bucket_test.go
new file mode 100644
index 000000000..9f1484e00
--- /dev/null
+++ b/pkg/autoscaler/bucket/bucket_test.go
@@ -0,0 +1,33 @@
+/*
+Copyright 2020 The Knative Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package bucket
+
+import "testing"
+
+func TestIsBucketHost(t *testing.T) {
+	if got, want := IsBucketHost("autoscaler-bucket-00-of-03"), true; got != want {
+		t.Errorf("IsBucketHost = %v, want = %v", got, want)
+	}
+
+	if got, want := IsBucketHost("autoscaler"), false; got != want {
+		t.Errorf("IsBucketHost = %v, want = %v", got, want)
+	}
+
+	if got, want := IsBucketHost("autoscaler-bucket-non-exits"), true; got != want {
+		t.Errorf("IsBucketHost = %v, want = %v", got, want)
+	}
+}
diff --git a/pkg/autoscaler/statforwarder/forwarder_test.go b/pkg/autoscaler/statforwarder/forwarder_test.go
index 9ddeb5a5b..5bb408130 100644
--- a/pkg/autoscaler/statforwarder/forwarder_test.go
+++ b/pkg/autoscaler/statforwarder/forwarder_test.go
@@ -62,6 +62,18 @@ var (
 			HolderIdentity: &testIP1,
 		},
 	}
+	stat1 = asmetrics.StatMessage{
+		Key: types.NamespacedName{
+			Namespace: testNs,
+			Name:      "succulent", // Mapped to bucket1
+		},
+	}
+	stat2 = asmetrics.StatMessage{
+		Key: types.NamespacedName{
+			Namespace: testNs,
+			Name:      "plant", // Mapped to bucket2
+		},
+	}
 	// A statProcessor doing nothing.
 	noOp = func(sm asmetrics.StatMessage) {}
 )
@@ -400,19 +412,6 @@ func TestProcess(t *testing.T) {
 	}
 	f := New(ctx, logger, kubeClient, testIP1, hash.NewBucketSet(sets.NewString(bucket1, bucket2)), accept)
 
-	stat1 := asmetrics.StatMessage{
-		Key: types.NamespacedName{
-			Namespace: testNs,
-			Name:      "succulent", // Mapped to bucket1
-		},
-	}
-	stat2 := asmetrics.StatMessage{
-		Key: types.NamespacedName{
-			Namespace: testNs,
-			Name:      "plant", // Mapped to bucket2
-		},
-	}
-
 	// A Forward without any leadership information should process without error.
 	f.Process(stat1)
 
@@ -440,21 +439,18 @@ func TestProcess(t *testing.T) {
 		t.Fatalf("Timeout waiting f.processors got updated")
 	}
 
-	forwardCount := 0
-	// Override the proc so we do not actually send via WebSocket.
-	f.processors[bucket2].proc = func(sm asmetrics.StatMessage) {
-		forwardCount++
-	}
-
+	// Stat1 should be accepted and stat2 should be forwarded.
 	f.Process(stat1)
 	f.Process(stat2)
-	f.Process(stat2)
 
 	if got, want := acceptCount, 1; got != want {
 		t.Errorf("acceptCount = %d, want = %d", got, want)
 	}
-	if got, want := forwardCount, 2; got != want {
-		t.Errorf("forwardCount = %d, want = %d", got, want)
+
+	// One more accept.
+	f.Process(stat1)
+	if got, want := acceptCount, 2; got != want {
+		t.Errorf("acceptCount = %d, want = %d", got, want)
 	}
 
 	// Make sure Cancel can be called without crash.
diff --git a/pkg/autoscaler/statforwarder/processor_test.go b/pkg/autoscaler/statforwarder/processor_test.go
new file mode 100644
index 000000000..6de926f9e
--- /dev/null
+++ b/pkg/autoscaler/statforwarder/processor_test.go
@@ -0,0 +1,77 @@
+/*
+Copyright 2020 The Knative Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package statforwarder
+
+import (
+	"net/http"
+	"net/http/httptest"
+	"strings"
+	"testing"
+	"time"
+
+	gorillawebsocket "github.com/gorilla/websocket"
+	"k8s.io/apimachinery/pkg/util/wait"
+
+	. "knative.dev/pkg/logging/testing"
+	"knative.dev/pkg/websocket"
+)
+
+func TestProcessorForwarding(t *testing.T) {
+	received := make(chan struct{})
+	var httpHandler http.HandlerFunc = func(w http.ResponseWriter, r *http.Request) {
+		var upgrader gorillawebsocket.Upgrader
+
+		conn, err := upgrader.Upgrade(w, r, nil)
+		if err != nil {
+			t.Fatalf("error upgrading websocket: %v", err)
+		}
+
+		defer conn.Close()
+		for {
+			_, _, err := conn.ReadMessage()
+			if err != nil {
+				t.Fatalf("error reading message: %v", err)
+			}
+			received <- struct{}{}
+		}
+	}
+
+	s := httptest.NewServer(httpHandler)
+	defer s.Close()
+
+	logger := TestLogger(t)
+	conn := websocket.NewDurableSendingConnection("ws"+strings.TrimPrefix(s.URL, "http"), logger)
+	if err := wait.PollImmediate(10*time.Millisecond, time.Second, func() (bool, error) {
+		return conn.IsEstablished(), nil
+	}); err != nil {
+		t.Fatal("Timeout waiting f.processors got updated")
+	}
+
+	p := bucketProcessor{
+		logger: logger,
+		bkt:    bucket1,
+		conn:   conn,
+	}
+
+	p.process(stat1)
+
+	select {
+	case <-received:
+	case <-time.After(time.Second):
+		t.Error("Timeout waiting for SVC retry")
+	}
+}
diff --git a/pkg/autoscaler/statserver/server_test.go b/pkg/autoscaler/statserver/server_test.go
index c9e7d1928..5d1d42040 100644
--- a/pkg/autoscaler/statserver/server_test.go
+++ b/pkg/autoscaler/statserver/server_test.go
@@ -189,6 +189,52 @@ func TestServerDoesNotLeakGoroutines(t *testing.T) {
 	}
 }
 
+func TestServerNotBucketHost(t *testing.T) {
+	statsCh := make(chan metrics.StatMessage)
+	server := newTestServerWithOwnerFunc(statsCh, alwaysFalse)
+	defer server.Shutdown(0)
+
+	go server.listenAndServe()
+
+	// Verify the server behaves normally when the host is not a bucket host.
+	statSink := dialOK(t, server.listenAddr())
+	assertReceivedProto(t, both, statSink, statsCh)
+	closeSink(t, statSink)
+}
+
+func TestServerOwnerForBucketHost(t *testing.T) {
+	// Override the function to mock a bucket host.
+	isBucketHost = alwaysTrue
+
+	statsCh := make(chan metrics.StatMessage)
+	server := newTestServerWithOwnerFunc(statsCh, alwaysTrue)
+	defer server.Shutdown(0)
+
+	go server.listenAndServe()
+
+	// Verify the server behaves normally when the host is a bucket host
+	// and the pod is the owner of the bucket.
+	statSink := dialOK(t, server.listenAddr())
+	assertReceivedProto(t, both, statSink, statsCh)
+	closeSink(t, statSink)
+}
+
+func TestServerNotOwnerForBucketHost(t *testing.T) {
+	// Override the function to mock a bucket host.
+	isBucketHost = alwaysTrue
+
+	statsCh := make(chan metrics.StatMessage)
+	server := newTestServerWithOwnerFunc(statsCh, alwaysFalse)
+	defer server.Shutdown(0)
+
+	go server.listenAndServe()
+
+	_, err := dial(server.listenAddr())
+	if err == nil {
+		t.Error("Want error from Dial but got none")
+	}
+}
+
 func BenchmarkStatServer(b *testing.B) {
 	statsCh := make(chan metrics.StatMessage, 100)
 	server := newTestServer(statsCh)
@@ -332,8 +378,12 @@ type testServer struct {
 }
 
 func newTestServer(statsCh chan<- metrics.StatMessage) *testServer {
+	return newTestServerWithOwnerFunc(statsCh, nil)
+}
+
+func newTestServerWithOwnerFunc(statsCh chan<- metrics.StatMessage, f func(bkt string) bool) *testServer {
 	return &testServer{
-		Server:       New(testAddress, statsCh, zap.NewNop().Sugar()),
+		Server:       New(testAddress, statsCh, zap.NewNop().Sugar(), f),
 		listenAddrCh: make(chan string, 1),
 	}
 }
@@ -360,3 +410,11 @@ func (t *testListener) Accept() (net.Conn, error) {
 	t.listenAddr <- "http://" + t.Listener.Addr().String()
 	return t.Listener.Accept()
 }
+
+func alwaysTrue(_ string) bool {
+	return true
+}
+
+func alwaysFalse(_ string) bool {
+	return false
+}
diff --git a/pkg/metrics/config_test.go b/pkg/metrics/config_test.go
index 15c813279..48c1c28aa 100644
--- a/pkg/metrics/config_test.go
+++ b/pkg/metrics/config_test.go
@@ -76,9 +76,9 @@ func TestObservabilityConfiguration(t *testing.T) {
 			},
 			Data: map[string]string{
 				"logging.enable-probe-request-log":            "true",
-				"logging.enable-request-log":                  "true",
+				metrics.EnableReqLogKey:                       "true",
 				"logging.enable-var-log-collection":           "true",
-				"logging.request-log-template":                `{"requestMethod": "{{.Request.Method}}"}`,
+				metrics.ReqLogTemplateKey:                     `{"requestMethod": "{{.Request.Method}}"}`,
 				"logging.revision-url-template":               "https://logging.io",
 				"logging.write-request-logs":                  "true",
 				"metrics.request-metrics-backend-destination": "stackdriver",
@@ -100,7 +100,7 @@ func TestObservabilityConfiguration(t *testing.T) {
 			},
 			Data: map[string]string{
 				"logging.enable-probe-request-log":            "true",
-				"logging.enable-request-log":                  "false",
+				metrics.EnableReqLogKey:                       "false",
 				"logging.enable-var-log-collection":           "true",
 				"logging.revision-url-template":               "https://logging.io",
 				"logging.write-request-logs":                  "true",
@@ -129,7 +129,7 @@ func TestObservabilityConfiguration(t *testing.T) {
 				Name:      metrics.ConfigMapName(),
 			},
 			Data: map[string]string{
-				"logging.request-log-template": `{{ something }}`,
+				metrics.ReqLogTemplateKey: `{{ something }}`,
 			},
 		},
 	}}
@@ -139,7 +139,7 @@ func TestObservabilityConfiguration(t *testing.T) {
 			actual, err := metrics.NewObservabilityConfigFromConfigMap(tt.config)
 
 			if (err != nil) != tt.wantErr {
-				t.Fatalf("Test: %q; NewObservabilityFromConfigMap() error = %v, WantErr %v", tt.name, err, tt.wantErr)
+				t.Fatalf("NewObservabilityFromConfigMap() error = %v, WantErr %v", err, tt.wantErr)
 			}
 
 			if got, want := actual, tt.wantConfig; !cmp.Equal(want, got) {
diff --git a/pkg/reconciler/configuration/resources/revision_test.go b/pkg/reconciler/configuration/resources/revision_test.go
index 6f813ac97..c34aeec89 100644
--- a/pkg/reconciler/configuration/resources/revision_test.go
+++ b/pkg/reconciler/configuration/resources/revision_test.go
@@ -323,9 +323,7 @@ func TestMakeRevisions(t *testing.T) {
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
 			ctx := context.Background()
-			if test.responsiveGC {
-				ctx = enableResponsiveGC(ctx)
-			}
+			ctx = enableResponsiveGC(ctx, test.responsiveGC)
 
 			got := MakeRevision(ctx, test.configuration, clock)
 			if diff := cmp.Diff(test.want, got); diff != "" {
@@ -335,11 +333,16 @@ func TestMakeRevisions(t *testing.T) {
 	}
 }
 
-func enableResponsiveGC(ctx context.Context) context.Context {
+func enableResponsiveGC(ctx context.Context, enabled bool) context.Context {
+	flag := cfgmap.Disabled
+	if enabled {
+		flag = cfgmap.Enabled
+	}
+
 	defaultDefaults, _ := cfgmap.NewDefaultsConfigFromMap(map[string]string{})
 	c := &config.Config{
 		Features: &cfgmap.Features{
-			ResponsiveRevisionGC: cfgmap.Enabled,
+			ResponsiveRevisionGC: flag,
 		},
 		Defaults: defaultDefaults,
 	}
diff --git a/pkg/reconciler/revision/resources/deploy_test.go b/pkg/reconciler/revision/resources/deploy_test.go
index 459d2b9d4..f617793e7 100644
--- a/pkg/reconciler/revision/resources/deploy_test.go
+++ b/pkg/reconciler/revision/resources/deploy_test.go
@@ -489,7 +489,7 @@ func TestMakePodSpec(t *testing.T) {
 				}},
 				ReadinessProbe: withTCPReadinessProbe(v1.DefaultUserPort),
 			}}),
-			WithContainerStatuses([]v1.ContainerStatuses{{
+			WithContainerStatuses([]v1.ContainerStatus{{
 				ImageDigest: "busybox@sha256:deadbeef",
 			}}),
 		),
@@ -521,7 +521,7 @@ func TestMakePodSpec(t *testing.T) {
 				}},
 				ReadinessProbe: withTCPReadinessProbe(v1.DefaultUserPort),
 			}}),
-			WithContainerStatuses([]v1.ContainerStatuses{{
+			WithContainerStatuses([]v1.ContainerStatus{{
 				ImageDigest: "busybox@sha256:deadbeef",
 			}}),
 			func(revision *v1.Revision) {
@@ -569,7 +569,7 @@ func TestMakePodSpec(t *testing.T) {
 				ReadinessProbe: withTCPReadinessProbe(v1.DefaultUserPort),
 			}}),
 			withContainerConcurrency(1),
-			WithContainerStatuses([]v1.ContainerStatuses{{
+			WithContainerStatuses([]v1.ContainerStatus{{
 				ImageDigest: "busybox@sha256:deadbeef",
 			}}),
 		),
@@ -590,7 +590,7 @@ func TestMakePodSpec(t *testing.T) {
 				Image:          "busybox",
 				ReadinessProbe: withTCPReadinessProbe(v1.DefaultUserPort),
 			}}),
-			WithContainerStatuses([]v1.ContainerStatuses{{
+			WithContainerStatuses([]v1.ContainerStatus{{
 				ImageDigest: "busybox@sha256:deadbeef",
 			}}),
 		),
@@ -617,7 +617,7 @@ func TestMakePodSpec(t *testing.T) {
 				ReadinessProbe: withTCPReadinessProbe(v1.DefaultUserPort),
 			}}),
 			withContainerConcurrency(121),
-			WithContainerStatuses([]v1.ContainerStatuses{{
+			WithContainerStatuses([]v1.ContainerStatus{{
 				ImageDigest: "busybox@sha256:deadbeef",
 			}}),
 		),
@@ -640,7 +640,7 @@ func TestMakePodSpec(t *testing.T) {
 			}}),
 			withContainerConcurrency(42),
 			withOwnerReference("parent-config"),
-			WithContainerStatuses([]v1.ContainerStatuses{{
+			WithContainerStatuses([]v1.ContainerStatus{{
 				ImageDigest: "busybox@sha256:deadbeef",
 			}}),
 		),
@@ -662,7 +662,7 @@ func TestMakePodSpec(t *testing.T) {
 				Image:          "busybox",
 				ReadinessProbe: withHTTPReadinessProbe(v1.DefaultUserPort),
 			}}),
-			WithContainerStatuses([]v1.ContainerStatuses{{
+			WithContainerStatuses([]v1.ContainerStatus{{
 				ImageDigest: "busybox@sha256:deadbeef",
 			}}),
 		),
@@ -683,7 +683,7 @@ func TestMakePodSpec(t *testing.T) {
 				Image:          "busybox",
 				ReadinessProbe: withTCPReadinessProbe(12345),
 			}}),
-			WithContainerStatuses([]v1.ContainerStatuses{{
+			WithContainerStatuses([]v1.ContainerStatus{{
 				ImageDigest: "busybox@sha256:deadbeef",
 			}}),
 		),
@@ -704,7 +704,7 @@ func TestMakePodSpec(t *testing.T) {
 				Image:          "busybox",
 				ReadinessProbe: withExecReadinessProbe([]string{"echo", "hello"}),
 			}}),
-			WithContainerStatuses([]v1.ContainerStatuses{{
+			WithContainerStatuses([]v1.ContainerStatus{{
 				ImageDigest: "busybox@sha256:deadbeef",
 			}}),
 		),
@@ -734,7 +734,7 @@ func TestMakePodSpec(t *testing.T) {
 					},
 				},
 			}}),
-			WithContainerStatuses([]v1.ContainerStatuses{{
+			WithContainerStatuses([]v1.ContainerStatus{{
 				ImageDigest: "busybox@sha256:deadbeef",
 			}}),
 		),
@@ -769,7 +769,7 @@ func TestMakePodSpec(t *testing.T) {
 						TCPSocket: &corev1.TCPSocketAction{},
 					}}}},
 			),
-			WithContainerStatuses([]v1.ContainerStatuses{{
+			WithContainerStatuses([]v1.ContainerStatus{{
 				ImageDigest: "busybox@sha256:deadbeef",
 			}}),
 		),
@@ -795,7 +795,7 @@ func TestMakePodSpec(t *testing.T) {
 				Image:          "busybox",
 				ReadinessProbe: withTCPReadinessProbe(v1.DefaultUserPort),
 			}}),
-			WithContainerStatuses([]v1.ContainerStatuses{{
+			WithContainerStatuses([]v1.ContainerStatus{{
 				ImageDigest: "busybox@sha256:deadbeef",
 			}}),
 			func(revision *v1.Revision) {
@@ -836,7 +836,7 @@ func TestMakePodSpec(t *testing.T) {
 				Name:  "sidecar-container-2",
 				Image: "alpine",
 			}}),
-			WithContainerStatuses([]v1.ContainerStatuses{{
+			WithContainerStatuses([]v1.ContainerStatus{{
 				ImageDigest: "busybox@sha256:deadbeef",
 			}, {
 				ImageDigest: "ubuntu@sha256:deadbffe",
@@ -898,7 +898,7 @@ func TestMakePodSpec(t *testing.T) {
 				Name:  sidecarContainerName,
 				Image: "ubuntu",
 			}}),
-			WithContainerStatuses([]v1.ContainerStatuses{{
+			WithContainerStatuses([]v1.ContainerStatus{{
 				ImageDigest: "busybox@sha256:deadbeef",
 			}, {
 				ImageDigest: "ubuntu@sha256:deadbffe",
@@ -1017,7 +1017,7 @@ func TestMakeDeployment(t *testing.T) {
 			}}),
 			withoutLabels,
 			withContainerConcurrency(1),
-			WithContainerStatuses([]v1.ContainerStatuses{{
+			WithContainerStatuses([]v1.ContainerStatus{{
 				ImageDigest: "busybox@sha256:deadbeef",
 			}, {
 				ImageDigest: "ubuntu@sha256:deadbffe",
@@ -1033,7 +1033,7 @@ func TestMakeDeployment(t *testing.T) {
 			}}),
 			withoutLabels,
 			withOwnerReference("parent-config"),
-			WithContainerStatuses([]v1.ContainerStatuses{{
+			WithContainerStatuses([]v1.ContainerStatus{{
 				ImageDigest: "busybox@sha256:deadbeef",
 			}})),
 		want: appsv1deployment(),
@@ -1045,7 +1045,7 @@ func TestMakeDeployment(t *testing.T) {
 				Image:          "ubuntu",
 				ReadinessProbe: withTCPReadinessProbe(12345),
 			}}),
-			WithContainerStatuses([]v1.ContainerStatuses{{
+			WithContainerStatuses([]v1.ContainerStatus{{
 				ImageDigest: "busybox@sha256:deadbeef",
 			}}),
 			withoutLabels, func(revision *v1.Revision) {
@@ -1070,7 +1070,7 @@ func TestMakeDeployment(t *testing.T) {
 				Image:          "ubuntu",
 				ReadinessProbe: withTCPReadinessProbe(12345),
 			}}),
-			WithContainerStatuses([]v1.ContainerStatuses{{
+			WithContainerStatuses([]v1.ContainerStatus{{
 				ImageDigest: "busybox@sha256:deadbeef",
 			}}), withoutLabels),
 		want: appsv1deployment(func(deploy *appsv1.Deployment) {
diff --git a/pkg/reconciler/revision/resources/imagecache_test.go b/pkg/reconciler/revision/resources/imagecache_test.go
index 4b1ce2265..2353a23ec 100644
--- a/pkg/reconciler/revision/resources/imagecache_test.go
+++ b/pkg/reconciler/revision/resources/imagecache_test.go
@@ -57,7 +57,7 @@ func TestMakeImageCache(t *testing.T) {
 				},
 			},
 			Status: v1.RevisionStatus{
-				ContainerStatuses: []v1.ContainerStatuses{{
+				ContainerStatuses: []v1.ContainerStatus{{
 					Name:        "user-container",
 					ImageDigest: "busybox@sha256:deadbeef",
 				}},
@@ -117,7 +117,7 @@ func TestMakeImageCache(t *testing.T) {
 				},
 			},
 			Status: v1.RevisionStatus{
-				ContainerStatuses: []v1.ContainerStatuses{{
+				ContainerStatuses: []v1.ContainerStatus{{
 					Name:        "user-container1",
 					ImageDigest: "ubuntu@sha256:deadbeef1",
 				}, {
@@ -182,7 +182,7 @@ func TestMakeImageCache(t *testing.T) {
 				},
 			},
 			Status: v1.RevisionStatus{
-				ContainerStatuses: []v1.ContainerStatuses{{}},
+				ContainerStatuses: []v1.ContainerStatus{{}},
 			},
 		},
 		containerName: "user-container",
@@ -231,7 +231,7 @@ func TestMakeImageCache(t *testing.T) {
 				},
 			},
 			Status: v1.RevisionStatus{
-				ContainerStatuses: []v1.ContainerStatuses{{
+				ContainerStatuses: []v1.ContainerStatus{{
 					Name:        "user-container",
 					ImageDigest: "busybox@sha256:deadbeef",
 				}},
diff --git a/pkg/reconciler/revision/revision_test.go b/pkg/reconciler/revision/revision_test.go
index 98f9c4185..2faf82500 100644
--- a/pkg/reconciler/revision/revision_test.go
+++ b/pkg/reconciler/revision/revision_test.go
@@ -67,7 +67,6 @@ import (
 	"knative.dev/serving/pkg/deployment"
 	"knative.dev/serving/pkg/reconciler/revision/resources"
 	"knative.dev/serving/pkg/reconciler/revision/resources/names"
-	resourcenames "knative.dev/serving/pkg/reconciler/revision/resources/names"
 
 	_ "knative.dev/pkg/metrics/testing"
 	. "knative.dev/pkg/reconciler/testing"
@@ -203,7 +202,7 @@ func addResourcesToInformers(t *testing.T, ctx context.Context, rev *v1.Revision
 
 	ns := rev.Namespace
 
-	paName := resourcenames.PA(rev)
+	paName := names.PA(rev)
 	pa, err := fakeservingclient.Get(ctx).AutoscalingV1alpha1().PodAutoscalers(rev.Namespace).Get(paName, metav1.GetOptions{})
 	if err != nil {
 		t.Fatalf("PodAutoscalers.Get(%v) = %v", paName, err)
@@ -211,7 +210,7 @@ func addResourcesToInformers(t *testing.T, ctx context.Context, rev *v1.Revision
 	fakepainformer.Get(ctx).Informer().GetIndexer().Add(pa)
 
 	for _, v := range rev.Spec.Containers {
-		imageName := kmeta.ChildName(resourcenames.ImageCache(rev), "-"+v.Name)
+		imageName := kmeta.ChildName(names.ImageCache(rev), "-"+v.Name)
 		image, err := fakecachingclient.Get(ctx).CachingV1alpha1().Images(rev.Namespace).Get(imageName, metav1.GetOptions{})
 		if err != nil {
 			t.Fatalf("Caching.Images.Get(%v) = %v", imageName, err)
@@ -219,7 +218,7 @@ func addResourcesToInformers(t *testing.T, ctx context.Context, rev *v1.Revision
 		fakeimageinformer.Get(ctx).Informer().GetIndexer().Add(image)
 	}
 
-	deploymentName := resourcenames.Deployment(rev)
+	deploymentName := names.Deployment(rev)
 	deployment, err := fakekubeclient.Get(ctx).AppsV1().Deployments(ns).Get(deploymentName, metav1.GetOptions{})
 	if err != nil {
 		t.Fatalf("Deployments.Get(%v) = %v", deploymentName, err)
@@ -441,7 +440,7 @@ func TestRevWithImageDigests(t *testing.T) {
 			t.Error("Container statuses do not match the order of containers in spec")
 		}
 	}
-	rev.Status.ContainerStatuses = []v1.ContainerStatuses{}
+	rev.Status.ContainerStatuses = []v1.ContainerStatus{}
 	updateRevision(t, ctx, controller, rev)
 	if len(rev.Status.ContainerStatuses) != 0 {
 		t.Error("Failed to update revision")
diff --git a/pkg/reconciler/revision/table_test.go b/pkg/reconciler/revision/table_test.go
index a4040546c..484717020 100644
--- a/pkg/reconciler/revision/table_test.go
+++ b/pkg/reconciler/revision/table_test.go
@@ -709,7 +709,7 @@ func changeContainers(deploy *appsv1.Deployment) *appsv1.Deployment {
 
 func withDefaultContainerStatuses() RevisionOption {
 	return func(r *v1.Revision) {
-		r.Status.ContainerStatuses = []v1.ContainerStatuses{{
+		r.Status.ContainerStatuses = []v1.ContainerStatus{{
 			Name:        r.Name,
 			ImageDigest: "",
 		}}
diff --git a/pkg/reconciler/testing/v1/listers.go b/pkg/reconciler/testing/v1/listers.go
index da39dafa4..0e2e85319 100644
--- a/pkg/reconciler/testing/v1/listers.go
+++ b/pkg/reconciler/testing/v1/listers.go
@@ -169,14 +169,6 @@ func (l *Listers) GetPodsLister() corev1listers.PodLister {
 	return corev1listers.NewPodLister(l.IndexerFor(&corev1.Pod{}))
 }
 
-func (l *Listers) GetSecretLister() corev1listers.SecretLister {
-	return corev1listers.NewSecretLister(l.IndexerFor(&corev1.Secret{}))
-}
-
-func (l *Listers) GetConfigMapLister() corev1listers.ConfigMapLister {
-	return corev1listers.NewConfigMapLister(l.IndexerFor(&corev1.ConfigMap{}))
-}
-
 // GetNamespaceLister gets lister for Namespace resource.
 func (l *Listers) GetNamespaceLister() corev1listers.NamespaceLister {
 	return corev1listers.NewNamespaceLister(l.IndexerFor(&corev1.Namespace{}))
diff --git a/pkg/resources/pods_test.go b/pkg/resources/pods_test.go
index 1aa0f555b..d3e3cbe68 100644
--- a/pkg/resources/pods_test.go
+++ b/pkg/resources/pods_test.go
@@ -138,7 +138,7 @@ func TestPodIPsSortedByAge(t *testing.T) {
 	}, {
 		name: "one pod",
 		pods: []*corev1.Pod{
-			pod("master-of-puppets", makeReady, withStartTime(aTime), withIP("1.1.1.1")),
+			pod("foo", makeReady, withStartTime(aTime), withIP("1.1.1.1")),
 		},
 		want: []string{"1.1.1.1"},
 	}, {
diff --git a/pkg/testing/functional.go b/pkg/testing/functional.go
index 958fa49d5..365b234e1 100644
--- a/pkg/testing/functional.go
+++ b/pkg/testing/functional.go
@@ -213,16 +213,6 @@ func WithObservedGeneration(gen int64) PodAutoscalerOption {
 	}
 }
 
-// WithObservedGenerationFailure marks the top level condition as unknown when the reconciler
-// does not set any condition during reconciliation of a new generation.
-func WithObservedGenerationFailure() PodAutoscalerOption {
-	return func(pa *asv1a1.PodAutoscaler) {
-		condSet := pa.GetConditionSet()
-		condSet.Manage(&pa.Status).MarkUnknown(condSet.GetTopLevelConditionType(),
-			"NewObservedGenFailure", "unsuccessfully observed a new generation")
-	}
-}
-
 // WithMetricOwnersRemoved clears the owner references of this PodAutoscaler.
 func WithMetricOwnersRemoved(m *asv1a1.Metric) {
 	m.OwnerReferences = nil
diff --git a/pkg/testing/v1/revision.go b/pkg/testing/v1/revision.go
index 28ab37604..7bd4f1248 100644
--- a/pkg/testing/v1/revision.go
+++ b/pkg/testing/v1/revision.go
@@ -227,7 +227,7 @@ func WithRevisionAnn(key, value string) RevisionOption {
 }
 
 // WithContainerStatuses sets the .Status.ContainerStatuses to the Revision.
-func WithContainerStatuses(containerStatus []v1.ContainerStatuses) RevisionOption {
+func WithContainerStatuses(containerStatus []v1.ContainerStatus) RevisionOption {
 	return func(r *v1.Revision) {
 		r.Status.ContainerStatuses = containerStatus
 	}
diff --git a/test/conformance/api/shared/util.go b/test/conformance/api/shared/util.go
index 0bf40bb7b..f22e39d53 100644
--- a/test/conformance/api/shared/util.go
+++ b/test/conformance/api/shared/util.go
@@ -118,17 +118,18 @@ func checkResponses(t pkgTest.TLegacy, num, min int, domain string, expectedResp
 	//   WHERE body IN $expectedResponses
 	//   GROUP BY body
 	// )
-	for _, ar := range actualResponses {
+	for i, ar := range actualResponses {
 		if er := substrInList(ar, expectedResponses); er != "" {
 			counts[er]++
 		} else {
 			badCounts[ar]++
+			t.Logf("For domain %s: got unexpected response for request %d", domain, i)
 		}
 	}
 
-	// Verify that the total expected responses match the number of requests made.
+	// Print unexpected responses for debugging purposes
 	for badResponse, count := range badCounts {
-		t.Logf("Saw unexpected response %q %d times.", badResponse, count)
+		t.Logf("For domain %s: saw unexpected response %q %d times.", domain, badResponse, count)
 	}
 
 	// Verify that we saw each entry in "expectedResponses" at least "min" times.
@@ -146,6 +147,7 @@ func checkResponses(t pkgTest.TLegacy, num, min int, domain string, expectedResp
 		t.Logf("For domain %s: wanted at least %d, got %d requests.", domain, min, count)
 		totalMatches += count
 	}
+	// Verify that the total expected responses match the number of requests made.
 	if totalMatches < num {
 		errMsg = append(errMsg,
 			fmt.Sprintf("domain %s: saw expected responses %d times, wanted %d", domain, totalMatches, num))
diff --git a/test/crd.go b/test/crd.go
index 52da88266..9f45c8b53 100644
--- a/test/crd.go
+++ b/test/crd.go
@@ -20,9 +20,7 @@ package test
 
 import (
 	"net/url"
-	"strings"
 
-	pkgTest "knative.dev/pkg/test"
 	"knative.dev/pkg/test/helpers"
 )
 
@@ -43,16 +41,5 @@ type ResourceNames struct {
 // called for the first time.
 var AppendRandomString = helpers.AppendRandomString
 
-// MakeK8sNamePrefix will convert each chunk of non-alphanumeric character into a single dash
-// and also convert camelcase tokens into dash-delimited lowercase tokens.
-var MakeK8sNamePrefix = helpers.MakeK8sNamePrefix
-
 // ObjectNameForTest generates a random object name based on the test name.
 var ObjectNameForTest = helpers.ObjectNameForTest
-
-// SubServiceNameForTest generates a random service name based on the test name and
-// the given subservice name.
-func SubServiceNameForTest(t pkgTest.T, subsvc string) string {
-	fullPrefix := strings.TrimPrefix(t.Name(), "Test") + "-" + subsvc
-	return AppendRandomString(MakeK8sNamePrefix(fullPrefix))
-}
diff --git a/test/e2e-auto-tls-tests.sh b/test/e2e-auto-tls-tests.sh
index ee8043bc7..6eace6bfd 100755
--- a/test/e2e-auto-tls-tests.sh
+++ b/test/e2e-auto-tls-tests.sh
@@ -160,7 +160,7 @@ function delete_dns_record() {
 # Script entry point.
 
 # Skip installing istio as an add-on
-initialize $@ --skip-istio-addon
+initialize "$@" --skip-istio-addon
 
 header "Enabling high-availability"
 
diff --git a/test/e2e-common.sh b/test/e2e-common.sh
index f9d766343..e76a4fb38 100644
--- a/test/e2e-common.sh
+++ b/test/e2e-common.sh
@@ -14,14 +14,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# Temporarily increasing the cluster size for serving tests to rule out
-# resource/eviction as causes of flakiness. These env vars are consumed
-# in the test-infra/scripts/e2e-tests.sh. Use the existing value, if provided
-# with the job config.
-E2E_MIN_CLUSTER_NODES=${E2E_MIN_CLUSTER_NODES:-4}
-E2E_MAX_CLUSTER_NODES=${E2E_MAX_CLUSTER_NODES:-4}
-E2E_CLUSTER_MACHINE=${E2E_CLUSTER_MACHINE:-e2-standard-8}
-
 # This script provides helper methods to perform cluster actions.
 source $(dirname $0)/../vendor/knative.dev/test-infra/scripts/e2e-tests.sh
 source $(dirname $0)/e2e-networking-library.sh
diff --git a/test/e2e-tests.sh b/test/e2e-tests.sh
index 0790f3a3f..eb361796a 100755
--- a/test/e2e-tests.sh
+++ b/test/e2e-tests.sh
@@ -35,8 +35,10 @@ function knative_setup() {
 
 # Script entry point.
 
-# Skip installing istio as an add-on
-initialize $@ --skip-istio-addon
+# Skip installing istio as an add-on.
+# Temporarily increasing the cluster size for serving tests to rule out
+# resource/eviction as causes of flakiness.
+initialize "$@" --skip-istio-addon --min-nodes=4 --max-nodes=4
 
 # Run the tests
 header "Running tests"
diff --git a/test/e2e-upgrade-tests.sh b/test/e2e-upgrade-tests.sh
index 38b3e9c2e..86dd352c9 100755
--- a/test/e2e-upgrade-tests.sh
+++ b/test/e2e-upgrade-tests.sh
@@ -69,7 +69,7 @@ function knative_setup() {
 
 # Script entry point.
 
-initialize $@ --skip-istio-addon
+initialize "$@" --skip-istio-addon
 
 # We haven't configured these deployments for high-availability,
 # so disable the chaos duck.
diff --git a/test/e2e/autotls/config/disablenscert/main.go b/test/e2e/autotls/config/disablenscert/main.go
index 90a3f6440..01f6a4e23 100644
--- a/test/e2e/autotls/config/disablenscert/main.go
+++ b/test/e2e/autotls/config/disablenscert/main.go
@@ -48,22 +48,22 @@ func main() {
 	if err != nil {
 		log.Fatal("Failed to create clients: ", err)
 	}
-	whiteLists := sets.String{}
+	keepCerts := sets.String{}
 	if env.NamespaceWithCert != "" {
-		whiteLists.Insert(env.NamespaceWithCert)
+		keepCerts.Insert(env.NamespaceWithCert)
 	}
-	if err := disableNamespaceCertWithWhiteList(clients, whiteLists); err != nil {
+	if err := disableNamespaceCertWithExclusions(clients, keepCerts); err != nil {
 		log.Fatal("Failed to disable namespace cert: ", err)
 	}
 }
 
-func disableNamespaceCertWithWhiteList(clients *test.Clients, whiteLists sets.String) error {
+func disableNamespaceCertWithExclusions(clients *test.Clients, keepCerts sets.String) error {
 	namespaces, err := clients.KubeClient.Kube.CoreV1().Namespaces().List(metav1.ListOptions{})
 	if err != nil {
 		return err
 	}
 	for _, ns := range namespaces.Items {
-		if whiteLists.Has(ns.Name) {
+		if keepCerts.Has(ns.Name) {
 			delete(ns.Labels, networking.DisableWildcardCertLabelKey)
 			delete(ns.Labels, networking.DeprecatedDisableWildcardCertLabelKey)
 		} else {
diff --git a/test/e2e/logging_test.go b/test/e2e/logging_test.go
index 2c3353996..6a1a8faa3 100644
--- a/test/e2e/logging_test.go
+++ b/test/e2e/logging_test.go
@@ -33,8 +33,9 @@ import (
 	"k8s.io/apimachinery/pkg/util/wait"
 
 	network "knative.dev/networking/pkg"
+	"knative.dev/pkg/metrics"
 	"knative.dev/pkg/system"
-	pkgTest "knative.dev/pkg/test"
+	pkgtest "knative.dev/pkg/test"
 	"knative.dev/serving/pkg/apis/autoscaling"
 	rtesting "knative.dev/serving/pkg/testing/v1"
 	"knative.dev/serving/test"
@@ -52,7 +53,7 @@ func TestRequestLogs(t *testing.T) {
 		t.Fatalf("Fail to get ConfigMap config-observability: %v", err)
 	}
 
-	if got, want := cm.Data["logging.request-log-template"], template; got != want {
+	if got, want := cm.Data[metrics.ReqLogTemplateKey], template; got != want {
 		t.Skipf("Skipping verifing request logs because the template doesn't match:\n%s", cmp.Diff(want, got))
 	}
 
@@ -74,11 +75,11 @@ func TestRequestLogs(t *testing.T) {
 		t.Fatalf("Failed to create initial Service: %v: %v", names.Service, err)
 	}
 
-	_, err = pkgTest.WaitForEndpointState(
+	_, err = pkgtest.WaitForEndpointState(
 		clients.KubeClient,
 		t.Logf,
 		resources.Route.Status.URL.URL(),
-		v1test.RetryingRouteInconsistency(pkgTest.MatchesAllOf(pkgTest.IsStatusOK, pkgTest.MatchesBody(test.HelloWorldText))),
+		v1test.RetryingRouteInconsistency(pkgtest.MatchesAllOf(pkgtest.IsStatusOK, pkgtest.MatchesBody(test.HelloWorldText))),
 		"WaitForEndpointToServeText",
 		test.ServingFlags.ResolvableDomain,
 		test.AddRootCAtoTransport(t.Logf, clients, test.ServingFlags.Https))
diff --git a/test/e2e/probe_whitelist_test.go b/test/e2e/probe_whitelist_test.go
index 07736764b..55b5fc5fe 100644
--- a/test/e2e/probe_whitelist_test.go
+++ b/test/e2e/probe_whitelist_test.go
@@ -34,7 +34,7 @@ import (
 //istio policy check enabled.
 //policy is present in test/config/security/policy.yaml
 //apply policy before running this test
-func TestProbeWhitelist(t *testing.T) {
+func TestAllowedProbes(t *testing.T) {
 	t.Parallel()
 
 	clients := SetupServingNamespaceforSecurityTesting(t)
diff --git a/test/e2e_constants.go b/test/e2e_constants.go
index 4766ce9fd..cc6338376 100644
--- a/test/e2e_constants.go
+++ b/test/e2e_constants.go
@@ -48,9 +48,6 @@ const (
 	// EnvValue is the configmap/secret test value to match env variable with
 	EnvValue = "testValue"
 
-	// ContainerMemoryLimit is used in any test which needs a default memory resource limit
-	ContainerMemoryLimit = "350Mi"
-
 	// testAnnotation is an annotation attached to resources originating from tests.
 	testAnnotation = "knative-e2e-test"
 )
diff --git a/test/performance/dev.md b/test/performance/dev.md
index eaf8f6645..8b62e2172 100644
--- a/test/performance/dev.md
+++ b/test/performance/dev.md
@@ -31,7 +31,7 @@ Take `dataplane-probe` benchmark for example:
 1. Add the IAM service account
    [here](https://github.com/knative/serving/blob/d73bb8378cab8bb0c1825aa9802bea9ea2e6cb26/test/performance/benchmarks/dataplane-probe/continuous/dev.config#L20)
    (A current owner must apply this before things will work and the SA must be
-   whitelisted) then run:
+   allowed) then run:
 
    ```shell
    mako update_benchmark test/performance/benchmarks/dataplane-probe/dev.config
diff --git a/test/v1/configuration.go b/test/v1/configuration.go
index 645387a93..99a2065d9 100644
--- a/test/v1/configuration.go
+++ b/test/v1/configuration.go
@@ -25,6 +25,7 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/apimachinery/pkg/util/wait"
 	"knative.dev/pkg/apis/duck"
+	"knative.dev/pkg/reconciler"
 	pkgTest "knative.dev/pkg/test"
 	"knative.dev/pkg/test/logging"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
@@ -34,26 +35,32 @@ import (
 
 // CreateConfiguration create a configuration resource in namespace with the name names.Config
 // that uses the image specified by names.Image.
-func CreateConfiguration(t pkgTest.T, clients *test.Clients, names test.ResourceNames, fopt ...rtesting.ConfigOption) (*v1.Configuration, error) {
+func CreateConfiguration(t pkgTest.T, clients *test.Clients, names test.ResourceNames, fopt ...rtesting.ConfigOption) (cfg *v1.Configuration, err error) {
 	config := Configuration(names, fopt...)
 	test.AddTestAnnotation(t, config.ObjectMeta)
 	LogResourceObject(t, ResourceObjects{Config: config})
-	return clients.ServingClient.Configs.Create(config)
+	return cfg, reconciler.RetryTestErrors(func(int) (err error) {
+		cfg, err = clients.ServingClient.Configs.Create(config)
+		return err
+	})
 }
 
 // PatchConfig patches the existing configuration passed in with the applied mutations.
 // Returns the latest configuration object
-func PatchConfig(t pkgTest.T, clients *test.Clients, svc *v1.Configuration, fopt ...rtesting.ConfigOption) (*v1.Configuration, error) {
-	newSvc := svc.DeepCopy()
+func PatchConfig(t pkgTest.T, clients *test.Clients, config *v1.Configuration, fopt ...rtesting.ConfigOption) (cfg *v1.Configuration, err error) {
+	newConfig := config.DeepCopy()
 	for _, opt := range fopt {
-		opt(newSvc)
+		opt(newConfig)
 	}
-	LogResourceObject(t, ResourceObjects{Config: newSvc})
-	patchBytes, err := duck.CreateBytePatch(svc, newSvc)
+	LogResourceObject(t, ResourceObjects{Config: newConfig})
+	patchBytes, err := duck.CreateBytePatch(config, newConfig)
 	if err != nil {
 		return nil, err
 	}
-	return clients.ServingClient.Configs.Patch(svc.ObjectMeta.Name, types.JSONPatchType, patchBytes, "")
+	return cfg, reconciler.RetryTestErrors(func(int) (err error) {
+		cfg, err = clients.ServingClient.Configs.Patch(config.ObjectMeta.Name, types.JSONPatchType, patchBytes, "")
+		return err
+	})
 }
 
 // WaitForConfigLatestPinnedRevision enables the check for pinned revision in WaitForConfigLatestRevision.
@@ -139,8 +146,10 @@ func WaitForConfigurationState(client *test.ServingClients, name string, inState
 
 	var lastState *v1.Configuration
 	waitErr := wait.PollImmediate(test.PollInterval, test.PollTimeout, func() (bool, error) {
-		var err error
-		lastState, err = client.Configs.Get(name, metav1.GetOptions{})
+		err := reconciler.RetryTestErrors(func(int) (err error) {
+			lastState, err = client.Configs.Get(name, metav1.GetOptions{})
+			return err
+		})
 		if err != nil {
 			return true, err
 		}
@@ -157,7 +166,11 @@ func WaitForConfigurationState(client *test.ServingClients, name string, inState
 // is in a particular state by calling `inState` and expecting `true`.
 // This is the non-polling variety of WaitForConfigurationState
 func CheckConfigurationState(client *test.ServingClients, name string, inState func(r *v1.Configuration) (bool, error)) error {
-	c, err := client.Configs.Get(name, metav1.GetOptions{})
+	var c *v1.Configuration
+	err := reconciler.RetryTestErrors(func(int) (err error) {
+		c, err = client.Configs.Get(name, metav1.GetOptions{})
+		return err
+	})
 	if err != nil {
 		return err
 	}
diff --git a/test/v1/route.go b/test/v1/route.go
index 0efc0d7e0..6b0a43e87 100644
--- a/test/v1/route.go
+++ b/test/v1/route.go
@@ -23,6 +23,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/wait"
 	"knative.dev/pkg/ptr"
+	"knative.dev/pkg/reconciler"
 	pkgTest "knative.dev/pkg/test"
 	"knative.dev/pkg/test/logging"
 	"knative.dev/pkg/test/spoof"
@@ -55,11 +56,14 @@ func Route(names test.ResourceNames, fopt ...rtesting.RouteOption) *v1.Route {
 }
 
 // CreateRoute creates a route in the given namespace using the route name in names
-func CreateRoute(t pkgTest.T, clients *test.Clients, names test.ResourceNames, fopt ...rtesting.RouteOption) (*v1.Route, error) {
+func CreateRoute(t pkgTest.T, clients *test.Clients, names test.ResourceNames, fopt ...rtesting.RouteOption) (rt *v1.Route, err error) {
 	route := Route(names, fopt...)
 	test.AddTestAnnotation(t, route.ObjectMeta)
 	LogResourceObject(t, ResourceObjects{Route: route})
-	return clients.ServingClient.Routes.Create(route)
+	return rt, reconciler.RetryTestErrors(func(int) (err error) {
+		rt, err = clients.ServingClient.Routes.Create(route)
+		return err
+	})
 }
 
 // WaitForRouteState polls the status of the Route called name from client every
@@ -72,8 +76,10 @@ func WaitForRouteState(client *test.ServingClients, name string, inState func(r
 
 	var lastState *v1.Route
 	waitErr := wait.PollImmediate(test.PollInterval, test.PollTimeout, func() (bool, error) {
-		var err error
-		lastState, err = client.Routes.Get(name, metav1.GetOptions{})
+		err := reconciler.RetryTestErrors(func(int) (err error) {
+			lastState, err = client.Routes.Get(name, metav1.GetOptions{})
+			return err
+		})
 		if err != nil {
 			return true, err
 		}
@@ -90,7 +96,11 @@ func WaitForRouteState(client *test.ServingClients, name string, inState func(r
 // is in a particular state by calling `inState` and expecting `true`.
 // This is the non-polling variety of WaitForRouteState
 func CheckRouteState(client *test.ServingClients, name string, inState func(r *v1.Route) (bool, error)) error {
-	r, err := client.Routes.Get(name, metav1.GetOptions{})
+	var r *v1.Route
+	err := reconciler.RetryTestErrors(func(int) (err error) {
+		r, err = client.Routes.Get(name, metav1.GetOptions{})
+		return err
+	})
 	if err != nil {
 		return err
 	}
diff --git a/test/v1/service.go b/test/v1/service.go
index d1f86241a..eed8f976a 100644
--- a/test/v1/service.go
+++ b/test/v1/service.go
@@ -29,6 +29,7 @@ import (
 	"k8s.io/apimachinery/pkg/util/wait"
 
 	"knative.dev/pkg/apis/duck"
+	"knative.dev/pkg/reconciler"
 	pkgTest "knative.dev/pkg/test"
 	"knative.dev/pkg/test/logging"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
@@ -154,29 +155,35 @@ func CreateService(t pkgTest.T, clients *test.Clients, names test.ResourceNames,
 	return createService(t, clients, svc)
 }
 
-func createService(t pkgTest.T, clients *test.Clients, service *v1.Service) (*v1.Service, error) {
+func createService(t pkgTest.T, clients *test.Clients, service *v1.Service) (svc *v1.Service, err error) {
 	test.AddTestAnnotation(t, service.ObjectMeta)
 	LogResourceObject(t, ResourceObjects{Service: service})
-	return clients.ServingClient.Services.Create(service)
+	return svc, reconciler.RetryTestErrors(func(int) (err error) {
+		svc, err = clients.ServingClient.Services.Create(service)
+		return err
+	})
 }
 
 // PatchService patches the existing service passed in with the applied mutations.
 // Returns the latest service object
-func PatchService(t pkgTest.T, clients *test.Clients, svc *v1.Service, fopt ...rtesting.ServiceOption) (*v1.Service, error) {
-	newSvc := svc.DeepCopy()
+func PatchService(t pkgTest.T, clients *test.Clients, service *v1.Service, fopt ...rtesting.ServiceOption) (svc *v1.Service, err error) {
+	newSvc := service.DeepCopy()
 	for _, opt := range fopt {
 		opt(newSvc)
 	}
 	LogResourceObject(t, ResourceObjects{Service: newSvc})
-	patchBytes, err := duck.CreateBytePatch(svc, newSvc)
+	patchBytes, err := duck.CreateBytePatch(service, newSvc)
 	if err != nil {
 		return nil, err
 	}
-	return clients.ServingClient.Services.Patch(svc.ObjectMeta.Name, types.JSONPatchType, patchBytes, "")
+	return svc, reconciler.RetryTestErrors(func(int) (err error) {
+		svc, err = clients.ServingClient.Services.Patch(service.ObjectMeta.Name, types.JSONPatchType, patchBytes, "")
+		return err
+	})
 }
 
 // UpdateServiceRouteSpec updates a service to use the route name in names.
-func UpdateServiceRouteSpec(t pkgTest.T, clients *test.Clients, names test.ResourceNames, rs v1.RouteSpec) (*v1.Service, error) {
+func UpdateServiceRouteSpec(t pkgTest.T, clients *test.Clients, names test.ResourceNames, rs v1.RouteSpec) (svc *v1.Service, err error) {
 	patches := []jsonpatch.JsonPatchOperation{{
 		Operation: "replace",
 		Path:      "/spec/traffic",
@@ -186,7 +193,10 @@ func UpdateServiceRouteSpec(t pkgTest.T, clients *test.Clients, names test.Resou
 	if err != nil {
 		return nil, err
 	}
-	return clients.ServingClient.Services.Patch(names.Service, types.JSONPatchType, patchBytes, "")
+	return svc, reconciler.RetryTestErrors(func(int) (err error) {
+		svc, err = clients.ServingClient.Services.Patch(names.Service, types.JSONPatchType, patchBytes, "")
+		return err
+	})
 }
 
 // WaitForServiceLatestRevision takes a revision in through names and compares it to the current state of LatestCreatedRevisionName in Service.
@@ -237,8 +247,10 @@ func WaitForServiceState(client *test.ServingClients, name string, inState func(
 
 	var lastState *v1.Service
 	waitErr := wait.PollImmediate(test.PollInterval, test.PollTimeout, func() (bool, error) {
-		var err error
-		lastState, err = client.Services.Get(name, metav1.GetOptions{})
+		err := reconciler.RetryTestErrors(func(int) (err error) {
+			lastState, err = client.Services.Get(name, metav1.GetOptions{})
+			return err
+		})
 		if err != nil {
 			return true, err
 		}
@@ -255,7 +267,11 @@ func WaitForServiceState(client *test.ServingClients, name string, inState func(
 // is in a particular state by calling `inState` and expecting `true`.
 // This is the non-polling variety of WaitForServiceState.
 func CheckServiceState(client *test.ServingClients, name string, inState func(s *v1.Service) (bool, error)) error {
-	s, err := client.Services.Get(name, metav1.GetOptions{})
+	var s *v1.Service
+	err := reconciler.RetryTestErrors(func(int) (err error) {
+		s, err = client.Services.Get(name, metav1.GetOptions{})
+		return err
+	})
 	if err != nil {
 		return err
 	}
diff --git a/test/v1alpha1/configuration.go b/test/v1alpha1/configuration.go
index db78a5560..caf752261 100644
--- a/test/v1alpha1/configuration.go
+++ b/test/v1alpha1/configuration.go
@@ -27,6 +27,7 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/apimachinery/pkg/util/wait"
 	"knative.dev/pkg/apis/duck"
+	"knative.dev/pkg/reconciler"
 	"knative.dev/pkg/test/logging"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
 	"knative.dev/serving/pkg/apis/serving/v1alpha1"
@@ -38,38 +39,48 @@ import (
 
 // CreateConfiguration create a configuration resource in namespace with the name names.Config
 // that uses the image specified by names.Image.
-func CreateConfiguration(t pkgTest.T, clients *test.Clients, names test.ResourceNames, fopt ...v1alpha1testing.ConfigOption) (*v1alpha1.Configuration, error) {
+func CreateConfiguration(t pkgTest.T, clients *test.Clients, names test.ResourceNames, fopt ...v1alpha1testing.ConfigOption) (cfg *v1alpha1.Configuration, err error) {
 	config := Configuration(names, fopt...)
 	test.AddTestAnnotation(t, config.ObjectMeta)
 	LogResourceObject(t, ResourceObjects{Config: config})
-	return clients.ServingAlphaClient.Configs.Create(config)
+	return cfg, reconciler.RetryTestErrors(func(int) (err error) {
+		cfg, err = clients.ServingAlphaClient.Configs.Create(config)
+		return err
+	})
 }
 
 // PatchConfig patches the existing config with the provided options. Returns the latest Configuration object
-func PatchConfig(clients *test.Clients, cfg *v1alpha1.Configuration, fopt ...v1alpha1testing.ConfigOption) (*v1alpha1.Configuration, error) {
-	newCfg := cfg.DeepCopy()
+func PatchConfig(clients *test.Clients, config *v1alpha1.Configuration, fopt ...v1alpha1testing.ConfigOption) (cfg *v1alpha1.Configuration, err error) {
+	newConfig := config.DeepCopy()
 
 	for _, opt := range fopt {
-		opt(newCfg)
+		opt(newConfig)
 	}
 
-	patchBytes, err := duck.CreateBytePatch(cfg, newCfg)
+	patchBytes, err := duck.CreateBytePatch(config, newConfig)
 	if err != nil {
 		return nil, err
 	}
 
-	return clients.ServingAlphaClient.Configs.Patch(cfg.ObjectMeta.Name, types.JSONPatchType, patchBytes, "")
+	return cfg, reconciler.RetryTestErrors(func(int) (err error) {
+		cfg, err = clients.ServingAlphaClient.Configs.Patch(config.ObjectMeta.Name, types.JSONPatchType, patchBytes, "")
+		return err
+	})
 }
 
 // PatchConfigImage patches the existing config passed in with a new imagePath. Returns the latest Configuration object
-func PatchConfigImage(clients *test.Clients, cfg *v1alpha1.Configuration, imagePath string) (*v1alpha1.Configuration, error) {
-	newCfg := cfg.DeepCopy()
-	newCfg.Spec.GetTemplate().Spec.GetContainer().Image = imagePath
-	patchBytes, err := duck.CreateBytePatch(cfg, newCfg)
+func PatchConfigImage(clients *test.Clients, config *v1alpha1.Configuration, imagePath string) (cfg *v1alpha1.Configuration, err error) {
+	newConfig := config.DeepCopy()
+	newConfig.Spec.GetTemplate().Spec.GetContainer().Image = imagePath
+	patchBytes, err := duck.CreateBytePatch(config, newConfig)
 	if err != nil {
 		return nil, err
 	}
-	return clients.ServingAlphaClient.Configs.Patch(cfg.ObjectMeta.Name, types.JSONPatchType, patchBytes, "")
+
+	return cfg, reconciler.RetryTestErrors(func(int) (err error) {
+		cfg, err = clients.ServingAlphaClient.Configs.Patch(config.ObjectMeta.Name, types.JSONPatchType, patchBytes, "")
+		return err
+	})
 }
 
 // WaitForConfigLatestPinnedRevision enables the check for pinned revision in WaitForConfigLatestRevision.
@@ -172,8 +183,10 @@ func WaitForConfigurationState(client *test.ServingAlphaClients, name string, in
 
 	var lastState *v1alpha1.Configuration
 	waitErr := wait.PollImmediate(test.PollInterval, test.PollTimeout, func() (bool, error) {
-		var err error
-		lastState, err = client.Configs.Get(name, metav1.GetOptions{})
+		err := reconciler.RetryTestErrors(func(int) (err error) {
+			lastState, err = client.Configs.Get(name, metav1.GetOptions{})
+			return err
+		})
 		if err != nil {
 			return true, err
 		}
@@ -190,7 +203,11 @@ func WaitForConfigurationState(client *test.ServingAlphaClients, name string, in
 // is in a particular state by calling `inState` and expecting `true`.
 // This is the non-polling variety of WaitForConfigurationState
 func CheckConfigurationState(client *test.ServingAlphaClients, name string, inState func(r *v1alpha1.Configuration) (bool, error)) error {
-	c, err := client.Configs.Get(name, metav1.GetOptions{})
+	var c *v1alpha1.Configuration
+	err := reconciler.RetryTestErrors(func(int) (err error) {
+		c, err = client.Configs.Get(name, metav1.GetOptions{})
+		return err
+	})
 	if err != nil {
 		return err
 	}
diff --git a/test/v1alpha1/route.go b/test/v1alpha1/route.go
index 4ff55e2ac..4f0fae0f9 100644
--- a/test/v1alpha1/route.go
+++ b/test/v1alpha1/route.go
@@ -25,6 +25,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/wait"
 	"knative.dev/pkg/ptr"
+	"knative.dev/pkg/reconciler"
 	pkgTest "knative.dev/pkg/test"
 	"knative.dev/pkg/test/logging"
 	"knative.dev/pkg/test/spoof"
@@ -36,7 +37,7 @@ import (
 )
 
 // CreateRoute creates a route in the given namespace using the route name in names
-func CreateRoute(t pkgTest.T, clients *test.Clients, names test.ResourceNames, fopt ...v1alpha1testing.RouteOption) (*v1alpha1.Route, error) {
+func CreateRoute(t pkgTest.T, clients *test.Clients, names test.ResourceNames, fopt ...v1alpha1testing.RouteOption) (rt *v1alpha1.Route, err error) {
 	fopt = append(fopt, v1alpha1testing.WithSpecTraffic(v1alpha1.TrafficTarget{
 		TrafficTarget: v1.TrafficTarget{
 			Tag:               names.TrafficTarget,
@@ -47,7 +48,10 @@ func CreateRoute(t pkgTest.T, clients *test.Clients, names test.ResourceNames, f
 	route := v1alpha1testing.Route(test.ServingNamespace, names.Route, fopt...)
 	test.AddTestAnnotation(t, route.ObjectMeta)
 	LogResourceObject(t, ResourceObjects{Route: route})
-	return clients.ServingAlphaClient.Routes.Create(route)
+	return rt, reconciler.RetryTestErrors(func(int) (err error) {
+		rt, err = clients.ServingAlphaClient.Routes.Create(route)
+		return err
+	})
 }
 
 // RetryingRouteInconsistency retries common requests seen when creating a new route
@@ -69,8 +73,10 @@ func WaitForRouteState(client *test.ServingAlphaClients, name string, inState fu
 
 	var lastState *v1alpha1.Route
 	waitErr := wait.PollImmediate(test.PollInterval, test.PollTimeout, func() (bool, error) {
-		var err error
-		lastState, err = client.Routes.Get(name, metav1.GetOptions{})
+		err := reconciler.RetryTestErrors(func(int) (err error) {
+			lastState, err = client.Routes.Get(name, metav1.GetOptions{})
+			return err
+		})
 		if err != nil {
 			return true, err
 		}
@@ -87,7 +93,11 @@ func WaitForRouteState(client *test.ServingAlphaClients, name string, inState fu
 // is in a particular state by calling `inState` and expecting `true`.
 // This is the non-polling variety of WaitForRouteState
 func CheckRouteState(client *test.ServingAlphaClients, name string, inState func(r *v1alpha1.Route) (bool, error)) error {
-	r, err := client.Routes.Get(name, metav1.GetOptions{})
+	var r *v1alpha1.Route
+	err := reconciler.RetryTestErrors(func(int) (err error) {
+		r, err = client.Routes.Get(name, metav1.GetOptions{})
+		return err
+	})
 	if err != nil {
 		return err
 	}
diff --git a/test/v1alpha1/service.go b/test/v1alpha1/service.go
index f501b2ce8..a0bd66974 100644
--- a/test/v1alpha1/service.go
+++ b/test/v1alpha1/service.go
@@ -24,6 +24,7 @@ import (
 	"fmt"
 
 	"knative.dev/pkg/apis/duck"
+	"knative.dev/pkg/reconciler"
 
 	"github.com/mattbaird/jsonpatch"
 	corev1 "k8s.io/api/core/v1"
@@ -174,11 +175,13 @@ func CreateRunLatestServiceLegacyReady(t pkgTest.T, clients *test.Clients, names
 }
 
 // CreateLatestService creates a service in namespace with the name names.Service and names.Image
-func CreateLatestService(t pkgTest.T, clients *test.Clients, names test.ResourceNames, fopt ...rtesting.ServiceOption) (*v1alpha1.Service, error) {
+func CreateLatestService(t pkgTest.T, clients *test.Clients, names test.ResourceNames, fopt ...rtesting.ServiceOption) (svc *v1alpha1.Service, err error) {
 	service := LatestService(names, fopt...)
 	LogResourceObject(t, ResourceObjects{Service: service})
-	svc, err := clients.ServingAlphaClient.Services.Create(service)
-	return svc, err
+	return svc, reconciler.RetryTestErrors(func(int) (err error) {
+		svc, err = clients.ServingAlphaClient.Services.Create(service)
+		return err
+	})
 }
 
 // CreateLatestServiceLegacy creates a service in namespace with the name names.Service and names.Image
@@ -191,37 +194,43 @@ func CreateLatestServiceLegacy(t pkgTest.T, clients *test.Clients, names test.Re
 }
 
 // PatchServiceImage patches the existing service passed in with a new imagePath. Returns the latest service object
-func PatchServiceImage(t pkgTest.T, clients *test.Clients, svc *v1alpha1.Service, imagePath string) (*v1alpha1.Service, error) {
-	newSvc := svc.DeepCopy()
-	if svc.Spec.DeprecatedRunLatest != nil {
+func PatchServiceImage(t pkgTest.T, clients *test.Clients, service *v1alpha1.Service, imagePath string) (svc *v1alpha1.Service, err error) {
+	newSvc := service.DeepCopy()
+	if service.Spec.DeprecatedRunLatest != nil {
 		newSvc.Spec.DeprecatedRunLatest.Configuration.GetTemplate().Spec.GetContainer().Image = imagePath
-	} else if svc.Spec.DeprecatedRelease != nil {
+	} else if service.Spec.DeprecatedRelease != nil {
 		newSvc.Spec.DeprecatedRelease.Configuration.GetTemplate().Spec.GetContainer().Image = imagePath
-	} else if svc.Spec.DeprecatedPinned != nil {
+	} else if service.Spec.DeprecatedPinned != nil {
 		newSvc.Spec.DeprecatedPinned.Configuration.GetTemplate().Spec.GetContainer().Image = imagePath
 	} else {
 		newSvc.Spec.ConfigurationSpec.GetTemplate().Spec.GetContainer().Image = imagePath
 	}
 	LogResourceObject(t, ResourceObjects{Service: newSvc})
-	patchBytes, err := duck.CreateBytePatch(svc, newSvc)
+	patchBytes, err := duck.CreateBytePatch(service, newSvc)
 	if err != nil {
 		return nil, err
 	}
-	return clients.ServingAlphaClient.Services.Patch(svc.ObjectMeta.Name, types.JSONPatchType, patchBytes, "")
+	return svc, reconciler.RetryTestErrors(func(int) (err error) {
+		svc, err = clients.ServingAlphaClient.Services.Patch(service.ObjectMeta.Name, types.JSONPatchType, patchBytes, "")
+		return err
+	})
 }
 
 // PatchService creates and applies a patch from the diff between curSvc and desiredSvc. Returns the latest service object.
-func PatchService(t pkgTest.T, clients *test.Clients, curSvc, desiredSvc *v1alpha1.Service) (*v1alpha1.Service, error) {
+func PatchService(t pkgTest.T, clients *test.Clients, curSvc, desiredSvc *v1alpha1.Service) (svc *v1alpha1.Service, err error) {
 	LogResourceObject(t, ResourceObjects{Service: desiredSvc})
 	patchBytes, err := duck.CreateBytePatch(curSvc, desiredSvc)
 	if err != nil {
 		return nil, err
 	}
-	return clients.ServingAlphaClient.Services.Patch(curSvc.ObjectMeta.Name, types.JSONPatchType, patchBytes, "")
+	return svc, reconciler.RetryTestErrors(func(int) (err error) {
+		svc, err = clients.ServingAlphaClient.Services.Patch(curSvc.ObjectMeta.Name, types.JSONPatchType, patchBytes, "")
+		return err
+	})
 }
 
 // UpdateServiceRouteSpec updates a service to use the route name in names.
-func UpdateServiceRouteSpec(t pkgTest.T, clients *test.Clients, names test.ResourceNames, rs v1alpha1.RouteSpec) (*v1alpha1.Service, error) {
+func UpdateServiceRouteSpec(t pkgTest.T, clients *test.Clients, names test.ResourceNames, rs v1alpha1.RouteSpec) (svc *v1alpha1.Service, err error) {
 	patches := []jsonpatch.JsonPatchOperation{{
 		Operation: "replace",
 		Path:      "/spec/traffic",
@@ -231,19 +240,25 @@ func UpdateServiceRouteSpec(t pkgTest.T, clients *test.Clients, names test.Resou
 	if err != nil {
 		return nil, err
 	}
-	return clients.ServingAlphaClient.Services.Patch(names.Service, types.JSONPatchType, patchBytes, "")
+	return svc, reconciler.RetryTestErrors(func(int) (err error) {
+		svc, err = clients.ServingAlphaClient.Services.Patch(names.Service, types.JSONPatchType, patchBytes, "")
+		return err
+	})
 }
 
 // PatchServiceTemplateMetadata patches an existing service by adding metadata to the service's RevisionTemplateSpec.
-func PatchServiceTemplateMetadata(t pkgTest.T, clients *test.Clients, svc *v1alpha1.Service, metadata metav1.ObjectMeta) (*v1alpha1.Service, error) {
-	newSvc := svc.DeepCopy()
+func PatchServiceTemplateMetadata(t pkgTest.T, clients *test.Clients, service *v1alpha1.Service, metadata metav1.ObjectMeta) (svc *v1alpha1.Service, err error) {
+	newSvc := service.DeepCopy()
 	newSvc.Spec.ConfigurationSpec.Template.ObjectMeta = metadata
 	LogResourceObject(t, ResourceObjects{Service: newSvc})
-	patchBytes, err := duck.CreateBytePatch(svc, newSvc)
+	patchBytes, err := duck.CreateBytePatch(service, newSvc)
 	if err != nil {
 		return nil, err
 	}
-	return clients.ServingAlphaClient.Services.Patch(svc.ObjectMeta.Name, types.JSONPatchType, patchBytes, "")
+	return svc, reconciler.RetryTestErrors(func(int) (err error) {
+		svc, err = clients.ServingAlphaClient.Services.Patch(service.ObjectMeta.Name, types.JSONPatchType, patchBytes, "")
+		return err
+	})
 }
 
 // WaitForServiceLatestRevision takes a revision in through names and compares it to the current state of LatestCreatedRevisionName in Service.
@@ -306,8 +321,10 @@ func WaitForServiceState(client *test.ServingAlphaClients, name string, inState
 
 	var lastState *v1alpha1.Service
 	waitErr := wait.PollImmediate(test.PollInterval, test.PollTimeout, func() (bool, error) {
-		var err error
-		lastState, err = client.Services.Get(name, metav1.GetOptions{})
+		err := reconciler.RetryTestErrors(func(int) (err error) {
+			lastState, err = client.Services.Get(name, metav1.GetOptions{})
+			return err
+		})
 		if err != nil {
 			return true, err
 		}
@@ -324,7 +341,11 @@ func WaitForServiceState(client *test.ServingAlphaClients, name string, inState
 // is in a particular state by calling `inState` and expecting `true`.
 // This is the non-polling variety of WaitForServiceState.
 func CheckServiceState(client *test.ServingAlphaClients, name string, inState func(s *v1alpha1.Service) (bool, error)) error {
-	s, err := client.Services.Get(name, metav1.GetOptions{})
+	var s *v1alpha1.Service
+	err := reconciler.RetryTestErrors(func(int) (err error) {
+		s, err = client.Services.Get(name, metav1.GetOptions{})
+		return err
+	})
 	if err != nil {
 		return err
 	}
diff --git a/test/v1beta1/configuration.go b/test/v1beta1/configuration.go
index b02aa659b..eb973655b 100644
--- a/test/v1beta1/configuration.go
+++ b/test/v1beta1/configuration.go
@@ -22,6 +22,7 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 	"knative.dev/pkg/apis/duck"
+	"knative.dev/pkg/reconciler"
 	"knative.dev/pkg/test/logging"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
 	"knative.dev/serving/pkg/apis/serving/v1beta1"
@@ -37,26 +38,33 @@ import (
 
 // CreateConfiguration create a configuration resource in namespace with the name names.Config
 // that uses the image specified by names.Image.
-func CreateConfiguration(t pkgTest.T, clients *test.Clients, names test.ResourceNames, fopt ...rtesting.ConfigOption) (*v1beta1.Configuration, error) {
+func CreateConfiguration(t pkgTest.T, clients *test.Clients, names test.ResourceNames, fopt ...rtesting.ConfigOption) (cfg *v1beta1.Configuration, err error) {
 	config := Configuration(names, fopt...)
 	test.AddTestAnnotation(t, config.ObjectMeta)
 	LogResourceObject(t, ResourceObjects{Config: config})
-	return clients.ServingBetaClient.Configs.Create(config)
+	return cfg, reconciler.RetryTestErrors(func(int) (err error) {
+		cfg, err = clients.ServingBetaClient.Configs.Create(config)
+		return err
+	})
 }
 
 // PatchConfig patches the existing configuration passed in with the applied mutations.
 // Returns the latest configuration object
-func PatchConfig(t pkgTest.T, clients *test.Clients, svc *v1beta1.Configuration, fopt ...rtesting.ConfigOption) (*v1beta1.Configuration, error) {
-	newSvc := svc.DeepCopy()
+func PatchConfig(t pkgTest.T, clients *test.Clients, config *v1beta1.Configuration, fopt ...rtesting.ConfigOption) (cfg *v1beta1.Configuration, err error) {
+	newConfig := config.DeepCopy()
 	for _, opt := range fopt {
-		opt(newSvc)
+		opt(newConfig)
 	}
-	LogResourceObject(t, ResourceObjects{Config: newSvc})
-	patchBytes, err := duck.CreateBytePatch(svc, newSvc)
+	LogResourceObject(t, ResourceObjects{Config: newConfig})
+	patchBytes, err := duck.CreateBytePatch(config, newConfig)
 	if err != nil {
 		return nil, err
 	}
-	return clients.ServingBetaClient.Configs.Patch(svc.ObjectMeta.Name, types.JSONPatchType, patchBytes, "")
+
+	return cfg, reconciler.RetryTestErrors(func(int) (err error) {
+		cfg, err = clients.ServingBetaClient.Configs.Patch(config.ObjectMeta.Name, types.JSONPatchType, patchBytes, "")
+		return err
+	})
 }
 
 // WaitForConfigLatestPinnedRevision enables the check for pinned revision in WaitForConfigLatestRevision.
@@ -142,8 +150,10 @@ func WaitForConfigurationState(client *test.ServingBetaClients, name string, inS
 
 	var lastState *v1beta1.Configuration
 	waitErr := wait.PollImmediate(test.PollInterval, test.PollTimeout, func() (bool, error) {
-		var err error
-		lastState, err = client.Configs.Get(name, metav1.GetOptions{})
+		err := reconciler.RetryTestErrors(func(int) (err error) {
+			lastState, err = client.Configs.Get(name, metav1.GetOptions{})
+			return err
+		})
 		if err != nil {
 			return true, err
 		}
@@ -160,7 +170,11 @@ func WaitForConfigurationState(client *test.ServingBetaClients, name string, inS
 // is in a particular state by calling `inState` and expecting `true`.
 // This is the non-polling variety of WaitForConfigurationState
 func CheckConfigurationState(client *test.ServingBetaClients, name string, inState func(r *v1beta1.Configuration) (bool, error)) error {
-	c, err := client.Configs.Get(name, metav1.GetOptions{})
+	var c *v1beta1.Configuration
+	err := reconciler.RetryTestErrors(func(int) (err error) {
+		c, err = client.Configs.Get(name, metav1.GetOptions{})
+		return err
+	})
 	if err != nil {
 		return err
 	}
diff --git a/test/v1beta1/route.go b/test/v1beta1/route.go
index 4ee7dc213..c711fef8d 100644
--- a/test/v1beta1/route.go
+++ b/test/v1beta1/route.go
@@ -24,6 +24,7 @@ import (
 	"k8s.io/apimachinery/pkg/util/wait"
 
 	"knative.dev/pkg/ptr"
+	"knative.dev/pkg/reconciler"
 	pkgTest "knative.dev/pkg/test"
 	"knative.dev/pkg/test/logging"
 	"knative.dev/pkg/test/spoof"
@@ -57,11 +58,14 @@ func Route(names test.ResourceNames, fopt ...rtesting.RouteOption) *v1beta1.Rout
 }
 
 // CreateRoute creates a route in the given namespace using the route name in names
-func CreateRoute(t pkgTest.T, clients *test.Clients, names test.ResourceNames, fopt ...rtesting.RouteOption) (*v1beta1.Route, error) {
+func CreateRoute(t pkgTest.T, clients *test.Clients, names test.ResourceNames, fopt ...rtesting.RouteOption) (rt *v1beta1.Route, err error) {
 	route := Route(names, fopt...)
 	test.AddTestAnnotation(t, route.ObjectMeta)
 	LogResourceObject(t, ResourceObjects{Route: route})
-	return clients.ServingBetaClient.Routes.Create(route)
+	return rt, reconciler.RetryTestErrors(func(int) (err error) {
+		rt, err = clients.ServingBetaClient.Routes.Create(route)
+		return err
+	})
 }
 
 // WaitForRouteState polls the status of the Route called name from client every
@@ -74,8 +78,10 @@ func WaitForRouteState(client *test.ServingBetaClients, name string, inState fun
 
 	var lastState *v1beta1.Route
 	waitErr := wait.PollImmediate(test.PollInterval, test.PollTimeout, func() (bool, error) {
-		var err error
-		lastState, err = client.Routes.Get(name, metav1.GetOptions{})
+		err := reconciler.RetryTestErrors(func(int) (err error) {
+			lastState, err = client.Routes.Get(name, metav1.GetOptions{})
+			return err
+		})
 		if err != nil {
 			return true, err
 		}
@@ -92,7 +98,11 @@ func WaitForRouteState(client *test.ServingBetaClients, name string, inState fun
 // is in a particular state by calling `inState` and expecting `true`.
 // This is the non-polling variety of WaitForRouteState
 func CheckRouteState(client *test.ServingBetaClients, name string, inState func(r *v1beta1.Route) (bool, error)) error {
-	r, err := client.Routes.Get(name, metav1.GetOptions{})
+	var r *v1beta1.Route
+	err := reconciler.RetryTestErrors(func(int) (err error) {
+		r, err = client.Routes.Get(name, metav1.GetOptions{})
+		return err
+	})
 	if err != nil {
 		return err
 	}
diff --git a/test/v1beta1/service.go b/test/v1beta1/service.go
index 26e6b264f..cfbe3dc27 100644
--- a/test/v1beta1/service.go
+++ b/test/v1beta1/service.go
@@ -27,6 +27,7 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/apimachinery/pkg/util/wait"
 	"knative.dev/pkg/apis/duck"
+	"knative.dev/pkg/reconciler"
 	pkgTest "knative.dev/pkg/test"
 	"knative.dev/pkg/test/logging"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
@@ -130,31 +131,36 @@ func CreateServiceReady(t pkgTest.T, clients *test.Clients, names *test.Resource
 }
 
 // CreateService creates a service in namespace with the name names.Service and names.Image
-func CreateService(t pkgTest.T, clients *test.Clients, names test.ResourceNames, fopt ...rtesting.ServiceOption) (*v1beta1.Service, error) {
+func CreateService(t pkgTest.T, clients *test.Clients, names test.ResourceNames, fopt ...rtesting.ServiceOption) (svc *v1beta1.Service, err error) {
 	service := Service(names, fopt...)
 	test.AddTestAnnotation(t, service.ObjectMeta)
 	LogResourceObject(t, ResourceObjects{Service: service})
-	svc, err := clients.ServingBetaClient.Services.Create(service)
-	return svc, err
+	return svc, reconciler.RetryTestErrors(func(int) (err error) {
+		svc, err = clients.ServingBetaClient.Services.Create(service)
+		return err
+	})
 }
 
 // PatchService patches the existing service passed in with the applied mutations.
 // Returns the latest service object
-func PatchService(t pkgTest.T, clients *test.Clients, svc *v1beta1.Service, fopt ...rtesting.ServiceOption) (*v1beta1.Service, error) {
-	newSvc := svc.DeepCopy()
+func PatchService(t pkgTest.T, clients *test.Clients, service *v1beta1.Service, fopt ...rtesting.ServiceOption) (svc *v1beta1.Service, err error) {
+	newSvc := service.DeepCopy()
 	for _, opt := range fopt {
 		opt(newSvc)
 	}
 	LogResourceObject(t, ResourceObjects{Service: newSvc})
-	patchBytes, err := duck.CreateBytePatch(svc, newSvc)
+	patchBytes, err := duck.CreateBytePatch(service, newSvc)
 	if err != nil {
 		return nil, err
 	}
-	return clients.ServingBetaClient.Services.Patch(svc.ObjectMeta.Name, types.JSONPatchType, patchBytes, "")
+	return svc, reconciler.RetryTestErrors(func(int) (err error) {
+		svc, err = clients.ServingBetaClient.Services.Patch(service.ObjectMeta.Name, types.JSONPatchType, patchBytes, "")
+		return err
+	})
 }
 
 // UpdateServiceRouteSpec updates a service to use the route name in names.
-func UpdateServiceRouteSpec(t pkgTest.T, clients *test.Clients, names test.ResourceNames, rs v1.RouteSpec) (*v1beta1.Service, error) {
+func UpdateServiceRouteSpec(t pkgTest.T, clients *test.Clients, names test.ResourceNames, rs v1.RouteSpec) (svc *v1beta1.Service, err error) {
 	patches := []jsonpatch.JsonPatchOperation{{
 		Operation: "replace",
 		Path:      "/spec/traffic",
@@ -164,7 +170,10 @@ func UpdateServiceRouteSpec(t pkgTest.T, clients *test.Clients, names test.Resou
 	if err != nil {
 		return nil, err
 	}
-	return clients.ServingBetaClient.Services.Patch(names.Service, types.JSONPatchType, patchBytes, "")
+	return svc, reconciler.RetryTestErrors(func(int) (err error) {
+		svc, err = clients.ServingBetaClient.Services.Patch(names.Service, types.JSONPatchType, patchBytes, "")
+		return err
+	})
 }
 
 // WaitForServiceLatestRevision takes a revision in through names and compares it to the current state of LatestCreatedRevisionName in Service.
@@ -215,8 +224,10 @@ func WaitForServiceState(client *test.ServingBetaClients, name string, inState f
 
 	var lastState *v1beta1.Service
 	waitErr := wait.PollImmediate(test.PollInterval, test.PollTimeout, func() (bool, error) {
-		var err error
-		lastState, err = client.Services.Get(name, metav1.GetOptions{})
+		err := reconciler.RetryTestErrors(func(int) (err error) {
+			lastState, err = client.Services.Get(name, metav1.GetOptions{})
+			return err
+		})
 		if err != nil {
 			return true, err
 		}
@@ -233,7 +244,11 @@ func WaitForServiceState(client *test.ServingBetaClients, name string, inState f
 // is in a particular state by calling `inState` and expecting `true`.
 // This is the non-polling variety of WaitForServiceState.
 func CheckServiceState(client *test.ServingBetaClients, name string, inState func(s *v1beta1.Service) (bool, error)) error {
-	s, err := client.Services.Get(name, metav1.GetOptions{})
+	var s *v1beta1.Service
+	err := reconciler.RetryTestErrors(func(int) (err error) {
+		s, err = client.Services.Get(name, metav1.GetOptions{})
+		return err
+	})
 	if err != nil {
 		return err
 	}
diff --git a/third_party/contour-latest/net-contour.yaml b/third_party/contour-latest/net-contour.yaml
index 0232026de..017956bd4 100644
--- a/third_party/contour-latest/net-contour.yaml
+++ b/third_party/contour-latest/net-contour.yaml
@@ -35,7 +35,7 @@ metadata:
   namespace: knative-serving
   labels:
     networking.knative.dev/ingress-provider: contour
-    serving.knative.dev/release: "v20200903-a9de353f"
+    serving.knative.dev/release: "v20200909-7c0a7a7f"
 data:
   _example: |
     ################################
@@ -100,7 +100,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:103b910de45c55eb3f0455f0b111b36c3fbddb9b8b8a5ea00a0a6bc3c27759de
+        image: gcr.io/knative-nightly/knative.dev/net-contour/cmd/controller@sha256:4b1a016533f40b8e537f1a8260fdb29ab17221271edab84a7eae44934f539e75
         resources:
           requests:
             cpu: 40m
diff --git a/third_party/kourier-latest/kourier.yaml b/third_party/kourier-latest/kourier.yaml
index 1234508f2..fc0e8933c 100644
--- a/third_party/kourier-latest/kourier.yaml
+++ b/third_party/kourier-latest/kourier.yaml
@@ -104,7 +104,7 @@ spec:
         app: 3scale-kourier-control
     spec:
       containers:
-      - image: gcr.io/knative-nightly/knative.dev/net-kourier/cmd/kourier@sha256:263aee946ef0fd57a0171446a2d1f6e5caaef3d77e8707348c73d604f19147ad
+      - image: gcr.io/knative-nightly/knative.dev/net-kourier/cmd/kourier@sha256:e714b702827a18a946746417471049d65e63f99f22442457ef383892b855096f
         imagePullPolicy: Always
         name: kourier-control
         env:
diff --git a/vendor/knative.dev/pkg/test/ghutil/pullrequest.go b/vendor/knative.dev/pkg/test/ghutil/pullrequest.go
index c96d8bd3b..2a4303460 100644
--- a/vendor/knative.dev/pkg/test/ghutil/pullrequest.go
+++ b/vendor/knative.dev/pkg/test/ghutil/pullrequest.go
@@ -37,7 +37,7 @@ const (
 type PullRequestState string
 
 // ListPullRequests lists pull requests within given repo, filters by head user and branch name if
-// provided as "user:ref-name", and by base name if provided, i.e. "master"
+// provided as "user:ref-name", and by base name if provided, i.e. "release-0.19"
 func (gc *GithubClient) ListPullRequests(org, repo, head, base string) ([]*github.PullRequest, error) {
 	PRsListOptions := github.PullRequestListOptions{
 		State: string(PullRequestAllState),
@@ -184,7 +184,7 @@ func (gc *GithubClient) EditPullRequest(org, repo string, ID int, title, body st
 	return res, err
 }
 
-// CreatePullRequest creates PullRequest, passing head user and branch name "user:ref-name", and base branch name like "master"
+// CreatePullRequest creates PullRequest, passing head user and branch name "user:ref-name", and base branch name like "release-0.19"
 func (gc *GithubClient) CreatePullRequest(org, repo, head, base, title, body string) (*github.PullRequest, error) {
 	b := true
 	PR := &github.NewPullRequest{
diff --git a/vendor/knative.dev/pkg/testutils/clustermanager/perf-tests/pkg/benchmark.go b/vendor/knative.dev/pkg/testutils/clustermanager/perf-tests/pkg/benchmark.go
index 221e18584..ea8162359 100644
--- a/vendor/knative.dev/pkg/testutils/clustermanager/perf-tests/pkg/benchmark.go
+++ b/vendor/knative.dev/pkg/testutils/clustermanager/perf-tests/pkg/benchmark.go
@@ -40,7 +40,7 @@ const (
 )
 
 // backupLocations are used in retrying cluster creation, if stockout happens in one location.
-// TODO(chizhg): it's currently not used, use it in the cluster creation retry logic.
+// nolint // TODO(chizhg): it's currently not used, use it in the cluster creation retry logic.
 var backupLocations = []string{"us-west1", "us-west2", "us-east1"}
 
 // GKECluster saves the config information for the GKE cluster
diff --git a/vendor/knative.dev/pkg/testutils/clustermanager/perf-tests/pkg/cluster.go b/vendor/knative.dev/pkg/testutils/clustermanager/perf-tests/pkg/cluster.go
index 90f0ccfc5..473f072ba 100644
--- a/vendor/knative.dev/pkg/testutils/clustermanager/perf-tests/pkg/cluster.go
+++ b/vendor/knative.dev/pkg/testutils/clustermanager/perf-tests/pkg/cluster.go
@@ -38,7 +38,6 @@ const (
 	// known cluster status
 	// TODO(chizhg): move these status constants to gke package
 	statusProvisioning = "PROVISIONING"
-	statusRunning      = "RUNNING"
 	statusStopping     = "STOPPING"
 )
 
diff --git a/vendor/knative.dev/test-infra/scripts/README.md b/vendor/knative.dev/test-infra/scripts/README.md
index 6fc264849..10680506e 100644
--- a/vendor/knative.dev/test-infra/scripts/README.md
+++ b/vendor/knative.dev/test-infra/scripts/README.md
@@ -110,28 +110,8 @@ main "$@"
 
 This is a helper script for Knative E2E test scripts. To use it:
 
-1. [optional] Customize the test cluster. Set the following environment
-   variables if the default values don't fit your needs:
-
-   - `E2E_GCP_PROJECT_ID`: GCP project ID for creating the clusters, defaults to
-     none.
-   - `E2E_GKE_CLUSTER_REGION`: Cluster region, defaults to `us-central1`.
-   - `E2E_GKE_CLUSTER_BACKUP_REGIONS`: Space-separated list of regions to retry
-     test cluster creation in case of stockout. Defaults to `us-west1 us-east1`.
-   - `E2E_GKE_CLUSTER_ZONE`: Cluster zone (e.g., `a`), defaults to none (i.e.
-     use a regional cluster).
-   - `E2E_GKE_CLUSTER_BACKUP_ZONES`: Space-separated list of zones to retry test
-     cluster creation in case of stockout. If defined,
-     `E2E_GKE_CLUSTER_BACKUP_REGIONS` will be ignored thus it defaults to none.
-   - `E2E_GKE_CLUSTER_MACHINE`: Cluster node machine type, defaults to
-     `e2-standard-4}`.
-   - `E2E_MIN_CLUSTER_NODES`: Minimum number of nodes in the cluster when
-     autoscaling, defaults to 1.
-   - `E2E_MAX_CLUSTER_NODES`: Maximum number of nodes in the cluster when
-     autoscaling, defaults to 3.
-   - `E2E_GKE_SCOPES`: Scopes for the GKE node instances, defaults to
-     `cloud-platform`.
-   - `E2E_CLUSTER_VERSION`: Version for the cluster, defaults to `latest`.
+1. [optional] Customize the test cluster. Pass the flags as described [here](../kntest/pkg/kubetest2/gke/README.md)
+   to the `initialize` function call if the default values don't fit your needs.
 
 1. Source the script.
 
@@ -163,7 +143,7 @@ This is a helper script for Knative E2E test scripts. To use it:
    of items to skip in the command line if the flag was parsed successfully. For
    example, return 1 for a simple flag, and 2 for a flag with a parameter.
 
-1. Call the `initialize()` function passing `$@` (without quotes).
+1. Call the `initialize()` function passing `"$@"`.
 
 1. Write logic for the end-to-end tests. Run all go tests using `go_test_e2e()`
    (or `report_go_test()` if you need a more fine-grained control) and call
@@ -173,8 +153,8 @@ This is a helper script for Knative E2E test scripts. To use it:
 
 **Notes:**
 
-1. Calling your script without arguments will create a new cluster in the GCP
-   project `$E2E_GCP_PROJECT_ID` and run the tests against it.
+1. Calling your script without arguments will create a new cluster in your current
+   GCP project and run the tests against it.
 
 1. Calling your script with `--run-tests` and the variable `KO_DOCKER_REPO` set
    will immediately start the tests against the cluster currently configured for
@@ -195,9 +175,6 @@ test cluster is created in a specific region, `us-west2`.
 
 ```bash
 
-# This test requires a cluster in LA
-E2E_CLUSTER_REGION=us-west2
-
 source vendor/knative.dev/test-infra/scripts/e2e-tests.sh
 
 function knative_setup() {
@@ -217,7 +194,8 @@ function parse_flags() {
 
 WAIT_FOR_KNATIVE=1
 
-initialize $@
+# This test requires a cluster in LA
+initialize $@ --region=us-west2
 
 # TODO: use go_test_e2e to run the tests.
 kubectl get pods || fail_test
diff --git a/vendor/knative.dev/test-infra/scripts/e2e-tests.sh b/vendor/knative.dev/test-infra/scripts/e2e-tests.sh
index 7ec4bd7f3..51356f998 100644
--- a/vendor/knative.dev/test-infra/scripts/e2e-tests.sh
+++ b/vendor/knative.dev/test-infra/scripts/e2e-tests.sh
@@ -128,14 +128,14 @@ CLOUD_PROVIDER="gke"
 # Parse flags and initialize the test cluster.
 function initialize() {
   local run_tests=0
-  local extra_kubetest2_flags=()
-  local extra_cluster_creation_flags=()
+  local custom_flags=()
   E2E_SCRIPT="$(get_canonical_path "$0")"
   local e2e_script_command=( "${E2E_SCRIPT}" "--run-tests" )
 
   cd "${REPO_ROOT_DIR}"
   while [[ $# -ne 0 ]]; do
     local parameter=$1
+    # TODO(chizhg): remove parse_flags logic if no repos are using it.
     # Try parsing flag as a custom one.
     if function_exists parse_flags; then
       parse_flags "$@"
@@ -157,13 +157,9 @@ function initialize() {
       # TODO(chizhg): remove this flag once the addons is defined as an env var.
       --skip-istio-addon) SKIP_ISTIO_ADDON=1 ;;
       *)
-        [[ $# -ge 2 ]] || abort "missing parameter after $1"
-        shift
         case ${parameter} in
-          --cloud-provider) CLOUD_PROVIDER="$1" ;;
-          --kubetest2-flag) extra_kubetest2_flags+=("$1") ;;
-          --cluster-creation-flag) extra_cluster_creation_flags+=("$1") ;;
-          *) abort "unknown option ${parameter}" ;;
+          --cloud-provider) shift; CLOUD_PROVIDER="$1" ;;
+          *) custom_flags+=("$parameter") ;;
         esac
     esac
     shift
@@ -172,16 +168,16 @@ function initialize() {
   (( IS_PROW )) && [[ -z "${GCP_PROJECT_ID:-}" ]] && IS_BOSKOS=1
 
   if (( SKIP_ISTIO_ADDON )); then
-    extra_cluster_creation_flags+=("--addons=NodeLocalDNS")
+    custom_flags+=("--addons=NodeLocalDNS")
   else
-    extra_cluster_creation_flags+=("--addons=Istio,NodeLocalDNS")
+    custom_flags+=("--addons=Istio,NodeLocalDNS")
   fi
 
   readonly IS_BOSKOS
   readonly SKIP_TEARDOWNS
 
   if (( ! run_tests )); then
-    create_test_cluster "${CLOUD_PROVIDER}" extra_kubetest2_flags extra_cluster_creation_flags e2e_script_command
+    create_test_cluster "${CLOUD_PROVIDER}" custom_flags e2e_script_command
   else
     setup_test_cluster
   fi
diff --git a/vendor/knative.dev/test-infra/scripts/infra-library.sh b/vendor/knative.dev/test-infra/scripts/infra-library.sh
index ebdae3f29..1ab61d3e8 100644
--- a/vendor/knative.dev/test-infra/scripts/infra-library.sh
+++ b/vendor/knative.dev/test-infra/scripts/infra-library.sh
@@ -19,34 +19,6 @@
 
 source $(dirname "${BASH_SOURCE[0]}")/library.sh
 
-# Test cluster parameters
-
-# Configurable parameters
-export E2E_GCP_PROJECT_ID=${E2E_GCP_PROJECT_ID:-}
-# export E2E_GKE_CLUSTER_REGION and E2E_GKE_CLUSTER_ZONE as they're used in the cluster setup subprocess
-export E2E_GKE_CLUSTER_REGION=${E2E_GKE_CLUSTER_REGION:-us-central1}
-# By default we use regional clusters.
-export E2E_GKE_CLUSTER_ZONE=${E2E_GKE_CLUSTER_ZONE:-}
-
-# Default backup regions in case of stockouts; by default we don't fall back to a different zone in the same region
-readonly E2E_GKE_CLUSTER_BACKUP_REGIONS=${E2E_GKE_CLUSTER_BACKUP_REGIONS:-us-west1 us-east1}
-readonly E2E_GKE_CLUSTER_BACKUP_ZONES=${E2E_GKE_CLUSTER_BACKUP_ZONES:-}
-
-readonly E2E_GKE_ENVIRONMENT=${E2E_GKE_ENVIRONMENT:-prod}
-readonly E2E_GKE_COMMAND_GROUP=${E2E_GKE_COMMAND_GROUP:-beta}
-readonly E2E_GKE_CLUSTER_MACHINE=${E2E_GKE_CLUSTER_MACHINE:-e2-standard-4}
-readonly E2E_GKE_SCOPES=${E2E_GKE_SCOPES:-cloud-platform}
-
-# Each knative repository may have a different cluster size requirement here,
-# so we allow calling code to set these parameters.  If they are not set we
-# use some sane defaults.
-readonly E2E_MIN_CLUSTER_NODES=${E2E_MIN_CLUSTER_NODES:-1}
-readonly E2E_MAX_CLUSTER_NODES=${E2E_MAX_CLUSTER_NODES:-3}
-readonly E2E_CLUSTER_VERSION=${E2E_CLUSTER_VERSION:-latest}
-
-readonly E2E_CLUSTER_NAME=$(build_resource_name e2e-cls)
-readonly E2E_GKE_NETWORK_NAME=$(build_resource_name e2e-net)
-
 # Dumps the k8s api server metrics. Spins up a proxy, waits a little bit and
 # dumps the metrics to ${ARTIFACTS}/k8s.metrics.txt
 function dump_metrics() {
@@ -105,26 +77,6 @@ function dump_cluster_state() {
   echo "***************************************"
 }
 
-# On a Prow job, save some metadata about the test for Testgrid.
-# Parameters: $1 - cluster provider name
-function save_metadata() {
-  (( ! IS_PROW )) && return
-  local geo_key="Region"
-  local geo_value="${E2E_GKE_CLUSTER_REGION}"
-  if [[ -n "${E2E_GKE_CLUSTER_ZONE}" ]]; then
-    geo_key="Zone"
-    geo_value="${E2E_GKE_CLUSTER_REGION}-${E2E_GKE_CLUSTER_ZONE}"
-  fi
-  local cluster_version
-  cluster_version="$(kubectl version --short=true)"
-  run_kntest metadata set --key="E2E:Provider" --value="$1"
-  run_kntest metadata set --key="E2E:${geo_key}" --value="${geo_value}"
-  run_kntest metadata set --key="E2E:Machine" --value="${E2E_GKE_CLUSTER_MACHINE}"
-  run_kntest metadata set --key="E2E:Version" --value="${cluster_version}"
-  run_kntest metadata set --key="E2E:MinNodes" --value="${E2E_MIN_CLUSTER_NODES}"
-  run_kntest metadata set --key="E2E:MaxNodes" --value="${E2E_MAX_CLUSTER_NODES}"
-}
-
 # Sets the current user as cluster admin for the given cluster.
 # Parameters: $1 - cluster context name
 function acquire_cluster_admin_role() {
@@ -141,9 +93,8 @@ function acquire_cluster_admin_role() {
 
 # Create a test cluster and run the tests if provided.
 # Parameters: $1 - cluster provider name, e.g. gke
-#             $2 - extra kubetest2 flags
-#             $3 - extra cluster creation flags
-#             $4 - test command to run by the kubetest2 tester
+#             $2 - custom flags supported by kntest
+#             $3 - test command to run after cluster is created
 function create_test_cluster() {
   # Fail fast during setup.
   set -o errexit
@@ -170,111 +121,19 @@ function create_test_cluster() {
 }
 
 # Create a KIND test cluster with kubetest2 and run the test command.
-# Parameters: $1 - extra kubetest2 flags
-#             $2 - extra cluster creation flags
-#             $3 - test command to run by the kubetest2 tester
+# Parameters: $1 - extra cluster creation flags
+#             $2 - test command to run by the kubetest2 tester
 function create_kind_test_cluster() {
   # TODO(chizhg): implement with kubetest2
   return 0
 }
 
 # Create a GKE test cluster with kubetest2 and run the test command.
-# Parameters: $1 - extra kubetest2 flags
-#             $2 - extra cluster creation flags
-#             $3 - test command to run by the kubetest2 tester after the cluster is created (optional)
+# Parameters: $1 - custom flags defined in kntest
+#             $2 - test command to run after the cluster is created (optional)
 function create_gke_test_cluster() {
-  local -n _extra_kubetest2_flags=$1
-  local -n _extra_cluster_creation_flags=$2
-
-  echo "Cluster will have a minimum of ${E2E_MIN_CLUSTER_NODES} and a maximum of ${E2E_MAX_CLUSTER_NODES} nodes."
-  local _kubetest2_flags=(
-    "gke"
-    "--create-command=${E2E_GKE_COMMAND_GROUP} container clusters create --quiet --enable-autoscaling
-      --min-nodes=${E2E_MIN_CLUSTER_NODES} --max-nodes=${E2E_MAX_CLUSTER_NODES}
-      --cluster-version=${E2E_CLUSTER_VERSION}
-      --scopes=${E2E_GKE_SCOPES} --no-enable-autoupgrade
-      ${_extra_cluster_creation_flags[@]}"
-    "--environment=${E2E_GKE_ENVIRONMENT}"
-    "--cluster-name=${E2E_CLUSTER_NAME}"
-    "--num-nodes=${E2E_MIN_CLUSTER_NODES}"
-    "--machine-type=${E2E_GKE_CLUSTER_MACHINE}"
-    "--network=${E2E_GKE_NETWORK_NAME}"
-    "--ignore-gcp-ssh-key=true"
-    --up
-  )
-  _kubetest2_flags+=( "${_extra_kubetest2_flags[@]}" )
-  if (( ! IS_BOSKOS )); then
-    local gcloud_project="${E2E_GCP_PROJECT_ID}"
-    [[ -z "${gcloud_project}" ]] && gcloud_project="$(gcloud config get-value project)"
-    _kubetest2_flags+=("--project=${gcloud_project}")
-    echo "gcloud project is ${gcloud_project}"
-  else
-    echo "Using boskos for provisioning the GCP project to create the test cluster"
-  fi
+  local -n _custom_flags=$1
+  local -n _test_command=$2
 
-  if (( IS_BOSKOS )); then
-    # Add arbitrary duration, wait for Boskos projects acquisition before error out
-    _kubetest2_flags+=("--boskos-acquire-timeout-seconds=1200")
-  elif (( ! SKIP_TEARDOWNS )); then
-    # Only let kubetest2 tear down the cluster if not using Boskos and teardowns are not expected to be skipped,
-    # it's done by Janitor if using Boskos
-    _kubetest2_flags+=("--down")
-  fi
-
-  # Create cluster and run the tests
-  create_gke_test_cluster_with_retries _kubetest2_flags "$3"
-}
-
-# TODO(chizhg): move this to kubetest2 gke deployer.
-# Retry backup regions/zones if cluster creations failed due to stockout.
-# Parameters: $1 - kubetest2 flags other than geo flag
-#             $2 - test command to run by the kubetest2 tester after the cluster is created (optional)
-function create_gke_test_cluster_with_retries() {
-  local -n kubetest2_flags=$1
-  local -n command=$2
-  if (( ${#command[@]} )); then
-    tester_command=("--test=exec" "--" "${command[@]}")
-  fi
-  local cluster_creation_log=/tmp/${REPO_NAME}-cluster_creation-log
-  # zone_not_provided is a placeholder for e2e_cluster_zone to make for loop below work
-  local zone_not_provided="zone_not_provided"
-
-  local e2e_cluster_regions=("${E2E_GKE_CLUSTER_REGION}")
-  local e2e_cluster_zones=("${E2E_GKE_CLUSTER_ZONE}")
-
-  if [[ -n "${E2E_GKE_CLUSTER_BACKUP_ZONES}" ]]; then
-    e2e_cluster_zones+=("${E2E_GKE_CLUSTER_BACKUP_ZONES}")
-  elif [[ -n "${E2E_GKE_CLUSTER_BACKUP_REGIONS}" ]]; then
-    e2e_cluster_regions+=("${E2E_GKE_CLUSTER_BACKUP_REGIONS}")
-    e2e_cluster_zones=("${zone_not_provided}")
-  else
-    echo "No backup region/zone set, cluster creation will fail in case of stockout"
-  fi
-
-  for e2e_cluster_region in "${e2e_cluster_regions[@]}"; do
-    for e2e_cluster_zone in "${e2e_cluster_zones[@]}"; do
-      E2E_GKE_CLUSTER_REGION=${e2e_cluster_region}
-      E2E_GKE_CLUSTER_ZONE=${e2e_cluster_zone}
-      [[ "${E2E_GKE_CLUSTER_ZONE}" == "${zone_not_provided}" ]] && E2E_GKE_CLUSTER_ZONE=""
-      local cluster_creation_zone="${E2E_GKE_CLUSTER_REGION}"
-      [[ -n "${E2E_GKE_CLUSTER_ZONE}" ]] && cluster_creation_zone="${E2E_GKE_CLUSTER_REGION}-${E2E_GKE_CLUSTER_ZONE}"
-
-      header "Creating test cluster ${E2E_CLUSTER_VERSION} in ${cluster_creation_zone}"
-      if run_go_tool k8s-sigs.io/kubetest2 \
-        kubetest2 "${kubetest2_flags[@]}" --region="${cluster_creation_zone}" "${tester_command[@]}" 2>&1 \
-         | tee "${cluster_creation_log}"; then
-        # Save some metadata about cluster creation for using in prow and testgrid
-        save_metadata "gke"
-        return 0
-      fi
-      # Retry if cluster creation failed because of stockout (https://github.com/knative/test-infra/issues/592)
-      # or Nodes failing to start correctly.
-      # shellcheck disable=SC2143
-      [[ -z "$(grep -Fo 'does not have enough resources available to fulfill' "${cluster_creation_log}")" \
-          && -z "$(grep -Po 'only \d+ nodes out of \d+ have registered; this is likely due to Nodes failing to start correctly' "${cluster_creation_log}")" ]] \
-          && return 1
-    done
-  done
-  echo "No more region/zones to try, quitting"
-  return 1
+  run_kntest kubetest2 gke "${_custom_flags[@]}" --test-command="${_test_command[*]}"
 }
diff --git a/vendor/knative.dev/test-infra/scripts/library.sh b/vendor/knative.dev/test-infra/scripts/library.sh
index 26603fc1e..92fccb17a 100644
--- a/vendor/knative.dev/test-infra/scripts/library.sh
+++ b/vendor/knative.dev/test-infra/scripts/library.sh
@@ -65,22 +65,6 @@ function abort() {
   exit 1
 }
 
-# Build a resource name based on $REPO_NAME, a suffix and $BUILD_NUMBER.
-# Restricts the name length to 40 chars (the limit for resource names in GCP).
-# Name will have the form $REPO_NAME-<PREFIX>$BUILD_NUMBER.
-# Parameters: $1 - name suffix
-function build_resource_name() {
-  local prefix=${REPO_NAME}-$1
-  local suffix=${BUILD_NUMBER}
-  # Restrict suffix length to 20 chars
-  if [[ -n "${suffix}" ]]; then
-    suffix=${suffix:${#suffix}<20?0:-20}
-  fi
-  local name="${prefix:0:20}${suffix}"
-  # Ensure name doesn't end with "-"
-  echo "${name%-}"
-}
-
 # Display a box banner.
 # Parameters: $1 - character to use for the box.
 #             $2 - banner message.
diff --git a/vendor/knative.dev/test-infra/scripts/presubmit-tests.sh b/vendor/knative.dev/test-infra/scripts/presubmit-tests.sh
index 8545bcb48..a1ee7cb41 100644
--- a/vendor/knative.dev/test-infra/scripts/presubmit-tests.sh
+++ b/vendor/knative.dev/test-infra/scripts/presubmit-tests.sh
@@ -272,7 +272,7 @@ function run_integration_tests() {
 # Default integration test runner that runs all `test/e2e-*tests.sh`.
 function default_integration_test_runner() {
   local failed=0
-  find test/ ! -name "$(printf "*\n*")" -name "e2e-*tests.sh" > tmp
+  find test/ ! -name "$(printf "*\n*")" -name "e2e-*tests.sh" -maxdepth 1 > tmp
   while IFS= read -r e2e_test
   do
     echo "Running integration test ${e2e_test}"