Repository: knative/pkg
Pull request #1760 (2020-09-30 17:28:50)

Explicitly exclude cutting release for client repo in the release instruction

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

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

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

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

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["evankanderson"]} -->
ZhiminXiang: /assign @rhuss 

Patch:
diff --git a/.github/workflows/knative-style.yaml b/.github/workflows/knative-style.yaml
index 31a0aeb2e..be0bd9ddd 100644
--- a/.github/workflows/knative-style.yaml
+++ b/.github/workflows/knative-style.yaml
@@ -26,9 +26,20 @@ jobs:
   autoformat:
     name: Auto-format and Check
     runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false # Keep running if one leg fails.
+      matrix:
+        tool:
+          - goimports
+          - gofmt
+
+        include:
+        - tool: gofmt
+          options: -s
+        - tool: goimports
+          importpath: golang.org/x/tools/cmd/goimports
 
     steps:
-
       - name: Set up Go 1.15.x
         uses: actions/setup-go@v2
         with:
@@ -39,41 +50,30 @@ jobs:
         uses: actions/checkout@v2
 
       - name: Install Dependencies
+        if: ${{ matrix.importpath != '' }}
         run: |
           cd $(mktemp -d)
-          GO111MODULE=on go get golang.org/x/tools/cmd/goimports
+          GO111MODULE=on go get ${{ matrix.importpath }}
 
-      # Run this last because it alters the workspace.
-      # TODO: add prettier step
-      - name: Go Imports
-        shell: bash
-        run: |
-          goimports -w $(find -path './vendor' -prune -o -path './third_party' -prune -o -name '*.pb.go' -prune -o -type f -name '*.go' -print)
-          echo "::set-env name=FMT_TOOL::goimports"
-      - name: Verify goimport
+      - name: ${{ matrix.tool }} ${{ matrix.options }}
         shell: bash
         run: |
-          if [[ $(git diff-index --name-only HEAD --) ]]; then
-              echo "Found diffs in:"
-              git diff-index --name-only HEAD --
-              echo "${{ github.repository }} is out of style. Please run $FMT_TOOL."
-              exit 1
-          fi
-          echo "${{ github.repository }} is formatted correctly."
+          ${{ matrix.tool }} ${{ matrix.options }} -w $(find . -path './vendor' -prune -o -path './third_party' -prune -o -name '*.pb.go' -prune -o -type f -name '*.go' -print)
 
-      - name: Go Format
+      - name: Verify ${{ matrix.tool }}
         shell: bash
         run: |
-          gofmt -s -w $(find -path './vendor' -prune -o -path './third_party' -prune -o -name '*.pb.go' -prune -o -type f -name '*.go' -print)
-          echo "::set-env name=FMT_TOOL::gofmt"
-      - name: Verify gofmt
-        shell: bash
-        # TODO(mattmoor): combine with above via anchors when actions support it.
-        run: |
+          # From: https://backreference.org/2009/12/23/how-to-match-newlines-in-sed/
+          # This is to leverage this workaround:
+          # https://github.com/actions/toolkit/issues/193#issuecomment-605394935
+          function urlencode() {
+            sed ':begin;$!N;s/\n/%0A/;tbegin'
+          }
           if [[ $(git diff-index --name-only HEAD --) ]]; then
-              echo "Found diffs in:"
-              git diff-index --name-only HEAD --
-              echo "${{ github.repository }} is out of style. Please run $FMT_TOOL."
+              for x in $(git diff-index --name-only HEAD --); do
+                echo "::error file=$x::Please run ${{ matrix.tool }} ${{ matrix.options }}.%0A$(git diff $x | urlencode)"
+              done
+              echo "${{ github.repository }} is out of style. Please run ${{ matrix.tool }} ${{ matrix.options }}."
               exit 1
           fi
           echo "${{ github.repository }} is formatted correctly."
@@ -120,7 +120,6 @@ jobs:
         uses: golangci/golangci-lint-action@v2
         with:
           version: v1.30
-          only-new-issues: true # for initial defensiveness
 
       - name: misspell
         shell: bash
@@ -197,6 +196,40 @@ jobs:
 
           echo '::endgroup::'
 
+      - name: Redundant Format
+        shell: bash
+        if: ${{ always() }}
+        env:
+          REVIEWDOG_GITHUB_API_TOKEN: ${{ github.token }}
+        run: |
+          set -e
+          cd "${GITHUB_WORKSPACE}" || exit 1
+
+          echo '::group:: Flagging possibly unnecessary format calls for trailing argument with reviewdog 🐶 ...'
+          # Don't fail because of misspell
+          set +o pipefail
+          # For all look for formatting calls and extract the ones that
+          # have only a single formatting argument and that argument is in the last position.
+          # But exclude the `fmt.Errorf` calls since there's no `fmt.Error` and `errors.New` is not
+          # as versatile.
+          # Also ignore `%T` — to print the type and `%q` to quote the final string.
+          fn=$(find . -path './vendor' -prune -o -path './third_party' -prune -o -name '*.pb.go' -prune -o -type f -name '*.go' -print)
+          grep -nE '[^.]+\.(Fatalf|Errorf|Warnf|Infof|Debugf|Logf|Sprintf|Fprintf|Printf)[^\%]+%[^Tqx]",[^,]+' $fn | grep -v "fmt.Errorf" |
+            while read -r ent ; do
+              file=$(echo $ent | cut -d':' -f 1);
+              line=$(echo $ent | cut -d':' -f 2);
+              ch=$(echo $ent | cut -d':' -f3-);
+              err=$(echo $ch | sed -E 's/([^.]+\.)(Fatal|Error|Warn|Info|Debug|Log|Sprint|Print|Fprint)f([^\%]+)(%[^wq]",)([^,]+)/\1\2\3",\5/');
+              echo "$file:$line: Please consider avoiding tail format like this:%0A$err"
+          done |
+          reviewdog -efm="%f:%l: %m" \
+                -name="Redundant Format" \
+                -reporter="github-pr-check" \
+                -filter-mode="added" \
+                -fail-on-error="true" \
+                -level="error"
+          echo '::endgroup::'
+
       # This is mostly copied from https://github.com/get-woke/woke-action-reviewdog/blob/main/entrypoint.sh
       # since their action is not yet released under a stable version.
       - name: Language
diff --git a/.github/workflows/knative-verify.yaml b/.github/workflows/knative-verify.yaml
index c07f7462d..7b9664ad2 100644
--- a/.github/workflows/knative-verify.yaml
+++ b/.github/workflows/knative-verify.yaml
@@ -63,12 +63,23 @@ jobs:
     - name: Verify
       shell: bash
       run: |
