Merge pull request #1266 from fluxcd/fix-source-index
Fix watch index conflict between HelmChart and OCIRepository kinds
This commit is contained in:
commit
5a28a7610e
|
|
@ -127,13 +127,23 @@ func (r *HelmReleaseReconciler) SetupWithManager(ctx context.Context, mgr ctrl.M
|
||||||
if err := mgr.GetFieldIndexer().IndexField(ctx, &v2.HelmRelease{}, v2.SourceIndexKey,
|
if err := mgr.GetFieldIndexer().IndexField(ctx, &v2.HelmRelease{}, v2.SourceIndexKey,
|
||||||
func(o client.Object) []string {
|
func(o client.Object) []string {
|
||||||
obj := o.(*v2.HelmRelease)
|
obj := o.(*v2.HelmRelease)
|
||||||
namespacedName, err := getNamespacedName(obj)
|
var kind, name, namespace string
|
||||||
if err != nil {
|
switch {
|
||||||
|
case obj.HasChartRef() && !obj.HasChartTemplate():
|
||||||
|
kind = obj.Spec.ChartRef.Kind
|
||||||
|
name = obj.Spec.ChartRef.Name
|
||||||
|
namespace = obj.Spec.ChartRef.Namespace
|
||||||
|
if namespace == "" {
|
||||||
|
namespace = obj.GetNamespace()
|
||||||
|
}
|
||||||
|
case !obj.HasChartRef() && obj.HasChartTemplate():
|
||||||
|
kind = sourcev1.HelmChartKind
|
||||||
|
name = obj.GetHelmChartName()
|
||||||
|
namespace = obj.Spec.Chart.GetNamespace(obj.GetNamespace())
|
||||||
|
default:
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return []string{
|
return []string{fmt.Sprintf("%s/%s/%s", kind, namespace, name)}
|
||||||
namespacedName.String(),
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
); err != nil {
|
); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -193,7 +203,7 @@ func (r *HelmReleaseReconciler) SetupWithManager(ctx context.Context, mgr ctrl.M
|
||||||
).
|
).
|
||||||
Watches(
|
Watches(
|
||||||
&sourcev1.OCIRepository{},
|
&sourcev1.OCIRepository{},
|
||||||
handler.EnqueueRequestsFromMapFunc(r.requestsForOCIRrepositoryChange),
|
handler.EnqueueRequestsFromMapFunc(r.requestsForOCIRepositoryChange),
|
||||||
builder.WithPredicates(intpredicates.SourceRevisionChangePredicate{}),
|
builder.WithPredicates(intpredicates.SourceRevisionChangePredicate{}),
|
||||||
).
|
).
|
||||||
WatchesMetadata(
|
WatchesMetadata(
|
||||||
|
|
@ -875,7 +885,7 @@ func (r *HelmReleaseReconciler) requestsForHelmChartChange(ctx context.Context,
|
||||||
|
|
||||||
var list v2.HelmReleaseList
|
var list v2.HelmReleaseList
|
||||||
if err := r.List(ctx, &list, client.MatchingFields{
|
if err := r.List(ctx, &list, client.MatchingFields{
|
||||||
v2.SourceIndexKey: client.ObjectKeyFromObject(hc).String(),
|
v2.SourceIndexKey: sourcev1.HelmChartKind + "/" + client.ObjectKeyFromObject(hc).String(),
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
ctrl.LoggerFrom(ctx).Error(err, "failed to list HelmReleases for HelmChart change")
|
ctrl.LoggerFrom(ctx).Error(err, "failed to list HelmReleases for HelmChart change")
|
||||||
return nil
|
return nil
|
||||||
|
|
@ -893,7 +903,7 @@ func (r *HelmReleaseReconciler) requestsForHelmChartChange(ctx context.Context,
|
||||||
return reqs
|
return reqs
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *HelmReleaseReconciler) requestsForOCIRrepositoryChange(ctx context.Context, o client.Object) []reconcile.Request {
|
func (r *HelmReleaseReconciler) requestsForOCIRepositoryChange(ctx context.Context, o client.Object) []reconcile.Request {
|
||||||
or, ok := o.(*sourcev1.OCIRepository)
|
or, ok := o.(*sourcev1.OCIRepository)
|
||||||
if !ok {
|
if !ok {
|
||||||
err := fmt.Errorf("expected an OCIRepository, got %T", o)
|
err := fmt.Errorf("expected an OCIRepository, got %T", o)
|
||||||
|
|
@ -907,7 +917,7 @@ func (r *HelmReleaseReconciler) requestsForOCIRrepositoryChange(ctx context.Cont
|
||||||
|
|
||||||
var list v2.HelmReleaseList
|
var list v2.HelmReleaseList
|
||||||
if err := r.List(ctx, &list, client.MatchingFields{
|
if err := r.List(ctx, &list, client.MatchingFields{
|
||||||
v2.SourceIndexKey: client.ObjectKeyFromObject(or).String(),
|
v2.SourceIndexKey: sourcev1.OCIRepositoryKind + "/" + client.ObjectKeyFromObject(or).String(),
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
ctrl.LoggerFrom(ctx).Error(err, "failed to list HelmReleases for OCIRepository change")
|
ctrl.LoggerFrom(ctx).Error(err, "failed to list HelmReleases for OCIRepository change")
|
||||||
return nil
|
return nil
|
||||||
|
|
@ -1003,25 +1013,6 @@ func isValidChartRef(obj *v2.HelmRelease) bool {
|
||||||
(!obj.HasChartRef() && obj.HasChartTemplate())
|
(!obj.HasChartRef() && obj.HasChartTemplate())
|
||||||
}
|
}
|
||||||
|
|
||||||
func getNamespacedName(obj *v2.HelmRelease) (types.NamespacedName, error) {
|
|
||||||
namespacedName := types.NamespacedName{}
|
|
||||||
switch {
|
|
||||||
case obj.HasChartRef() && !obj.HasChartTemplate():
|
|
||||||
namespacedName.Namespace = obj.Spec.ChartRef.Namespace
|
|
||||||
if namespacedName.Namespace == "" {
|
|
||||||
namespacedName.Namespace = obj.GetNamespace()
|
|
||||||
}
|
|
||||||
namespacedName.Name = obj.Spec.ChartRef.Name
|
|
||||||
case !obj.HasChartRef() && obj.HasChartTemplate():
|
|
||||||
namespacedName.Namespace = obj.Spec.Chart.GetNamespace(obj.GetNamespace())
|
|
||||||
namespacedName.Name = obj.GetHelmChartName()
|
|
||||||
default:
|
|
||||||
return namespacedName, fmt.Errorf("one of chartRef or chart must be present")
|
|
||||||
}
|
|
||||||
|
|
||||||
return namespacedName, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *HelmReleaseReconciler) mutateChartWithSourceRevision(chart *chart.Chart, source sourcev1.Source) (string, error) {
|
func (r *HelmReleaseReconciler) mutateChartWithSourceRevision(chart *chart.Chart, source sourcev1.Source) (string, error) {
|
||||||
// If the source is an OCIRepository, we can try to mutate the chart version
|
// If the source is an OCIRepository, we can try to mutate the chart version
|
||||||
// with the artifact revision. The revision is either a <tag>@<digest> or
|
// with the artifact revision. The revision is either a <tag>@<digest> or
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue