feat: event-trigger (Вариант A) — TriggerTypeEvent, event-dispatcher, reconcileEvent

This commit is contained in:
Naeel
2026-03-19 13:44:35 +03:00
parent 1aac3f5093
commit a379091b8a
9 changed files with 534 additions and 6 deletions
+44
View File
@@ -124,6 +124,9 @@ func (r *TriggerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
case slessv1alpha1.TriggerTypeCron:
logger.Info("reconcile cron trigger", "trigger", tr.Name)
return r.reconcileCron(ctx, tr, fn)
case slessv1alpha1.TriggerTypeEvent:
logger.Info("reconcile event trigger", "trigger", tr.Name)
return r.reconcileEvent(ctx, tr, fn)
}
return ctrl.Result{}, nil
@@ -325,3 +328,44 @@ func (r *TriggerReconciler) SetupWithManager(mgr ctrl.Manager) error {
For(&slessv1alpha1.Trigger{}).
Complete(r)
}
// reconcileEvent обрабатывает Trigger{type:event}.
// Оператор не управляет AMQP напрямую — это задача event-dispatcher.
// Здесь: убеждаемся что Service функции существует (dispatcher использует его для POST),
// обновляем статус триггера.
func (r *TriggerReconciler) reconcileEvent(ctx context.Context, tr *slessv1alpha1.Trigger, fn *slessv1alpha1.Function) (ctrl.Result, error) {
if tr.Spec.Queue == "" {
tr.Status.Active = false
tr.Status.Message = "queue is required for type=event"
_ = r.Status().Update(ctx, tr)
return ctrl.Result{}, nil
}
deployNS := "sless-fn-" + tr.Namespace
// Service нужен event-dispatcher для доставки сообщений в функцию по HTTP.
// Имя Service совпадает с именем Function — dispatcher строит URL как
// http://{functionRef}.{deployNS}.svc.cluster.local:8080/
wantSvc := &corev1.Service{
ObjectMeta: metav1.ObjectMeta{Name: fn.Name, Namespace: deployNS},
Spec: corev1.ServiceSpec{
Selector: map[string]string{"app": fn.Name},
Ports: []corev1.ServicePort{{Port: 8080, Protocol: corev1.ProtocolTCP}},
},
}
existingSvc := &corev1.Service{}
if err := r.Get(ctx, client.ObjectKey{Name: fn.Name, Namespace: deployNS}, existingSvc); err != nil {
if errors.IsNotFound(err) {
if err := r.Create(ctx, wantSvc); err != nil {
return ctrl.Result{}, fmt.Errorf("create service for event trigger: %w", err)
}
} else {
return ctrl.Result{}, fmt.Errorf("get service: %w", err)
}
}
tr.Status.Active = true
tr.Status.Message = fmt.Sprintf("listening on queue %q via event-dispatcher", tr.Spec.Queue)
_ = r.Status().Update(ctx, tr)
return ctrl.Result{}, nil
}