Repository: knative/client
Pull request #950 (2020-07-27 14:04:00)

[master] Auto-update dependencies
<!--[master] Auto-update dependencies-->
<!---->
Produced via:
  `./hack/update-deps.sh --upgrade && ./hack/update-codegen.sh`
/assign maximilien rhuss
/cc maximilien rhuss


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

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

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

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

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

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-client-integration-tests-latest-release | f2555a745b16b479a9ace53953bfda07b8c3e757 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_client/950/pull-knative-client-integration-tests-latest-release/1287750648644767746) | `/test pull-knative-client-integration-tests-latest-release`

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

<details>

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-client-integration-tests | 98003f6241abb4d04a1c07dbfe21eafc0c47bd6d | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_client/950/pull-knative-client-integration-tests/1288475297808650241) | `/test pull-knative-client-integration-tests`

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

<details>

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-client-integration-tests | b0b89428b51aafe08a7ed0487ddb43ec0c38ff08 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_client/950/pull-knative-client-integration-tests/1288838314941485060) | `/test pull-knative-client-integration-tests`

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

<details>

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-client-integration-tests | f5f4c1c9e8e2219ae1b28e9da2d242f3ace76d20 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_client/950/pull-knative-client-integration-tests/1289200073338523649) | `/test pull-knative-client-integration-tests`

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

<details>

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-client-integration-tests | d6cc2212e8840cccb25a7ba44cc242c8d9224f35 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_client/950/pull-knative-client-integration-tests/1290287992786653184) | `/test pull-knative-client-integration-tests`

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

<details>

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

Patch:
diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc
index b0c1ed2f..60bf8eb5 100644
--- a/CHANGELOG.adoc
+++ b/CHANGELOG.adoc
@@ -18,6 +18,10 @@
 |===
 | | Description | PR
 
+| 🐣
+| Separate PodSpecFlags from Service ConfigurationEditFlags
+| https://github.com/knative/client/pull/943[#943]
+
 | 🐣
 | Allow the kn test image to be customized via environment variable
 | https://github.com/knative/client/pull/957[#957]
diff --git a/go.mod b/go.mod
index c80f15a9..97cc4603 100644
--- a/go.mod
+++ b/go.mod
@@ -8,16 +8,16 @@ require (
 	github.com/spf13/cobra v1.0.1-0.20200715031239-b95db644ed1c
 	github.com/spf13/pflag v1.0.5
 	github.com/spf13/viper v1.7.0
-	golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899
+	golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de
 	gotest.tools v2.2.0+incompatible
 	k8s.io/api v0.18.1
 	k8s.io/apimachinery v0.18.6
 	k8s.io/cli-runtime v0.17.6
 	k8s.io/client-go v11.0.1-0.20190805182717-6502b5e7b1b5+incompatible
 	k8s.io/code-generator v0.18.0
-	knative.dev/eventing v0.16.1-0.20200724032657-8d83431c07bd
-	knative.dev/pkg v0.0.0-20200724211057-f21f66204a5c
-	knative.dev/serving v0.16.1-0.20200724203457-1517b1735305
+	knative.dev/eventing v0.16.1-0.20200803090001-4cd17b80636f
+	knative.dev/pkg v0.0.0-20200804051227-c3c869a34475
+	knative.dev/serving v0.16.1-0.20200804124127-08d681889306
 	sigs.k8s.io/yaml v1.2.0
 )
 
diff --git a/go.sum b/go.sum
index 82523bc2..f810cf3f 100644
--- a/go.sum
+++ b/go.sum
@@ -22,6 +22,8 @@ cloud.google.com/go v0.60.0 h1:R+tDlceO7Ss+zyvtsdhTxacDyZ1k99xwskQ4FT7ruoM=
 cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU=
 cloud.google.com/go v0.61.0 h1:NLQf5e1OMspfNT1RAHOB3ublr1TW3YTXO8OiWwVjK2U=
 cloud.google.com/go v0.61.0/go.mod h1:XukKJg4Y7QsUu0Hxg3qQKUWR4VuWivmyMK2+rUyxAqw=
+cloud.google.com/go v0.62.0 h1:RmDygqvj27Zf3fCQjQRtLyC7KwFcHkeJitcO0OoGOcA=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
 cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
 cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
 cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
@@ -36,8 +38,7 @@ cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2k
 cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
 cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
 cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
-cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w=
-cloud.google.com/go/pubsub v1.6.0/go.mod h1:I6DkrTv7tKIvDQTZt+6rAFo1446FEoVDJeLXTu4pCcE=
+cloud.google.com/go/pubsub v1.6.1/go.mod h1:kvW9rcn9OLEx6eTIzMBbWbpB8YsK3vu9jxgPolVz+p4=
 cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
 cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
 cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
@@ -232,7 +233,7 @@ github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/
 github.com/clarketm/json v1.13.4/go.mod h1:ynr2LRfb0fQU34l07csRNBTcivjySLLiY1YzQqKVfdo=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/cloudevents/sdk-go v1.0.0/go.mod h1:3TkmM0cFqkhCHOq5JzzRU/RxRkwzoS8TZ+G448qVTog=
-github.com/cloudevents/sdk-go/v2 v2.0.1-0.20200630063327-b91da81265fe/go.mod h1:3CTrpB4+u7Iaj6fd7E2Xvm5IxMdRoaAhqaRVnOr2rCU=
+github.com/cloudevents/sdk-go/v2 v2.2.0/go.mod h1:3CTrpB4+u7Iaj6fd7E2Xvm5IxMdRoaAhqaRVnOr2rCU=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
 github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko=
@@ -1161,6 +1162,8 @@ golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPh
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 h1:DZhuSZLsGlFL4CmhA8BcRA0mnthyA/nZ00AqCUo7vHg=
 golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig=
+golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -1332,9 +1335,8 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20200610111108-226ff32320da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo=
 golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200722175500-76b94024e4b6 h1:X9xIZ1YU8bLZA3l6gqDUHSFiD0GFI9S548h6C8nDtOY=
-golang.org/x/sys v0.0.0-20200722175500-76b94024e4b6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 h1:sIky/MyNRSHTrdxfsiUSS4WIAMvInbeXljJz+jDjeYE=
+golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1437,13 +1439,13 @@ golang.org/x/tools v0.0.0-20200527183253-8e7acdbce89d/go.mod h1:EkVYQZoAsY45+roY
 golang.org/x/tools v0.0.0-20200601175630-2caf76543d99/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 golang.org/x/tools v0.0.0-20200709181711-e327e1019dfe/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 golang.org/x/tools v0.0.0-20200713011307-fd294ab11aed/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200721032237-77f530d86f9a/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200721223218-6123e77877b2/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200723000907-a7c6fd066f6d h1:7k9BKfwmdbykG6l5ztniTrH0TP25yel8O7l26/yovMU=
-golang.org/x/tools v0.0.0-20200723000907-a7c6fd066f6d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200725200936-102e7d357031/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200727233628-55644ead90ce/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200731060945-b5fad4ed8dd6 h1:qKpj8TpV+LEhel7H/fR788J+KvhWZ3o3V6N2fU/iuLU=
+golang.org/x/tools v0.0.0-20200731060945-b5fad4ed8dd6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
@@ -1530,12 +1532,13 @@ google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7Fc
 google.golang.org/genproto v0.0.0-20200603110839-e855014d5736/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
 google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
 google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 google.golang.org/genproto v0.0.0-20200709005830-7a2ca40e9dc3/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 google.golang.org/genproto v0.0.0-20200711021454-869866162049/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200721032028-5044d0edf986/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200722002428-88e341933a54 h1:ASrBgpl9XvkNTP0m39/j18mid7aoF21npu2ioIBxYnY=
-google.golang.org/genproto v0.0.0-20200722002428-88e341933a54/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200726014623-da3ae01ef02d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200728010541-3dc8dca74b7b/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200731012542-8145dea6a485 h1:wTk5DQB3+1darAz4Ldomo0r5bUOCKX7gilxQ4sb2kno=
+google.golang.org/genproto v0.0.0-20200731012542-8145dea6a485/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
 google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
@@ -1559,6 +1562,8 @@ google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa
 google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
 google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE=
 google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0 h1:T7P4R73V3SSDPhH7WW7ATbfViLtmamH0DKrP3f9AuDI=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -1681,29 +1686,27 @@ k8s.io/legacy-cloud-providers v0.17.4/go.mod h1:FikRNoD64ECjkxO36gkDgJeiQWwyZTuB
 k8s.io/metrics v0.17.2/go.mod h1:3TkNHET4ROd+NfzNxkjoVfQ0Ob4iZnaHmSEA4vYpwLw=
 k8s.io/test-infra v0.0.0-20200514184223-ba32c8aae783/go.mod h1:bW6thaPZfL2hW7ecjx2WYwlP9KQLM47/xIJyttkVk5s=
 k8s.io/test-infra v0.0.0-20200617221206-ea73eaeab7ff/go.mod h1:L3+cRvwftUq8IW1TrHji5m3msnc4uck/7LsE/GR/aZk=
-k8s.io/test-infra v0.0.0-20200721115715-1af01ef6b4c8/go.mod h1:4cRZlOy5Ka3Ym/orCmNWL2dsE39pN0xHFT0WFrZe2HQ=
-k8s.io/test-infra v0.0.0-20200722010006-526277bee528/go.mod h1:4cRZlOy5Ka3Ym/orCmNWL2dsE39pN0xHFT0WFrZe2HQ=
-k8s.io/test-infra v0.0.0-20200723132140-b02d194a2d64/go.mod h1:4cRZlOy5Ka3Ym/orCmNWL2dsE39pN0xHFT0WFrZe2HQ=
+k8s.io/test-infra v0.0.0-20200728085909-4407d8aec1ee/go.mod h1:4cRZlOy5Ka3Ym/orCmNWL2dsE39pN0xHFT0WFrZe2HQ=
+k8s.io/test-infra v0.0.0-20200731093307-ac6260b71531/go.mod h1:4cRZlOy5Ka3Ym/orCmNWL2dsE39pN0xHFT0WFrZe2HQ=
 k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
 k8s.io/utils v0.0.0-20200124190032-861946025e34 h1:HjlUD6M0K3P8nRXmr2B9o4F9dUy9TCj/aEpReeyi6+k=
 k8s.io/utils v0.0.0-20200124190032-861946025e34/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
 knative.dev/caching v0.0.0-20200116200605-67bca2c83dfa/go.mod h1:dHXFU6CGlLlbzaWc32g80cR92iuBSpsslDNBWI8C7eg=
-knative.dev/caching v0.0.0-20200723145958-d031ce9de55d/go.mod h1:z0tB8jJWOJj4SfbWGps++hjMQHSxB5XEiTyaRuyRtfE=
-knative.dev/eventing v0.16.1-0.20200724032657-8d83431c07bd h1:3Etn1vLNy1o0UE3kmUVedC/ZPHMYqKIsr2xAt3YArIY=
-knative.dev/eventing v0.16.1-0.20200724032657-8d83431c07bd/go.mod h1:D7x216MQznRHiu3V7Y5I29/xCRkHxl9i21T6LrZPQt8=
+knative.dev/caching v0.0.0-20200731163501-72860523f33d/go.mod h1:Gb7i/Nrx7SCE248i+f/STNKFqFFOY62M8xPn7C7V1ps=
+knative.dev/eventing v0.16.1-0.20200803090001-4cd17b80636f h1:h5uf0JHbKOTCPFhuD0jFa197ThvpiaynVVqt4tWwn0U=
+knative.dev/eventing v0.16.1-0.20200803090001-4cd17b80636f/go.mod h1:KwxrviG6CffzjvcnPfRHqRIxzTG6S2F+IN4C3Htihq0=
 knative.dev/eventing-contrib v0.11.2/go.mod h1:SnXZgSGgMSMLNFTwTnpaOH7hXDzTFtw0J8OmHflNx3g=
-knative.dev/networking v0.0.0-20200723155758-cc457d7322d6 h1:E3icpGu2JG84UXvrG/36FovPwVmBWs1q6R6xZzcO6dM=
-knative.dev/networking v0.0.0-20200723155758-cc457d7322d6/go.mod h1:Xd6H9nzGwHI/tfEnvrm7dQjYP1s/CbZL8J941HyUaSE=
+knative.dev/networking v0.0.0-20200801232901-0a0cf9380a8d h1:8w9B2wTj9F2zmzTTfu12CqiNcdaxIvuBFR3AZY6RAdY=
+knative.dev/networking v0.0.0-20200801232901-0a0cf9380a8d/go.mod h1:wHAtNud0NOLQ7Xobl0PjLf91deGXW4esaa+R4pwxJnQ=
 knative.dev/pkg v0.0.0-20200207155214-fef852970f43/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q=
-knative.dev/pkg v0.0.0-20200723060257-ae9c3f7fa8d3/go.mod h1:pOJ+tu5k/SgHPGmecWqFguxJcIZozyDWlTlyldGcYGM=
-knative.dev/pkg v0.0.0-20200724055557-c36f46cc8c80/go.mod h1:GtoTEupsOzadgRKT4GgPWukbhAcINwDDGcKibTyd1Fk=
-knative.dev/pkg v0.0.0-20200724211057-f21f66204a5c h1:jJs9rQhkCexFr9m6+sYIPq/0DtRe+typQB64ffbXydM=
-knative.dev/pkg v0.0.0-20200724211057-f21f66204a5c/go.mod h1:jVP9M8uft3EYhWF8K00zKiNCvyfGy3tm0L2w9edCRqw=
-knative.dev/serving v0.16.1-0.20200724203457-1517b1735305 h1:Bqn8mTuMMWdnmbJzRPvEM69p71npap/YQPIxuNvkChE=
-knative.dev/serving v0.16.1-0.20200724203457-1517b1735305/go.mod h1:txxxmKATqqQv9j/s7K6PI6BAZ3cOAddJE72LHUsTxDY=
-knative.dev/test-infra v0.0.0-20200721175154-c98db9bd4d5d/go.mod h1:kzRhTm5L08eDQFRl8NKSAN93lz6IZWQMs+2TjTCN+VA=
-knative.dev/test-infra v0.0.0-20200722142057-3ca910b5a25e/go.mod h1:oHmDsPmq+zcc3b+Z94Kgmrz1JnmZEz36jmKuvL2Lw7o=
-knative.dev/test-infra v0.0.0-20200723182457-517b66ba19c1/go.mod h1:Y3sNbLSTA11kRcLvTzRsZCxO+GQuw7KV7+PL+iD+9CA=
+knative.dev/pkg v0.0.0-20200731005101-694087017879/go.mod h1:XgwbBKFaZgeMYBf1LRc5WtHDbCnOv6j+36/W9XFxs7Y=
+knative.dev/pkg v0.0.0-20200804051227-c3c869a34475 h1:Gths5wpLr78xFcm8eQ82c4lT7jJJOqguAG05LJQI/6k=
+knative.dev/pkg v0.0.0-20200804051227-c3c869a34475/go.mod h1:603ifFNju4JQo+VamPtWsxJW2XvK7BKWvOPA5138hNg=
+knative.dev/serving v0.16.1-0.20200804124127-08d681889306 h1:dfhSv/MOeFjarcCFwgprV++Cf0cLE46glhDosvSW8dc=
+knative.dev/serving v0.16.1-0.20200804124127-08d681889306/go.mod h1:m7yjR+ojbSpkxF8FnqENvvBwKtHQklw6qviYDmTbOqg=
+knative.dev/test-infra v0.0.0-20200729161259-d21e6ed450cb/go.mod h1:AfEfWe/Z/DIA2vQSbSTxMVlF+ErBD7Oqc4/K/x1no90=
+knative.dev/test-infra v0.0.0-20200730214800-52f8800d5692/go.mod h1:AfEfWe/Z/DIA2vQSbSTxMVlF+ErBD7Oqc4/K/x1no90=
+knative.dev/test-infra v0.0.0-20200731141600-8bb2015c65e2/go.mod h1:0le/boMbbcshz6ffNQRYyTkL7xubokot4dKcO/1daIc=
 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=
@@ -1722,6 +1725,7 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
 sigs.k8s.io/boskos v0.0.0-20200526191642-45fc818e2d00/go.mod h1:L1ubP7d1CCMSQSjKiZv6dGbh7b4kfoG+dFPj8cfYDnI=
 sigs.k8s.io/boskos v0.0.0-20200717180850-7299d535c033/go.mod h1:ZO5RV+VxJS9mb6DvZ1yAjywoyq/wQ8b0vDoZxcIA5kE=
+sigs.k8s.io/boskos v0.0.0-20200729174948-794df80db9c9/go.mod h1:ZO5RV+VxJS9mb6DvZ1yAjywoyq/wQ8b0vDoZxcIA5kE=
 sigs.k8s.io/controller-runtime v0.5.0/go.mod h1:REiJzC7Y00U+2YkMbT8wxgrsX5USpXKGhb2sCtAXiT8=
 sigs.k8s.io/controller-runtime v0.5.4/go.mod h1:JZUwSMVbxDupo0lTJSSFP5pimEyxGynROImSsqIOx1A=
 sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0=
diff --git a/pkg/kn/commands/service/configuration_edit_flags.go b/pkg/kn/commands/service/configuration_edit_flags.go
index aa1e7e79..7e252732 100644
--- a/pkg/kn/commands/service/configuration_edit_flags.go
+++ b/pkg/kn/commands/service/configuration_edit_flags.go
@@ -15,7 +15,6 @@
 package service
 
 import (
-	"errors"
 	"fmt"
 	"strings"
 
@@ -33,36 +32,23 @@ import (
 )
 
 type ConfigurationEditFlags struct {
+	//Fields for PodSpecFlags
+	PodSpecFlags knflags.PodSpecFlags
+
 	// Direct field manipulation
-	Image   uniqueStringArg
-	Env     []string
-	EnvFrom []string
-	Mount   []string
-	Volume  []string
-
-	Command string
-	Arg     []string
-
-	RequestsFlags, LimitsFlags ResourceFlags // TODO: Flag marked deprecated in release v0.15.0, remove in release v0.18.0
-	Resources                  knflags.ResourceOptions
-	Scale                      int
-	MinScale                   int
-	MaxScale                   int
-	ConcurrencyTarget          int
-	ConcurrencyLimit           int
-	ConcurrencyUtilization     int
-	AutoscaleWindow            string
-	Port                       string
-	Labels                     []string
-	LabelsService              []string
-	LabelsRevision             []string
-	NamePrefix                 string
-	RevisionName               string
-	ServiceAccountName         string
-	ImagePullSecrets           string
-	Annotations                []string
-	ClusterLocal               bool
-	User                       int64
+	Scale                  int
+	MinScale               int
+	MaxScale               int
+	ConcurrencyTarget      int
+	ConcurrencyLimit       int
+	ConcurrencyUtilization int
+	AutoscaleWindow        string
+	Labels                 []string
+	LabelsService          []string
+	LabelsRevision         []string
+	RevisionName           string
+	Annotations            []string
+	ClusterLocal           bool
 
 	// Preferences about how to do the action.
 	LockToDigest         bool
@@ -75,30 +61,6 @@ type ConfigurationEditFlags struct {
 	flags []string
 }
 
-type ResourceFlags struct {
-	CPU    string
-	Memory string
-}
-
-// -- uniqueStringArg Value
-// Custom implementation of flag.Value interface to prevent multiple value assignment.
-// Useful to enforce unique use of flags, e.g. --image.
-type uniqueStringArg string
-
-func (s *uniqueStringArg) Set(val string) error {
-	if len(*s) > 0 {
-		return errors.New("can be provided only once")
-	}
-	*s = uniqueStringArg(val)
-	return nil
-}
-
-func (s *uniqueStringArg) Type() string {
-	return "string"
-}
-
-func (s *uniqueStringArg) String() string { return string(*s) }
-
 // markFlagMakesRevision indicates that a flag will create a new revision if you
 // set it.
 func (p *ConfigurationEditFlags) markFlagMakesRevision(f string) {
@@ -107,80 +69,10 @@ func (p *ConfigurationEditFlags) markFlagMakesRevision(f string) {
 
 // addSharedFlags adds the flags common between create & update.
 func (p *ConfigurationEditFlags) addSharedFlags(command *cobra.Command) {
-	command.Flags().VarP(&p.Image, "image", "", "Image to run.")
-	p.markFlagMakesRevision("image")
-	command.Flags().StringArrayVarP(&p.Env, "env", "e", []string{},
-		"Environment variable to set. NAME=value; you may provide this flag "+
-			"any number of times to set multiple environment variables. "+
-			"To unset, specify the environment variable name followed by a \"-\" (e.g., NAME-).")
-	p.markFlagMakesRevision("env")
-
-	command.Flags().StringArrayVarP(&p.EnvFrom, "env-from", "", []string{},
-		"Add environment variables from a ConfigMap (prefix cm: or config-map:) or a Secret (prefix secret:). "+
-			"Example: --env-from cm:myconfigmap or --env-from secret:mysecret. "+
-			"You can use this flag multiple times. "+
-			"To unset a ConfigMap/Secret reference, append \"-\" to the name, e.g. --env-from cm:myconfigmap-.")
-	p.markFlagMakesRevision("env-from")
-
-	command.Flags().StringArrayVarP(&p.Mount, "mount", "", []string{},
-		"Mount a ConfigMap (prefix cm: or config-map:), a Secret (prefix secret: or sc:), or an existing Volume (without any prefix) on the specified directory. "+
-			"Example: --mount /mydir=cm:myconfigmap, --mount /mydir=secret:mysecret, or --mount /mydir=myvolume. "+
-			"When a configmap or a secret is specified, a corresponding volume is automatically generated. "+
-			"You can use this flag multiple times. "+
-			"For unmounting a directory, append \"-\", e.g. --mount /mydir-, which also removes any auto-generated volume.")
-	p.markFlagMakesRevision("mount")
-
-	command.Flags().StringArrayVarP(&p.Volume, "volume", "", []string{},
-		"Add a volume from a ConfigMap (prefix cm: or config-map:) or a Secret (prefix secret: or sc:). "+
-			"Example: --volume myvolume=cm:myconfigmap or --volume myvolume=secret:mysecret. "+
-			"You can use this flag multiple times. "+
-			"To unset a ConfigMap/Secret reference, append \"-\" to the name, e.g. --volume myvolume-.")
-	p.markFlagMakesRevision("volume")
-
-	command.Flags().StringVarP(&p.Command, "cmd", "", "",
-		"Specify command to be used as entrypoint instead of default one. "+
-			"Example: --cmd /app/start or --cmd /app/start --arg myArg to pass aditional arguments.")
-	p.markFlagMakesRevision("cmd")
-
-	command.Flags().StringArrayVarP(&p.Arg, "arg", "", []string{},
-		"Add argument to the container command. "+
-			"Example: --arg myArg1 --arg --myArg2 --arg myArg3=3. "+
-			"You can use this flag multiple times.")
-	p.markFlagMakesRevision("arg")
-
-	command.Flags().StringSliceVar(&p.Resources.Limits,
-		"limit",
-		nil,
-		"The resource requirement limits for this Service. For example, 'cpu=100m,memory=256Mi'. "+
-			"You can use this flag multiple times. "+
-			"To unset a resource limit, append \"-\" to the resource name, e.g. '--limit memory-'.")
-	p.markFlagMakesRevision("limit")
-
-	command.Flags().StringSliceVar(&p.Resources.Requests,
-		"request",
-		nil,
-		"The resource requirement requests for this Service. For example, 'cpu=100m,memory=256Mi'. "+
-			"You can use this flag multiple times. "+
-			"To unset a resource request, append \"-\" to the resource name, e.g. '--request cpu-'.")
-	p.markFlagMakesRevision("request")
-
-	command.Flags().StringVar(&p.RequestsFlags.CPU, "requests-cpu", "",
-		"DEPRECATED: please use --request instead. The requested CPU (e.g., 250m).")
-	p.markFlagMakesRevision("requests-cpu")
-
-	command.Flags().StringVar(&p.RequestsFlags.Memory, "requests-memory", "",
-		"DEPRECATED: please use --request instead. The requested memory (e.g., 64Mi).")
-	p.markFlagMakesRevision("requests-memory")
-
-	// TODO: Flag marked deprecated in release v0.15.0, remove in release v0.18.0
-	command.Flags().StringVar(&p.LimitsFlags.CPU, "limits-cpu", "",
-		"DEPRECATED: please use --limit instead. The limits on the requested CPU (e.g., 1000m).")
-	p.markFlagMakesRevision("limits-cpu")
-
-	// TODO: Flag marked deprecated in release v0.15.0, remove in release v0.18.0
-	command.Flags().StringVar(&p.LimitsFlags.Memory, "limits-memory", "",
-		"DEPRECATED: please use --limit instead. The limits on the requested memory (e.g., 1024Mi).")
-	p.markFlagMakesRevision("limits-memory")
+	flagNames := p.PodSpecFlags.AddFlags(command.Flags())
+	for _, name := range flagNames {
+		p.markFlagMakesRevision(name)
+	}
 
 	command.Flags().IntVar(&p.MinScale, "min-scale", 0, "Minimal number of replicas.")
 	command.Flags().MarkHidden("min-scale")
@@ -221,9 +113,6 @@ func (p *ConfigurationEditFlags) addSharedFlags(command *cobra.Command) {
 		"Percentage of concurrent requests utilization before scaling up.")
 	p.markFlagMakesRevision("concurrency-utilization")
 
-	command.Flags().StringVarP(&p.Port, "port", "p", "", "The port where application listens on, in the format 'NAME:PORT', where 'NAME' is optional. Examples: '--port h2c:8080' , '--port 8080'.")
-	p.markFlagMakesRevision("port")
-
 	command.Flags().StringArrayVarP(&p.Labels, "label", "l", []string{},
 		"Labels to set for both Service and Revision. name=value; you may provide this flag "+
 			"any number of times to set multiple labels. "+
@@ -255,25 +144,11 @@ func (p *ConfigurationEditFlags) addSharedFlags(command *cobra.Command) {
 			"the image. (--no-lock-to-digest pulls the image tag afresh with each new revision)")
 	// Don't mark as changing the revision.
 
-	command.Flags().StringVar(&p.ServiceAccountName,
-		"service-account",
-		"",
-		"Service account name to set. An empty argument (\"\") clears the service account. The referenced service account must exist in the service's namespace.")
-	p.markFlagMakesRevision("service-account")
-
 	command.Flags().StringArrayVarP(&p.Annotations, "annotation", "a", []string{},
 		"Service annotation to set. name=value; you may provide this flag "+
 			"any number of times to set multiple annotations. "+
 			"To unset, specify the annotation name followed by a \"-\" (e.g., name-).")
 	p.markFlagMakesRevision("annotation")
-
-	command.Flags().StringVar(&p.ImagePullSecrets,
-		"pull-secret",
-		"",
-		"Image pull secret to set. An empty argument (\"\") clears the pull secret. The referenced secret must exist in the service's namespace.")
-	p.markFlagMakesRevision("pull-secret")
-	command.Flags().Int64VarP(&p.User, "user", "", 0, "The user ID to run the container (e.g., 1001).")
-	p.markFlagMakesRevision("user")
 }
 
 // AddUpdateFlags adds the flags specific to update.
@@ -301,7 +176,7 @@ func (p *ConfigurationEditFlags) Apply(
 
 	template := &service.Spec.Template
 	if cmd.Flags().Changed("env") {
-		envMap, err := util.MapFromArrayAllowingSingles(p.Env, "=")
+		envMap, err := util.MapFromArrayAllowingSingles(p.PodSpecFlags.Env, "=")
 		if err != nil {
 			return fmt.Errorf("Invalid --env: %w", err)
 		}
@@ -316,7 +191,7 @@ func (p *ConfigurationEditFlags) Apply(
 	if cmd.Flags().Changed("env-from") {
 		envFromSourceToUpdate := []string{}
 		envFromSourceToRemove := []string{}
-		for _, name := range p.EnvFrom {
+		for _, name := range p.PodSpecFlags.EnvFrom {
 			if name == "-" {
 				return fmt.Errorf("\"-\" is not a valid value for \"--env-from\"")
 			} else if strings.HasSuffix(name, "-") {
@@ -333,12 +208,12 @@ func (p *ConfigurationEditFlags) Apply(
 	}
 
 	if cmd.Flags().Changed("mount") || cmd.Flags().Changed("volume") {
-		mountsToUpdate, mountsToRemove, err := util.OrderedMapAndRemovalListFromArray(p.Mount, "=")
+		mountsToUpdate, mountsToRemove, err := util.OrderedMapAndRemovalListFromArray(p.PodSpecFlags.Mount, "=")
 		if err != nil {
 			return fmt.Errorf("Invalid --mount: %w", err)
 		}
 
-		volumesToUpdate, volumesToRemove, err := util.OrderedMapAndRemovalListFromArray(p.Volume, "=")
+		volumesToUpdate, volumesToRemove, err := util.OrderedMapAndRemovalListFromArray(p.PodSpecFlags.Volume, "=")
 		if err != nil {
 			return fmt.Errorf("Invalid --volume: %w", err)
 		}
@@ -360,7 +235,7 @@ func (p *ConfigurationEditFlags) Apply(
 
 	imageSet := false
 	if cmd.Flags().Changed("image") {
-		err = servinglib.UpdateImage(template, p.Image.String())
+		err = servinglib.UpdateImage(template, p.PodSpecFlags.Image.String())
 		if err != nil {
 			return err
 		}
@@ -394,11 +269,11 @@ func (p *ConfigurationEditFlags) Apply(
 		fmt.Fprintf(cmd.OutOrStdout(), "\nWARNING: flags --requests-cpu / --requests-memory are deprecated and going to be removed in future release, please use --request instead.\n\n")
 	}
 
-	limitsResources, err := p.computeResources(p.LimitsFlags)
+	limitsResources, err := p.computeResources(p.PodSpecFlags.LimitsFlags)
 	if err != nil {
 		return err
 	}
-	requestsResources, err := p.computeResources(p.RequestsFlags)
+	requestsResources, err := p.computeResources(p.PodSpecFlags.RequestsFlags)
 	if err != nil {
 		return err
 	}
@@ -407,32 +282,32 @@ func (p *ConfigurationEditFlags) Apply(
 		return err
 	}
 
-	requestsToRemove, limitsToRemove, err := p.Resources.Validate()
+	requestsToRemove, limitsToRemove, err := p.PodSpecFlags.Resources.Validate()
 	if err != nil {
 		return err
 	}
 
-	err = servinglib.UpdateResources(template, p.Resources.ResourceRequirements, requestsToRemove, limitsToRemove)
+	err = servinglib.UpdateResources(template, p.PodSpecFlags.Resources.ResourceRequirements, requestsToRemove, limitsToRemove)
 	if err != nil {
 		return err
 	}
 
 	if cmd.Flags().Changed("cmd") {
-		err = servinglib.UpdateContainerCommand(template, p.Command)
+		err = servinglib.UpdateContainerCommand(template, p.PodSpecFlags.Command)
 		if err != nil {
 			return err
 		}
 	}
 
 	if cmd.Flags().Changed("arg") {
-		err = servinglib.UpdateContainerArg(template, p.Arg)
+		err = servinglib.UpdateContainerArg(template, p.PodSpecFlags.Arg)
 		if err != nil {
 			return err
 		}
 	}
 
 	if cmd.Flags().Changed("port") {
-		err = servinglib.UpdateContainerPort(template, p.Port)
+		err = servinglib.UpdateContainerPort(template, p.PodSpecFlags.Port)
 		if err != nil {
 			return err
 		}
@@ -538,18 +413,18 @@ func (p *ConfigurationEditFlags) Apply(
 	}
 
 	if cmd.Flags().Changed("service-account") {
-		err = servinglib.UpdateServiceAccountName(template, p.ServiceAccountName)
+		err = servinglib.UpdateServiceAccountName(template, p.PodSpecFlags.ServiceAccountName)
 		if err != nil {
 			return err
 		}
 	}
 
 	if cmd.Flags().Changed("pull-secret") {
-		servinglib.UpdateImagePullSecrets(template, p.ImagePullSecrets)
+		servinglib.UpdateImagePullSecrets(template, p.PodSpecFlags.ImagePullSecrets)
 	}
 
 	if cmd.Flags().Changed("user") {
-		servinglib.UpdateUser(template, p.User)
+		servinglib.UpdateUser(template, p.PodSpecFlags.User)
 	}
 
 	return nil
@@ -569,7 +444,7 @@ func (p *ConfigurationEditFlags) updateLabels(obj *metav1.ObjectMeta, flagLabels
 	return nil
 }
 
-func (p *ConfigurationEditFlags) computeResources(resourceFlags ResourceFlags) (corev1.ResourceList, error) {
+func (p *ConfigurationEditFlags) computeResources(resourceFlags knflags.ResourceFlags) (corev1.ResourceList, error) {
 	resourceList := corev1.ResourceList{}
 
 	if resourceFlags.CPU != "" {
diff --git a/pkg/kn/commands/service/create.go b/pkg/kn/commands/service/create.go
index a8a93db3..106e5569 100644
--- a/pkg/kn/commands/service/create.go
+++ b/pkg/kn/commands/service/create.go
@@ -88,7 +88,7 @@ func NewServiceCreateCommand(p *commands.KnParams) *cobra.Command {
 			if len(args) == 1 {
 				name = args[0]
 			}
-			if editFlags.Image == "" && editFlags.Filename == "" {
+			if editFlags.PodSpecFlags.Image == "" && editFlags.Filename == "" {
 				return errors.New("'service create' requires the image name to run provided with the --image option")
 			}
 
diff --git a/pkg/kn/flags/podspec.go b/pkg/kn/flags/podspec.go
new file mode 100644
index 00000000..6d4869aa
--- /dev/null
+++ b/pkg/kn/flags/podspec.go
@@ -0,0 +1,165 @@
+// 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 flags
+
+import (
+	"errors"
+
+	"github.com/spf13/pflag"
+)
+
+// PodSpecFlags to hold the container resource requirements values
+type PodSpecFlags struct {
+	// Direct field manipulation
+	Image   uniqueStringArg
+	Env     []string
+	EnvFrom []string
+	Mount   []string
+	Volume  []string
+
+	Command string
+	Arg     []string
+
+	RequestsFlags, LimitsFlags ResourceFlags // TODO: Flag marked deprecated in release v0.15.0, remove in release v0.18.0
+	Resources                  ResourceOptions
+	Port                       string
+	ServiceAccountName         string
+	ImagePullSecrets           string
+	User                       int64
+}
+
+type ResourceFlags struct {
+	CPU    string
+	Memory string
+}
+
+// -- uniqueStringArg Value
+// Custom implementation of flag.Value interface to prevent multiple value assignment.
+// Useful to enforce unique use of flags, e.g. --image.
+type uniqueStringArg string
+
+func (s *uniqueStringArg) Set(val string) error {
+	if len(*s) > 0 {
+		return errors.New("can be provided only once")
+	}
+	*s = uniqueStringArg(val)
+	return nil
+}
+
+func (s *uniqueStringArg) Type() string {
+	return "string"
+}
+
+func (s *uniqueStringArg) String() string { return string(*s) }
+
+//AddFlags will add PodSpec related flags to FlagSet
+func (p *PodSpecFlags) AddFlags(flagset *pflag.FlagSet) []string {
+
+	flagNames := []string{}
+
+	flagset.VarP(&p.Image, "image", "", "Image to run.")
+	flagNames = append(flagNames, "image")
+
+	flagset.StringArrayVarP(&p.Env, "env", "e", []string{},
+		"Environment variable to set. NAME=value; you may provide this flag "+
+			"any number of times to set multiple environment variables. "+
+			"To unset, specify the environment variable name followed by a \"-\" (e.g., NAME-).")
+	flagNames = append(flagNames, "env")
+
+	flagset.StringArrayVarP(&p.EnvFrom, "env-from", "", []string{},
+		"Add environment variables from a ConfigMap (prefix cm: or config-map:) or a Secret (prefix secret:). "+
+			"Example: --env-from cm:myconfigmap or --env-from secret:mysecret. "+
+			"You can use this flag multiple times. "+
+			"To unset a ConfigMap/Secret reference, append \"-\" to the name, e.g. --env-from cm:myconfigmap-.")
+	flagNames = append(flagNames, "env-from")
+
+	flagset.StringArrayVarP(&p.Mount, "mount", "", []string{},
+		"Mount a ConfigMap (prefix cm: or config-map:), a Secret (prefix secret: or sc:), or an existing Volume (without any prefix) on the specified directory. "+
+			"Example: --mount /mydir=cm:myconfigmap, --mount /mydir=secret:mysecret, or --mount /mydir=myvolume. "+
+			"When a configmap or a secret is specified, a corresponding volume is automatically generated. "+
+			"You can use this flag multiple times. "+
+			"For unmounting a directory, append \"-\", e.g. --mount /mydir-, which also removes any auto-generated volume.")
+	flagNames = append(flagNames, "mount")
+
+	flagset.StringArrayVarP(&p.Volume, "volume", "", []string{},
+		"Add a volume from a ConfigMap (prefix cm: or config-map:) or a Secret (prefix secret: or sc:). "+
+			"Example: --volume myvolume=cm:myconfigmap or --volume myvolume=secret:mysecret. "+
+			"You can use this flag multiple times. "+
+			"To unset a ConfigMap/Secret reference, append \"-\" to the name, e.g. --volume myvolume-.")
+	flagNames = append(flagNames, "volume")
+
+	flagset.StringVarP(&p.Command, "cmd", "", "",
+		"Specify command to be used as entrypoint instead of default one. "+
+			"Example: --cmd /app/start or --cmd /app/start --arg myArg to pass aditional arguments.")
+	flagNames = append(flagNames, "cmd")
+
+	flagset.StringArrayVarP(&p.Arg, "arg", "", []string{},
+		"Add argument to the container command. "+
+			"Example: --arg myArg1 --arg --myArg2 --arg myArg3=3. "+
+			"You can use this flag multiple times.")
+	flagNames = append(flagNames, "arg")
+
+	flagset.StringSliceVar(&p.Resources.Limits,
+		"limit",
+		nil,
+		"The resource requirement limits for this Service. For example, 'cpu=100m,memory=256Mi'. "+
+			"You can use this flag multiple times. "+
+			"To unset a resource limit, append \"-\" to the resource name, e.g. '--limit memory-'.")
+	flagNames = append(flagNames, "limit")
+
+	flagset.StringSliceVar(&p.Resources.Requests,
+		"request",
+		nil,
+		"The resource requirement requests for this Service. For example, 'cpu=100m,memory=256Mi'. "+
+			"You can use this flag multiple times. "+
+			"To unset a resource request, append \"-\" to the resource name, e.g. '--request cpu-'.")
+	flagNames = append(flagNames, "request")
+
+	flagset.StringVar(&p.RequestsFlags.CPU, "requests-cpu", "",
+		"DEPRECATED: please use --request instead. The requested CPU (e.g., 250m).")
+	flagNames = append(flagNames, "requests-cpu")
+
+	flagset.StringVar(&p.RequestsFlags.Memory, "requests-memory", "",
+		"DEPRECATED: please use --request instead. The requested memory (e.g., 64Mi).")
+	flagNames = append(flagNames, "requests-memory")
+
+	// TODO: Flag marked deprecated in release v0.15.0, remove in release v0.18.0
+	flagset.StringVar(&p.LimitsFlags.CPU, "limits-cpu", "",
+		"DEPRECATED: please use --limit instead. The limits on the requested CPU (e.g., 1000m).")
+	flagNames = append(flagNames, "limits-cpu")
+
+	// TODO: Flag marked deprecated in release v0.15.0, remove in release v0.18.0
+	flagset.StringVar(&p.LimitsFlags.Memory, "limits-memory", "",
+		"DEPRECATED: please use --limit instead. The limits on the requested memory (e.g., 1024Mi).")
+	flagNames = append(flagNames, "limits-memory")
+
+	flagset.StringVarP(&p.Port, "port", "p", "", "The port where application listens on, in the format 'NAME:PORT', where 'NAME' is optional. Examples: '--port h2c:8080' , '--port 8080'.")
+	flagNames = append(flagNames, "port")
+
+	flagset.StringVar(&p.ServiceAccountName,
+		"service-account",
+		"",
+		"Service account name to set. An empty argument (\"\") clears the service account. The referenced service account must exist in the service's namespace.")
+	flagNames = append(flagNames, "service-account")
+
+	flagset.StringVar(&p.ImagePullSecrets,
+		"pull-secret",
+		"",
+		"Image pull secret to set. An empty argument (\"\") clears the pull secret. The referenced secret must exist in the service's namespace.")
+	flagNames = append(flagNames, "pull-secret")
+	flagset.Int64VarP(&p.User, "user", "", 0, "The user ID to run the container (e.g., 1001).")
+	flagNames = append(flagNames, "user")
+	return flagNames
+}
diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh
index e91cb82c..53a24931 100644
--- a/vendor/golang.org/x/sys/unix/mkerrors.sh
+++ b/vendor/golang.org/x/sys/unix/mkerrors.sh
@@ -107,6 +107,7 @@ includes_FreeBSD='
 #include <sys/types.h>
 #include <sys/disk.h>
 #include <sys/event.h>
+#include <sys/sched.h>
 #include <sys/select.h>
 #include <sys/socket.h>
 #include <sys/sockio.h>
@@ -297,6 +298,7 @@ includes_NetBSD='
 #include <sys/extattr.h>
 #include <sys/mman.h>
 #include <sys/mount.h>
+#include <sys/sched.h>
 #include <sys/select.h>
 #include <sys/socket.h>
 #include <sys/sockio.h>
diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go
index 84824587..3689c808 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go
@@ -339,6 +339,12 @@ const (
 	CLOCK_UPTIME_FAST              = 0x8
 	CLOCK_UPTIME_PRECISE           = 0x7
 	CLOCK_VIRTUAL                  = 0x1
+	CPUSTATES                      = 0x5
+	CP_IDLE                        = 0x4
+	CP_INTR                        = 0x3
+	CP_NICE                        = 0x1
+	CP_SYS                         = 0x2
+	CP_USER                        = 0x0
 	CREAD                          = 0x800
 	CRTSCTS                        = 0x30000
 	CS5                            = 0x0
diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go
index 4acd101c..b8f7c3c9 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go
@@ -339,6 +339,12 @@ const (
 	CLOCK_UPTIME_FAST              = 0x8
 	CLOCK_UPTIME_PRECISE           = 0x7
 	CLOCK_VIRTUAL                  = 0x1
+	CPUSTATES                      = 0x5
+	CP_IDLE                        = 0x4
+	CP_INTR                        = 0x3
+	CP_NICE                        = 0x1
+	CP_SYS                         = 0x2
+	CP_USER                        = 0x0
 	CREAD                          = 0x800
 	CRTSCTS                        = 0x30000
 	CS5                            = 0x0
diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go
index e4719873..be14bb1a 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go
@@ -339,6 +339,12 @@ const (
 	CLOCK_UPTIME_FAST              = 0x8
 	CLOCK_UPTIME_PRECISE           = 0x7
 	CLOCK_VIRTUAL                  = 0x1
+	CPUSTATES                      = 0x5
+	CP_IDLE                        = 0x4
+	CP_INTR                        = 0x3
+	CP_NICE                        = 0x1
+	CP_SYS                         = 0x2
+	CP_USER                        = 0x0
 	CREAD                          = 0x800
 	CRTSCTS                        = 0x30000
 	CS5                            = 0x0
diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go
index 5e49769d..7ce9c008 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go
@@ -339,6 +339,12 @@ const (
 	CLOCK_UPTIME_FAST              = 0x8
 	CLOCK_UPTIME_PRECISE           = 0x7
 	CLOCK_VIRTUAL                  = 0x1
+	CPUSTATES                      = 0x5
+	CP_IDLE                        = 0x4
+	CP_INTR                        = 0x3
+	CP_NICE                        = 0x1
+	CP_SYS                         = 0x2
+	CP_USER                        = 0x0
 	CREAD                          = 0x800
 	CRTSCTS                        = 0x30000
 	CS5                            = 0x0
diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go
index 96b9b8ab..20f3a579 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go
@@ -158,6 +158,12 @@ const (
 	CLONE_SIGHAND                     = 0x800
 	CLONE_VFORK                       = 0x4000
 	CLONE_VM                          = 0x100
+	CPUSTATES                         = 0x5
+	CP_IDLE                           = 0x4
+	CP_INTR                           = 0x3
+	CP_NICE                           = 0x1
+	CP_SYS                            = 0x2
+	CP_USER                           = 0x0
 	CREAD                             = 0x800
 	CRTSCTS                           = 0x10000
 	CS5                               = 0x0
diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go
index ed522a84..90b8fcd2 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go
@@ -158,6 +158,12 @@ const (
 	CLONE_SIGHAND                     = 0x800
 	CLONE_VFORK                       = 0x4000
 	CLONE_VM                          = 0x100
+	CPUSTATES                         = 0x5
+	CP_IDLE                           = 0x4
+	CP_INTR                           = 0x3
+	CP_NICE                           = 0x1
+	CP_SYS                            = 0x2
+	CP_USER                           = 0x0
 	CREAD                             = 0x800
 	CRTSCTS                           = 0x10000
 	CS5                               = 0x0
diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go
index c8d36fe9..c5c03993 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go
@@ -150,6 +150,12 @@ const (
 	BRKINT                            = 0x2
 	CFLUSH                            = 0xf
 	CLOCAL                            = 0x8000
+	CPUSTATES                         = 0x5
+	CP_IDLE                           = 0x4
+	CP_INTR                           = 0x3
+	CP_NICE                           = 0x1
+	CP_SYS                            = 0x2
+	CP_USER                           = 0x0
 	CREAD                             = 0x800
 	CRTSCTS                           = 0x10000
 	CS5                               = 0x0
diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go
index f1c146a7..14dd3c1d 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go
@@ -158,6 +158,12 @@ const (
 	CLONE_SIGHAND                     = 0x800
 	CLONE_VFORK                       = 0x4000
 	CLONE_VM                          = 0x100
+	CPUSTATES                         = 0x5
+	CP_IDLE                           = 0x4
+	CP_INTR                           = 0x3
+	CP_NICE                           = 0x1
+	CP_SYS                            = 0x2
+	CP_USER                           = 0x0
 	CREAD                             = 0x800
 	CRTSCTS                           = 0x10000
 	CS5                               = 0x0
diff --git a/vendor/knative.dev/eventing/pkg/apis/eventing/register.go b/vendor/knative.dev/eventing/pkg/apis/eventing/register.go
index ead3498b..29ffcc90 100644
--- a/vendor/knative.dev/eventing/pkg/apis/eventing/register.go
+++ b/vendor/knative.dev/eventing/pkg/apis/eventing/register.go
@@ -59,6 +59,21 @@ const (
 	// BrokerChannelAddressStatusAnnotationKey is the broker status
 	// annotation key used to specify the address of its channel.
 	BrokerChannelAddressStatusAnnotationKey = "knative.dev/channelAddress"
+
+	// BrokerChannelAPIVersionStatusAnnotationKey is the broker status
+	// annotation key used to specify the APIVersion of the channel for
+	// the triggers to subscribe to.
+	BrokerChannelAPIVersionStatusAnnotationKey = "knative.dev/channelAPIVersion"
+
+	// BrokerChannelKindStatusAnnotationKey is the broker status
+	// annotation key used to specify the Kind of the channel for
+	// the triggers to subscribe to.
+	BrokerChannelKindStatusAnnotationKey = "knative.dev/channelKind"
+
+	// BrokerChannelNameStatusAnnotationKey is the broker status
+	// annotation key used to specify the name of the channel for
+	// the triggers to subscribe to.
+	BrokerChannelNameStatusAnnotationKey = "knative.dev/channelName"
 )
 
 var (
diff --git a/vendor/knative.dev/eventing/pkg/apis/sources/v1alpha2/ping_conversion.go b/vendor/knative.dev/eventing/pkg/apis/sources/v1alpha2/ping_conversion.go
index 26c6bcda..916eee31 100644
--- a/vendor/knative.dev/eventing/pkg/apis/sources/v1alpha2/ping_conversion.go
+++ b/vendor/knative.dev/eventing/pkg/apis/sources/v1alpha2/ping_conversion.go
@@ -19,16 +19,64 @@ package v1alpha2
 import (
 	"context"
 	"fmt"
+	"strings"
 
+	"knative.dev/eventing/pkg/apis/sources/v1beta1"
 	"knative.dev/pkg/apis"
 )
 
 // ConvertTo implements apis.Convertible
-func (source *PingSource) ConvertTo(ctx context.Context, sink apis.Convertible) error {
-	return fmt.Errorf("v1alpha2 is the highest known version, got: %T", sink)
+// Converts source from v1alpha2.PingSource into a higher version.
+func (source *PingSource) ConvertTo(ctx context.Context, obj apis.Convertible) error {
+	switch sink := obj.(type) {
+	case *v1beta1.PingSource:
+		sink.ObjectMeta = source.ObjectMeta
+		sink.Spec = v1beta1.PingSourceSpec{
+			JsonData:   source.Spec.JsonData,
+			SourceSpec: source.Spec.SourceSpec,
+		}
+		sink.Status = v1beta1.PingSourceStatus{
+			SourceStatus: source.Status.SourceStatus,
+		}
+
+		// in v1beta1, timezone has its own field
+		schedule := source.Spec.Schedule
+		if strings.HasPrefix(schedule, "TZ=") || strings.HasPrefix(schedule, "CRON_TZ=") {
+			i := strings.Index(schedule, " ")
+			eq := strings.Index(schedule, "=")
+			sink.Spec.Timezone = schedule[eq+1 : i]
+			sink.Spec.Schedule = strings.TrimSpace(schedule[i:])
+		} else {
+			sink.Spec.Schedule = schedule
+		}
+
+		return nil
+	default:
+		return apis.ConvertToViaProxy(ctx, source, &v1beta1.PingSource{}, sink)
+	}
 }
 
 // ConvertFrom implements apis.Convertible
-func (sink *PingSource) ConvertFrom(ctx context.Context, source apis.Convertible) error {
-	return fmt.Errorf("v1alpha2 is the highest known version, got: %T", source)
+// Converts obj from a higher version into v1alpha2.PingSource.
+func (sink *PingSource) ConvertFrom(ctx context.Context, obj apis.Convertible) error {
+	switch source := obj.(type) {
+	case *v1beta1.PingSource:
+		sink.ObjectMeta = source.ObjectMeta
+		sink.Spec = PingSourceSpec{
+			JsonData:   source.Spec.JsonData,
+			SourceSpec: source.Spec.SourceSpec,
+		}
+		sink.Status = PingSourceStatus{
+			SourceStatus: source.Status.SourceStatus,
+		}
+
+		if source.Spec.Timezone != "" {
+			sink.Spec.Schedule = fmt.Sprintf("CRON_TZ=%s %s", source.Spec.Timezone, source.Spec.Schedule)
+		} else {
+			sink.Spec.Schedule = source.Spec.Schedule
+		}
+		return nil
+	default:
+		return apis.ConvertFromViaProxy(ctx, source, &v1beta1.PingSource{}, sink)
+	}
 }
diff --git a/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/ping_conversion.go b/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/ping_conversion.go
new file mode 100644
index 00000000..d33d9377
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/ping_conversion.go
@@ -0,0 +1,34 @@
+/*
+Copyright 2020 The Knative Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1beta1
+
+import (
+	"context"
+	"fmt"
+
+	"knative.dev/pkg/apis"
+)
+
+// ConvertTo implements apis.Convertible
+func (source *PingSource) ConvertTo(ctx context.Context, sink apis.Convertible) error {
+	return fmt.Errorf("v1beta1 is the highest known version, got: %T", sink)
+}
+
+// ConvertFrom implements apis.Convertible
+func (sink *PingSource) ConvertFrom(ctx context.Context, source apis.Convertible) error {
+	return fmt.Errorf("v1beta1 is the highest known version, got: %T", source)
+}
diff --git a/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/ping_defaults.go b/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/ping_defaults.go
new file mode 100644
index 00000000..9fef4326
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/ping_defaults.go
@@ -0,0 +1,35 @@
+/*
+Copyright 2020 The Knative Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1beta1
+
+import (
+	"context"
+)
+
+const (
+	defaultSchedule = "* * * * *"
+)
+
+func (s *PingSource) SetDefaults(ctx context.Context) {
+	s.Spec.SetDefaults(ctx)
+}
+
+func (ss *PingSourceSpec) SetDefaults(ctx context.Context) {
+	if ss.Schedule == "" {
+		ss.Schedule = defaultSchedule
+	}
+}
diff --git a/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/ping_lifecycle.go b/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/ping_lifecycle.go
new file mode 100644
index 00000000..ad934327
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/ping_lifecycle.go
@@ -0,0 +1,117 @@
+/*
+Copyright 2020 The Knative Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1beta1
+
+import (
+	"fmt"
+
+	appsv1 "k8s.io/api/apps/v1"
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"knative.dev/pkg/apis"
+)
+
+const (
+	// PingSourceConditionReady has status True when the PingSource is ready to send events.
+	PingSourceConditionReady = apis.ConditionReady
+
+	// PingSourceConditionSinkProvided has status True when the PingSource has been configured with a sink target.
+	PingSourceConditionSinkProvided apis.ConditionType = "SinkProvided"
+
+	// PingSourceConditionDeployed has status True when the PingSource has had it's receive adapter deployment created.
+	PingSourceConditionDeployed apis.ConditionType = "Deployed"
+)
+
+var PingSourceCondSet = apis.NewLivingConditionSet(
+	PingSourceConditionSinkProvided,
+	PingSourceConditionDeployed)
+
+// GetConditionSet retrieves the condition set for this resource. Implements the KRShaped interface.
+func (*PingSource) GetConditionSet() apis.ConditionSet {
+	return PingSourceCondSet
+}
+
+// PingSourceSource returns the PingSource CloudEvent source.
+func PingSourceSource(namespace, name string) string {
+	return fmt.Sprintf("/apis/v1/namespaces/%s/pingsources/%s", namespace, name)
+}
+
+// GetUntypedSpec returns the spec of the PingSource.
+func (s *PingSource) GetUntypedSpec() interface{} {
+	return s.Spec
+}
+
+// GetGroupVersionKind returns the GroupVersionKind.
+func (s *PingSource) GetGroupVersionKind() schema.GroupVersionKind {
+	return SchemeGroupVersion.WithKind("PingSource")
+}
+
+// GetCondition returns the condition currently associated with the given type, or nil.
+func (s *PingSourceStatus) GetCondition(t apis.ConditionType) *apis.Condition {
+	return PingSourceCondSet.Manage(s).GetCondition(t)
+}
+
+// GetTopLevelCondition returns the top level Condition.
+func (ps *PingSourceStatus) GetTopLevelCondition() *apis.Condition {
+	return PingSourceCondSet.Manage(ps).GetTopLevelCondition()
+}
+
+// IsReady returns true if the resource is ready overall.
+func (s *PingSourceStatus) IsReady() bool {
+	return PingSourceCondSet.Manage(s).IsHappy()
+}
+
+// InitializeConditions sets relevant unset conditions to Unknown state.
+func (s *PingSourceStatus) InitializeConditions() {
+	PingSourceCondSet.Manage(s).InitializeConditions()
+}
+
+// MarkSink sets the condition that the source has a sink configured.
+func (s *PingSourceStatus) MarkSink(uri *apis.URL) {
+	s.SinkURI = uri
+	if uri != nil {
+		PingSourceCondSet.Manage(s).MarkTrue(PingSourceConditionSinkProvided)
+	} else {
+		PingSourceCondSet.Manage(s).MarkFalse(PingSourceConditionSinkProvided, "SinkEmpty", "Sink has resolved to empty.")
+	}
+}
+
+// MarkNoSink sets the condition that the source does not have a sink configured.
+func (s *PingSourceStatus) MarkNoSink(reason, messageFormat string, messageA ...interface{}) {
+	PingSourceCondSet.Manage(s).MarkFalse(PingSourceConditionSinkProvided, reason, messageFormat, messageA...)
+}
+
+// PropagateDeploymentAvailability uses the availability of the provided Deployment to determine if
+// PingSourceConditionDeployed should be marked as true or false.
+func (s *PingSourceStatus) PropagateDeploymentAvailability(d *appsv1.Deployment) {
+	deploymentAvailableFound := false
+	for _, cond := range d.Status.Conditions {
+		if cond.Type == appsv1.DeploymentAvailable {
+			deploymentAvailableFound = true
+			if cond.Status == corev1.ConditionTrue {
+				PingSourceCondSet.Manage(s).MarkTrue(PingSourceConditionDeployed)
+			} else if cond.Status == corev1.ConditionFalse {
+				PingSourceCondSet.Manage(s).MarkFalse(PingSourceConditionDeployed, cond.Reason, cond.Message)
+			} else if cond.Status == corev1.ConditionUnknown {
+				PingSourceCondSet.Manage(s).MarkUnknown(PingSourceConditionDeployed, cond.Reason, cond.Message)
+			}
+		}
+	}
+	if !deploymentAvailableFound {
+		PingSourceCondSet.Manage(s).MarkUnknown(PingSourceConditionDeployed, "DeploymentUnavailable", "The Deployment '%s' is unavailable.", d.Name)
+	}
+}
diff --git a/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/ping_types.go b/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/ping_types.go
new file mode 100644
index 00000000..94781424
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/ping_types.go
@@ -0,0 +1,102 @@
+/*
+Copyright 2020 The Knative Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1beta1
+
+import (
+	"knative.dev/pkg/apis"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	duckv1 "knative.dev/pkg/apis/duck/v1"
+	"knative.dev/pkg/kmeta"
+)
+
+// +genclient
+// +genreconciler
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+// +k8s:defaulter-gen=true
+
+// PingSource is the Schema for the PingSources API.
+type PingSource struct {
+	metav1.TypeMeta   `json:",inline"`
+	metav1.ObjectMeta `json:"metadata,omitempty"`
+
+	Spec   PingSourceSpec   `json:"spec,omitempty"`
+	Status PingSourceStatus `json:"status,omitempty"`
+}
+
+// Check the interfaces that PingSource should be implementing.
+var (
+	_ runtime.Object     = (*PingSource)(nil)
+	_ kmeta.OwnerRefable = (*PingSource)(nil)
+	_ apis.Validatable   = (*PingSource)(nil)
+	_ apis.Defaultable   = (*PingSource)(nil)
+	_ apis.HasSpec       = (*PingSource)(nil)
+	_ duckv1.KRShaped    = (*PingSource)(nil)
+)
+
+// PingSourceSpec defines the desired state of the PingSource.
+type PingSourceSpec struct {
+	// inherits duck/v1 SourceSpec, which currently provides:
+	// * Sink - a reference to an object that will resolve to a domain name or
+	//   a URI directly to use as the sink.
+	// * CloudEventOverrides - defines overrides to control the output format
+	//   and modifications of the event sent to the sink.
+	duckv1.SourceSpec `json:",inline"`
+
+	// Schedule is the cronjob schedule. Defaults to `* * * * *`.
+	// +optional
+	Schedule string `json:"schedule,omitempty"`
+
+	// Timezone modifies the actual time relative to the specified timezone.
+	// Defaults to the system time zone.
+	// More general information about time zones: https://www.iana.org/time-zones
+	// List of valid timezone values: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
+	Timezone string `json:"timezone,omitempty`
+
+	// JsonData is json encoded data used as the body of the event posted to
+	// the sink. Default is empty. If set, datacontenttype will also be set
+	// to "application/json".
+	// +optional
+	JsonData string `json:"jsonData,omitempty"`
+}
+
+// PingSourceStatus defines the observed state of PingSource.
+type PingSourceStatus struct {
+	// inherits duck/v1 SourceStatus, which currently provides:
+	// * ObservedGeneration - the 'Generation' of the Service that was last
+	//   processed by the controller.
+	// * Conditions - the latest available observations of a resource's current
+	//   state.
+	// * SinkURI - the current active sink URI that has been configured for the
+	//   Source.
+	duckv1.SourceStatus `json:",inline"`
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// PingSourceList contains a list of PingSources.
+type PingSourceList struct {
+	metav1.TypeMeta `json:",inline"`
+	metav1.ListMeta `json:"metadata,omitempty"`
+	Items           []PingSource `json:"items"`
+}
+
+// GetStatus retrieves the status of the PingSource. Implements the KRShaped interface.
+func (p *PingSource) GetStatus() *duckv1.Status {
+	return &p.Status.Status
+}
diff --git a/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/ping_validation.go b/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/ping_validation.go
new file mode 100644
index 00000000..e65ceacb
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/ping_validation.go
@@ -0,0 +1,53 @@
+/*
+Copyright 2020 The Knative Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1beta1
+
+import (
+	"context"
+	"strings"
+
+	"github.com/robfig/cron/v3"
+	"knative.dev/pkg/apis"
+)
+
+func (c *PingSource) Validate(ctx context.Context) *apis.FieldError {
+	return c.Spec.Validate(ctx).ViaField("spec")
+}
+
+func (cs *PingSourceSpec) Validate(ctx context.Context) *apis.FieldError {
+	var errs *apis.FieldError
+
+	schedule := cs.Schedule
+	if cs.Timezone != "" {
+		schedule = "CRON_TZ=" + cs.Timezone + " " + schedule
+	}
+
+	if _, err := cron.ParseStandard(schedule); err != nil {
+		if strings.HasPrefix(err.Error(), "provided bad location") {
+			fe := apis.ErrInvalidValue(err, "timezone")
+			errs = errs.Also(fe)
+		} else {
+			fe := apis.ErrInvalidValue(err, "schedule")
+			errs = errs.Also(fe)
+		}
+	}
+
+	if fe := cs.Sink.Validate(ctx); fe != nil {
+		errs = errs.Also(fe.ViaField("sink"))
+	}
+	return errs
+}
diff --git a/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/zz_generated.deepcopy.go b/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/zz_generated.deepcopy.go
index 74fd3d49..c749fddb 100644
--- a/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/zz_generated.deepcopy.go
+++ b/vendor/knative.dev/eventing/pkg/apis/sources/v1beta1/zz_generated.deepcopy.go
@@ -265,6 +265,101 @@ func (in *ContainerSourceStatus) DeepCopy() *ContainerSourceStatus {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PingSource) DeepCopyInto(out *PingSource) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Spec.DeepCopyInto(&out.Spec)
+	in.Status.DeepCopyInto(&out.Status)
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PingSource.
+func (in *PingSource) DeepCopy() *PingSource {
+	if in == nil {
+		return nil
+	}
+	out := new(PingSource)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PingSource) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PingSourceList) DeepCopyInto(out *PingSourceList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]PingSource, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PingSourceList.
+func (in *PingSourceList) DeepCopy() *PingSourceList {
+	if in == nil {
+		return nil
+	}
+	out := new(PingSourceList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PingSourceList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PingSourceSpec) DeepCopyInto(out *PingSourceSpec) {
+	*out = *in
+	in.SourceSpec.DeepCopyInto(&out.SourceSpec)
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PingSourceSpec.
+func (in *PingSourceSpec) DeepCopy() *PingSourceSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(PingSourceSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PingSourceStatus) DeepCopyInto(out *PingSourceStatus) {
+	*out = *in
+	in.SourceStatus.DeepCopyInto(&out.SourceStatus)
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PingSourceStatus.
+func (in *PingSourceStatus) DeepCopy() *PingSourceStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(PingSourceStatus)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *SinkBinding) DeepCopyInto(out *SinkBinding) {
 	*out = *in
diff --git a/vendor/knative.dev/pkg/apis/contexts.go b/vendor/knative.dev/pkg/apis/contexts.go
index b71878fd..4e8b60d6 100644
--- a/vendor/knative.dev/pkg/apis/contexts.go
+++ b/vendor/knative.dev/pkg/apis/contexts.go
@@ -214,7 +214,8 @@ func IsDifferentNamespaceAllowed(ctx context.Context) bool {
 	return ctx.Value(allowDifferentNamespace{}) != nil
 }
 
-// This is attached to contexts passed to webhook interfaces when the user has request DryRun mode.
+// This is attached to contexts passed to webhook interfaces when the user
+// has requested DryRun mode.
 type isDryRun struct{}
 
 // WithDryRun is used to indicate that this call is in DryRun mode.
diff --git a/vendor/knative.dev/pkg/apis/duck/proxy.go b/vendor/knative.dev/pkg/apis/duck/proxy.go
deleted file mode 100644
index 85a795c3..00000000
--- a/vendor/knative.dev/pkg/apis/duck/proxy.go
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
-Copyright 2018 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 duck
-
-import (
-	"sync"
-
-	"k8s.io/apimachinery/pkg/watch"
-)
-
-// NewProxyWatcher is based on the same concept from Kubernetes apimachinery in 1.12 here:
-//    https://github.com/kubernetes/apimachinery/blob/c6dd271be/pkg/watch/watch.go#L272
-// Replace this copy once we've update our client libraries.
-
-// proxyWatcher lets you wrap your channel in watch.Interface. Threadsafe.
-type proxyWatcher struct {
-	result chan watch.Event
-	stopCh chan struct{}
-
-	mutex   sync.Mutex
-	stopped bool
-}
-
-var _ watch.Interface = (*proxyWatcher)(nil)
-
-// NewProxyWatcher creates new proxyWatcher by wrapping a channel
-func NewProxyWatcher(ch chan watch.Event) watch.Interface {
-	return &proxyWatcher{
-		result:  ch,
-		stopCh:  make(chan struct{}),
-		stopped: false,
-	}
-}
-
-// Stop implements Interface
-func (pw *proxyWatcher) Stop() {
-	pw.mutex.Lock()
-	defer pw.mutex.Unlock()
-	if !pw.stopped {
-		pw.stopped = true
-		close(pw.stopCh)
-	}
-}
-
-// Stopping returns true if Stop() has been called
-func (pw *proxyWatcher) Stopping() bool {
-	pw.mutex.Lock()
-	defer pw.mutex.Unlock()
-	return pw.stopped
-}
-
-// ResultChan implements watch.Interface
-func (pw *proxyWatcher) ResultChan() <-chan watch.Event {
-	return pw.result
-}
-
-// StopChan returns stop channel
-func (pw *proxyWatcher) StopChan() <-chan struct{} {
-	return pw.stopCh
-}
diff --git a/vendor/knative.dev/pkg/apis/duck/typed.go b/vendor/knative.dev/pkg/apis/duck/typed.go
index 5e1644a9..d6fa0345 100644
--- a/vendor/knative.dev/pkg/apis/duck/typed.go
+++ b/vendor/knative.dev/pkg/apis/duck/typed.go
@@ -134,6 +134,6 @@ func AsStructuredWatcher(wf cache.WatchFunc, obj runtime.Object) cache.WatchFunc
 			}
 		}()
 
-		return NewProxyWatcher(structuredCh), nil
+		return watch.NewProxyWatcher(structuredCh), nil
 	}
 }
diff --git a/vendor/knative.dev/pkg/apis/volatile_time.go b/vendor/knative.dev/pkg/apis/volatile_time.go
index d735ada9..b114294b 100644
--- a/vendor/knative.dev/pkg/apis/volatile_time.go
+++ b/vendor/knative.dev/pkg/apis/volatile_time.go
@@ -29,7 +29,7 @@ import (
 // Note, go-cmp will still return inequality, see unit test if you
 // need this behavior for go-cmp.
 type VolatileTime struct {
-	Inner metav1.Time
+	Inner metav1.Time `json:",inline"`
 }
 
 // MarshalJSON implements the json.Marshaler interface.
diff --git a/vendor/knative.dev/pkg/ptr/ptr.go b/vendor/knative.dev/pkg/ptr/ptr.go
index a3bfef85..6d5eeaab 100644
--- a/vendor/knative.dev/pkg/ptr/ptr.go
+++ b/vendor/knative.dev/pkg/ptr/ptr.go
@@ -30,6 +30,18 @@ func Int64(i int64) *int64 {
 	return &i
 }
 
+// Float32 is a helper for turning floats into pointers for use in
+// API types that want *float32.
+func Float32(f float32) *float32 {
+	return &f
+}
+
+// Float64 is a helper for turning floats into pointers for use in
+// API types that want *float64.
+func Float64(f float64) *float64 {
+	return &f
+}
+
 // Bool is a helper for turning bools into pointers for use in
 // API types that want *bool.
 func Bool(b bool) *bool {
diff --git a/vendor/knative.dev/serving/pkg/apis/autoscaling/v1alpha1/pa_lifecycle.go b/vendor/knative.dev/serving/pkg/apis/autoscaling/v1alpha1/pa_lifecycle.go
index 2d424874..0f8393f8 100644
--- a/vendor/knative.dev/serving/pkg/apis/autoscaling/v1alpha1/pa_lifecycle.go
+++ b/vendor/knative.dev/serving/pkg/apis/autoscaling/v1alpha1/pa_lifecycle.go
@@ -31,6 +31,7 @@ import (
 var podCondSet = apis.NewLivingConditionSet(
 	PodAutoscalerConditionActive,
 	PodAutoscalerConditionScaleTargetInitialized,
+	PodAutoscalerSKSReady,
 )
 
 // GetConditionSet retrieves the condition set for this resource. Implements the KRShaped interface.
@@ -185,6 +186,16 @@ func (pas *PodAutoscalerStatus) MarkScaleTargetInitialized() {
 	podCondSet.Manage(pas).MarkTrue(PodAutoscalerConditionScaleTargetInitialized)
 }
 
+// MarkSKSReady marks the PA condition denoting that SKS is ready.
+func (pas *PodAutoscalerStatus) MarkSKSReady() {
+	podCondSet.Manage(pas).MarkTrue(PodAutoscalerSKSReady)
+}
+
+// MarkSKSNotReady marks the PA condation that SKS is not yet ready.
+func (pas *PodAutoscalerStatus) MarkSKSNotReady(mes string) {
+	podCondSet.Manage(pas).MarkUnknown(PodAutoscalerSKSReady, "NotReady", mes)
+}
+
 // GetCondition gets the condition `t`.
 func (pas *PodAutoscalerStatus) GetCondition(t apis.ConditionType) *apis.Condition {
 	return podCondSet.Manage(pas).GetCondition(t)
@@ -224,37 +235,32 @@ func (pas *PodAutoscalerStatus) MarkResourceFailedCreation(kind, name string) {
 		fmt.Sprintf("Failed to create %s %q.", kind, name))
 }
 
-// CanScaleToZero checks whether the pod autoscaler has been in an inactive state
-// for at least the specified grace period.
-func (pas *PodAutoscalerStatus) CanScaleToZero(now time.Time, gracePeriod time.Duration) bool {
-	return pas.InactiveFor(now) >= gracePeriod
-}
-
 // InactiveFor returns the time PA spent being inactive.
 func (pas *PodAutoscalerStatus) InactiveFor(now time.Time) time.Duration {
-	return pas.inStatusFor(corev1.ConditionFalse, now, 0)
+	return pas.inStatusFor(corev1.ConditionFalse, now)
 }
 
 // ActiveFor returns the time PA spent being active.
 func (pas *PodAutoscalerStatus) ActiveFor(now time.Time) time.Duration {
-	return pas.inStatusFor(corev1.ConditionTrue, now, 0)
+	return pas.inStatusFor(corev1.ConditionTrue, now)
 }
 
 // CanFailActivation checks whether the pod autoscaler has been activating
 // for at least the specified idle period.
 func (pas *PodAutoscalerStatus) CanFailActivation(now time.Time, idlePeriod time.Duration) bool {
-	return pas.inStatusFor(corev1.ConditionUnknown, now, idlePeriod) > 0
+	return pas.inStatusFor(corev1.ConditionUnknown, now) > idlePeriod
 }
 
-// inStatusFor returns positive duration if the PodAutoscalerStatus's Active condition has stayed in
-// the specified status for at least the specified duration. Otherwise it returns negative duration,
-// including when the status is undetermined (Active condition is not found.)
-func (pas *PodAutoscalerStatus) inStatusFor(status corev1.ConditionStatus, now time.Time, dur time.Duration) time.Duration {
+// inStatusFor returns the duration that the PodAutoscalerStatus's Active
+// condition has stayed in the specified status.
+// inStatusFor will return -1 if condition is not initialized or current
+// status is different.
+func (pas *PodAutoscalerStatus) inStatusFor(status corev1.ConditionStatus, now time.Time) time.Duration {
 	cond := pas.GetCondition(PodAutoscalerConditionActive)
 	if cond == nil || cond.Status != status {
 		return -1
 	}
-	return now.Sub(cond.LastTransitionTime.Inner.Add(dur))
+	return now.Sub(cond.LastTransitionTime.Inner.Time)
 }
 
 // GetDesiredScale returns the desired scale if ever set, or -1.
diff --git a/vendor/knative.dev/serving/pkg/apis/autoscaling/v1alpha1/pa_types.go b/vendor/knative.dev/serving/pkg/apis/autoscaling/v1alpha1/pa_types.go
index 163189ec..ac8dd277 100644
--- a/vendor/knative.dev/serving/pkg/apis/autoscaling/v1alpha1/pa_types.go
+++ b/vendor/knative.dev/serving/pkg/apis/autoscaling/v1alpha1/pa_types.go
@@ -117,6 +117,8 @@ const (
 	PodAutoscalerConditionScaleTargetInitialized apis.ConditionType = "ScaleTargetInitialized"
 	// PodAutoscalerConditionActive is set when the PodAutoscaler's ScaleTargetRef is receiving traffic.
 	PodAutoscalerConditionActive apis.ConditionType = "Active"
+	// PodAutoscalerCondtionDependenciesReady is set when SKS is ready.
+	PodAutoscalerSKSReady = "SKSReady"
 )
 
 // PodAutoscalerStatus communicates the observed state of the PodAutoscaler (from the controller).
diff --git a/vendor/knative.dev/serving/pkg/apis/config/features.go b/vendor/knative.dev/serving/pkg/apis/config/features.go
index c2f47127..bd33649d 100644
--- a/vendor/knative.dev/serving/pkg/apis/config/features.go
+++ b/vendor/knative.dev/serving/pkg/apis/config/features.go
@@ -43,7 +43,7 @@ func defaultFeaturesConfig() *Features {
 		MultiContainer:       Disabled,
 		PodSpecAffinity:      Disabled,
 		PodSpecFieldRef:      Disabled,
-		PodSpecDryRun:        Enabled,
+		PodSpecDryRun:        Allowed,
 		PodSpecNodeSelector:  Disabled,
 		PodSpecTolerations:   Disabled,
 		ResponsiveRevisionGC: Disabled,
diff --git a/vendor/knative.dev/serving/pkg/apis/serving/metadata_validation.go b/vendor/knative.dev/serving/pkg/apis/serving/metadata_validation.go
index a4eef1b3..0af0e595 100644
--- a/vendor/knative.dev/serving/pkg/apis/serving/metadata_validation.go
+++ b/vendor/knative.dev/serving/pkg/apis/serving/metadata_validation.go
@@ -40,6 +40,7 @@ var (
 		RoutingStateModifiedAnnotationKey,
 		GroupNamePrefix+"forceUpgrade",
 		RevisionPreservedAnnotationKey,
+		RoutesAnnotationKey,
 	)
 )
 
diff --git a/vendor/knative.dev/serving/pkg/apis/serving/register.go b/vendor/knative.dev/serving/pkg/apis/serving/register.go
index 48120c81..94eb21ce 100644
--- a/vendor/knative.dev/serving/pkg/apis/serving/register.go
+++ b/vendor/knative.dev/serving/pkg/apis/serving/register.go
@@ -47,6 +47,10 @@ const (
 	// triggered their creation.
 	RouteLabelKey = GroupName + "/route"
 
+	// RoutesAnnotationKey is an annotation attached to a Revision to indicate that it is
+	// referenced by one or many routes. The value is a comma separated list of Route names.
+	RoutesAnnotationKey = GroupName + "/routes"
+
 	// RoutingStateLabelKey is the label attached to a Revision indicating
 	// its state in relation to serving a Route.
 	RoutingStateLabelKey = GroupName + "/routingState"
diff --git a/vendor/knative.dev/serving/pkg/apis/serving/v1/configuration_validation.go b/vendor/knative.dev/serving/pkg/apis/serving/v1/configuration_validation.go
index c273d2ae..cc5a3811 100644
--- a/vendor/knative.dev/serving/pkg/apis/serving/v1/configuration_validation.go
+++ b/vendor/knative.dev/serving/pkg/apis/serving/v1/configuration_validation.go
@@ -73,14 +73,17 @@ func (csf *ConfigurationStatusFields) Validate(ctx context.Context) *apis.FieldE
 // validateLabels function validates configuration labels
 func (c *Configuration) validateLabels() (errs *apis.FieldError) {
 	for key, val := range c.GetLabels() {
-		switch {
-		case key == serving.VisibilityLabelKey:
+		switch key {
+		case serving.RouteLabelKey:
+			// Known valid labels.
+		case serving.VisibilityLabelKey:
 			errs = errs.Also(validateClusterVisibilityLabel(val))
-		case key == serving.RouteLabelKey:
-		case key == serving.ServiceLabelKey:
+		case serving.ServiceLabelKey:
 			errs = errs.Also(verifyLabelOwnerRef(val, serving.ServiceLabelKey, "Service", c.GetOwnerReferences()))
-		case strings.HasPrefix(key, serving.GroupNamePrefix):
-			errs = errs.Also(apis.ErrInvalidKeyName(key, apis.CurrentField))
+		default:
+			if strings.HasPrefix(key, serving.GroupNamePrefix) {
+				errs = errs.Also(apis.ErrInvalidKeyName(key, apis.CurrentField))
+			}
 		}
 	}
 	return
diff --git a/vendor/knative.dev/serving/pkg/apis/serving/v1/revision_helpers.go b/vendor/knative.dev/serving/pkg/apis/serving/v1/revision_helpers.go
index a87d8614..aed77f37 100644
--- a/vendor/knative.dev/serving/pkg/apis/serving/v1/revision_helpers.go
+++ b/vendor/knative.dev/serving/pkg/apis/serving/v1/revision_helpers.go
@@ -113,7 +113,7 @@ func (rs *RevisionSpec) GetContainer() *corev1.Container {
 // routingStateModified annotation.
 func (r *Revision) SetRoutingState(state RoutingState, clock clock.Clock) {
 	stateStr := string(state)
-	if t := r.ObjectMeta.Annotations[serving.RoutingStateModifiedAnnotationKey]; t != "" &&
+	if t := r.Annotations[serving.RoutingStateModifiedAnnotationKey]; t != "" &&
 		r.Labels[serving.RoutingStateLabelKey] == stateStr {
 		return // Don't update timestamp if no change.
 	}
@@ -134,12 +134,12 @@ func RoutingStateModifiedString(clock clock.Clock) string {
 
 // GetRoutingState retrieves the RoutingState label.
 func (r *Revision) GetRoutingState() RoutingState {
-	return RoutingState(r.ObjectMeta.Labels[serving.RoutingStateLabelKey])
+	return RoutingState(r.Labels[serving.RoutingStateLabelKey])
 }
 
 // GetRoutingStateModified retrieves the RoutingStateModified annotation.
 func (r *Revision) GetRoutingStateModified() time.Time {
-	val := r.ObjectMeta.Annotations[serving.RoutingStateModifiedAnnotationKey]
+	val := r.Annotations[serving.RoutingStateModifiedAnnotationKey]
 	if val == "" {
 		return time.Time{}
 	}
@@ -152,7 +152,8 @@ func (r *Revision) GetRoutingStateModified() time.Time {
 
 // IsReachable returns whether or not the revision can be reached by a route.
 func (r *Revision) IsReachable() bool {
-	return r.ObjectMeta.Labels[serving.RouteLabelKey] != ""
+	return r.Labels[serving.RouteLabelKey] != "" ||
+		RoutingState(r.Labels[serving.RoutingStateLabelKey]) == RoutingStateActive
 }
 
 // GetProtocol returns the app level network protocol.
@@ -174,11 +175,11 @@ func (r *Revision) GetProtocol() (p net.ProtocolType) {
 // SetLastPinned sets the revision's last pinned annotations
 // to be the specified time.
 func (r *Revision) SetLastPinned(t time.Time) {
-	if r.ObjectMeta.Annotations == nil {
-		r.ObjectMeta.Annotations = make(map[string]string, 1)
+	if r.Annotations == nil {
+		r.Annotations = make(map[string]string, 1)
 	}
 
-	r.ObjectMeta.Annotations[serving.RevisionLastPinnedAnnotationKey] = RevisionLastPinnedString(t)
+	r.Annotations[serving.RevisionLastPinnedAnnotationKey] = RevisionLastPinnedString(t)
 }
 
 // GetLastPinned returns the time the revision was last pinned.
@@ -189,7 +190,7 @@ func (r *Revision) GetLastPinned() (time.Time, error) {
 		}
 	}
 
-	str, ok := r.ObjectMeta.Annotations[serving.RevisionLastPinnedAnnotationKey]
+	str, ok := r.Annotations[serving.RevisionLastPinnedAnnotationKey]
 	if !ok {
 		// If a revision is past the create delay without an annotation it is stale.
 		return time.Time{}, LastPinnedParseError{
diff --git a/vendor/knative.dev/serving/pkg/apis/serving/v1/revision_validation.go b/vendor/knative.dev/serving/pkg/apis/serving/v1/revision_validation.go
index 3d12032b..010fb853 100644
--- a/vendor/knative.dev/serving/pkg/apis/serving/v1/revision_validation.go
+++ b/vendor/knative.dev/serving/pkg/apis/serving/v1/revision_validation.go
@@ -120,10 +120,11 @@ func (rs *RevisionStatus) Validate(ctx context.Context) *apis.FieldError {
 func (r *Revision) ValidateLabels() (errs *apis.FieldError) {
 	for key, val := range r.GetLabels() {
 		switch key {
-		case serving.RoutingStateLabelKey:
-		case serving.RouteLabelKey:
-		case serving.ServiceLabelKey:
-		case serving.ConfigurationGenerationLabelKey:
+		case serving.RoutingStateLabelKey,
+			serving.RouteLabelKey,
+			serving.ServiceLabelKey,
+			serving.ConfigurationGenerationLabelKey:
+			// Known valid labels.
 		case serving.ConfigurationLabelKey:
 			errs = errs.Also(verifyLabelOwnerRef(val, serving.ConfigurationLabelKey, "Configuration", r.GetOwnerReferences()))
 		default:
diff --git a/vendor/knative.dev/serving/pkg/apis/serving/v1/route_validation.go b/vendor/knative.dev/serving/pkg/apis/serving/v1/route_validation.go
index a6b35dcc..e9d2ba2f 100644
--- a/vendor/knative.dev/serving/pkg/apis/serving/v1/route_validation.go
+++ b/vendor/knative.dev/serving/pkg/apis/serving/v1/route_validation.go
@@ -216,13 +216,15 @@ func validateClusterVisibilityLabel(label string) (errs *apis.FieldError) {
 // validateLabels function validates route labels.
 func (r *Route) validateLabels() (errs *apis.FieldError) {
 	for key, val := range r.GetLabels() {
-		switch {
-		case key == serving.VisibilityLabelKey:
+		switch key {
+		case serving.VisibilityLabelKey:
 			errs = errs.Also(validateClusterVisibilityLabel(val))
-		case key == serving.ServiceLabelKey:
+		case serving.ServiceLabelKey:
 			errs = errs.Also(verifyLabelOwnerRef(val, serving.ServiceLabelKey, "Service", r.GetOwnerReferences()))
-		case strings.HasPrefix(key, serving.GroupNamePrefix):
-			errs = errs.Also(apis.ErrInvalidKeyName(key, apis.CurrentField))
+		default:
+			if strings.HasPrefix(key, serving.GroupNamePrefix) {
+				errs = errs.Also(apis.ErrInvalidKeyName(key, apis.CurrentField))
+			}
 		}
 	}
 	return
diff --git a/vendor/knative.dev/serving/pkg/apis/serving/v1alpha1/revision_lifecycle.go b/vendor/knative.dev/serving/pkg/apis/serving/v1alpha1/revision_lifecycle.go
index 811a8119..363a48db 100644
--- a/vendor/knative.dev/serving/pkg/apis/serving/v1alpha1/revision_lifecycle.go
+++ b/vendor/knative.dev/serving/pkg/apis/serving/v1alpha1/revision_lifecycle.go
@@ -286,11 +286,11 @@ func RevisionLastPinnedString(t time.Time) string {
 }
 
 func (r *Revision) SetLastPinned(t time.Time) {
-	if r.ObjectMeta.Annotations == nil {
-		r.ObjectMeta.Annotations = make(map[string]string, 1)
+	if r.Annotations == nil {
+		r.Annotations = make(map[string]string, 1)
 	}
 
-	r.ObjectMeta.Annotations[serving.RevisionLastPinnedAnnotationKey] = RevisionLastPinnedString(t)
+	r.Annotations[serving.RevisionLastPinnedAnnotationKey] = RevisionLastPinnedString(t)
 }
 
 func (r *Revision) GetLastPinned() (time.Time, error) {
@@ -300,7 +300,7 @@ func (r *Revision) GetLastPinned() (time.Time, error) {
 		}
 	}
 
-	str, ok := r.ObjectMeta.Annotations[serving.RevisionLastPinnedAnnotationKey]
+	str, ok := r.Annotations[serving.RevisionLastPinnedAnnotationKey]
 	if !ok {
 		// If a revision is past the create delay without an annotation it is stale
 		return time.Time{}, LastPinnedParseError{
@@ -320,11 +320,6 @@ func (r *Revision) GetLastPinned() (time.Time, error) {
 	return time.Unix(secs, 0), nil
 }
 
-// IsReachable returns whether or not the revision can be reached by a route.
-func (r *Revision) IsReachable() bool {
-	return r.ObjectMeta.Labels[serving.RouteLabelKey] != ""
-}
-
 // PropagateDeploymentStatus takes the Deployment status and applies its values
 // to the Revision status.
 func (rs *RevisionStatus) PropagateDeploymentStatus(original *appsv1.DeploymentStatus) {
diff --git a/vendor/knative.dev/serving/pkg/apis/serving/v1beta1/configuration_validation.go b/vendor/knative.dev/serving/pkg/apis/serving/v1beta1/configuration_validation.go
index c896cab9..fbc2a966 100644
--- a/vendor/knative.dev/serving/pkg/apis/serving/v1beta1/configuration_validation.go
+++ b/vendor/knative.dev/serving/pkg/apis/serving/v1beta1/configuration_validation.go
@@ -58,14 +58,17 @@ func (c *Configuration) Validate(ctx context.Context) (errs *apis.FieldError) {
 // validateLabels function validates configuration labels
 func (c *Configuration) validateLabels() (errs *apis.FieldError) {
 	for key, val := range c.GetLabels() {
-		switch {
-		case key == serving.VisibilityLabelKey:
+		switch key {
+		case serving.RouteLabelKey:
+			// Known valid labels.
+		case serving.VisibilityLabelKey:
 			errs = errs.Also(serving.ValidateClusterVisibilityLabel(val))
-		case key == serving.RouteLabelKey:
-		case key == serving.ServiceLabelKey:
+		case serving.ServiceLabelKey:
 			errs = errs.Also(verifyLabelOwnerRef(val, serving.ServiceLabelKey, "Service", c.GetOwnerReferences()))
-		case strings.HasPrefix(key, serving.GroupNamePrefix):
-			errs = errs.Also(apis.ErrInvalidKeyName(key, apis.CurrentField))
+		default:
+			if strings.HasPrefix(key, serving.GroupNamePrefix) {
+				errs = errs.Also(apis.ErrInvalidKeyName(key, apis.CurrentField))
+			}
 		}
 	}
 	return
diff --git a/vendor/knative.dev/serving/pkg/apis/serving/v1beta1/revision_validation.go b/vendor/knative.dev/serving/pkg/apis/serving/v1beta1/revision_validation.go
index 974e42a9..426ee376 100644
--- a/vendor/knative.dev/serving/pkg/apis/serving/v1beta1/revision_validation.go
+++ b/vendor/knative.dev/serving/pkg/apis/serving/v1beta1/revision_validation.go
@@ -56,12 +56,17 @@ func (r *Revision) Validate(ctx context.Context) *apis.FieldError {
 // ValidateLabels function validates service labels
 func (r *Revision) ValidateLabels() (errs *apis.FieldError) {
 	for key, val := range r.GetLabels() {
-		switch {
-		case key == serving.RouteLabelKey || key == serving.ServiceLabelKey || key == serving.ConfigurationGenerationLabelKey:
-		case key == serving.ConfigurationLabelKey:
+		switch key {
+		case serving.RouteLabelKey,
+			serving.ServiceLabelKey,
+			serving.ConfigurationGenerationLabelKey:
+			// Known valid labels.
+		case serving.ConfigurationLabelKey:
 			errs = errs.Also(verifyLabelOwnerRef(val, serving.ConfigurationLabelKey, "Configuration", r.GetOwnerReferences()))
-		case strings.HasPrefix(key, serving.GroupNamePrefix):
-			errs = errs.Also(apis.ErrInvalidKeyName(key, ""))
+		default:
+			if strings.HasPrefix(key, serving.GroupNamePrefix) {
+				errs = errs.Also(apis.ErrInvalidKeyName(key, ""))
+			}
 		}
 	}
 	return
diff --git a/vendor/knative.dev/serving/pkg/apis/serving/v1beta1/route_validation.go b/vendor/knative.dev/serving/pkg/apis/serving/v1beta1/route_validation.go
index 787c4bc5..cd283217 100644
--- a/vendor/knative.dev/serving/pkg/apis/serving/v1beta1/route_validation.go
+++ b/vendor/knative.dev/serving/pkg/apis/serving/v1beta1/route_validation.go
@@ -46,13 +46,15 @@ func (r *Route) Validate(ctx context.Context) *apis.FieldError {
 // validateLabels function validates route labels.
 func (r *Route) validateLabels() (errs *apis.FieldError) {
 	for key, val := range r.GetLabels() {
-		switch {
-		case key == serving.VisibilityLabelKey:
+		switch key {
+		case serving.VisibilityLabelKey:
 			errs = errs.Also(serving.ValidateClusterVisibilityLabel(val))
-		case key == serving.ServiceLabelKey:
+		case serving.ServiceLabelKey:
 			errs = errs.Also(verifyLabelOwnerRef(val, serving.ServiceLabelKey, "Service", r.GetOwnerReferences()))
-		case strings.HasPrefix(key, serving.GroupNamePrefix):
-			errs = errs.Also(apis.ErrInvalidKeyName(key, apis.CurrentField))
+		default:
+			if strings.HasPrefix(key, serving.GroupNamePrefix) {
+				errs = errs.Also(apis.ErrInvalidKeyName(key, apis.CurrentField))
+			}
 		}
 	}
 	return
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 7ec11f45..caef97b0 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -1,4 +1,4 @@
-# cloud.google.com/go v0.61.0
+# cloud.google.com/go v0.62.0
 cloud.google.com/go/compute/metadata
 # github.com/PuerkitoBio/purell v1.1.1
 github.com/PuerkitoBio/purell
@@ -138,7 +138,7 @@ go.uber.org/zap/internal/bufferpool
 go.uber.org/zap/internal/color
 go.uber.org/zap/internal/exit
 go.uber.org/zap/zapcore
-# golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899
+# golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de
 ## explicit
 golang.org/x/crypto/ssh/terminal
 # golang.org/x/mod v0.3.0
@@ -157,7 +157,7 @@ golang.org/x/oauth2/google
 golang.org/x/oauth2/internal
 golang.org/x/oauth2/jws
 golang.org/x/oauth2/jwt
-# golang.org/x/sys v0.0.0-20200722175500-76b94024e4b6
+# golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1
 golang.org/x/sys/internal/unsafeheader
 golang.org/x/sys/unix
 golang.org/x/sys/windows
@@ -175,7 +175,7 @@ golang.org/x/text/unicode/norm
 golang.org/x/text/width
 # golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e
 golang.org/x/time/rate
-# golang.org/x/tools v0.0.0-20200723000907-a7c6fd066f6d
+# golang.org/x/tools v0.0.0-20200731060945-b5fad4ed8dd6
 golang.org/x/tools/go/ast/astutil
 golang.org/x/tools/imports
 golang.org/x/tools/internal/event
@@ -605,7 +605,7 @@ k8s.io/kube-openapi/pkg/util/sets
 k8s.io/utils/buffer
 k8s.io/utils/integer
 k8s.io/utils/trace
-# knative.dev/eventing v0.16.1-0.20200724032657-8d83431c07bd
+# knative.dev/eventing v0.16.1-0.20200803090001-4cd17b80636f
 ## explicit
 knative.dev/eventing/pkg/apis/config
 knative.dev/eventing/pkg/apis/configs
@@ -633,11 +633,11 @@ knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1beta1/fake
 knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1alpha2
 knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1alpha2/fake
 knative.dev/eventing/pkg/logging
-# knative.dev/networking v0.0.0-20200723155758-cc457d7322d6
+# knative.dev/networking v0.0.0-20200801232901-0a0cf9380a8d
 knative.dev/networking/pkg/apis/config
 knative.dev/networking/pkg/apis/networking
 knative.dev/networking/pkg/apis/networking/v1alpha1
-# knative.dev/pkg v0.0.0-20200724211057-f21f66204a5c
+# knative.dev/pkg v0.0.0-20200804051227-c3c869a34475
 ## explicit
 knative.dev/pkg/apis
 knative.dev/pkg/apis/duck
@@ -655,7 +655,7 @@ knative.dev/pkg/logging/logkey
 knative.dev/pkg/profiling
 knative.dev/pkg/ptr
 knative.dev/pkg/tracker
-# knative.dev/serving v0.16.1-0.20200724203457-1517b1735305
+# knative.dev/serving v0.16.1-0.20200804124127-08d681889306
 ## explicit
 knative.dev/serving/pkg/apis/autoscaling
 knative.dev/serving/pkg/apis/autoscaling/v1alpha1


Test patch:
diff --git a/pkg/kn/flags/podspec_test.go b/pkg/kn/flags/podspec_test.go
new file mode 100644
index 00000000..2248c361
--- /dev/null
+++ b/pkg/kn/flags/podspec_test.go
@@ -0,0 +1,51 @@
+// 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 flags
+
+import (
+	"testing"
+
+	"github.com/spf13/cobra"
+	"gotest.tools/assert"
+)
+
+func TestPodSpecFlags(t *testing.T) {
+	args := []string{"--image", "repo/user/imageID:tag", "--env", "b=c"}
+	wantedPod := &PodSpecFlags{
+		Image:   "repo/user/imageID:tag",
+		Env:     []string{"b=c"},
+		EnvFrom: []string{},
+		Mount:   []string{},
+		Volume:  []string{},
+		Arg:     []string{},
+	}
+	flags := &PodSpecFlags{}
+	testCmd := &cobra.Command{
+		Use: "test",
+		Run: func(cmd *cobra.Command, args []string) {
+			assert.DeepEqual(t, wantedPod, flags)
+		},
+	}
+	testCmd.SetArgs(args)
+	flags.AddFlags(testCmd.Flags())
+	testCmd.Execute()
+}
+
+func TestUniqueStringArg(t *testing.T) {
+	var a uniqueStringArg
+	a.Set("test")
+	assert.Equal(t, "test", a.String())
+	assert.Equal(t, "string", a.Type())
+}
diff --git a/scripts/test-infra/COMMIT b/scripts/test-infra/COMMIT
index 155930e0..aa24fec0 100644
--- a/scripts/test-infra/COMMIT
+++ b/scripts/test-infra/COMMIT
@@ -1,1 +1,1 @@
-d5ec9cdc6b33bb0040747130db664579553ceb45
+5efff0c4bd0a8438953215dcf1b29a337c43c8c8
diff --git a/scripts/test-infra/e2e-tests.sh b/scripts/test-infra/e2e-tests.sh
index edede650..31aeabfd 100755
--- a/scripts/test-infra/e2e-tests.sh
+++ b/scripts/test-infra/e2e-tests.sh
@@ -79,10 +79,13 @@ function teardown_test_resources() {
 # Run the given E2E tests. Assume tests are tagged e2e, unless `-tags=XXX` is passed.
 # Parameters: $1..$n - any go test flags, then directories containing the tests to run.
 function go_test_e2e() {
-  local test_options=""
-  local go_options=""
-  [[ ! " $@" == *" -tags="* ]] && go_options="-tags=e2e"
-  report_go_test -v -race -count=1 ${go_options} $@ "${test_options}"
+  local go_test_args=()
+  # Remove empty args as `go test` will consider it as running tests for the current directory, which is not expected.
+  for arg in "$@"; do
+    [[ -n "$arg" ]] && go_test_args+=("$arg")
+  done
+  [[ ! " $*" == *" -tags="* ]] && go_test_args+=("-tags=e2e")
+  report_go_test -race -count=1 "${go_test_args[@]}"
 }
 
 # Dumps the k8s api server metrics. Spins up a proxy, waits a little bit and
@@ -93,7 +96,7 @@ function dump_metrics() {
     local proxy_pid=$!
     sleep 5
     header ">> Grabbing k8s metrics"
-    curl -s http://localhost:8080/metrics > ${ARTIFACTS}/k8s.metrics.txt
+    curl -s http://localhost:8080/metrics > "${ARTIFACTS}"/k8s.metrics.txt
     # Clean up proxy so it doesn't interfere with job shutting down
     kill $proxy_pid || true
 }
diff --git a/scripts/test-infra/library.sh b/scripts/test-infra/library.sh
index ce4312c6..5cf23dc4 100755
--- a/scripts/test-infra/library.sh
+++ b/scripts/test-infra/library.sh
@@ -391,43 +391,45 @@ function mktemp_with_extension() {
 #             $2 - check name as an identifier (e.g., GoBuild)
 #             $3 - failure message (can contain newlines), optional (means success)
 function create_junit_xml() {
-  local xml="$(mktemp_with_extension "${ARTIFACTS}"/junit_XXXXXXXX xml)"
+  local xml
+  xml="$(mktemp_with_extension "${ARTIFACTS}"/junit_XXXXXXXX xml)"
+  echo "JUnit file ${xml} is created for reporting the test result"
   run_kntest junit --suite="$1" --name="$2" --err-msg="$3" --dest="${xml}" || return 1
 }
 
 # Runs a go test and generate a junit summary.
 # Parameters: $1... - parameters to go test
 function report_go_test() {
-  # Run tests in verbose mode to capture details.
-  # go doesn't like repeating -v, so remove if passed.
-  local args=" $@ "
-  local go_test="go test -v ${args/ -v / }"
-  # Just run regular go tests if not on Prow.
-  echo "Running tests with '${go_test}'"
-  local report="$(mktemp)"
-  capture_output "${report}" ${go_test}
+  local go_test_args=( "$@" )
+  # Install gotestsum if necessary.
+  run_go_tool gotest.tools/gotestsum gotestsum --help > /dev/null 2>&1
+  # Capture the test output to the report file.
+  local report
+  report="$(mktemp)"
+  local xml
+  xml="$(mktemp_with_extension "${ARTIFACTS}"/junit_XXXXXXXX xml)"
+  echo "Running go test with args: ${go_test_args[*]}"
+  # TODO(chizhg): change to `--format testname`?
+  capture_output "${report}" gotestsum --format standard-verbose \
+    --junitfile "${xml}" --junitfile-testsuite-name relative --junitfile-testcase-classname relative \
+    -- "${go_test_args[@]}"
   local failed=$?
   echo "Finished run, return code is ${failed}"
-  # Install go-junit-report if necessary.
-  run_go_tool github.com/jstemmer/go-junit-report go-junit-report --help > /dev/null 2>&1
-  local xml="$(mktemp_with_extension ${ARTIFACTS}/junit_XXXXXXXX xml)"
-  cat ${report} \
-      | go-junit-report \
-      | sed -e "s#\"\(github\.com/knative\|knative\.dev\)/${REPO_NAME}/#\"#g" \
-      > ${xml}
+
   echo "XML report written to ${xml}"
-  if [[ -n "$(grep '<testsuites></testsuites>' ${xml})" ]]; then
+  if [[ -n "$(grep '<testsuites></testsuites>' "${xml}")" ]]; then
     # XML report is empty, something's wrong; use the output as failure reason
-    create_junit_xml _go_tests "GoTests" "$(cat ${report})"
+    create_junit_xml _go_tests "GoTests" "$(cat "${report}")"
   fi
   # Capture and report any race condition errors
-  local race_errors="$(sed -n '/^WARNING: DATA RACE$/,/^==================$/p' ${report})"
+  local race_errors
+  race_errors="$(sed -n '/^WARNING: DATA RACE$/,/^==================$/p' "${report}")"
   create_junit_xml _go_tests "DataRaceAnalysis" "${race_errors}"
   if (( ! IS_PROW )); then
     # Keep the suffix, so files are related.
     local logfile=${xml/junit_/go_test_}
     logfile=${logfile/.xml/.log}
-    cp ${report} ${logfile}
+    cp "${report}" "${logfile}"
     echo "Test log written to ${logfile}"
   fi
   return ${failed}
@@ -553,16 +555,13 @@ function run_go_tool() {
 function run_kntest() {
   # If the current repo is test-infra, run kntest from source.
   if [[ "${REPO_NAME}" == "test-infra" ]]; then
-    # Each parameter can possibly be in the format of "--xxx yyy", using $@ can automatically split them into multiple positional arguments for the command.
-    # shellcheck disable=SC2068
-    go run "${REPO_ROOT_DIR}"/kntest/cmd/kntest $@
+    go run "${REPO_ROOT_DIR}"/kntest/cmd/kntest "$@"
   # Otherwise kntest must be installed.
   else
     if [[ ! -x "$(command -v kntest)" ]]; then
       echo "--- FAIL: kntest not installed, please clone test-infra repo and run \`go install ./kntest/cmd/kntest\` to install it"; return 1;
     fi
-    # shellcheck disable=SC2068
-    kntest $@
+    kntest "$@"
   fi
 }
 
diff --git a/test/e2e/tekton_test.go b/test/e2e/tekton_test.go
index 99dec1da..a4951ec2 100644
--- a/test/e2e/tekton_test.go
+++ b/test/e2e/tekton_test.go
@@ -17,6 +17,7 @@
 package e2e
 
 import (
+	"fmt"
 	"strings"
 	"testing"
 	"time"
@@ -55,16 +56,16 @@ func TestTektonPipeline(t *testing.T) {
 	_, err = kubectl.Run("apply", "-f", basedir+"/kn-deployer-rbac.yaml")
 	assert.NilError(t, err)
 
-	_, err = kubectl.Run("apply", "-f", "https://raw.githubusercontent.com/tektoncd/catalog/v1beta1/git/git-clone.yaml")
+	_, err = kubectl.Run("apply", "-f", tektonCatalogTask("git-clone", "0.1"))
 	assert.NilError(t, err)
 
 	_, err = kubectl.Run("apply", "-f", basedir+"/resources.yaml")
 	assert.NilError(t, err)
 
-	_, err = kubectl.Run("apply", "-f", "https://raw.githubusercontent.com/tektoncd/catalog/v1beta1/buildah/buildah.yaml")
+	_, err = kubectl.Run("apply", "-f", tektonCatalogTask("buildah", "0.1"))
 	assert.NilError(t, err)
 
-	_, err = kubectl.Run("apply", "-f", "https://raw.githubusercontent.com/tektoncd/catalog/v1beta1/kn/kn.yaml")
+	_, err = kubectl.Run("apply", "-f", tektonCatalogTask("kn", "0.1"))
 	assert.NilError(t, err)
 
 	_, err = kubectl.Run("apply", "-f", basedir+"/kn-pipeline.yaml")
@@ -91,3 +92,11 @@ func waitForPipelineSuccess(k test.Kubectl) error {
 		return strings.Contains(out, "True"), err
 	})
 }
+
+func tektonCatalogTask(taskName, version string) string {
+	return fmt.Sprintf(
+		"https://raw.githubusercontent.com/tektoncd/catalog/"+
+			"master/task/%s/%s/%s.yaml",
+		taskName, version, taskName,
+	)
+}