Skip to content

Commit 29a3410

Browse files
committed
pkg/helm: inject owner reference via client
1 parent 93603f5 commit 29a3410

File tree

1 file changed

+43
-2
lines changed

1 file changed

+43
-2
lines changed

pkg/helm/release/manager_factory.go

Lines changed: 43 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,11 +83,15 @@ 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())
7987
actionConfig := &action.Configuration{
8088
RESTClientGetter: rcg,
8189
Releases: storageBackend,
82-
KubeClient: kubeClient,
83-
Log: func(_ string, _ ...interface{}) {},
90+
KubeClient: &ownerRefInjectingClient{
91+
refs: []metav1.OwnerReference{*controllerRef},
92+
Client: *kubeClient,
93+
},
94+
Log: func(_ string, _ ...interface{}) {},
8495
}
8596
return &manager{
8697
actionConfig: actionConfig,
@@ -96,6 +107,36 @@ func (f managerFactory) NewManager(cr *unstructured.Unstructured) (Manager, erro
96107
}, nil
97108
}
98109

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

0 commit comments

Comments
 (0)