Merge lp:~ubuntu-cdimage/ubuntu-cdimage/focal into lp:ubuntu-cdimage

Proposed by Iain Lane on 2020-06-24
Status: Merged
Approved by: Steve Langasek on 2020-06-26
Approved revision: 1878
Merged at revision: 1879
Proposed branch: lp:~ubuntu-cdimage/ubuntu-cdimage/focal
Merge into: lp:ubuntu-cdimage
Diff against target: 310 lines (+58/-53)
6 files modified
lib/cdimage/launchpad.py (+14/-1)
lib/cdimage/sign.py (+9/-9)
lib/cdimage/tests/test_checksums.py (+2/-1)
lib/cdimage/tests/test_sign.py (+14/-17)
lib/cdimage/tests/test_tree.py (+17/-17)
lib/cdimage/tree.py (+2/-8)
To merge this branch: bzr merge lp:~ubuntu-cdimage/ubuntu-cdimage/focal
Reviewer Review Type Date Requested Status
Steve Langasek 2020-06-24 Approve on 2020-06-26
Review via email: mp+386317@code.launchpad.net

Description of the change

Various fixes to make cdimage work on focal (ancientminister, new cdimage host). I tried to retain compatibility with xenial (nusakan) - the changes have been tested there in isolation but I've not actually pulled an updated cdimage to test them end-to-end.

Mainly launchpadlib, gpg and bittorrent-related changes.

I could split this up into logical MPs if you want (but bzr...).

To post a comment you must log in.
Iain Lane (laney) wrote :
Steve Langasek (vorlon) wrote :

when you say they depend on each other, do you mean that they need to land together in order to not break builds on nusakan?

Steve Langasek (vorlon) :
review: Needs Fixing
Iain Lane (laney) wrote :

Nah, that's not the best wording. It's more that they both need to land to work on focal.

Iain Lane (laney) :
Steve Langasek (vorlon) wrote :

ok, lgtm then

review: Approve
1879. By Iain Lane on 2020-06-29

