controllers/keycloakclient/chain/chain.go (60 lines of code) (raw):
package chain
import (
"context"
"fmt"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
keycloakApi "github.com/epam/edp-keycloak-operator/api/v1"
"github.com/epam/edp-keycloak-operator/pkg/client/keycloak"
"github.com/epam/edp-keycloak-operator/pkg/secretref"
)
type ClientHandler interface {
Serve(
ctx context.Context,
keycloakClient *keycloakApi.KeycloakClient,
realmName string,
) error
}
type Chain struct {
handlers []ClientHandler
}
func (ch *Chain) Use(handlers ...ClientHandler) {
ch.handlers = append(ch.handlers, handlers...)
}
func (ch *Chain) Serve(
ctx context.Context,
keycloakClient *keycloakApi.KeycloakClient,
realmName string,
) error {
log := ctrl.LoggerFrom(ctx)
log.Info("Starting KeycloakClient chain")
for i := 0; i < len(ch.handlers); i++ {
h := ch.handlers[i]
err := h.Serve(ctx, keycloakClient, realmName)
if err != nil {
log.Info("KeycloakClient chain finished with error")
return fmt.Errorf("failed to serve handler: %w", err)
}
}
log.Info("Handling of KeycloakClient has been finished")
return nil
}
func MakeChain(
keycloakApiClient keycloak.Client,
k8sClient client.Client,
) *Chain {
c := &Chain{}
c.Use(
NewPutClient(keycloakApiClient, k8sClient, secretref.NewSecretRef(k8sClient)),
NewPutClientRole(keycloakApiClient),
NewPutRealmRole(keycloakApiClient),
NewPutClientScope(keycloakApiClient),
NewPutProtocolMappers(keycloakApiClient),
NewServiceAccount(keycloakApiClient),
NewProcessScope(keycloakApiClient),
NewProcessResources(keycloakApiClient),
NewProcessPolicy(keycloakApiClient),
NewProcessPermissions(keycloakApiClient),
)
return c
}