Merge pull request #63346 from roycaihw/bump-kube-openapi

Automatic merge from submit-queue (batch tested with PRs 61455, 63346, 63130, 63404). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>.

Bump kube-openapi dependency

**What this PR does / why we need it**:
Pick up https://github.com/kubernetes/kube-openapi/pull/64

**Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*:
Fixes #63218

**Special notes for your reviewer**:

**Release note**:

```release-note
NONE
```

/sig api-machinery
/cc @mbohlool @liggitt

Kubernetes-commit: 89e6895e1c550658b7c145436868b70fb3cabbcd
This commit is contained in:
Kubernetes Publisher 2018-05-03 14:24:07 -07:00
commit 3c94deb4df
6 changed files with 433 additions and 252 deletions

326
Godeps/Godeps.json generated
View File

@ -268,655 +268,655 @@
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/api/errors", "ImportPath": "k8s.io/apimachinery/pkg/api/errors",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/api/meta", "ImportPath": "k8s.io/apimachinery/pkg/api/meta",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/api/resource", "ImportPath": "k8s.io/apimachinery/pkg/api/resource",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion", "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1", "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/conversion", "ImportPath": "k8s.io/apimachinery/pkg/conversion",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/fields", "ImportPath": "k8s.io/apimachinery/pkg/fields",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/labels", "ImportPath": "k8s.io/apimachinery/pkg/labels",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime", "ImportPath": "k8s.io/apimachinery/pkg/runtime",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/selection", "ImportPath": "k8s.io/apimachinery/pkg/selection",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/types", "ImportPath": "k8s.io/apimachinery/pkg/types",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/cache", "ImportPath": "k8s.io/apimachinery/pkg/util/cache",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/clock", "ImportPath": "k8s.io/apimachinery/pkg/util/clock",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/diff", "ImportPath": "k8s.io/apimachinery/pkg/util/diff",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/errors", "ImportPath": "k8s.io/apimachinery/pkg/util/errors",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/framer", "ImportPath": "k8s.io/apimachinery/pkg/util/framer",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/intstr", "ImportPath": "k8s.io/apimachinery/pkg/util/intstr",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/json", "ImportPath": "k8s.io/apimachinery/pkg/util/json",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch", "ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/net", "ImportPath": "k8s.io/apimachinery/pkg/util/net",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/runtime", "ImportPath": "k8s.io/apimachinery/pkg/util/runtime",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/sets", "ImportPath": "k8s.io/apimachinery/pkg/util/sets",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch", "ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/validation", "ImportPath": "k8s.io/apimachinery/pkg/util/validation",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/wait", "ImportPath": "k8s.io/apimachinery/pkg/util/wait",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/yaml", "ImportPath": "k8s.io/apimachinery/pkg/util/yaml",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/version", "ImportPath": "k8s.io/apimachinery/pkg/version",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/watch", "ImportPath": "k8s.io/apimachinery/pkg/watch",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json", "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" "Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
}, },
{ {
"ImportPath": "k8s.io/client-go/discovery", "ImportPath": "k8s.io/client-go/discovery",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/discovery/fake", "ImportPath": "k8s.io/client-go/discovery/fake",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers", "ImportPath": "k8s.io/client-go/informers",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/admissionregistration", "ImportPath": "k8s.io/client-go/informers/admissionregistration",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/admissionregistration/v1alpha1", "ImportPath": "k8s.io/client-go/informers/admissionregistration/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/admissionregistration/v1beta1", "ImportPath": "k8s.io/client-go/informers/admissionregistration/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/apps", "ImportPath": "k8s.io/client-go/informers/apps",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/apps/v1", "ImportPath": "k8s.io/client-go/informers/apps/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/apps/v1beta1", "ImportPath": "k8s.io/client-go/informers/apps/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/apps/v1beta2", "ImportPath": "k8s.io/client-go/informers/apps/v1beta2",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/autoscaling", "ImportPath": "k8s.io/client-go/informers/autoscaling",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/autoscaling/v1", "ImportPath": "k8s.io/client-go/informers/autoscaling/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/autoscaling/v2beta1", "ImportPath": "k8s.io/client-go/informers/autoscaling/v2beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/batch", "ImportPath": "k8s.io/client-go/informers/batch",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/batch/v1", "ImportPath": "k8s.io/client-go/informers/batch/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/batch/v1beta1", "ImportPath": "k8s.io/client-go/informers/batch/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/batch/v2alpha1", "ImportPath": "k8s.io/client-go/informers/batch/v2alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/certificates", "ImportPath": "k8s.io/client-go/informers/certificates",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/certificates/v1beta1", "ImportPath": "k8s.io/client-go/informers/certificates/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/core", "ImportPath": "k8s.io/client-go/informers/core",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/core/v1", "ImportPath": "k8s.io/client-go/informers/core/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/events", "ImportPath": "k8s.io/client-go/informers/events",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/events/v1beta1", "ImportPath": "k8s.io/client-go/informers/events/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/extensions", "ImportPath": "k8s.io/client-go/informers/extensions",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/extensions/v1beta1", "ImportPath": "k8s.io/client-go/informers/extensions/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/internalinterfaces", "ImportPath": "k8s.io/client-go/informers/internalinterfaces",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/networking", "ImportPath": "k8s.io/client-go/informers/networking",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/networking/v1", "ImportPath": "k8s.io/client-go/informers/networking/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/policy", "ImportPath": "k8s.io/client-go/informers/policy",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/policy/v1beta1", "ImportPath": "k8s.io/client-go/informers/policy/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/rbac", "ImportPath": "k8s.io/client-go/informers/rbac",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/rbac/v1", "ImportPath": "k8s.io/client-go/informers/rbac/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/rbac/v1alpha1", "ImportPath": "k8s.io/client-go/informers/rbac/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/rbac/v1beta1", "ImportPath": "k8s.io/client-go/informers/rbac/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/scheduling", "ImportPath": "k8s.io/client-go/informers/scheduling",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/scheduling/v1alpha1", "ImportPath": "k8s.io/client-go/informers/scheduling/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/settings", "ImportPath": "k8s.io/client-go/informers/settings",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/settings/v1alpha1", "ImportPath": "k8s.io/client-go/informers/settings/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/storage", "ImportPath": "k8s.io/client-go/informers/storage",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/storage/v1", "ImportPath": "k8s.io/client-go/informers/storage/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/storage/v1alpha1", "ImportPath": "k8s.io/client-go/informers/storage/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/storage/v1beta1", "ImportPath": "k8s.io/client-go/informers/storage/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes", "ImportPath": "k8s.io/client-go/kubernetes",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/scheme", "ImportPath": "k8s.io/client-go/kubernetes/scheme",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1", "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta2", "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta2",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v2alpha1", "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v2alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/certificates/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/certificates/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/events/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/events/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/extensions/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/extensions/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/networking/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/networking/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/policy/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/policy/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1", "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1", "ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/settings/v1alpha1", "ImportPath": "k8s.io/client-go/kubernetes/typed/settings/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1alpha1", "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/admissionregistration/v1alpha1", "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/admissionregistration/v1beta1", "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/apps/v1", "ImportPath": "k8s.io/client-go/listers/apps/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/apps/v1beta1", "ImportPath": "k8s.io/client-go/listers/apps/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/apps/v1beta2", "ImportPath": "k8s.io/client-go/listers/apps/v1beta2",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/autoscaling/v1", "ImportPath": "k8s.io/client-go/listers/autoscaling/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/autoscaling/v2beta1", "ImportPath": "k8s.io/client-go/listers/autoscaling/v2beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/batch/v1", "ImportPath": "k8s.io/client-go/listers/batch/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/batch/v1beta1", "ImportPath": "k8s.io/client-go/listers/batch/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/batch/v2alpha1", "ImportPath": "k8s.io/client-go/listers/batch/v2alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/certificates/v1beta1", "ImportPath": "k8s.io/client-go/listers/certificates/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/core/v1", "ImportPath": "k8s.io/client-go/listers/core/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/events/v1beta1", "ImportPath": "k8s.io/client-go/listers/events/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/extensions/v1beta1", "ImportPath": "k8s.io/client-go/listers/extensions/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/networking/v1", "ImportPath": "k8s.io/client-go/listers/networking/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/policy/v1beta1", "ImportPath": "k8s.io/client-go/listers/policy/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/rbac/v1", "ImportPath": "k8s.io/client-go/listers/rbac/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/rbac/v1alpha1", "ImportPath": "k8s.io/client-go/listers/rbac/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/rbac/v1beta1", "ImportPath": "k8s.io/client-go/listers/rbac/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/scheduling/v1alpha1", "ImportPath": "k8s.io/client-go/listers/scheduling/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/settings/v1alpha1", "ImportPath": "k8s.io/client-go/listers/settings/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/storage/v1", "ImportPath": "k8s.io/client-go/listers/storage/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/storage/v1alpha1", "ImportPath": "k8s.io/client-go/listers/storage/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/storage/v1beta1", "ImportPath": "k8s.io/client-go/listers/storage/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication", "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1", "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/pkg/version", "ImportPath": "k8s.io/client-go/pkg/version",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/plugin/pkg/client/auth/exec", "ImportPath": "k8s.io/client-go/plugin/pkg/client/auth/exec",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/rest", "ImportPath": "k8s.io/client-go/rest",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/rest/watch", "ImportPath": "k8s.io/client-go/rest/watch",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/testing", "ImportPath": "k8s.io/client-go/testing",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/auth", "ImportPath": "k8s.io/client-go/tools/auth",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/cache", "ImportPath": "k8s.io/client-go/tools/cache",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/clientcmd", "ImportPath": "k8s.io/client-go/tools/clientcmd",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/clientcmd/api", "ImportPath": "k8s.io/client-go/tools/clientcmd/api",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/clientcmd/api/latest", "ImportPath": "k8s.io/client-go/tools/clientcmd/api/latest",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/clientcmd/api/v1", "ImportPath": "k8s.io/client-go/tools/clientcmd/api/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/metrics", "ImportPath": "k8s.io/client-go/tools/metrics",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/pager", "ImportPath": "k8s.io/client-go/tools/pager",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/record", "ImportPath": "k8s.io/client-go/tools/record",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/reference", "ImportPath": "k8s.io/client-go/tools/reference",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/transport", "ImportPath": "k8s.io/client-go/transport",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/buffer", "ImportPath": "k8s.io/client-go/util/buffer",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/cert", "ImportPath": "k8s.io/client-go/util/cert",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/flowcontrol", "ImportPath": "k8s.io/client-go/util/flowcontrol",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/homedir", "ImportPath": "k8s.io/client-go/util/homedir",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/integer", "ImportPath": "k8s.io/client-go/util/integer",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/retry", "ImportPath": "k8s.io/client-go/util/retry",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/workqueue", "ImportPath": "k8s.io/client-go/util/workqueue",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/util/proto", "ImportPath": "k8s.io/kube-openapi/pkg/util/proto",
"Rev": "50ae88d24ede7b8bad68e23c805b5d3da5c8abaf" "Rev": "f08db293d3ef80052d6513ece19792642a289fea"
} }
] ]
} }

View File

@ -89,20 +89,52 @@ func ObjectReflectDiff(a, b interface{}) string {
} }
out := []string{""} out := []string{""}
for _, d := range diffs { for _, d := range diffs {
elidedA, elidedB := limit(d.a, d.b, 80)
out = append(out, out = append(out,
fmt.Sprintf("%s:", d.path), fmt.Sprintf("%s:", d.path),
limit(fmt.Sprintf(" a: %#v", d.a), 80), fmt.Sprintf(" a: %s", elidedA),
limit(fmt.Sprintf(" b: %#v", d.b), 80), fmt.Sprintf(" b: %s", elidedB),
) )
} }
return strings.Join(out, "\n") return strings.Join(out, "\n")
} }
func limit(s string, max int) string { // limit:
if len(s) > max { // 1. stringifies aObj and bObj
return s[:max] // 2. elides identical prefixes if either is too long
// 3. elides remaining content from the end if either is too long
func limit(aObj, bObj interface{}, max int) (string, string) {
elidedPrefix := ""
elidedASuffix := ""
elidedBSuffix := ""
a, b := fmt.Sprintf("%#v", aObj), fmt.Sprintf("%#v", bObj)
for {
switch {
case len(a) > max && len(a) > 4 && len(b) > 4 && a[:4] == b[:4]:
// a is too long, b has data, and the first several characters are the same
elidedPrefix = "..."
a = a[2:]
b = b[2:]
case len(b) > max && len(b) > 4 && len(a) > 4 && a[:4] == b[:4]:
// b is too long, a has data, and the first several characters are the same
elidedPrefix = "..."
a = a[2:]
b = b[2:]
case len(a) > max:
a = a[:max]
elidedASuffix = "..."
case len(b) > max:
b = b[:max]
elidedBSuffix = "..."
default:
// both are short enough
return elidedPrefix + a + elidedASuffix, elidedPrefix + b + elidedBSuffix
}
} }
return s
} }
func public(s string) bool { func public(s string) bool {

View File

@ -260,11 +260,11 @@
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/common", "ImportPath": "k8s.io/kube-openapi/pkg/common",
"Rev": "50ae88d24ede7b8bad68e23c805b5d3da5c8abaf" "Rev": "f08db293d3ef80052d6513ece19792642a289fea"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/generators", "ImportPath": "k8s.io/kube-openapi/pkg/generators",
"Rev": "50ae88d24ede7b8bad68e23c805b5d3da5c8abaf" "Rev": "f08db293d3ef80052d6513ece19792642a289fea"
} }
] ]
} }

View File

@ -32,7 +32,7 @@ type OpenAPIDefinition struct {
type ReferenceCallback func(path string) spec.Ref type ReferenceCallback func(path string) spec.Ref
// OpenAPIDefinitions is collection of all definitions. // GetOpenAPIDefinitions is collection of all definitions.
type GetOpenAPIDefinitions func(ReferenceCallback) map[string]OpenAPIDefinition type GetOpenAPIDefinitions func(ReferenceCallback) map[string]OpenAPIDefinition
// OpenAPIDefinitionGetter gets openAPI definitions for a given type. If a type implements this interface, // OpenAPIDefinitionGetter gets openAPI definitions for a given type. If a type implements this interface,

View File

@ -0,0 +1,128 @@
/*
Copyright 2018 The Kubernetes 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 generators
import (
"fmt"
"sort"
"strings"
"k8s.io/gengo/examples/set-gen/sets"
"k8s.io/gengo/types"
)
const extensionPrefix = "x-kubernetes-"
// Extension tag to openapi extension
var tagToExtension = map[string]string{
"patchMergeKey": "x-kubernetes-patch-merge-key",
"patchStrategy": "x-kubernetes-patch-strategy",
"listType": "x-kubernetes-list-type",
"listMapKey": "x-kubernetes-list-map-keys",
}
// Enum values per extension
var allowedExtensionValues = map[string]sets.String{
"x-kubernetes-patch-strategy": sets.NewString("merge", "retainKeys"),
"x-kubernetes-list-type": sets.NewString("atomic", "set", "map"),
}
// Extension encapsulates information necessary to generate an OpenAPI extension.
type extension struct {
idlTag string // Example: listType
xName string // Example: x-kubernetes-list-type
values []string // Example: [atomic]
}
func (e extension) validateAllowedValues() error {
// allowedValues not set means no restrictions on values.
allowedValues, exists := allowedExtensionValues[e.xName]
if !exists {
return nil
}
// Check for missing value.
if len(e.values) == 0 {
return fmt.Errorf("%s needs a value, none given.", e.idlTag)
}
// For each extension value, validate that it is allowed.
if !allowedValues.HasAll(e.values...) {
return fmt.Errorf("%v not allowed for %s. Allowed values: %v",
e.values, e.idlTag, allowedValues.List())
}
return nil
}
func (e extension) hasMultipleValues() bool {
return len(e.values) > 1
}
// Returns sorted list of map keys. Needed for deterministic testing.
func sortedMapKeys(m map[string][]string) []string {
keys := make([]string, len(m))
i := 0
for k := range m {
keys[i] = k
i++
}
sort.Strings(keys)
return keys
}
// Parses comments to return openapi extensions.
// NOTE: Non-empty errors does not mean extensions is empty.
func parseExtensions(comments []string) ([]extension, []error) {
extensions := []extension{}
errors := []error{}
// First, generate extensions from "+k8s:openapi-gen=x-kubernetes-*" annotations.
values := getOpenAPITagValue(comments)
for _, val := range values {
// Example: x-kubernetes-member-tag:member_test
if strings.HasPrefix(val, extensionPrefix) {
parts := strings.SplitN(val, ":", 2)
if len(parts) != 2 {
errors = append(errors, fmt.Errorf("invalid extension value: %v", val))
continue
}
e := extension{
idlTag: tagName, // Example: k8s:openapi-gen
xName: parts[0], // Example: x-kubernetes-member-tag
values: []string{parts[1]}, // Example: member_test
}
extensions = append(extensions, e)
}
}
// Next, generate extensions from "idlTags" (e.g. +listType)
tagValues := types.ExtractCommentTags("+", comments)
for _, idlTag := range sortedMapKeys(tagValues) {
xName, exists := tagToExtension[idlTag]
if !exists {
continue
}
values := tagValues[idlTag]
e := extension{
idlTag: idlTag, // listType
xName: xName, // x-kubernetes-list-type
values: values, // [atomic]
}
if err := e.validateAllowedValues(); err != nil {
// For now, only log the extension validation errors.
errors = append(errors, err)
}
extensions = append(extensions, e)
}
return extensions, errors
}

View File

@ -40,15 +40,17 @@ const tagOptional = "optional"
// Known values for the tag. // Known values for the tag.
const ( const (
tagValueTrue = "true" tagValueTrue = "true"
tagValueFalse = "false" tagValueFalse = "false"
tagExtensionPrefix = "x-kubernetes-"
tagPatchStrategy = "patchStrategy"
tagPatchMergeKey = "patchMergeKey"
patchStrategyExtensionName = "patch-strategy"
patchMergeKeyExtensionName = "patch-merge-key"
) )
// Used for temporary validation of patch struct tags.
// TODO: Remove patch struct tag validation because they we are now consuming OpenAPI on server.
var tempPatchTags = [...]string{
"patchMergeKey",
"patchStrategy",
}
func getOpenAPITagValue(comments []string) []string { func getOpenAPITagValue(comments []string) []string {
return types.ExtractCommentTags("+", comments)[tagName] return types.ExtractCommentTags("+", comments)[tagName]
} }
@ -155,6 +157,7 @@ type openAPIGen struct {
// TargetPackage is the package that will get GetOpenAPIDefinitions function returns all open API definitions. // TargetPackage is the package that will get GetOpenAPIDefinitions function returns all open API definitions.
targetPackage string targetPackage string
imports namer.ImportTracker imports namer.ImportTracker
types []*types.Type
context *generator.Context context *generator.Context
} }
@ -169,10 +172,18 @@ func NewOpenAPIGen(sanitizedName string, targetPackage string, context *generato
} }
} }
const nameTmpl = "schema_$.type|private$"
func (g *openAPIGen) Namers(c *generator.Context) namer.NameSystems { func (g *openAPIGen) Namers(c *generator.Context) namer.NameSystems {
// Have the raw namer for this file track what it imports. // Have the raw namer for this file track what it imports.
return namer.NameSystems{ return namer.NameSystems{
"raw": namer.NewRawNamer(g.targetPackage, g.imports), "raw": namer.NewRawNamer(g.targetPackage, g.imports),
"private": &namer.NameStrategy{
Join: func(pre string, in []string, post string) string {
return strings.Join(in, "_")
},
PrependPackageNames: 4, // enough to fully qualify from k8s.io/api/...
},
} }
} }
@ -181,6 +192,7 @@ func (g *openAPIGen) Filter(c *generator.Context, t *types.Type) bool {
if strings.HasPrefix(t.Name.Name, "codecSelfer") { if strings.HasPrefix(t.Name.Name, "codecSelfer") {
return false return false
} }
g.types = append(g.types, t)
return true return true
} }
@ -215,13 +227,17 @@ func (g *openAPIGen) Init(c *generator.Context, w io.Writer) error {
sw := generator.NewSnippetWriter(w, c, "$", "$") sw := generator.NewSnippetWriter(w, c, "$", "$")
sw.Do("func GetOpenAPIDefinitions(ref $.ReferenceCallback|raw$) map[string]$.OpenAPIDefinition|raw$ {\n", argsFromType(nil)) sw.Do("func GetOpenAPIDefinitions(ref $.ReferenceCallback|raw$) map[string]$.OpenAPIDefinition|raw$ {\n", argsFromType(nil))
sw.Do("return map[string]$.OpenAPIDefinition|raw${\n", argsFromType(nil)) sw.Do("return map[string]$.OpenAPIDefinition|raw${\n", argsFromType(nil))
return sw.Error()
}
func (g *openAPIGen) Finalize(c *generator.Context, w io.Writer) error { for _, t := range g.types {
sw := generator.NewSnippetWriter(w, c, "$", "$") err := newOpenAPITypeWriter(sw).generateCall(t)
sw.Do("}\n", nil) if err != nil {
return err
}
}
sw.Do("}\n", nil) sw.Do("}\n", nil)
sw.Do("}\n\n", nil)
return sw.Error() return sw.Error()
} }
@ -243,10 +259,6 @@ func getJsonTags(m *types.Member) []string {
return strings.Split(jsonTag, ",") return strings.Split(jsonTag, ",")
} }
func getPatchTags(m *types.Member) (string, string) {
return reflect.StructTag(m.Tags).Get(tagPatchMergeKey), reflect.StructTag(m.Tags).Get(tagPatchStrategy)
}
func getReferableName(m *types.Member) string { func getReferableName(m *types.Member) string {
jsonTags := getJsonTags(m) jsonTags := getJsonTags(m)
if len(jsonTags) > 0 { if len(jsonTags) > 0 {
@ -342,7 +354,7 @@ func (g openAPITypeWriter) generateMembers(t *types.Type, required []string) ([]
return required, nil return required, nil
} }
func (g openAPITypeWriter) generate(t *types.Type) error { func (g openAPITypeWriter) generateCall(t *types.Type) error {
// Only generate for struct type and ignore the rest // Only generate for struct type and ignore the rest
switch t.Kind { switch t.Kind {
case types.Struct: case types.Struct:
@ -350,31 +362,36 @@ func (g openAPITypeWriter) generate(t *types.Type) error {
g.Do("\"$.$\": ", t.Name) g.Do("\"$.$\": ", t.Name)
if hasOpenAPIDefinitionMethod(t) { if hasOpenAPIDefinitionMethod(t) {
g.Do("$.type|raw${}.OpenAPIDefinition(),\n", args) g.Do("$.type|raw${}.OpenAPIDefinition(),\n", args)
} else {
g.Do(nameTmpl+"(ref),\n", args)
}
}
return g.Error()
}
func (g openAPITypeWriter) generate(t *types.Type) error {
// Only generate for struct type and ignore the rest
switch t.Kind {
case types.Struct:
if hasOpenAPIDefinitionMethod(t) {
// already invoked directly
return nil return nil
} }
args := argsFromType(t)
g.Do("func "+nameTmpl+"(ref $.ReferenceCallback|raw$) $.OpenAPIDefinition|raw$ {\n", args)
if hasOpenAPIDefinitionMethods(t) { if hasOpenAPIDefinitionMethods(t) {
// Since this generated snippet is part of a map: g.Do("return $.OpenAPIDefinition|raw${\n"+
//
// map[string]common.OpenAPIDefinition: {
// "TYPE_NAME": {
// Schema: spec.Schema{ ... },
// },
// }
//
// For compliance with gofmt -s it's important we elide the
// struct type. The type is implied by the map and will be
// removed otherwise.
g.Do("{\n"+
"Schema: spec.Schema{\n"+ "Schema: spec.Schema{\n"+
"SchemaProps: spec.SchemaProps{\n"+ "SchemaProps: spec.SchemaProps{\n"+
"Type:$.type|raw${}.OpenAPISchemaType(),\n"+ "Type:$.type|raw${}.OpenAPISchemaType(),\n"+
"Format:$.type|raw${}.OpenAPISchemaFormat(),\n"+ "Format:$.type|raw${}.OpenAPISchemaFormat(),\n"+
"},\n"+ "},\n"+
"},\n"+ "},\n"+
"},\n", args) "}\n}\n\n", args)
return nil return nil
} }
g.Do("{\nSchema: spec.Schema{\nSchemaProps: spec.SchemaProps{\n", nil) g.Do("return $.OpenAPIDefinition|raw${\nSchema: spec.Schema{\nSchemaProps: spec.SchemaProps{\n", args)
g.generateDescription(t.CommentLines) g.generateDescription(t.CommentLines)
g.Do("Properties: map[string]$.SpecSchemaType|raw${\n", args) g.Do("Properties: map[string]$.SpecSchemaType|raw${\n", args)
required, err := g.generateMembers(t, []string{}) required, err := g.generateMembers(t, []string{})
@ -386,7 +403,7 @@ func (g openAPITypeWriter) generate(t *types.Type) error {
g.Do("Required: []string{\"$.$\"},\n", strings.Join(required, "\",\"")) g.Do("Required: []string{\"$.$\"},\n", strings.Join(required, "\",\""))
} }
g.Do("},\n", nil) g.Do("},\n", nil)
if err := g.generateExtensions(t.CommentLines); err != nil { if err := g.generateStructExtensions(t); err != nil {
return err return err
} }
g.Do("},\n", nil) g.Do("},\n", nil)
@ -406,70 +423,74 @@ func (g openAPITypeWriter) generate(t *types.Type) error {
} }
g.Do("\"$.$\",", k) g.Do("\"$.$\",", k)
} }
g.Do("},\n},\n", nil) g.Do("},\n}\n}\n\n", nil)
} }
return nil return nil
} }
func (g openAPITypeWriter) generateExtensions(CommentLines []string) error { func (g openAPITypeWriter) generateStructExtensions(t *types.Type) error {
tagValues := getOpenAPITagValue(CommentLines) extensions, errors := parseExtensions(t.CommentLines)
type NameValue struct { // Initially, we will only log struct extension errors.
Name, Value string if len(errors) > 0 {
} for e := range errors {
extensions := []NameValue{} glog.V(2).Infof("[%s]: %s\n", t.String(), e)
for _, val := range tagValues {
if strings.HasPrefix(val, tagExtensionPrefix) {
parts := strings.SplitN(val, ":", 2)
if len(parts) != 2 {
return fmt.Errorf("invalid extension value: %v", val)
}
extensions = append(extensions, NameValue{parts[0], parts[1]})
} }
} }
patchMergeKeyTag, err := getSingleTagsValue(CommentLines, tagPatchMergeKey) // TODO(seans3): Validate struct extensions here.
if err != nil { g.emitExtensions(extensions)
return err return nil
} }
if len(patchMergeKeyTag) > 0 {
extensions = append(extensions, NameValue{tagExtensionPrefix + patchMergeKeyExtensionName, patchMergeKeyTag}) func (g openAPITypeWriter) generateMemberExtensions(m *types.Member, parent *types.Type) error {
} extensions, errors := parseExtensions(m.CommentLines)
patchStrategyTag, err := getSingleTagsValue(CommentLines, tagPatchStrategy) // Initially, we will only log member extension errors.
if err != nil { if len(errors) > 0 {
return err errorPrefix := fmt.Sprintf("[%s] %s:", parent.String(), m.String())
} for e := range errors {
if len(patchStrategyTag) > 0 { glog.V(2).Infof("%s %s\n", errorPrefix, e)
extensions = append(extensions, NameValue{tagExtensionPrefix + patchStrategyExtensionName, patchStrategyTag}) }
} }
// TODO(seans3): Validate member extensions here.
// Example: listType extension is only on a Slice.
// Example: cross-extension validation - listMapKey only makes sense with listType=map
g.emitExtensions(extensions)
return nil
}
func (g openAPITypeWriter) emitExtensions(extensions []extension) {
// If any extensions exist, then emit code to create them.
if len(extensions) == 0 { if len(extensions) == 0 {
return nil return
} }
g.Do("VendorExtensible: spec.VendorExtensible{\nExtensions: spec.Extensions{\n", nil) g.Do("VendorExtensible: spec.VendorExtensible{\nExtensions: spec.Extensions{\n", nil)
for _, extension := range extensions { for _, extension := range extensions {
g.Do("\"$.$\": ", extension.Name) g.Do("\"$.$\": ", extension.xName)
g.Do("\"$.$\",\n", extension.Value) if extension.hasMultipleValues() {
g.Do("[]string{\n", nil)
}
for _, value := range extension.values {
g.Do("\"$.$\",\n", value)
}
if extension.hasMultipleValues() {
g.Do("},\n", nil)
}
} }
g.Do("},\n},\n", nil) g.Do("},\n},\n", nil)
return nil
} }
// TODO(#44005): Move this validation outside of this generator (probably to policy verifier) // TODO(#44005): Move this validation outside of this generator (probably to policy verifier)
func (g openAPITypeWriter) validatePatchTags(m *types.Member, parent *types.Type) error { func (g openAPITypeWriter) validatePatchTags(m *types.Member, parent *types.Type) error {
patchMergeKeyStructTag, patchStrategyStructTag := getPatchTags(m) // TODO: Remove patch struct tag validation because they we are now consuming OpenAPI on server.
patchMergeKeyCommentTag, err := getSingleTagsValue(m.CommentLines, tagPatchMergeKey) for _, tagKey := range tempPatchTags {
if err != nil { structTagValue := reflect.StructTag(m.Tags).Get(tagKey)
return err commentTagValue, err := getSingleTagsValue(m.CommentLines, tagKey)
} if err != nil {
patchStrategyCommentTag, err := getSingleTagsValue(m.CommentLines, tagPatchStrategy) return err
if err != nil { }
return err if structTagValue != commentTagValue {
} return fmt.Errorf("Tags in comment and struct should match for member (%s) of (%s)",
if patchMergeKeyStructTag != patchMergeKeyCommentTag { m.Name, parent.Name.String())
return fmt.Errorf("patchMergeKey in comment and struct tags should match for member (%s) of (%s)", }
m.Name, parent.Name.String())
}
if patchStrategyStructTag != patchStrategyCommentTag {
return fmt.Errorf("patchStrategy in comment and struct tags should match for member (%s) of (%s)",
m.Name, parent.Name.String())
} }
return nil return nil
} }
@ -526,7 +547,7 @@ func (g openAPITypeWriter) generateProperty(m *types.Member, parent *types.Type)
return err return err
} }
g.Do("\"$.$\": {\n", name) g.Do("\"$.$\": {\n", name)
if err := g.generateExtensions(m.CommentLines); err != nil { if err := g.generateMemberExtensions(m, parent); err != nil {
return err return err
} }
g.Do("SchemaProps: spec.SchemaProps{\n", nil) g.Do("SchemaProps: spec.SchemaProps{\n", nil)