Merge lp:~bjornt/landscape-client/remove-smart-methods into lp:~landscape/landscape-client/trunk

Proposed by Björn Tillenius
Status: Merged
Approved by: Alberto Donato
Approved revision: 571
Merged at revision: 559
Proposed branch: lp:~bjornt/landscape-client/remove-smart-methods
Merge into: lp:~landscape/landscape-client/trunk
Prerequisite: lp:~bjornt/landscape-client/remove-apt-check
Diff against target: 532 lines (+33/-285)
7 files modified
landscape/package/changer.py (+8/-29)
landscape/package/facade.py (+0/-16)
landscape/package/reporter.py (+4/-55)
landscape/package/store.py (+0/-37)
landscape/package/tests/test_changer.py (+4/-9)
landscape/package/tests/test_reporter.py (+14/-36)
landscape/package/tests/test_store.py (+3/-103)
To merge this branch: bzr merge lp:~bjornt/landscape-client/remove-smart-methods
Reviewer Review Type Date Requested Status
Alberto Donato (community) Approve
Mike Milner (community) Approve
Review via email: mp+105285@code.launchpad.net

Description of the change

Remove methods that were smart-specific. I removed AptFacade.deinit() as
well as all methods dealing with package locks, including the ones in
the package store. Basically only removals, although I did resurrect an
assert in test_resynchronize, which required some changes in that test
to make it work (it was using a not-installed package for the one being
locked, which isn't possible with apt)

To post a comment you must log in.
Revision history for this message
Mike Milner (milner) wrote :

Looks good, +1

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

Great, +1!

#1:
+ for table in ["locked"]:

no need for the loop anymore

review: Approve
572. By Björn Tillenius

Remove for-loop.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'landscape/package/changer.py'
2--- landscape/package/changer.py 2012-05-08 01:09:17 +0000
3+++ landscape/package/changer.py 2012-05-16 08:19:20 +0000
4@@ -18,7 +18,7 @@
5 from landscape.package.taskhandler import (
6 PackageTaskHandler, PackageTaskHandlerConfiguration, PackageTaskError,
7 run_task_handler)
8-from landscape.manager.manager import FAILED, SUCCEEDED
9+from landscape.manager.manager import FAILED
10
11
12 class UnknownPackageData(Exception):
13@@ -80,10 +80,6 @@
14 # Nothing was done
15 return
16
17- # In order to let the reporter run smart-update cleanly,
18- # we have to deinitialize Smart, so that the write lock
19- # gets released
20- self._facade.deinit()
21 if os.getuid() == 0:
22 os.setgid(grp.getgrnam("landscape").gr_gid)
23 os.setuid(pwd.getpwnam("landscape").pw_uid)
24@@ -294,32 +290,15 @@
25 def handle_change_package_locks(self, message):
26 """Handle a C{change-package-locks} message.
27
28- Create and delete package locks as requested by the given C{message}.
29+ Package locks aren't supported anymore.
30 """
31
32- if not self._facade.supports_package_locks:
33- response = {
34- "type": "operation-result",
35- "operation-id": message.get("operation-id"),
36- "status": FAILED,
37- "result-text": "This client doesn't support package locks.",
38- "result-code": 1}
39- return self._broker.send_message(response, True)
40-
41- for lock in message.get("create", ()):
42- self._facade.set_package_lock(*lock)
43- for lock in message.get("delete", ()):
44- self._facade.remove_package_lock(*lock)
45- self._facade.save_config()
46-
47- response = {"type": "operation-result",
48- "operation-id": message.get("operation-id"),
49- "status": SUCCEEDED,
50- "result-text": "Package locks successfully changed.",
51- "result-code": 0}
52-
53- logging.info("Queuing message with change package locks results to "
54- "exchange urgently.")
55+ response = {
56+ "type": "operation-result",
57+ "operation-id": message.get("operation-id"),
58+ "status": FAILED,
59+ "result-text": "This client doesn't support package locks.",
60+ "result-code": 1}
61 return self._broker.send_message(response, True)
62
63 @staticmethod
64
65=== modified file 'landscape/package/facade.py'
66--- landscape/package/facade.py 2012-05-08 23:21:07 +0000
67+++ landscape/package/facade.py 2012-05-16 08:19:20 +0000
68@@ -89,8 +89,6 @@
69 database.
70 """
71
72- supports_package_holds = True
73- supports_package_locks = False
74 _dpkg_status = "/var/lib/dpkg/status"
75
76 def __init__(self, root=None):
77@@ -133,9 +131,6 @@
78 os.makedirs(full_path)
79 return full_path
80
81- def deinit(self):
82- """This method exists solely to be compatible with C{SmartFacade}."""
83-
84 def get_packages(self):
85 """Get all the packages available in the channels."""
86 return self._hash2pkg.itervalues()
87@@ -150,17 +145,6 @@
88 if (self.is_package_installed(version)
89 and self._is_package_held(version.package))]
90
91- def get_package_locks(self):
92- """Return all set package locks.
93-
94- @return: A C{list} of ternary tuples, contaning the name, relation
95- and version details for each lock currently set on the system.
96-
97- XXX: This method isn't implemented yet. It's here to make the
98- transition to Apt in the package reporter easier.
99- """
100- return []
101-
102 def get_package_holds(self):
103 """Return the name of all the packages that are on hold."""
104 return [version.package.name for version in self.get_locked_packages()]
105
106=== modified file 'landscape/package/reporter.py'
107--- landscape/package/reporter.py 2012-05-08 01:24:21 +0000
108+++ landscape/package/reporter.py 2012-05-16 08:19:20 +0000
109@@ -278,7 +278,6 @@
110 self._store.clear_available_upgrades()
111 self._store.clear_installed()
112 self._store.clear_locked()
113- self._store.clear_package_locks()
114
115 # Don't clear the hash_id_requests table because the messages
116 # associated with the existing requests might still have to be
117@@ -421,16 +420,13 @@
118 reactor.
119 """
120
121- def changes_detected(results):
122- # Release all smart locks, in case the changer runs after us.
123- self._facade.deinit()
124- if True in results:
125+ def changes_detected(result):
126+ if result:
127 # Something has changed, notify the broker.
128 return self._broker.fire_event("package-data-changed")
129
130- result = gather_results([self.detect_packages_changes(),
131- self.detect_package_locks_changes()])
132- return result.addCallback(changes_detected)
133+ deferred = self.detect_packages_changes()
134+ return deferred.addCallback(changes_detected)
135
136 def detect_packages_changes(self):
137 """Detect changes in the universe of known packages.
138@@ -564,53 +560,6 @@
139
140 return result
141
142- def detect_package_locks_changes(self):
143- """Detect changes in known package locks.
144-
145- This method will verify if there are package locks that:
146-
147- - are now set, and were not;
148- - were previously set but are not anymore;
149-
150- In all cases, the server is notified of the new situation
151- with a "packages" message.
152-
153- @return: A deferred resulting in C{True} if package lock changes were
154- detected with respect to the previous run, or C{False} otherwise.
155- """
156- old_package_locks = set(self._store.get_package_locks())
157- current_package_locks = set(self._facade.get_package_locks())
158-
159- set_package_locks = current_package_locks - old_package_locks
160- unset_package_locks = old_package_locks - current_package_locks
161-
162- message = {}
163- if set_package_locks:
164- message["created"] = sorted(set_package_locks)
165- if unset_package_locks:
166- message["deleted"] = sorted(unset_package_locks)
167-
168- if not message:
169- return succeed(False)
170-
171- message["type"] = "package-locks"
172- result = self.send_message(message)
173-
174- logging.info("Queuing message with changes in known package locks:"
175- " %d created, %d deleted." %
176- (len(set_package_locks), len(unset_package_locks)))
177-
178- def update_currently_known(result):
179- if set_package_locks:
180- self._store.add_package_locks(set_package_locks)
181- if unset_package_locks:
182- self._store.remove_package_locks(unset_package_locks)
183- return True
184-
185- result.addCallback(update_currently_known)
186-
187- return result
188-
189
190 class FakeGlobalReporter(PackageReporter):
191 """
192
193=== modified file 'landscape/package/store.py'
194--- landscape/package/store.py 2011-08-19 14:07:05 +0000
195+++ landscape/package/store.py 2012-05-16 08:19:20 +0000
196@@ -249,40 +249,6 @@
197 cursor.execute("DELETE FROM locked")
198
199 @with_cursor
200- def get_package_locks(self, cursor):
201- """Get all package locks."""
202- cursor.execute("SELECT name, relation, version FROM package_locks")
203- return [(row[0], row[1], row[2]) for row in cursor.fetchall()]
204-
205- @with_cursor
206- def add_package_locks(self, cursor, locks):
207- """Add a list of package locks to the store.
208-
209- @param locks: A C{list} of ternary tuples each one contains the
210- name, the relation and the version of the package lock to be added.
211- """
212- for name, relation, version in locks:
213- cursor.execute("REPLACE INTO package_locks VALUES (?, ?, ?)",
214- (name, relation or "", version or "",))
215-
216- @with_cursor
217- def remove_package_locks(self, cursor, locks):
218- """Remove a list of package locks from the store.
219-
220- @param locks: A C{list} of ternary tuples each one contains the name,
221- the relation and the version of the package lock to be removed.
222- """
223- for name, relation, version in locks:
224- cursor.execute("DELETE FROM package_locks WHERE name=? AND "
225- "relation=? AND version=?",
226- (name, relation or "", version or ""))
227-
228- @with_cursor
229- def clear_package_locks(self, cursor):
230- """Remove all package locks."""
231- cursor.execute("DELETE FROM package_locks")
232-
233- @with_cursor
234 def add_hash_id_request(self, cursor, hashes):
235 hashes = list(hashes)
236 cursor.execute("INSERT INTO hash_id_request (hashes, timestamp)"
237@@ -458,9 +424,6 @@
238 # try block.
239 cursor = db.cursor()
240 try:
241- cursor.execute("CREATE TABLE package_locks"
242- " (name TEXT NOT NULL, relation TEXT, version TEXT,"
243- " UNIQUE(name, relation, version))")
244 cursor.execute("CREATE TABLE locked"
245 " (id INTEGER PRIMARY KEY)")
246 cursor.execute("CREATE TABLE available"
247
248=== modified file 'landscape/package/tests/test_changer.py'
249--- landscape/package/tests/test_changer.py 2012-05-08 23:21:07 +0000
250+++ landscape/package/tests/test_changer.py 2012-05-16 08:19:20 +0000
251@@ -632,8 +632,7 @@
252 """
253 After the package changer has run, we want the package-reporter to run
254 to report the recent changes. If we're running as root, we want to
255- change to the "landscape" user and "landscape" group. We also want to
256- deinitialize Smart to let the reporter run smart-update cleanly.
257+ change to the "landscape" user and "landscape" group.
258 """
259
260 # We are running as root
261@@ -644,10 +643,6 @@
262 # The order matters (first smart then gid and finally uid)
263 self.mocker.order()
264
265- # Deinitialize smart
266- facade_mock = self.mocker.patch(self.facade)
267- facade_mock.deinit()
268-
269 # We want to return a known gid
270 grnam_mock = self.mocker.replace("grp.getgrnam")
271 grnam_mock("landscape")
272@@ -1328,9 +1323,9 @@
273
274 def test_change_package_locks(self):
275 """
276- If C{AptFacade} is used, the L{PackageChanger.handle_tasks}
277- method fails the activity, since it can't add or remove locks because
278- apt doesn't support this.
279+ The L{PackageChanger.handle_tasks} method fails
280+ change-package-locks activities, since it can't add or remove
281+ locks because apt doesn't support this.
282 """
283 self.store.add_task("changer", {"type": "change-package-locks",
284 "create": [("foo", ">=", "1.0")],
285
286=== modified file 'landscape/package/tests/test_reporter.py'
287--- landscape/package/tests/test_reporter.py 2012-05-08 23:21:07 +0000
288+++ landscape/package/tests/test_reporter.py 2012-05-16 08:19:20 +0000
289@@ -892,20 +892,13 @@
290 result = self.reporter.detect_packages_changes()
291 return result.addCallback(got_result)
292
293- def test_detect_changes_considers_packages_and_locks_changes(self):
294+ def test_detect_changes_considers_packages_changes(self):
295 """
296- The L{PackageReporter.detect_changes} method considers both package and
297- package locks changes. It also releases smart locks by calling the
298- L{SmartFacade.deinit} method.
299+ The L{PackageReporter.detect_changes} method package changes.
300 """
301 reporter_mock = self.mocker.patch(self.reporter)
302 reporter_mock.detect_packages_changes()
303 self.mocker.result(succeed(True))
304- reporter_mock.detect_package_locks_changes()
305- self.mocker.result(succeed(True))
306-
307- facade_mock = self.mocker.patch(self.facade)
308- facade_mock.deinit()
309
310 self.mocker.replay()
311 return self.reporter.detect_changes()
312@@ -918,8 +911,6 @@
313 """
314 reporter_mock = self.mocker.patch(self.reporter)
315 reporter_mock.detect_packages_changes()
316- self.mocker.result(succeed(False))
317- reporter_mock.detect_package_locks_changes()
318 self.mocker.result(succeed(True))
319 callback = self.mocker.mock()
320 callback()
321@@ -1001,16 +992,19 @@
322 This is done in the reporter so that we know it happens when
323 no other reporter is possibly running at the same time.
324 """
325+ self._add_system_package("foo")
326+ self.facade.reload_channels()
327+ [foo] = self.facade.get_packages_by_name("foo")
328+ foo_hash = self.facade.get_package_hash(foo)
329+ self.facade.set_package_hold(foo)
330+ self.facade.reload_channels()
331 message_store = self.broker_service.message_store
332 message_store.set_accepted_types(["package-locks"])
333- self.store.set_hash_ids({HASH1: 3, HASH2: 4})
334+ self.store.set_hash_ids({foo_hash: 3, HASH2: 4})
335 self.store.add_available([1])
336 self.store.add_available_upgrades([2])
337 self.store.add_installed([2])
338 self.store.add_locked([3])
339- self.store.add_package_locks([("name1", None, None)])
340- if self.facade.supports_package_locks:
341- self.facade.set_package_lock("name1")
342 request1 = self.store.add_hash_id_request(["hash3"])
343 request2 = self.store.add_hash_id_request(["hash4"])
344
345@@ -1023,12 +1017,6 @@
346 self.assertEqual(self.store.get_available_upgrades(), [2])
347 self.assertEqual(self.store.get_available(), [1])
348 self.assertEqual(self.store.get_installed(), [2])
349- # XXX: Don't check get_locked() and get_package_locks() until
350- # package locks are implemented in AptFacade.
351- if not isinstance(self.facade, AptFacade):
352- self.assertEqual(self.store.get_locked(), [3])
353- self.assertEqual(
354- self.store.get_package_locks(), [("name1", "", "")])
355 self.assertEqual(self.store.get_hash_id_request(request1.id).id,
356 request1.id)
357
358@@ -1039,7 +1027,7 @@
359 def check_result(result):
360
361 # The hashes should not go away.
362- hash1 = self.store.get_hash_id(HASH1)
363+ hash1 = self.store.get_hash_id(foo_hash)
364 hash2 = self.store.get_hash_id(HASH2)
365 self.assertEqual([hash1, hash2], [3, 4])
366
367@@ -1048,12 +1036,9 @@
368
369 # After running the resychronize task, detect_packages_changes is
370 # called, and the existing known hashes are made available.
371- self.assertEqual(self.store.get_available(), [3, 4])
372- self.assertEqual(self.store.get_installed(), [])
373- # XXX: Don't check get_locked() until package locks are
374- # implemented in AptFacade.
375- if not isinstance(self.facade, AptFacade):
376- self.assertEqual(self.store.get_locked(), [3])
377+ self.assertEqual(self.store.get_available(), [4])
378+ self.assertEqual(self.store.get_installed(), [3])
379+ self.assertEqual(self.store.get_locked(), [3])
380
381 # The two original hash id requests should be still there, and
382 # a new hash id request should also be detected for HASH3.
383@@ -1066,18 +1051,11 @@
384 elif request.id == request2.id:
385 self.assertEqual(request.hashes, ["hash4"])
386 elif not new_request_found:
387- self.assertEqual(request.hashes, [HASH3])
388+ self.assertEqual(request.hashes, [HASH3, HASH1])
389 else:
390 self.fail("Unexpected hash-id request!")
391 self.assertEqual(requests_count, 3)
392
393- # XXX: Don't check for package-locks messages until package
394- # locks are implemented in AptFacade.
395- if not isinstance(self.facade, AptFacade):
396- self.assertMessages(message_store.get_pending_messages(),
397- [{"type": "package-locks",
398- "created": [("name1", "", "")]}])
399-
400 deferred.addCallback(check_result)
401 return deferred
402
403
404=== modified file 'landscape/package/tests/test_store.py'
405--- landscape/package/tests/test_store.py 2011-07-06 21:11:43 +0000
406+++ landscape/package/tests/test_store.py 2012-05-16 08:19:20 +0000
407@@ -1,6 +1,5 @@
408 import threading
409 import time
410-import sys
411
412 import sqlite3
413 from landscape.tests.helpers import LandscapeTest
414@@ -356,11 +355,9 @@
415
416 database = sqlite3.connect(filename)
417 cursor = database.cursor()
418- for table in ["package_locks", "locked"]:
419- query = "pragma table_info(%s)" % table
420- cursor.execute(query)
421- result = cursor.fetchall()
422- self.assertTrue(len(result) > 0)
423+ cursor.execute("pragma table_info(locked)")
424+ result = cursor.fetchall()
425+ self.assertTrue(len(result) > 0)
426
427 def test_add_and_get_locked(self):
428 """
429@@ -401,103 +398,6 @@
430 self.store1.clear_locked()
431 self.assertEqual(self.store2.get_locked(), [])
432
433- def test_get_package_locks_with_no_lock(self):
434- """
435- L{PackageStore.get_package_locks} returns an empty list if no package
436- locks are stored.
437- """
438- self.assertEqual(self.store1.get_package_locks(), [])
439-
440- def test_add_package_locks(self):
441- """
442- L{PackageStore.add_package_locks} adds a package lock to the store.
443- """
444- self.store1.add_package_locks([("name", "", "")])
445- self.assertEqual(self.store2.get_package_locks(),
446- [("name", "", "")])
447-
448- def test_add_package_locks_idempotence(self):
449- """
450- The operation of adding a lock is idempotent.
451- """
452- self.store1.add_package_locks([("name", "", "")])
453- self.store1.add_package_locks([("name", "", "")])
454- self.assertEqual(self.store2.get_package_locks(),
455- [("name", "", "")])
456-
457- def test_add_package_locks_with_none(self):
458- """
459- If None, package locks relation and version values are automatically
460- converted to empty strings.
461- """
462- self.store1.add_package_locks([("name", None, None)])
463- self.assertEqual(self.store2.get_package_locks(),
464- [("name", "", "")])
465-
466- def test_add_package_locks_multiple_times(self):
467- """
468- L{PackageStore.add_package_locks} can be called multiple times and
469- with multiple locks each time.
470- """
471- self.store1.add_package_locks([("name1", "", "")])
472- self.store1.add_package_locks([("name2", "<", "0.2"),
473- ("name3", "", "")])
474- self.assertEqual(sorted(self.store2.get_package_locks()),
475- sorted([("name1", "", ""),
476- ("name2", "<", "0.2"),
477- ("name3", "", "")]))
478-
479- def test_add_package_locks_without_name(self):
480- """
481- It's not possible to add a package lock without a name.
482- """
483- if sys.version_info >= (2, 5):
484- sqlite_error = sqlite3.IntegrityError
485- else:
486- sqlite_error = sqlite3.OperationalError
487- self.assertRaises(sqlite_error,
488- self.store1.add_package_locks,
489- [(None, None, None)])
490-
491- def test_remove_package_locks(self):
492- """
493- L{PackageStore.remove_package_locks} removes a package lock from
494- the store.
495- """
496- self.store1.add_package_locks([("name1", "", "")])
497- self.store1.remove_package_locks([("name1", "", "")])
498- self.assertEqual(self.store2.get_package_locks(), [])
499-
500- def test_remove_package_locks_multiple_times(self):
501- """
502- L{PackageStore.remove_package_locks} can be called multiple times and
503- with multiple locks each time.
504- """
505- self.store1.add_package_locks([("name1", "", ""),
506- ("name2", "<", "0.2"),
507- ("name3", "", "")])
508- self.store1.remove_package_locks([("name1", "", "")])
509- self.store1.remove_package_locks([("name2", "<", "0.2"),
510- ("name3", "", "")])
511- self.assertEqual(self.store2.get_package_locks(), [])
512-
513- def test_remove_package_locks_without_matching_lock(self):
514- """
515- It's fine to remove a non-existent lock.
516- """
517- self.store1.remove_package_locks([("name", "", "")])
518- self.assertEqual(self.store2.get_package_locks(), [])
519-
520- def test_clear_package_locks(self):
521- """
522- L{PackageStore.clear_package_locks} removes all package locks
523- from the store.
524- """
525- self.store1.add_package_locks([("name1", "", ""),
526- ("name2", "<", "0.2")])
527- self.store1.clear_package_locks()
528- self.assertEqual(self.store2.get_package_locks(), [])
529-
530 def test_add_hash_id_request(self):
531 hashes = ("ha\x00sh1", "ha\x00sh2")
532 request1 = self.store1.add_hash_id_request(hashes)

Subscribers

People subscribed via source and target branches

to all changes: