Skip to content

Commit

Permalink
EventTrigger: referenced resource names as template
Browse files Browse the repository at this point in the history
EventTrigger can reference resources in the PolicyRefs section:

- namespace of each of those resources can either be set or left
empty (in which case the cluster's namespace will be used);
- name of each of those resources can be expressed as a template
using `.Cluster.metadata.namespace`, `.Cluster.metadata.name` and
`.Cluster.metedata.kind`

HelmCharts are also instantiated. If an Helm chart is referencing
one or more ConfigMap/Secret instances via ValuesFrom, those are
instantiated if referenced resource contains the annotation
`projectsveltos.io/template`

Same applies to KustomizationRefs, which are also instantiated.
If a KustomizationRef is referencing one or more ConfigMap/Secret
instances via ValuesFrom, those are instantiated if referenced
resource contains the annotation `projectsveltos.io/template`
  • Loading branch information
mgianluc committed Jul 18, 2024
1 parent 070b5e2 commit f137e05
Show file tree
Hide file tree
Showing 8 changed files with 662 additions and 87 deletions.
47 changes: 36 additions & 11 deletions controllers/eventtrigger_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ import (
"github.com/projectsveltos/libsveltos/lib/deployer"
logs "github.com/projectsveltos/libsveltos/lib/logsettings"
libsveltosset "github.com/projectsveltos/libsveltos/lib/set"
libsveltostemplate "github.com/projectsveltos/libsveltos/lib/template"
)

type ReportMode int
Expand Down Expand Up @@ -277,7 +278,11 @@ func (r *EventTriggerReconciler) reconcileNormal(
return reconcile.Result{Requeue: true, RequeueAfter: normalRequeueAfter}
}

r.updateMaps(eventTriggerScope)
err = r.updateMaps(eventTriggerScope, logger)
if err != nil {
logger.V(logs.LogDebug).Info("failed to update maps")
return reconcile.Result{Requeue: true, RequeueAfter: normalRequeueAfter}
}

f := getHandlersForFeature(v1beta1.FeatureEventTrigger)
if err := r.deployEventTrigger(ctx, eventTriggerScope, f, logger); err != nil {
Expand Down Expand Up @@ -461,12 +466,15 @@ func (r *EventTriggerReconciler) cleanMaps(eventTriggerScope *scope.EventTrigger
}
}

func (r *EventTriggerReconciler) updateMaps(eventTriggerScope *scope.EventTriggerScope) {
func (r *EventTriggerReconciler) updateMaps(eventTriggerScope *scope.EventTriggerScope, logger logr.Logger) error {
r.updateClusterMaps(eventTriggerScope)

r.updateEventSourceMaps(eventTriggerScope)

r.updateReferencedResourceMap(eventTriggerScope)
if err := r.updateReferencedResourceMap(eventTriggerScope); err != nil {
logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to update referenced resources map: %v", err))
return err
}

r.updateClusterSetMap(eventTriggerScope)

Expand All @@ -476,6 +484,7 @@ func (r *EventTriggerReconciler) updateMaps(eventTriggerScope *scope.EventTrigge
defer r.Mux.Unlock()

r.EventTriggers[*eventTriggerInfo] = eventTriggerScope.EventTrigger.Spec.SourceClusterSelector
return nil
}

func (r *EventTriggerReconciler) updateClusterSetMap(eventTriggerScope *scope.EventTriggerScope) {
Expand Down Expand Up @@ -586,9 +595,12 @@ func (r *EventTriggerReconciler) updateEventSourceMaps(eventTriggerScope *scope.
r.ToEventSourceMap[name] = currentReferences
}

func (r *EventTriggerReconciler) updateReferencedResourceMap(eventTriggerScope *scope.EventTriggerScope) {
func (r *EventTriggerReconciler) updateReferencedResourceMap(eventTriggerScope *scope.EventTriggerScope) error {
// Get list of ConfigMap/Secret currently referenced
currentReferences := r.getCurrentReferences(eventTriggerScope)
currentReferences, err := r.getCurrentReferences(eventTriggerScope)
if err != nil {
return err
}

r.Mux.Lock()
defer r.Mux.Unlock()
Expand Down Expand Up @@ -626,6 +638,7 @@ func (r *EventTriggerReconciler) updateReferencedResourceMap(eventTriggerScope *

// Update list of ConfigMaps/Secrets currently referenced by EventTrigger
r.EventTriggerMap[eventTriggerName] = currentReferences
return nil
}

func getConsumersForEntry(currentMap map[corev1.ObjectReference]*libsveltosset.Set,
Expand Down Expand Up @@ -676,17 +689,23 @@ func (r *EventTriggerReconciler) updateClusterInfo(ctx context.Context,
return nil
}

func (r *EventTriggerReconciler) getCurrentReferences(eventTriggerScope *scope.EventTriggerScope) *libsveltosset.Set {
func (r *EventTriggerReconciler) getCurrentReferences(eventTriggerScope *scope.EventTriggerScope) (*libsveltosset.Set, error) {
currentReferences := &libsveltosset.Set{}
for i := range eventTriggerScope.EventTrigger.Spec.PolicyRefs {
referencedNamespace := eventTriggerScope.EventTrigger.Spec.PolicyRefs[i].Namespace
referencedName := eventTriggerScope.EventTrigger.Spec.PolicyRefs[i].Name

// If referenced resource namespace is empty, at instantiation time the cluster namespace will be used.
// Here to track referenced ConfigMaps/Resource, we use all current matching clusters
for j := range eventTriggerScope.EventTrigger.Status.MatchingClusterRefs {
clusterRef := eventTriggerScope.EventTrigger.Status.MatchingClusterRefs[j]
namespace := getReferenceResourceNamespace(clusterRef.Namespace, referencedNamespace)
namespace := libsveltostemplate.GetReferenceResourceNamespace(clusterRef.Namespace, referencedNamespace)

clusterType := clusterproxy.GetClusterType(&clusterRef)
referencedName, err := libsveltostemplate.GetReferenceResourceName(clusterRef.Namespace, clusterRef.Name,
string(clusterType), eventTriggerScope.EventTrigger.Spec.PolicyRefs[i].Name)
if err != nil {
return nil, err
}

currentReferences.Insert(&corev1.ObjectReference{
APIVersion: corev1.SchemeGroupVersion.String(), // the only resources that can be referenced are Secret and ConfigMap
Expand All @@ -699,13 +718,19 @@ func (r *EventTriggerReconciler) getCurrentReferences(eventTriggerScope *scope.E

for i := range eventTriggerScope.EventTrigger.Spec.KustomizationRefs {
referencedNamespace := eventTriggerScope.EventTrigger.Spec.KustomizationRefs[i].Namespace
referencedName := eventTriggerScope.EventTrigger.Spec.KustomizationRefs[i].Name

// If referenced resource namespace is empty, at instantiation time the cluster namespace will be used.
// Here to track referenced ConfigMaps/Resource, we use all current matching clusters
for j := range eventTriggerScope.EventTrigger.Status.MatchingClusterRefs {
clusterRef := eventTriggerScope.EventTrigger.Status.MatchingClusterRefs[j]
namespace := getReferenceResourceNamespace(clusterRef.Namespace, referencedNamespace)
namespace := libsveltostemplate.GetReferenceResourceNamespace(clusterRef.Namespace, referencedNamespace)

clusterType := clusterproxy.GetClusterType(&clusterRef)
referencedName, err := libsveltostemplate.GetReferenceResourceName(clusterRef.Namespace, clusterRef.Name,
string(clusterType), eventTriggerScope.EventTrigger.Spec.KustomizationRefs[i].Name)
if err != nil {
return nil, err
}

ref := &corev1.ObjectReference{
Kind: eventTriggerScope.EventTrigger.Spec.KustomizationRefs[i].Kind,
Expand All @@ -725,7 +750,7 @@ func (r *EventTriggerReconciler) getCurrentReferences(eventTriggerScope *scope.E
currentReferences.Insert(ref)
}
}
return currentReferences
return currentReferences, nil
}

func (r *EventTriggerReconciler) getClustersFromClusterSets(ctx context.Context, clusterSetRefs []string,
Expand Down
4 changes: 2 additions & 2 deletions controllers/eventtrigger_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@ var _ = Describe("EventTrigger: Reconciler", func() {
})
Expect(err).To(BeNil())

controllers.UpdateMaps(&reconciler, resourceScope)
Expect(controllers.UpdateMaps(&reconciler, resourceScope, logger)).To(Succeed())

clusterInfo := &corev1.ObjectReference{Namespace: clusterNamespace, Name: clusterName,
Kind: libsveltosv1beta1.SveltosClusterKind, APIVersion: libsveltosv1beta1.GroupVersion.String()}
Expand Down Expand Up @@ -461,7 +461,7 @@ var _ = Describe("EventTrigger: Reconciler", func() {
})
Expect(err).To(BeNil())

controllers.UpdateReferencedResourceMap(&reconciler, resourceScope)
Expect(controllers.UpdateReferencedResourceMap(&reconciler, resourceScope)).To(Succeed())

eventTriggerName := types.NamespacedName{Name: resourceScope.Name()}
v, ok := reconciler.EventTriggerMap[eventTriggerName]
Expand Down
Loading

0 comments on commit f137e05

Please sign in to comment.