mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-08 03:33:56 +00:00
Extend interfaces to support CacheableObject
This commit is contained in:
parent
2b4dc315a3
commit
248549ba79
@ -39,11 +39,30 @@ type GroupVersioner interface {
|
|||||||
KindForGroupVersionKinds(kinds []schema.GroupVersionKind) (target schema.GroupVersionKind, ok bool)
|
KindForGroupVersionKinds(kinds []schema.GroupVersionKind) (target schema.GroupVersionKind, ok bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Identifier represents an identifier.
|
||||||
|
// Identitier of two different objects should be equal if and only if for every
|
||||||
|
// input the output they produce is exactly the same.
|
||||||
|
type Identifier string
|
||||||
|
|
||||||
// Encoder writes objects to a serialized form
|
// Encoder writes objects to a serialized form
|
||||||
type Encoder interface {
|
type Encoder interface {
|
||||||
// Encode writes an object to a stream. Implementations may return errors if the versions are
|
// Encode writes an object to a stream. Implementations may return errors if the versions are
|
||||||
// incompatible, or if no conversion is defined.
|
// incompatible, or if no conversion is defined.
|
||||||
Encode(obj Object, w io.Writer) error
|
Encode(obj Object, w io.Writer) error
|
||||||
|
// Identifier returns an identifier of the encoder.
|
||||||
|
// Identifiers of two different encoders should be equal if and only if for every input
|
||||||
|
// object it will be encoded to the same representation by both of them.
|
||||||
|
//
|
||||||
|
// Identifier is inteted for use with CacheableObject#CacheEncode method. In order to
|
||||||
|
// correctly handle CacheableObject, Encode() method should look similar to below, where
|
||||||
|
// doEncode() is the encoding logic of implemented encoder:
|
||||||
|
// func (e *MyEncoder) Encode(obj Object, w io.Writer) error {
|
||||||
|
// if co, ok := obj.(CacheableObject); ok {
|
||||||
|
// return co.CacheEncode(e.Identifier(), e.doEncode, w)
|
||||||
|
// }
|
||||||
|
// return e.doEncode(obj, w)
|
||||||
|
// }
|
||||||
|
Identifier() Identifier
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decoder attempts to load an object from data.
|
// Decoder attempts to load an object from data.
|
||||||
@ -256,6 +275,27 @@ type Object interface {
|
|||||||
DeepCopyObject() Object
|
DeepCopyObject() Object
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CacheableObject allows an object to cache its different serializations
|
||||||
|
// to avoid performing the same serialization multiple times.
|
||||||
|
type CacheableObject interface {
|
||||||
|
// CacheEncode writes an object to a stream. The <encode> function will
|
||||||
|
// be used in case of cache miss. The <encode> function takes ownership
|
||||||
|
// of the object.
|
||||||
|
// If CacheableObject is a wrapper, then deep-copy of the wrapped object
|
||||||
|
// should be passed to <encode> function.
|
||||||
|
// CacheEncode assumes that for two different calls with the same <id>,
|
||||||
|
// <encode> function will also be the same.
|
||||||
|
CacheEncode(id Identifier, encode func(Object, io.Writer) error, w io.Writer) error
|
||||||
|
// GetObject returns a deep-copy of an object to be encoded - the caller of
|
||||||
|
// GetObject() is the owner of returned object. The reason for making a copy
|
||||||
|
// is to avoid bugs, where caller modifies the object and forgets to copy it,
|
||||||
|
// thus modifying the object for everyone.
|
||||||
|
// The object returned by GetObject should be the same as the one that is supposed
|
||||||
|
// to be passed to <encode> function in CacheEncode method.
|
||||||
|
// If CacheableObject is a wrapper, the copy of wrapped object should be returned.
|
||||||
|
GetObject() Object
|
||||||
|
}
|
||||||
|
|
||||||
// Unstructured objects store values as map[string]interface{}, with only values that can be serialized
|
// Unstructured objects store values as map[string]interface{}, with only values that can be serialized
|
||||||
// to JSON allowed.
|
// to JSON allowed.
|
||||||
type Unstructured interface {
|
type Unstructured interface {
|
||||||
|
Loading…
Reference in New Issue
Block a user