1
0
mirror of https://github.com/rancher/norman.git synced 2025-09-03 16:25:09 +00:00
Files
norman/objectclient/object_client.go

213 lines
7.1 KiB
Go
Raw Normal View History

2018-04-03 12:49:20 -07:00
package objectclient
2017-11-10 21:44:02 -07:00
import (
2020-03-26 13:07:32 -07:00
"context"
2017-11-10 21:44:02 -07:00
"github.com/pkg/errors"
2020-05-15 17:38:28 -07:00
"github.com/rancher/lasso/pkg/client"
2018-03-23 09:39:25 -07:00
"github.com/sirupsen/logrus"
2017-11-10 21:44:02 -07:00
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2017-12-16 01:25:56 -07:00
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2017-11-10 21:44:02 -07:00
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
2017-12-22 23:09:40 -07:00
"k8s.io/apimachinery/pkg/types"
2017-11-10 21:44:02 -07:00
"k8s.io/apimachinery/pkg/watch"
)
type ObjectFactory interface {
Object() runtime.Object
List() runtime.Object
}
2017-12-16 01:25:56 -07:00
type UnstructuredObjectFactory struct {
}
func (u *UnstructuredObjectFactory) Object() runtime.Object {
return &unstructured.Unstructured{}
}
func (u *UnstructuredObjectFactory) List() runtime.Object {
return &unstructured.UnstructuredList{}
}
type GenericClient interface {
UnstructuredClient() GenericClient
GroupVersionKind() schema.GroupVersionKind
Create(o runtime.Object) (runtime.Object, error)
GetNamespaced(namespace, name string, opts metav1.GetOptions) (runtime.Object, error)
Get(name string, opts metav1.GetOptions) (runtime.Object, error)
Update(name string, o runtime.Object) (runtime.Object, error)
2020-05-15 17:38:28 -07:00
UpdateStatus(name string, o runtime.Object) (runtime.Object, error)
DeleteNamespaced(namespace, name string, opts *metav1.DeleteOptions) error
Delete(name string, opts *metav1.DeleteOptions) error
List(opts metav1.ListOptions) (runtime.Object, error)
ListNamespaced(namespace string, opts metav1.ListOptions) (runtime.Object, error)
Watch(opts metav1.ListOptions) (watch.Interface, error)
DeleteCollection(deleteOptions *metav1.DeleteOptions, listOptions metav1.ListOptions) error
Patch(name string, o runtime.Object, patchType types.PatchType, data []byte, subresources ...string) (runtime.Object, error)
ObjectFactory() ObjectFactory
}
2017-11-10 21:44:02 -07:00
type ObjectClient struct {
2020-05-15 17:38:28 -07:00
ctx context.Context
client *client.Client
resource *metav1.APIResource
gvk schema.GroupVersionKind
ns string
Factory ObjectFactory
2017-11-10 21:44:02 -07:00
}
2020-05-15 17:38:28 -07:00
func NewObjectClient(namespace string, client *client.Client, apiResource *metav1.APIResource, gvk schema.GroupVersionKind, factory ObjectFactory) *ObjectClient {
2017-11-10 21:44:02 -07:00
return &ObjectClient{
2020-05-15 17:38:28 -07:00
ctx: context.TODO(),
client: client,
resource: apiResource,
gvk: gvk,
ns: namespace,
Factory: factory,
2017-11-13 12:50:25 -07:00
}
2017-11-10 21:44:02 -07:00
}
func (p *ObjectClient) UnstructuredClient() GenericClient {
2017-12-16 01:25:56 -07:00
return &ObjectClient{
2020-05-15 17:38:28 -07:00
ctx: p.ctx,
client: p.client,
resource: p.resource,
gvk: p.gvk,
ns: p.ns,
Factory: &UnstructuredObjectFactory{},
2017-12-16 01:25:56 -07:00
}
}
2017-12-19 21:39:57 -07:00
func (p *ObjectClient) GroupVersionKind() schema.GroupVersionKind {
return p.gvk
}
2017-11-14 12:46:34 -08:00
func (p *ObjectClient) getAPIPrefix() string {
if p.gvk.Group == "" {
return "api"
}
return "apis"
}
2017-11-10 21:44:02 -07:00
func (p *ObjectClient) Create(o runtime.Object) (runtime.Object, error) {
ns := p.ns
2020-08-26 13:57:12 -07:00
obj, ok := o.(metav1.Object)
if ok && obj.GetNamespace() != "" {
2017-11-10 21:44:02 -07:00
ns = obj.GetNamespace()
}
2020-08-26 13:57:12 -07:00
if ok {
labels := obj.GetLabels()
if labels == nil {
labels = make(map[string]string)
} else {
ls := make(map[string]string)
for k, v := range labels {
ls[k] = v
}
labels = ls
}
labels["cattle.io/creator"] = "norman"
obj.SetLabels(labels)
}
2020-03-11 22:48:52 +01:00
logrus.Tracef("REST CREATE %s/%s/%s/%s/%s", p.getAPIPrefix(), p.gvk.Group, p.gvk.Version, ns, p.resource.Name)
2020-05-15 17:38:28 -07:00
result := p.ObjectFactory().Object()
return result, p.client.Create(p.ctx, ns, o, result, metav1.CreateOptions{})
2017-11-10 21:44:02 -07:00
}
2018-01-18 16:22:36 -07:00
func (p *ObjectClient) GetNamespaced(namespace, name string, opts metav1.GetOptions) (runtime.Object, error) {
2020-03-11 22:48:52 +01:00
logrus.Tracef("REST GET %s/%s/%s/%s/%s/%s", p.getAPIPrefix(), p.gvk.Group, p.gvk.Version, namespace, p.resource.Name, name)
2020-05-15 17:38:28 -07:00
result := p.Factory.Object()
return result, p.client.Get(p.ctx, namespace, name, result, opts)
2017-12-19 21:39:57 -07:00
}
2017-11-10 21:44:02 -07:00
func (p *ObjectClient) Get(name string, opts metav1.GetOptions) (runtime.Object, error) {
2020-03-11 22:48:52 +01:00
logrus.Tracef("REST GET %s/%s/%s/%s/%s/%s", p.getAPIPrefix(), p.gvk.Group, p.gvk.Version, p.ns, p.resource.Name, name)
2020-05-15 17:38:28 -07:00
result := p.Factory.Object()
return result, p.client.Get(p.ctx, p.ns, name, result, opts)
2017-11-10 21:44:02 -07:00
}
func (p *ObjectClient) Update(name string, o runtime.Object) (runtime.Object, error) {
ns := p.ns
if obj, ok := o.(metav1.Object); ok && obj.GetNamespace() != "" {
ns = obj.GetNamespace()
}
result := p.Factory.Object()
if len(name) == 0 {
return result, errors.New("object missing name")
}
2020-03-11 22:48:52 +01:00
logrus.Tracef("REST UPDATE %s/%s/%s/%s/%s/%s", p.getAPIPrefix(), p.gvk.Group, p.gvk.Version, ns, p.resource.Name, name)
2020-05-15 17:38:28 -07:00
return result, p.client.Update(p.ctx, ns, o, result, metav1.UpdateOptions{})
2017-11-10 21:44:02 -07:00
}
2020-05-15 17:38:28 -07:00
func (p *ObjectClient) UpdateStatus(name string, o runtime.Object) (runtime.Object, error) {
ns := p.ns
if obj, ok := o.(metav1.Object); ok && obj.GetNamespace() != "" {
ns = obj.GetNamespace()
}
result := p.Factory.Object()
if len(name) == 0 {
return result, errors.New("object missing name")
2017-12-19 21:39:57 -07:00
}
2020-05-15 17:38:28 -07:00
logrus.Tracef("REST UPDATE %s/%s/%s/%s/status/%s/%s", p.getAPIPrefix(), p.gvk.Group, p.gvk.Version, ns, p.resource.Name, name)
return result, p.client.UpdateStatus(p.ctx, ns, o, result, metav1.UpdateOptions{})
}
func (p *ObjectClient) DeleteNamespaced(namespace, name string, opts *metav1.DeleteOptions) error {
2020-03-11 22:48:52 +01:00
logrus.Tracef("REST DELETE %s/%s/%s/%s/%s/%s", p.getAPIPrefix(), p.gvk.Group, p.gvk.Version, namespace, p.resource.Name, name)
2020-05-15 17:38:28 -07:00
if opts == nil {
opts = &metav1.DeleteOptions{}
}
return p.client.Delete(p.ctx, namespace, name, *opts)
2017-12-19 21:39:57 -07:00
}
2017-11-10 21:44:02 -07:00
func (p *ObjectClient) Delete(name string, opts *metav1.DeleteOptions) error {
2020-03-11 22:48:52 +01:00
logrus.Tracef("REST DELETE %s/%s/%s/%s/%s/%s", p.getAPIPrefix(), p.gvk.Group, p.gvk.Version, p.ns, p.resource.Name, name)
2020-05-15 17:38:28 -07:00
if opts == nil {
opts = &metav1.DeleteOptions{}
}
return p.client.Delete(p.ctx, p.ns, name, *opts)
2017-11-10 21:44:02 -07:00
}
func (p *ObjectClient) List(opts metav1.ListOptions) (runtime.Object, error) {
result := p.Factory.List()
2020-03-11 22:48:52 +01:00
logrus.Tracef("REST LIST %s/%s/%s/%s/%s", p.getAPIPrefix(), p.gvk.Group, p.gvk.Version, p.ns, p.resource.Name)
2020-05-15 17:38:28 -07:00
return result, p.client.List(p.ctx, p.ns, result, opts)
2017-11-10 21:44:02 -07:00
}
func (p *ObjectClient) ListNamespaced(namespace string, opts metav1.ListOptions) (runtime.Object, error) {
result := p.Factory.List()
2020-03-11 22:48:52 +01:00
logrus.Tracef("REST LIST %s/%s/%s/%s/%s", p.getAPIPrefix(), p.gvk.Group, p.gvk.Version, namespace, p.resource.Name)
2020-05-15 17:38:28 -07:00
return result, p.client.List(p.ctx, namespace, result, opts)
}
2017-11-10 21:44:02 -07:00
func (p *ObjectClient) Watch(opts metav1.ListOptions) (watch.Interface, error) {
2020-05-15 17:38:28 -07:00
return p.client.Watch(p.ctx, p.ns, opts)
2017-11-10 21:44:02 -07:00
}
func (p *ObjectClient) DeleteCollection(deleteOptions *metav1.DeleteOptions, listOptions metav1.ListOptions) error {
2020-05-15 17:38:28 -07:00
if deleteOptions == nil {
deleteOptions = &metav1.DeleteOptions{}
}
return p.client.DeleteCollection(p.ctx, p.ns, *deleteOptions, listOptions)
2017-11-10 21:44:02 -07:00
}
func (p *ObjectClient) Patch(name string, o runtime.Object, patchType types.PatchType, data []byte, subresources ...string) (runtime.Object, error) {
2017-12-22 23:09:40 -07:00
ns := p.ns
if obj, ok := o.(metav1.Object); ok && obj.GetNamespace() != "" {
ns = obj.GetNamespace()
}
result := p.Factory.Object()
if len(name) == 0 {
return result, errors.New("object missing name")
}
2020-05-15 17:38:28 -07:00
return result, p.client.Patch(p.ctx, ns, name, patchType, data, result, metav1.PatchOptions{}, subresources...)
2017-12-22 23:09:40 -07:00
}
func (p *ObjectClient) ObjectFactory() ObjectFactory {
return p.Factory
}