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",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/api/meta",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/api/resource",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/conversion",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/fields",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/labels",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/schema",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/selection",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/types",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/cache",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/clock",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/diff",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/errors",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/framer",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/intstr",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/json",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/net",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/runtime",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/sets",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/validation",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/validation/field",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/wait",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/yaml",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/version",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/watch",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect",
"Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a"
"Rev": "bd236513a4e35622d9007dff11eab07631645cd5"
},
{
"ImportPath": "k8s.io/client-go/discovery",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/discovery/fake",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/admissionregistration",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/admissionregistration/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/admissionregistration/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/apps",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/apps/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/apps/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/apps/v1beta2",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/autoscaling",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/autoscaling/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/autoscaling/v2beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/batch",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/batch/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/batch/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/batch/v2alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/certificates",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/certificates/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/core",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/core/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/events",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/events/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/extensions",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/extensions/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/internalinterfaces",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/networking",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/networking/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/policy",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/policy/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/rbac",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/rbac/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/rbac/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/rbac/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/scheduling",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/scheduling/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/settings",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/settings/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/storage",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/storage/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/storage/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/informers/storage/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/scheme",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta2",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v2alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/certificates/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/events/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/extensions/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/networking/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/policy/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/settings/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/admissionregistration/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/admissionregistration/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/apps/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/apps/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/apps/v1beta2",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/autoscaling/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/autoscaling/v2beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/batch/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/batch/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/batch/v2alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/certificates/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/core/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/events/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/extensions/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/networking/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/policy/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/rbac/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/rbac/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/rbac/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/scheduling/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/settings/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/storage/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/storage/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/listers/storage/v1beta1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/pkg/version",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/plugin/pkg/client/auth/exec",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/rest",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/rest/watch",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/testing",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/tools/auth",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/tools/cache",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/tools/clientcmd",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/tools/clientcmd/api",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/tools/clientcmd/api/latest",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/tools/clientcmd/api/v1",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/tools/metrics",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/tools/pager",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/tools/record",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/tools/reference",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/transport",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/util/buffer",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/util/cert",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/util/flowcontrol",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/util/homedir",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/util/integer",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/util/retry",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"ImportPath": "k8s.io/client-go/util/workqueue",
"Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a"
"Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3"
},
{
"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{""}
for _, d := range diffs {
elidedA, elidedB := limit(d.a, d.b, 80)
out = append(out,
fmt.Sprintf("%s:", d.path),
limit(fmt.Sprintf(" a: %#v", d.a), 80),
limit(fmt.Sprintf(" b: %#v", d.b), 80),
fmt.Sprintf(" a: %s", elidedA),
fmt.Sprintf(" b: %s", elidedB),
)
}
return strings.Join(out, "\n")
}
func limit(s string, max int) string {
if len(s) > max {
return s[:max]
// limit:
// 1. stringifies aObj and bObj
// 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 {

View File

@ -260,11 +260,11 @@
},
{
"ImportPath": "k8s.io/kube-openapi/pkg/common",
"Rev": "50ae88d24ede7b8bad68e23c805b5d3da5c8abaf"
"Rev": "f08db293d3ef80052d6513ece19792642a289fea"
},
{
"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
// OpenAPIDefinitions is collection of all definitions.
// GetOpenAPIDefinitions is collection of all definitions.
type GetOpenAPIDefinitions func(ReferenceCallback) map[string]OpenAPIDefinition
// 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.
const (
tagValueTrue = "true"
tagValueFalse = "false"
tagExtensionPrefix = "x-kubernetes-"
tagPatchStrategy = "patchStrategy"
tagPatchMergeKey = "patchMergeKey"
patchStrategyExtensionName = "patch-strategy"
patchMergeKeyExtensionName = "patch-merge-key"
tagValueTrue = "true"
tagValueFalse = "false"
)
// 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 {
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 string
imports namer.ImportTracker
types []*types.Type
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 {
// Have the raw namer for this file track what it imports.
return namer.NameSystems{
"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") {
return false
}
g.types = append(g.types, t)
return true
}
@ -215,13 +227,17 @@ func (g *openAPIGen) Init(c *generator.Context, w io.Writer) error {
sw := generator.NewSnippetWriter(w, c, "$", "$")
sw.Do("func GetOpenAPIDefinitions(ref $.ReferenceCallback|raw$) 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 {
sw := generator.NewSnippetWriter(w, c, "$", "$")
sw.Do("}\n", nil)
for _, t := range g.types {
err := newOpenAPITypeWriter(sw).generateCall(t)
if err != nil {
return err
}
}
sw.Do("}\n", nil)
sw.Do("}\n\n", nil)
return sw.Error()
}
@ -243,10 +259,6 @@ func getJsonTags(m *types.Member) []string {
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 {
jsonTags := getJsonTags(m)
if len(jsonTags) > 0 {
@ -342,7 +354,7 @@ func (g openAPITypeWriter) generateMembers(t *types.Type, required []string) ([]
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
switch t.Kind {
case types.Struct:
@ -350,31 +362,36 @@ func (g openAPITypeWriter) generate(t *types.Type) error {
g.Do("\"$.$\": ", t.Name)
if hasOpenAPIDefinitionMethod(t) {
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
}
args := argsFromType(t)
g.Do("func "+nameTmpl+"(ref $.ReferenceCallback|raw$) $.OpenAPIDefinition|raw$ {\n", args)
if hasOpenAPIDefinitionMethods(t) {
// Since this generated snippet is part of a map:
//
// 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"+
g.Do("return $.OpenAPIDefinition|raw${\n"+
"Schema: spec.Schema{\n"+
"SchemaProps: spec.SchemaProps{\n"+
"Type:$.type|raw${}.OpenAPISchemaType(),\n"+
"Format:$.type|raw${}.OpenAPISchemaFormat(),\n"+
"},\n"+
"},\n"+
"},\n", args)
"}\n}\n\n", args)
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.Do("Properties: map[string]$.SpecSchemaType|raw${\n", args)
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("},\n", nil)
if err := g.generateExtensions(t.CommentLines); err != nil {
if err := g.generateStructExtensions(t); err != nil {
return err
}
g.Do("},\n", nil)
@ -406,70 +423,74 @@ func (g openAPITypeWriter) generate(t *types.Type) error {
}
g.Do("\"$.$\",", k)
}
g.Do("},\n},\n", nil)
g.Do("},\n}\n}\n\n", nil)
}
return nil
}
func (g openAPITypeWriter) generateExtensions(CommentLines []string) error {
tagValues := getOpenAPITagValue(CommentLines)
type NameValue struct {
Name, Value string
}
extensions := []NameValue{}
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]})
func (g openAPITypeWriter) generateStructExtensions(t *types.Type) error {
extensions, errors := parseExtensions(t.CommentLines)
// Initially, we will only log struct extension errors.
if len(errors) > 0 {
for e := range errors {
glog.V(2).Infof("[%s]: %s\n", t.String(), e)
}
}
patchMergeKeyTag, err := getSingleTagsValue(CommentLines, tagPatchMergeKey)
if err != nil {
return err
}
if len(patchMergeKeyTag) > 0 {
extensions = append(extensions, NameValue{tagExtensionPrefix + patchMergeKeyExtensionName, patchMergeKeyTag})
}
patchStrategyTag, err := getSingleTagsValue(CommentLines, tagPatchStrategy)
if err != nil {
return err
}
if len(patchStrategyTag) > 0 {
extensions = append(extensions, NameValue{tagExtensionPrefix + patchStrategyExtensionName, patchStrategyTag})
// TODO(seans3): Validate struct extensions here.
g.emitExtensions(extensions)
return nil
}
func (g openAPITypeWriter) generateMemberExtensions(m *types.Member, parent *types.Type) error {
extensions, errors := parseExtensions(m.CommentLines)
// Initially, we will only log member extension errors.
if len(errors) > 0 {
errorPrefix := fmt.Sprintf("[%s] %s:", parent.String(), m.String())
for e := range errors {
glog.V(2).Infof("%s %s\n", errorPrefix, e)
}
}
// 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 {
return nil
return
}
g.Do("VendorExtensible: spec.VendorExtensible{\nExtensions: spec.Extensions{\n", nil)
for _, extension := range extensions {
g.Do("\"$.$\": ", extension.Name)
g.Do("\"$.$\",\n", extension.Value)
g.Do("\"$.$\": ", extension.xName)
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)
return nil
}
// TODO(#44005): Move this validation outside of this generator (probably to policy verifier)
func (g openAPITypeWriter) validatePatchTags(m *types.Member, parent *types.Type) error {
patchMergeKeyStructTag, patchStrategyStructTag := getPatchTags(m)
patchMergeKeyCommentTag, err := getSingleTagsValue(m.CommentLines, tagPatchMergeKey)
if err != nil {
return err
}
patchStrategyCommentTag, err := getSingleTagsValue(m.CommentLines, tagPatchStrategy)
if err != nil {
return err
}
if patchMergeKeyStructTag != patchMergeKeyCommentTag {
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())
// TODO: Remove patch struct tag validation because they we are now consuming OpenAPI on server.
for _, tagKey := range tempPatchTags {
structTagValue := reflect.StructTag(m.Tags).Get(tagKey)
commentTagValue, err := getSingleTagsValue(m.CommentLines, tagKey)
if err != nil {
return err
}
if structTagValue != commentTagValue {
return fmt.Errorf("Tags in comment and struct should match for member (%s) of (%s)",
m.Name, parent.Name.String())
}
}
return nil
}
@ -526,7 +547,7 @@ func (g openAPITypeWriter) generateProperty(m *types.Member, parent *types.Type)
return err
}
g.Do("\"$.$\": {\n", name)
if err := g.generateExtensions(m.CommentLines); err != nil {
if err := g.generateMemberExtensions(m, parent); err != nil {
return err
}
g.Do("SchemaProps: spec.SchemaProps{\n", nil)