2323
2424
2525class KeycloakContainer (DockerContainer ):
26+ has_realm_imports = False
27+
2628 """
2729 Keycloak container.
2830
@@ -43,22 +45,26 @@ def __init__(
4345 username : Optional [str ] = None ,
4446 password : Optional [str ] = None ,
4547 port : int = 8080 ,
48+ cmd : Optional [str ] = _DEFAULT_DEV_COMMAND ,
4649 ) -> None :
4750 super ().__init__ (image = image )
4851 self .username = username or os .environ .get ("KEYCLOAK_ADMIN" , "test" )
4952 self .password = password or os .environ .get ("KEYCLOAK_ADMIN_PASSWORD" , "test" )
5053 self .port = port
5154 self .with_exposed_ports (self .port )
55+ self .cmd = cmd
5256
5357 def _configure (self ) -> None :
5458 self .with_env ("KEYCLOAK_ADMIN" , self .username )
5559 self .with_env ("KEYCLOAK_ADMIN_PASSWORD" , self .password )
5660 # Enable health checks
5761 # see: https://www.keycloak.org/server/health#_relevant_options
5862 self .with_env ("KC_HEALTH_ENABLED" , "true" )
59- # Starting Keycloak in development mode
63+ # Start Keycloak in development mode
6064 # 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 )
6268
6369 def get_url (self ) -> str :
6470 host = self .get_container_host_ip ()
@@ -67,10 +73,10 @@ def get_url(self) -> str:
6773
6874 @wait_container_is_ready (requests .exceptions .ConnectionError , requests .exceptions .ReadTimeout )
6975 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
7177 response = requests .get (f"{ self .get_url ()} /health/ready" , timeout = 1 )
7278 response .raise_for_status ()
73- if self ._command == _DEFAULT_DEV_COMMAND :
79+ if _DEFAULT_DEV_COMMAND in self ._command :
7480 wait_for_logs (self , "Added user .* to realm .*" )
7581
7682 def start (self ) -> "KeycloakContainer" :
@@ -79,6 +85,22 @@ def start(self) -> "KeycloakContainer":
7985 self ._readiness_probe ()
8086 return self
8187
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+
82104 def get_client (self , ** kwargs ) -> KeycloakAdmin :
83105 default_kwargs = {
84106 "server_url" : self .get_url (),
0 commit comments