1
from landscape.lib.persist import Persist
2
from landscape.user.changes import UserChanges
3
from landscape.user.tests.helpers import FakeUserInfo, FakeUserProvider
5
from landscape.tests.helpers import (LandscapeTest, MonitorHelper,
9
class UserChangesTest(LandscapeTest):
11
helpers = [MonitorHelper, MakePathHelper]
14
super(UserChangesTest, self).setUp()
15
self.persist = Persist()
16
self.shadow_file = self.make_path("""\
17
jdoe:$1$xFlQvTqe$cBtrNEDOIKMy/BuJoUdeG0:13348:0:99999:7:::
18
psmith:!:13348:0:99999:7:::
19
sbarnes:$1$q7sz09uw$q.A3526M/SHu8vUb.Jo1A/:13349:0:99999:7:::
22
def test_no_existing_snapshot(self):
24
The diff created by L{UserChanges.create_diff} contains data
25
for all users and groups if an existing snapshot isn't
28
users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh")]
29
groups = [("webdev", "x", 1000, ["jdoe"])]
30
provider = FakeUserProvider(users=users, groups=groups)
31
userinfo = FakeUserInfo(provider=provider)
33
changes = UserChanges(self.persist, provider)
34
self.assertEquals(changes.create_diff(),
35
{"create-users": [{"username": "jdoe",
42
"primary-gid": 1000}],
43
"create-groups": [{"gid": 1000, "name": "webdev"}],
44
"create-group-members": {"webdev": ["jdoe"]}})
46
def test_snapshot(self):
48
When a snapshot is taken it should persist beyond instance
49
invocations and be used as the baseline in
50
L{UserChanges.create_diff} until another snapshot is taken.
52
users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh")]
53
groups = [("webdev", "x", 1000, ["jdoe"])]
54
provider = FakeUserProvider(users=users, groups=groups)
55
userinfo = FakeUserInfo(provider=provider)
57
changes1 = UserChanges(self.persist, provider)
58
self.assertTrue(changes1.create_diff())
60
changes2 = UserChanges(self.persist, provider)
61
self.assertFalse(changes2.create_diff())
63
def test_snapshot_before_diff(self):
65
A valid snapshot should be created if L{UserChanges.snapshot}
66
is called before L{UserChanges.create_diff}. When
67
L{UserChanges.create_diff} is called it shouln't report any
70
users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh")]
71
groups = [("webdev", "x", 1000, ["jdoe"])]
72
provider = FakeUserProvider(users=users, groups=groups)
73
userinfo = FakeUserInfo(provider=provider)
74
changes = UserChanges(self.persist, provider)
76
self.assertFalse(changes.create_diff())
80
L{UserChanges.clear} removes a snapshot, if present, returning
81
the object to a pristine state.
83
users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh")]
84
groups = [("webdev", "x", 1000, ["jdoe"])]
85
provider = FakeUserProvider(users=users, groups=groups)
86
userinfo = FakeUserInfo(provider=provider)
88
changes = UserChanges(self.persist, provider)
89
self.assertTrue(changes.create_diff())
91
self.assertFalse(changes.create_diff())
93
self.assertTrue(changes.create_diff())
95
def test_create_diff_without_changes(self):
97
L{UserChanges.create_diff} should return an empty C{dict} if
98
users and groups are unchanged since the last snapshot.
100
users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh")]
101
provider = FakeUserProvider(users=users)
102
userinfo = FakeUserInfo(provider=provider)
104
changes = UserChanges(self.persist, provider)
105
changes.create_diff()
107
self.assertEquals(changes.create_diff(), {})
109
def test_add_user(self):
111
L{UserChanges.create_diff} should report new users created
112
externally with C{adduser} or similar tools.
114
users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh")]
115
provider = FakeUserProvider(users=users)
116
userinfo = FakeUserInfo(provider=provider)
118
changes = UserChanges(self.persist, provider)
119
changes.create_diff()
121
users.append(("bo", "x", 1001, 1001, "Bo,,,,", "/home/bo", "/bin/sh"))
122
self.assertEquals(changes.create_diff(),
123
{"create-users": [{"username": "bo",
130
"primary-gid": 1001}]})
132
def test_update_user(self):
134
L{UserChanges.create_diff} should report users modified
135
externally with C{usermod} or similar tools.
137
users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh")]
138
provider = FakeUserProvider(users=users)
139
userinfo = FakeUserInfo(provider=provider)
140
changes = UserChanges(self.persist, provider)
141
changes.create_diff()
143
users[0] = ("jdoe", "x", 1000, 1001, "John Doe,Here,789WORK,321HOME",
144
"/home/john", "/bin/zsh")
145
self.assertEquals(changes.create_diff(),
146
{"update-users": [{"username": "jdoe",
147
"home-phone": u"321HOME",
151
"work-phone": "789WORK",
153
"primary-gid": 1001}]})
155
def test_delete_user(self):
157
L{UserChanges.create_diff} should report users removed
158
externally with C{deluser} or similar tools.
160
users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh"),
161
("bo", "x", 1001, 1001, "Bo,,,,", "/home/bo", "/bin/sh")]
162
provider = FakeUserProvider(users=users)
163
userinfo = FakeUserInfo(provider=provider)
165
changes = UserChanges(self.persist, provider)
166
changes.create_diff()
169
self.assertEquals(changes.create_diff(), {"delete-users": ["bo"]})
171
def test_add_group(self):
173
L{UserChanges.create_diff} should report new groups created
174
externally with C{addgroup} or similar tools.
176
users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh")]
177
groups = [("webdev", "x", 50, ["jdoe"])]
178
provider = FakeUserProvider(users=users, groups=groups)
179
userinfo = FakeUserInfo(provider=provider)
181
changes = UserChanges(self.persist, provider)
182
changes.create_diff()
184
groups.append(("bizdev", "x", 60, []))
185
self.assertEquals(changes.create_diff(),
186
{"create-groups": [{"gid": 60, "name": "bizdev"}]})
188
def test_add_group_with_members(self):
190
L{UserChanges.create_diff} should report new groups and new
191
members created externally with C{addgroup} or similar tools.
193
users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh")]
194
groups = [("webdev", "x", 50, ["jdoe"])]
195
provider = FakeUserProvider(users=users, groups=groups)
196
userinfo = FakeUserInfo(provider=provider)
198
changes = UserChanges(self.persist, provider)
199
changes.create_diff()
201
groups.append(("bizdev", "x", 60, ["jdoe"]))
202
self.assertEquals(changes.create_diff(),
203
{"create-groups": [{"gid": 60, "name": "bizdev"}],
204
"create-group-members": {"bizdev": ["jdoe"]}})
206
def test_update_group(self):
208
L{UserChanges.create_diff} should report groups modified
209
externally with C{groupmod} or similar tools.
211
groups = [("webdev", "x", 1000, [])]
212
provider = FakeUserProvider(groups=groups)
213
userinfo = FakeUserInfo(provider=provider)
215
changes = UserChanges(self.persist, provider)
216
changes.create_diff()
218
groups[0] = ("webdev", "x", 1001, [])
219
self.assertEquals(changes.create_diff(),
220
{"update-groups": [{"gid": 1001, "name": "webdev"}]})
222
def test_add_group_members(self):
224
L{UserChanges.create_diff} should report new members added to
225
groups externally with C{gpasswd} or similar tools.
227
users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh"),
228
("bo", "x", 1001, 1001, "Bo,,,,", "/home/bo", "/bin/sh")]
229
groups = [("webdev", "x", 50, ["jdoe"])]
230
provider = FakeUserProvider(users=users, groups=groups)
231
userinfo = FakeUserInfo(provider=provider)
233
changes = UserChanges(self.persist, provider)
234
changes.create_diff()
236
groups[0] = ("webdev", "x", 50, ["jdoe", "bo"])
237
self.assertEquals(changes.create_diff(),
238
{"create-group-members": {"webdev": ["bo"]}})
240
def test_delete_group_members(self):
242
L{UserChanges.create_diff} should report members removed from
243
groups externally with C{gpasswd} or similar tools.
245
users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh")]
246
groups = [("webdev", "x", 50, ["jdoe"])]
247
provider = FakeUserProvider(users=users, groups=groups)
248
userinfo = FakeUserInfo(provider=provider)
250
changes = UserChanges(self.persist, provider)
251
changes.create_diff()
253
groups[0] = ("webdev", "x", 50, [])
254
self.assertEquals(changes.create_diff(),
255
{"delete-group-members": {"webdev": ["jdoe"]}})
257
def test_delete_group(self):
259
L{UserChanges.create_diff} should report groups removed
260
externally with C{delgroup} or similar tools.
262
users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh")]
263
groups = [("webdev", "x", 50, ["jdoe"]), ("sales", "x", 60, [])]
264
provider = FakeUserProvider(users=users, groups=groups)
265
userinfo = FakeUserInfo(provider=provider)
267
changes = UserChanges(self.persist, provider)
268
changes.create_diff()
271
self.assertEquals(changes.create_diff(), {"delete-groups": ["sales"]})
273
def test_complex_changes(self):
275
L{UserChanges.create_diff} should be able to report multiple
276
kinds of changes at the same time.
278
users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh"),
279
("bo", "x", 1001, 1001, "Bo,,,,", "/home/bo", "/bin/sh")]
280
groups = [("webdev", "x", 50, ["jdoe"]),
281
("bizdev", "x", 60, ["bo"])]
282
provider = FakeUserProvider(users=users, groups=groups)
283
userinfo = FakeUserInfo(provider=provider)
284
changes = UserChanges(self.persist, provider)
285
changes.create_diff()
287
# We remove the group "webdev", and create a new group
288
# "developers", adding the user "bo" at the same time.
289
groups[0] = ("developers", "x", 50, ["bo"])
290
# Add a new group "sales" and a new group member, "bo"
291
groups.append(("sales", "x", 70, ["bo"]))
294
self.assertEquals(changes.create_diff(),
295
{"create-groups": [{"gid": 50, "name": "developers"},
296
{"gid": 70, "name": "sales"}],
297
"delete-users": ["jdoe"],
298
"delete-groups": ["webdev"],
299
"create-group-members": {"developers": ["bo"],