From 10aa5a70b04f709c3d19459123a3c051ca0869c7 Mon Sep 17 00:00:00 2001 From: Darren Shepherd Date: Fri, 22 Dec 2017 23:09:40 -0700 Subject: [PATCH] Add Patch to clients --- clientbase/object_client.go | 22 ++++++++++++++++++++++ generator/controller_template.go | 6 ++++++ 2 files changed, 28 insertions(+) diff --git a/clientbase/object_client.go b/clientbase/object_client.go index e9e91373..bb1653a5 100644 --- a/clientbase/object_client.go +++ b/clientbase/object_client.go @@ -9,6 +9,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/dynamic" "k8s.io/client-go/rest" @@ -208,6 +209,27 @@ func (p *ObjectClient) DeleteCollection(deleteOptions *metav1.DeleteOptions, lis Error() } +func (p *ObjectClient) Patch(name string, o runtime.Object, data []byte, subresources ...string) (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") + } + err := p.restClient.Patch(types.StrategicMergePatchType). + Prefix(p.getAPIPrefix(), p.gvk.Group, p.gvk.Version). + NamespaceIfScoped(ns, p.resource.Namespaced). + Resource(p.resource.Name). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return result, err +} + type dynamicDecoder struct { factory ObjectFactory dec *json.Decoder diff --git a/generator/controller_template.go b/generator/controller_template.go index 47e52a61..1655bee2 100644 --- a/generator/controller_template.go +++ b/generator/controller_template.go @@ -198,6 +198,12 @@ func (s *{{.schema.ID}}Client) Watch(opts metav1.ListOptions) (watch.Interface, return s.objectClient.Watch(opts) } +// Patch applies the patch and returns the patched deployment. +func (s *{{.schema.ID}}Client) Patch(o *{{.prefix}}{{.schema.CodeName}}, data []byte, subresources ...string) (*{{.prefix}}{{.schema.CodeName}}, error) { + obj, err := s.objectClient.Patch(o.Name, o, data, subresources...) + return obj.(*{{.prefix}}{{.schema.CodeName}}), err +} + func (s *{{.schema.ID}}Client) DeleteCollection(deleteOpts *metav1.DeleteOptions, listOpts metav1.ListOptions) error { return s.objectClient.DeleteCollection(deleteOpts, listOpts) }