+        # From: https://backreference.org/2009/12/23/how-to-match-newlines-in-sed/
+        # This is to leverage this workaround:
+        # https://github.com/actions/toolkit/issues/193#issuecomment-605394935
+        function urlencode() {
+          sed ':begin;$!N;s/\n/%0A/;tbegin'
+        }
+
         pushd ./src/knative.dev/${{ github.event.repository.name }}
         if [[ -z "$(git status --porcelain)" ]]; then
             echo "${{ github.repository }} up to date."
         else
-            repoDiff=$(git diff-index --name-only HEAD --)
-            echo "Found diffs in: $repoDiff"
+            # Print it both ways because sometimes we haven't modified the file (e.g. zz_generated),
+            # and sometimes we have (e.g. configmap checksum).
+            echo "Found diffs in: $(git diff-index --name-only HEAD --)"
+            for x in $(git diff-index --name-only HEAD --); do
+                echo "::error file=$x::Please run ./hack/update-codegen.sh.%0A$(git diff $x | urlencode)"
+            done
             echo "${{ github.repository }} is out of date. Please run hack/update-codegen.sh"
             exit 1
         fi
diff --git a/RELEASE-LEADS.md b/RELEASE-LEADS.md
index 605d2d063..b9479305a 100644
--- a/RELEASE-LEADS.md
+++ b/RELEASE-LEADS.md
@@ -47,7 +47,7 @@ This roster is seeded with all approvers from Eventing workgroups.
 | ------- | ------------ | -------------- | --------------- | ----------- | ---------- |
 | v0.17   | 2020-08-18   | yanweiguo      | Harwayne        | -           | 2020-08-11 |
 | v0.18   | 2020-09-29   | ZhiminXiang    | n3wscott        | 2020-08-19  | 2020-09-22 |
-| v0.19   | 2020-11-10   | julz           | nachocano       | 2020-09-30  | 2020-11-03 |
+| v0.19   | 2020-11-10   | julz           | n3wscott        | 2020-09-30  | 2020-11-03 |
 | v0.20   | 2020-12-22   | nak3           | slinkydeveloper | 2020-11-11  | 2020-12-15 |
 | v0.21   | 2021-02-02   | mattmoor       | lionelvillard   | 2020-12-23  | 2021-01-26 |
 | v0.22   | 2021-03-16   | markusthoemmes | evankanderson   | 2020-02-03  | 2021-03-09 |
@@ -260,11 +260,13 @@ to be pinned in all repositories that depend on them.
 
 For **serving** that is:
 
