Merge lp:~fcorrea/landscape-client/retry-apt-update into lp:~landscape/landscape-client/trunk

Proposed by Fernando Correa Neto
Status: Merged
Approved by: Fernando Correa Neto
Approved revision: 815
Merged at revision: 808
Proposed branch: lp:~fcorrea/landscape-client/retry-apt-update
Merge into: lp:~landscape/landscape-client/trunk
Diff against target: 522 lines (+169/-66)
6 files modified
landscape/package/changer.py (+2/-1)
landscape/package/reporter.py (+40/-16)
landscape/package/taskhandler.py (+4/-2)
landscape/package/tests/test_releaseupgrader.py (+1/-1)
landscape/package/tests/test_reporter.py (+117/-43)
landscape/package/tests/test_taskhandler.py (+5/-3)
To merge this branch: bzr merge lp:~fcorrea/landscape-client/retry-apt-update
Reviewer Review Type Date Requested Status
Данило Шеган (community) Approve
Free Ekanayaka (community) Approve
Review via email: mp+245734@code.launchpad.net

Commit message

Change the package reporter so it retries running apt-get update when an error 100 is returned, pretty much in the same way the charm code does it.

Description of the change

This branch changes the package reporter so it retries running apt-get update when an error 100 is returned, pretty much in the same way the charm code does it.

To post a comment you must log in.
Revision history for this message
Free Ekanayaka (free.ekanayaka) wrote :

Looks basically good, just a few comments about testing and small factoring things.

review: Needs Fixing
808. By Fernando Correa Neto <email address hidden>

- change task handler code to accept a reactor.
- adjust tests to deal with it

809. By Fernando Correa Neto <email address hidden>

- adjust tests to advance the reactor manually

810. By Fernando Correa Neto <email address hidden>

- fix tests to comply with the new method signature
- simplify existing apt_update tests and so that it never messes with the real reactor

811. By Fernando Correa Neto <email address hidden>

- lint

812. By Fernando Correa Neto <email address hidden>

- do not gracefully bail. Log a warning instead

Revision history for this message
Fernando Correa Neto (fcorrea) wrote :

Thanks for the review Free.

I've addressed all points but one. See bellow.
Also, instead of faking the spawn_process call, I've decided to mock it as it ended up being cleaner.

Revision history for this message
Free Ekanayaka (free.ekanayaka) wrote :

Thanks Fernando, replied to the pending point and adding another one.

Revision history for this message
Free Ekanayaka (free.ekanayaka) :
813. By Fernando Correa Neto <email address hidden>

- address review comments

Revision history for this message
Fernando Correa Neto (fcorrea) wrote :

Thanks, Free.

All comments has been addressed.

Revision history for this message
Free Ekanayaka (free.ekanayaka) wrote :

Looks great thanks, one last small thing, see the comment. +1

review: Approve
Revision history for this message
Данило Шеган (danilo) wrote :

Looks good, two minor comments inline.

review: Approve
814. By Fernando Correa Neto <email address hidden>

- address review comments

815. By Fernando Correa Neto <email address hidden>

