Merge lp:~andrewjbeach/juju-release-tools/no-debs into lp:juju-release-tools

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
Reviewer Review Type Date Requested Status
Juju Release Engineering Pending
Review via email: mp+315569@code.launchpad.net

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):

Subscribers

People subscribed via source and target branches