controllers/keycloakrealm/chain/configure_email.go (102 lines of code) (raw):
package chain
import (
"context"
"fmt"
"strconv"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"github.com/epam/edp-keycloak-operator/api/common"
keycloakApi "github.com/epam/edp-keycloak-operator/api/v1"
"github.com/epam/edp-keycloak-operator/controllers/keycloakrealm/chain/handler"
"github.com/epam/edp-keycloak-operator/pkg/client/keycloak"
"github.com/epam/edp-keycloak-operator/pkg/secretref"
)
type ConfigureEmail struct {
next handler.RealmHandler
client client.Client
}
func (s ConfigureEmail) ServeRequest(ctx context.Context, realm *keycloakApi.KeycloakRealm, kClient keycloak.Client) error {
if realm.Spec.Smtp == nil {
return nextServeOrNil(ctx, s.next, realm, kClient)
}
l := ctrl.LoggerFrom(ctx)
l.Info("Configuring email for realm")
if err := ConfigureRamlEmail(
ctx,
realm.Spec.RealmName,
realm.Spec.Smtp,
realm.Namespace,
kClient,
s.client,
); err != nil {
return err
}
l.Info("Email has been configured")
return nextServeOrNil(ctx, s.next, realm, kClient)
}
func ConfigureRamlEmail(
ctx context.Context,
realmName string,
emailSpec *common.SMTP,
secretsNamespace string,
kcClient keycloak.Client,
k8sClient client.Client,
) error {
if emailSpec == nil {
return nil
}
realm, err := kcClient.GetRealm(ctx, realmName)
if err != nil {
return fmt.Errorf("unable to get realm %v: %w", realmName, err)
}
emailMap, err := convertEmailSpecToMap(ctx, emailSpec, secretsNamespace, k8sClient)
if err != nil {
return err
}
realm.SMTPServer = &emailMap
if err = kcClient.UpdateRealm(ctx, realm); err != nil {
return fmt.Errorf("unable to update realm %v: %w", realmName, err)
}
return nil
}
func convertEmailSpecToMap(
ctx context.Context,
emailSpec *common.SMTP,
secretsNamespace string,
k8sClient client.Client,
) (map[string]string, error) {
emailMap := make(map[string]string)
emailMap["from"] = emailSpec.Template.From
emailMap["fromDisplayName"] = emailSpec.Template.FromDisplayName
emailMap["replyTo"] = emailSpec.Template.ReplyTo
emailMap["replyToDisplayName"] = emailSpec.Template.ReplyToDisplayName
emailMap["envelopeFrom"] = emailSpec.Template.EnvelopeFrom
emailMap["host"] = emailSpec.Connection.Host
emailMap["port"] = strconv.Itoa(emailSpec.Connection.Port)
emailMap["ssl"] = strconv.FormatBool(emailSpec.Connection.EnableSSL)
emailMap["starttls"] = strconv.FormatBool(emailSpec.Connection.EnableStartTLS)
emailMap["auth"] = strconv.FormatBool(emailSpec.Connection.Authentication != nil)
if emailSpec.Connection.Authentication != nil {
username, err := secretref.GetValueFromSourceRefOrVal(
ctx,
&emailSpec.Connection.Authentication.Username,
secretsNamespace,
k8sClient,
)
if err != nil {
return nil, fmt.Errorf("unable to get username: %w", err)
}
emailMap["user"] = username
password, err := secretref.GetValueFromSourceRef(
ctx,
&emailSpec.Connection.Authentication.Password,
secretsNamespace,
k8sClient,
)
if err != nil {
return nil, fmt.Errorf("unable to get password: %w", err)
}
emailMap["password"] = password
}
return emailMap, nil
}