Skip to content

Commit f761b98

Browse files
authoredMay 11, 2024··
fix(keycloak): add realm imports (#565)
This PR adds an option to start a keycloak container with importing one or more realms. This mirrors a feature present in the java keycloak testcontainer.
1 parent 6c5d227 commit f761b98

File tree

1 file changed

+26
-4
lines changed

1 file changed

+26
-4
lines changed
 

‎modules/keycloak/testcontainers/keycloak/__init__.py

+26-4
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424

2525
class 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

Comments
 (0)
Please sign in to comment.