package controller import ( "context" "fmt" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" "sigs.k8s.io/controller-runtime/pkg/client" terdutv1alpha1 "git.ryuvia.com/niklas/terdut-operator/api/v1alpha1" "git.ryuvia.com/niklas/terdut-operator/internal/tdclient" ) // childError carries a condition reason/message, the same role teamError and // databaseError play for their own controllers: an expected, // requeue-and-retry outcome, not a reconcile failure. type childError struct { reason string message string } func (e *childError) Error() string { return e.message } // resolveTeamAndClient finds the TerdutTeam a child (TerdutAlertSource) names, // requires it to be Ready, and returns a client for its server authenticated // with that server's operator key. The server is read from the team's own // serverRef: consent was already checked when the team went Ready, and does not // gate a resource the team owns. func resolveTeamAndClient( ctx context.Context, c client.Client, namespace string, ref terdutv1alpha1.TerdutTeamRef, newClient func(string) *tdclient.Client, ) (*terdutv1alpha1.TerdutTeam, *tdclient.Client, *childError) { var team terdutv1alpha1.TerdutTeam if err := c.Get(ctx, client.ObjectKey{Namespace: namespace, Name: ref.Name}, &team); err != nil { if apierrors.IsNotFound(err) { return nil, nil, &childError{ reason: terdutv1alpha1.ReasonTeamRefNotFound, message: fmt.Sprintf("TerdutTeam %q not found in namespace %q", ref.Name, namespace), } } return nil, nil, &childError{reason: terdutv1alpha1.ReasonTeamRefNotFound, message: err.Error()} } if team.Status.TeamID == 0 || !meta.IsStatusConditionTrue(team.Status.Conditions, terdutv1alpha1.ConditionReady) { return nil, nil, &childError{ reason: terdutv1alpha1.ReasonWaitingForTeam, message: fmt.Sprintf("TerdutTeam %q is not Ready yet", ref.Name), } } srvNS := team.Spec.ServerRef.Namespace if srvNS == "" { srvNS = team.Namespace } var srv terdutv1alpha1.TerdutServer if err := c.Get(ctx, client.ObjectKey{Namespace: srvNS, Name: team.Spec.ServerRef.Name}, &srv); err != nil { return nil, nil, &childError{reason: terdutv1alpha1.ReasonWaitingForTeam, message: err.Error()} } key, err := readOperatorKey(ctx, c, &srv) if err != nil { return nil, nil, &childError{reason: terdutv1alpha1.ReasonWaitingForTeam, message: err.Error()} } return &team, newClient(serviceURL(&srv)).WithToken(key), nil }