@@ -52,7 +52,7 @@ import (
5252// Config for the overall controller
5353type config struct {
5454 // Whether to use the dummy implementation of the Keycloak interface
55- KeycloakDummy bool `env:"KEYCLOAK_DUMMY "`
55+ KeycloakProvider string `env:"KEYCLOAK_PROVIDER "`
5656
5757 // If set, will try to populate keycloakConfig using this secret
5858 GCPSecret string `env:"GCP_SECRET"`
@@ -164,50 +164,13 @@ func main() {
164164 cfg , err := env.ParseAsWithOptions [config ](env.Options {Prefix : "KEYCLOAKERATOR_" })
165165 if err != nil {
166166 setupLog .Error (err , "unable to parse general config from env" )
167+ os .Exit (1 )
167168 }
168169
169- var oidcService controller.OIDCService = & controller.OidcDummy {}
170- if ! cfg .KeycloakDummy {
171- kcConfig := & keycloakConfig {}
172-
173- if cfg .GCPSecret != "" {
174- if err = readKeycloakConfigFromSecretManager (ctx , cfg .GCPSecret , kcConfig ); err != nil {
175- setupLog .Error (err , "unable to fetch or parse config from secret manager" )
176- }
177- }
178-
179- err = env .ParseWithOptions (kcConfig , env.Options {
180- Prefix : "KEYCLOAKERATOR_" ,
181- })
182- if err != nil {
183- fmt .Printf ("error parsing environment variables: %s" , err )
184- os .Exit (1 )
185- }
186-
187- if ! kcConfig .Valid () {
188- fmt .Print ("missing one or more keycloak parameters" )
189- os .Exit (1 )
190- }
191-
192- setupLog .Info ("initializing GoCloak wrapper" )
193-
194- // The oauth2/clientcredentials package provides a TokenSource which keeps our Keycloak token
195- // up to date automatically.
196- authConfig := & clientcredentials.Config {
197- ClientID : kcConfig .ClientId ,
198- ClientSecret : kcConfig .ClientSecret ,
199- TokenURL : kcConfig .KeycloakUrl .JoinPath (
200- "realms" ,
201- kcConfig .ClientRealm ,
202- "protocol/openid-connect/token" ,
203- ).String (),
204- }
205-
206- oidcService = keycloak .NewGocloakWrapper (
207- kcConfig .KeycloakUrl .String (),
208- kcConfig .ClientRealm ,
209- authConfig .TokenSource (ctx ),
210- )
170+ oidcService , err := initKeycloakProvider (ctx , cfg )
171+ if err != nil {
172+ setupLog .Error (err , "unable to initialize keycloak provider" )
173+ os .Exit (1 )
211174 }
212175
213176 // Set up our reconciler
@@ -257,3 +220,77 @@ func readKeycloakConfigFromSecretManager(ctx context.Context, secret string, kc
257220
258221 return yaml .Unmarshal (resp .GetPayload ().GetData (), kc )
259222}
223+
224+ func initKeycloakProvider (ctx context.Context , cfg config ) (controller.OIDCService , error ) {
225+ switch cfg .KeycloakProvider {
226+ case "dummy" :
227+ return & controller.OidcDummy {}, nil
228+ case "gocloak" :
229+ return gocloakProvider (ctx , cfg )
230+ case "terraform" :
231+ return terraformProvider (ctx , cfg )
232+ default :
233+ return nil , fmt .Errorf ("unknown keycloak provider %q" , cfg .KeycloakProvider )
234+ }
235+ }
236+
237+ func terraformProvider (ctx context.Context , cfg config ) (controller.OIDCService , error ) {
238+ kcConfig , err := getKeycloakConfig (ctx , cfg .GCPSecret )
239+ if err != nil {
240+ return nil , err
241+ }
242+
243+ return keycloak .NewTerraformProviderWrapper (ctx ,
244+ kcConfig .KeycloakUrl .String (),
245+ kcConfig .ClientId ,
246+ kcConfig .ClientSecret ,
247+ kcConfig .ClientRealm ,
248+ )
249+ }
250+
251+ func gocloakProvider (ctx context.Context , cfg config ) (controller.OIDCService , error ) {
252+ kcConfig , err := getKeycloakConfig (ctx , cfg .GCPSecret )
253+ if err != nil {
254+ return nil , err
255+ }
256+
257+ // The oauth2/clientcredentials package provides a TokenSource which keeps our Keycloak token
258+ // up to date automatically.
259+ authConfig := & clientcredentials.Config {
260+ ClientID : kcConfig .ClientId ,
261+ ClientSecret : kcConfig .ClientSecret ,
262+ TokenURL : kcConfig .KeycloakUrl .JoinPath (
263+ "realms" ,
264+ kcConfig .ClientRealm ,
265+ "protocol/openid-connect/token" ,
266+ ).String (),
267+ }
268+
269+ return keycloak .NewGocloakWrapper (
270+ kcConfig .KeycloakUrl .String (),
271+ kcConfig .ClientRealm ,
272+ authConfig .TokenSource (ctx ),
273+ ), nil
274+ }
275+
276+ func getKeycloakConfig (ctx context.Context , gcpSecret string ) (* keycloakConfig , error ) {
277+ kcConfig := & keycloakConfig {}
278+
279+ if gcpSecret != "" {
280+ if err := readKeycloakConfigFromSecretManager (ctx , gcpSecret , kcConfig ); err != nil {
281+ return nil , fmt .Errorf ("unable to fetch or parse config from secret manager: %w" , err )
282+ }
283+ }
284+
285+ if err := env .ParseWithOptions (kcConfig , env.Options {
286+ Prefix : "KEYCLOAKERATOR_" ,
287+ }); err != nil {
288+ return nil , fmt .Errorf ("error parsing environment variables: %s" , err )
289+ }
290+
291+ if ! kcConfig .Valid () {
292+ return nil , fmt .Errorf ("missing one or more keycloak parameters" )
293+ }
294+
295+ return kcConfig , nil
296+ }
0 commit comments