~ahasenack/landscape-client/landscape-client-11.02-0ubuntu0.8.04.1

« back to all changes in this revision

Viewing changes to landscape/monitor/tests/test_usermonitor.py

  • Committer: Andreas Hasenack
  • Date: 2011-05-05 14:12:15 UTC
  • Revision ID: andreas@canonical.com-20110505141215-5ymuyyh5es9pwa6p
Added hardy files.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import os
 
2
 
 
3
from twisted.internet.defer import fail
 
4
 
 
5
from landscape.monitor.usermonitor import (
 
6
    UserMonitor, RemoteUserMonitorConnector)
 
7
from landscape.manager.usermanager import (
 
8
    UserManager, UserManagerProtocolFactory)
 
9
from landscape.user.tests.helpers import FakeUserProvider
 
10
from landscape.tests.helpers import LandscapeTest, MonitorHelper
 
11
from landscape.tests.mocker import ANY
 
12
 
 
13
 
 
14
class UserMonitorNoManagerTest(LandscapeTest):
 
15
 
 
16
    helpers = [MonitorHelper]
 
17
 
 
18
    def test_no_fetch_users_in_monitor_only_mode(self):
 
19
        """
 
20
        If we're in monitor_only mode, then all users are assumed to be
 
21
        unlocked.
 
22
        """
 
23
        self.config.monitor_only = True
 
24
 
 
25
        def got_result(result):
 
26
            self.assertMessages(
 
27
                self.broker_service.message_store.get_pending_messages(),
 
28
                [{"create-group-members": {u"webdev":[u"jdoe"]},
 
29
                  "create-groups": [{"gid": 1000, "name": u"webdev"}],
 
30
                  "create-users": [{"enabled": True, "home-phone": None,
 
31
                                    "location": None, "name": u"JD",
 
32
                                    "primary-gid": 1000, "uid": 1000,
 
33
                                    "username": u"jdoe", "work-phone": None}],
 
34
                                    "type": "users"}])
 
35
            plugin.stop()
 
36
 
 
37
        users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh")]
 
38
        groups = [("webdev", "x", 1000, ["jdoe"])]
 
39
        provider = FakeUserProvider(users=users, groups=groups)
 
40
        plugin = UserMonitor(provider=provider)
 
41
        plugin.register(self.monitor)
 
42
        self.broker_service.message_store.set_accepted_types(["users"])
 
43
        result = plugin.run()
 
44
        result.addCallback(got_result)
 
45
        return result
 
46
 
 
47
 
 
48
class UserMonitorTest(LandscapeTest):
 
49
 
 
50
    helpers = [MonitorHelper]
 
51
 
 
52
    def setUp(self):
 
53
        super(UserMonitorTest, self).setUp()
 
54
        self.shadow_file = self.makeFile(
 
55
            "jdoe:$1$xFlQvTqe$cBtrNEDOIKMy/BuJoUdeG0:13348:0:99999:7:::\n"
 
56
            "psmith:!:13348:0:99999:7:::\n"
 
57
            "sam:$1$q7sz09uw$q.A3526M/SHu8vUb.Jo1A/:13349:0:99999:7:::\n")
 
58
        self.user_manager = UserManager(shadow_file=self.shadow_file)
 
59
        factory = UserManagerProtocolFactory(object=self.user_manager)
 
60
        socket = os.path.join(self.config.sockets_path,
 
61
                              UserManager.name + ".sock")
 
62
        self.port = self.reactor.listen_unix(socket, factory)
 
63
        self.provider = FakeUserProvider()
 
64
        self.plugin = UserMonitor(self.provider)
 
65
 
 
66
    def tearDown(self):
 
67
        self.port.stopListening()
 
68
        self.plugin.stop()
 
69
        return super(UserMonitorTest, self).tearDown()
 
70
 
 
71
    def test_constants(self):
 
72
        """
 
73
        L{UserMonitor.persist_name} and
 
74
        L{UserMonitor.run_interval} need to be present for
 
75
        L{Plugin} to work properly.
 
76
        """
 
77
        self.assertEquals(self.plugin.persist_name, "users")
 
78
        self.assertEquals(self.plugin.run_interval, 3600)
 
79
 
 
80
    def test_wb_resynchronize_event(self):
 
81
        """
 
82
        When a C{resynchronize} event occurs any cached L{UserChange}
 
83
        snapshots should be cleared and a new message with users generated.
 
84
        """
 
85
 
 
86
        def resynchronize_complete(result, plugin):
 
87
 
 
88
            def resynchronization_new_messages(result):
 
89
                self.assertMessages(
 
90
                    self.broker_service.message_store.get_pending_messages(),
 
91
                    [{"create-group-members": {u"webdev":[u"jdoe"]},
 
92
                      "create-groups": [{"gid": 1000, "name": u"webdev"}],
 
93
                      "create-users": [{"enabled": True, "home-phone": None,
 
94
                                        "location": None, "name": u"JD",
 
95
                                        "primary-gid": 1000, "uid": 1000,
 
96
                                        "username": u"jdoe",
 
97
                                        "work-phone": None}],
 
98
                                        "type": "users"}])
 
99
 
 
100
            persist = plugin._persist
 
101
            self.assertTrue(persist.get("users"))
 
102
            self.assertTrue(persist.get("groups"))
 
103
            self.assertMessages(
 
104
                self.broker_service.message_store.get_pending_messages(),
 
105
                [{"create-group-members": {u"webdev":[u"jdoe"]},
 
106
                  "create-groups": [{"gid": 1000, "name": u"webdev"}],
 
107
                  "create-users": [{"enabled": True, "home-phone": None,
 
108
                                    "location": None, "name": u"JD",
 
109
                                    "primary-gid": 1000, "uid": 1000,
 
110
                                    "username": u"jdoe", "work-phone": None}],
 
111
                                    "type": "users"}])
 
112
            # Clear all the messages from the message store
 
113
            self.broker_service.message_store.delete_all_messages()
 
114
            deferred = self.monitor.reactor.fire("resynchronize")[0]
 
115
            deferred.addCallback(resynchronization_new_messages)
 
116
            return deferred
 
117
 
 
118
        self.provider.users = [("jdoe", "x", 1000, 1000, "JD,,,,",
 
119
                                "/home/jdoe", "/bin/sh")]
 
120
        self.provider.groups = [("webdev", "x", 1000, ["jdoe"])]
 
121
        self.broker_service.message_store.set_accepted_types(["users"])
 
122
        self.monitor.add(self.plugin)
 
123
        deferred = self.plugin.run()
 
124
        deferred.addCallback(resynchronize_complete, self.plugin)
 
125
        return deferred
 
126
 
 
127
    def test_run(self):
 
128
        """
 
129
        The L{UserMonitor} should have message run which should enqueue a
 
130
        message with  a diff-like representation of changes since the last
 
131
        run.
 
132
        """
 
133
 
 
134
        def got_result(result):
 
135
            self.assertMessages(
 
136
                self.broker_service.message_store.get_pending_messages(),
 
137
                [{"create-group-members": {u"webdev":[u"jdoe"]},
 
138
                  "create-groups": [{"gid": 1000, "name": u"webdev"}],
 
139
                  "create-users": [{"enabled": True, "home-phone": None,
 
140
                                    "location": None, "name": u"JD",
 
141
                                    "primary-gid": 1000, "uid": 1000,
 
142
                                    "username": u"jdoe", "work-phone": None}],
 
143
                                    "type": "users"}])
 
144
 
 
145
        self.provider.users = [("jdoe", "x", 1000, 1000, "JD,,,,",
 
146
                                "/home/jdoe", "/bin/sh")]
 
147
        self.provider.groups = [("webdev", "x", 1000, ["jdoe"])]
 
148
        self.broker_service.message_store.set_accepted_types(["users"])
 
149
        self.monitor.add(self.plugin)
 
150
        result = self.plugin.run()
 
151
        result.addCallback(got_result)
 
152
        return result
 
153
 
 
154
    def test_run_interval(self):
 
155
        """
 
156
        L{UserMonitor.register} calls the C{register} method on it's
 
157
        super class, which sets up a looping call to run the plugin
 
158
        every L{UserMonitor.run_interval} seconds.
 
159
        """
 
160
        self.plugin.run = self.mocker.mock()
 
161
        self.expect(self.plugin.run()).count(5)
 
162
        self.mocker.replay()
 
163
        self.monitor.add(self.plugin)
 
164
 
 
165
        self.broker_service.message_store.set_accepted_types(["users"])
 
166
        self.reactor.advance(self.plugin.run_interval * 5)
 
167
 
 
168
    def test_run_with_operation_id(self):
 
169
        """
 
170
        The L{UserMonitor} should have message run which should enqueue a
 
171
        message with  a diff-like representation of changes since the last
 
172
        run.
 
173
        """
 
174
 
 
175
        def got_result(result):
 
176
            self.assertMessages(
 
177
                self.broker_service.message_store.get_pending_messages(),
 
178
                [{"create-group-members": {u"webdev":[u"jdoe"]},
 
179
                  "create-groups": [{"gid": 1000, "name": u"webdev"}],
 
180
                  "create-users": [{"enabled": True, "home-phone": None,
 
181
                                    "location": None, "name": u"JD",
 
182
                                    "primary-gid": 1000, "uid": 1000,
 
183
                                    "username": u"jdoe", "work-phone": None}],
 
184
                                    "operation-id": 1001,
 
185
                                    "type": "users"}])
 
186
 
 
187
 
 
188
        self.provider.users = [("jdoe", "x", 1000, 1000, "JD,,,,",
 
189
                                "/home/jdoe", "/bin/sh")]
 
190
        self.provider.groups = [("webdev", "x", 1000, ["jdoe"])]
 
191
        self.monitor.add(self.plugin)
 
192
        self.broker_service.message_store.set_accepted_types(["users"])
 
193
        result = self.plugin.run(1001)
 
194
        result.addCallback(got_result)
 
195
        return result
 
196
 
 
197
    def test_detect_changes(self):
 
198
 
 
199
        def got_result(result):
 
200
            self.assertMessages(
 
201
                self.broker_service.message_store.get_pending_messages(),
 
202
                [{"create-group-members": {u"webdev":[u"jdoe"]},
 
203
                  "create-groups": [{"gid": 1000, "name": u"webdev"}],
 
204
                  "create-users": [{"enabled": True, "home-phone": None,
 
205
                                    "location": None, "name": u"JD",
 
206
                                    "primary-gid": 1000, "uid": 1000,
 
207
                  "username": u"jdoe", "work-phone": None}],
 
208
                  "type": "users"}])
 
209
 
 
210
        self.broker_service.message_store.set_accepted_types(["users"])
 
211
        self.provider.users = [("jdoe", "x", 1000, 1000, "JD,,,,",
 
212
                                "/home/jdoe", "/bin/sh")]
 
213
        self.provider.groups = [("webdev", "x", 1000, ["jdoe"])]
 
214
 
 
215
        self.monitor.add(self.plugin)
 
216
        connector = RemoteUserMonitorConnector(self.reactor, self.config)
 
217
        result = connector.connect()
 
218
        result.addCallback(lambda remote: remote.detect_changes())
 
219
        result.addCallback(got_result)
 
220
        result.addCallback(lambda x: connector.disconnect())
 
221
        return result
 
222
 
 
223
    def test_detect_changes_with_operation_id(self):
 
224
        """
 
225
        The L{UserMonitor} should expose a remote
 
226
        C{remote_run} method which should call the remote
 
227
        """
 
228
 
 
229
        def got_result(result):
 
230
            self.assertMessages(
 
231
                self.broker_service.message_store.get_pending_messages(),
 
232
                [{"create-group-members": {u"webdev":[u"jdoe"]},
 
233
                  "create-groups": [{"gid": 1000, "name": u"webdev"}],
 
234
                  "create-users": [{"enabled": True, "home-phone": None,
 
235
                                    "location": None, "name": u"JD",
 
236
                                    "primary-gid": 1000, "uid": 1000,
 
237
                                    "username": u"jdoe", "work-phone": None}],
 
238
                  "operation-id": 1001,
 
239
                  "type": "users"}])
 
240
 
 
241
        self.broker_service.message_store.set_accepted_types(["users"])
 
242
        self.provider.users = [("jdoe", "x", 1000, 1000, "JD,,,,",
 
243
                                "/home/jdoe", "/bin/sh")]
 
244
        self.provider.groups = [("webdev", "x", 1000, ["jdoe"])]
 
245
        self.monitor.add(self.plugin)
 
246
        connector = RemoteUserMonitorConnector(self.reactor, self.config)
 
247
        result = connector.connect()
 
248
        result.addCallback(lambda remote: remote.detect_changes(1001))
 
249
        result.addCallback(got_result)
 
