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
1=== modified file 'landscape/message_schemas.py'
2--- landscape/message_schemas.py 2011-04-25 17:56:33 +0000
3+++ landscape/message_schemas.py 2011-04-29 16:27:30 +0000
4@@ -46,7 +46,7 @@
5 "client-uptime",
6 {"period": Tuple(Float(), Float()),
7 "components": List(Int())},
8- optional=["components"]) # just for backwards compatibility
9+ optional=["components"]) # just for backwards compatibility
10
11 OPERATION_RESULT = Message(
12 "operation-result",
13@@ -90,10 +90,10 @@
14 HARDWARE_INVENTORY = Message("hardware-inventory", {
15 "devices": List(Any(Tuple(Constant("create"), hal_data),
16 Tuple(Constant("update"),
17- Unicode(), # udi,
18- hal_data, # creates,
19- hal_data, # updates,
20- hal_data), # deletes
21+ Unicode(), # udi,
22+ hal_data, # creates,
23+ hal_data, # updates,
24+ hal_data), # deletes
25 Tuple(Constant("delete"),
26 Unicode()),
27 ),
28@@ -297,6 +297,10 @@
29 "request-id": Int(),
30 })
31
32+PACKAGE_REPORTER_ERROR = Message("package-reporter-error", {
33+ "error-code": Int(),
34+ "error-text": utf8})
35+
36 ADD_PACKAGES = Message("add-packages", {
37 "packages": List(KeyDict({"name": utf8,
38 "description": Unicode(),
39@@ -386,8 +390,8 @@
40 REGISTER, REGISTER_CLOUD_VM, TEMPERATURE, PROCESSOR_INFO,
41 USERS, PACKAGES, PACKAGE_LOCKS,
42 CHANGE_PACKAGES_RESULT, UNKNOWN_PACKAGE_HASHES,
43- ADD_PACKAGES, TEXT_MESSAGE, TEST, CUSTOM_GRAPH,
44- REBOOT_REQUIRED, APT_PREFERENCES, EUCALYPTUS_INFO,
45+ ADD_PACKAGES, PACKAGE_REPORTER_ERROR, TEXT_MESSAGE, TEST,
46+ CUSTOM_GRAPH, REBOOT_REQUIRED, APT_PREFERENCES, EUCALYPTUS_INFO,
47 EUCALYPTUS_INFO_ERROR, NETWORK_DEVICE, NETWORK_ACTIVITY,
48 REBOOT_REQUIRED_INFO]:
49 message_schemas[schema.type] = schema
50
51=== modified file 'landscape/package/reporter.py'
52--- landscape/package/reporter.py 2010-04-01 08:28:22 +0000
53+++ landscape/package/reporter.py 2011-04-29 16:27:30 +0000
54@@ -201,11 +201,28 @@
55 logging.debug("'%s' exited with status %d (out='%s', err='%s'" % (
56 self.smart_update_filename, code, out, err))
57 touch_file(self._config.smart_update_stamp_filename)
58- return (out, err, code)
59+ if smart_failed:
60+ deferred = self._broker.call_if_accepted(
61+ "package-reporter-error", self.send_error, code, err)
62+ else:
63+ deferred = succeed(None)
64+ deferred.addCallback(lambda ignore: (out, err, code))
65+ return deferred
66
67 result.addCallback(callback)
68 return result
69
70+ def send_error(self, code, err):
71+ """
72+ If an error happened in smart update, reports it to the server in a
73+ message.
74+ """
75+ message = {
76+ "type": "package-reporter-error",
77+ "error-code": code,
78+ "error-text": err}
79+ return self._broker.send_message(message, True)
80+
81 def handle_task(self, task):
82 message = task.data
83 if message["type"] == "package-ids":
84
85=== modified file 'landscape/package/tests/test_reporter.py'
86--- landscape/package/tests/test_reporter.py 2010-04-16 10:44:51 +0000
87+++ landscape/package/tests/test_reporter.py 2011-04-29 16:27:30 +0000
88@@ -60,7 +60,7 @@
89 previous(self)
90 pkg2 = self.get_packages_by_name("name2")[0]
91 pkg2.upgrades += (DebUpgrades("name1", "=", "version1-release1"),)
92- self.reload_cache() # Relink relations.
93+ self.reload_cache() # Relink relations.
94 self.Facade.channels_reloaded = callback
95
96 def set_pkg1_installed(self):
97@@ -662,6 +662,31 @@
98 reactor.callWhenRunning(do_test)
99 return deferred
100
101+ def test_run_smart_update_report_failures(self):
102+ """
103+ If L{PackageReporter.run_smart_update} fails, a message is sent to the
104+ server reporting the error, to be able to fix the problem centrally.
105+ """
106+ message_store = self.broker_service.message_store
107+ message_store.set_accepted_types(["package-reporter-error"])
108+ self.reporter.smart_update_filename = self.makeFile(
109+ "#!/bin/sh\necho -n error >&2\necho -n output\nexit 2")
110+ os.chmod(self.reporter.smart_update_filename, 0755)
111+ deferred = Deferred()
112+
113+ def do_test():
114+ result = self.reporter.run_smart_update()
115+
116+ def callback(ignore):
117+ self.assertMessages(message_store.get_pending_messages(),
118+ [{"type": "package-reporter-error",
119+ "error-code": 2, "error-text": "error"}])
120+ result.addCallback(callback)
121+ result.chainDeferred(deferred)
122+
123+ reactor.callWhenRunning(do_test)
124+ return deferred
125+
126 def test_run_smart_update_warns_exit_code_1_and_non_empty_stderr(self):
127 """
128 The L{PackageReporter.run_smart_update} method should log a warning

Subscribers

People subscribed via source and target branches

to all changes: