Repository: knative/client
Pull request #790 (2020-04-08 12:23:42)

Show all revisions when run `service describe -v`
Fixes: #https://github.com/knative/client/issues/789
* The `kn service describe -v` command shows repetitive revisions, because
  the revision would be covered by next one.


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

This pull-request has been approved by: *<a href="https://github.com/knative/client/pull/790#" title="Author self-approved">MIBc</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **evankanderson**
You can assign the PR to them by writing `/assign @evankanderson` in a comment when ready.

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

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

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

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["evankanderson"]} -->
knative-prow-robot: Hi @MIBc. Thanks for your PR.

I'm waiting for a [knative](https://github.com/orgs/knative/people) member to verify that this patch is reasonable to test. If it is, they should reply with `/ok-to-test` on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should [join the org](https://github.com/orgs/knative/people) to skip this step.

Once the patch is verified, the new status will be reflected by the `ok-to-test` label.

I understand the commands that are listed [here](https://go.k8s.io/bot-commands?repo=knative%2Fclient).

<details>

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

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

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[pkg/kn/commands/service/describe.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/790/pull-knative-client-go-coverage/1247864354649411584/artifacts/line-cov.html#file0) | 79.8% | 82.2% | 2.5

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

This pull-request has been approved by: *<a href="https://github.com/knative/client/pull/790#pullrequestreview-390424517" title="Approved">maximilien</a>*, *<a href="https://github.com/knative/client/pull/790#" title="Author self-approved">MIBc</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)~~ [maximilien]

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":[]} -->
MIBc: > I wonder however if we could just change the signature to pass by-value not by-reference, so that a deep copy would not be necessary. Tbh, I don't yet understand why (and if) the called method modifies the revision

I found this [code](https://github.com/knative/client/blob/master/pkg/kn/commands/service/describe.go#L319)will cover the revision. But not create a new `revision` variable.


rhuss: > I found this [code](https://github.com/knative/client/blob/master/pkg/kn/commands/service/describe.go#L319) would cover the revision. But not create a new `revision` variable.

I think I understand (excellent find by the way!), but if we don't move the pointer but the value to the function for extracting the revision description, this should be similar to a copy, or ? (not a deep copy, but I think a shallow copy should be good enough, too).

So changing that function signature from taking a point to taking a value should be good enough, i think.
knative-metrics-robot: The following is the coverage report on the affected files.
Say `/test pull-knative-client-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[pkg/kn/commands/service/describe.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/790/pull-knative-client-go-coverage/1248501049266802689/artifacts/line-cov.html#file0) | 79.8% | 82.2% | 2.5

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

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[pkg/kn/commands/service/describe.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/790/pull-knative-client-go-coverage/1248501930100002818/artifacts/line-cov.html#file0) | 79.8% | 82.2% | 2.5

MIBc: The reason we don't use deep copy is that it cost more time. Right?
knative-prow-robot: @MIBc: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-client-integration-tests | 1a933d60838195c07c0eaf795e2fb9ecade7f7ae | [link](https://prow.knative.dev/view/gcs/knative-prow/pr-logs/pull/knative_client/790/pull-knative-client-integration-tests/1248501930104197120) | `/test pull-knative-client-integration-tests`

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

<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 -->
MIBc: /retest
knative-prow-robot: @MIBc: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-client-integration-tests | 1a933d60838195c07c0eaf795e2fb9ecade7f7ae | [link](https://prow.knative.dev/view/gcs/knative-prow/pr-logs/pull/knative_client/790/pull-knative-client-integration-tests/1248517281168756736) | `/test pull-knative-client-integration-tests`

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

<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 45710307..4e873bab 100644
--- a/CHANGELOG.adoc
+++ b/CHANGELOG.adoc
@@ -18,6 +18,10 @@
 |===
 | | Description | PR
 
+| 🐛
+| Service describe command shows repetitive revisions
+| https://github.com/knative/client/pull/790[#790]
+
 | 🎁
 | Add concurrency-utilization option for `service create` and `service update` (`--concurrency-utilization`)
 | https://github.com/knative/client/pull/788[#788]
@@ -34,6 +38,10 @@
 | Correct error message when updating service
 | https://github.com/knative/client/pull/778[#778]
 
+| 🎁
+| Add `-a` flag as an alias for `--annotation`
+| https://github.com/knative/client/pull/782[#782]
+
 |===
 
 ## v0.13.1 (2020-03-25)
diff --git a/docs/cmd/kn_service_create.md b/docs/cmd/kn_service_create.md
index 90bb04f1..ec8822d4 100644
--- a/docs/cmd/kn_service_create.md
+++ b/docs/cmd/kn_service_create.md
@@ -45,7 +45,7 @@ kn service create NAME --image IMAGE [flags]
 ### Options
 
 ```
-      --annotation stringArray        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-).
+  -a, --annotation stringArray        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-).
       --arg stringArray               Add argument to the container command. Example: --arg myArg1 --arg --myArg2 --arg myArg3=3. You can use this flag multiple times.
       --async                         DEPRECATED: please use --no-wait instead. Create service and don't wait for it to be ready.
       --autoscale-window string       Duration to look back for making auto-scaling decisions. The service is scaled to zero if no request was received in during that time. (eg: 10s)
diff --git a/docs/cmd/kn_service_update.md b/docs/cmd/kn_service_update.md
index c05c30ab..255ae185 100644
--- a/docs/cmd/kn_service_update.md
+++ b/docs/cmd/kn_service_update.md
@@ -38,7 +38,7 @@ kn service update NAME [flags]
 ### Options
 
 ```
-      --annotation stringArray        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-).
+  -a, --annotation stringArray        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-).
       --arg stringArray               Add argument to the container command. Example: --arg myArg1 --arg --myArg2 --arg myArg3=3. You can use this flag multiple times.
       --async                         DEPRECATED: please use --no-wait instead. Update service and don't wait for it to be ready.
       --autoscale-window string       Duration to look back for making auto-scaling decisions. The service is scaled to zero if no request was received in during that time. (eg: 10s)
diff --git a/go.mod b/go.mod
index 9f9859c2..c4c1e0b5 100644
--- a/go.mod
+++ b/go.mod
@@ -21,9 +21,9 @@ require (
 	k8s.io/cli-runtime v0.17.0
 	k8s.io/client-go v0.17.0
 	knative.dev/eventing v0.13.6
-	knative.dev/pkg v0.0.0-20200406231459-466c676678dd
-	knative.dev/serving v0.13.1-0.20200407135959-877f5a24bf41
-	knative.dev/test-infra v0.0.0-20200406223059-a7b18bf0c37b
+	knative.dev/pkg v0.0.0-20200409225505-9147309d5366
+	knative.dev/serving v0.13.2
+	knative.dev/test-infra v0.0.0-20200409221904-5e04d955cdb9
 	sigs.k8s.io/yaml v1.1.0
 )
 
diff --git a/go.sum b/go.sum
index b97bbe03..2d847082 100644
--- a/go.sum
+++ b/go.sum
@@ -1,6 +1,5 @@
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo=
 cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
 cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
 cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
@@ -105,7 +104,6 @@ github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb
 github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk=
 github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
 github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
-github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6vRfwrJatElLBEf0I=
 github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M=
 github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
@@ -145,7 +143,6 @@ github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk=
 github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I=
 github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -162,7 +159,6 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z
 github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
 github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -181,7 +177,6 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM=
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
-github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k=
 github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
 github.com/googleapis/gnostic v0.2.2 h1:DcFegQ7+ECdmkJMfVwWlC+89I4esJ7p8nkGt9ainGDk=
 github.com/googleapis/gnostic v0.2.2/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
@@ -201,7 +196,6 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.4/go.mod h1:vNeuVxBJEsws4ogUvrchl83t
 github.com/grpc-ecosystem/grpc-gateway v1.9.5 h1:UImYN5qQ8tuGpGE16ZmjvcTtTw24zw1QAp/SlnNrZhI=
 github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
 github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk=
 github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
@@ -369,7 +363,6 @@ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
-go.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg=
 go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 go.opencensus.io v0.22.1 h1:8dP3SGL7MPB94crU3bEPplMPe83FI4EouesJUeFHv50=
@@ -437,7 +430,6 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -459,7 +451,6 @@ golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456 h1:ng0gs1AKnRRuEMZoTLLlbOd+C17zUDepwGQBb/n+JVg=
 golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191010194322-b09406accb47 h1:/XfQ9z7ib8eEJX2hdgFTZJ/ntt0swNk5oYBziWeTCvY=
 golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -503,7 +494,6 @@ gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3m
 gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0=
 gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
 gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ=
-google.golang.org/api v0.4.0 h1:KKgc1aqhV8wDPbDzlDtpvyjZFY3vjz85FP7p4wcQUyI=
 google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4=
 google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
@@ -513,14 +503,12 @@ google.golang.org/api v0.10.0 h1:7tmAxx3oKE98VMZ+SBZzvYYWRQ9HODBxmC8mXUsraSQ=
 google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c=
 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 google.golang.org/appengine v1.6.2 h1:j8RI1yW0SkI+paT6uGwMlrMI/6zwYA6/CFil8rxOzGI=
 google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7 h1:ZUjXAXmrAyrmmCPHgCA/vChHcpsX27MZ3yBonD/z1KE=
 google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
@@ -532,7 +520,6 @@ google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBr
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
-google.golang.org/grpc v1.21.0 h1:G+97AoqBnmZIT91cLG/EkCoK9NSelj64P8bOHHNmGn0=
 google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
 google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
 google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
@@ -541,7 +528,6 @@ google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s=
 google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -596,12 +582,12 @@ k8s.io/utils v0.0.0-20191114184206-e782cd3c129f h1:GiPwtSzdP43eI1hpPCbROQCCIgCui
 k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
 knative.dev/eventing v0.13.6 h1:TT2w7qjsMTvYcEfTih7Gzv5Nm0GMLe5Y8dxJG3s1wbM=
 knative.dev/eventing v0.13.6/go.mod h1:UxweNv8yXhsdHJitcb9R6rmfNaUD2DFi9GWwNRyIs58=
-knative.dev/pkg v0.0.0-20200406231459-466c676678dd h1:hmFDW9t22H4nqmVJ1wCGmbvImypGxE8aBBWNCFqr0o8=
-knative.dev/pkg v0.0.0-20200406231459-466c676678dd/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q=
-knative.dev/serving v0.13.1-0.20200407135959-877f5a24bf41 h1:Ls1IM8u3i58i2bfgSziT7CjpguTiueZvrix6XhkUVOM=
-knative.dev/serving v0.13.1-0.20200407135959-877f5a24bf41/go.mod h1:x2n255JS2XBI39tmjZ8CwTxIf9EKNMCrkVuiOttLRm0=
-knative.dev/test-infra v0.0.0-20200406223059-a7b18bf0c37b h1:jNJVW/NLALp95kLLaGPkItIMAmH8nia5BYjhsmOCSwI=
-knative.dev/test-infra v0.0.0-20200406223059-a7b18bf0c37b/go.mod h1:xcdUkMJrLlBswIZqL5zCuBFOC22WIPMQoVX1L35i0vQ=
+knative.dev/pkg v0.0.0-20200409225505-9147309d5366 h1:86q+/OWhTkiAXymH8F2NCoWqQLKuX4y8jntTXVq/PDI=
+knative.dev/pkg v0.0.0-20200409225505-9147309d5366/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q=
+knative.dev/serving v0.13.2 h1:y/XGEVNZeoZ36P7+Xa76ap2r/o9LKXVfxMNiFvxPxTg=
+knative.dev/serving v0.13.2/go.mod h1:x2n255JS2XBI39tmjZ8CwTxIf9EKNMCrkVuiOttLRm0=
+knative.dev/test-infra v0.0.0-20200409221904-5e04d955cdb9 h1:x6htuzuQ7K4AcVAH/uNRf135X7TPac0eaBFyw6SY2qA=
+knative.dev/test-infra v0.0.0-20200409221904-5e04d955cdb9/go.mod h1:xcdUkMJrLlBswIZqL5zCuBFOC22WIPMQoVX1L35i0vQ=
 modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=
 modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=
 modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=
diff --git a/pkg/kn/commands/flags/listprint.go b/pkg/kn/commands/flags/listprint.go
index a19cca49..da73381c 100644
--- a/pkg/kn/commands/flags/listprint.go
+++ b/pkg/kn/commands/flags/listprint.go
@@ -15,11 +15,15 @@
 package flags
 
 import (
+	"io"
+
 	"github.com/spf13/cobra"
+	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/cli-runtime/pkg/genericclioptions"
 
 	"knative.dev/client/pkg/kn/commands"
 	hprinters "knative.dev/client/pkg/printers"
+	"knative.dev/client/pkg/util"
 )
 
 // ListFlags composes common printer flag structs
@@ -56,6 +60,24 @@ func (f *ListPrintFlags) ToPrinter() (hprinters.ResourcePrinter, error) {
 	return p, nil
 }
 
+// Print is to print an Object to a Writer
+func (f *ListPrintFlags) Print(obj runtime.Object, w io.Writer) error {
+	printer, err := f.ToPrinter()
+	if err != nil {
+		return err
+	}
+
+	if f.GenericPrintFlags.OutputFlagSpecified() {
+		unstructuredList, err := util.ToUnstructuredList(obj)
+		if err != nil {
+			return err
+		}
+		return printer.PrintObj(unstructuredList, w)
+	}
+
+	return printer.PrintObj(obj, w)
+}
+
 // AddFlags receives a *cobra.Command reference and binds
 // flags related to humanreadable and template printing.
 func (f *ListPrintFlags) AddFlags(cmd *cobra.Command) {
diff --git a/pkg/kn/commands/service/configuration_edit_flags.go b/pkg/kn/commands/service/configuration_edit_flags.go
index 505fcac3..404eedc4 100644
--- a/pkg/kn/commands/service/configuration_edit_flags.go
+++ b/pkg/kn/commands/service/configuration_edit_flags.go
@@ -225,7 +225,7 @@ func (p *ConfigurationEditFlags) addSharedFlags(command *cobra.Command) {
 		"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().StringArrayVar(&p.Annotations, "annotation", []string{},
+	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-).")
diff --git a/pkg/kn/commands/service/describe.go b/pkg/kn/commands/service/describe.go
index d3041248..7741d343 100644
--- a/pkg/kn/commands/service/describe.go
+++ b/pkg/kn/commands/service/describe.go
@@ -267,7 +267,7 @@ func getRevisionDescriptions(client clientservingv1.KnServingClient, service *se
 			return nil, fmt.Errorf("cannot extract revision from service %s: %v", service.Name, err)
 		}
 		revisionsSeen.Insert(revision.Name)
-		desc, err := newRevisionDesc(revision, &target, service)
+		desc, err := newRevisionDesc(*revision, &target, service)
 		if err != nil {
 			return nil, err
 		}
@@ -302,7 +302,7 @@ func completeWithLatestRevisions(client clientservingv1.KnServingClient, service
 		if err != nil {
 			return nil, err
 		}
-		newDesc, err := newRevisionDesc(rev, nil, service)
+		newDesc, err := newRevisionDesc(*rev, nil, service)
 		if err != nil {
 			return nil, err
 		}
@@ -321,7 +321,7 @@ func completeWithUntargetedRevisions(client clientservingv1.KnServingClient, ser
 			continue
 		}
 		revisionsSeen.Insert(revision.Name)
-		newDesc, err := newRevisionDesc(&revision, nil, service)
+		newDesc, err := newRevisionDesc(revision, nil, service)
 		if err != nil {
 			return nil, err
 		}
@@ -331,13 +331,13 @@ func completeWithUntargetedRevisions(client clientservingv1.KnServingClient, ser
 	return descs, nil
 }
 
-func newRevisionDesc(revision *servingv1.Revision, target *servingv1.TrafficTarget, service *servingv1.Service) (*revisionDesc, error) {
+func newRevisionDesc(revision servingv1.Revision, target *servingv1.TrafficTarget, service *servingv1.Service) (*revisionDesc, error) {
 	generation, err := strconv.ParseInt(revision.Labels[serving.ConfigurationGenerationLabelKey], 0, 0)
 	if err != nil {
 		return nil, fmt.Errorf("cannot extract configuration generation for revision %s: %v", revision.Name, err)
 	}
 	revisionDesc := revisionDesc{
-		revision:                revision,
+		revision:                &revision,
 		configurationGeneration: int(generation),
 		latestCreated:           revision.Name == service.Status.LatestCreatedRevisionName,
 		latestReady:             revision.Name == service.Status.LatestReadyRevisionName,
diff --git a/pkg/kn/commands/service/list.go b/pkg/kn/commands/service/list.go
index 50cc13e1..10a3308c 100644
--- a/pkg/kn/commands/service/list.go
+++ b/pkg/kn/commands/service/list.go
@@ -65,11 +65,6 @@ func NewServiceListCommand(p *commands.KnParams) *cobra.Command {
 				serviceListFlags.EnsureWithNamespace()
 			}
 
-			printer, err := serviceListFlags.ToPrinter()
-			if err != nil {
-				return err
-			}
-
 			// Sort serviceList by namespace and name (in this order)
 			sort.SliceStable(serviceList.Items, func(i, j int) bool {
 				a := serviceList.Items[i]
@@ -81,11 +76,7 @@ func NewServiceListCommand(p *commands.KnParams) *cobra.Command {
 				return a.ObjectMeta.Name < b.ObjectMeta.Name
 			})
 
-			err = printer.PrintObj(serviceList, cmd.OutOrStdout())
-			if err != nil {
-				return err
-			}
-			return nil
+			return serviceListFlags.Print(serviceList, cmd.OutOrStdout())
 		},
 	}
 	commands.AddNamespaceFlags(serviceListCommand.Flags(), true)
diff --git a/pkg/kn/commands/version/version.go b/pkg/kn/commands/version/version.go
index 7d243815..7d5149d7 100644
--- a/pkg/kn/commands/version/version.go
+++ b/pkg/kn/commands/version/version.go
@@ -31,12 +31,12 @@ var GitRevision string
 // update this var as we add more deps
 var apiVersions = map[string][]string{
 	"serving": {
-		"serving.knative.dev/v1 (knative-serving v0.13.0)",
+		"serving.knative.dev/v1 (knative-serving v0.13.2)",
 	},
 	"eventing": {
-		"sources.eventing.knative.dev/v1alpha1 (knative-eventing v0.13.1)",
-		"sources.eventing.knative.dev/v1alpha2 (knative-eventing v0.13.1)",
-		"eventing.knative.dev/v1alpha1 (knative-eventing v0.13.1)",
+		"sources.eventing.knative.dev/v1alpha1 (knative-eventing v0.13.6)",
+		"sources.eventing.knative.dev/v1alpha2 (knative-eventing v0.13.6)",
+		"eventing.knative.dev/v1alpha1 (knative-eventing v0.13.6)",
 	},
 }
 
diff --git a/pkg/printers/tableprinter.go b/pkg/printers/tableprinter.go
index f51bc139..0f309b40 100644
--- a/pkg/printers/tableprinter.go
+++ b/pkg/printers/tableprinter.go
@@ -41,6 +41,10 @@ func NewTablePrinter(options PrintOptions) *HumanReadablePrinter {
 
 // PrintObj prints the obj in a human-friendly format according to the type of the obj.
 func (h *HumanReadablePrinter) PrintObj(obj runtime.Object, output io.Writer) error {
+	if obj == nil {
+		return nil
+	}
+
 	w, found := output.(*tabwriter.Writer)
 	if !found {
 		w = NewTabWriter(output)
diff --git a/pkg/util/unstructured.go b/pkg/util/unstructured.go
new file mode 100644
index 00000000..717f347f
--- /dev/null
+++ b/pkg/util/unstructured.go
@@ -0,0 +1,64 @@
+// 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 util
+
+import (
+	"encoding/json"
+
+	"k8s.io/apimachinery/pkg/api/meta"
+	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+// ToUnstructuredList is to converts an object to unstructured.UnstructuredList.
+// If the object is not a list type, it will convert to a single item UnstructuredList.
+func ToUnstructuredList(obj runtime.Object) (*unstructured.UnstructuredList, error) {
+	unstructuredList := &unstructured.UnstructuredList{}
+	if meta.IsListType(obj) {
+		unstructuredList.SetGroupVersionKind(obj.GetObjectKind().GroupVersionKind())
+		items, err := meta.ExtractList(obj)
+		if err != nil {
+			return nil, err
+		}
+		for _, obji := range items {
+			ud, err := toUnstructured(obji)
+			if err != nil {
+				return nil, err
+			}
+			unstructuredList.Items = append(unstructuredList.Items, *ud)
+		}
+
+	} else {
+		ud, err := toUnstructured(obj)
+		if err != nil {
+			return nil, err
+		}
+		unstructuredList.Items = append(unstructuredList.Items, *ud)
+	}
+	return unstructuredList, nil
+
+}
+
+func toUnstructured(obj runtime.Object) (*unstructured.Unstructured, error) {
+	b, err := json.Marshal(obj)
+	if err != nil {
+		return nil, err
+	}
+	ud := &unstructured.Unstructured{}
+	if err := json.Unmarshal(b, ud); err != nil {
+		return nil, err
+	}
+	return ud, nil
+}
diff --git a/vendor/github.com/google/uuid/.travis.yml b/vendor/github.com/google/uuid/.travis.yml
deleted file mode 100644
index d8156a60..00000000
--- a/vendor/github.com/google/uuid/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: go
-
-go:
-  - 1.4.3
-  - 1.5.3
-  - tip
-
-script:
-  - go test -v ./...
diff --git a/vendor/github.com/google/uuid/CONTRIBUTING.md b/vendor/github.com/google/uuid/CONTRIBUTING.md
deleted file mode 100644
index 04fdf09f..00000000
--- a/vendor/github.com/google/uuid/CONTRIBUTING.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# How to contribute
-
-We definitely welcome patches and contribution to this project!
-
-### Legal requirements
-
-In order to protect both you and ourselves, you will need to sign the
-[Contributor License Agreement](https://cla.developers.google.com/clas).
-
-You may have already signed it for other Google projects.
diff --git a/vendor/github.com/google/uuid/CONTRIBUTORS b/vendor/github.com/google/uuid/CONTRIBUTORS
deleted file mode 100644
index b4bb97f6..00000000
--- a/vendor/github.com/google/uuid/CONTRIBUTORS
+++ /dev/null
@@ -1,9 +0,0 @@
-Paul Borman <borman@google.com>
-bmatsuo
-shawnps
-theory
-jboverfelt
-dsymonds
-cd1
-wallclockbuilder
-dansouza
diff --git a/vendor/github.com/google/uuid/LICENSE b/vendor/github.com/google/uuid/LICENSE
deleted file mode 100644
index 5dc68268..00000000
--- a/vendor/github.com/google/uuid/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009,2014 Google Inc. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-   * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-   * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
-   * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/google/uuid/README.md b/vendor/github.com/google/uuid/README.md
deleted file mode 100644
index 9d92c11f..00000000
--- a/vendor/github.com/google/uuid/README.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# uuid ![build status](https://travis-ci.org/google/uuid.svg?branch=master)
-The uuid package generates and inspects UUIDs based on
-[RFC 4122](http://tools.ietf.org/html/rfc4122)
-and DCE 1.1: Authentication and Security Services. 
-
-This package is based on the github.com/pborman/uuid package (previously named
-code.google.com/p/go-uuid).  It differs from these earlier packages in that
-a UUID is a 16 byte array rather than a byte slice.  One loss due to this
-change is the ability to represent an invalid UUID (vs a NIL UUID).
-
-###### Install
-`go get github.com/google/uuid`
-
-###### Documentation 
-[![GoDoc](https://godoc.org/github.com/google/uuid?status.svg)](http://godoc.org/github.com/google/uuid)
-
-Full `go doc` style documentation for the package can be viewed online without
-installing this package by using the GoDoc site here: 
-http://godoc.org/github.com/google/uuid
diff --git a/vendor/github.com/google/uuid/dce.go b/vendor/github.com/google/uuid/dce.go
deleted file mode 100644
index fa820b9d..00000000
--- a/vendor/github.com/google/uuid/dce.go
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2016 Google Inc.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package uuid
-
-import (
-	"encoding/binary"
-	"fmt"
-	"os"
-)
-
-// A Domain represents a Version 2 domain
-type Domain byte
-
-// Domain constants for DCE Security (Version 2) UUIDs.
-const (
-	Person = Domain(0)
-	Group  = Domain(1)
-	Org    = Domain(2)
-)
-
-// NewDCESecurity returns a DCE Security (Version 2) UUID.
-//
-// The domain should be one of Person, Group or Org.
-// On a POSIX system the id should be the users UID for the Person
-// domain and the users GID for the Group.  The meaning of id for
-// the domain Org or on non-POSIX systems is site defined.
-//
-// For a given domain/id pair the same token may be returned for up to
-// 7 minutes and 10 seconds.
-func NewDCESecurity(domain Domain, id uint32) (UUID, error) {
-	uuid, err := NewUUID()
-	if err == nil {
-		uuid[6] = (uuid[6] & 0x0f) | 0x20 // Version 2
-		uuid[9] = byte(domain)
-		binary.BigEndian.PutUint32(uuid[0:], id)
-	}
-	return uuid, err
-}
-
-// NewDCEPerson returns a DCE Security (Version 2) UUID in the person
-// domain with the id returned by os.Getuid.
-//
-//  NewDCESecurity(Person, uint32(os.Getuid()))
-func NewDCEPerson() (UUID, error) {
-	return NewDCESecurity(Person, uint32(os.Getuid()))
-}
-
-// NewDCEGroup returns a DCE Security (Version 2) UUID in the group
-// domain with the id returned by os.Getgid.
-//
-//  NewDCESecurity(Group, uint32(os.Getgid()))
-func NewDCEGroup() (UUID, error) {
-	return NewDCESecurity(Group, uint32(os.Getgid()))
-}
-
-// Domain returns the domain for a Version 2 UUID.  Domains are only defined
-// for Version 2 UUIDs.
-func (uuid UUID) Domain() Domain {
-	return Domain(uuid[9])
-}
-
-// ID returns the id for a Version 2 UUID. IDs are only defined for Version 2
-// UUIDs.
-func (uuid UUID) ID() uint32 {
-	return binary.BigEndian.Uint32(uuid[0:4])
-}
-
-func (d Domain) String() string {
-	switch d {
-	case Person:
-		return "Person"
-	case Group:
-		return "Group"
-	case Org:
-		return "Org"
-	}
-	return fmt.Sprintf("Domain%d", int(d))
-}
diff --git a/vendor/github.com/google/uuid/doc.go b/vendor/github.com/google/uuid/doc.go
deleted file mode 100644
index 5b8a4b9a..00000000
--- a/vendor/github.com/google/uuid/doc.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2016 Google Inc.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package uuid generates and inspects UUIDs.
-//
-// UUIDs are based on RFC 4122 and DCE 1.1: Authentication and Security
-// Services.
-//
-// A UUID is a 16 byte (128 bit) array.  UUIDs may be used as keys to
-// maps or compared directly.
-package uuid
diff --git a/vendor/github.com/google/uuid/go.mod b/vendor/github.com/google/uuid/go.mod
deleted file mode 100644
index fc84cd79..00000000
--- a/vendor/github.com/google/uuid/go.mod
+++ /dev/null
@@ -1,1 +0,0 @@
-module github.com/google/uuid
diff --git a/vendor/github.com/google/uuid/hash.go b/vendor/github.com/google/uuid/hash.go
deleted file mode 100644
index b1746163..00000000
--- a/vendor/github.com/google/uuid/hash.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2016 Google Inc.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package uuid
-
-import (
-	"crypto/md5"
-	"crypto/sha1"
-	"hash"
-)
-
-// Well known namespace IDs and UUIDs
-var (
-	NameSpaceDNS  = Must(Parse("6ba7b810-9dad-11d1-80b4-00c04fd430c8"))
-	NameSpaceURL  = Must(Parse("6ba7b811-9dad-11d1-80b4-00c04fd430c8"))
-	NameSpaceOID  = Must(Parse("6ba7b812-9dad-11d1-80b4-00c04fd430c8"))
-	NameSpaceX500 = Must(Parse("6ba7b814-9dad-11d1-80b4-00c04fd430c8"))
-	Nil           UUID // empty UUID, all zeros
-)
-
-// NewHash returns a new UUID derived from the hash of space concatenated with
-// data generated by h.  The hash should be at least 16 byte in length.  The
-// first 16 bytes of the hash are used to form the UUID.  The version of the
-// UUID will be the lower 4 bits of version.  NewHash is used to implement
-// NewMD5 and NewSHA1.
-func NewHash(h hash.Hash, space UUID, data []byte, version int) UUID {
-	h.Reset()
-	h.Write(space[:])
-	h.Write(data)
-	s := h.Sum(nil)
-	var uuid UUID
-	copy(uuid[:], s)
-	uuid[6] = (uuid[6] & 0x0f) | uint8((version&0xf)<<4)
-	uuid[8] = (uuid[8] & 0x3f) | 0x80 // RFC 4122 variant
-	return uuid
-}
-
-// NewMD5 returns a new MD5 (Version 3) UUID based on the
-// supplied name space and data.  It is the same as calling:
-//
-//  NewHash(md5.New(), space, data, 3)
-func NewMD5(space UUID, data []byte) UUID {
-	return NewHash(md5.New(), space, data, 3)
-}
-
-// NewSHA1 returns a new SHA1 (Version 5) UUID based on the
-// supplied name space and data.  It is the same as calling:
-//
-//  NewHash(sha1.New(), space, data, 5)
-func NewSHA1(space UUID, data []byte) UUID {
-	return NewHash(sha1.New(), space, data, 5)
-}
diff --git a/vendor/github.com/google/uuid/marshal.go b/vendor/github.com/google/uuid/marshal.go
deleted file mode 100644
index 7f9e0c6c..00000000
--- a/vendor/github.com/google/uuid/marshal.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2016 Google Inc.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package uuid
-
-import "fmt"
-
-// MarshalText implements encoding.TextMarshaler.
-func (uuid UUID) MarshalText() ([]byte, error) {
-	var js [36]byte
-	encodeHex(js[:], uuid)
-	return js[:], nil
-}
-
-// UnmarshalText implements encoding.TextUnmarshaler.
-func (uuid *UUID) UnmarshalText(data []byte) error {
-	id, err := ParseBytes(data)
-	if err == nil {
-		*uuid = id
-	}
-	return err
-}
-
-// MarshalBinary implements encoding.BinaryMarshaler.
-func (uuid UUID) MarshalBinary() ([]byte, error) {
-	return uuid[:], nil
-}
-
-// UnmarshalBinary implements encoding.BinaryUnmarshaler.
-func (uuid *UUID) UnmarshalBinary(data []byte) error {
-	if len(data) != 16 {
-		return fmt.Errorf("invalid UUID (got %d bytes)", len(data))
-	}
-	copy(uuid[:], data)
-	return nil
-}
diff --git a/vendor/github.com/google/uuid/node.go b/vendor/github.com/google/uuid/node.go
deleted file mode 100644
index d651a2b0..00000000
--- a/vendor/github.com/google/uuid/node.go
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2016 Google Inc.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package uuid
-
-import (
-	"sync"
-)
-
-var (
-	nodeMu sync.Mutex
-	ifname string  // name of interface being used
-	nodeID [6]byte // hardware for version 1 UUIDs
-	zeroID [6]byte // nodeID with only 0's
-)
-
-// NodeInterface returns the name of the interface from which the NodeID was
-// derived.  The interface "user" is returned if the NodeID was set by
-// SetNodeID.
-func NodeInterface() string {
-	defer nodeMu.Unlock()
-	nodeMu.Lock()
-	return ifname
-}
-
-// SetNodeInterface selects the hardware address to be used for Version 1 UUIDs.
-// If name is "" then the first usable interface found will be used or a random
-// Node ID will be generated.  If a named interface cannot be found then false
-// is returned.
-//
-// SetNodeInterface never fails when name is "".
-func SetNodeInterface(name string) bool {
-	defer nodeMu.Unlock()
-	nodeMu.Lock()
-	return setNodeInterface(name)
-}
-
-func setNodeInterface(name string) bool {
-	iname, addr := getHardwareInterface(name) // null implementation for js
-	if iname != "" && addr != nil {
-		ifname = iname
-		copy(nodeID[:], addr)
-		return true
-	}
-
-	// We found no interfaces with a valid hardware address.  If name
-	// does not specify a specific interface generate a random Node ID
-	// (section 4.1.6)
-	if name == "" {
-		ifname = "random"
-		randomBits(nodeID[:])
-		return true
-	}
-	return false
-}
-
-// NodeID returns a slice of a copy of the current Node ID, setting the Node ID
-// if not already set.
-func NodeID() []byte {
-	defer nodeMu.Unlock()
-	nodeMu.Lock()
-	if nodeID == zeroID {
-		setNodeInterface("")
-	}
-	nid := nodeID
-	return nid[:]
-}
-
-// SetNodeID sets the Node ID to be used for Version 1 UUIDs.  The first 6 bytes
-// of id are used.  If id is less than 6 bytes then false is returned and the
-// Node ID is not set.
-func SetNodeID(id []byte) bool {
-	if len(id) < 6 {
-		return false
-	}
-	defer nodeMu.Unlock()
-	nodeMu.Lock()
-	copy(nodeID[:], id)
-	ifname = "user"
-	return true
-}
-
-// NodeID returns the 6 byte node id encoded in uuid.  It returns nil if uuid is
-// not valid.  The NodeID is only well defined for version 1 and 2 UUIDs.
-func (uuid UUID) NodeID() []byte {
-	var node [6]byte
-	copy(node[:], uuid[10:])
-	return node[:]
-}
diff --git a/vendor/github.com/google/uuid/node_js.go b/vendor/github.com/google/uuid/node_js.go
deleted file mode 100644
index 24b78edc..00000000
--- a/vendor/github.com/google/uuid/node_js.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2017 Google Inc.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build js
-
-package uuid
-
-// getHardwareInterface returns nil values for the JS version of the code.
-// This remvoves the "net" dependency, because it is not used in the browser.
-// Using the "net" library inflates the size of the transpiled JS code by 673k bytes.
-func getHardwareInterface(name string) (string, []byte) { return "", nil }
diff --git a/vendor/github.com/google/uuid/node_net.go b/vendor/github.com/google/uuid/node_net.go
deleted file mode 100644
index 0cbbcddb..00000000
--- a/vendor/github.com/google/uuid/node_net.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2017 Google Inc.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !js
-
-package uuid
-
-import "net"
-
-var interfaces []net.Interface // cached list of interfaces
-
-// getHardwareInterface returns the name and hardware address of interface name.
-// If name is "" then the name and hardware address of one of the system's
-// interfaces is returned.  If no interfaces are found (name does not exist or
-// there are no interfaces) then "", nil is returned.
-//
-// Only addresses of at least 6 bytes are returned.
-func getHardwareInterface(name string) (string, []byte) {
-	if interfaces == nil {
-		var err error
-		interfaces, err = net.Interfaces()
-		if err != nil {
-			return "", nil
-		}
-	}
-	for _, ifs := range interfaces {
-		if len(ifs.HardwareAddr) >= 6 && (name == "" || name == ifs.Name) {
-			return ifs.Name, ifs.HardwareAddr
-		}
-	}
-	return "", nil
-}
diff --git a/vendor/github.com/google/uuid/sql.go b/vendor/github.com/google/uuid/sql.go
deleted file mode 100644
index f326b54d..00000000
--- a/vendor/github.com/google/uuid/sql.go
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2016 Google Inc.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package uuid
-
-import (
-	"database/sql/driver"
-	"fmt"
-)
-
-// Scan implements sql.Scanner so UUIDs can be read from databases transparently
-// Currently, database types that map to string and []byte are supported. Please
-// consult database-specific driver documentation for matching types.
-func (uuid *UUID) Scan(src interface{}) error {
-	switch src := src.(type) {
-	case nil:
-		return nil
-
-	case string:
-		// if an empty UUID comes from a table, we return a null UUID
-		if src == "" {
-			return nil
-		}
-
-		// see Parse for required string format
-		u, err := Parse(src)
-		if err != nil {
-			return fmt.Errorf("Scan: %v", err)
-		}
-
-		*uuid = u
-
-	case []byte:
-		// if an empty UUID comes from a table, we return a null UUID
-		if len(src) == 0 {
-			return nil
-		}
-
-		// assumes a simple slice of bytes if 16 bytes
-		// otherwise attempts to parse
-		if len(src) != 16 {
-			return uuid.Scan(string(src))
-		}
-		copy((*uuid)[:], src)
-
-	default:
-		return fmt.Errorf("Scan: unable to scan type %T into UUID", src)
-	}
-
-	return nil
-}
-
-// Value implements sql.Valuer so that UUIDs can be written to databases
-// transparently. Currently, UUIDs map to strings. Please consult
-// database-specific driver documentation for matching types.
-func (uuid UUID) Value() (driver.Value, error) {
-	return uuid.String(), nil
-}
diff --git a/vendor/github.com/google/uuid/time.go b/vendor/github.com/google/uuid/time.go
deleted file mode 100644
index e6ef06cd..00000000
--- a/vendor/github.com/google/uuid/time.go
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2016 Google Inc.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package uuid
-
-import (
-	"encoding/binary"
-	"sync"
-	"time"
-)
-
-// A Time represents a time as the number of 100's of nanoseconds since 15 Oct
-// 1582.
-type Time int64
-
-const (
-	lillian    = 2299160          // Julian day of 15 Oct 1582
-	unix       = 2440587          // Julian day of 1 Jan 1970
-	epoch      = unix - lillian   // Days between epochs
-	g1582      = epoch * 86400    // seconds between epochs
-	g1582ns100 = g1582 * 10000000 // 100s of a nanoseconds between epochs
-)
-
-var (
-	timeMu   sync.Mutex
-	lasttime uint64 // last time we returned
-	clockSeq uint16 // clock sequence for this run
-
-	timeNow = time.Now // for testing
-)
-
-// UnixTime converts t the number of seconds and nanoseconds using the Unix
-// epoch of 1 Jan 1970.
-func (t Time) UnixTime() (sec, nsec int64) {
-	sec = int64(t - g1582ns100)
-	nsec = (sec % 10000000) * 100
-	sec /= 10000000
-	return sec, nsec
-}
-
-// GetTime returns the current Time (100s of nanoseconds since 15 Oct 1582) and
-// clock sequence as well as adjusting the clock sequence as needed.  An error
-// is returned if the current time cannot be determined.
-func GetTime() (Time, uint16, error) {
-	defer timeMu.Unlock()
-	timeMu.Lock()
-	return getTime()
-}
-
-func getTime() (Time, uint16, error) {
-	t := timeNow()
-
-	// If we don't have a clock sequence already, set one.
-	if clockSeq == 0 {
-		setClockSequence(-1)
-	}
-	now := uint64(t.UnixNano()/100) + g1582ns100
-
-	// If time has gone backwards with this clock sequence then we
-	// increment the clock sequence
-	if now <= lasttime {
-		clockSeq = ((clockSeq + 1) & 0x3fff) | 0x8000
-	}
-	lasttime = now
-	return Time(now), clockSeq, nil
-}
-
-// ClockSequence returns the current clock sequence, generating one if not
-// already set.  The clock sequence is only used for Version 1 UUIDs.
-//
-// The uuid package does not use global static storage for the clock sequence or
-// the last time a UUID was generated.  Unless SetClockSequence is used, a new
-// random clock sequence is generated the first time a clock sequence is
-// requested by ClockSequence, GetTime, or NewUUID.  (section 4.2.1.1)
-func ClockSequence() int {
-	defer timeMu.Unlock()
-	timeMu.Lock()
-	return clockSequence()
-}
-
-func clockSequence() int {
-	if clockSeq == 0 {
-		setClockSequence(-1)
-	}
-	return int(clockSeq & 0x3fff)
-}
-
-// SetClockSequence sets the clock sequence to the lower 14 bits of seq.  Setting to
-// -1 causes a new sequence to be generated.
-func SetClockSequence(seq int) {
-	defer timeMu.Unlock()
-	timeMu.Lock()
-	setClockSequence(seq)
-}
-
-func setClockSequence(seq int) {
-	if seq == -1 {
-		var b [2]byte
-		randomBits(b[:]) // clock sequence
-		seq = int(b[0])<<8 | int(b[1])
-	}
-	oldSeq := clockSeq
-	clockSeq = uint16(seq&0x3fff) | 0x8000 // Set our variant
-	if oldSeq != clockSeq {
-		lasttime = 0
-	}
-}
-
-// Time returns the time in 100s of nanoseconds since 15 Oct 1582 encoded in
-// uuid.  The time is only defined for version 1 and 2 UUIDs.
-func (uuid UUID) Time() Time {
-	time := int64(binary.BigEndian.Uint32(uuid[0:4]))
-	time |= int64(binary.BigEndian.Uint16(uuid[4:6])) << 32
-	time |= int64(binary.BigEndian.Uint16(uuid[6:8])&0xfff) << 48
-	return Time(time)
-}
-
-// ClockSequence returns the clock sequence encoded in uuid.
-// The clock sequence is only well defined for version 1 and 2 UUIDs.
-func (uuid UUID) ClockSequence() int {
-	return int(binary.BigEndian.Uint16(uuid[8:10])) & 0x3fff
-}
diff --git a/vendor/github.com/google/uuid/util.go b/vendor/github.com/google/uuid/util.go
deleted file mode 100644
index 5ea6c737..00000000
--- a/vendor/github.com/google/uuid/util.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2016 Google Inc.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package uuid
-
-import (
-	"io"
-)
-
-// randomBits completely fills slice b with random data.
-func randomBits(b []byte) {
-	if _, err := io.ReadFull(rander, b); err != nil {
-		panic(err.Error()) // rand should never fail
-	}
-}
-
-// xvalues returns the value of a byte as a hexadecimal digit or 255.
-var xvalues = [256]byte{
-	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255, 255, 255, 255, 255, 255,
-	255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-	255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-}
-
-// xtob converts hex characters x1 and x2 into a byte.
-func xtob(x1, x2 byte) (byte, bool) {
-	b1 := xvalues[x1]
-	b2 := xvalues[x2]
-	return (b1 << 4) | b2, b1 != 255 && b2 != 255
-}
diff --git a/vendor/github.com/google/uuid/uuid.go b/vendor/github.com/google/uuid/uuid.go
deleted file mode 100644
index 524404cc..00000000
--- a/vendor/github.com/google/uuid/uuid.go
+++ /dev/null
@@ -1,245 +0,0 @@
-// Copyright 2018 Google Inc.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package uuid
-
-import (
-	"bytes"
-	"crypto/rand"
-	"encoding/hex"
-	"errors"
-	"fmt"
-	"io"
-	"strings"
-)
-
-// A UUID is a 128 bit (16 byte) Universal Unique IDentifier as defined in RFC
-// 4122.
-type UUID [16]byte
-
-// A Version represents a UUID's version.
-type Version byte
-
-// A Variant represents a UUID's variant.
-type Variant byte
-
-// Constants returned by Variant.
-const (
-	Invalid   = Variant(iota) // Invalid UUID
-	RFC4122                   // The variant specified in RFC4122
-	Reserved                  // Reserved, NCS backward compatibility.
-	Microsoft                 // Reserved, Microsoft Corporation backward compatibility.
-	Future                    // Reserved for future definition.
-)
-
-var rander = rand.Reader // random function
-
-// Parse decodes s into a UUID or returns an error.  Both the standard UUID
-// forms of xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and
-// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx are decoded as well as the
-// Microsoft encoding {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} and the raw hex
-// encoding: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
-func Parse(s string) (UUID, error) {
-	var uuid UUID
-	switch len(s) {
-	// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
-	case 36:
-
-	// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
-	case 36 + 9:
-		if strings.ToLower(s[:9]) != "urn:uuid:" {
-			return uuid, fmt.Errorf("invalid urn prefix: %q", s[:9])
-		}
-		s = s[9:]
-
-	// {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
-	case 36 + 2:
-		s = s[1:]
-
-	// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-	case 32:
-		var ok bool
-		for i := range uuid {
-			uuid[i], ok = xtob(s[i*2], s[i*2+1])
-			if !ok {
-				return uuid, errors.New("invalid UUID format")
-			}
-		}
-		return uuid, nil
-	default:
-		return uuid, fmt.Errorf("invalid UUID length: %d", len(s))
-	}
-	// s is now at least 36 bytes long
-	// it must be of the form  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
-	if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' {
-		return uuid, errors.New("invalid UUID format")
-	}
-	for i, x := range [16]int{
-		0, 2, 4, 6,
-		9, 11,
-		14, 16,
-		19, 21,
-		24, 26, 28, 30, 32, 34} {
-		v, ok := xtob(s[x], s[x+1])
-		if !ok {
-			return uuid, errors.New("invalid UUID format")
-		}
-		uuid[i] = v
-	}
-	return uuid, nil
-}
-
-// ParseBytes is like Parse, except it parses a byte slice instead of a string.
-func ParseBytes(b []byte) (UUID, error) {
-	var uuid UUID
-	switch len(b) {
-	case 36: // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
-	case 36 + 9: // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
-		if !bytes.Equal(bytes.ToLower(b[:9]), []byte("urn:uuid:")) {
-			return uuid, fmt.Errorf("invalid urn prefix: %q", b[:9])
-		}
-		b = b[9:]
-	case 36 + 2: // {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
-		b = b[1:]
-	case 32: // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-		var ok bool
-		for i := 0; i < 32; i += 2 {
-			uuid[i/2], ok = xtob(b[i], b[i+1])
-			if !ok {
-				return uuid, errors.New("invalid UUID format")
-			}
-		}
-		return uuid, nil
-	default:
-		return uuid, fmt.Errorf("invalid UUID length: %d", len(b))
-	}
-	// s is now at least 36 bytes long
-	// it must be of the form  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
-	if b[8] != '-' || b[13] != '-' || b[18] != '-' || b[23] != '-' {
-		return uuid, errors.New("invalid UUID format")
-	}
-	for i, x := range [16]int{
-		0, 2, 4, 6,
-		9, 11,
-		14, 16,
-		19, 21,
-		24, 26, 28, 30, 32, 34} {
-		v, ok := xtob(b[x], b[x+1])
-		if !ok {
-			return uuid, errors.New("invalid UUID format")
-		}
-		uuid[i] = v
-	}
-	return uuid, nil
-}
-
-// MustParse is like Parse but panics if the string cannot be parsed.
-// It simplifies safe initialization of global variables holding compiled UUIDs.
-func MustParse(s string) UUID {
-	uuid, err := Parse(s)
-	if err != nil {
-		panic(`uuid: Parse(` + s + `): ` + err.Error())
-	}
-	return uuid
-}
-
-// FromBytes creates a new UUID from a byte slice. Returns an error if the slice
-// does not have a length of 16. The bytes are copied from the slice.
-func FromBytes(b []byte) (uuid UUID, err error) {
-	err = uuid.UnmarshalBinary(b)
-	return uuid, err
-}
-
-// Must returns uuid if err is nil and panics otherwise.
-func Must(uuid UUID, err error) UUID {
-	if err != nil {
-		panic(err)
-	}
-	return uuid
-}
-
-// String returns the string form of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
-// , or "" if uuid is invalid.
-func (uuid UUID) String() string {
-	var buf [36]byte
-	encodeHex(buf[:], uuid)
-	return string(buf[:])
-}
-
-// URN returns the RFC 2141 URN form of uuid,
-// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,  or "" if uuid is invalid.
-func (uuid UUID) URN() string {
-	var buf [36 + 9]byte
-	copy(buf[:], "urn:uuid:")
-	encodeHex(buf[9:], uuid)
-	return string(buf[:])
-}
-
-func encodeHex(dst []byte, uuid UUID) {
-	hex.Encode(dst, uuid[:4])
-	dst[8] = '-'
-	hex.Encode(dst[9:13], uuid[4:6])
-	dst[13] = '-'
-	hex.Encode(dst[14:18], uuid[6:8])
-	dst[18] = '-'
-	hex.Encode(dst[19:23], uuid[8:10])
-	dst[23] = '-'
-	hex.Encode(dst[24:], uuid[10:])
-}
-
-// Variant returns the variant encoded in uuid.
-func (uuid UUID) Variant() Variant {
-	switch {
-	case (uuid[8] & 0xc0) == 0x80:
-		return RFC4122
-	case (uuid[8] & 0xe0) == 0xc0:
-		return Microsoft
-	case (uuid[8] & 0xe0) == 0xe0:
-		return Future
-	default:
-		return Reserved
-	}
-}
-
-// Version returns the version of uuid.
-func (uuid UUID) Version() Version {
-	return Version(uuid[6] >> 4)
-}
-
-func (v Version) String() string {
-	if v > 15 {
-		return fmt.Sprintf("BAD_VERSION_%d", v)
-	}
-	return fmt.Sprintf("VERSION_%d", v)
-}
-
-func (v Variant) String() string {
-	switch v {
-	case RFC4122:
-		return "RFC4122"
-	case Reserved:
-		return "Reserved"
-	case Microsoft:
-		return "Microsoft"
-	case Future:
-		return "Future"
-	case Invalid:
-		return "Invalid"
-	}
-	return fmt.Sprintf("BadVariant%d", int(v))
-}
-
-// SetRand sets the random number generator to r, which implements io.Reader.
-// If r.Read returns an error when the package requests random data then
-// a panic will be issued.
-//
-// Calling SetRand with nil sets the random number generator to the default
-// generator.
-func SetRand(r io.Reader) {
-	if r == nil {
-		rander = rand.Reader
-		return
-	}
-	rander = r
-}
diff --git a/vendor/github.com/google/uuid/version1.go b/vendor/github.com/google/uuid/version1.go
deleted file mode 100644
index 199a1ac6..00000000
--- a/vendor/github.com/google/uuid/version1.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2016 Google Inc.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package uuid
-
-import (
-	"encoding/binary"
-)
-
-// NewUUID returns a Version 1 UUID based on the current NodeID and clock
-// sequence, and the current time.  If the NodeID has not been set by SetNodeID
-// or SetNodeInterface then it will be set automatically.  If the NodeID cannot
-// be set NewUUID returns nil.  If clock sequence has not been set by
-// SetClockSequence then it will be set automatically.  If GetTime fails to
-// return the current NewUUID returns nil and an error.
-//
-// In most cases, New should be used.
-func NewUUID() (UUID, error) {
-	nodeMu.Lock()
-	if nodeID == zeroID {
-		setNodeInterface("")
-	}
-	nodeMu.Unlock()
-
-	var uuid UUID
-	now, seq, err := GetTime()
-	if err != nil {
-		return uuid, err
-	}
-
-	timeLow := uint32(now & 0xffffffff)
-	timeMid := uint16((now >> 32) & 0xffff)
-	timeHi := uint16((now >> 48) & 0x0fff)
-	timeHi |= 0x1000 // Version 1
-
-	binary.BigEndian.PutUint32(uuid[0:], timeLow)
-	binary.BigEndian.PutUint16(uuid[4:], timeMid)
-	binary.BigEndian.PutUint16(uuid[6:], timeHi)
-	binary.BigEndian.PutUint16(uuid[8:], seq)
-	copy(uuid[10:], nodeID[:])
-
-	return uuid, nil
-}
diff --git a/vendor/github.com/google/uuid/version4.go b/vendor/github.com/google/uuid/version4.go
deleted file mode 100644
index 84af91c9..00000000
--- a/vendor/github.com/google/uuid/version4.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2016 Google Inc.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package uuid
-
-import "io"
-
-// New creates a new random UUID or panics.  New is equivalent to
-// the expression
-//
-//    uuid.Must(uuid.NewRandom())
-func New() UUID {
-	return Must(NewRandom())
-}
-
-// NewRandom returns a Random (Version 4) UUID.
-//
-// The strength of the UUIDs is based on the strength of the crypto/rand
-// package.
-//
-// A note about uniqueness derived from the UUID Wikipedia entry:
-//
-//  Randomly generated UUIDs have 122 random bits.  One's annual risk of being
-//  hit by a meteorite is estimated to be one chance in 17 billion, that
-//  means the probability is about 0.00000000006 (6 × 10−11),
-//  equivalent to the odds of creating a few tens of trillions of UUIDs in a
-//  year and having one duplicate.
-func NewRandom() (UUID, error) {
-	var uuid UUID
-	_, err := io.ReadFull(rander, uuid[:])
-	if err != nil {
-		return Nil, err
-	}
-	uuid[6] = (uuid[6] & 0x0f) | 0x40 // Version 4
-	uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10
-	return uuid, nil
-}
diff --git a/vendor/knative.dev/pkg/apis/duck/ABOUT.md b/vendor/knative.dev/pkg/apis/duck/ABOUT.md
new file mode 100644
index 00000000..0c6edabd
--- /dev/null
+++ b/vendor/knative.dev/pkg/apis/duck/ABOUT.md
@@ -0,0 +1,325 @@
+# Knative Duck Typing
+
+![A Trojan Duck](images/Knative-Duck0.png)
+
+**Figure 1:** How to integrate with Knative.
+
+## Problem statement
+
+In Knative, we want to support
+[loose coupling](https://docs.google.com/presentation/d/1KxKAcIZyblkXbpdGVCgmzfDDIhqgUcwsa0zlABfvaXI/edit#slide=id.p)
+of the building blocks we are releasing. We want users to be able to use these
+building blocks together, but also support composing them with non-Knative
+components as well.
+
+Unlike Knative’s
+[pluggability story](https://docs.google.com/presentation/d/10KWynvAJYuOEWy69VBa6bHJVCqIsz1TNdEKosNvcpPY/edit#slide=id.p)
+(for replacing subsystems within a building block), we do not want to require
+that the systems with which we compose have **identical** APIs (distinct
+implementations). However, we do need a way of accessing (reading / writing)
+certain **_pieces_** of information in a structured way.
+
+**Enter [duck typing](https://en.wikipedia.org/wiki/Duck_typing)**. We will
+define a partial schema, to which resource authors will adhere if they want to
+participate within certain contexts of Knative.
+
+For instance, consider the partial schema:
+
+```yaml
+foo:
+  bar: <string>
+```
+
+Both of these resources implement the above duck type:
+
+```yaml
+baz: 1234
+foo:
+  bar: asdf
+blah:
+  blurp: true
+```
+
+```yaml
+field: running out of ideas
+foo:
+  bar: a different string
+another: you get the point
+```
+
+### Reading duck-typed data
+
+At a high-level, reading duck-typed data is very straightforward: using the
+partial object schema deserialize the resource ignoring unknown fields. The
+fields we care about can then be accessed through the structured object that
+represents the duck type.
+
+### Writing duck-typed data
+
+How to write duck-typed data is less straightforward because we do not want to
+clobber every field we do not know about. To accomplish this, we will lean on
+Kubernetes’ well established patching model.
+
+First, we read the resource we intend to modify as our duck type. Keeping a copy
+of the original, we then modify the fields of this duck typed resource to
+reflect the change we want. Lastly, we synthesize a JSON Patch of the changes
+between the original and the final version and issue a Patch to the Kubernetes
+API with the delta.
+
+Since the duck type inherently contains a subset of the fields in the resource,
+the resulting JSON Patch can only contain fields relevant to the resource.
+
+## Example: Reading Knative-style Conditions
+
+In Knative, we follow the Kubernetes API principles of using `conditions` as a
+key part of our resources’ status, but we go a step further in
+[defining particular conventions](https://github.com/knative/serving/blob/master/docs/spec/errors.md#error-conditions-and-reporting)
+on how these are used.
+
+To support this, we define:
+
+```golang
+type KResource struct {
+        metav1.TypeMeta   `json:",inline"`
+        metav1.ObjectMeta `json:"metadata,omitempty"`
+
+        Status KResourceStatus `json:"status"`
+}
+
+type KResourceStatus struct {
+        Conditions Conditions `json:"conditions,omitempty"`
+}
+
+type Conditions []Condition
+
+type Condition struct {
+  // structure adhering to K8s API principles
+  ...
+}
+```
+
+We can now deserialize and reason about the status of any Knative-compatible
+resource using this partial schema.
+
+## Example: Mutating Knative CRD Generations
+
+In Knative, all of our resources define a `.spec.generation` field, which we use
+in place of `.metadata.generation` because the latter was not properly managed
+by Kubernetes (prior to 1.11 with `/status` subresource). We manage bumping this
+generation field in our webhook if and only if the `.spec` changed.
+
+To support this, we define:
+
+```golang
+type Generational struct {
+        metav1.TypeMeta   `json:",inline"`
+        metav1.ObjectMeta `json:"metadata,omitempty"`
+
+        Spec GenerationalSpec `json:"spec"`
+}
+
+type GenerationalSpec struct {
+        Generation Generation `json:"generation,omitempty"`
+}
+
+type Generation int64
+```
+
+Using this our webhook can read the current resource’s generation, increment it,
+and generate a patch to apply it.
+
+## Example: Mutating Core Kubernetes Resources
+
+Kubernetes already uses duck typing, in a way. Consider that `Deployment`,
+`ReplicaSet`, `DaemonSet`, `StatefulSet`, and `Job` all embed a
+`corev1.PodTemplateSpec` at the exact path: `.spec.template`.
+
+Consider the example duck type:
+
+```yaml
+type PodSpecable corev1.PodTemplateSpec
+
+type WithPod struct { metav1.TypeMeta   `json:",inline"` metav1.ObjectMeta
+`json:"metadata,omitempty"`
+
+Spec WithPodSpec `json:"spec,omitempty"` }
+
+type WithPodSpec struct { Template PodSpecable `json:"template,omitempty"` }
+```
+
+Using this, we can access the PodSpec of arbitrary higher-level Kubernetes
+resources in a very structured way and generate patches to mutate them.
+[See examples](https://github.com/knative/pkg/blob/07104dad53e803457a95306e5b1322024bd69af3/apis/duck/podspec_test.go#L49-L53).
+
+_You can also see a sample controller that reconciles duck-typed resources
+[here](https://github.com/mattmoor/cachier)._
+
+## Conventions
+
+Each of our duck types will consist of a single structured field that must be
+enclosed within the containing resource in a particular way.
+
+1. This structured field will be named <code>Foo<strong>able</strong></code>,
+2. <code>Fooable</code> will be directly included via a field named
+   <code>fooable</code>,
+3. Additional skeletal layers around <code>Fooable</code> will be defined to
+   fully define <code>Fooable</code>’s position within complete resources.
+
+_You can see parts of these in the examples above, however, those special cases
+have been exempted from the first condition for legacy compatibility reasons._
+
+For example:
+
+1. `type Conditions []Condition`
+2. <code>Conditions Conditions
+   `json:"<strong>conditions</strong>,omitempty"`</code>
+3. <code>KResource -> KResourceStatus -> Conditions</code>
+
+## Supporting Mechanics
+
+We will provide a number of tools to enable working with duck types without
+blowing off feet.
+
+### Verification
+
+To verify that a particular resource implements a particular duck type, resource
+authors are strongly encouraged to add the following as test code adjacent to
+resource definitions.
+
+`myresource_types.go`:
+
+```golang
+package v1alpha1
+
+type MyResource struct {
+   ...
+}
+```
+
+`myresource_types_test.go`:
+
+```golang
+package v1alpha1
+
+import (
+    "testing"
+
+    // This is where supporting tools for duck-typing will live.
+    "github.com/knative/pkg/apis/duck"
+
+    // This is where Knative-provided duck types will live.
+    duckv1alpha1 "github.com/knative/pkg/apis/duck/v1alpha1"
+)
+
+// This verifies that MyResource contains all the necessary fields for the
+// given implementable duck type.
+func TestType(t *testing.T) {
+   err := duck.VerifyType(&MyResource{}, &duckv1alpha1.Conditions{})
+   if err != nil {
+     t.Errorf("VerifyType() = %v", err)
+   }
+}
+```
+
+\_This call will create a fully populated instance of the skeletal resource
+containing the Conditions and ensure that the fields can 100% roundtrip through
+<code>MyResource</code>.</em>
+
+### Patching
+
+To produce a patch of a particular resource modification suitable for use with
+<code>k8s.io/client-[go/dynamic](https://goto.google.com/dynamic)</code>,
+developers can write:
+
+```golang
+before := …
+after := before.DeepCopy()
+// modify "after"
+
+patch, err := duck.CreatePatch(before, after)
+// check err
+
+bytes, err := patch.MarshalJSON()
+// check err
+
+dynamicClient.Patch(bytes)
+```
+
+### Informers / Listers
+
+To be able to efficiently access / monitor arbitrary duck-typed resources, we
+want to be able to produce an Informer / Lister for interpreting particular
+resource groups as a particular duck type.
+
+To facilitate this, we provide several composable implementations of
+`duck.InformerFactory`.
+
+```golang
+type InformerFactory interface {
+        // Get an informer/lister pair for the given resource group.
+        Get(GroupVersionResource) (SharedIndexInformer, GenericLister, error)
+}
+
+
+// This produces informer/lister pairs that interpret objects in the resource group
+// as the provided duck "Type"
+dif := &duck.TypedInformerFactory{
+        Client:       dynaClient,
+        Type:         &duckv1alpha1.Foo{},
+        ResyncPeriod: 30 * time.Second,
+        StopChannel:  stopCh,
+}
+
+// This registers the provided EventHandler with the informer each time an
+// informer/lister pair is produced.
+eif := &duck.EnqueueInformerFactory{
+        Delegate: dif,
+        EventHandler: cache.ResourceEventHandlerFuncs{
+             AddFunc: impl.EnqueueControllerOf,
+             UpdateFunc: controller.PassNew(impl.EnqueueControllerOf),
+        },
+}
+
+// This caches informer/lister pairs so that we only produce one for each GVR.
+cif := &duck.CachedInformerFactory{
+        Delegate: eif,
+}
+```
+
+### Trackers
+
+Informers are great when you have something like an `OwnerReference` to key off
+of for the association (e.g. `impl.EnqueueControllerOf`), however, when the
+association is looser e.g. `corev1.ObjectReference`, then we need a way of
+configuring a reconciliation trigger for the cross-reference.
+
+For this (generally) we have the `knative/pkg/tracker` package. Here is how it
+is used with duck types:
+
+```golang
+        c := &Reconciler{
+                Base:             reconciler.NewBase(opt, controllerAgentName),
+                ...
+        }
+        impl := controller.NewImpl(c, c.Logger, "Revisions")
+
+        // Calls to Track create a 30 minute lease before they must be renewed.
+        // Coordinate this value with controller resync periods.
+        t := tracker.New(impl.EnqueueKey, 30*time.Minute)
+        cif := &duck.CachedInformerFactory{
+                Delegate: &duck.EnqueueInformerFactory{
+                        Delegate: buildInformerFactory,
+                        EventHandler: cache.ResourceEventHandlerFuncs{
+                                AddFunc:    t.OnChanged,
+                                UpdateFunc: controller.PassNew(t.OnChanged),
+                        },
+                },
+        }
+
+        // Now use: c.buildInformerFactory.Get() to access ObjectReferences.
+        c.buildInformerFactory = buildInformerFactory
+
+        // Now use: c.tracker.Track(rev.Spec.BuildRef, rev) to queue rev
+        // each time rev.Spec.BuildRef changes.
+        c.tracker = t
+```
diff --git a/vendor/knative.dev/pkg/logging/config b/vendor/knative.dev/pkg/logging/config
new file mode 100644
index 00000000..2480fc6d
--- /dev/null
+++ b/vendor/knative.dev/pkg/logging/config
@@ -0,0 +1,4 @@
+# The OWNERS file is used by prow to automatically merge approved PRs.
+
+approvers:
+- configmap-approvers
diff --git a/vendor/knative.dev/serving/pkg/apis/autoscaling/v1alpha1/pa_validation.go b/vendor/knative.dev/serving/pkg/apis/autoscaling/v1alpha1/pa_validation.go
index 31ff3b18..31b2bb95 100644
--- a/vendor/knative.dev/serving/pkg/apis/autoscaling/v1alpha1/pa_validation.go
+++ b/vendor/knative.dev/serving/pkg/apis/autoscaling/v1alpha1/pa_validation.go
@@ -34,11 +34,7 @@ func (pa *PodAutoscalerSpec) Validate(ctx context.Context) *apis.FieldError {
 	if equality.Semantic.DeepEqual(pa, &PodAutoscalerSpec{}) {
 		return apis.ErrMissingField(apis.CurrentField)
 	}
-	return serving.ValidateNamespacedObjectReference(&pa.ScaleTargetRef).
-		ViaField("scaleTargetRef").Also(
-		serving.ValidateContainerConcurrency(
-			ctx, &pa.ContainerConcurrency).ViaField("containerConcurrency")).Also(
-		validateSKSFields(ctx, pa))
+	return serving.ValidateNamespacedObjectReference(&pa.ScaleTargetRef).ViaField("scaleTargetRef").Also(serving.ValidateContainerConcurrency(&pa.ContainerConcurrency).ViaField("containerConcurrency")).Also(validateSKSFields(ctx, pa))
 }
 
 func validateSKSFields(ctx context.Context, rs *PodAutoscalerSpec) (errs *apis.FieldError) {
diff --git a/vendor/knative.dev/serving/pkg/apis/config/defaults.go b/vendor/knative.dev/serving/pkg/apis/config/defaults.go
index 7371e3bd..fe1820de 100644
--- a/vendor/knative.dev/serving/pkg/apis/config/defaults.go
+++ b/vendor/knative.dev/serving/pkg/apis/config/defaults.go
@@ -21,9 +21,7 @@ import (
 	"context"
 	"fmt"
 	"io/ioutil"
-	"math"
 	"strconv"
-	"strings"
 	"text/template"
 
 	corev1 "k8s.io/api/core/v1"
@@ -55,45 +53,34 @@ const (
 	DefaultMaxRevisionContainerConcurrency int64 = 1000
 )
 
-func defaultConfig() *Defaults {
-	return &Defaults{
-		RevisionTimeoutSeconds:       DefaultRevisionTimeoutSeconds,
-		MaxRevisionTimeoutSeconds:    DefaultMaxRevisionTimeoutSeconds,
-		UserContainerNameTemplate:    DefaultUserContainerName,
-		ContainerConcurrency:         DefaultContainerConcurrency,
-		ContainerConcurrencyMaxLimit: DefaultMaxRevisionContainerConcurrency,
-	}
-}
-
 // NewDefaultsConfigFromMap creates a Defaults from the supplied Map
 func NewDefaultsConfigFromMap(data map[string]string) (*Defaults, error) {
-	nc := defaultConfig()
-
-	// Process bool field.
-	nc.EnableMultiContainer = strings.EqualFold(data["enable-multi-container"], "true")
+	nc := &Defaults{}
 
 	// Process int64 fields
 	for _, i64 := range []struct {
 		key   string
 		field *int64
+		// specified exactly when optional
+		defaultValue int64
 	}{{
-		key:   "revision-timeout-seconds",
-		field: &nc.RevisionTimeoutSeconds,
-	}, {
-		key:   "max-revision-timeout-seconds",
-		field: &nc.MaxRevisionTimeoutSeconds,
+		key:          "revision-timeout-seconds",
+		field:        &nc.RevisionTimeoutSeconds,
+		defaultValue: DefaultRevisionTimeoutSeconds,
 	}, {
-		key:   "container-concurrency",
-		field: &nc.ContainerConcurrency,
+		key:          "max-revision-timeout-seconds",
+		field:        &nc.MaxRevisionTimeoutSeconds,
+		defaultValue: DefaultMaxRevisionTimeoutSeconds,
 	}, {
-		key:   "container-concurrency-max-limit",
-		field: &nc.ContainerConcurrencyMaxLimit,
+		key:          "container-concurrency",
+		field:        &nc.ContainerConcurrency,
+		defaultValue: DefaultContainerConcurrency,
 	}} {
-		if raw, ok := data[i64.key]; ok {
-			val, err := strconv.ParseInt(raw, 10, 64)
-			if err != nil {
-				return nil, err
-			}
+		if raw, ok := data[i64.key]; !ok {
+			*i64.field = i64.defaultValue
+		} else if val, err := strconv.ParseInt(raw, 10, 64); err != nil {
+			return nil, err
+		} else {
 			*i64.field = val
 		}
 	}
@@ -101,13 +88,9 @@ func NewDefaultsConfigFromMap(data map[string]string) (*Defaults, error) {
 	if nc.RevisionTimeoutSeconds > nc.MaxRevisionTimeoutSeconds {
 		return nil, fmt.Errorf("revision-timeout-seconds (%d) cannot be greater than max-revision-timeout-seconds (%d)", nc.RevisionTimeoutSeconds, nc.MaxRevisionTimeoutSeconds)
 	}
-	if nc.ContainerConcurrencyMaxLimit < 1 {
-		return nil, apis.ErrOutOfBoundsValue(
-			nc.ContainerConcurrencyMaxLimit, 1, math.MaxInt32, "container-concurrency-max-limit")
-	}
-	if nc.ContainerConcurrency < 0 || nc.ContainerConcurrency > nc.ContainerConcurrencyMaxLimit {
-		return nil, apis.ErrOutOfBoundsValue(
-			nc.ContainerConcurrency, 0, nc.ContainerConcurrencyMaxLimit, "container-concurrency")
+
+	if nc.ContainerConcurrency < 0 || nc.ContainerConcurrency > DefaultMaxRevisionContainerConcurrency {
+		return nil, apis.ErrOutOfBoundsValue(nc.ContainerConcurrency, 0, DefaultMaxRevisionContainerConcurrency, "containerConcurrency")
 	}
 
 	// Process resource quantity fields
@@ -136,7 +119,9 @@ func NewDefaultsConfigFromMap(data map[string]string) (*Defaults, error) {
 		}
 	}
 
-	if raw, ok := data["container-name-template"]; ok {
+	if raw, ok := data["container-name-template"]; !ok {
+		nc.UserContainerNameTemplate = DefaultUserContainerName
+	} else {
 		tmpl, err := template.New("user-container").Parse(raw)
 		if err != nil {
 			return nil, err
@@ -160,9 +145,6 @@ func NewDefaultsConfigFromConfigMap(config *corev1.ConfigMap) (*Defaults, error)
 
 // Defaults includes the default values to be populated by the webhook.
 type Defaults struct {
-	// Feature flag to enable multi container support
-	EnableMultiContainer bool
-
 	RevisionTimeoutSeconds int64
 	// This is the timeout set for cluster ingress.
 	// RevisionTimeoutSeconds must be less than this value.
@@ -172,10 +154,6 @@ type Defaults struct {
 
 	ContainerConcurrency int64
 
-	// ContainerConcurrencyMaxLimit is the maximum permitted container concurrency
-	// or target value in the system.
-	ContainerConcurrencyMaxLimit int64
-
 	RevisionCPURequest    *resource.Quantity
 	RevisionCPULimit      *resource.Quantity
 	RevisionMemoryRequest *resource.Quantity
diff --git a/vendor/knative.dev/serving/pkg/apis/networking/register.go b/vendor/knative.dev/serving/pkg/apis/networking/register.go
index 0e7d1880..268e6f99 100644
--- a/vendor/knative.dev/serving/pkg/apis/networking/register.go
+++ b/vendor/knative.dev/serving/pkg/apis/networking/register.go
@@ -44,7 +44,7 @@ const (
 	SKSLabelKey = GroupName + "/serverlessservice"
 
 	// ServiceTypeKey is the label key attached to a service specifying the type of service.
-	// e.g. Public, Private.
+	// e.g. Public, Metrics
 	ServiceTypeKey = GroupName + "/serviceType"
 
 	// OriginSecretNameLabelKey is the label key attached to the TLS secret to indicate
@@ -98,6 +98,10 @@ const (
 	// ServiceTypePublic is the label value for externally reachable
 	// services for user applications.
 	ServiceTypePublic ServiceType = "Public"
+	// ServiceTypeMetrics is the label value for Metrics services. Such services
+	// are used for metric scraping.
+	// TODO(5900): Remove after 0.12 is cut.
+	ServiceTypeMetrics ServiceType = "Metrics"
 )
 
 // Pseudo-constants
diff --git a/vendor/knative.dev/serving/pkg/apis/networking/v1alpha1/serverlessservice_types.go b/vendor/knative.dev/serving/pkg/apis/networking/v1alpha1/serverlessservice_types.go
index 99499234..3d2a6427 100644
--- a/vendor/knative.dev/serving/pkg/apis/networking/v1alpha1/serverlessservice_types.go
+++ b/vendor/knative.dev/serving/pkg/apis/networking/v1alpha1/serverlessservice_types.go
@@ -101,11 +101,6 @@ type ServerlessServiceSpec struct {
 	// The application-layer protocol. Matches `RevisionProtocolType` set on the owning pa/revision.
 	// serving imports networking, so just use string.
 	ProtocolType networking.ProtocolType
-
-	// NumActivators contains number of Activators that this revision should be
-	// assigned.
-	// O means — assign all.
-	NumActivators int32 `json:"numActivators,omitempty"`
 }
 
 // ServerlessServiceStatus describes the current state of the ServerlessService.
diff --git a/vendor/knative.dev/serving/pkg/apis/networking/v1alpha1/serverlessservice_validation.go b/vendor/knative.dev/serving/pkg/apis/networking/v1alpha1/serverlessservice_validation.go
index 0ee05b2b..ebace729 100644
--- a/vendor/knative.dev/serving/pkg/apis/networking/v1alpha1/serverlessservice_validation.go
+++ b/vendor/knative.dev/serving/pkg/apis/networking/v1alpha1/serverlessservice_validation.go
@@ -46,10 +46,6 @@ func (spec *ServerlessServiceSpec) Validate(ctx context.Context) *apis.FieldErro
 		all = all.Also(apis.ErrInvalidValue(spec.Mode, "mode"))
 	}
 
-	if spec.NumActivators < 0 {
-		all = all.Also(apis.ErrInvalidValue(spec.NumActivators, "numActivators"))
-	}
-
 	all = all.Also(serving.ValidateNamespacedObjectReference(&spec.ObjectRef).ViaField("objectRef"))
 
 	return all.Also(spec.ProtocolType.Validate(ctx).ViaField("protocolType"))
diff --git a/vendor/knative.dev/serving/pkg/apis/serving/k8s_validation.go b/vendor/knative.dev/serving/pkg/apis/serving/k8s_validation.go
index 8de35761..09be2109 100644
--- a/vendor/knative.dev/serving/pkg/apis/serving/k8s_validation.go
+++ b/vendor/knative.dev/serving/pkg/apis/serving/k8s_validation.go
@@ -17,7 +17,6 @@ limitations under the License.
 package serving
 
 import (
-	"context"
 	"fmt"
 	"math"
 	"path/filepath"
@@ -30,7 +29,6 @@ import (
 	"k8s.io/apimachinery/pkg/util/validation"
 	"knative.dev/pkg/apis"
 	"knative.dev/pkg/profiling"
-	"knative.dev/serving/pkg/apis/config"
 	"knative.dev/serving/pkg/apis/networking"
 )
 
@@ -238,8 +236,7 @@ func validateEnvFrom(envFromList []corev1.EnvFromSource) *apis.FieldError {
 	return errs
 }
 
-// ValidatePodSpec validates the pod spec
-func ValidatePodSpec(ctx context.Context, ps corev1.PodSpec) *apis.FieldError {
+func ValidatePodSpec(ps corev1.PodSpec) *apis.FieldError {
 	// This is inlined, and so it makes for a less meaningful
 	// error message.
 	// if equality.Semantic.DeepEqual(ps, corev1.PodSpec{}) {
@@ -260,7 +257,7 @@ func ValidatePodSpec(ctx context.Context, ps corev1.PodSpec) *apis.FieldError {
 		errs = errs.Also(ValidateContainer(ps.Containers[0], volumes).
 			ViaFieldIndex("containers", 0))
 	default:
-		errs = errs.Also(validateContainers(ctx, ps.Containers, volumes))
+		errs = errs.Also(apis.ErrMultipleOneOf("containers"))
 	}
 	if ps.ServiceAccountName != "" {
 		for range validation.IsDNS1123Subdomain(ps.ServiceAccountName) {
@@ -270,82 +267,7 @@ func ValidatePodSpec(ctx context.Context, ps corev1.PodSpec) *apis.FieldError {
 	return errs
 }
 
-func validateContainers(ctx context.Context, containers []corev1.Container, volumes sets.String) *apis.FieldError {
-	var errs *apis.FieldError
-	cfg := config.FromContextOrDefaults(ctx).Defaults
-	if !cfg.EnableMultiContainer {
-		errs = errs.Also(&apis.FieldError{Message: fmt.Sprintf("enable-multi-container is off, "+
-			"but found %d containers", len(containers))})
-	} else {
-		errs = errs.Also(validateContainersPorts(containers).ViaField("containers"))
-		for i := range containers {
-			// Probes are not allowed on other than serving container,
-			// ref: http://bit.ly/probes-condition
-			if len(containers[i].Ports) == 0 {
-				errs = errs.Also(validateSidecarContainer(containers[i], volumes).ViaFieldIndex("containers", i))
-			} else {
-				errs = errs.Also(ValidateContainer(containers[i], volumes).ViaFieldIndex("containers", i))
-			}
-		}
-	}
-	return errs
-}
-
-// validateContainersPorts validates port when specified multiple containers
-func validateContainersPorts(containers []corev1.Container) *apis.FieldError {
-	var count int
-	for i := range containers {
-		count += len(containers[i].Ports)
-	}
-	// When no container ports are specified.
-	if count == 0 {
-		return apis.ErrMissingField("ports")
-	}
-	// More than one container sections have ports.
-	if count > 1 {
-		return apis.ErrMultipleOneOf("ports")
-	}
-	return nil
-}
-
-// validateSidecarContainer validate fields for non serving containers
-func validateSidecarContainer(container corev1.Container, volumes sets.String) *apis.FieldError {
-	var errs *apis.FieldError
-	if container.LivenessProbe != nil {
-		errs = errs.Also(apis.CheckDisallowedFields(*container.LivenessProbe,
-			*ProbeMask(&corev1.Probe{})).ViaField("livenessProbe"))
-	}
-	if container.ReadinessProbe != nil {
-		errs = errs.Also(apis.CheckDisallowedFields(*container.ReadinessProbe,
-			*ProbeMask(&corev1.Probe{})).ViaField("readinessProbe"))
-	}
-	return errs.Also(validate(container, volumes))
-}
-
-// ValidateContainer validate fields for serving containers
 func ValidateContainer(container corev1.Container, volumes sets.String) *apis.FieldError {
-	var errs *apis.FieldError
-	// Single container cannot have multiple ports
-	errs = errs.Also(portValidation(container.Ports).ViaField("ports"))
-	// Liveness Probes
-	errs = errs.Also(validateProbe(container.LivenessProbe).ViaField("livenessProbe"))
-	// Readiness Probes
-	errs = errs.Also(validateReadinessProbe(container.ReadinessProbe).ViaField("readinessProbe"))
-	return errs.Also(validate(container, volumes))
-}
-
-func portValidation(containerPorts []corev1.ContainerPort) *apis.FieldError {
-	if len(containerPorts) > 1 {
-		return &apis.FieldError{
-			Message: "More than one container port is set",
-			Paths:   []string{apis.CurrentField},
-			Details: "Only a single port is allowed",
-		}
-	}
-	return nil
-}
-
-func validate(container corev1.Container, volumes sets.String) *apis.FieldError {
 	if equality.Semantic.DeepEqual(container, corev1.Container{}) {
 		return apis.ErrMissingField(apis.CurrentField)
 	}
@@ -374,8 +296,12 @@ func validate(container corev1.Container, volumes sets.String) *apis.FieldError
 		}
 		errs = errs.Also(fe)
 	}
+	// Liveness Probes
+	errs = errs.Also(validateProbe(container.LivenessProbe).ViaField("livenessProbe"))
 	// Ports
 	errs = errs.Also(validateContainerPorts(container.Ports).ViaField("ports"))
+	// Readiness Probes
+	errs = errs.Also(validateReadinessProbe(container.ReadinessProbe).ViaField("readinessProbe"))
 	// Resources
 	errs = errs.Also(validateResources(&container.Resources).ViaField("resources"))
 	// SecurityContext
@@ -471,6 +397,14 @@ func validateContainerPorts(ports []corev1.ContainerPort) *apis.FieldError {
 	// user can set container port which names "user-port" to define application's port.
 	// Queue-proxy will use it to send requests to application
 	// if user didn't set any port, it will set default port user-port=8080.
+	if len(ports) > 1 {
+		errs = errs.Also(&apis.FieldError{
+			Message: "More than one container port is set",
+			Paths:   []string{apis.CurrentField},
+			Details: "Only a single port is allowed",
+		})
+	}
+
 	userPort := ports[0]
 
 	errs = errs.Also(apis.CheckDisallowedFields(userPort, *ContainerPortMask(&userPort)))
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 9b396450..df3ec6fd 100644
--- a/vendor/knative.dev/serving/pkg/apis/serving/metadata_validation.go
+++ b/vendor/knative.dev/serving/pkg/apis/serving/metadata_validation.go
@@ -91,12 +91,11 @@ func ValidateTimeoutSeconds(ctx context.Context, timeoutSeconds int64) *apis.Fie
 
 // ValidateContainerConcurrency function validates the ContainerConcurrency field
 // TODO(#5007): Move this to autoscaling.
-func ValidateContainerConcurrency(ctx context.Context, containerConcurrency *int64) *apis.FieldError {
+func ValidateContainerConcurrency(containerConcurrency *int64) *apis.FieldError {
 	if containerConcurrency != nil {
-		cfg := config.FromContextOrDefaults(ctx).Defaults
-		if *containerConcurrency < 0 || *containerConcurrency > cfg.ContainerConcurrencyMaxLimit {
+		if *containerConcurrency < 0 || *containerConcurrency > config.DefaultMaxRevisionContainerConcurrency {
 			return apis.ErrOutOfBoundsValue(
-				*containerConcurrency, 0, cfg.ContainerConcurrencyMaxLimit, apis.CurrentField)
+				*containerConcurrency, 0, config.DefaultMaxRevisionContainerConcurrency, apis.CurrentField)
 		}
 	}
 	return nil
diff --git a/vendor/knative.dev/serving/pkg/apis/serving/v1/revision_defaults.go b/vendor/knative.dev/serving/pkg/apis/serving/v1/revision_defaults.go
index 0849af37..01df5b62 100644
--- a/vendor/knative.dev/serving/pkg/apis/serving/v1/revision_defaults.go
+++ b/vendor/knative.dev/serving/pkg/apis/serving/v1/revision_defaults.go
@@ -19,11 +19,8 @@ package v1
 import (
 	"context"
 
-	"github.com/google/uuid"
-
 	corev1 "k8s.io/api/core/v1"
 	"knative.dev/pkg/apis"
-	"knative.dev/pkg/kmeta"
 	"knative.dev/pkg/ptr"
 	"knative.dev/serving/pkg/apis/config"
 )
@@ -54,70 +51,52 @@ func (rs *RevisionSpec) SetDefaults(ctx context.Context) {
 
 	for idx := range rs.PodSpec.Containers {
 		if rs.PodSpec.Containers[idx].Name == "" {
-			if len(rs.PodSpec.Containers) > 1 {
-				rs.PodSpec.Containers[idx].Name = kmeta.ChildName(cfg.Defaults.UserContainerName(ctx), "-"+uuid.New().String())
-			} else {
-				rs.PodSpec.Containers[idx].Name = cfg.Defaults.UserContainerName(ctx)
-			}
+			rs.PodSpec.Containers[idx].Name = cfg.Defaults.UserContainerName(ctx)
 		}
 
-		rs.applyDefault(&rs.PodSpec.Containers[idx], cfg)
-	}
-}
-
-func (rs *RevisionSpec) applyDefault(container *corev1.Container, cfg *config.Config) {
-	if container.Resources.Requests == nil {
-		container.Resources.Requests = corev1.ResourceList{}
-	}
-	if _, ok := container.Resources.Requests[corev1.ResourceCPU]; !ok {
-		if rc := cfg.Defaults.RevisionCPURequest; rc != nil {
-			container.Resources.Requests[corev1.ResourceCPU] = *rc
+		if rs.PodSpec.Containers[idx].Resources.Requests == nil {
+			rs.PodSpec.Containers[idx].Resources.Requests = corev1.ResourceList{}
 		}
-	}
-	if _, ok := container.Resources.Requests[corev1.ResourceMemory]; !ok {
-		if rm := cfg.Defaults.RevisionMemoryRequest; rm != nil {
-			container.Resources.Requests[corev1.ResourceMemory] = *rm
+		if _, ok := rs.PodSpec.Containers[idx].Resources.Requests[corev1.ResourceCPU]; !ok {
+			if rsrc := cfg.Defaults.RevisionCPURequest; rsrc != nil {
+				rs.PodSpec.Containers[idx].Resources.Requests[corev1.ResourceCPU] = *rsrc
+			}
+		}
+		if _, ok := rs.PodSpec.Containers[idx].Resources.Requests[corev1.ResourceMemory]; !ok {
+			if rsrc := cfg.Defaults.RevisionMemoryRequest; rsrc != nil {
+				rs.PodSpec.Containers[idx].Resources.Requests[corev1.ResourceMemory] = *rsrc
+			}
 		}
-	}
 
-	if container.Resources.Limits == nil {
-		container.Resources.Limits = corev1.ResourceList{}
-	}
-	if _, ok := container.Resources.Limits[corev1.ResourceCPU]; !ok {
-		if rc := cfg.Defaults.RevisionCPULimit; rc != nil {
-			container.Resources.Limits[corev1.ResourceCPU] = *rc
+		if rs.PodSpec.Containers[idx].Resources.Limits == nil {
+			rs.PodSpec.Containers[idx].Resources.Limits = corev1.ResourceList{}
 		}
-	}
-	if _, ok := container.Resources.Limits[corev1.ResourceMemory]; !ok {
-		if rm := cfg.Defaults.RevisionMemoryLimit; rm != nil {
-			container.Resources.Limits[corev1.ResourceMemory] = *rm
+		if _, ok := rs.PodSpec.Containers[idx].Resources.Limits[corev1.ResourceCPU]; !ok {
+			if rsrc := cfg.Defaults.RevisionCPULimit; rsrc != nil {
+				rs.PodSpec.Containers[idx].Resources.Limits[corev1.ResourceCPU] = *rsrc
+			}
+		}
+		if _, ok := rs.PodSpec.Containers[idx].Resources.Limits[corev1.ResourceMemory]; !ok {
+			if rsrc := cfg.Defaults.RevisionMemoryLimit; rsrc != nil {
+				rs.PodSpec.Containers[idx].Resources.Limits[corev1.ResourceMemory] = *rsrc
+			}
+		}
+		if rs.PodSpec.Containers[idx].ReadinessProbe == nil {
+			rs.PodSpec.Containers[idx].ReadinessProbe = &corev1.Probe{}
+		}
+		if rs.PodSpec.Containers[idx].ReadinessProbe.TCPSocket == nil &&
+			rs.PodSpec.Containers[idx].ReadinessProbe.HTTPGet == nil &&
+			rs.PodSpec.Containers[idx].ReadinessProbe.Exec == nil {
+			rs.PodSpec.Containers[idx].ReadinessProbe.TCPSocket = &corev1.TCPSocketAction{}
 		}
-	}
-
-	// If there are multiple containers then default probes will be applied to the container where user specified PORT
-	// default probes will not be applied for non serving containers
-	if len(rs.PodSpec.Containers) == 1 || len(container.Ports) != 0 {
-		rs.applyProbes(container)
-	}
-
-	vms := container.VolumeMounts
-	for i := range vms {
-		vms[i].ReadOnly = true
-	}
-}
 
-func (*RevisionSpec) applyProbes(container *corev1.Container) {
-	if container.ReadinessProbe == nil {
-		container.ReadinessProbe = &corev1.Probe{}
-	}
-	if container.ReadinessProbe.TCPSocket == nil &&
-		container.ReadinessProbe.HTTPGet == nil &&
-		container.ReadinessProbe.Exec == nil {
-		container.ReadinessProbe.TCPSocket = &corev1.TCPSocketAction{}
-	}
+		if rs.PodSpec.Containers[idx].ReadinessProbe.SuccessThreshold == 0 {
+			rs.PodSpec.Containers[idx].ReadinessProbe.SuccessThreshold = 1
+		}
 
-	if container.ReadinessProbe.SuccessThreshold == 0 {
-		container.ReadinessProbe.SuccessThreshold = 1
+		vms := rs.PodSpec.Containers[idx].VolumeMounts
+		for i := range vms {
+			vms[i].ReadOnly = true
+		}
 	}
-
 }
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 fd426b7e..d83b3760 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
@@ -96,14 +96,14 @@ func (current *RevisionTemplateSpec) VerifyNameChange(ctx context.Context, og Re
 
 // Validate implements apis.Validatable
 func (rs *RevisionSpec) Validate(ctx context.Context) *apis.FieldError {
-	errs := serving.ValidatePodSpec(ctx, rs.PodSpec)
+	errs := serving.ValidatePodSpec(rs.PodSpec)
 
 	if rs.TimeoutSeconds != nil {
 		errs = errs.Also(serving.ValidateTimeoutSeconds(ctx, *rs.TimeoutSeconds))
 	}
 
 	if rs.ContainerConcurrency != nil {
-		errs = errs.Also(serving.ValidateContainerConcurrency(ctx, rs.ContainerConcurrency).ViaField("containerConcurrency"))
+		errs = errs.Also(serving.ValidateContainerConcurrency(rs.ContainerConcurrency).ViaField("containerConcurrency"))
 	}
 
 	return errs
diff --git a/vendor/knative.dev/serving/pkg/apis/serving/v1alpha1/revision_conversion.go b/vendor/knative.dev/serving/pkg/apis/serving/v1alpha1/revision_conversion.go
index e54ebfee..c6314d33 100644
--- a/vendor/knative.dev/serving/pkg/apis/serving/v1alpha1/revision_conversion.go
+++ b/vendor/knative.dev/serving/pkg/apis/serving/v1alpha1/revision_conversion.go
@@ -62,8 +62,10 @@ func (source *RevisionSpec) ConvertTo(ctx context.Context, sink *v1.RevisionSpec
 			Volumes:            source.Volumes,
 			ImagePullSecrets:   source.ImagePullSecrets,
 		}
-	case len(source.Containers) != 0:
+	case len(source.Containers) == 1:
 		sink.PodSpec = source.PodSpec
+	case len(source.Containers) > 1:
+		return apis.ErrMultipleOneOf("containers")
 	default:
 		return apis.ErrMissingOneOf("container", "containers")
 	}
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 53907424..7c333281 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
@@ -79,7 +79,7 @@ func (rs *RevisionSpec) GetContainer() *corev1.Container {
 	if len(rs.Containers) > 0 {
 		return &rs.Containers[0]
 	}
-	// Should be unreachable post-validation, but is here to ease testing.
+	// Should be unreachable post-validation, but here to ease testing.
 	return &corev1.Container{}
 }
 
diff --git a/vendor/knative.dev/serving/pkg/apis/serving/v1alpha1/revision_validation.go b/vendor/knative.dev/serving/pkg/apis/serving/v1alpha1/revision_validation.go
index 1f3b2edf..713c5677 100644
--- a/vendor/knative.dev/serving/pkg/apis/serving/v1alpha1/revision_validation.go
+++ b/vendor/knative.dev/serving/pkg/apis/serving/v1alpha1/revision_validation.go
@@ -126,7 +126,7 @@ func (rs *RevisionSpec) Validate(ctx context.Context) *apis.FieldError {
 		errs = errs.Also(err)
 	} else {
 		if rs.ContainerConcurrency != nil {
-			errs = errs.Also(serving.ValidateContainerConcurrency(ctx, rs.ContainerConcurrency).ViaField("containerConcurrency"))
+			errs = errs.Also(serving.ValidateContainerConcurrency(rs.ContainerConcurrency).ViaField("containerConcurrency"))
 		}
 	}
 
diff --git a/vendor/knative.dev/serving/pkg/autoscaler/config/config.go b/vendor/knative.dev/serving/pkg/autoscaler/config/config.go
index 1263c6aa..b51e0e8e 100644
--- a/vendor/knative.dev/serving/pkg/autoscaler/config/config.go
+++ b/vendor/knative.dev/serving/pkg/autoscaler/config/config.go
@@ -62,11 +62,6 @@ type Config struct {
 	// NB: most of our computations are in floats, so this is float to avoid casting.
 	TargetBurstCapacity float64
 
-	// ActivatorCapacity is the number of the concurrent requests an activator
-	// task can accept. This is used in activator subsetting algorithm, to determine
-	// the number of activators per revision.
-	ActivatorCapacity float64
-
 	// General autoscaler algorithm configuration.
 	MaxScaleUpRate           float64
 	MaxScaleDownRate         float64
@@ -80,46 +75,31 @@ type Config struct {
 	PodAutoscalerClass string
 }
 
-func defaultConfig() *Config {
-	return &Config{
-		EnableScaleToZero:                  true,
-		EnableGracefulScaledown:            false,
-		ContainerConcurrencyTargetFraction: defaultTargetUtilization,
-		ContainerConcurrencyTargetDefault:  100,
-		// TODO(#1956): Tune target usage based on empirical data.
-		TargetUtilization:        defaultTargetUtilization,
-		RPSTargetDefault:         200,
-		MaxScaleUpRate:           1000,
-		MaxScaleDownRate:         2,
-		TargetBurstCapacity:      200,
-		PanicWindowPercentage:    10,
-		ActivatorCapacity:        100,
-		PanicThresholdPercentage: 200,
-		StableWindow:             60 * time.Second,
-		ScaleToZeroGracePeriod:   30 * time.Second,
-		TickInterval:             2 * time.Second,
-		PodAutoscalerClass:       autoscaling.KPA,
-	}
-}
-
 // NewConfigFromMap creates a Config from the supplied map
 func NewConfigFromMap(data map[string]string) (*Config, error) {
-	lc := defaultConfig()
+	lc := &Config{
+		TargetUtilization: defaultTargetUtilization,
+	}
 
 	// Process bool fields.
 	for _, b := range []struct {
-		key   string
-		field *bool
+		key          string
+		field        *bool
+		defaultValue bool
 	}{
 		{
-			key:   "enable-scale-to-zero",
-			field: &lc.EnableScaleToZero,
+			key:          "enable-scale-to-zero",
+			field:        &lc.EnableScaleToZero,
+			defaultValue: true,
 		},
 		{
-			key:   "enable-graceful-scaledown",
-			field: &lc.EnableGracefulScaledown,
+			key:          "enable-graceful-scaledown",
+			field:        &lc.EnableGracefulScaledown,
+			defaultValue: false,
 		}} {
-		if raw, ok := data[b.key]; ok {
+		if raw, ok := data[b.key]; !ok {
+			*b.field = b.defaultValue
+		} else {
 			*b.field = strings.EqualFold(raw, "true")
 		}
 	}
@@ -128,39 +108,47 @@ func NewConfigFromMap(data map[string]string) (*Config, error) {
 	for _, f64 := range []struct {
 		key   string
 		field *float64
+		// specified exactly when optional
+		defaultValue float64
 	}{{
-		key:   "max-scale-up-rate",
-		field: &lc.MaxScaleUpRate,
+		key:          "max-scale-up-rate",
+		field:        &lc.MaxScaleUpRate,
+		defaultValue: 1000.0,
 	}, {
-		key:   "max-scale-down-rate",
-		field: &lc.MaxScaleDownRate,
+		key:          "max-scale-down-rate",
+		field:        &lc.MaxScaleDownRate,
+		defaultValue: 2.0,
 	}, {
 		key:   "container-concurrency-target-percentage",
 		field: &lc.ContainerConcurrencyTargetFraction,
+		// TODO(#1956): Tune target usage based on empirical data.
+		defaultValue: defaultTargetUtilization,
 	}, {
-		key:   "container-concurrency-target-default",
-		field: &lc.ContainerConcurrencyTargetDefault,
-	}, {
-		key:   "requests-per-second-target-default",
-		field: &lc.RPSTargetDefault,
+		key:          "container-concurrency-target-default",
+		field:        &lc.ContainerConcurrencyTargetDefault,
+		defaultValue: 100.0,
 	}, {
-		key:   "target-burst-capacity",
-		field: &lc.TargetBurstCapacity,
+		key:          "requests-per-second-target-default",
+		field:        &lc.RPSTargetDefault,
+		defaultValue: 200.0,
 	}, {
-		key:   "panic-window-percentage",
-		field: &lc.PanicWindowPercentage,
+		key:          "target-burst-capacity",
+		field:        &lc.TargetBurstCapacity,
+		defaultValue: 200,
 	}, {
-		key:   "activator-capacity",
-		field: &lc.ActivatorCapacity,
+		key:          "panic-window-percentage",
+		field:        &lc.PanicWindowPercentage,
+		defaultValue: 10.0,
 	}, {
-		key:   "panic-threshold-percentage",
-		field: &lc.PanicThresholdPercentage,
+		key:          "panic-threshold-percentage",
+		field:        &lc.PanicThresholdPercentage,
+		defaultValue: 200.0,
 	}} {
-		if raw, ok := data[f64.key]; ok {
-			val, err := strconv.ParseFloat(raw, 64)
-			if err != nil {
-				return nil, err
-			}
+		if raw, ok := data[f64.key]; !ok {
+			*f64.field = f64.defaultValue
+		} else if val, err := strconv.ParseFloat(raw, 64); err != nil {
+			return nil, err
+		} else {
 			*f64.field = val
 		}
 	}
@@ -175,27 +163,32 @@ func NewConfigFromMap(data map[string]string) (*Config, error) {
 
 	// Process Duration fields
 	for _, dur := range []struct {
-		key   string
-		field *time.Duration
+		key          string
+		field        *time.Duration
+		defaultValue time.Duration
 	}{{
-		key:   "stable-window",
-		field: &lc.StableWindow,
+		key:          "stable-window",
+		field:        &lc.StableWindow,
+		defaultValue: 60 * time.Second,
 	}, {
-		key:   "scale-to-zero-grace-period",
-		field: &lc.ScaleToZeroGracePeriod,
+		key:          "scale-to-zero-grace-period",
+		field:        &lc.ScaleToZeroGracePeriod,
+		defaultValue: 30 * time.Second,
 	}, {
-		key:   "tick-interval",
-		field: &lc.TickInterval,
+		key:          "tick-interval",
+		field:        &lc.TickInterval,
+		defaultValue: 2 * time.Second,
 	}} {
-		if raw, ok := data[dur.key]; ok {
-			val, err := time.ParseDuration(raw)
-			if err != nil {
-				return nil, err
-			}
+		if raw, ok := data[dur.key]; !ok {
+			*dur.field = dur.defaultValue
+		} else if val, err := time.ParseDuration(raw); err != nil {
+			return nil, err
+		} else {
 			*dur.field = val
 		}
 	}
 
+	lc.PodAutoscalerClass = autoscaling.KPA
 	if pac, ok := data["pod-autoscaler-class"]; ok {
 		lc.PodAutoscalerClass = pac
 	}
@@ -223,10 +216,6 @@ func validate(lc *Config) (*Config, error) {
 		return nil, fmt.Errorf("requests-per-second-target-default must be at least %v, got %v", autoscaling.TargetMin, lc.RPSTargetDefault)
 	}
 
-	if lc.ActivatorCapacity < 1 {
-		return nil, fmt.Errorf("activator-capacity = %v, must be at least 1", lc.ActivatorCapacity)
-	}
-
 	if lc.MaxScaleUpRate <= 1.0 {
 		return nil, fmt.Errorf("max-scale-up-rate = %v, must be greater than 1.0", lc.MaxScaleUpRate)
 	}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 1efb22c5..0678f4c6 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -47,8 +47,6 @@ github.com/google/go-cmp/cmp/internal/value
 github.com/google/go-containerregistry/pkg/name
 # github.com/google/gofuzz v1.0.0
 github.com/google/gofuzz
-# github.com/google/uuid v1.1.1
-github.com/google/uuid
 # github.com/googleapis/gnostic v0.2.2
 github.com/googleapis/gnostic/OpenAPIv2
 github.com/googleapis/gnostic/compiler
@@ -497,7 +495,7 @@ knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1alpha2/fake
 knative.dev/eventing/pkg/legacyclient/clientset/versioned/scheme
 knative.dev/eventing/pkg/legacyclient/clientset/versioned/typed/legacysources/v1alpha1
 knative.dev/eventing/pkg/logging
-# knative.dev/pkg v0.0.0-20200406231459-466c676678dd
+# knative.dev/pkg v0.0.0-20200409225505-9147309d5366
 knative.dev/pkg/apis
 knative.dev/pkg/apis/duck
 knative.dev/pkg/apis/duck/v1
@@ -513,7 +511,7 @@ knative.dev/pkg/logging/logkey
 knative.dev/pkg/profiling
 knative.dev/pkg/ptr
 knative.dev/pkg/tracker
-# knative.dev/serving v0.13.1-0.20200407135959-877f5a24bf41
+# knative.dev/serving v0.13.2
 knative.dev/serving/pkg/apis/autoscaling
 knative.dev/serving/pkg/apis/autoscaling/v1alpha1
 knative.dev/serving/pkg/apis/config
@@ -527,7 +525,7 @@ knative.dev/serving/pkg/autoscaler/config
 knative.dev/serving/pkg/client/clientset/versioned/scheme
 knative.dev/serving/pkg/client/clientset/versioned/typed/serving/v1
 knative.dev/serving/pkg/client/clientset/versioned/typed/serving/v1/fake
-# knative.dev/test-infra v0.0.0-20200406223059-a7b18bf0c37b
+# knative.dev/test-infra v0.0.0-20200409221904-5e04d955cdb9
 knative.dev/test-infra/scripts
 # sigs.k8s.io/kustomize v2.0.3+incompatible
 sigs.k8s.io/kustomize/pkg/commands/build


Test patch:
diff --git a/pkg/kn/commands/flags/listprint_test.go b/pkg/kn/commands/flags/listprint_test.go
index 7a9afb0c..da17e88d 100644
--- a/pkg/kn/commands/flags/listprint_test.go
+++ b/pkg/kn/commands/flags/listprint_test.go
@@ -48,3 +48,18 @@ func TestListPrintFlags(t *testing.T) {
 	_, ok := p.(hprinters.ResourcePrinter)
 	assert.Check(t, ok == true)
 }
+
+func TestListPrintFlagsPrint(t *testing.T) {
+	var cmd *cobra.Command
+	flags := NewListPrintFlags(func(h hprinters.PrintHandler) {})
+
+	cmd = &cobra.Command{}
+	flags.AddFlags(cmd)
+
+	pr, err := flags.ToPrinter()
+	assert.NilError(t, err)
+	assert.Assert(t, pr != nil)
+
+	err = flags.Print(nil, cmd.OutOrStdout())
+	assert.NilError(t, err)
+}
diff --git a/pkg/kn/commands/service/describe_test.go b/pkg/kn/commands/service/describe_test.go
index 0c751303..dc2543e2 100644
--- a/pkg/kn/commands/service/describe_test.go
+++ b/pkg/kn/commands/service/describe_test.go
@@ -432,11 +432,15 @@ func TestServiceDescribeVerbose(t *testing.T) {
 	r := client.Recorder()
 
 	// Prepare service
-	expectedService := createTestService("foo", []string{"rev1", "rev2"}, goodConditions())
+	expectedService := createTestService("foo", []string{"rev1", "rev2", "rev3"}, goodConditions())
+	expectedService.Status.Traffic = expectedService.Status.Traffic[2:]
+	expectedService.Status.Traffic[0].LatestRevision = ptr.Bool(true)
+	expectedService.Status.Traffic[0].Percent = ptr.Int64(int64(100))
 	r.GetService("foo", &expectedService, nil)
 
 	rev1 := createTestRevision("rev1", 1)
 	rev2 := createTestRevision("rev2", 2)
+	rev3 := createTestRevision("rev3", 3)
 
 	revList := servingv1.RevisionList{
 		TypeMeta: metav1.TypeMeta{
@@ -444,7 +448,7 @@ func TestServiceDescribeVerbose(t *testing.T) {
 			APIVersion: "serving.knative.dev/v1",
 		},
 		Items: []servingv1.Revision{
-			rev1, rev2,
+			rev1, rev2, rev3,
 		},
 	}
 
@@ -452,8 +456,7 @@ func TestServiceDescribeVerbose(t *testing.T) {
 	r.ListRevisions(knclient.HasLabelSelector(api_serving.ServiceLabelKey, "foo"), &revList, nil)
 
 	// Fetch the revisions
-	r.GetRevision("rev1", &rev1, nil)
-	r.GetRevision("rev2", &rev2, nil)
+	r.GetRevision("rev3", &rev3, nil)
 
 	// Testing:
 	output, err := executeServiceCommand(client, "describe", "foo", "--verbose")
@@ -462,12 +465,16 @@ func TestServiceDescribeVerbose(t *testing.T) {
 	validateServiceOutput(t, "foo", output)
 
 	assert.Assert(t, cmp.Regexp("Cluster:\\s+https://foo.default.svc.cluster.local", output))
-	assert.Assert(t, util.ContainsAll(output, "Image", "Name", "gcr.io/test/image (at 123456)", "50%", "(0s)"))
+	assert.Assert(t, util.ContainsAll(output, "Image", "Name", "gcr.io/test/image (at 123456)", "100%", "(0s)"))
 	assert.Assert(t, util.ContainsAll(output, "Env:", "env1=eval1\n", "env2=eval2\n"))
 	assert.Assert(t, util.ContainsAll(output, "EnvFrom:", "cm:test1\n", "cm:test2\n"))
 	assert.Assert(t, util.ContainsAll(output, "Annotations:", "anno1=aval1\n", "anno2=aval2\n"))
 	assert.Assert(t, util.ContainsAll(output, "Labels:", "label1=lval1\n", "label2=lval2\n"))
 	assert.Assert(t, util.ContainsAll(output, "[1]", "[2]"))
+	assert.Assert(t, util.ContainsAll(output, "rev1", "rev2", "rev3"))
+	assert.Equal(t, strings.Count(output, "rev3"), 1)
+	assert.Equal(t, strings.Count(output, "rev2"), 1)
+	assert.Equal(t, strings.Count(output, "rev1"), 1)
 
 	// Validate that all recorded API methods have been called
 	r.Validate()
diff --git a/pkg/util/unstructured_test.go b/pkg/util/unstructured_test.go
new file mode 100644
index 00000000..8f40db4e
--- /dev/null
+++ b/pkg/util/unstructured_test.go
@@ -0,0 +1,86 @@
+// Copyright © 2019 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 util
+
+import (
+	"testing"
+
+	"gotest.tools/assert"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+	servingv1 "knative.dev/serving/pkg/apis/serving/v1"
+)
+
+func TestToUnstructuredList(t *testing.T) {
+	serviceList := servingv1.ServiceList{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: "v1",
+			Kind:       "List",
+		},
+		Items: []servingv1.Service{createService("s1"), createService("s2")},
+	}
+	expectedList := &unstructured.UnstructuredList{
+		Object: map[string]interface{}{
+			"apiVersion": string("v1"),
+			"kind":       string("List"),
+		},
+	}
+	expectedList.Items = []unstructured.Unstructured{createUnstructured("s1"), createUnstructured("s2")}
+	unstructedList, err := ToUnstructuredList(&serviceList)
+	assert.NilError(t, err)
+	assert.DeepEqual(t, unstructedList, expectedList)
+
+	service1 := createService("s3")
+	expectedList = &unstructured.UnstructuredList{}
+	expectedList.Items = []unstructured.Unstructured{createUnstructured("s3")}
+	unstructedList, err = ToUnstructuredList(&service1)
+	assert.NilError(t, err)
+	assert.DeepEqual(t, unstructedList, expectedList)
+}
+
+func createService(name string) servingv1.Service {
+	service := servingv1.Service{
+		TypeMeta: metav1.TypeMeta{
+			Kind:       "Service",
+			APIVersion: "serving.knative.dev/v1",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      name,
+			Namespace: "default",
+		},
+	}
+	return service
+}
+
+func createUnstructured(name string) unstructured.Unstructured {
+	return unstructured.Unstructured{
+		Object: map[string]interface{}{
+			"apiVersion": "serving.knative.dev/v1",
+			"kind":       "Service",
+			"metadata": map[string]interface{}{
+				"namespace":         "default",
+				"name":              name,
+				"creationTimestamp": nil,
+			},
+			"spec": map[string]interface{}{
+				"template": map[string]interface{}{
+					"metadata": map[string]interface{}{"creationTimestamp": nil},
+					"spec":     map[string]interface{}{"containers": nil},
+				},
+			},
+			"status": map[string]interface{}{},
+		},
+	}
+}
diff --git a/test/e2e/basic_workflow_test.go b/test/e2e/basic_workflow_test.go
index 129b06e5..4d4ebdd3 100644
--- a/test/e2e/basic_workflow_test.go
+++ b/test/e2e/basic_workflow_test.go
@@ -48,6 +48,9 @@ func TestBasicWorkflow(t *testing.T) {
 	serviceList(r, "hello")
 	serviceDescribe(r, "hello")
 
+	t.Log("return list --output name about hello service")
+	serviceListOutput(r, "hello")
+
 	t.Log("update hello service's configuration and return no error")
 	serviceUpdate(r, "hello", "--env", "TARGET=kn", "--port", "8888")
 
@@ -113,6 +116,12 @@ func serviceDescribe(r *test.KnRunResultCollector, serviceName string) {
 	assert.Assert(r.T(), util.ContainsAll(out.Stdout, "Name", "Namespace", "URL", "Age", "Revisions"))
 }
 
+func serviceListOutput(r *test.KnRunResultCollector, serviceName string) {
+	out := r.KnTest().Kn().Run("service", "list", serviceName, "--output", "name")
+	r.AssertNoError(out)
+	assert.Check(r.T(), util.ContainsAll(out.Stdout, serviceName, "service.serving.knative.dev"))
+}
+
 func serviceUpdate(r *test.KnRunResultCollector, serviceName string, args ...string) {
 	fullArgs := append([]string{}, "service", "update", serviceName)
 	fullArgs = append(fullArgs, args...)
diff --git a/test/e2e/service_options_test.go b/test/e2e/service_options_test.go
index 6747db1e..3d31c318 100644
--- a/test/e2e/service_options_test.go
+++ b/test/e2e/service_options_test.go
@@ -87,6 +87,13 @@ func TestServiceOptions(t *testing.T) {
 	validateServiceAnnotations(r, "svc3", map[string]string{"alpha": "direwolf", "brave": ""})
 	serviceDelete(r, "svc3")
 
+	t.Log("create, update and validate service with annotations but -a")
+	serviceCreateWithOptions(r, "svc3a", "-a", "alpha=wolf", "-a", "brave=horse")
+	validateServiceAnnotations(r, "svc3a", map[string]string{"alpha": "wolf", "brave": "horse"})
+	serviceUpdate(r, "svc3a", "-a", "alpha=direwolf", "-a", "brave-")
+	validateServiceAnnotations(r, "svc3a", map[string]string{"alpha": "direwolf", "brave": ""})
+	serviceDelete(r, "svc3a")
+
 	t.Log("create, update and validate service with autoscale window option")
 	serviceCreateWithOptions(r, "svc4", "--autoscale-window", "1m")
 	validateAutoscaleWindow(r, "svc4", "1m")
diff --git a/vendor/knative.dev/test-infra/scripts/presubmit-tests.sh b/vendor/knative.dev/test-infra/scripts/presubmit-tests.sh
index c01adcb5..bdd74754 100644
--- a/vendor/knative.dev/test-infra/scripts/presubmit-tests.sh
+++ b/vendor/knative.dev/test-infra/scripts/presubmit-tests.sh
@@ -129,7 +129,7 @@ function markdown_build_tests() {
   (( DISABLE_MD_LINTING && DISABLE_MD_LINK_CHECK )) && return 0
   # Get changed markdown files (ignore /vendor, github templates, and deleted files)
   local mdfiles=""
-  for file in $(echo "${CHANGED_FILES}" | grep \.md$ | grep -v ^vendor/ | grep -v ^.github/); do
+  for file in $(echo "${CHANGED_FILES}" | grep \\.md$ | grep -v ^vendor/ | grep -v ^.github/); do
     [[ -f "${file}" ]] && mdfiles="${mdfiles} ${file}"
   done
   [[ -z "${mdfiles}" ]] && return 0