250
        result.addCallback(lambda x: connector.disconnect())
 
251
        return result
 
252
 
 
253
    def test_no_message_if_not_accepted(self):
 
254
        """
 
255
        Don't add any messages at all if the broker isn't currently
 
256
        accepting their type.
 
257
        """
 
258
 
 
259
        def got_result(result):
 
260
            mstore = self.broker_service.message_store
 
261
            self.assertMessages(list(mstore.get_pending_messages()), [])
 
262
            mstore.set_accepted_types(["users"])
 
263
            self.assertMessages(list(mstore.get_pending_messages()), [])
 
264
 
 
265
        self.broker_service.message_store.set_accepted_types([])
 
266
        self.provider.users = [("jdoe", "x", 1000, 1000, "JD,,,,",
 
267
                                "/home/jdoe", "/bin/sh")]
 
268
        self.provider.groups = [("webdev", "x", 1000, ["jdoe"])]
 
269
        self.monitor.add(self.plugin)
 
270
        connector = RemoteUserMonitorConnector(self.reactor, self.config)
 
271
        result = connector.connect()
 
272
        result.addCallback(lambda remote: remote.detect_changes(1001))
 
273
        result.addCallback(got_result)
 
274
        result.addCallback(lambda x: connector.disconnect())
 
275
        return result
 
276
 
 
277
    def test_call_on_accepted(self):
 
278
 
 
279
        def got_result(result):
 
280
            mstore = self.broker_service.message_store
 
281
            self.assertMessages(mstore.get_pending_messages(),
 
282
                [{"create-group-members": {u"webdev":[u"jdoe"]},
 
283
                  "create-groups": [{"gid": 1000, "name": u"webdev"}],
 
284
                  "create-users": [{"enabled": True, "home-phone": None,
 
285
                                    "location": None, "name": u"JD",
 
286
                                    "primary-gid": 1000, "uid": 1000,
 
287
                                    "username": u"jdoe", "work-phone": None}],
 
288
                  "type": "users"}])
 
289
 
 
290
        self.provider.users = [("jdoe", "x", 1000, 1000, "JD,,,,",
 
291
                                "/home/jdoe", "/bin/sh")]
 
292
        self.provider.groups = [("webdev", "x", 1000, ["jdoe"])]
 
293
        self.monitor.add(self.plugin)
 
294
 
 
295
        self.broker_service.message_store.set_accepted_types(["users"])
 
296
        result = self.reactor.fire(
 
297
            ("message-type-acceptance-changed", "users"), True)
 
298
        result = [x for x in result if x][0]
 
299
        result.addCallback(got_result)
 
300
        return result
 
301
 
 
302
    def test_do_not_persist_changes_when_send_message_fails(self):
 
303
        """
 
304
        When the plugin is run it persists data that it uses on
 
305
        subsequent checks to calculate the delta to send.  It should
 
306
        only persist data when the broker confirms that the message
 
307
        sent by the plugin has been sent.
 
308
        """
 
309
        self.log_helper.ignore_errors(RuntimeError)
 
310
 
 
311
        def got_result(result):
 
312
            persist = self.plugin._persist
 
313
            mstore = self.broker_service.message_store
 
314
            self.assertMessages(mstore.get_pending_messages(), [])
 
315
            self.assertFalse(persist.get("users"))
 
316
            self.assertFalse(persist.get("groups"))
 
317
 
 
318
        self.broker_service.message_store.set_accepted_types(["users"])
 
319
        self.monitor.broker.send_message = self.mocker.mock()
 
320
        self.monitor.broker.send_message(ANY, urgent=True)
 
321
        self.mocker.result(fail(RuntimeError()))
 
322
        self.mocker.replay()
 
323
 
 
324
        self.provider.users = [("jdoe", "x", 1000, 1000, "JD,,,,",
 
325
                       "/home/jdoe", "/bin/sh")]
 
326
        self.provider.groups = [("webdev", "x", 1000, ["jdoe"])]
 
327
        self.monitor.add(self.plugin)
 
328
        connector = RemoteUserMonitorConnector(self.reactor, self.config)
 
329
        result = connector.connect()
 
330
        result.addCallback(lambda remote: remote.detect_changes(1001))
 
331
        result.addCallback(got_result)
 
332
        result.addCallback(lambda x: connector.disconnect())
 
333
        return result