Merge lp:~therve/landscape-client/package-reporter-errors into lp:~landscape/landscape-client/trunk

Proposed by Thomas Herve
Status: Merged
Approved by: Björn Tillenius
Approved revision: 327
Merged at revision: 328
Proposed branch: lp:~therve/landscape-client/package-reporter-errors
Merge into: lp:~landscape/landscape-client/trunk
Diff against target: 128 lines (+55/-9)
3 files modified
landscape/message_schemas.py (+11/-7)
landscape/package/reporter.py (+18/-1)
landscape/package/tests/test_reporter.py (+26/-1)
To merge this branch: bzr merge lp:~therve/landscape-client/package-reporter-errors
Reviewer Review Type Date Requested Status
Björn Tillenius (community) Approve
Free Ekanayaka (community) Approve
Review via email: mp+59529@code.launchpad.net

Description of the change

That part is of course too easy. The reporter just sends a new message when a smart update fails. We need to do something on the server side to handle it. I was thinking about adding an alert?

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

Looks good, +1.

An alert sounds fine, though sometimes the errors might be transient, like an HTTP timeout.

review: Approve
Revision history for this message
Björn Tillenius (bjornt) wrote :

Looks good to me, +1

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'landscape/message_schemas.py'
--- landscape/message_schemas.py 2011-04-25 17:56:33 +0000
+++ landscape/message_schemas.py 2011-04-29 16:27:30 +0000
@@ -46,7 +46,7 @@
46 "client-uptime",46 "client-uptime",
47 {"period": Tuple(Float(), Float()),47 {"period": Tuple(Float(), Float()),
48 "components": List(Int())},48 "components": List(Int())},
49 optional=["components"]) # just for backwards compatibility49 optional=["components"]) # just for backwards compatibility
5050
51OPERATION_RESULT = Message(51OPERATION_RESULT = Message(
52 "operation-result",52 "operation-result",
@@ -90,10 +90,10 @@
90HARDWARE_INVENTORY = Message("hardware-inventory", {90HARDWARE_INVENTORY = Message("hardware-inventory", {
91 "devices": List(Any(Tuple(Constant("create"), hal_data),91 "devices": List(Any(Tuple(Constant("create"), hal_data),
92 Tuple(Constant("update"),92 Tuple(Constant("update"),
93 Unicode(), # udi,93 Unicode(), # udi,
94 hal_data, # creates,94 hal_data, # creates,
95 hal_data, # updates,95 hal_data, # updates,
96 hal_data), # deletes96 hal_data), # deletes
97 Tuple(Constant("delete"),97 Tuple(Constant("delete"),
98 Unicode()),98 Unicode()),
99 ),99 ),
@@ -297,6 +297,10 @@
297 "request-id": Int(),297 "request-id": Int(),
298 })298 })
299299
300PACKAGE_REPORTER_ERROR = Message("package-reporter-error", {
301 "error-code": Int(),
302 "error-text": utf8})
303
300ADD_PACKAGES = Message("add-packages", {304ADD_PACKAGES = Message("add-packages", {
301 "packages": List(KeyDict({"name": utf8,305 "packages": List(KeyDict({"name": utf8,
302 "description": Unicode(),306 "description": Unicode(),
@@ -386,8 +390,8 @@
386 REGISTER, REGISTER_CLOUD_VM, TEMPERATURE, PROCESSOR_INFO,390 REGISTER, REGISTER_CLOUD_VM, TEMPERATURE, PROCESSOR_INFO,
387 USERS, PACKAGES, PACKAGE_LOCKS,391 USERS, PACKAGES, PACKAGE_LOCKS,
388 CHANGE_PACKAGES_RESULT, UNKNOWN_PACKAGE_HASHES,392 CHANGE_PACKAGES_RESULT, UNKNOWN_PACKAGE_HASHES,
389 ADD_PACKAGES, TEXT_MESSAGE, TEST, CUSTOM_GRAPH,393 ADD_PACKAGES, PACKAGE_REPORTER_ERROR, TEXT_MESSAGE, TEST,
390 REBOOT_REQUIRED, APT_PREFERENCES, EUCALYPTUS_INFO,394 CUSTOM_GRAPH, REBOOT_REQUIRED, APT_PREFERENCES, EUCALYPTUS_INFO,
391 EUCALYPTUS_INFO_ERROR, NETWORK_DEVICE, NETWORK_ACTIVITY,395 EUCALYPTUS_INFO_ERROR, NETWORK_DEVICE, NETWORK_ACTIVITY,
392 REBOOT_REQUIRED_INFO]:396 REBOOT_REQUIRED_INFO]:
393 message_schemas[schema.type] = schema397 message_schemas[schema.type] = schema
394398
=== modified file 'landscape/package/reporter.py'
--- landscape/package/reporter.py 2010-04-01 08:28:22 +0000
+++ landscape/package/reporter.py 2011-04-29 16:27:30 +0000
@@ -201,11 +201,28 @@
201 logging.debug("'%s' exited with status %d (out='%s', err='%s'" % (201 logging.debug("'%s' exited with status %d (out='%s', err='%s'" % (
202 self.smart_update_filename, code, out, err))202 self.smart_update_filename, code, out, err))
203 touch_file(self._config.smart_update_stamp_filename)203 touch_file(self._config.smart_update_stamp_filename)
204 return (out, err, code)204 if smart_failed:
205 deferred = self._broker.call_if_accepted(
206 "package-reporter-error", self.send_error, code, err)
207 else:
208 deferred = succeed(None)
209 deferred.addCallback(lambda ignore: (out, err, code))
210 return deferred
205211
206 result.addCallback(callback)212 result.addCallback(callback)
207 return result213 return result
208214
215 def send_error(self, code, err):
216 """
217 If an error happened in smart update, reports it to the server in a
218 message.
219 """
220 message = {
221 "type": "package-reporter-error",
222 "error-code": code,
223 "error-text": err}
224 return self._broker.send_message(message, True)
225
209 def handle_task(self, task):226 def handle_task(self, task):
210 message = task.data227 message = task.data
211 if message["type"] == "package-ids":228 if message["type"] == "package-ids":
212229
=== modified file 'landscape/package/tests/test_reporter.py'
--- landscape/package/tests/test_reporter.py 2010-04-16 10:44:51 +0000
+++ landscape/package/tests/test_reporter.py 2011-04-29 16:27:30 +0000
@@ -60,7 +60,7 @@
60 previous(self)60 previous(self)
61 pkg2 = self.get_packages_by_name("name2")[0]61 pkg2 = self.get_packages_by_name("name2")[0]
62 pkg2.upgrades += (DebUpgrades("name1", "=", "version1-release1"),)62 pkg2.upgrades += (DebUpgrades("name1", "=", "version1-release1"),)
63 self.reload_cache() # Relink relations.63 self.reload_cache() # Relink relations.
64 self.Facade.channels_reloaded = callback64 self.Facade.channels_reloaded = callback
6565
66 def set_pkg1_installed(self):66 def set_pkg1_installed(self):
@@ -662,6 +662,31 @@
662 reactor.callWhenRunning(do_test)662 reactor.callWhenRunning(do_test)
663 return deferred663 return deferred
664664
665 def test_run_smart_update_report_failures(self):
666 """
667 If L{PackageReporter.run_smart_update} fails, a message is sent to the
668 server reporting the error, to be able to fix the problem centrally.
669 """
670 message_store = self.broker_service.message_store
671 message_store.set_accepted_types(["package-reporter-error"])
672 self.reporter.smart_update_filename = self.makeFile(
673 "#!/bin/sh\necho -n error >&2\necho -n output\nexit 2")
674 os.chmod(self.reporter.smart_update_filename, 0755)
675 deferred = Deferred()
676
677 def do_test():
678 result = self.reporter.run_smart_update()
679
680 def callback(ignore):
681 self.assertMessages(message_store.get_pending_messages(),
682 [{"type": "package-reporter-error",
683 "error-code": 2, "error-text": "error"}])
684 result.addCallback(callback)
685 result.chainDeferred(deferred)
686
687 reactor.callWhenRunning(do_test)
688 return deferred
689
665 def test_run_smart_update_warns_exit_code_1_and_non_empty_stderr(self):690 def test_run_smart_update_warns_exit_code_1_and_non_empty_stderr(self):
666 """691 """
667 The L{PackageReporter.run_smart_update} method should log a warning692 The L{PackageReporter.run_smart_update} method should log a warning

Subscribers

People subscribed via source and target branches

to all changes: