Skip to content

Commit 1f8bf38

Browse files
Add IPA IPA Trust Topology Controller
Add "IPATrustIPA" KnownTopology For topology groups some changes are: - Remove "IPATrust" - Add "IPATrustAD" -- includes IPATrustAD and IPATrustSamba - Add "AnyIPATrust" -- includes IPATrustAD, IPATrustSamba, IPATrustIPA
1 parent 9eb8d00 commit 1f8bf38

File tree

5 files changed

+112
-2
lines changed

5 files changed

+112
-2
lines changed

sssd_test_framework/roles/ad.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,13 @@ def fqn(self, name: str) -> str:
138138
"""
139139
return f"{name}@{self.domain}"
140140

141+
@property
142+
def admin_fqn(self) -> str:
143+
"""
144+
Return fully qualified administrator name in form name@domain.
145+
"""
146+
return f"administrator@{self.domain}"
147+
141148
def user(self, name: str, basedn: ADObject | str | None = "cn=users") -> ADUser:
142149
"""
143150
Get user object.

sssd_test_framework/roles/ipa.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,19 @@ def setup(self) -> None:
137137
super().setup()
138138
self.host.kinit()
139139

140+
def fqn(self, name: str) -> str:
141+
"""
142+
Return fully qualified name in form name@domain.
143+
"""
144+
return f"{name}@{self.domain}"
145+
146+
@property
147+
def admin_fqn(self) -> str:
148+
"""
149+
Return fully qualified admin name in form name@domain.
150+
"""
151+
return f"admin@{self.domain}"
152+
140153
def user(self, name: str) -> IPAUser:
141154
"""
142155
Get user object.

sssd_test_framework/roles/samba.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,13 @@ def fqn(self, name: str) -> str:
134134
"""
135135
return f"{name}@{self.domain}"
136136

137+
@property
138+
def admin_fqn(self) -> str:
139+
"""
140+
Return fully qualified administrator name in form name@domain.
141+
"""
142+
return f"administrator@{self.domain}"
143+
137144
def user(self, name: str) -> SambaUser:
138145
"""
139146
Get user object.

sssd_test_framework/topology.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
ClientTopologyController,
1414
IPATopologyController,
1515
IPATrustADTopologyController,
16+
IPATrustIPATopologyController,
1617
IPATrustSambaTopologyController,
1718
LDAPTopologyController,
1819
SambaTopologyController,
@@ -118,6 +119,17 @@ def test_ldap(client: Client, ldap: LDAP):
118119
.. topology-mark:: KnownTopology.IPATrustSamba
119120
"""
120121

122+
IPATrustIPA = SSSDTopologyMark(
123+
name="ipa-trust-ipa",
124+
topology=Topology(TopologyDomain("sssd", client=1, ipa=1), TopologyDomain("ipa2", ipa=1)),
125+
controller=IPATrustIPATopologyController(),
126+
domains=dict(test="sssd.ipa[0]"),
127+
fixtures=dict(client="sssd.client[0]", ipa="sssd.ipa[0]", trusted="ipa2.ipa[0]"),
128+
)
129+
"""
130+
.. topology-mark:: KnownTopology.IPATrustIPA
131+
"""
132+
121133

122134
class KnownTopologyGroup(KnownTopologyGroupBase):
123135
"""
@@ -145,7 +157,12 @@ def test_ldap(client: Client, provider: GenericProvider):
145157
.. topology-mark:: KnownTopologyGroup.AnyAD
146158
"""
147159

148-
IPATrust = [KnownTopology.IPATrustAD, KnownTopology.IPATrustSamba]
160+
IPATrustAD = [KnownTopology.IPATrustAD, KnownTopology.IPATrustSamba]
161+
"""
162+
.. topology-mark:: KnownTopologyGroup.IPATrustAD
163+
"""
164+
165+
AnyIPATrust = [KnownTopology.IPATrustAD, KnownTopology.IPATrustSamba, KnownTopology.IPATrustIPA]
149166
"""
150-
.. topology-mark:: KnownTopologyGroup.IPATrust
167+
.. topology-mark:: KnownTopologyGroup.AnyIPATrust
151168
"""

sssd_test_framework/topology_controllers.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"SambaTopologyController",
1818
"IPATrustADTopologyController",
1919
"IPATrustSambaTopologyController",
20+
"IPATrustIPATopologyController",
2021
]
2122

2223

@@ -173,3 +174,68 @@ class IPATrustSambaTopologyController(IPATrustADTopologyController):
173174
"""
174175

175176
pass
177+
178+
179+
class IPATrustIPATopologyController(ProvisionedBackupTopologyController):
180+
"""
181+
IPA trust IPA Topology Controller.
182+
"""
183+
184+
@BackupTopologyController.restore_vanilla_on_error
185+
def topology_setup(self, client: ClientHost, ipa: IPAHost, trusted: IPAHost) -> None:
186+
if self.provisioned:
187+
self.logger.info(f"Topology '{self.name}' is already provisioned")
188+
return
189+
190+
# Add ipa-ipa trust COPR and update packages
191+
self.logger.info("Adding COPR and updating packages")
192+
ipa.conn.exec(["dnf", "copr", "enable", "abbra/wip-ipa-trust", "-y"])
193+
client.conn.exec(["dnf", "copr", "enable", "abbra/wip-ipa-trust", "-y"])
194+
trusted.conn.exec(["dnf", "copr", "enable", "abbra/wip-ipa-trust", "-y"])
195+
196+
ipa.conn.exec(["dnf", "update", "freeipa-server", "sssd-client", "-y"])
197+
trusted.conn.exec(["dnf", "update", "freeipa-server", "sssd-client", "-y"])
198+
client.conn.exec(["dnf", "update", "sssd-client", "-y"])
199+
200+
# F40 sssd-kcm fails to start with 'Invalid option --genconf-section=kcm:'
201+
ipa.conn.exec(["systemctl", "restart", "sssd-kcm"])
202+
trusted.conn.exec(["systemctl", "restart", "sssd-kcm"])
203+
204+
# Create trust
205+
self.logger.info(f"Establishing trust between {ipa.domain} and {trusted.domain}")
206+
207+
ipa.kinit()
208+
ipa.conn.exec(
209+
[
210+
"ipa",
211+
"trust-add",
212+
trusted.domain,
213+
"--admin",
214+
"admin",
215+
"--password",
216+
"--range-type=ipa-ad-trust-posix",
217+
"--type=ipa",
218+
"--two-way=true",
219+
],
220+
input=trusted.adminpw,
221+
)
222+
223+
# Do not enroll client into IPA domain if it is already joined
224+
if "ipa" not in self.multihost.provisioned_topologies:
225+
self.logger.info(f"Enrolling {client.hostname} into {ipa.domain}")
226+
227+
# Remove any existing Kerberos configuration and keytab
228+
client.fs.rm("/etc/krb5.conf")
229+
client.fs.rm("/etc/krb5.keytab")
230+
231+
# Backup ipa-client-install files
232+
client.fs.backup("/etc/ipa")
233+
client.fs.backup("/var/lib/ipa-client")
234+
235+
# Join IPA domain)
236+
client.conn.exec(["realm", "join", ipa.domain], input=ipa.adminpw)
237+
238+
# Backup so we can restore to this state after each test
239+
self.backup_data[ipa] = ipa.backup()
240+
self.backup_data[trusted] = trusted.backup()
241+
self.backup_data[client] = client.backup()

0 commit comments

Comments
 (0)