+- [knative/client](https://github.com/knative/client)
 - [knative-sandbox/net-kourier](https://github.com/knative-sandbox/net-kourier)
 - [knative/eventing-contrib](https://github.com/knative/eventing-contrib)
 
 For **eventing** that is:
 
+- [knative/client](https://github.com/knative/client)
 - [knative/eventing-contrib](https://github.com/knative/eventing-contrib)
 - [knative-sandbox/eventing-kafka-broker](https://github.com/knative-sandbox/eventing-kafka-broker)
 
@@ -275,7 +277,8 @@ branch of each repository respectively.
 ### Cut `release-x.y` branches of all remaining repositories
 
 After the pin PRs are merged, cut the `release-x.y` branch in each of the
-remaining repositories (except `operator`):
+remaining repositories (except `operator` and `client` as they are cut
+separately by the respective working group):
 
 - [knative-sandbox/net-kourier](https://github.com/knative-sandbox/net-kourier)
 - [knative/eventing-contrib](https://github.com/knative/eventing-contrib)
diff --git a/apiextensions/storageversion/cmd/migrate/main.go b/apiextensions/storageversion/cmd/migrate/main.go
index fd44df6f0..acbe5a43f 100644
--- a/apiextensions/storageversion/cmd/migrate/main.go
+++ b/apiextensions/storageversion/cmd/migrate/main.go
@@ -76,7 +76,7 @@ func setupLogger() *zap.SugaredLogger {
 
 	config, err := logging.NewConfigFromMap(nil)
 	if err != nil {
-		log.Fatalf("Failed to create logging config: %s", err)
+		log.Fatal("Failed to create logging config: ", err)
 	}
 
 	logger, _ := logging.NewLoggerFromConfig(config, component)
diff --git a/apis/contexts.go b/apis/contexts.go
index 4e8b60d6a..a8c7683a4 100644
--- a/apis/contexts.go
+++ b/apis/contexts.go
@@ -134,6 +134,12 @@ func WithinParent(ctx context.Context, om metav1.ObjectMeta) context.Context {
 	return context.WithValue(ctx, parentMetaKey{}, om)
 }
 
+// IsWithinParent returns true if we're within parent context.
+func IsWithinParent(ctx context.Context) bool {
+	_, ok := ctx.Value(parentMetaKey{}).(metav1.ObjectMeta)
+	return ok
+}
+
 // ParentMeta accesses the ObjectMeta of the enclosing parent resource
 // from the context.  See WithinParent for how to attach the parent's
 // ObjectMeta to the context.
diff --git a/apis/field_error.go b/apis/field_error.go
index 3997b5944..e807ec781 100644
--- a/apis/field_error.go
+++ b/apis/field_error.go
@@ -327,7 +327,7 @@ func ErrInvalidArrayValue(value interface{}, field string, index int) *FieldErro
 // invalid value.
 func ErrInvalidValue(value interface{}, fieldPath string) *FieldError {
 	return &FieldError{
-		Message: fmt.Sprintf("invalid value: %v", value),
+		Message: fmt.Sprint("invalid value: ", value),
 		Paths:   []string{fieldPath},
 	}
 }
diff --git a/codegen/cmd/injection-gen/generators/packages.go b/codegen/cmd/injection-gen/generators/packages.go
index 9345cdea0..d1fa91e09 100644
--- a/codegen/cmd/injection-gen/generators/packages.go
+++ b/codegen/cmd/injection-gen/generators/packages.go
@@ -36,7 +36,7 @@ import (
 func Packages(context *generator.Context, arguments *args.GeneratorArgs) generator.Packages {
 	boilerplate, err := arguments.LoadGoBoilerplate()
 	if err != nil {
-		klog.Fatalf("Failed loading boilerplate: %v", err)
+		klog.Fatal("Failed loading boilerplate: ", err)
 	}
 
 	customArgs, ok := arguments.CustomArgs.(*informergenargs.CustomArgs)
diff --git a/codegen/cmd/injection-gen/main.go b/codegen/cmd/injection-gen/main.go
index 26410cc99..30f20a0dd 100644
--- a/codegen/cmd/injection-gen/main.go
+++ b/codegen/cmd/injection-gen/main.go
@@ -44,7 +44,7 @@ func main() {
 	pflag.Parse()
 
 	if err := generatorargs.Validate(genericArgs); err != nil {
-		klog.Fatalf("Error: %v", err)
+		klog.Fatal("Error: ", err)
 	}
 
 	// Run it.
@@ -53,7 +53,7 @@ func main() {
 		generators.DefaultNameSystem(),
 		generators.Packages,
 	); err != nil {
-		klog.Fatalf("Error: %v", err)
+		klog.Fatal("Error: ", err)
 	}
 	klog.V(2).Info("Completed successfully.")
 }
diff --git a/go.mod b/go.mod
index bbe5ff44e..1812627e1 100644
--- a/go.mod
+++ b/go.mod
@@ -55,7 +55,7 @@ require (
 	k8s.io/code-generator v0.18.8
 	k8s.io/gengo v0.0.0-20200205140755-e0e292d8aa12
 	k8s.io/klog v1.0.0
-	knative.dev/test-infra v0.0.0-20200928212629-45266e61aa32
+	knative.dev/test-infra v0.0.0-20201002164834-8c07ff018549
 	sigs.k8s.io/boskos v0.0.0-20200729174948-794df80db9c9
 )
 
diff --git a/go.sum b/go.sum
index 1de2d051c..725953d8d 100644
--- a/go.sum
+++ b/go.sum
@@ -1846,8 +1846,8 @@ knative.dev/test-infra v0.0.0-20200505052144-5ea2f705bb55/go.mod h1:WqF1Azka+FxP
 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-20200928212629-45266e61aa32 h1:0OGLqAQJbh82fJfPZu1oCsNO3mS2t/iHeVxkwVkYGO4=
-knative.dev/test-infra v0.0.0-20200928212629-45266e61aa32/go.mod h1:Pmg2c7Z7q7BGFUV/GOpU5BlrD3ePJft4MPqx8AYBplc=
+knative.dev/test-infra v0.0.0-20201002164834-8c07ff018549 h1:8UObRJ0lnWvU9FuD8ubmkwJo14+aZtboq1ncBWbs2uI=
+knative.dev/test-infra v0.0.0-20201002164834-8c07ff018549/go.mod h1:Pmg2c7Z7q7BGFUV/GOpU5BlrD3ePJft4MPqx8AYBplc=
 mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
 mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
 mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw=
diff --git a/injection/sharedmain/main.go b/injection/sharedmain/main.go
index e5ea14698..33d45391e 100644
--- a/injection/sharedmain/main.go
+++ b/injection/sharedmain/main.go
@@ -225,7 +225,16 @@ func MainWithConfig(ctx context.Context, component string, cfg *rest.Config, cto
 		cfg.Burst = len(ctors) * rest.DefaultBurst
 	}
 
-	ctx = EnableInjectionOrDie(ctx, cfg)
+	// Respect user provided settings, but if omitted customize the default behavior.
+	if cfg.QPS == 0 {
+		cfg.QPS = rest.DefaultQPS
+	}
+	if cfg.Burst == 0 {
+		cfg.Burst = rest.DefaultBurst
+	}
+	ctx = injection.WithConfig(ctx, cfg)
+
+	ctx, informers := injection.Default.SetupInformers(ctx, cfg)
 
 	logger, atomicLevel := SetupLoggerOrDie(ctx, component)
 	defer flush(logger)
@@ -278,7 +287,11 @@ func MainWithConfig(ctx context.Context, component string, cfg *rest.Config, cto
 			return wh.Run(ctx.Done())
 		})
 	}
-
+	// Start the injection clients and informers.
+	logging.FromContext(ctx).Info("Starting informers...")
+	if err := controller.StartInformers(ctx.Done(), informers...); err != nil {
+		logging.FromContext(ctx).Fatalw("Failed to start informers", zap.Error(err))
+	}
 	// Wait for webhook informers to sync.
 	if wh != nil {
 		wh.InformersHaveSynced()
@@ -316,7 +329,7 @@ func ParseAndGetConfigOrDie() *rest.Config {
 
 	cfg, err := GetConfig(*serverURL, *kubeconfig)
 	if err != nil {
-		log.Fatalf("Error building kubeconfig: %v", err)
+		log.Fatal("Error building kubeconfig: ", err)
 	}
 
 	return cfg
@@ -329,7 +342,7 @@ func MemStatsOrDie(ctx context.Context) {
 	msp.Start(ctx, 30*time.Second)
 
 	if err := view.Register(msp.DefaultViews()...); err != nil {
-		log.Fatalf("Error exporting go memstats view: %v", err)
+		log.Fatal("Error exporting go memstats view: ", err)
 	}
 }
 
@@ -338,7 +351,7 @@ func MemStatsOrDie(ctx context.Context) {
 func SetupLoggerOrDie(ctx context.Context, component string) (*zap.SugaredLogger, zap.AtomicLevel) {
 	loggingConfig, err := GetLoggingConfig(ctx)
 	if err != nil {
-		log.Fatalf("Error reading/parsing logging configuration: %v", err)
+		log.Fatal("Error reading/parsing logging configuration: ", err)
 	}
 	l, level := logging.NewLoggerFromConfig(loggingConfig, component)
 
diff --git a/leaderelection/chaosduck/main.go b/leaderelection/chaosduck/main.go
index fb3e5eb9b..d4950b911 100644
--- a/leaderelection/chaosduck/main.go
+++ b/leaderelection/chaosduck/main.go
@@ -126,7 +126,7 @@ func main() {
 	wait.JitterUntilWithContext(ctx, func(ctx context.Context) {
 		components, err := buildComponents(ctx, kc)
 		if err != nil {
-			log.Printf("Error building components: %v", err)
+			log.Print("Error building components: ", err)
 		}
 		log.Printf("Got components: %#v", components)
 
@@ -141,7 +141,7 @@ func main() {
 			})
 		}
 		if err := eg.Wait(); err != nil {
-			log.Printf("Ended iteration with err: %v", err)
+			log.Print("Ended iteration with err: ", err)
 		}
 	}, tributePeriod, tributeFactor, true /* sliding: do not include the runtime of the above in the interval */)
 }
diff --git a/metrics/prometheus_exporter.go b/metrics/prometheus_exporter.go
index d60fe8f07..7f49302cc 100644
--- a/metrics/prometheus_exporter.go
+++ b/metrics/prometheus_exporter.go
@@ -82,7 +82,7 @@ func startNewPromSrv(e *prom.Exporter, port int) *http.Server {
 		curPromSrv.Close()
 	}
 	curPromSrv = &http.Server{
-		Addr:    fmt.Sprintf(":%v", port),
+		Addr:    fmt.Sprint(":", port),
 		Handler: sm,
 	}
 	return curPromSrv
diff --git a/metrics/resource_view.go b/metrics/resource_view.go
index 1e89787f6..57e54a6f0 100644
--- a/metrics/resource_view.go
+++ b/metrics/resource_view.go
@@ -29,6 +29,7 @@ import (
 	"go.opencensus.io/stats"
 	"go.opencensus.io/stats/view"
 	"go.opencensus.io/tag"
+	"k8s.io/apimachinery/pkg/util/clock"
 )
 
 type storedViews struct {
@@ -40,6 +41,7 @@ type meterExporter struct {
 	m view.Meter    // NOTE: DO NOT RETURN THIS DIRECTLY; the view.Meter will not work for the empty Resource
 	o stats.Options // Cache the option to reduce allocations
 	e view.Exporter
+	t time.Time // Time when last access occurred
 }
 
 // ResourceExporterFactory provides a hook for producing separate view.Exporters
@@ -48,17 +50,70 @@ type meterExporter struct {
 // Tags are.
 type ResourceExporterFactory func(*resource.Resource) (view.Exporter, error)
 type meters struct {
-	meters  map[string]*meterExporter
-	factory ResourceExporterFactory
-	lock    sync.Mutex
+	meters         map[string]*meterExporter
+	factory        ResourceExporterFactory
+	lock           sync.Mutex
+	clock          clock.Clock
+	ticker         clock.Ticker
+	tickerStopChan chan struct{}
 }
 
 // Lock regime: lock allMeters before resourceViews. The critical path is in
 // optionForResource, which must lock allMeters, but only needs to lock
 // resourceViews if a new meter needs to be created.
-var resourceViews = storedViews{}
-var allMeters = meters{
-	meters: map[string]*meterExporter{"": &defaultMeter},
+var (
+	resourceViews = storedViews{}
+	allMeters     = meters{
+		meters: map[string]*meterExporter{"": &defaultMeter},
+		clock:  clock.Clock(clock.RealClock{}),
+	}
+
+	cleanupOnce                = new(sync.Once)
+	meterExporterScanFrequency = 1 * time.Minute
+	maxMeterExporterAge        = 10 * time.Minute
+)
+
+// cleanup looks through allMeter's meterExporter and prunes any that were last visited
+// more than maxMeterExporterAge ago. This will clean up any exporters for resources
+// that no longer exist on the system (a replaced revision, e.g.).  All meterExporter
+// lookups (and creations) run meterExporterForResource, which updates the timestamp
+// on each access.
+func cleanup() {
+	expiryCutoff := allMeters.clock.Now().Add(-1 * maxMeterExporterAge)
+	allMeters.lock.Lock()
+	defer allMeters.lock.Unlock()
+	for key, meter := range allMeters.meters {
+		if key != "" && meter.t.Before(expiryCutoff) {
+			flushGivenExporter(meter.e)
+			delete(allMeters.meters, key)
+		}
+	}
+}
+
+// startCleanup is configured to only run once in production.  For testing,
+// calling startCleanup again will terminate old cleanup threads,
+// and restart anew.
+func startCleanup() {
+	if allMeters.tickerStopChan != nil {
+		close(allMeters.tickerStopChan)
+	}
+
+	curClock := allMeters.clock
+	newTicker := curClock.NewTicker(meterExporterScanFrequency)
+	newStopChan := make(chan struct{})
+	allMeters.tickerStopChan = newStopChan
+	allMeters.ticker = newTicker
+	go func() {
+		defer newTicker.Stop()
+		for {
+			select {
+			case <-newTicker.C():
+				cleanup()
+			case <-newStopChan:
+				return
+			}
+		}
+	}()
 }
 
 // RegisterResourceView is similar to view.Register(), except that it will
@@ -174,7 +229,9 @@ func flushResourceExporters() {
 }
 
 // ClearMetersForTest clears the internal set of metrics being exported,
-// including cleaning up background threads.
+// including cleaning up background threads, and restarts cleanup thread.
+//
+// If a replacement clock is desired, it should be in allMeters.clock before calling.
 func ClearMetersForTest() {
 	allMeters.lock.Lock()
 	defer allMeters.lock.Unlock()
@@ -186,6 +243,7 @@ func ClearMetersForTest() {
 		meter.m.Stop()
 		delete(allMeters.meters, k)
 	}
+	startCleanup()
 }
 
 func meterExporterForResource(r *resource.Resource) *meterExporter {
@@ -195,6 +253,7 @@ func meterExporterForResource(r *resource.Resource) *meterExporter {
 		mE = &meterExporter{}
 		allMeters.meters[key] = mE
 	}
+	mE.t = allMeters.clock.Now()
 	if mE.o != nil {
 		return mE
 	}
@@ -219,6 +278,9 @@ func meterExporterForResource(r *resource.Resource) *meterExporter {
 // optionForResource finds or creates a stats exporter for the resource, and
 // returns a stats.Option indicating which meter to record to.
 func optionForResource(r *resource.Resource) (stats.Options, error) {
+	// Start the allMeters cleanup thread, if not already started
+	cleanupOnce.Do(startCleanup)
+
 	allMeters.lock.Lock()
 	defer allMeters.lock.Unlock()
 
@@ -313,6 +375,7 @@ var _ view.Meter = (*defaultMeterImpl)(nil)
 var defaultMeter = meterExporter{
 	m: &defaultMeterImpl{},
 	o: stats.WithRecorder(nil),
+	t: time.Now(), // time.Now() here is ok - defaultMeter never expires, so this won't be checked
 }
 
 func (*defaultMeterImpl) Record(*tag.Map, interface{}, map[string]interface{}) {
diff --git a/profiling/server.go b/profiling/server.go
index 0dc1eebc0..9ac2c5f05 100644
--- a/profiling/server.go
+++ b/profiling/server.go
@@ -94,7 +94,7 @@ func (h *Handler) UpdateFromConfigMap(configMap *corev1.ConfigMap) {
 	}
 
 	if h.enabled.Swap(enabled) != enabled {
-		h.log.Infof("Profiling enabled: %t", enabled)
+		h.log.Info("Profiling enabled: ", enabled)
 	}
 }
 
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 1f54f4fd2..01e6688fc 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -972,7 +972,7 @@ k8s.io/utils/buffer
 k8s.io/utils/integer
 k8s.io/utils/pointer
 k8s.io/utils/trace
-# knative.dev/test-infra v0.0.0-20200928212629-45266e61aa32
+# knative.dev/test-infra v0.0.0-20201002164834-8c07ff018549
 ## explicit
 knative.dev/test-infra/scripts
 # sigs.k8s.io/boskos v0.0.0-20200729174948-794df80db9c9
diff --git a/webhook/resourcesemantics/conversion/internal/types.go b/webhook/resourcesemantics/conversion/internal/types.go
index 52f67006a..7f650c885 100644
--- a/webhook/resourcesemantics/conversion/internal/types.go
+++ b/webhook/resourcesemantics/conversion/internal/types.go
@@ -143,7 +143,7 @@ func NewV2(prop string) *V2Resource {
 			APIVersion: Group + "/v2",
 		},
 		Spec: Spec{
-			Property: fmt.Sprintf("prefix/%s", prop),
+			Property: "prefix/" + prop,
 		},
 	}
 }
@@ -157,7 +157,7 @@ func NewV3(prop string) *V3Resource {
 			APIVersion: Group + "/v3",
 		},
 		Spec: SpecWithDefault{
-			Property: fmt.Sprintf("%s/suffix", prop),
+			Property: prop + "/suffix",
 		},
 	}
 	v3.SetDefaults(context.Background())
diff --git a/webhook/webhook.go b/webhook/webhook.go
index aff5cf8b4..55726c5f5 100644
--- a/webhook/webhook.go
+++ b/webhook/webhook.go
@@ -181,7 +181,7 @@ func (wh *Webhook) Run(stop <-chan struct{}) error {
 
 	server := &http.Server{
 		Handler: drainer,
-		Addr:    fmt.Sprintf(":%d", wh.Options.Port),
+		Addr:    fmt.Sprint(":", wh.Options.Port),
 		TLSConfig: &tls.Config{
 			MinVersion: tls.VersionTLS12,
 			GetCertificate: func(*tls.ClientHelloInfo) (*tls.Certificate, error) {


Test patch:
diff --git a/apis/contexts_test.go b/apis/contexts_test.go
index 7d3e2856a..e55fddbbb 100644
--- a/apis/contexts_test.go
+++ b/apis/contexts_test.go
@@ -153,6 +153,16 @@ func TestContexts(t *testing.T) {
 		ctx:   WithDryRun(ctx),
 		check: IsDryRun,
 		want:  true,
+	}, {
+		name:  "within parent",
+		ctx:   WithDryRun(ctx),
+		check: IsWithinParent,
+		want:  false,
+	}, {
+		name:  "in dry run",
+		ctx:   WithinParent(ctx, metav1.ObjectMeta{Name: "jack"}),
+		check: IsWithinParent,
+		want:  true,
 	}}
 
 	for _, tc := range tests {
diff --git a/apis/field_error_test.go b/apis/field_error_test.go
index 7adc9202b..2f1a78a38 100644
--- a/apis/field_error_test.go
+++ b/apis/field_error_test.go
@@ -17,7 +17,6 @@ limitations under the License.
 package apis
 
 import (
-	"fmt"
 	"strconv"
 	"strings"
 	"testing"
@@ -241,7 +240,7 @@ Second: X, Y, Z`,
 
 			for _, p := range []string{"3", "2", "1"} {
 				e := fe.ViaField(p)
-				e.Details = fmt.Sprintf("here at %s", p)
+				e.Details = "here at " + p
 				for i := 0; i < 3; i++ {
 					fe = fe.Also(e)
 				}
diff --git a/metrics/resource_view_test.go b/metrics/resource_view_test.go
index 3c5a8e241..e527672b8 100644
--- a/metrics/resource_view_test.go
+++ b/metrics/resource_view_test.go
@@ -37,6 +37,7 @@ import (
 	"go.opencensus.io/stats"
 	"go.opencensus.io/stats/view"
 	"go.opencensus.io/tag"
+	"k8s.io/apimachinery/pkg/util/clock"
 
 	emptypb "github.com/golang/protobuf/ptypes/empty"
 	"github.com/google/go-cmp/cmp"
@@ -144,6 +145,70 @@ func TestSetFactory(t *testing.T) {
 	}
 }
 
+func TestAllMetersExpiration(t *testing.T) {
+	allMeters.clock = clock.Clock(clock.NewFakeClock(time.Now()))
+	var fakeClock *clock.FakeClock = allMeters.clock.(*clock.FakeClock)
+	ClearMetersForTest() // t+0m
+
+	// Add resource123
+	resource123 := r
+	resource123.Labels["id"] = "123"
+	_, err := optionForResource(&resource123)
+	if err != nil {
+		t.Error("Should succeed getting option, instead got error ", err)
+	}
+	// (123=0m, 456=Inf)
+
+	// Bump time to make resource123's expiry offset from resource456
+	fakeClock.Step(90 * time.Second) // t+1.5m
+	// (123=0m, 456=Inf)
+
+	// Add 456
+	resource456 := r
+	resource456.Labels["id"] = "456"
+	_, err = optionForResource(&resource456)
+	if err != nil {
+		t.Error("Should succeed getting option, instead got error ", err)
+	}
+	allMeters.lock.Lock()
+	if len(allMeters.meters) != 3 {
+		t.Errorf("len(allMeters)=%d, want: 3", len(allMeters.meters))
+	}
+	allMeters.lock.Unlock()
+	// (123=1.5m, 456=0m)
+
+	// Warm up the older entry
+	fakeClock.Step(90 * time.Second) //t+3m
+	// (123=4.5m, 456=3m)
+
+	// Refresh the first entry
+	_, err = optionForResource(&resource123)
+	if err != nil {
+		t.Error("Should succeed getting option, instead got error ", err)
+	}
+	// (123=0, 456=1.5m)
+
+	// Expire the second entry
+	fakeClock.Step(9 * time.Minute) // t+12m
+	time.Sleep(1 * time.Second)     // Wait a second on the wallclock, so that the cleanup thread has time to finish a loop
+	allMeters.lock.Lock()
+	if len(allMeters.meters) != 2 {
+		t.Errorf("len(allMeters)=%d, want: 2", len(allMeters.meters))
+	}
+	allMeters.lock.Unlock()
+	// (123=9m, 456=10.5m)
+	// non-expiring defaultMeter was just tested
+
+	// Add resource789
+	resource789 := r
+	resource789.Labels["id"] = "789"
+	_, err = optionForResource(&resource789)
+	if err != nil {
+		t.Error("Should succeed getting option, instead got error ", err)
+	}
+	// (123=9m, 456=evicted, 789=0m)
+}
+
 func TestResourceAsString(t *testing.T) {
 	r1 := &resource.Resource{Type: "foobar", Labels: map[string]string{"k1": "v1", "k3": "v3", "k2": "v2"}}
 	r2 := &resource.Resource{Type: "foobar", Labels: map[string]string{"k2": "v2", "k3": "v3", "k1": "v1"}}
diff --git a/test/helpers/dryrun.go b/test/helpers/dryrun.go
index 68f799444..c19881556 100644
--- a/test/helpers/dryrun.go
+++ b/test/helpers/dryrun.go
@@ -23,7 +23,7 @@ import (
 // Run can run functions that needs dryrun support.
 func Run(message string, call func() error, dryrun bool) error {
 	if dryrun {
-		log.Printf("[dry run] %s", message)
+		log.Print("[dry run] ", message)
 		return nil
 	}
 	log.Print(message)
diff --git a/test/helpers/name.go b/test/helpers/name.go
index 7bf14a3bf..9cb0d529f 100644
--- a/test/helpers/name.go
+++ b/test/helpers/name.go
@@ -30,6 +30,7 @@ const (
 	letterBytes    = "abcdefghijklmnopqrstuvwxyz"
 	randSuffixLen  = 8
 	sep            = '-'
+	sepS           = "-"
 	testNamePrefix = "Test"
 )
 
@@ -57,30 +58,53 @@ func ObjectNameForTest(t test.T) string {
 // This method will use "-" as the separator between the prefix and
 // the random suffix.
 func AppendRandomString(prefix string) string {
-	return strings.Join([]string{prefix, RandomString()}, string(sep))
+	return prefix + sepS + RandomString()
 }
 
 // RandomString will generate a random string.
 func RandomString() string {
 	suffix := make([]byte, randSuffixLen)
-
 	for i := range suffix {
 		suffix[i] = letterBytes[rand.Intn(len(letterBytes))]
 	}
 	return string(suffix)
 }
 
+// For the same prefix more specific should come first.
+// Note: we expect GRPC.
+var knownNames = []string{"HTTPS", "HTTP2", "HTTP", "GRPC", "TLS", "WS", "H2C"}
+
 // MakeK8sNamePrefix converts each chunk of non-alphanumeric character into a single dash
 // and also convert camelcase tokens into dash-delimited lowercase tokens.
+// The function will try to catch some well known abbreviations, so that we don't separate them.
 func MakeK8sNamePrefix(s string) string {
 	var sb strings.Builder
+	sb.Grow(len(s)) // At least as many chars will be in the output.
 	newToken := false
-	for _, c := range s {
+outer:
+	for i := 0; i < len(s); i++ {
+		c := rune(s[i])
 		if !(unicode.IsLetter(c) || unicode.IsNumber(c)) {
 			newToken = true
 			continue
 		}
-		if sb.Len() > 0 && (newToken || unicode.IsUpper(c)) {
+		isUpper := unicode.IsUpper(c)
+		// We could've done it only for uppercase letters,
+		if isUpper {
+			for _, n := range knownNames {
+				if strings.HasPrefix(s[i:], n) {
+					sub := s[i : i+len(n)]
+					if sb.Len() > 0 {
+						sb.WriteRune(sep)
+					}
+					sb.WriteString(strings.ToLower(sub))
+					i += len(n) - 1
+					continue outer
+				}
+			}
+		}
+		// Just a random uppercase word.
+		if sb.Len() > 0 && (newToken || isUpper) {
 			sb.WriteRune(sep)
 		}
 		sb.WriteRune(unicode.ToLower(c))
diff --git a/test/helpers/name_test.go b/test/helpers/name_test.go
index 8a161923e..7de2ccf82 100644
--- a/test/helpers/name_test.go
+++ b/test/helpers/name_test.go
@@ -41,12 +41,19 @@ func TestMakeK8sNamePrefix(t *testing.T) {
 		{"AbCdef", "ab-cdef"},
 		{"ABCD", "a-b-c-d"},
 		{"aBc*ef&d", "a-bc-ef-d"},
+		{"*aBc*ef&d", "a-bc-ef-d"},
+		{"AutoTLS", "auto-tls"},
+		{"GRPCLoadBalancing", "grpc-load-balancing"},
+		{"HTTPSTermination", "https-termination"},
+		{"HTTPIsNotHTTP2", "http-is-not-http2"},
 	}
-	for _, v := range testCases {
-		actual := MakeK8sNamePrefix(v.input)
-		if v.expected != actual {
-			t.Fatalf("Expect %q but actual is %q", v.expected, actual)
-		}
+	for _, tc := range testCases {
+		t.Run(tc.input, func(t *testing.T) {
+			actual := MakeK8sNamePrefix(tc.input)
+			if tc.expected != actual {
+				t.Errorf("MakeK8sNamePrefix = %q, want: %q", actual, tc.expected)
+			}
+		})
 	}
 }
 
diff --git a/test/interactive/docker.go b/test/interactive/docker.go
index 08bbbc9c9..679ae3ada 100644
--- a/test/interactive/docker.go
+++ b/test/interactive/docker.go
@@ -102,7 +102,7 @@ func (d *Docker) AddRWOverlay(externalDirectory, internalDirectory string) func(
 	// Print command to run so user knows why it is asking for sudo password (if it does)
 	log.Println(mount)
 	if err = mount.Run(); err != nil {
-		log.Fatalf("Unable to create overlay mount, so giving up: %v", err)
+		log.Fatal("Unable to create overlay mount, so giving up: ", err)
 	}
 	d.AddMount("bind", overlayDir, internalDirectory)
 	return func() {
diff --git a/test/kube_checks.go b/test/kube_checks.go
index a406f211a..cf804a9b1 100644
--- a/test/kube_checks.go
+++ b/test/kube_checks.go
@@ -65,7 +65,7 @@ func WaitForDeploymentState(ctx context.Context, client *KubeClient, name string
 // that is emitted to track how long it took to get into the state checked by inState.
 func WaitForPodListState(ctx context.Context, client *KubeClient, inState func(p *corev1.PodList) (bool, error), desc string, namespace string) error {
 	p := client.Kube.CoreV1().Pods(namespace)
-	span := logging.GetEmitableSpan(ctx, fmt.Sprintf("WaitForPodListState/%s", desc))
+	span := logging.GetEmitableSpan(ctx, "WaitForPodListState/"+desc)
 	defer span.End()
 
 	return wait.PollImmediate(interval, podTimeout, func() (bool, error) {
diff --git a/test/mako/config/benchmark.go b/test/mako/config/benchmark.go
index 4a1f2e0bc..41d046865 100644
--- a/test/mako/config/benchmark.go
+++ b/test/mako/config/benchmark.go
@@ -34,7 +34,7 @@ const configMako = "/etc/config-mako"
 func MustGetBenchmark() *mpb.BenchmarkInfo {
 	bench, err := getBenchmark()
 	if err != nil {
-		log.Fatalf("unable to determine benchmark info: %v", err)
+		log.Fatal("unable to determine benchmark info: ", err)
 	}
 	return bench
 }
diff --git a/test/mako/config/environment.go b/test/mako/config/environment.go
index 62e72c243..464d6030a 100644
--- a/test/mako/config/environment.go
+++ b/test/mako/config/environment.go
@@ -51,7 +51,7 @@ func GetRepository() string {
 func MustGetTags() []string {
 	cfg, err := loadConfig()
 	if err != nil {
-		log.Fatalf("unable to load config from the configmap: %v", err)
+		log.Fatal("unable to load config from the configmap: ", err)
 	}
 	return cfg.AdditionalTags
 }
diff --git a/test/mako/sidecar.go b/test/mako/sidecar.go
index 92377143a..cf801977d 100644
--- a/test/mako/sidecar.go
+++ b/test/mako/sidecar.go
@@ -123,17 +123,17 @@ func SetupHelper(ctx context.Context, benchmarkKey *string, benchmarkName *strin
 
 	// Decorate GCP metadata as tags (when we're running on GCP).
 	if projectID, err := metadata.ProjectID(); err != nil {
-		log.Printf("GCP project ID is not available: %v", err)
+		log.Print("GCP project ID is not available: ", err)
 	} else {
 		tags = append(tags, "project-id="+EscapeTag(projectID))
 	}
 	if zone, err := metadata.Zone(); err != nil {
-		log.Printf("GCP zone is not available: %v", err)
+		log.Print("GCP zone is not available: ", err)
 	} else {
 		tags = append(tags, "zone="+EscapeTag(zone))
 	}
 	if machineType, err := metadata.Get("instance/machine-type"); err != nil {
-		log.Printf("GCP machine type is not available: %v", err)
+		log.Print("GCP machine type is not available: ", err)
 	} else if parts := strings.Split(machineType, "/"); len(parts) != 4 {
 		tags = append(tags, "instanceType="+EscapeTag(parts[3]))
 	}
diff --git a/testutils/clustermanager/e2e-tests/example_test.go b/testutils/clustermanager/e2e-tests/example_test.go
index 22c7daca9..1002fb493 100644
--- a/testutils/clustermanager/e2e-tests/example_test.go
+++ b/testutils/clustermanager/e2e-tests/example_test.go
@@ -53,5 +53,5 @@ func Example() {
 		log.Fatalf("failed acquire cluster: '%v'", err)
 	}
 	log.Printf("GKE project is: %q", gkeOps.Project)
-	log.Printf("GKE cluster is: %v", gkeOps.Cluster)
+	log.Print("GKE cluster is: ", gkeOps.Cluster)
 }
diff --git a/testutils/clustermanager/e2e-tests/util.go b/testutils/clustermanager/e2e-tests/util.go
index 8d9eefa89..e816f3f60 100644
--- a/testutils/clustermanager/e2e-tests/util.go
+++ b/testutils/clustermanager/e2e-tests/util.go
@@ -69,7 +69,7 @@ func resolveGKEVersion(raw, location string) (string, error) {
 		if err != nil && version != "" {
 			return "", fmt.Errorf("failed getting the default version: %w", err)
 		}
-		log.Printf("Using default version, %s", version)
+		log.Print("Using default version, ", version)
 		return version, nil
 	case latestGKEVersion:
 		validCmd := "gcloud container get-server-config --format='value(validMasterVersions)' --zone=" + location
@@ -78,10 +78,10 @@ func resolveGKEVersion(raw, location string) (string, error) {
 			return "", fmt.Errorf("failed getting the list of valid versions: %w", err)
 		}
 		versions := strings.Split(versionsStr, ";")
-		log.Printf("Using the latest version, %s", strings.TrimSpace(versions[0]))
+		log.Print("Using the latest version, ", strings.TrimSpace(versions[0]))
 		return strings.TrimSpace(versions[0]), nil
 	default:
-		log.Printf("Using the custom version, %s", raw)
+		log.Print("Using the custom version, ", raw)
 		return raw, nil
 	}
 }
diff --git a/testutils/clustermanager/perf-tests/main.go b/testutils/clustermanager/perf-tests/main.go
index f8084c078..795d9f670 100644
--- a/testutils/clustermanager/perf-tests/main.go
+++ b/testutils/clustermanager/perf-tests/main.go
@@ -50,7 +50,7 @@ func main() {
 
 	client, err := testPkg.NewClient(gkeEnvironment)
 	if err != nil {
-		log.Fatalf("Failed setting up GKE client, cannot proceed: %v", err)
+		log.Fatal("Failed setting up GKE client, cannot proceed: ", err)
 	}
 	switch {
 	case isRecreate:
diff --git a/testutils/metahelper/main.go b/testutils/metahelper/main.go
index 2b7838f8f..71586a44c 100644
--- a/testutils/metahelper/main.go
+++ b/testutils/metahelper/main.go
@@ -57,7 +57,7 @@ func main() {
 		if valOpt == "" {
 			log.Fatal("--val must be supplied when using --save")
 		}
-		log.Printf("Writing files to %s", c.Path)
+		log.Print("Writing files to ", c.Path)
 		if err := c.Set(saveKeyOpt, valOpt); err != nil {
 			log.Fatalf("Failed saving %q:%q to %q: '%v'", saveKeyOpt, valOpt, c.Path, err)
 		}
diff --git a/vendor/knative.dev/test-infra/scripts/library.sh b/vendor/knative.dev/test-infra/scripts/library.sh
index ab9f303fe..6f4836b66 100644
--- a/vendor/knative.dev/test-infra/scripts/library.sh
+++ b/vendor/knative.dev/test-infra/scripts/library.sh
@@ -551,45 +551,6 @@ function check_licenses() {
     { echo "--- FAIL: go-licenses failed the license check"; return 1; }
 }
 
-# Run the given linter on the given files, checking it exists first.
-# Parameters: $1 - tool
-#             $2 - tool purpose (for error message if tool not installed)
-#             $3 - tool parameters (quote if multiple parameters used)
-#             $4..$n - files to run linter on
-function run_lint_tool() {
-  local checker=$1
-  local params=$3
-  if ! hash ${checker} 2>/dev/null; then
-    warning "${checker} not installed, not $2"
-    return 127
-  fi
-  shift 3
-  local failed=0
-  for file in $@; do
-    ${checker} ${params} ${file} || failed=1
-  done
-  return ${failed}
-}
-
-# Check links in the given markdown files.
-# Parameters: $1...$n - files to inspect
-function check_links_in_markdown() {
-  # https://github.com/raviqqe/liche
-  local config="${REPO_ROOT_DIR}/test/markdown-link-check-config.rc"
-  [[ ! -e ${config} ]] && config="${_TEST_INFRA_SCRIPTS_DIR}/markdown-link-check-config.rc"
-  local options="$(grep '^-' ${config} | tr \"\n\" ' ')"
-  run_lint_tool liche "checking links in markdown files" "-d ${REPO_ROOT_DIR} ${options}" $@
-}
-
-# Check format of the given markdown files.
-# Parameters: $1..$n - files to inspect
-function lint_markdown() {
-  # https://github.com/markdownlint/markdownlint
-  local config="${REPO_ROOT_DIR}/test/markdown-lint-config.rc"
-  [[ ! -e ${config} ]] && config="${_TEST_INFRA_SCRIPTS_DIR}/markdown-lint-config.rc"
-  run_lint_tool mdl "linting markdown files" "-c ${config}" $@
-}
-
 # Return whether the given parameter is an integer.
 # Parameters: $1 - integer to check
 function is_int() {
diff --git a/vendor/knative.dev/test-infra/scripts/markdown-link-check-config.rc b/vendor/knative.dev/test-infra/scripts/markdown-link-check-config.rc
deleted file mode 100644
index 49b042e82..000000000
--- a/vendor/knative.dev/test-infra/scripts/markdown-link-check-config.rc
+++ /dev/null
@@ -1,5 +0,0 @@
-# For help, see
-# https://github.com/raviqqe/liche/blob/master/README.md
-
-# Don't check localhost links and don't check templated links
--x "(^https?://localhost($|[:/].*))|(^https://.*{{.*$)"
diff --git a/vendor/knative.dev/test-infra/scripts/markdown-lint-config.rc b/vendor/knative.dev/test-infra/scripts/markdown-lint-config.rc
deleted file mode 100644
index 461f891a2..000000000
--- a/vendor/knative.dev/test-infra/scripts/markdown-lint-config.rc
+++ /dev/null
@@ -1,5 +0,0 @@
-# For help, see
-# https://github.com/markdownlint/markdownlint/blob/master/docs/configuration.md 
-
-# Ignore long lines
-rules "~MD013"
diff --git a/vendor/knative.dev/test-infra/scripts/presubmit-tests.sh b/vendor/knative.dev/test-infra/scripts/presubmit-tests.sh
index a1ee7cb41..e873736be 100644
--- a/vendor/knative.dev/test-infra/scripts/presubmit-tests.sh
+++ b/vendor/knative.dev/test-infra/scripts/presubmit-tests.sh
@@ -20,8 +20,6 @@
 source $(dirname "${BASH_SOURCE[0]}")/library.sh
 
 # Custom configuration of presubmit tests
-readonly DISABLE_MD_LINTING=${DISABLE_MD_LINTING:-0}
-readonly DISABLE_MD_LINK_CHECK=${DISABLE_MD_LINK_CHECK:-0}
 readonly PRESUBMIT_TEST_FAIL_FAST=${PRESUBMIT_TEST_FAIL_FAST:-0}
 
 # Extensions or file patterns that don't require presubmit tests.
@@ -119,36 +117,12 @@ function report_build_test() {
   [[ -z "${errors}" ]]
 }
 
-# Perform markdown build tests if necessary, unless disabled.
-function markdown_build_tests() {
-  (( DISABLE_MD_LINTING && DISABLE_MD_LINK_CHECK )) && return 0
-  # Get changed markdown files (ignore /vendor, github templates, and deleted files)
-  local mdfiles=""
-  for file in $(echo "${CHANGED_FILES}" | grep \\.md$ | grep -v ^vendor/ | grep -v ^.github/); do
-    [[ -f "${file}" ]] && mdfiles="${mdfiles} ${file}"
-  done
-  [[ -z "${mdfiles}" ]] && return 0
-  local failed=0
-  if (( ! DISABLE_MD_LINTING )); then
-    subheader "Linting the markdown files"
-    report_build_test Markdown_Lint lint_markdown "${mdfiles}" || failed=1
-  fi
-  if (( ! DISABLE_MD_LINK_CHECK )); then
-    subheader "Checking links in the markdown files"
-    report_build_test Markdown_Link check_links_in_markdown "${mdfiles}" || failed=1
-  fi
-  return ${failed}
-}
-
 # Default build test runner that:
-# * check markdown files
 # * run `/hack/verify-codegen.sh` (if it exists)
 # * `go build` on the entire repo
 # * check licenses in all go packages
 function default_build_test_runner() {
   local failed=0
-  # Perform markdown build checks
-  markdown_build_tests || failed=1
   # Run verify-codegen check
   if [[ -f ./hack/verify-codegen.sh ]]; then
     subheader "Checking autogenerated code is up-to-date"
diff --git a/webhook/admission_integration_test.go b/webhook/admission_integration_test.go
index 6955eac74..8b53b11c5 100644
--- a/webhook/admission_integration_test.go
+++ b/webhook/admission_integration_test.go
@@ -19,7 +19,6 @@ import (
 	"bytes"
 	"context"
 	"encoding/json"
-	"fmt"
 	"io/ioutil"
 	"net/http"
 	"net/url"
@@ -116,7 +115,7 @@ func TestAdmissionValidResponseForResource(t *testing.T) {
 		t.Fatal("Failed to marshal admission review:", err)
 	}
 
-	u, err := url.Parse(fmt.Sprintf("https://%s", serverURL))
+	u, err := url.Parse("https://" + serverURL)
 	if err != nil {
 		t.Fatal("bad url", err)
 	}
@@ -246,7 +245,7 @@ func TestAdmissionInvalidResponseForResource(t *testing.T) {
 		t.Fatal("Failed to marshal admission review:", err)
 	}
 
-	u, err := url.Parse(fmt.Sprintf("https://%s", serverURL))
+	u, err := url.Parse("https://" + serverURL)
 	if err != nil {
 		t.Fatal("bad url", err)
 	}