Merge lp:~andrewjbeach/juju-release-tools/no-debs into lp:juju-release-tools
- no-debs
- Merge into trunk
Proposed by
Curtis Hovey
Status: | Merged |
---|---|
Merged at revision: | 364 |
Proposed branch: | lp:~andrewjbeach/juju-release-tools/no-debs |
Merge into: | lp:juju-release-tools |
Diff against target: |
371 lines (+41/-245) 3 files modified
generate_agents.py (+18/-144) tests/test_agent_archive.py (+0/-1) tests/test_generate_agents.py (+23/-100) |
To merge this branch: | bzr merge lp:~andrewjbeach/juju-release-tools/no-debs |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Juju Release Engineering | Pending | ||
Review via email: mp+315569@code.launchpad.net |
Commit message
Description of the change
Do not make agents from deb.
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'generate_agents.py' |
2 | --- generate_agents.py 2016-12-02 17:00:50 +0000 |
3 | +++ generate_agents.py 2017-01-25 14:33:53 +0000 |
4 | @@ -4,87 +4,21 @@ |
5 | from argparse import ( |
6 | ArgumentParser, |
7 | ) |
8 | -from collections import namedtuple |
9 | from datetime import datetime |
10 | import errno |
11 | -import glob |
12 | import os |
13 | -import re |
14 | import shutil |
15 | import subprocess |
16 | import sys |
17 | -import tarfile |
18 | -from urlparse import ( |
19 | - urlsplit, |
20 | - urlunsplit, |
21 | - ) |
22 | - |
23 | -from debian import deb822 |
24 | |
25 | from agent_archive import parse_args as parse_archive_args |
26 | -from build_package import juju_series |
27 | from make_agent_json import StanzaWriter |
28 | -from utils import temp_dir |
29 | - |
30 | - |
31 | -class NoDebsFound(Exception): |
32 | - """Raised when no .deb files could be found.""" |
33 | - |
34 | - |
35 | -# These are the archives that are searched for matching releases. |
36 | -UBUNTU_ARCH = "http://archive.ubuntu.com/ubuntu/pool/universe/j/juju-core/" |
37 | -ARM_ARCH = "http://ports.ubuntu.com/pool/universe/j/juju-core/" |
38 | -PUBLIC_ARCHIVES = [UBUNTU_ARCH, ARM_ARCH] |
39 | - |
40 | - |
41 | -def move_debs(dest_debs): |
42 | - juju_core_dir = os.path.join(dest_debs, 'juju-2.0') |
43 | - debs = glob.glob(os.path.join(juju_core_dir, '*deb')) |
44 | - if len(debs) == 0: |
45 | - # The juju-2.0 package was not found, try the juju-core package. |
46 | - print('No debs in {}'.format(juju_core_dir)) |
47 | - juju_core_dir = os.path.join(dest_debs, 'juju-core') |
48 | - debs = glob.glob(os.path.join(juju_core_dir, '*deb')) |
49 | - if len(debs) == 0: |
50 | - print('No debs in {}'.format(juju_core_dir)) |
51 | - raise NoDebsFound('No deb files found.') |
52 | - for deb in debs: |
53 | - shutil.move(deb, dest_debs) |
54 | - shutil.rmtree(juju_core_dir) |
55 | - |
56 | - |
57 | -def retrieve_deb_packages(release, upatch, archives, dest_debs): |
58 | - if '-' in release: |
59 | - deb_release = release.replace('-', '~') |
60 | - else: |
61 | - deb_release = release |
62 | - for archive in archives: |
63 | - scheme, netloc, path, query, fragment = urlsplit(archive) |
64 | - # Strip username / password |
65 | - netloc = netloc.rsplit('@')[-1] |
66 | - safe_archive = urlunsplit((scheme, netloc, path, query, fragment)) |
67 | - print("checking {} for {}".format(safe_archive, deb_release)) |
68 | - try: |
69 | - subprocess.call([ |
70 | - 'lftp', '-c', 'mirror', '-i', |
71 | - "(juju-2.0|juju-core).*{}.*\.{}~juj.*\.deb$".format( |
72 | - deb_release, upatch), |
73 | - archive], cwd=dest_debs) |
74 | - except OSError as e: |
75 | - if e.errno == errno.ENOENT: |
76 | - print("%s not found in %s" % (deb_release, safe_archive)) |
77 | - else: |
78 | - raise e |
79 | - except subprocess.CalledProcessError: |
80 | - raise |
81 | - |
82 | - |
83 | -def retrieve_packages(release, upatch, archives, dest_debs, s3_config): |
84 | + |
85 | + |
86 | +def retrieve_packages(release, dest_debs, s3_config): |
87 | # Retrieve the packages that contain a jujud for this version. |
88 | print("Retrieving juju-core packages from archives") |
89 | print(datetime.now().replace(microsecond=0).isoformat()) |
90 | - retrieve_deb_packages(release, upatch, archives, dest_debs) |
91 | - move_debs(dest_debs) |
92 | if os.path.exists(s3_config): |
93 | print( |
94 | 'checking s3://juju-qa-data/agent-archive for' |
95 | @@ -105,75 +39,9 @@ |
96 | parser.add_argument('release', help='The juju release to prepare') |
97 | parser.add_argument('agent_stream', help='The juju agent-stream.') |
98 | parser.add_argument('destination', help='The simplestreams destination') |
99 | - parser.add_argument('--upatch', help='Ubuntu patchlevel', default='1') |
100 | return parser.parse_args() |
101 | |
102 | |
103 | -def list_ppas(juju_home): |
104 | - config = os.path.join(juju_home, 'buildarchrc') |
105 | - if not os.path.exists(config): |
106 | - return None |
107 | - listing = subprocess.check_output( |
108 | - ['/bin/bash', '-c', 'source {}; set -u; echo ' |
109 | - '"$BUILD_STABLE1_ARCH\n' |
110 | - '$BUILD_DEVEL1_ARCH\n' |
111 | - '$BUILD_SUPPORTED_ARCH"'.format(config)]) |
112 | - return listing.splitlines() |
113 | - |
114 | - |
115 | -AgentVersion = namedtuple( |
116 | - 'AgentVersion', ['version', 'major_minor', 'series', 'architecture']) |
117 | - |
118 | - |
119 | -def get_agent_version(control_str): |
120 | - control = deb822.Deb822(control_str) |
121 | - control_version = control['Version'] |
122 | - corrected_version = re.sub('~(alpha|beta|rc)', r'-\1', control_version) |
123 | - epochless_version = re.sub('^.:', '', corrected_version) |
124 | - version = re.sub('(~|-0ubuntu).*$', '', epochless_version) |
125 | - major_minor = '.'.join(version.split('-')[0].split('.')[0:2]) |
126 | - series = juju_series.get_name_from_package_version(control_version) |
127 | - architecture = control['Architecture'] |
128 | - return AgentVersion(version, major_minor, series, architecture) |
129 | - |
130 | - |
131 | -def deb_to_agent(deb_path, dest_dir, agent_stream): |
132 | - control_str = subprocess.check_output(['dpkg-deb', '-I', deb_path, |
133 | - 'control']) |
134 | - agent_version = get_agent_version(control_str) |
135 | - with temp_dir() as work_dir: |
136 | - contents = os.path.join(work_dir, 'contents') |
137 | - os.mkdir(contents) |
138 | - subprocess.check_call(['dpkg-deb', '-x', deb_path, contents]) |
139 | - jujud_path = os.path.join( |
140 | - contents, 'usr', 'lib', 'juju-{}'.format( |
141 | - agent_version.major_minor), 'bin', |
142 | - 'jujud') |
143 | - if not os.path.exists(jujud_path): |
144 | - jujud_path = os.path.join( |
145 | - contents, 'usr', 'lib', 'juju-{}'.format( |
146 | - agent_version.version), 'bin', 'jujud') |
147 | - basename = 'juju-{}-{}-{}.tgz'.format( |
148 | - agent_version.version, agent_version.series, |
149 | - agent_version.architecture) |
150 | - agent_filename = os.path.join(work_dir, basename) |
151 | - with tarfile.open(agent_filename, 'w:gz') as tf: |
152 | - tf.add(jujud_path, 'jujud') |
153 | - writer = StanzaWriter.for_ubuntu( |
154 | - juju_series.get_version(agent_version.series), |
155 | - agent_version.series, agent_version.architecture, |
156 | - agent_version.version, agent_filename, agent_stream=agent_stream) |
157 | - writer.write_stanzas() |
158 | - shutil.move(writer.filename, dest_dir) |
159 | - final_agent_path = os.path.join(dest_dir, writer.path) |
160 | - move_create_parent(agent_filename, final_agent_path) |
161 | - |
162 | - |
163 | -def debs_to_agents(dest_debs, agent_stream): |
164 | - for deb_path in glob.glob(os.path.join(dest_debs, '*.deb')): |
165 | - deb_to_agent(deb_path, dest_debs, agent_stream) |
166 | - |
167 | - |
168 | def move_create_parent(source, target): |
169 | try: |
170 | os.makedirs(os.path.dirname(target)) |
171 | @@ -183,6 +51,19 @@ |
172 | shutil.move(source, target) |
173 | |
174 | |
175 | +def make_ubuntu_agent(dest_debs, agent_stream, release): |
176 | + for arch in ['amd64', 'arm64', 'ppc64el', 's390x']: |
177 | + tarfile = os.path.join( |
178 | + dest_debs, 'juju-{}-ubuntu-{}.tgz'.format(release, arch)) |
179 | + writer = StanzaWriter.for_living_ubuntu( |
180 | + arch, release, tarfile, agent_stream=agent_stream) |
181 | + writer.write_stanzas() |
182 | + agent_path = os.path.join(dest_debs, writer.path) |
183 | + shutil.copy2(tarfile, agent_path) |
184 | + arch_name = '{}-{}'.format(arch, writer.filename) |
185 | + shutil.move(writer.filename, os.path.join(dest_debs, arch_name)) |
186 | + |
187 | + |
188 | def make_windows_agent(dest_debs, agent_stream, release): |
189 | source = os.path.join( |
190 | dest_debs, 'juju-{}-win2012-amd64.tgz'.format(release)) |
191 | @@ -214,15 +95,8 @@ |
192 | juju_dir = os.environ.get( |
193 | 'JUJU_HOME', os.path.join(os.environ.get('HOME'), '.juju')) |
194 | s3_config = os.path.join(juju_dir, 'juju-qa.s3cfg') |
195 | - archives = list_ppas(juju_dir) |
196 | - if archives is None: |
197 | - print("Only public archives will be searched.") |
198 | - archives = PUBLIC_ARCHIVES |
199 | - else: |
200 | - print("Searching the build archives.") |
201 | - retrieve_packages(args.release, args.upatch, archives, dest_debs, |
202 | - s3_config) |
203 | - debs_to_agents(dest_debs, args.agent_stream) |
204 | + retrieve_packages(args.release, dest_debs, s3_config) |
205 | + make_ubuntu_agent(dest_debs, args.agent_stream, args.release) |
206 | make_windows_agent(dest_debs, args.agent_stream, args.release) |
207 | make_centos_agent(dest_debs, args.agent_stream, args.release) |
208 | |
209 | |
210 | === modified file 'tests/test_agent_archive.py' |
211 | --- tests/test_agent_archive.py 2016-12-02 17:00:50 +0000 |
212 | +++ tests/test_agent_archive.py 2017-01-25 14:33:53 +0000 |
213 | @@ -12,7 +12,6 @@ |
214 | is_new_version, |
215 | listing_to_files, |
216 | main, |
217 | - parse_args, |
218 | ) |
219 | |
220 | from utils import temp_dir |
221 | |
222 | === modified file 'tests/test_generate_agents.py' |
223 | --- tests/test_generate_agents.py 2016-12-02 17:00:50 +0000 |
224 | +++ tests/test_generate_agents.py 2017-01-25 14:33:53 +0000 |
225 | @@ -2,97 +2,19 @@ |
226 | |
227 | from contextlib import contextmanager |
228 | import os |
229 | -from mock import ( |
230 | - call, |
231 | - patch |
232 | - ) |
233 | from unittest import TestCase |
234 | |
235 | +from mock import patch |
236 | + |
237 | from generate_agents import ( |
238 | - get_agent_version, |
239 | make_centos_agent, |
240 | make_windows_agent, |
241 | - move_debs, |
242 | - NoDebsFound, |
243 | - retrieve_deb_packages, |
244 | + make_ubuntu_agent, |
245 | retrieve_packages, |
246 | ) |
247 | from utils import temp_dir |
248 | |
249 | |
250 | -class TestMoveDebs(TestCase): |
251 | - |
252 | - def test_juju_2(self): |
253 | - with temp_dir() as dest_debs: |
254 | - parent = os.path.join(dest_debs, 'juju-2.0') |
255 | - os.mkdir(parent) |
256 | - open(os.path.join(parent, 'foo.deb'), 'w').close() |
257 | - move_debs(dest_debs) |
258 | - self.assertTrue(os.path.exists(os.path.join(dest_debs, 'foo.deb'))) |
259 | - |
260 | - def test_juju_core(self): |
261 | - with temp_dir() as dest_debs: |
262 | - parent = os.path.join(dest_debs, 'juju-core') |
263 | - os.mkdir(parent) |
264 | - open(os.path.join(parent, 'foo.deb'), 'w').close() |
265 | - move_debs(dest_debs) |
266 | - self.assertTrue(os.path.exists(os.path.join(dest_debs, 'foo.deb'))) |
267 | - |
268 | - def test_none(self): |
269 | - with temp_dir() as dest_debs: |
270 | - parent = os.path.join(dest_debs, 'juju-core') |
271 | - os.mkdir(parent) |
272 | - with self.assertRaisesRegexp(NoDebsFound, 'No deb files found.'): |
273 | - move_debs(dest_debs) |
274 | - |
275 | - def test_wrong_dir(self): |
276 | - with temp_dir() as dest_debs: |
277 | - parent = os.path.join(dest_debs, 'wrong-dir') |
278 | - os.mkdir(parent) |
279 | - open(os.path.join(parent, 'foo.deb'), 'w').close() |
280 | - with self.assertRaisesRegexp(NoDebsFound, 'No deb files found.'): |
281 | - move_debs(dest_debs) |
282 | - |
283 | - |
284 | -class TestRetreiveDebPackages(TestCase): |
285 | - |
286 | - archives = [ |
287 | - 'https://me:secret@private-ppa.launchpad.net/team/stable', |
288 | - 'https://me:secret@private-ppa.launchpad.net/team/devel', |
289 | - ] |
290 | - |
291 | - def test_retrieve_deb_packages_stable(self): |
292 | - with patch('subprocess.call', autospec=True) as c_mock: |
293 | - retrieve_deb_packages('2.1.0', '1', self.archives, '2.1.0/') |
294 | - calls = [ |
295 | - call(['lftp', '-c', 'mirror', '-i', |
296 | - '(juju-2.0|juju-core).*2.1.0.*\\.1~juj.*\\.deb$', |
297 | - 'https://me:secret@private-ppa.launchpad.net/team/stable'], |
298 | - cwd='2.1.0/'), |
299 | - call(['lftp', '-c', 'mirror', '-i', |
300 | - '(juju-2.0|juju-core).*2.1.0.*\\.1~juj.*\\.deb$', |
301 | - 'https://me:secret@private-ppa.launchpad.net/team/devel'], |
302 | - cwd='2.1.0/') |
303 | - ] |
304 | - self.assertEqual(calls, c_mock.mock_calls) |
305 | - |
306 | - def test_retrieve_deb_packages_devel(self): |
307 | - with patch('subprocess.call', autospec=True) as c_mock: |
308 | - retrieve_deb_packages( |
309 | - '2.1-beta1', '1', self.archives, '2.1-beta1/') |
310 | - calls = [ |
311 | - call(['lftp', '-c', 'mirror', '-i', |
312 | - '(juju-2.0|juju-core).*2.1~beta1.*\\.1~juj.*\\.deb$', |
313 | - 'https://me:secret@private-ppa.launchpad.net/team/stable'], |
314 | - cwd='2.1-beta1/'), |
315 | - call(['lftp', '-c', 'mirror', '-i', |
316 | - '(juju-2.0|juju-core).*2.1~beta1.*\\.1~juj.*\\.deb$', |
317 | - 'https://me:secret@private-ppa.launchpad.net/team/devel'], |
318 | - cwd='2.1-beta1/') |
319 | - ] |
320 | - self.assertEqual(calls, c_mock.mock_calls) |
321 | - |
322 | - |
323 | control_string_template = """\ |
324 | Package: juju-2.0 |
325 | Source: juju-core |
326 | @@ -151,25 +73,26 @@ |
327 | self.assertEqual(args.config, s3_config) |
328 | |
329 | |
330 | -class TestGetAgentVersion(TestCase): |
331 | - |
332 | - def test_get_agent_version_stable(self): |
333 | - control_str = control_string_template.format( |
334 | - '1:2.1.0-0ubuntu1~16.04.1~juju1') |
335 | - agent_version = get_agent_version(control_str) |
336 | - self.assertEqual('2.1.0', agent_version.version) |
337 | - self.assertEqual('2.1', agent_version.major_minor) |
338 | - self.assertEqual('xenial', agent_version.series) |
339 | - self.assertEqual('amd64', agent_version.architecture) |
340 | - |
341 | - def test_get_agent_version_devel(self): |
342 | - control_str = control_string_template.format( |
343 | - '1:2.1~beta1-0ubuntu1~16.04.1~juju1') |
344 | - agent_version = get_agent_version(control_str) |
345 | - self.assertEqual('2.1-beta1', agent_version.version) |
346 | - self.assertEqual('2.1', agent_version.major_minor) |
347 | - self.assertEqual('xenial', agent_version.series) |
348 | - self.assertEqual('amd64', agent_version.architecture) |
349 | +class TestMakeUbuntuAgent(TestCase): |
350 | + |
351 | + def test_make_ubuntu_agent(self): |
352 | + with temp_dir() as workspace: |
353 | + dest_debs = os.path.join(workspace, 'debs') |
354 | + agent_dir = os.path.join(dest_debs, 'agent', '1.25.5') |
355 | + os.makedirs(agent_dir) |
356 | + stanzas = os.path.join(workspace, 'stanzas') |
357 | + os.mkdir(stanzas) |
358 | + agent = os.path.join(dest_debs, 'juju-1.25.5-ubuntu-amd64.tgz') |
359 | + with open(agent, 'w') as dummy_file: |
360 | + dummy_file.write('ubuntu agent') |
361 | + make_ubuntu_agent(dest_debs, 'proposed', '1.25.5') |
362 | + agent_path = os.path.join( |
363 | + workspace, 'debs', 'agent', '1.25.5', |
364 | + 'juju-1.25.5-ubuntu-amd64.tgz') |
365 | + self.assertTrue(os.path.exists(agent_path)) |
366 | + stanza_path = os.path.join( |
367 | + workspace, 'debs', 'proposed-1.25.5-ubuntu.json') |
368 | + self.assertTrue(os.path.exists(stanza_path)) |
369 | |
370 | |
371 | class TestMakeCentosAgent(TestCase): |