3
from twisted.internet.defer import Deferred
5
from landscape.lib.persist import Persist
7
from landscape.package.reporter import find_reporter_command
8
from landscape.package.store import PackageStore
10
from landscape.monitor.packagemonitor import PackageMonitor
11
from landscape.monitor.monitor import MonitorPluginRegistry
12
from landscape.tests.helpers import (
13
LandscapeIsolatedTest, RemoteBrokerHelper, EnvironSaverHelper)
16
class PackageMonitorTest(LandscapeIsolatedTest):
17
"""Tests for the temperature plugin."""
19
helpers = [RemoteBrokerHelper, EnvironSaverHelper]
22
"""Initialize test helpers and create a sample thermal zone."""
23
super(PackageMonitorTest, self).setUp()
24
self.monitor = MonitorPluginRegistry(self.broker_service.reactor,
26
self.broker_service.config,
27
Persist(), self.makeFile())
29
self.package_store_filename = self.makeFile()
30
self.package_store = PackageStore(self.package_store_filename)
32
self.package_monitor = PackageMonitor(self.package_store_filename)
34
def test_create_default_store_on_registration(self):
35
filename = os.path.join(self.broker_service.config.data_path,
37
package_monitor = PackageMonitor()
39
self.assertFalse(os.path.isfile(filename))
40
self.monitor.add(package_monitor)
41
self.assertTrue(os.path.isfile(filename))
43
def test_dont_spawn_reporter_if_message_not_accepted(self):
44
self.monitor.add(self.package_monitor)
46
package_monitor_mock = self.mocker.patch(self.package_monitor)
47
package_monitor_mock.spawn_reporter()
52
return self.package_monitor.run()
54
def test_spawn_reporter_on_registration_when_already_accepted(self):
55
package_monitor_mock = self.mocker.patch(self.package_monitor)
56
package_monitor_mock.spawn_reporter()
58
# Slightly tricky as we have to wait for the result of run(),
59
# but we don't have its deferred yet. To handle it, we create
60
# our own deferred, and register a callback for when run()
61
# returns, chaining both deferreds at that point.
63
def run_has_run(run_result_deferred):
64
return run_result_deferred.chainDeferred(deferred)
66
package_monitor_mock.run()
67
self.mocker.passthrough(run_has_run)
71
self.broker_service.message_store.set_accepted_types(["packages"])
72
self.monitor.add(self.package_monitor)
76
def test_spawn_reporter_on_run_if_message_accepted(self):
77
self.monitor.add(self.package_monitor)
79
self.broker_service.message_store.set_accepted_types(["packages"])
81
package_monitor_mock = self.mocker.patch(self.package_monitor)
82
package_monitor_mock.spawn_reporter()
83
self.mocker.count(2) # Once for registration, then again explicitly.
87
return self.package_monitor.run()
89
def test_package_ids_handling(self):
90
self.monitor.add(self.package_monitor)
92
package_monitor_mock = self.mocker.patch(self.package_monitor)
93
package_monitor_mock.spawn_reporter()
96
message = {"type": "package-ids", "ids": [None], "request-id": 1}
97
self.monitor.dispatch_message(message)
98
task = self.package_store.get_next_task("reporter")
100
self.assertEquals(task.data, message)
102
def test_spawn_reporter(self):
103
command = self.makeFile("#!/bin/sh\necho 'I am the reporter!' >&2\n")
104
os.chmod(command, 0755)
105
find_command_mock = self.mocker.replace(find_reporter_command)
107
self.mocker.result(command)
110
package_monitor = PackageMonitor(self.package_store_filename)
111
self.monitor.add(package_monitor)
112
result = package_monitor.spawn_reporter()
114
def got_result(result):
115
log = self.logfile.getvalue()
116
self.assertIn("I am the reporter!", log)
117
self.assertNotIn(command, log)
119
return result.addCallback(got_result)
121
def test_spawn_reporter_without_output(self):
122
find_command_mock = self.mocker.replace(find_reporter_command)
124
self.mocker.result("/bin/true")
127
package_monitor = PackageMonitor(self.package_store_filename)
128
self.monitor.add(package_monitor)
129
result = package_monitor.spawn_reporter()
131
def got_result(result):
132
log = self.logfile.getvalue()
133
self.assertNotIn("reporter output", log)
135
return result.addCallback(got_result)
137
def test_spawn_reporter_copies_environment(self):
138
command = self.makeFile("#!/bin/sh\necho VAR: $VAR\n")
139
os.chmod(command, 0755)
140
find_command_mock = self.mocker.replace(find_reporter_command)
142
self.mocker.result(command)
145
package_monitor = PackageMonitor(self.package_store_filename)
146
self.monitor.add(package_monitor)
148
os.environ["VAR"] = "HI!"
150
result = package_monitor.spawn_reporter()
152
def got_result(result):
153
log = self.logfile.getvalue()
154
self.assertIn("VAR: HI!", log)
155
self.assertNotIn(command, log)
157
return result.addCallback(got_result)
159
def test_spawn_reporter_passes_quiet_option(self):
160
command = self.makeFile("#!/bin/sh\necho OPTIONS: $@\n")
161
os.chmod(command, 0755)
162
find_command_mock = self.mocker.replace(find_reporter_command)
164
self.mocker.result(command)
167
package_monitor = PackageMonitor(self.package_store_filename)
168
self.monitor.add(package_monitor)
170
result = package_monitor.spawn_reporter()
172
def got_result(result):
173
log = self.logfile.getvalue()
174
self.assertIn("OPTIONS: --quiet", log)
175
self.assertNotIn(command, log)
177
return result.addCallback(got_result)
179
def test_call_on_accepted(self):
180
package_monitor_mock = self.mocker.patch(self.package_monitor)
181
package_monitor_mock.spawn_reporter()
185
self.monitor.add(self.package_monitor)
186
self.monitor.reactor.fire(
187
("message-type-acceptance-changed", "packages"), True)
189
def test_resynchronize(self):
191
If a 'resynchronize' reactor event is fired, the package
192
monitor should clear all queued tasks and queue a task that
193
tells the report to clear out the rest of the package data.
195
self.monitor.add(self.package_monitor)
196
message = {"type": "package-ids", "ids": [None], "request-id": 1}
197
self.package_store.add_task("reporter", message)
199
self.broker_service.reactor.fire("resynchronize")
201
# The next task should be the resynchronize message.
202
task = self.package_store.get_next_task("reporter")
203
self.assertEquals(task.data, {"type" : "resynchronize"})
205
# We want to make sure it has the correct id of 2 so that we
206
# know it's not a new task that the reporter could possibly
207
# remove by accident.
208
self.assertEquals(task.id, 2)
210
# Let's remove that task and make sure there are no more tasks
213
task = self.package_store.get_next_task("reporter")
214
self.assertEquals(task, None)
216
def test_spawn_reporter_doesnt_chdir(self):
217
command = self.makeFile("#!/bin/sh\necho RUN\n")
218
os.chmod(command, 0755)
219
dir = self.make_dir()
224
find_command_mock = self.mocker.replace(find_reporter_command)
226
self.mocker.result(command)
229
package_monitor = PackageMonitor(self.package_store_filename)
230
self.monitor.add(package_monitor)
232
result = package_monitor.spawn_reporter()
234
def got_result(result):
235
log = self.logfile.getvalue()
236
self.assertIn("RUN", log)
237
# restore permissions to the dir so tearDown can clean it up
240
return result.addCallback(got_result)