@@ -16,8 +16,13 @@ package release
16
16
17
17
import (
18
18
"fmt"
19
+ "io"
19
20
"strings"
20
21
22
+ "k8s.io/apimachinery/pkg/runtime"
23
+
24
+ "k8s.io/apimachinery/pkg/api/meta"
25
+
21
26
"github.com/martinlindhe/base36"
22
27
"github.com/pborman/uuid"
23
28
"helm.sh/helm/v3/pkg/action"
@@ -26,8 +31,10 @@ import (
26
31
helmrelease "helm.sh/helm/v3/pkg/release"
27
32
"helm.sh/helm/v3/pkg/storage"
28
33
"helm.sh/helm/v3/pkg/storage/driver"
34
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
29
35
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
30
36
apitypes "k8s.io/apimachinery/pkg/types"
37
+ "k8s.io/cli-runtime/pkg/resource"
31
38
v1 "k8s.io/client-go/kubernetes/typed/core/v1"
32
39
crmanager "sigs.k8s.io/controller-runtime/pkg/manager"
33
40
@@ -76,11 +83,15 @@ func (f managerFactory) NewManager(cr *unstructured.Unstructured) (Manager, erro
76
83
if ! ok {
77
84
return nil , fmt .Errorf ("failed to get spec: expected map[string]interface{}" )
78
85
}
86
+ controllerRef := metav1 .NewControllerRef (cr , cr .GroupVersionKind ())
79
87
actionConfig := & action.Configuration {
80
88
RESTClientGetter : rcg ,
81
89
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 {}) {},
84
95
}
85
96
return & manager {
86
97
actionConfig : actionConfig ,
@@ -96,6 +107,36 @@ func (f managerFactory) NewManager(cr *unstructured.Unstructured) (Manager, erro
96
107
}, nil
97
108
}
98
109
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
+
99
140
// getReleaseName returns a release name for the CR. If a release for the
100
141
// legacy name exists, the legacy name is returned. This ensures
101
142
// backwards-compatibility for pre-existing CRs.
0 commit comments