/*
Copyright 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.
*/


// This file was autogenerated by go-to-protobuf. Do not edit it manually!

syntax = 'proto2';

package k8s.io.apimachinery.pkg.runtime;

// Package-wide variables from generator "generated".
option go_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.)
// 
// +k8s:deepcopy-gen=true
// +protobuf=true
// +k8s:openapi-gen=true
message RawExtension {
  // Raw is the underlying serialization of this object.
  // 
  // TODO: Determine how to detect ContentType and ContentEncoding of 'Raw' data.
  optional bytes raw = 1;
}

// TypeMeta is shared by all top level objects. The proper way to use it is to inline it in your type,
// like this:
// type MyAwesomeAPIObject struct {
//      runtime.TypeMeta    `json:",inline"`
//      ... // other fields
// }
// func (obj *MyAwesomeAPIObject) SetGroupVersionKind(gvk *metav1.GroupVersionKind) { metav1.UpdateTypeMeta(obj,gvk) }; GroupVersionKind() *GroupVersionKind
// 
// TypeMeta is provided here for convenience. You may use it directly from this package or define
// your own with the same fields.
// 
// +k8s:deepcopy-gen=false
// +protobuf=true
// +k8s:openapi-gen=true
message TypeMeta {
  // +optional
  optional string apiVersion = 1;

  // +optional
  optional string kind = 2;
}

// Unknown allows api objects with unknown types to be passed-through. This can be used
// to deal with the API objects from a plug-in. Unknown objects still have functioning
// TypeMeta features-- kind, version, etc.
// TODO: Make this object have easy access to field based accessors and settors for
// metadata and field mutatation.
// 
// +k8s:deepcopy-gen=true
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// +protobuf=true
// +k8s:openapi-gen=true
message Unknown {
  optional TypeMeta typeMeta = 1;

  // Raw will hold the complete serialized object which couldn't be matched
  // with a registered type. Most likely, nothing should be done with this
  // except for passing it through the system.
  optional bytes raw = 2;

  // ContentEncoding is encoding used to encode 'Raw' data.
  // Unspecified means no encoding.
  optional string contentEncoding = 3;

  // ContentType  is serialization method used to serialize 'Raw'.
  // Unspecified means ContentTypeJSON.
  optional string contentType = 4;
}

