|
7 | 7 | from .hosts.ad import ADHost |
8 | 8 | from .hosts.client import ClientHost |
9 | 9 | from .hosts.ipa import IPAHost |
| 10 | +from .hosts.keycloak import KeycloakHost |
10 | 11 | from .hosts.samba import SambaHost |
11 | 12 | from .misc.ssh import retry_command |
12 | 13 |
|
|
17 | 18 | "SambaTopologyController", |
18 | 19 | "IPATrustADTopologyController", |
19 | 20 | "IPATrustSambaTopologyController", |
| 21 | + "KeycloakTopologyController", |
20 | 22 | ] |
21 | 23 |
|
22 | 24 |
|
@@ -173,3 +175,45 @@ class IPATrustSambaTopologyController(IPATrustADTopologyController): |
173 | 175 | """ |
174 | 176 |
|
175 | 177 | pass |
| 178 | + |
| 179 | + |
| 180 | +class KeycloakTopologyController(ProvisionedBackupTopologyController): |
| 181 | + """ |
| 182 | + Keycloak Topology Controller. |
| 183 | + """ |
| 184 | + |
| 185 | + @BackupTopologyController.restore_vanilla_on_error |
| 186 | + def topology_setup(self, client: ClientHost, keycloak: KeycloakHost) -> None: |
| 187 | + if self.provisioned: |
| 188 | + self.logger.info(f"Topology '{self.name}' is already provisioned") |
| 189 | + return |
| 190 | + |
| 191 | + self.logger.info(f"Enrolling {client.hostname} into {keycloak.hostname} by creating an IdP client") |
| 192 | + |
| 193 | + # Create an IdP client |
| 194 | + keycloak.kclogin() |
| 195 | + keycloak.conn.run( |
| 196 | + "/opt/keycloak/bin/kcadm.sh create clients -r master " |
| 197 | + '-b \'{"clientId": "myclient", "clientAuthenticatorType": "client-secret", ' |
| 198 | + '"secret": "ClientSecret123", "serviceAccountsEnabled": true, ' |
| 199 | + '"attributes": {"oauth2.device.authorization.grant.enabled": "true"}}\' ' |
| 200 | + ) |
| 201 | + keycloak.conn.run( |
| 202 | + "/opt/keycloak/bin/kcadm.sh add-roles -r master " |
| 203 | + "--cclientid account --rolename view-groups --uusername service-account-myclient" |
| 204 | + ) |
| 205 | + keycloak.conn.run( |
| 206 | + "/opt/keycloak/bin/kcadm.sh add-roles -r master " |
| 207 | + "--cclientid master-realm --rolename view-users --uusername service-account-myclient" |
| 208 | + ) |
| 209 | + keycloak.conn.run( |
| 210 | + "/opt/keycloak/bin/kcadm.sh add-roles -r master " |
| 211 | + "--cclientid master-realm --rolename query-users --uusername service-account-myclient" |
| 212 | + ) |
| 213 | + keycloak.conn.run( |
| 214 | + "/opt/keycloak/bin/kcadm.sh add-roles -r master " |
| 215 | + "--cclientid master-realm --rolename query-groups --uusername service-account-myclient" |
| 216 | + ) |
| 217 | + |
| 218 | + # Backup so we can restore to this state after each test |
| 219 | + super().topology_setup() |
0 commit comments