/
patcher.go
61 lines (51 loc) · 1.61 KB
/
patcher.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package exoscale
import (
"context"
"encoding/json"
"fmt"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/strategicpatch"
"k8s.io/client-go/kubernetes"
)
type kubeServicePatcher struct {
ctx context.Context
kclient kubernetes.Interface
current *v1.Service
modified *v1.Service
}
func newServicePatcher(ctx context.Context, kclient kubernetes.Interface, service *v1.Service) kubeServicePatcher {
return kubeServicePatcher{
ctx: ctx,
kclient: kclient,
current: service.DeepCopy(),
modified: service,
}
}
// Patch submits a patch request for the Service to add some annotations
// unless the updated service reference contains the same set of annotations.
func (p *kubeServicePatcher) Patch() error {
currentJSON, err := json.Marshal(p.current)
if err != nil {
return fmt.Errorf("failed to serialize current original object: %s", err)
}
modifiedJSON, err := json.Marshal(p.modified)
if err != nil {
return fmt.Errorf("failed to serialize modified updated object: %s", err)
}
patch, err := strategicpatch.CreateTwoWayMergePatch(currentJSON, modifiedJSON, v1.Service{})
if err != nil {
return fmt.Errorf("failed to create 2-way merge patch: %s", err)
}
if len(patch) == 0 || string(patch) == "{}" {
return nil
}
_, err = p.kclient.CoreV1().
Services(p.current.Namespace).
Patch(p.ctx, p.current.Name, types.StrategicMergePatchType, patch, metav1.PatchOptions{})
if err != nil {
return fmt.Errorf("failed to patch service object %s/%s: %s", p.current.Namespace, p.current.Name, err)
}
return nil
}