123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- /*
- Copyright 2015 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.
- */
- package storage
- import (
- "golang.org/x/net/context"
- "k8s.io/kubernetes/pkg/runtime"
- "k8s.io/kubernetes/pkg/types"
- "k8s.io/kubernetes/pkg/watch"
- )
- // Versioner abstracts setting and retrieving metadata fields from database response
- // onto the object ot list.
- type Versioner interface {
- // UpdateObject sets storage metadata into an API object. Returns an error if the object
- // cannot be updated correctly. May return nil if the requested object does not need metadata
- // from database.
- UpdateObject(obj runtime.Object, resourceVersion uint64) error
- // UpdateList sets the resource version into an API list object. Returns an error if the object
- // cannot be updated correctly. May return nil if the requested object does not need metadata
- // from database.
- UpdateList(obj runtime.Object, resourceVersion uint64) error
- // ObjectResourceVersion returns the resource version (for persistence) of the specified object.
- // Should return an error if the specified object does not have a persistable version.
- ObjectResourceVersion(obj runtime.Object) (uint64, error)
- }
- // ResponseMeta contains information about the database metadata that is associated with
- // an object. It abstracts the actual underlying objects to prevent coupling with concrete
- // database and to improve testability.
- type ResponseMeta struct {
- // TTL is the time to live of the node that contained the returned object. It may be
- // zero or negative in some cases (objects may be expired after the requested
- // expiration time due to server lag).
- TTL int64
- // The resource version of the node that contained the returned object.
- ResourceVersion uint64
- }
- // MatchValue defines a pair (<index name>, <value for that index>).
- type MatchValue struct {
- IndexName string
- Value string
- }
- // TriggerPublisherFunc is a function that takes an object, and returns a list of pairs
- // (<index name>, <index value for the given object>) for all indexes known
- // to that function.
- type TriggerPublisherFunc func(obj runtime.Object) []MatchValue
- // Filter is interface that is used to pass filtering mechanism.
- type Filter interface {
- // Filter is a predicate which takes an API object and returns true
- // if and only if the object should remain in the set.
- Filter(obj runtime.Object) bool
- // For any triggers known to the Filter, if Filter() can return only
- // (a subset of) objects for which indexing function returns <value>,
- // (<index name>, <value> pair would be returned.
- //
- // This is optimization to avoid computing Filter() function (which are
- // usually relatively expensive) in case we are sure they will return
- // false anyway.
- Trigger() []MatchValue
- }
- // Everything is a Filter which accepts all objects.
- var Everything Filter = everything{}
- // everything is implementation of Everything.
- type everything struct {
- }
- func (e everything) Filter(runtime.Object) bool {
- return true
- }
- func (e everything) Trigger() []MatchValue {
- return nil
- }
- // Pass an UpdateFunc to Interface.GuaranteedUpdate to make an update
- // that is guaranteed to succeed.
- // See the comment for GuaranteedUpdate for more details.
- type UpdateFunc func(input runtime.Object, res ResponseMeta) (output runtime.Object, ttl *uint64, err error)
- // Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.
- type Preconditions struct {
- // Specifies the target UID.
- UID *types.UID `json:"uid,omitempty"`
- }
- // NewUIDPreconditions returns a Preconditions with UID set.
- func NewUIDPreconditions(uid string) *Preconditions {
- u := types.UID(uid)
- return &Preconditions{UID: &u}
- }
- // Interface offers a common interface for object marshaling/unmarshaling operations and
- // hides all the storage-related operations behind it.
- type Interface interface {
- // Returns Versioner associated with this interface.
- Versioner() Versioner
- // Create adds a new object at a key unless it already exists. 'ttl' is time-to-live
- // in seconds (0 means forever). If no error is returned and out is not nil, out will be
- // set to the read value from database.
- Create(ctx context.Context, key string, obj, out runtime.Object, ttl uint64) error
- // Delete removes the specified key and returns the value that existed at that spot.
- // If key didn't exist, it will return NotFound storage error.
- Delete(ctx context.Context, key string, out runtime.Object, preconditions *Preconditions) error
- // Watch begins watching the specified key. Events are decoded into API objects,
- // and any items passing 'filter' are sent down to returned watch.Interface.
- // resourceVersion may be used to specify what version to begin watching,
- // which should be the current resourceVersion, and no longer rv+1
- // (e.g. reconnecting without missing any updates).
- Watch(ctx context.Context, key string, resourceVersion string, filter Filter) (watch.Interface, error)
- // WatchList begins watching the specified key's items. Items are decoded into API
- // objects and any item passing 'filter' are sent down to returned watch.Interface.
- // resourceVersion may be used to specify what version to begin watching,
- // which should be the current resourceVersion, and no longer rv+1
- // (e.g. reconnecting without missing any updates).
- WatchList(ctx context.Context, key string, resourceVersion string, filter Filter) (watch.Interface, error)
- // Get unmarshals json found at key into objPtr. On a not found error, will either
- // return a zero object of the requested type, or an error, depending on ignoreNotFound.
- // Treats empty responses and nil response nodes exactly like a not found error.
- Get(ctx context.Context, key string, objPtr runtime.Object, ignoreNotFound bool) error
- // GetToList unmarshals json found at key and opaque it into *List api object
- // (an object that satisfies the runtime.IsList definition).
- GetToList(ctx context.Context, key string, filter Filter, listObj runtime.Object) error
- // List unmarshalls jsons found at directory defined by key and opaque them
- // into *List api object (an object that satisfies runtime.IsList definition).
- // The returned contents may be delayed, but it is guaranteed that they will
- // be have at least 'resourceVersion'.
- List(ctx context.Context, key string, resourceVersion string, filter Filter, listObj runtime.Object) error
- // GuaranteedUpdate keeps calling 'tryUpdate()' to update key 'key' (of type 'ptrToType')
- // retrying the update until success if there is index conflict.
- // Note that object passed to tryUpdate may change across invocations of tryUpdate() if
- // other writers are simultaneously updating it, so tryUpdate() needs to take into account
- // the current contents of the object when deciding how the update object should look.
- // If the key doesn't exist, it will return NotFound storage error if ignoreNotFound=false
- // or zero value in 'ptrToType' parameter otherwise.
- // If the object to update has the same value as previous, it won't do any update
- // but will return the object in 'ptrToType' parameter.
- //
- // Example:
- //
- // s := /* implementation of Interface */
- // err := s.GuaranteedUpdate(
- // "myKey", &MyType{}, true,
- // func(input runtime.Object, res ResponseMeta) (runtime.Object, *uint64, error) {
- // // Before each incovation of the user defined function, "input" is reset to
- // // current contents for "myKey" in database.
- // curr := input.(*MyType) // Guaranteed to succeed.
- //
- // // Make the modification
- // curr.Counter++
- //
- // // Return the modified object - return an error to stop iterating. Return
- // // a uint64 to alter the TTL on the object, or nil to keep it the same value.
- // return cur, nil, nil
- // }
- // })
- GuaranteedUpdate(ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, precondtions *Preconditions, tryUpdate UpdateFunc) error
- }
|