package v1alpha1 import ( "context" "fmt" corev1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" ) // +kubebuilder:object:generate=false type RefResolver struct { client client.Client } func NewRefResolver(client client.Client) *RefResolver { return &RefResolver{ client: client, } } func (r *RefResolver) OIDCAppRef(ctx context.Context, ref *OIDCAppRef, namespace string) (*OIDCApp, error) { if ref.Kind != "" && ref.Kind != "OIDCApp" { return nil, fmt.Errorf("Unsupported reference kind: '%s'", ref.Kind) } key := types.NamespacedName{ Name: ref.Name, Namespace: namespace, } if ref.Namespace != "" { key.Namespace = ref.Namespace } var zitadel OIDCApp if err := r.client.Get(ctx, key, &zitadel); err != nil { return nil, err } return &zitadel, nil } func (r *RefResolver) ActionRef(ctx context.Context, ref *ActionRef, namespace string) (*Action, error) { if ref.Kind != "" && ref.Kind != "Action" { return nil, fmt.Errorf("Unsupported reference kind: '%s'", ref.Kind) } key := types.NamespacedName{ Name: ref.Name, Namespace: namespace, } if ref.Namespace != "" { key.Namespace = ref.Namespace } var zitadel Action if err := r.client.Get(ctx, key, &zitadel); err != nil { return nil, err } return &zitadel, nil } func (r *RefResolver) ProjectRef(ctx context.Context, ref *ProjectRef, namespace string) (*Project, error) { if ref.Kind != "" && ref.Kind != "Project" { return nil, fmt.Errorf("Unsupported reference kind: '%s'", ref.Kind) } key := types.NamespacedName{ Name: ref.Name, Namespace: namespace, } if ref.Namespace != "" { key.Namespace = ref.Namespace } var zitadel Project if err := r.client.Get(ctx, key, &zitadel); err != nil { return nil, err } return &zitadel, nil } func (r *RefResolver) OrganizationRef(ctx context.Context, ref *OrganizationRef, namespace string) (*Organization, error) { if ref.Kind != "" && ref.Kind != "Organization" { return nil, fmt.Errorf("Unsupported reference kind: '%s'", ref.Kind) } key := types.NamespacedName{ Name: ref.Name, Namespace: namespace, } if ref.Namespace != "" { key.Namespace = ref.Namespace } var zitadel Organization if err := r.client.Get(ctx, key, &zitadel); err != nil { return nil, err } return &zitadel, nil } func (r *RefResolver) ConnectionRef(ctx context.Context, ref *ConnectionRef, namespace string) (*Connection, error) { if ref.Kind != "" && ref.Kind != "Connection" { return nil, fmt.Errorf("Unsupported reference kind: '%s'", ref.Kind) } key := types.NamespacedName{ Name: ref.Name, Namespace: namespace, } if ref.Namespace != "" { key.Namespace = ref.Namespace } var connection Connection if err := r.client.Get(ctx, key, &connection); err != nil { return nil, err } return &connection, nil } func (r *RefResolver) SecretKeyRef(ctx context.Context, selector corev1.SecretKeySelector, namespace string) (string, error) { nn := types.NamespacedName{ Name: selector.Name, Namespace: namespace, } var secret v1.Secret if err := r.client.Get(ctx, nn, &secret); err != nil { return "", fmt.Errorf("error getting secret: %v", err) } data, ok := secret.Data[selector.Key] if !ok { return "", fmt.Errorf("secret key \"%s\" not found", selector.Key) } return string(data), nil }