Merge lp:~therve/landscape-client/config-apt-update-interval into lp:~landscape/landscape-client/trunk

Proposed by Thomas Herve
Status: Merged
Approved by: Alberto Donato
Approved revision: 596
Merged at revision: 596
Proposed branch: lp:~therve/landscape-client/config-apt-update-interval
Merge into: lp:~landscape/landscape-client/trunk
Diff against target: 342 lines (+92/-26)
8 files modified
example.conf (+11/-5)
landscape/deployment.py (+9/-2)
landscape/monitor/packagemonitor.py (+1/-0)
landscape/monitor/tests/test_packagemonitor.py (+9/-0)
landscape/package/reporter.py (+4/-6)
landscape/package/tests/test_reporter.py (+49/-12)
man/landscape-config.1 (+5/-1)
man/landscape-config.txt (+4/-0)
To merge this branch: bzr merge lp:~therve/landscape-client/config-apt-update-interval
Reviewer Review Type Date Requested Status
Alberto Donato (community) Approve
Jerry Seutter (community) Approve
Review via email: mp+139701@code.launchpad.net

Description of the change

The branch adds 2 new parameters: one to change the package monitor interval, the other to reduce the apt update interval. I also change the default apt update interval to be 6h instead of 1, which seems more than enough for me.

To post a comment you must log in.
Revision history for this message
Jerry Seutter (jseutter) wrote :

+1 looks good.

[1]
74 + parser.add_option("--package-monitor-interval", default=30 * 60,
75 + type="int",
76 + help="The interval between apt update runs "
77 + "(default 1800).")
78 + parser.add_option("--apt-update-interval", default=6 * 60 * 60,
79 + type="int",
80 + help="The interval between apt update runs "
81 + "(default 21600).")

The help text on package-monitor-interval is incorrect.

review: Approve
Revision history for this message
Alberto Donato (ack) wrote :

Looks good, +1!

#1:
you can use '%default' in the options help text to avoid duplicating the default value.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'example.conf'
2--- example.conf 2012-09-27 18:47:34 +0000
3+++ example.conf 2012-12-13 13:43:55 +0000
4@@ -11,17 +11,17 @@
5 # GENERAL OPTIONS
6
7 # The directory in which landscape-client will store data files in.
8-data_path = /var/lib/landscape/client/
9+data_path = /var/lib/landscape/client/
10
11 # If set to True, do not log to standard output.
12 quiet = False
13
14 # The directory in which to store log files.
15-log_dir = /var/log/landscape/
16+log_dir = /var/log/landscape/
17
18 # The log level at which to log events.
19 # Values can be one of: "debug", "info", "warning", "error", "critical"
20-log_level = info
21+log_level = info
22
23 # The main URL for the landscape server to connect this client to. If you
24 # purchased a Landscape Dedicated Server (LDS), change this to point to your
25@@ -32,7 +32,7 @@
26 #
27 # Example:
28 # url = https://landscape.example.com/message-system
29-url = https://landscape.canonical.com/message-system
30+url = https://landscape.canonical.com/message-system
31
32 # The ping url you want this client to report to.
33 #
34@@ -122,6 +122,12 @@
35 # The number of seconds between pings.
36 ping_interval = 30
37
38+# The number of seconds between apt update calls.
39+apt_update_interval = 21600
40+
41+# The number of seconds between package monitor runs.
42+package_monitor_interval = 1800
43+
44 # The URL of the http proxy to use, if any.
45 # This value is optional.
46 #
47@@ -138,7 +144,7 @@
48 # registration.
49 #
50 # This has no default.
51-otp
52+#otp = ABCD1234
53
54 # A comma-separated list of tags to attach to this computer.
55 #
56
57=== modified file 'landscape/deployment.py'
58--- landscape/deployment.py 2012-10-15 08:17:35 +0000
59+++ landscape/deployment.py 2012-12-13 13:43:55 +0000
60@@ -217,8 +217,7 @@
61 all_options.update(self._command_line_options)
62 all_options.update(self._set_options)
63 for name, value in all_options.items():
64- if (name != "config" and
65- name not in self.unsaved_options):
66+ if name != "config" and name not in self.unsaved_options:
67 if value == self._command_line_defaults.get(name):
68 config_parser.remove_option(self.config_section, name)
69 else:
70@@ -330,6 +329,14 @@
71 parser.add_option("--ignore-sigusr1", action="store_true",
72 default=False, help="Ignore SIGUSR1 signal to "
73 "rotate logs.")
74+ parser.add_option("--package-monitor-interval", default=30 * 60,
75+ type="int",
76+ help="The interval between apt update runs "
77+ "(default 1800).")
78+ parser.add_option("--apt-update-interval", default=6 * 60 * 60,
79+ type="int",
80+ help="The interval between apt update runs "
81+ "(default 21600).")
82
83 # Hidden options, used for load-testing to run in-process clones
84 parser.add_option("--clones", default=0, type=int, help=SUPPRESS_HELP)
85
86=== modified file 'landscape/monitor/packagemonitor.py'
87--- landscape/monitor/packagemonitor.py 2012-05-08 01:13:59 +0000
88+++ landscape/monitor/packagemonitor.py 2012-12-13 13:43:55 +0000
89@@ -22,6 +22,7 @@
90
91 def register(self, registry):
92 self.config = registry.config
93+ self.run_interval = self.config.package_monitor_interval
94 if self.config.clones and self.config.is_clone:
95 # Run clones a bit more frequently in order to catch up
96 self.run_interval = 60 # 300
97
98=== modified file 'landscape/monitor/tests/test_packagemonitor.py'
99--- landscape/monitor/tests/test_packagemonitor.py 2011-07-05 05:09:11 +0000
100+++ landscape/monitor/tests/test_packagemonitor.py 2012-12-13 13:43:55 +0000
101@@ -43,6 +43,15 @@
102 self.monitor.dispatch_message(message)
103 self.assertTrue(os.path.isfile(filename))
104
105+ def test_run_interval(self):
106+ """
107+ The C{run_interval} of L{PackageMonitor} can be customized via the
108+ C{package_monitor_interval} configuration parameter.
109+ """
110+ self.monitor.config.package_monitor_interval = 1234
111+ self.package_monitor.register(self.monitor)
112+ self.assertEqual(1234, self.package_monitor.run_interval)
113+
114 def test_dont_spawn_reporter_if_message_not_accepted(self):
115 self.monitor.add(self.package_monitor)
116
117
118=== modified file 'landscape/package/reporter.py'
119--- landscape/package/reporter.py 2012-05-16 08:35:27 +0000
120+++ landscape/package/reporter.py 2012-12-13 13:43:55 +0000
121@@ -40,14 +40,11 @@
122 """Report information about the system packages.
123
124 @cvar queue_name: Name of the task queue to pick tasks from.
125- @cvar apt_update_interval: Don't update the APT index more often
126- than the given interval in minutes.
127 """
128 config_factory = PackageReporterConfiguration
129
130 queue_name = "reporter"
131
132- apt_update_interval = 60
133 apt_update_filename = "/usr/lib/landscape/apt-update"
134 sources_list_filename = "/etc/apt/sources.list"
135 sources_list_directory = "/etc/apt/sources.list.d"
136@@ -184,7 +181,7 @@
137 # check stamp file mtime
138 last_update = os.stat(stamp)[8]
139 now = int(time.time())
140- return (last_update + interval * 60) < now
141+ return (last_update + interval) < now
142
143 def run_apt_update(self):
144 """Run apt-update and log a warning in case of non-zero exit code.
145@@ -192,7 +189,8 @@
146 @return: a deferred returning (out, err, code)
147 """
148 if (self._config.force_apt_update or self._apt_sources_have_changed()
149- or self._apt_update_timeout_expired(self.apt_update_interval)):
150+ or self._apt_update_timeout_expired(
151+ self._config.apt_update_interval)):
152
153 result = spawn_process(self.apt_update_filename)
154
155@@ -204,7 +202,7 @@
156
157 if code != 0:
158 logging.warning("'%s' exited with status %d (%s)" % (
159- self.apt_update_filename, code, err))
160+ self.apt_update_filename, code, err))
161 elif not self._facade.get_channels():
162 code = 1
163 err = ("There are no APT sources configured in %s or %s." %
164
165=== modified file 'landscape/package/tests/test_reporter.py'
166--- landscape/package/tests/test_reporter.py 2012-05-10 19:01:46 +0000
167+++ landscape/package/tests/test_reporter.py 2012-12-13 13:43:55 +0000
168@@ -145,7 +145,8 @@
169
170 self.assertTrue(message_store.is_pending(message_id))
171
172- self.assertMessages(message_store.get_pending_messages(),
173+ self.assertMessages(
174+ message_store.get_pending_messages(),
175 [{"packages": [{"description": u"Description1",
176 "installed-size": 28672,
177 "name": u"name1",
178@@ -164,7 +165,7 @@
179 "summary": u"Summary1",
180 "type": 65537,
181 "version": u"version1-release1"}],
182- "request-id": request2.id,
183+ "request-id": request2.id,
184 "type": "add-packages"}])
185
186 deferred = self.reporter.handle_tasks()
187@@ -185,7 +186,8 @@
188 def got_result(result):
189 message = message_store.get_pending_messages()[0]
190 request2 = self.store.get_hash_id_request(message["request-id"])
191- self.assertMessages(message_store.get_pending_messages(),
192+ self.assertMessages(
193+ message_store.get_pending_messages(),
194 [{"packages": [{"description": u"Description1",
195 "installed-size": None,
196 "name": u"name1",
197@@ -195,7 +197,7 @@
198 "summary": u"Summary1",
199 "type": 65537,
200 "version": u"version1-release1"}],
201- "request-id": request2.id,
202+ "request-id": request2.id,
203 "type": "add-packages"}])
204
205 class FakePackage(object):
206@@ -239,9 +241,9 @@
207
208 def got_result(result):
209 self.assertMessages(message_store.get_pending_messages(), [])
210- self.assertEqual([request.id for request in
211- self.store.iter_hash_id_requests()],
212- [request_id])
213+ self.assertEqual(
214+ [request.id for request in self.store.iter_hash_id_requests()],
215+ [request_id])
216
217 result = self.reporter.handle_tasks()
218 self.assertFailure(result, Boom)
219@@ -391,7 +393,7 @@
220
221 # The failure should be properly logged
222 logging_mock = self.mocker.replace("logging.warning")
223- logging_mock("Couldn't determine which hash=>id database to use: "\
224+ logging_mock("Couldn't determine which hash=>id database to use: "
225 "unknown dpkg architecture")
226 self.mocker.result(None)
227
228@@ -1218,7 +1220,8 @@
229 result = self.reporter.run_apt_update()
230
231 def callback(ignore):
232- self.assertMessages(message_store.get_pending_messages(),
233+ self.assertMessages(
234+ message_store.get_pending_messages(),
235 [{"type": "package-reporter-result",
236 "code": 2, "err": u"error"}])
237 result.addCallback(callback)
238@@ -1247,7 +1250,8 @@
239 error = "There are no APT sources configured in %s or %s." % (
240 self.reporter.sources_list_filename,
241 self.reporter.sources_list_directory)
242- self.assertMessages(message_store.get_pending_messages(),
243+ self.assertMessages(
244+ message_store.get_pending_messages(),
245 [{"type": "package-reporter-result",
246 "code": 1, "err": error}])
247 result.addCallback(callback)
248@@ -1271,7 +1275,8 @@
249 result = self.reporter.run_apt_update()
250
251 def callback(ignore):
252- self.assertMessages(message_store.get_pending_messages(),
253+ self.assertMessages(
254+ message_store.get_pending_messages(),
255 [{"type": "package-reporter-result",
256 "code": 2, "err": u"error"}])
257 result.addCallback(callback)
258@@ -1294,7 +1299,8 @@
259 result = self.reporter.run_apt_update()
260
261 def callback(ignore):
262- self.assertMessages(message_store.get_pending_messages(),
263+ self.assertMessages(
264+ message_store.get_pending_messages(),
265 [{"type": "package-reporter-result",
266 "code": 0, "err": u"message"}])
267 result.addCallback(callback)
268@@ -1353,6 +1359,37 @@
269 reactor.callWhenRunning(do_test)
270 return deferred
271
272+ def test_config_apt_update_interval(self):
273+ """
274+ L{PackageReporter} uses the C{apt_update_interval} configuration
275+ parameter to check the age of the update stamp file.
276+ """
277+ self.config.apt_update_interval = 1234
278+ message_store = self.broker_service.message_store
279+ message_store.set_accepted_types(["package-reporter-result"])
280+ intervals = []
281+
282+ def apt_update_timeout_expired(interval):
283+ intervals.append(interval)
284+ return False
285+
286+ deferred = Deferred()
287+
288+ self.reporter._apt_sources_have_changed = lambda: False
289+ self.reporter._apt_update_timeout_expired = apt_update_timeout_expired
290+
291+ def do_test():
292+ result = self.reporter.run_apt_update()
293+
294+ def callback(ignore):
295+ self.assertMessages(message_store.get_pending_messages(), [])
296+ self.assertEqual([1234], intervals)
297+ result.addCallback(callback)
298+ result.chainDeferred(deferred)
299+
300+ reactor.callWhenRunning(do_test)
301+ return deferred
302+
303
304 class GlobalPackageReporterAptTest(LandscapeTest):
305
306
307=== modified file 'man/landscape-config.1'
308--- man/landscape-config.1 2012-09-27 18:52:37 +0000
309+++ man/landscape-config.1 2012-12-13 13:43:55 +0000
310@@ -1,5 +1,5 @@
311 .\"Text automatically generated by txt2man
312-.TH landscape-config 1 "27 September 2012" "" ""
313+.TH landscape-config 1 "13 December 2012" "" ""
314 .SH NAME
315 \fBlandscape-config \fP- configure the Landscape management client
316 \fB
317@@ -109,6 +109,10 @@
318 \fB--ping-url\fP=PING_URL
319 The URL to perform lightweight exchange initiation
320 with (default: 'http://landscape.canonical.com/ping').
321+\fB--package-monitor-interval\fP=PACKAGE_MONITOR_INTERVAL
322+The interval between apt update runs (default 1800).
323+\fB--apt-update-interval\fP=APT_UPDATE_INTERVAL
324+The interval between apt update runs (default 21600).
325 .TP
326 .B
327 \fB--http-proxy\fP=URL
328
329=== modified file 'man/landscape-config.txt'
330--- man/landscape-config.txt 2012-09-27 18:52:37 +0000
331+++ man/landscape-config.txt 2012-12-13 13:43:55 +0000
332@@ -48,6 +48,10 @@
333 --ping-interval=INTERVAL The number of seconds between pings (default: 30).
334 --ping-url=PING_URL The URL to perform lightweight exchange initiation
335 with (default: 'http://landscape.canonical.com/ping').
336+ --package-monitor-interval=PACKAGE_MONITOR_INTERVAL
337+ The interval between apt update runs (default 1800).
338+ --apt-update-interval=APT_UPDATE_INTERVAL
339+ The interval between apt update runs (default 21600).
340 --http-proxy=URL The URL of the HTTP proxy, if one is needed.
341 --https-proxy=URL The URL of the HTTPS proxy, if one is needed.
342 --cloud Set this if this computer is a cloud instance in

Subscribers

People subscribed via source and target branches

to all changes: