mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-31 23:37:01 +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)
|
||||
}
|
||||
|
||||
// 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
|
||||
type Encoder interface {
|
||||
// Encode writes an object to a stream. Implementations may return errors if the versions are
|
||||
// incompatible, or if no conversion is defined.
|
||||
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.
|
||||
@ -256,6 +275,27 @@ type Object interface {
|
||||
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
|
||||
// to JSON allowed.
|
||||
type Unstructured interface {
|
||||
|
Loading…
Reference in New Issue
Block a user