Skip to content

Commit d97a452

Browse files
committed
pkg/helm: inject owner reference via client
1 parent 0aebe7e commit d97a452

File tree

2 files changed

+46
-4
lines changed

2 files changed

+46
-4
lines changed

pkg/helm/release/manager.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ type Manager interface {
5959
type manager struct {
6060
actionConfig *action.Configuration
6161
storageBackend *storage.Storage
62-
kubeClient *kube.Client
62+
kubeClient kube.Interface
6363

6464
releaseName string
6565
namespace string
@@ -216,7 +216,7 @@ func (m manager) ReconcileRelease(ctx context.Context) (*rpb.Release, error) {
216216
return m.deployedRelease, err
217217
}
218218

219-
func reconcileRelease(ctx context.Context, kubeClient *kube.Client, namespace string, expectedManifest string) error {
219+
func reconcileRelease(ctx context.Context, kubeClient kube.Interface, namespace string, expectedManifest string) error {
220220
expectedInfos, err := kubeClient.Build(bytes.NewBufferString(expectedManifest), false)
221221
if err != nil {
222222
return err

pkg/helm/release/manager_factory.go

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,13 @@ package release
1616

1717
import (
1818
"fmt"
19+
"io"
1920
"strings"
2021

22+
"k8s.io/apimachinery/pkg/runtime"
23+
24+
"k8s.io/apimachinery/pkg/api/meta"
25+
2126
"github.com/martinlindhe/base36"
2227
"github.com/pborman/uuid"
2328
"helm.sh/helm/v3/pkg/action"
@@ -26,8 +31,10 @@ import (
2631
helmrelease "helm.sh/helm/v3/pkg/release"
2732
"helm.sh/helm/v3/pkg/storage"
2833
"helm.sh/helm/v3/pkg/storage/driver"
34+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2935
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
3036
apitypes "k8s.io/apimachinery/pkg/types"
37+
"k8s.io/cli-runtime/pkg/resource"
3138
v1 "k8s.io/client-go/kubernetes/typed/core/v1"
3239
crmanager "sigs.k8s.io/controller-runtime/pkg/manager"
3340

@@ -76,16 +83,21 @@ func (f managerFactory) NewManager(cr *unstructured.Unstructured) (Manager, erro
7683
if !ok {
7784
return nil, fmt.Errorf("failed to get spec: expected map[string]interface{}")
7885
}
86+
controllerRef := metav1.NewControllerRef(cr, cr.GroupVersionKind())
87+
ownerRefClient := &ownerRefInjectingClient{
88+
refs: []metav1.OwnerReference{*controllerRef},
89+
Client: *kubeClient,
90+
}
7991
actionConfig := &action.Configuration{
8092
RESTClientGetter: rcg,
8193
Releases: storageBackend,
82-
KubeClient: kubeClient,
94+
KubeClient: ownerRefClient,
8395
Log: func(_ string, _ ...interface{}) {},
8496
}
8597
return &manager{
8698
actionConfig: actionConfig,
8799
storageBackend: storageBackend,
88-
kubeClient: kubeClient,
100+
kubeClient: ownerRefClient,
89101

90102
releaseName: releaseName,
91103
namespace: cr.GetNamespace(),
@@ -96,6 +108,36 @@ func (f managerFactory) NewManager(cr *unstructured.Unstructured) (Manager, erro
96108
}, nil
97109
}
98110

111+
type ownerRefInjectingClient struct {
112+
refs []metav1.OwnerReference
113+
kube.Client
114+
}
115+
116+
func (c *ownerRefInjectingClient) Build(reader io.Reader, validate bool) (kube.ResourceList, error) {
117+
resourceList, err := c.Client.Build(reader, validate)
118+
if err != nil {
119+
return resourceList, err
120+
}
121+
err = resourceList.Visit(func(r *resource.Info, err error) error {
122+
if err != nil {
123+
return err
124+
}
125+
objMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(r.Object)
126+
if err != nil {
127+
return err
128+
}
129+
u := &unstructured.Unstructured{Object: objMap}
130+
if r.ResourceMapping().Scope == meta.RESTScopeNamespace {
131+
u.SetOwnerReferences(c.refs)
132+
}
133+
return nil
134+
})
135+
if err != nil {
136+
return nil, err
137+
}
138+
return resourceList, nil
139+
}
140+
99141
// getReleaseName returns a release name for the CR. If a release for the
100142
// legacy name exists, the legacy name is returned. This ensures
101143
// backwards-compatibility for pre-existing CRs.

0 commit comments

Comments
 (0)