@@ -20,6 +20,7 @@ import (
20
20
"k8s.io/apimachinery/pkg/labels"
21
21
"k8s.io/apimachinery/pkg/runtime"
22
22
"k8s.io/apimachinery/pkg/runtime/schema"
23
+ "k8s.io/apimachinery/pkg/types"
23
24
"k8s.io/apimachinery/pkg/watch"
24
25
"sigs.k8s.io/controller-runtime/pkg/client"
25
26
)
@@ -121,6 +122,23 @@ func (r *resolver) getChangeArguments(input graphql.Input) graphql.FieldConfigAr
121
122
}
122
123
}
123
124
125
+ func (r * resolver ) getPatchArguments () graphql.FieldConfigArgument {
126
+ return graphql.FieldConfigArgument {
127
+ "type" : & graphql.ArgumentConfig {
128
+ Type : graphql .NewNonNull (graphql .String ),
129
+ Description : "The JSON patch type, it can be json-patch, merge-patch, strategic-merge-patch" ,
130
+ },
131
+ "payload" : & graphql.ArgumentConfig {
132
+ Type : graphql .NewNonNull (graphql .String ),
133
+ Description : "The JSON patch to apply to the object" ,
134
+ },
135
+ "metadata" : & graphql.ArgumentConfig {
136
+ Type : graphql .NewNonNull (metadataInput ),
137
+ Description : "Metadata including name and namespace of the object you want to patch" ,
138
+ },
139
+ }
140
+ }
141
+
124
142
func (r * resolver ) getItem (crd apiextensionsv1.CustomResourceDefinition , typeInformation apiextensionsv1.CustomResourceDefinitionVersion ) func (p graphql.ResolveParams ) (interface {}, error ) {
125
143
logger := slog .With (slog .String ("operation" , "get" ), slog .String ("kind" , crd .Spec .Names .Kind ), slog .String ("version" , typeInformation .Name ))
126
144
return func (p graphql.ResolveParams ) (interface {}, error ) {
@@ -284,6 +302,74 @@ func (r *resolver) updateItem(crd apiextensionsv1.CustomResourceDefinition, type
284
302
}
285
303
}
286
304
305
+ func (r * resolver ) patchItem (crd apiextensionsv1.CustomResourceDefinition , typeInformation apiextensionsv1.CustomResourceDefinitionVersion ) func (p graphql.ResolveParams ) (interface {}, error ) {
306
+ logger := slog .With (slog .String ("operation" , "patch-json" ), slog .String ("kind" , crd .Spec .Names .Kind ), slog .String ("version" , typeInformation .Name ))
307
+ return func (p graphql.ResolveParams ) (interface {}, error ) {
308
+ ctx , span := otel .Tracer ("" ).Start (p .Context , "Patch" , trace .WithAttributes (attribute .String ("kind" , crd .Spec .Names .Kind )))
309
+ defer span .End ()
310
+
311
+ var metadatInput MetadatInput
312
+ if err := mapstructure .Decode (p .Args ["metadata" ], & metadatInput ); err != nil {
313
+ logger .Error ("unable to decode metadata input" , "error" , err )
314
+ return nil , err
315
+ }
316
+
317
+ logger = logger .With (slog .Group ("metadata" , slog .String ("name" , metadatInput .Name ), slog .String ("namespace" , metadatInput .Namespace )))
318
+
319
+ us := & unstructured.Unstructured {}
320
+ us .SetGroupVersionKind (schema.GroupVersionKind {
321
+ Group : crd .Spec .Group ,
322
+ Version : typeInformation .Name ,
323
+ Kind : crd .Spec .Names .Kind ,
324
+ })
325
+
326
+ us .SetNamespace (metadatInput .Namespace )
327
+ us .SetName (metadatInput .Name )
328
+
329
+ err := r .conf .Client .Get (ctx , client.ObjectKey {Namespace : us .GetNamespace (), Name : us .GetName ()}, us )
330
+ if err != nil {
331
+ logger .Error ("unable to get object" , slog .Any ("error" , err ))
332
+ return nil , err
333
+ }
334
+
335
+ payload , ok := p .Args ["payload" ].(string )
336
+ if ! ok {
337
+ logger .Error ("unable to parse payload field" )
338
+ return nil , errors .New ("unable to parse payload field" )
339
+ }
340
+
341
+ patchTypeArg , ok := p .Args ["type" ].(string )
342
+ if ! ok {
343
+ logger .Error ("unable to parse patch type field" )
344
+ return nil , errors .New ("unable to parse patch type field" )
345
+ }
346
+
347
+ var patchType types.PatchType
348
+ switch patchTypeArg {
349
+ case "json-patch" :
350
+ patchType = types .JSONPatchType
351
+ case "merge-patch" :
352
+ patchType = types .MergePatchType
353
+ case "strategic-merge-patch" :
354
+ patchType = types .StrategicMergePatchType
355
+ default :
356
+ logger .Error ("invalid patch type, patch type can be json-patch, merge-patch or strategic-merge-patch" )
357
+ return nil , errors .New ("invalid patch type, patch type can be json-patch, merge-patch or strategic-merge-patch" )
358
+ }
359
+
360
+ patch := client .RawPatch (patchType , []byte (payload ))
361
+
362
+ err = r .conf .Client .Patch (ctx , us , patch , & client.PatchOptions {})
363
+
364
+ if err != nil {
365
+ logger .Error ("unable to patch object" , slog .Any ("error" , err ))
366
+ return nil , err
367
+ }
368
+
369
+ return us .Object , nil
370
+ }
371
+ }
372
+
287
373
func (r * resolver ) subscribeItem (crd apiextensionsv1.CustomResourceDefinition , typeInformation apiextensionsv1.CustomResourceDefinitionVersion ) func (p graphql.ResolveParams ) (interface {}, error ) {
288
374
logger := slog .With (slog .String ("operation" , "subribeItem" ), slog .String ("kind" , crd .Spec .Names .Kind ), slog .String ("version" , typeInformation .Name ))
289
375
return func (p graphql.ResolveParams ) (interface {}, error ) {
0 commit comments