package runtime // RawExtension is used to hold extensions in external versions. // // To 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. // // // Internal package: // // type MyAPIObject struct { // runtime.TypeMeta `json:",inline"` // MyPlugin runtime.Object `json:"myPlugin"` // } // // type PluginA struct { // AOption string `json:"aOption"` // } // // // External package: // // type MyAPIObject struct { // runtime.TypeMeta `json:",inline"` // MyPlugin runtime.RawExtension `json:"myPlugin"` // } // // type PluginA struct { // AOption string `json:"aOption"` // } // // // On the wire, the JSON will look something like this: // // { // "kind":"MyAPIObject", // "apiVersion":"v1", // "myPlugin": { // "kind":"PluginA", // "aOption":"foo", // }, // } // // So 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.) #RawExtension: {}