// NewREST returns a new REST. func NewREST(optsGetter restoptions.Getter) (*REST, error) { prefix := "/images" store := ®istry.Store{ NewFunc: func() runtime.Object { return &api.Image{} }, // NewListFunc returns an object capable of storing results of an etcd list. NewListFunc: func() runtime.Object { return &api.ImageList{} }, // Produces a path that etcd understands, to the root of the resource // by combining the namespace in the context with the given prefix. // Yet images are not namespace scoped, so we're returning just prefix here. KeyRootFunc: func(ctx kapi.Context) string { return prefix }, // Produces a path that etcd understands, to the resource by combining // the namespace in the context with the given prefix // Yet images are not namespace scoped, so we're returning just prefix here. KeyFunc: func(ctx kapi.Context, name string) (string, error) { return registry.NoNamespaceKeyFunc(ctx, prefix, name) }, // Retrieve the name field of an image ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.Image).Name, nil }, // Used to match objects based on labels/fields for list and watch PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher { return image.MatchImage(label, field) }, QualifiedResource: api.Resource("images"), // Used to validate image creation CreateStrategy: image.Strategy, // Used to validate image updates UpdateStrategy: image.Strategy, ReturnDeletedObject: false, } if err := restoptions.ApplyOptions(optsGetter, store, prefix); err != nil { return nil, err } return &REST{store}, nil }
// NewREST returns a new REST. func NewREST(s storage.Interface) *REST { prefix := "/images" store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.Image{} }, // NewListFunc returns an object capable of storing results of an etcd list. NewListFunc: func() runtime.Object { return &api.ImageList{} }, // Produces a path that etcd understands, to the root of the resource // by combining the namespace in the context with the given prefix. // Yet images are not namespace scoped, so we're returning just prefix here. KeyRootFunc: func(ctx kapi.Context) string { return prefix }, // Produces a path that etcd understands, to the resource by combining // the namespace in the context with the given prefix // Yet images are not namespace scoped, so we're returning just prefix here. KeyFunc: func(ctx kapi.Context, name string) (string, error) { return etcdgeneric.NoNamespaceKeyFunc(ctx, prefix, name) }, // Retrieve the name field of an image ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.Image).Name, nil }, // Used to match objects based on labels/fields for list and watch PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher { return image.MatchImage(label, field) }, EndpointName: "images", // Used to validate image creation CreateStrategy: image.Strategy, // Used to validate image updates UpdateStrategy: image.Strategy, ReturnDeletedObject: false, Storage: s, } return &REST{store} }
// Watch begins watching for new, changed, or deleted images. func (r *REST) Watch(ctx kapi.Context, label labels.Selector, field fields.Selector, resourceVersion string) (watch.Interface, error) { if !field.Empty() { return nil, errors.New("field selectors are not supported on images") } return r.store.WatchPredicate(ctx, image.MatchImage(label, field), resourceVersion) }
// List obtains a list of images with labels that match selector. func (r *REST) List(ctx kapi.Context, label labels.Selector, field fields.Selector) (runtime.Object, error) { return r.store.ListPredicate(ctx, image.MatchImage(label, field)) }