23
23
24
24
25
25
class KeycloakContainer (DockerContainer ):
26
+ has_realm_imports = False
27
+
26
28
"""
27
29
Keycloak container.
28
30
@@ -43,22 +45,26 @@ def __init__(
43
45
username : Optional [str ] = None ,
44
46
password : Optional [str ] = None ,
45
47
port : int = 8080 ,
48
+ cmd : Optional [str ] = _DEFAULT_DEV_COMMAND ,
46
49
) -> None :
47
50
super ().__init__ (image = image )
48
51
self .username = username or os .environ .get ("KEYCLOAK_ADMIN" , "test" )
49
52
self .password = password or os .environ .get ("KEYCLOAK_ADMIN_PASSWORD" , "test" )
50
53
self .port = port
51
54
self .with_exposed_ports (self .port )
55
+ self .cmd = cmd
52
56
53
57
def _configure (self ) -> None :
54
58
self .with_env ("KEYCLOAK_ADMIN" , self .username )
55
59
self .with_env ("KEYCLOAK_ADMIN_PASSWORD" , self .password )
56
60
# Enable health checks
57
61
# see: https://www.keycloak.org/server/health#_relevant_options
58
62
self .with_env ("KC_HEALTH_ENABLED" , "true" )
59
- # Starting Keycloak in development mode
63
+ # Start Keycloak in development mode
60
64
# see: https://www.keycloak.org/server/configuration#_starting_keycloak_in_development_mode
61
- self .with_command (_DEFAULT_DEV_COMMAND )
65
+ if self .has_realm_imports :
66
+ self .cmd += " --import-realm"
67
+ self .with_command (self .cmd )
62
68
63
69
def get_url (self ) -> str :
64
70
host = self .get_container_host_ip ()
@@ -67,10 +73,10 @@ def get_url(self) -> str:
67
73
68
74
@wait_container_is_ready (requests .exceptions .ConnectionError , requests .exceptions .ReadTimeout )
69
75
def _readiness_probe (self ) -> None :
70
- # Keycloak provides an REST API endpoints for health checks: https://www.keycloak.org/server/health
76
+ # Keycloak provides REST API endpoints for health checks: https://www.keycloak.org/server/health
71
77
response = requests .get (f"{ self .get_url ()} /health/ready" , timeout = 1 )
72
78
response .raise_for_status ()
73
- if self ._command == _DEFAULT_DEV_COMMAND :
79
+ if _DEFAULT_DEV_COMMAND in self ._command :
74
80
wait_for_logs (self , "Added user .* to realm .*" )
75
81
76
82
def start (self ) -> "KeycloakContainer" :
@@ -79,6 +85,22 @@ def start(self) -> "KeycloakContainer":
79
85
self ._readiness_probe ()
80
86
return self
81
87
88
+ def with_realm_import_file (self , realm_import_file : str ) -> "KeycloakContainer" :
89
+ file = os .path .abspath (realm_import_file )
90
+ if not os .path .exists (file ):
91
+ raise FileNotFoundError (f"Realm file { file } does not exist" )
92
+ self .with_volume_mapping (file , "/opt/keycloak/data/import/realm.json" )
93
+ self .has_realm_imports = True
94
+ return self
95
+
96
+ def with_realm_import_folder (self , realm_import_folder : str ) -> "KeycloakContainer" :
97
+ folder = os .path .abspath (realm_import_folder )
98
+ if not os .path .exists (folder ):
99
+ raise FileNotFoundError (f"Realm folder { folder } does not exist" )
100
+ self .with_volume_mapping (folder , "/opt/keycloak/data/import/" )
101
+ self .has_realm_imports = True
102
+ return self
103
+
82
104
def get_client (self , ** kwargs ) -> KeycloakAdmin :
83
105
default_kwargs = {
84
106
"server_url" : self .get_url (),
0 commit comments