@@ -21,7 +21,6 @@ import (
2121 "fmt"
2222 "io/ioutil"
2323 "net/url"
24- "time"
2524
2625 "github.com/go-logr/logr"
2726 "helm.sh/helm/v3/pkg/getter"
@@ -52,8 +51,7 @@ type HelmChartReconciler struct {
5251// +kubebuilder:rbac:groups=source.fluxcd.io,resources=helmcharts/status,verbs=get;update;patch
5352
5453func (r * HelmChartReconciler ) Reconcile (req ctrl.Request ) (ctrl.Result , error ) {
55- ctx , cancel := context .WithTimeout (context .Background (), 15 * time .Second )
56- defer cancel ()
54+ ctx := context .Background ()
5755
5856 var chart sourcev1.HelmChart
5957 if err := r .Get (ctx , req .NamespacedName , & chart ); err != nil {
@@ -78,7 +76,7 @@ func (r *HelmChartReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
7876 }
7977
8078 // get referenced chart repository
81- repository , err := r .chartRepository (ctx , chart )
79+ repository , err := r .getChartRepositoryWithArtifact (ctx , chart )
8280 if err != nil {
8381 chart = sourcev1 .HelmChartNotReady (* chart .DeepCopy (), sourcev1 .ChartPullFailedReason , err .Error ())
8482 if err := r .Status ().Update (ctx , & chart ); err != nil {
@@ -94,7 +92,7 @@ func (r *HelmChartReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
9492 }
9593
9694 // try to pull chart
97- pulledChart , err := r .sync (repository , * chart .DeepCopy ())
95+ pulledChart , err := r .sync (ctx , repository , * chart .DeepCopy ())
9896 if err != nil {
9997 log .Error (err , "Helm chart sync failed" )
10098 if err := r .Status ().Update (ctx , & pulledChart ); err != nil {
@@ -132,7 +130,7 @@ func (r *HelmChartReconciler) SetupWithManagerAndOptions(mgr ctrl.Manager, opts
132130 Complete (r )
133131}
134132
135- func (r * HelmChartReconciler ) sync (repository sourcev1.HelmRepository , chart sourcev1.HelmChart ) (sourcev1.HelmChart , error ) {
133+ func (r * HelmChartReconciler ) sync (ctx context. Context , repository sourcev1.HelmRepository , chart sourcev1.HelmChart ) (sourcev1.HelmChart , error ) {
136134 indexBytes , err := ioutil .ReadFile (repository .Status .Artifact .Path )
137135 if err != nil {
138136 err = fmt .Errorf ("failed to read Helm repository index file: %w" , err )
@@ -182,7 +180,7 @@ func (r *HelmChartReconciler) sync(repository sourcev1.HelmRepository, chart sou
182180 }
183181
184182 var secret corev1.Secret
185- err := r .Client .Get (context . TODO () , name , & secret )
183+ err := r .Client .Get (ctx , name , & secret )
186184 if err != nil {
187185 err = fmt .Errorf ("auth secret error: %w" , err )
188186 return sourcev1 .HelmChartNotReady (chart , sourcev1 .AuthenticationFailedReason , err .Error ()), err
@@ -199,6 +197,8 @@ func (r *HelmChartReconciler) sync(repository sourcev1.HelmRepository, chart sou
199197 clientOpts = opts
200198 }
201199
200+ // TODO(hidde): implement timeout from the HelmRepository
201+ // https://github.com/helm/helm/pull/7950
202202 res , err := c .Get (u .String (), clientOpts ... )
203203 if err != nil {
204204 return sourcev1 .HelmChartNotReady (chart , sourcev1 .ChartPullFailedReason , err .Error ()), err
@@ -246,7 +246,10 @@ func (r *HelmChartReconciler) sync(repository sourcev1.HelmRepository, chart sou
246246 return sourcev1 .HelmChartReady (chart , artifact , chartUrl , sourcev1 .ChartPullSucceededReason , message ), nil
247247}
248248
249- func (r * HelmChartReconciler ) chartRepository (ctx context.Context , chart sourcev1.HelmChart ) (sourcev1.HelmRepository , error ) {
249+ // getChartRepositoryWithArtifact attempts to get the ChartRepository
250+ // for the given chart. It returns an error if the HelmRepository could
251+ // not be retrieved or if does not have an artifact.
252+ func (r * HelmChartReconciler ) getChartRepositoryWithArtifact (ctx context.Context , chart sourcev1.HelmChart ) (sourcev1.HelmRepository , error ) {
250253 if chart .Spec .HelmRepositoryRef .Name == "" {
251254 return sourcev1.HelmRepository {}, fmt .Errorf ("no HelmRepository reference given" )
252255 }
@@ -270,6 +273,8 @@ func (r *HelmChartReconciler) chartRepository(ctx context.Context, chart sourcev
270273 return repository , err
271274}
272275
276+ // shouldResetStatus returns a boolean indicating if the status of the
277+ // given chart should be reset and a reset HelmChartStatus.
273278func (r * HelmChartReconciler ) shouldResetStatus (chart sourcev1.HelmChart ) (bool , sourcev1.HelmChartStatus ) {
274279 resetStatus := false
275280 if chart .Status .Artifact != nil {
@@ -295,18 +300,23 @@ func (r *HelmChartReconciler) shouldResetStatus(chart sourcev1.HelmChart) (bool,
295300 }
296301}
297302
303+ // gc performs a garbage collection on all but current artifacts of
304+ // the given chart.
298305func (r * HelmChartReconciler ) gc (chart sourcev1.HelmChart ) error {
299306 if chart .Status .Artifact != nil {
300307 return r .Storage .RemoveAllButCurrent (* chart .Status .Artifact )
301308 }
302309 return nil
303310}
304311
312+ // setOwnerRef appends the owner reference of the given chart to the
313+ // repository if it is not present.
305314func (r * HelmChartReconciler ) setOwnerRef (ctx context.Context , chart * sourcev1.HelmChart , repository sourcev1.HelmRepository ) error {
306- if ! metav1 .IsControlledBy (chart .GetObjectMeta (), repository .GetObjectMeta ()) {
307- chart .SetOwnerReferences (append (chart .GetOwnerReferences (),
308- * metav1 .NewControllerRef (repository .GetObjectMeta (), repository .GroupVersionKind ())))
309- return r .Update (ctx , chart )
315+ if metav1 .IsControlledBy (chart .GetObjectMeta (), repository .GetObjectMeta ()) {
316+ return nil
310317 }
311- return nil
318+ chart .SetOwnerReferences (append (chart .GetOwnerReferences (), * metav1 .NewControllerRef (
319+ repository .GetObjectMeta (), repository .GroupVersionKind (),
320+ )))
321+ return r .Update (ctx , chart )
312322}
0 commit comments