sign: Drop privkeydir in _signing_command(), it's unused there

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/cdimage/launchpad.py'
2--- lib/cdimage/launchpad.py 2019-01-11 17:45:45 +0000
3+++ lib/cdimage/launchpad.py 2020-06-29 11:27:35 +0000
4@@ -148,7 +148,20 @@
5
6
7 def login(instance):
8- return Launchpad.login_with("ubuntu-cdimage", instance, version="devel")
9+ try:
10+ import launchpadlib.credentials
11+ store = launchpadlib.credentials.KeyringCredentialStore(None,
12+ fallback=True)
13+ return Launchpad.login_with("ubuntu-cdimage",
14+ instance,
15+ version="devel",
16+ credential_store=store)
17+ except TypeError:
18+ # prior to focal (1.10.13), the fallback= kwarg didn't exist and
19+ # Launchpadlib worked under sudo
20+ return Launchpad.login_with("ubuntu-cdimage",
21+ instance,
22+ version="devel")
23
24
25 class _LaunchpadCache:
26
27=== modified file 'lib/cdimage/sign.py'
28--- lib/cdimage/sign.py 2015-11-11 20:06:02 +0000
29+++ lib/cdimage/sign.py 2020-06-29 11:27:35 +0000
30@@ -23,30 +23,30 @@
31
32
33 def _gnupg_files(config):
34+ gpgdir = config["GNUPG_DIR"]
35 gpgconf = os.path.join(config["GNUPG_DIR"], "gpg.conf")
36 secring = os.path.join(config["GNUPG_DIR"], "secring.gpg")
37+ privkeydir = os.path.join(config["GNUPG_DIR"], "private-keys-v1.d")
38 pubring = os.path.join(config["GNUPG_DIR"], "pubring.gpg")
39 trustdb = os.path.join(config["GNUPG_DIR"], "trustdb.gpg")
40- return gpgconf, secring, pubring, trustdb
41+ return gpgdir, gpgconf, secring, privkeydir, pubring, trustdb
42
43
44 def can_sign(config):
45- gpgconf, secring, pubring, trustdb = _gnupg_files(config)
46- if (not os.path.exists(secring) or not os.path.exists(pubring) or
47- not os.path.exists(trustdb) or not config["SIGNING_KEYID"]):
48+ _, _, secring, privkeydir, pubring, trustdb = _gnupg_files(config)
49+ if (not (os.path.exists(privkeydir) or os.path.exists(secring)) or
50+ not os.path.exists(pubring) or not os.path.exists(trustdb) or
51+ not config["SIGNING_KEYID"]):
52 logger.warning("No keys found; not signing images.")
53 return False
54 return True
55
56
57 def _signing_command(config):
58- gpgconf, secring, pubring, trustdb = _gnupg_files(config)
59+ gpgdir, gpgconf, _, _, _, _ = _gnupg_files(config)
60 cmd = [
61 "gpg", "--options", gpgconf,
62- "--no-default-keyring",
63- "--secret-keyring", secring,
64- "--keyring", pubring,
65- "--trustdb-name", trustdb,
66+ "--homedir", gpgdir,
67 "--no-options", "--batch", "--no-tty",
68 "--armour", "--detach-sign",
69 # FBB75451 and EFE21092 have different digest preferences. GnuPG
70
71=== modified file 'lib/cdimage/tests/test_checksums.py'
72--- lib/cdimage/tests/test_checksums.py 2020-06-17 00:21:41 +0000
73+++ lib/cdimage/tests/test_checksums.py 2020-06-29 11:27:35 +0000
74@@ -88,7 +88,8 @@
75 checksum_file = ChecksumFile(
76 self.config, self.temp_dir, "SHA256SUMS", hashlib.sha256)
77 self.assertEqual(
78- hashlib.sha256(data).hexdigest(), checksum_file.checksum(entry_path))
79+ hashlib.sha256(data).hexdigest(),
80+ checksum_file.checksum(entry_path))
81
82 def test_add(self):
83 entry_path = os.path.join(self.temp_dir, "entry")
84
85=== modified file 'lib/cdimage/tests/test_sign.py'
86--- lib/cdimage/tests/test_sign.py 2015-11-11 20:06:02 +0000
87+++ lib/cdimage/tests/test_sign.py 2020-06-29 11:27:35 +0000
88@@ -34,9 +34,12 @@
89 def test_gnupg_files(self):
90 config = Config(read=False)
91 config["GNUPG_DIR"] = "/path"
92- gpgconf, secring, pubring, trustdb = _gnupg_files(config)
93+ gpgdir, gpgconf, secring, privkeydir, pubring, trustdb = \
94+ _gnupg_files(config)
95+ self.assertEqual("/path", gpgdir)
96 self.assertEqual("/path/gpg.conf", gpgconf)
97 self.assertEqual("/path/secring.gpg", secring)
98+ self.assertEqual("/path/private-keys-v1.d", privkeydir)
99 self.assertEqual("/path/pubring.gpg", pubring)
100 self.assertEqual("/path/trustdb.gpg", trustdb)
101
102@@ -47,10 +50,7 @@
103 command = _signing_command(config)
104 self.assertEqual([
105 "gpg", "--options", "/path/gpg.conf",
106- "--no-default-keyring",
107- "--secret-keyring", "/path/secring.gpg",
108- "--keyring", "/path/pubring.gpg",
109- "--trustdb-name", "/path/trustdb.gpg",
110+ "--homedir", "/path",
111 "--no-options", "--batch", "--no-tty",
112 "--armour", "--detach-sign",
113 "--digest-algo", "SHA512",
114@@ -64,10 +64,7 @@
115 command = _signing_command(config)
116 self.assertEqual([
117 "gpg", "--options", "/path/gpg.conf",
118- "--no-default-keyring",
119- "--secret-keyring", "/path/secring.gpg",
120- "--keyring", "/path/pubring.gpg",
121- "--trustdb-name", "/path/trustdb.gpg",
122+ "--homedir", "/path",
123 "--no-options", "--batch", "--no-tty",
124 "--armour", "--detach-sign",
125 "--digest-algo", "SHA512",
126@@ -97,7 +94,8 @@
127 config = Config(read=False)
128 config["GNUPG_DIR"] = self.use_temp_dir()
129 config["SIGNING_KEYID"] = "01234567"
130- gpgconf, secring, pubring, trustdb = _gnupg_files(config)
131+ gpgdir, gpgconf, secring, privkeydir, pubring, trustdb = \
132+ _gnupg_files(config)
133 sign_path = os.path.join(self.temp_dir, "to-sign")
134 for path in gpgconf, secring, pubring, trustdb, sign_path:
135 touch(path)
136@@ -106,10 +104,7 @@
137 self.assertLogEqual([])
138 expected_command = [
139 "gpg", "--options", gpgconf,
140- "--no-default-keyring",
141- "--secret-keyring", secring,
142- "--keyring", pubring,
143- "--trustdb-name", trustdb,
144+ "--homedir", config["GNUPG_DIR"],
145 "--no-options", "--batch", "--no-tty",
146 "--armour", "--detach-sign",
147 "--digest-algo", "SHA512",
148@@ -127,13 +122,15 @@
149 config = Config(read=False)
150 config["GNUPG_DIR"] = self.use_temp_dir()
151 config["SIGNING_KEYID"] = "01234567"
152- gpgconf, secring, pubring, trustdb = _gnupg_files(config)
153+ gpgdir, gpgconf, secring, privkeydir, pubring, trustdb = \
154+ _gnupg_files(config)
155 sign_path = os.path.join(self.temp_dir, "to-sign")
156 for path in gpgconf, secring, pubring, trustdb, sign_path:
157 touch(path)
158 touch("%s.gpg" % sign_path)
159 self.capture_logging()
160- self.assertRaises(
161- subprocess.CalledProcessError, sign_cdimage, config, sign_path)
162+ with self.assertRaises(subprocess.CalledProcessError):
163+ sign_cdimage(config, sign_path)
164+ mock_check_call.assert_called()
165 self.assertLogEqual([])
166 self.assertFalse(os.path.exists("%s.gpg" % sign_path))
167
168=== modified file 'lib/cdimage/tests/test_tree.py'
169--- lib/cdimage/tests/test_tree.py 2020-06-19 00:57:47 +0000
170+++ lib/cdimage/tests/test_tree.py 2020-06-29 11:27:35 +0000
171@@ -2293,8 +2293,8 @@
172 "preinstalled-netbook"))
173
174
175-def call_btmakemetafile_zsyncmake(command, *args, **kwargs):
176- if command[0] == "btmakemetafile":
177+def call_mktorrent_zsyncmake(command, *args, **kwargs):
178+ if command[0] == "mktorrent":
179 touch("%s.torrent" % command[-1])
180 elif command[0] == "zsyncmake":
181 for i in range(1, len(command)):
182@@ -2396,7 +2396,7 @@
183 self.assertLogEqual(
184 ["Creating torrent for %s ..." % path for path in paths])
185 command_base = [
186- "btmakemetafile", "https://torrent.ubuntu.com/announce",
187+ "mktorrent", "-a", "https://torrent.ubuntu.com/announce",
188 "--comment", "Ubuntu CD cdimage.ubuntu.com",
189 ]
190 mock_check_call.assert_has_calls([
191@@ -2417,7 +2417,7 @@
192 self.get_publisher(official="named").publish_release_prefixes())
193
194 @mock.patch("cdimage.osextras.find_on_path", return_value=True)
195- @mock.patch("subprocess.call", side_effect=call_btmakemetafile_zsyncmake)
196+ @mock.patch("subprocess.call", side_effect=call_mktorrent_zsyncmake)
197 def test_publish_release_arch_ubuntu_desktop_named(self, mock_call, *args):
198 self.config["PROJECT"] = "ubuntu"
199 self.config["CAPPROJECT"] = "Ubuntu"
200@@ -2461,7 +2461,7 @@
201 "%s.iso" % target_base,
202 ]),
203 mock.call([
204- "btmakemetafile", mock.ANY,
205+ "mktorrent", mock.ANY, mock.ANY,
206 "--comment", "Ubuntu CD cdimage.ubuntu.com",
207 "%s.iso" % target_base,
208 ], stdout=mock.ANY),
209@@ -2479,7 +2479,7 @@
210 os.stat("%s.iso.torrent" % torrent_base))
211
212 @mock.patch("cdimage.osextras.find_on_path", return_value=True)
213- @mock.patch("subprocess.call", side_effect=call_btmakemetafile_zsyncmake)
214+ @mock.patch("subprocess.call", side_effect=call_mktorrent_zsyncmake)
215 def test_publish_release_arch_ubuntu_desktop_no(self, mock_call, *args):
216 self.config["PROJECT"] = "ubuntu"
217 self.config["CAPPROJECT"] = "Ubuntu"
218@@ -2512,7 +2512,7 @@
219 self.assertFalse(os.path.islink("%s.iso" % target_base))
220 self.assertFalse(os.path.islink("%s.manifest" % target_base))
221 mock_call.assert_called_once_with([
222- "btmakemetafile", mock.ANY,
223+ "mktorrent", mock.ANY, mock.ANY,
224 "--comment", "Ubuntu CD cdimage.ubuntu.com",
225 "%s.iso" % target_base,
226 ], stdout=mock.ANY)
227@@ -2527,7 +2527,7 @@
228 os.stat("%s.iso.torrent" % torrent_base))
229
230 @mock.patch("cdimage.osextras.find_on_path", return_value=True)
231- @mock.patch("subprocess.call", side_effect=call_btmakemetafile_zsyncmake)
232+ @mock.patch("subprocess.call", side_effect=call_mktorrent_zsyncmake)
233 def test_publish_release_kubuntu_desktop_named(self, mock_call, *args):
234 self.config["PROJECT"] = "kubuntu"
235 self.config["CAPPROJECT"] = "Kubuntu"
236@@ -2685,10 +2685,9 @@
237 publisher.make_torrents(
238 os.path.join(self.temp_dir, "dir"), "ubuntu-13.04")
239 command_base = [
240- "btmakemetafile", "https://torrent.ubuntu.com/announce",
241- "--announce_list",
242- ("https://torrent.ubuntu.com/announce|"
243- "https://ipv6.torrent.ubuntu.com/announce"),
244+ "mktorrent",
245+ "-a", "https://torrent.ubuntu.com/announce",
246+ "-a", "https://ipv6.torrent.ubuntu.com/announce",
247 "--comment", "Ubuntu CD releases.ubuntu.com",
248 ]
249 mock_check_call.assert_has_calls([
250@@ -2708,7 +2707,7 @@
251 self.get_publisher().publish_release_prefixes())
252
253 @mock.patch("cdimage.osextras.find_on_path", return_value=True)
254- @mock.patch("subprocess.call", side_effect=call_btmakemetafile_zsyncmake)
255+ @mock.patch("subprocess.call", side_effect=call_mktorrent_zsyncmake)
256 def test_publish_release_arch_ubuntu_desktop_yes(self, mock_call, *args):
257 self.config["PROJECT"] = "ubuntu"
258 self.config["CAPPROJECT"] = "Ubuntu"
259@@ -2766,8 +2765,9 @@
260 "%s.iso" % pool_base,
261 ]),
262 mock.call([
263- "btmakemetafile", mock.ANY,
264- "--announce_list", mock.ANY,
265+ "mktorrent",
266+ "-a", mock.ANY,
267+ "-a", mock.ANY,
268 "--comment", "Ubuntu CD releases.ubuntu.com",
269 "%s.iso" % target_base,
270 ], stdout=mock.ANY),
271@@ -2785,7 +2785,7 @@
272 os.stat("%s.iso.torrent" % torrent_base))
273
274 @mock.patch("cdimage.osextras.find_on_path", return_value=True)
275- @mock.patch("subprocess.call", side_effect=call_btmakemetafile_zsyncmake)
276+ @mock.patch("subprocess.call", side_effect=call_mktorrent_zsyncmake)
277 def test_publish_release_arch_ubuntu_desktop_poolonly(self, mock_call,
278 *args):
279 self.config["PROJECT"] = "ubuntu"
280@@ -2823,7 +2823,7 @@
281 ])
282
283 @mock.patch("cdimage.osextras.find_on_path", return_value=True)
284- @mock.patch("subprocess.call", side_effect=call_btmakemetafile_zsyncmake)
285+ @mock.patch("subprocess.call", side_effect=call_mktorrent_zsyncmake)
286 def test_publish_release_kubuntu_desktop_yes(self, mock_call, *args):
287 self.config["PROJECT"] = "kubuntu"
288 self.config["CAPPROJECT"] = "Kubuntu"
289
290=== modified file 'lib/cdimage/tree.py'
291--- lib/cdimage/tree.py 2020-06-19 00:57:47 +0000
292+++ lib/cdimage/tree.py 2020-06-29 11:27:35 +0000
293@@ -2971,15 +2971,9 @@
294 if not self.dry_run:
295 logger.info("Creating torrent for %s ..." % path)
296 osextras.unlink_force("%s.torrent" % path)
297- command = ["btmakemetafile", self.torrent_tracker]
298+ command = ["mktorrent", "-a", self.torrent_tracker]
299 if isinstance(self.tree, SimpleReleaseTree):
300- # N.B.: Only the bittornado version of btmakemetafile has
301- # the --announce_list flag.
302- command.extend([
303- "--announce_list",
304- "%s|%s" % (
305- self.torrent_tracker, self.ipv6_torrent_tracker),
306- ])
307+ command.extend(["-a", self.ipv6_torrent_tracker])
308 command.extend([
309 "--comment",
310 "%s CD %s" % (self.config.capproject, self.tree.site_name),

Subscribers

People subscribed via source and target branches