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 ()}  , 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 }  )
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 }  )
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