Merge lp:~bjornt/landscape-client/lxd-update-fail into lp:~landscape/landscape-client/trunk

Proposed by Björn Tillenius
Status: Merged
Approved by: Adam Collard
Approved revision: 961
Merged at revision: 962
Proposed branch: lp:~bjornt/landscape-client/lxd-update-fail
Merge into: lp:~landscape/landscape-client/trunk
Diff against target: 151 lines (+107/-0)
2 files modified
landscape/package/reporter.py (+19/-0)
landscape/package/tests/test_reporter.py (+88/-0)
To merge this branch: bzr merge lp:~bjornt/landscape-client/lxd-update-fail
Reviewer Review Type Date Requested Status
Alberto Donato (community) Approve
Adam Collard (community) Approve
🤖 Landscape Builder test results Approve
Review via email: mp+320213@code.launchpad.net

Commit message

Don't report packages that are coming from backports.

The reason for this is that backports are enabled by default from
xenial, but landscape doesn't handle that well, since we don't support
pinning properly.

If we report packages from backports, it means that Landscape will
upgrade to those version if you use an upgrade profile or select all
upgrades to their latest versions.

Description of the change

Don't report packages that are coming from backports.

The reason for this is that backports are enabled by default from
xenial, but landscape doesn't handle that well, since we don't support
pinning properly.

If we report packages from backports, it means that Landscape will
upgrade to those version if you use an upgrade profile or select all
upgrades to their latest versions.

Testing instructions:

   Use this branch for a xenial machine that has lxd installed
   Register it with Landscape
   Ensure that Landscape doesn't off to upgrade lxd to 2.8

To post a comment you must log in.
Revision history for this message
🤖 Landscape Builder (landscape-builder) :
review: Abstain (executing tests)
Revision history for this message
🤖 Landscape Builder (landscape-builder) wrote :

Command: TRIAL_ARGS=-j4 make check
Result: Success
Revno: 961
Branch: lp:~bjornt/landscape-client/lxd-update-fail
Jenkins: https://ci.lscape.net/job/latch-test-xenial/3638/

review: Approve (test results)
Revision history for this message
Adam Collard (adam-collard) wrote :

LGTM, +1. Thanks for the work on this!

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

Nice fix, +1

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'landscape/package/reporter.py'
--- landscape/package/reporter.py 2017-03-17 09:26:45 +0000
+++ landscape/package/reporter.py 2017-03-17 15:43:18 +0000
@@ -18,6 +18,7 @@
18from landscape.lib.twisted_util import gather_results, spawn_process18from landscape.lib.twisted_util import gather_results, spawn_process
19from landscape.lib.fetch import fetch_async19from landscape.lib.fetch import fetch_async
20from landscape.lib.fs import touch_file20from landscape.lib.fs import touch_file
21from landscape.lib.lsb_release import parse_lsb_release, LSB_RELEASE_FILENAME
2122
22from landscape.compat import convert_buffer_to_string23from landscape.compat import convert_buffer_to_string
23from landscape.package.taskhandler import (24from landscape.package.taskhandler import (
@@ -551,8 +552,26 @@
551 current_available = set()552 current_available = set()
552 current_upgrades = set()553 current_upgrades = set()
553 current_locked = set()554 current_locked = set()
555 lsb = parse_lsb_release(LSB_RELEASE_FILENAME)
556 backports_archive = "{}-backports".format(lsb["code-name"])
554557
555 for package in self._facade.get_packages():558 for package in self._facade.get_packages():
559 # Don't include package versions from the official backports
560 # archive. The backports archive is enabled by default since
561 # xenial with a pinning policy of 100. Ideally we would
562 # support pinning, but we don't yet. In the mean time, we
563 # ignore backports, so that packages don't get automatically
564 # upgraded to the backports version.
565 backport_origins = [
566 origin for origin in package.origins
567 if origin.archive == backports_archive]
568 if backport_origins and (
569 len(backport_origins) == len(package.origins)):
570 # Ignore the version if it's only in the official
571 # backports archive. If it's somewhere else as well,
572 # e.g. a PPA, we assume it was added manually and the
573 # user wants to get updates from it.
574 continue
556 hash = self._facade.get_package_hash(package)575 hash = self._facade.get_package_hash(package)
557 id = self._store.get_hash_id(hash)576 id = self._store.get_hash_id(hash)
558 if id is not None:577 if id is not None:
559578
=== modified file 'landscape/package/tests/test_reporter.py'
--- landscape/package/tests/test_reporter.py 2017-03-17 09:26:45 +0000
+++ landscape/package/tests/test_reporter.py 2017-03-17 15:43:18 +0000
@@ -3,6 +3,7 @@
3import time3import time
4import apt_pkg4import apt_pkg
5import mock5import mock
6import shutil
67
7from twisted.internet.defer import Deferred, succeed, fail, inlineCallbacks8from twisted.internet.defer import Deferred, succeed, fail, inlineCallbacks
8from twisted.internet import reactor9from twisted.internet import reactor
@@ -11,6 +12,7 @@
11from landscape.lib import bpickle12from landscape.lib import bpickle
12from landscape.lib.fs import create_text_file, touch_file13from landscape.lib.fs import create_text_file, touch_file
13from landscape.lib.fetch import FetchError14from landscape.lib.fetch import FetchError
15from landscape.lib.lsb_release import parse_lsb_release, LSB_RELEASE_FILENAME
14from landscape.package.store import (16from landscape.package.store import (
15 PackageStore, UnknownHashIDRequest, FakePackageStore)17 PackageStore, UnknownHashIDRequest, FakePackageStore)
16from landscape.package.reporter import (18from landscape.package.reporter import (
@@ -925,6 +927,92 @@
925 result = self.reporter.detect_packages_changes()927 result = self.reporter.detect_packages_changes()
926 return result.addCallback(got_result)928 return result.addCallback(got_result)
927929
930 def test_detect_packages_changes_with_backports(self):
931 """
932 Package versions coming from backports aren't considered to be
933 available.
934
935 This is because we don't support pinning, and the backports
936 archive is enabled by default since xenial.
937 """
938 message_store = self.broker_service.message_store
939 message_store.set_accepted_types(["packages"])
940
941 lsb = parse_lsb_release(LSB_RELEASE_FILENAME)
942 release_path = os.path.join(self.repository_dir, "Release")
943 with open(release_path, "w") as release:
944 release.write("Suite: {}-backports".format(lsb["code-name"]))
945
946 self.store.set_hash_ids({HASH1: 1, HASH2: 2, HASH3: 3})
947
948 def got_result(result):
949 self.assertMessages(message_store.get_pending_messages(), [])
950
951 self.assertEqual(sorted(self.store.get_available()), [])
952
953 result = self.reporter.detect_packages_changes()
954 return result.addCallback(got_result)
955
956 def test_detect_packages_changes_with_backports_others(self):
957 """
958 Packages coming from backport archives that aren't named like
959 the official backports archive are considered to be available.
960 """
961 message_store = self.broker_service.message_store
962 message_store.set_accepted_types(["packages"])
963
964 release_path = os.path.join(self.repository_dir, "Release")
965 with open(release_path, "w") as release:
966 release.write("Suite: my-personal-backports")
967
968 self.store.set_hash_ids({HASH1: 1, HASH2: 2, HASH3: 3})
969
970 def got_result(result):
971 self.assertMessages(message_store.get_pending_messages(),
972 [{"type": "packages", "available": [(1, 3)]}])
973
974 self.assertEqual(sorted(self.store.get_available()), [1, 2, 3])
975
976 result = self.reporter.detect_packages_changes()
977 return result.addCallback(got_result)
978
979 def test_detect_packages_changes_with_backports_both(self):
980 """
981 If a package is both in the official backports archive and in
982 some other archive (e.g. a PPA), the package is considered to be
983 available.
984
985 The reason for this is that if you have enabled a PPA, you most
986 likely want to get updates from it.
987 """
988 message_store = self.broker_service.message_store
989 message_store.set_accepted_types(["packages"])
990
991 temp_dir = self.makeDir()
992 other_backport_dir = os.path.join(temp_dir, "my-personal-backports")
993 shutil.copytree(self.repository_dir, other_backport_dir)
994 os.remove(os.path.join(other_backport_dir, "Packages"))
995 self.facade.add_channel_deb_dir(other_backport_dir)
996
997 lsb = parse_lsb_release(LSB_RELEASE_FILENAME)
998 official_release_path = os.path.join(self.repository_dir, "Release")
999 with open(official_release_path, "w") as release:
1000 release.write("Suite: {}-backports".format(lsb["code-name"]))
1001 unofficial_release_path = os.path.join(other_backport_dir, "Release")
1002 with open(unofficial_release_path, "w") as release:
1003 release.write("Suite: my-personal-backports")
1004
1005 self.store.set_hash_ids({HASH1: 1, HASH2: 2, HASH3: 3})
1006
1007 def got_result(result):
1008 self.assertMessages(message_store.get_pending_messages(),
1009 [{"type": "packages", "available": [(1, 3)]}])
1010
1011 self.assertEqual(sorted(self.store.get_available()), [1, 2, 3])
1012
1013 result = self.reporter.detect_packages_changes()
1014 return result.addCallback(got_result)
1015
928 @inlineCallbacks1016 @inlineCallbacks
929 def test_detect_packages_after_tasks(self):1017 def test_detect_packages_after_tasks(self):
930 """1018 """

Subscribers

People subscribed via source and target branches

to all changes: