Change:
The Service Catalog includes the type in . The openapi schema generated for it is wrong. It has two problems: it includes the field, which is marked as required it doesn't allow additional properties to be included under it Is this a BUG REPORT or FEATURE REQUEST?: BUG REPORT /kind bug What happened: If the Service Catalog openapi schema is exposed to kubectl (this currently requires a few tweaks and a patch), it reports validation errors when creating a ServiceInstance resource. What you expected to happen: The schema should allow to include arbitrary properties and not require the property to be included. How to reproduce it (as minimally and precisely as possible): not easy at the moment (I'll add instructions later if I'm unable to fix this myself) Anything else we need to know?: I'd like to tackle this problem myself, but I need guidance. Should openapi-gen handle this automatically for all occurences of RawExtension, or should each field of type be json-tagged individually? Environment: Kubernetes version (use ):
I've heard you're the goto guy for the openapi-gen. Please help? :)
/sig api-machinery
OK, I've found I can specify a custom schema for RawExtension the way it's done in Time and MicroTime. The remaining problem is how to specify that the RawExtension object can be of any type. Using is not supported currently - if I use it in the schema, the API server dies with:
/assign /cc
Issues go stale after 90d of inactivity. Mark the issue as fresh with . Stale issues rot after an additional 30d of inactivity and eventually close. If this issue is safe to close now please do so with . Send feedback to sig-testing, kubernetes/test-infra and/or . /lifecycle stale
Stale issues rot after 30d of inactivity. Mark the issue as fresh with . Rotten issues close after an additional 30d of inactivity. If this issue is safe to close now please do so with . Send feedback to sig-testing, kubernetes/test-infra and/or . /lifecycle rotten /remove-lifecycle stale
We've just hit this. /remove-lifecycle rotten /lifecycle frozen
hitting this
According to this: the raw extension can define its openapi type as: or alternatively what do you think? do you still work on this or you want me to send a PR?
Would changing the definition of RawExtension to this help the situation? (adding ) I noticed that this removes Raw from the openapi defintion of it, without changing how it is marshalled or unmarshalled (since we have custom functions for that) I'll try making a PR for this

Discussion:
API rule violation: names_match,k8s.io/apimachinery/pkg/apis/meta/v1,MicroTime,Time API rule violation: names_match,k8s.io/apimachinery/pkg/apis/meta/v1,StatusCause,Type API rule violation: names_match,k8s.io/apimachinery/pkg/apis/meta/v1,Time,Time <del> API rule violation: names_match,k8s.io/apimachinery/pkg/runtime,RawExtension,Raw </del> API rule violation: names_match,k8s.io/apimachinery/pkg/runtime,Unknown,ContentEncoding API rule violation: names_match,k8s.io/apimachinery/pkg/runtime,Unknown,ContentType API rule violation: names_match,k8s.io/apimachinery/pkg/runtime,Unknown,Raw

}, "io.k8s.apimachinery.pkg.runtime.RawExtension": { "description": "RawExtension is used to hold extensions in external versions.nnTo use this, make a field which has RawExtension as its type in your external, versioned struct, and Object in your internal struct. You also need to register your various plugin types.nn// Internal package: type MyAPIObject struct {ntruntime.TypeMeta `json:",inline"`ntMyPlugin runtime.Object `json:"myPlugin"`n} type PluginA struct {ntAOption string `json:"aOption"`n}nn// External package: type MyAPIObject struct {ntruntime.TypeMeta `json:",inline"`ntMyPlugin runtime.RawExtension `json:"myPlugin"`n} type PluginA struct {ntAOption string `json:"aOption"`n}nn// On the wire, the JSON will look something like this: {nt"kind":"MyAPIObject",nt"apiVersion":"v1",nt"myPlugin": {ntt"kind":"PluginA",ntt"aOption":"foo",nt},n}nnSo what happens? Decode first uses json or yaml to unmarshal the serialized data into your external MyAPIObject. That causes the raw JSON to be stored, but not unpacked. The next step is to copy (using pkg/conversion) into the internal struct. The runtime package's DefaultScheme has conversion functions installed which will unpack the JSON stored in RawExtension, turning it into the correct object type, and storing it in the Object. (TODO: In the case where the object is of an unknown type, a runtime.Unknown object will be created and stored.)", <del> "properties": { "Raw": { "description": "Raw is the underlying serialization of this object.", "format": "byte", "type": "string" } }, "required": [ "Raw" ], </del> "type": "object" }, "io.k8s.apimachinery.pkg.util.intstr.IntOrString": {

// Raw is the underlying serialization of this object. // // TODO: Determine how to detect ContentType and ContentEncoding of 'Raw' data. <del> Raw []byte `protobuf:"bytes,1,opt,name=raw"` </del> <ins> Raw []byte `json:"-" protobuf:"bytes,1,opt,name=raw"` </ins> // Object can hold a representation of this extension - useful for working with versioned // structs. Object Object `json:"-"`

SchemaProps: spec.SchemaProps{ Description: "RawExtension is used to hold extensions in external versions.nnTo use this, make a field which has RawExtension as its type in your external, versioned struct, and Object in your internal struct. You also need to register your various plugin types.nn// Internal package: type MyAPIObject struct {ntruntime.TypeMeta `json:",inline"`ntMyPlugin runtime.Object `json:"myPlugin"`n} type PluginA struct {ntAOption string `json:"aOption"`n}nn// External package: type MyAPIObject struct {ntruntime.TypeMeta `json:",inline"`ntMyPlugin runtime.RawExtension `json:"myPlugin"`n} type PluginA struct {ntAOption string `json:"aOption"`n}nn// On the wire, the JSON will look something like this: {nt"kind":"MyAPIObject",nt"apiVersion":"v1",nt"myPlugin": {ntt"kind":"PluginA",ntt"aOption":"foo",nt},n}nnSo what happens? Decode first uses json or yaml to unmarshal the serialized data into your external MyAPIObject. That causes the raw JSON to be stored, but not unpacked. The next step is to copy (using pkg/conversion) into the internal struct. The runtime package's DefaultScheme has conversion functions installed which will unpack the JSON stored in RawExtension, turning it into the correct object type, and storing it in the Object. (TODO: In the case where the object is of an unknown type, a runtime.Unknown object will be created and stored.)", Type:        []string{"object"}, <del> Properties: map[string]spec.Schema{ "Raw": { SchemaProps: spec.SchemaProps{ Description: "Raw is the underlying serialization of this object.", Type:        []string{"string"}, Format:      "byte", }, }, }, Required: []string{"Raw"}, </del> }, }, }