- revert accidental syntax error

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'landscape/package/changer.py'
--- landscape/package/changer.py 2013-07-16 13:15:03 +0000
+++ landscape/package/changer.py 2015-01-12 13:35:57 +0000
@@ -66,7 +66,8 @@
66 def __init__(self, store, facade, remote, config, process_factory=reactor,66 def __init__(self, store, facade, remote, config, process_factory=reactor,
67 landscape_reactor=None,67 landscape_reactor=None,
68 reboot_required_filename=REBOOT_REQUIRED_FILENAME):68 reboot_required_filename=REBOOT_REQUIRED_FILENAME):
69 super(PackageChanger, self).__init__(store, facade, remote, config)69 super(PackageChanger, self).__init__(
70 store, facade, remote, config, landscape_reactor)
70 self._process_factory = process_factory71 self._process_factory = process_factory
71 if landscape_reactor is None: # For testing purposes.72 if landscape_reactor is None: # For testing purposes.
72 from landscape.reactor import LandscapeReactor73 from landscape.reactor import LandscapeReactor
7374
=== modified file 'landscape/package/reporter.py'
--- landscape/package/reporter.py 2014-09-24 14:48:40 +0000
+++ landscape/package/reporter.py 2015-01-12 13:35:57 +0000
@@ -6,7 +6,8 @@
6import glob6import glob
7import apt_pkg7import apt_pkg
88
9from twisted.internet.defer import Deferred, succeed9from twisted.internet.defer import (
10 Deferred, succeed, inlineCallbacks, returnValue)
1011
11from landscape.lib.sequenceranges import sequence_to_ranges12from landscape.lib.sequenceranges import sequence_to_ranges
12from landscape.lib.twisted_util import gather_results, spawn_process13from landscape.lib.twisted_util import gather_results, spawn_process
@@ -21,6 +22,7 @@
2122
22HASH_ID_REQUEST_TIMEOUT = 720023HASH_ID_REQUEST_TIMEOUT = 7200
23MAX_UNKNOWN_HASHES_PER_REQUEST = 50024MAX_UNKNOWN_HASHES_PER_REQUEST = 500
25LOCK_RETRY_DELAYS = [0, 20, 40]
2426
2527
26class PackageReporterConfiguration(PackageTaskHandlerConfiguration):28class PackageReporterConfiguration(PackageTaskHandlerConfiguration):
@@ -192,8 +194,11 @@
192 last_update = os.stat(stamp).st_mtime194 last_update = os.stat(stamp).st_mtime
193 return (last_update + interval) < time.time()195 return (last_update + interval) < time.time()
194196
197 @inlineCallbacks
195 def run_apt_update(self):198 def run_apt_update(self):
196 """Run apt-update and log a warning in case of non-zero exit code.199 """
200 Check if an L{_apt_update} call must be performed looping over specific
201 delays so it can be retried.
197202
198 @return: a deferred returning (out, err, code)203 @return: a deferred returning (out, err, code)
199 """204 """
@@ -201,12 +206,15 @@
201 or self._apt_update_timeout_expired(206 or self._apt_update_timeout_expired(
202 self._config.apt_update_interval)):207 self._config.apt_update_interval)):
203208
204 result = spawn_process(self.apt_update_filename)209 accepted_apt_errors = (
210 "Problem renaming the file /var/cache/apt/srcpkgcache.bin",
211 "Problem renaming the file /var/cache/apt/pkgcache.bin")
205212
206 def callback((out, err, code)):213 for retry in range(len(LOCK_RETRY_DELAYS)):
207 accepted_apt_errors = (214 deferred = Deferred()
208 "Problem renaming the file /var/cache/apt/srcpkgcache.bin",215 self._reactor.call_later(
209 "Problem renaming the file /var/cache/apt/pkgcache.bin")216 LOCK_RETRY_DELAYS[retry], self._apt_update, deferred)
217 out, err, code = yield deferred
210218
211 touch_file(self._config.update_stamp_filename)219 touch_file(self._config.update_stamp_filename)
212 logging.debug(220 logging.debug(
@@ -214,11 +222,19 @@
214 self.apt_update_filename, code, out, err))222 self.apt_update_filename, code, out, err))
215223
216 if code != 0:224 if code != 0:
225 if code == 100:
226 if retry < len(LOCK_RETRY_DELAYS) - 1:
227 logging.warning(
228 "Could not acquire the apt lock. Retrying in"
229 " %s seconds." % LOCK_RETRY_DELAYS[retry + 1])
230 continue
231
217 logging.warning("'%s' exited with status %d (%s)" % (232 logging.warning("'%s' exited with status %d (%s)" % (
218 self.apt_update_filename, code, err))233 self.apt_update_filename, code, err))
219234
220 # Errors caused by missing cache files are acceptable, as235 # Errors caused by missing cache files are acceptable,
221 # they are not an issue for the lists update process.236 # as they are not an issue for the lists update
237 # process.
222 # These errors can happen if an 'apt-get clean' is run238 # These errors can happen if an 'apt-get clean' is run
223 # while 'apt-get update' is running.239 # while 'apt-get update' is running.
224 for message in accepted_apt_errors:240 for message in accepted_apt_errors:
@@ -232,17 +248,25 @@
232 (self.sources_list_filename,248 (self.sources_list_filename,
233 self.sources_list_directory))249 self.sources_list_directory))
234250
235 deferred = self._broker.call_if_accepted(251 yield self._broker.call_if_accepted(
236 "package-reporter-result", self.send_result, code, err)252 "package-reporter-result", self.send_result, code, err)
237 deferred.addCallback(lambda ignore: (out, err, code))253 yield returnValue((out, err, code))
238 return deferred
239
240 return result.addCallback(callback)
241
242 else:254 else:
243 logging.debug("'%s' didn't run, update interval has not passed" %255 logging.debug("'%s' didn't run, update interval has not passed" %
244 self.apt_update_filename)256 self.apt_update_filename)
245 return succeed(("", "", 0))257 yield returnValue(("", "", 0))
258
259 def _apt_update(self, deferred):
260 """
261 Run apt-update using the passed in deferred, which allows for callers
262 to inspect the result code.
263 """
264 result = spawn_process(self.apt_update_filename)
265
266 def callback((out, err, code), deferred):
267 return deferred.callback((out, err, code))
268
269 return result.addCallback(callback, deferred)
246270
247 def send_result(self, code, err):271 def send_result(self, code, err):
248 """272 """
249273
=== modified file 'landscape/package/taskhandler.py'
--- landscape/package/taskhandler.py 2013-05-21 08:37:08 +0000
+++ landscape/package/taskhandler.py 2015-01-12 13:35:57 +0000
@@ -97,13 +97,15 @@
97 # update-notifier-common package is installed.97 # update-notifier-common package is installed.
98 update_notifier_stamp = "/var/lib/apt/periodic/update-success-stamp"98 update_notifier_stamp = "/var/lib/apt/periodic/update-success-stamp"
9999
100 def __init__(self, package_store, package_facade, remote_broker, config):100 def __init__(self, package_store, package_facade, remote_broker, config,
101 reactor):
101 self._store = package_store102 self._store = package_store
102 self._facade = package_facade103 self._facade = package_facade
103 self._broker = remote_broker104 self._broker = remote_broker
104 self._config = config105 self._config = config
105 self._count = 0106 self._count = 0
106 self._session_id = None107 self._session_id = None
108 self._reactor = reactor
107109
108 def run(self):110 def run(self):
109 return self.handle_tasks()111 return self.handle_tasks()
@@ -295,7 +297,7 @@
295297
296 connector = RemoteBrokerConnector(reactor, config, retry_on_reconnect=True)298 connector = RemoteBrokerConnector(reactor, config, retry_on_reconnect=True)
297 remote = LazyRemoteBroker(connector)299 remote = LazyRemoteBroker(connector)
298 handler = cls(package_store, package_facade, remote, config)300 handler = cls(package_store, package_facade, remote, config, reactor)
299 result = Deferred()301 result = Deferred()
300 result.addCallback(lambda x: handler.run())302 result.addCallback(lambda x: handler.run())
301 result.addCallback(lambda x: finish())303 result.addCallback(lambda x: finish())
302304
=== modified file 'landscape/package/tests/test_releaseupgrader.py'
--- landscape/package/tests/test_releaseupgrader.py 2014-12-12 12:39:21 +0000
+++ landscape/package/tests/test_releaseupgrader.py 2015-01-12 13:35:57 +0000
@@ -42,7 +42,7 @@
42 os.mkdir(self.config.upgrade_tool_directory)42 os.mkdir(self.config.upgrade_tool_directory)
43 self.store = PackageStore(self.makeFile())43 self.store = PackageStore(self.makeFile())
44 self.upgrader = ReleaseUpgrader(self.store, None,44 self.upgrader = ReleaseUpgrader(self.store, None,
45 self.remote, self.config)45 self.remote, self.config, None)
46 service = self.broker_service46 service = self.broker_service
47 service.message_store.set_accepted_types(["operation-result"])47 service.message_store.set_accepted_types(["operation-result"])
4848
4949
=== modified file 'landscape/package/tests/test_reporter.py'
--- landscape/package/tests/test_reporter.py 2014-09-24 14:48:40 +0000
+++ landscape/package/tests/test_reporter.py 2015-01-12 13:35:57 +0000
@@ -23,6 +23,7 @@
23from landscape.tests.helpers import (23from landscape.tests.helpers import (
24 LandscapeTest, BrokerServiceHelper, EnvironSaverHelper)24 LandscapeTest, BrokerServiceHelper, EnvironSaverHelper)
25from landscape.tests.mocker import ANY25from landscape.tests.mocker import ANY
26from landscape.reactor import FakeReactor
2627
27SAMPLE_LSB_RELEASE = "DISTRIB_CODENAME=codename\n"28SAMPLE_LSB_RELEASE = "DISTRIB_CODENAME=codename\n"
2829
@@ -51,8 +52,9 @@
51 super(PackageReporterAptTest, self).setUp()52 super(PackageReporterAptTest, self).setUp()
52 self.store = PackageStore(self.makeFile())53 self.store = PackageStore(self.makeFile())
53 self.config = PackageReporterConfiguration()54 self.config = PackageReporterConfiguration()
55 self.reactor = FakeReactor()
54 self.reporter = PackageReporter(56 self.reporter = PackageReporter(
55 self.store, self.facade, self.remote, self.config)57 self.store, self.facade, self.remote, self.config, self.reactor)
56 self.reporter.get_session_id()58 self.reporter.get_session_id()
57 # Assume update-notifier-common stamp file is not present by59 # Assume update-notifier-common stamp file is not present by
58 # default.60 # default.
@@ -1119,7 +1121,6 @@
1119 deferred = self.reporter.run()1121 deferred = self.reporter.run()
11201122
1121 def check_result(result):1123 def check_result(result):
1122
1123 # The hashes should not go away.1124 # The hashes should not go away.
1124 hash1 = self.store.get_hash_id(foo_hash)1125 hash1 = self.store.get_hash_id(foo_hash)
1125 hash2 = self.store.get_hash_id(HASH2)1126 hash2 = self.store.get_hash_id(HASH2)
@@ -1140,6 +1141,7 @@
1140 self.assertEqual(request.hashes, [HASH3, HASH1])1141 self.assertEqual(request.hashes, [HASH3, HASH1])
11411142
1142 deferred.addCallback(check_result)1143 deferred.addCallback(check_result)
1144 self.reactor.advance(0)
1143 return deferred1145 return deferred
11441146
1145 def test_run_apt_update(self):1147 def test_run_apt_update(self):
@@ -1165,6 +1167,7 @@
1165 self.assertEqual("error", err)1167 self.assertEqual("error", err)
1166 self.assertEqual(0, code)1168 self.assertEqual(0, code)
1167 result.addCallback(callback)1169 result.addCallback(callback)
1170 self.reactor.advance(0)
1168 result.chainDeferred(deferred)1171 result.chainDeferred(deferred)
11691172
1170 reactor.callWhenRunning(do_test)1173 reactor.callWhenRunning(do_test)
@@ -1179,18 +1182,14 @@
1179 self.config.load(["--force-apt-update"])1182 self.config.load(["--force-apt-update"])
1180 self._make_fake_apt_update()1183 self._make_fake_apt_update()
11811184
1182 deferred = Deferred()1185 result = self.reporter.run_apt_update()
11831186
1184 def do_test():1187 def callback((out, err, code)):
1185 result = self.reporter.run_apt_update()1188 self.assertEqual("output", out)
11861189
1187 def callback((out, err, code)):1190 result.addCallback(callback)
1188 self.assertEqual("output", out)1191 self.reactor.advance(0)
1189 result.addCallback(callback)1192 return result
1190 result.chainDeferred(deferred)
1191
1192 reactor.callWhenRunning(do_test)
1193 return deferred
11941193
1195 def test_run_apt_update_with_force_apt_update_if_sources_changed(self):1194 def test_run_apt_update_with_force_apt_update_if_sources_changed(self):
1196 """1195 """
@@ -1203,18 +1202,14 @@
1203 self.reporter.sources_list_filename = self.makeFile("deb ftp://url ./")1202 self.reporter.sources_list_filename = self.makeFile("deb ftp://url ./")
1204 self._make_fake_apt_update()1203 self._make_fake_apt_update()
12051204
1206 deferred = Deferred()1205 result = self.reporter.run_apt_update()
12071206
1208 def do_test():1207 def callback((out, err, code)):
1209 result = self.reporter.run_apt_update()1208 self.assertEqual("output", out)
12101209
1211 def callback((out, err, code)):1210 result.addCallback(callback)
1212 self.assertEqual("output", out)1211 self.reactor.advance(0)
1213 result.addCallback(callback)1212 return result
1214 result.chainDeferred(deferred)
1215
1216 reactor.callWhenRunning(do_test)
1217 return deferred
12181213
1219 def test_run_apt_update_warns_about_failures(self):1214 def test_run_apt_update_warns_about_failures(self):
1220 """1215 """
@@ -1225,21 +1220,87 @@
1225 logging_mock = self.mocker.replace("logging.warning")1220 logging_mock = self.mocker.replace("logging.warning")
1226 logging_mock("'%s' exited with status 2"1221 logging_mock("'%s' exited with status 2"
1227 " (error)" % self.reporter.apt_update_filename)1222 " (error)" % self.reporter.apt_update_filename)
1228 self.mocker.replay()1223
1229 deferred = Deferred()1224 self.mocker.replay()
12301225
1231 def do_test():1226 result = self.reporter.run_apt_update()
1232 result = self.reporter.run_apt_update()1227
12331228 def callback((out, err, code)):
1234 def callback((out, err, code)):1229 self.assertEqual("output", out)
1235 self.assertEqual("output", out)1230 self.assertEqual("error", err)
1236 self.assertEqual("error", err)1231 self.assertEqual(2, code)
1237 self.assertEqual(2, code)1232
1238 result.addCallback(callback)1233 result.addCallback(callback)
1239 result.chainDeferred(deferred)1234 self.reactor.advance(0)
12401235 return result
1241 reactor.callWhenRunning(do_test)1236
1242 return deferred1237 def test_run_apt_update_warns_about_lock_failure(self):
1238 """
1239 The L{PackageReporter.run_apt_update} method logs a warnings when
1240 apt-update fails acquiring the lock.
1241 """
1242 self._make_fake_apt_update(code=100)
1243 logging_mock = self.mocker.replace("logging.warning")
1244 logging_mock("Could not acquire the apt lock. Retrying in 20 seconds.")
1245 logging_mock("Could not acquire the apt lock. Retrying in 40 seconds.")
1246 logging_mock("'%s' exited with status 100 ()" %
1247 self.reporter.apt_update_filename)
1248
1249 spawn_mock = self.mocker.replace(
1250 "landscape.lib.twisted_util.spawn_process")
1251 spawn_mock(ANY)
1252 # Simulate the first failure.
1253 self.mocker.result(succeed(('', '', 100)))
1254 spawn_mock(ANY)
1255 # Simulate the second failure.
1256 self.mocker.result(succeed(('', '', 100)))
1257 spawn_mock(ANY)
1258 # Simulate the second failure.
1259 self.mocker.result(succeed(('', '', 100)))
1260
1261 self.mocker.replay()
1262
1263 result = self.reporter.run_apt_update()
1264
1265 def callback((out, err, code)):
1266 self.assertEqual("", out)
1267 self.assertEqual("", err)
1268 self.assertEqual(100, code)
1269
1270 result.addCallback(callback)
1271 self.reactor.advance(60)
1272 return result
1273
1274 def test_run_apt_update_stops_retrying_after_lock_acquired(self):
1275 """
1276 When L{PackageReporter.run_apt_update} method successfully acquires the
1277 lock, it will stop retrying.
1278 """
1279 self._make_fake_apt_update(code=100)
1280 logging_mock = self.mocker.replace("logging.warning")
1281 logging_mock("Could not acquire the apt lock. Retrying in 20 seconds.")
1282
1283 spawn_mock = self.mocker.replace(
1284 "landscape.lib.twisted_util.spawn_process")
1285 spawn_mock(ANY)
1286 # Simulate the first failure.
1287 self.mocker.result(succeed(('', '', 100)))
1288 spawn_mock(ANY)
1289 # Simulate a successful apt lock grab.
1290 self.mocker.result(succeed(('output', 'error', 0)))
1291
1292 self.mocker.replay()
1293
1294 result = self.reporter.run_apt_update()
1295
1296 def callback((out, err, code)):
1297 self.assertEqual("output", out)
1298 self.assertEqual("error", err)
1299 self.assertEqual(0, code)
1300
1301 result.addCallback(callback)
1302 self.reactor.advance(20)
1303 return result
12431304
1244 def test_run_apt_update_report_apt_failure(self):1305 def test_run_apt_update_report_apt_failure(self):
1245 """1306 """
@@ -1260,6 +1321,7 @@
1260 [{"type": "package-reporter-result",1321 [{"type": "package-reporter-result",
1261 "code": 2, "err": u"error"}])1322 "code": 2, "err": u"error"}])
1262 result.addCallback(callback)1323 result.addCallback(callback)
1324 self.reactor.advance(0)
1263 result.chainDeferred(deferred)1325 result.chainDeferred(deferred)
12641326
1265 reactor.callWhenRunning(do_test)1327 reactor.callWhenRunning(do_test)
@@ -1290,6 +1352,7 @@
1290 [{"type": "package-reporter-result",1352 [{"type": "package-reporter-result",
1291 "code": 1, "err": error}])1353 "code": 1, "err": error}])
1292 result.addCallback(callback)1354 result.addCallback(callback)
1355 self.reactor.advance(0)
1293 result.chainDeferred(deferred)1356 result.chainDeferred(deferred)
12941357
1295 reactor.callWhenRunning(do_test)1358 reactor.callWhenRunning(do_test)
@@ -1315,6 +1378,7 @@
1315 [{"type": "package-reporter-result",1378 [{"type": "package-reporter-result",
1316 "code": 2, "err": u"error"}])1379 "code": 2, "err": u"error"}])
1317 result.addCallback(callback)1380 result.addCallback(callback)
1381 self.reactor.advance(0)
1318 result.chainDeferred(deferred)1382 result.chainDeferred(deferred)
13191383
1320 reactor.callWhenRunning(do_test)1384 reactor.callWhenRunning(do_test)
@@ -1339,6 +1403,7 @@
1339 [{"type": "package-reporter-result",1403 [{"type": "package-reporter-result",
1340 "code": 0, "err": u"message"}])1404 "code": 0, "err": u"message"}])
1341 result.addCallback(callback)1405 result.addCallback(callback)
1406 self.reactor.advance(0)
1342 result.chainDeferred(deferred)1407 result.chainDeferred(deferred)
13431408
1344 reactor.callWhenRunning(do_test)1409 reactor.callWhenRunning(do_test)
@@ -1366,6 +1431,7 @@
1366 self.assertEqual("", err)1431 self.assertEqual("", err)
1367 self.assertEqual(0, code)1432 self.assertEqual(0, code)
1368 result.addCallback(callback)1433 result.addCallback(callback)
1434 self.reactor.advance(0)
1369 result.chainDeferred(deferred)1435 result.chainDeferred(deferred)
13701436
1371 reactor.callWhenRunning(do_test)1437 reactor.callWhenRunning(do_test)
@@ -1402,6 +1468,7 @@
1402 self.assertEqual("", err)1468 self.assertEqual("", err)
1403 self.assertEqual(0, code)1469 self.assertEqual(0, code)
1404 result.addCallback(callback)1470 result.addCallback(callback)
1471 self.reactor.advance(0)
1405 result.chainDeferred(deferred)1472 result.chainDeferred(deferred)
14061473
1407 reactor.callWhenRunning(do_test)1474 reactor.callWhenRunning(do_test)
@@ -1438,6 +1505,7 @@
1438 [{"type": "package-reporter-result",1505 [{"type": "package-reporter-result",
1439 "code": 0, "err": u"message"}])1506 "code": 0, "err": u"message"}])
1440 result.addCallback(callback)1507 result.addCallback(callback)
1508 self.reactor.advance(0)
1441 result.chainDeferred(deferred)1509 result.chainDeferred(deferred)
14421510
1443 reactor.callWhenRunning(do_test)1511 reactor.callWhenRunning(do_test)
@@ -1459,6 +1527,7 @@
1459 self.assertTrue(1527 self.assertTrue(
1460 os.path.exists(self.config.update_stamp_filename))1528 os.path.exists(self.config.update_stamp_filename))
1461 result.addCallback(callback)1529 result.addCallback(callback)
1530 self.reactor.advance(0)
1462 result.chainDeferred(deferred)1531 result.chainDeferred(deferred)
14631532
1464 reactor.callWhenRunning(do_test)1533 reactor.callWhenRunning(do_test)
@@ -1492,6 +1561,7 @@
1492 [{"type": "package-reporter-result",1561 [{"type": "package-reporter-result",
1493 "code": 0, "err": u""}])1562 "code": 0, "err": u""}])
1494 result.addCallback(callback)1563 result.addCallback(callback)
1564 self.reactor.advance(0)
1495 result.chainDeferred(deferred)1565 result.chainDeferred(deferred)
14961566
1497 reactor.callWhenRunning(do_test)1567 reactor.callWhenRunning(do_test)
@@ -1528,6 +1598,7 @@
1528 [{"type": "package-reporter-result",1598 [{"type": "package-reporter-result",
1529 "code": 0, "err": u""}])1599 "code": 0, "err": u""}])
1530 result.addCallback(callback)1600 result.addCallback(callback)
1601 self.reactor.advance(0)
1531 result.chainDeferred(deferred)1602 result.chainDeferred(deferred)
15321603
1533 reactor.callWhenRunning(do_test)1604 reactor.callWhenRunning(do_test)
@@ -1632,8 +1703,9 @@
1632 super(GlobalPackageReporterAptTest, self).setUp()1703 super(GlobalPackageReporterAptTest, self).setUp()
1633 self.store = FakePackageStore(self.makeFile())1704 self.store = FakePackageStore(self.makeFile())
1634 self.config = PackageReporterConfiguration()1705 self.config = PackageReporterConfiguration()
1706 self.reactor = FakeReactor()
1635 self.reporter = FakeGlobalReporter(1707 self.reporter = FakeGlobalReporter(
1636 self.store, self.facade, self.remote, self.config)1708 self.store, self.facade, self.remote, self.config, self.reactor)
1637 # Assume update-notifier-common stamp file is not present by1709 # Assume update-notifier-common stamp file is not present by
1638 # default.1710 # default.
1639 self.reporter.update_notifier_stamp = "/Not/Existing"1711 self.reporter.update_notifier_stamp = "/Not/Existing"
@@ -1654,6 +1726,7 @@
1654 def do_test():1726 def do_test():
1655 self.reporter.get_session_id()1727 self.reporter.get_session_id()
1656 result = self.reporter.run_apt_update()1728 result = self.reporter.run_apt_update()
1729 self.reactor.advance(0)
16571730
1658 def callback(ignore):1731 def callback(ignore):
1659 message = {"type": "package-reporter-result",1732 message = {"type": "package-reporter-result",
@@ -1683,8 +1756,9 @@
1683 self.global_store = FakePackageStore(global_file)1756 self.global_store = FakePackageStore(global_file)
1684 os.environ["FAKE_PACKAGE_STORE"] = global_file1757 os.environ["FAKE_PACKAGE_STORE"] = global_file
1685 self.config = PackageReporterConfiguration()1758 self.config = PackageReporterConfiguration()
1759 self.reactor = FakeReactor()
1686 self.reporter = FakeReporter(1760 self.reporter = FakeReporter(
1687 self.store, None, self.remote, self.config)1761 self.store, None, self.remote, self.config, self.reactor)
1688 self.config.data_path = self.makeDir()1762 self.config.data_path = self.makeDir()
1689 os.mkdir(self.config.package_directory)1763 os.mkdir(self.config.package_directory)
16901764
16911765
=== modified file 'landscape/package/tests/test_taskhandler.py'
--- landscape/package/tests/test_taskhandler.py 2013-05-21 08:37:08 +0000
+++ landscape/package/tests/test_taskhandler.py 2015-01-12 13:35:57 +0000
@@ -44,8 +44,9 @@
44 super(PackageTaskHandlerTest, self).setUp()44 super(PackageTaskHandlerTest, self).setUp()
45 self.config = PackageTaskHandlerConfiguration()45 self.config = PackageTaskHandlerConfiguration()
46 self.store = PackageStore(self.makeFile())46 self.store = PackageStore(self.makeFile())
47 self.reactor = FakeReactor()
47 self.handler = PackageTaskHandler(48 self.handler = PackageTaskHandler(
48 self.store, self.facade, self.remote, self.config)49 self.store, self.facade, self.remote, self.config, self.reactor)
4950
50 def test_use_hash_id_db(self):51 def test_use_hash_id_db(self):
5152
@@ -363,7 +364,7 @@
363 umask(022)364 umask(022)
364365
365 handler_args = []366 handler_args = []
366 HandlerMock(ANY, ANY, ANY, ANY)367 HandlerMock(ANY, ANY, ANY, ANY, ANY)
367 self.mocker.passthrough() # Let the real constructor run for testing.368 self.mocker.passthrough() # Let the real constructor run for testing.
368 self.mocker.call(lambda *args: handler_args.extend(args))369 self.mocker.call(lambda *args: handler_args.extend(args))
369370
@@ -390,7 +391,7 @@
390391
391 def assert_task_handler(ignored):392 def assert_task_handler(ignored):
392393
393 store, facade, broker, config = handler_args394 store, facade, broker, config, reactor = handler_args
394395
395 try:396 try:
396 # Verify the arguments passed to the reporter constructor.397 # Verify the arguments passed to the reporter constructor.
@@ -399,6 +400,7 @@
399 self.assertEqual(type(broker), LazyRemoteBroker)400 self.assertEqual(type(broker), LazyRemoteBroker)
400 self.assertEqual(type(config),401 self.assertEqual(type(config),
401 PackageTaskHandlerConfiguration)402 PackageTaskHandlerConfiguration)
403 self.assertEqual(type(reactor), LandscapeReactor)
402404
403 # Let's see if the store path is where it should be.405 # Let's see if the store path is where it should be.
404 filename = os.path.join(self.data_path, "package", "database")406 filename = os.path.join(self.data_path, "package", "database")

Subscribers

People subscribed via source and target branches

to all changes: