@@ -82,13 +82,13 @@ func shouldSkipPreflight(ctx context.Context, preflight Preflight, ext *ocv1.Clu
8282
8383func (h * Helm ) Apply (ctx context.Context , contentFS fs.FS , ext * ocv1.ClusterExtension , objectLabels map [string ]string , storageLabels map [string ]string ) ([]client.Object , string , error ) {
8484 if features .OperatorControllerFeatureGate .Enabled (features .PreflightPermissions ) {
85- authclient , err := h .AuthorizationClientMapper .GetAuthorizationClient (ctx , ext )
85+ rawAuthClient , err := h .AuthorizationClientMapper .GetAuthorizationClient (ctx , ext )
8686 if err != nil {
87- return nil , "" , err
87+ return nil , "" , fmt . Errorf ( "failed to get authorization client: %w" , err )
8888 }
8989
90- err = h . AuthorizationClientMapper . CheckContentPermissions ( ctx , contentFS , authclient , ext )
91- if err != nil {
90+ authClient := authorization . NewClient ( rawAuthClient )
91+ if err := h . checkContentPermissions ( ctx , contentFS , authClient , ext ); err != nil {
9292 return nil , "" , fmt .Errorf ("failed checking content permissions: %w" , err )
9393 }
9494 }
@@ -102,7 +102,7 @@ func (h *Helm) Apply(ctx context.Context, contentFS fs.FS, ext *ocv1.ClusterExte
102102
103103 ac , err := h .ActionClientGetter .ActionClientFor (ctx , ext )
104104 if err != nil {
105- return nil , "" , err
105+ return nil , "" , fmt . Errorf ( "failed to get action client: %w" , err )
106106 }
107107
108108 post := & postrenderer {
@@ -120,14 +120,12 @@ func (h *Helm) Apply(ctx context.Context, contentFS fs.FS, ext *ocv1.ClusterExte
120120 }
121121 switch state {
122122 case StateNeedsInstall :
123- err := preflight .Install (ctx , desiredRel )
124- if err != nil {
125- return nil , state , err
123+ if err := preflight .Install (ctx , desiredRel ); err != nil {
124+ return nil , state , fmt .Errorf ("preflight install check failed: %w" , err )
126125 }
127126 case StateNeedsUpgrade :
128- err := preflight .Upgrade (ctx , desiredRel )
129- if err != nil {
130- return nil , state , err
127+ if err := preflight .Upgrade (ctx , desiredRel ); err != nil {
128+ return nil , state , fmt .Errorf ("preflight upgrade check failed: %w" , err )
131129 }
132130 }
133131 }
@@ -140,7 +138,7 @@ func (h *Helm) Apply(ctx context.Context, contentFS fs.FS, ext *ocv1.ClusterExte
140138 return nil
141139 }, helmclient .AppendInstallPostRenderer (post ))
142140 if err != nil {
143- return nil , state , err
141+ return nil , state , fmt . Errorf ( "failed to install release: %w" , err )
144142 }
145143 case StateNeedsUpgrade :
146144 rel , err = ac .Upgrade (ext .GetName (), ext .Spec .Namespace , chrt , values , func (upgrade * action.Upgrade ) error {
@@ -149,24 +147,39 @@ func (h *Helm) Apply(ctx context.Context, contentFS fs.FS, ext *ocv1.ClusterExte
149147 return nil
150148 }, helmclient .AppendUpgradePostRenderer (post ))
151149 if err != nil {
152- return nil , state , err
150+ return nil , state , fmt . Errorf ( "failed to upgrade release: %w" , err )
153151 }
154152 case StateUnchanged :
155153 if err := ac .Reconcile (rel ); err != nil {
156- return nil , state , err
154+ return nil , state , fmt . Errorf ( "failed to reconcile release: %w" , err )
157155 }
158156 default :
159157 return nil , state , fmt .Errorf ("unexpected release state %q" , state )
160158 }
161159
162160 relObjects , err := util .ManifestObjects (strings .NewReader (rel .Manifest ), fmt .Sprintf ("%s-release-manifest" , rel .Name ))
163161 if err != nil {
164- return nil , state , err
162+ return nil , state , fmt . Errorf ( "failed to convert manifest to objects: %w" , err )
165163 }
166164
167165 return relObjects , state , nil
168166}
169167
168+ // Check if RBAC allows the installer service account necessary permissions on the objects in the contentFS
169+ func (h * Helm ) checkContentPermissions (ctx context.Context , contentFS fs.FS , authClient authorization.AuthorizationClient , ext * ocv1.ClusterExtension ) error {
170+ reg , err := convert .ParseFS (ctx , contentFS )
171+ if err != nil {
172+ return fmt .Errorf ("failed to parse content FS: %w" , err )
173+ }
174+
175+ plain , err := convert .Convert (reg , ext .Spec .Namespace , []string {corev1 .NamespaceAll })
176+ if err != nil {
177+ return fmt .Errorf ("failed to convert registry: %w" , err )
178+ }
179+
180+ return authClient .CheckContentPermissions (ctx , plain .Objects , ext )
181+ }
182+
170183func (h * Helm ) getReleaseState (cl helmclient.ActionInterface , ext * ocv1.ClusterExtension , chrt * chart.Chart , values chartutil.Values , post postrender.PostRenderer ) (* release.Release , * release.Release , string , error ) {
171184 currentRelease , err := cl .Get (ext .GetName ())
172185
@@ -177,16 +190,12 @@ func (h *Helm) getReleaseState(cl helmclient.ActionInterface, ext *ocv1.ClusterE
177190 return nil
178191 }, helmclient .AppendInstallPostRenderer (post ))
179192 if err != nil {
180- if features .OperatorControllerFeatureGate .Enabled (features .PreflightPermissions ) {
181- _ = struct {}{} // minimal no-op to satisfy linter
182- // probably need to break out this error as it's the one for helm dry-run as opposed to any returned later
183- }
184- return nil , nil , StateError , err
193+ return nil , nil , StateError , fmt .Errorf ("failed dry-run install: %w" , err )
185194 }
186195 return nil , desiredRelease , StateNeedsInstall , nil
187196 }
188197 if err != nil {
189- return nil , nil , StateError , err
198+ return nil , nil , StateError , fmt . Errorf ( "failed to get current release: %w" , err )
190199 }
191200
192201 desiredRelease , err := cl .Upgrade (ext .GetName (), ext .Spec .Namespace , chrt , values , func (upgrade * action.Upgrade ) error {
@@ -196,7 +205,7 @@ func (h *Helm) getReleaseState(cl helmclient.ActionInterface, ext *ocv1.ClusterE
196205 return nil
197206 }, helmclient .AppendUpgradePostRenderer (post ))
198207 if err != nil {
199- return currentRelease , nil , StateError , err
208+ return currentRelease , nil , StateError , fmt . Errorf ( "failed dry-run upgrade: %w" , err )
200209 }
201210 relState := StateUnchanged
202211 if desiredRelease .Manifest != currentRelease .Manifest ||
0 commit comments