Merge lp:~abentley/juju-release-tools/generate-agents-2 into lp:juju-release-tools

Proposed by Aaron Bentley
Status: Merged
Merged at revision: 261
Proposed branch: lp:~abentley/juju-release-tools/generate-agents-2
Merge into: lp:juju-release-tools
Prerequisite: lp:~abentley/juju-release-tools/make-agent-json-tests
Diff against target: 122 lines (+80/-0)
1 file modified
generate_agents.py (+80/-0)
To merge this branch: bzr merge lp:~abentley/juju-release-tools/generate-agents-2
Reviewer Review Type Date Requested Status
Curtis Hovey (community) code Approve
Review via email: mp+285537@code.launchpad.net

Commit message

Generate agents from debs/tarfiles.

Description of the change

This branch updates generate_agents to generate agents and their json.

For debs, it interrogates the deb's control file. For Windows and CentOS, it uses the supplied version number.

To post a comment you must log in.
Revision history for this message
Curtis Hovey (sinzui) wrote :

Thank you.

I was thrown in my first read by the use of the win8 agent. It is made by agent_archive.py during a release CI from the win2012 agent. CI makes and tests the win2012 agent. Lets use it because it is guaranteed to exist during testing.

review: Approve (code)
274. By Aaron Bentley

Use win2012 tarball instead.

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-02-05 21:24:42 +0000
3+++ generate_agents.py 2016-02-10 14:30:46 +0000
4@@ -6,17 +6,25 @@
5 Namespace,
6 )
7 from datetime import datetime
8+import errno
9 import glob
10 import os
11+import re
12 import shutil
13 import subprocess
14 import sys
15+import tarfile
16 from urlparse import (
17 urlsplit,
18 urlunsplit,
19 )
20
21+from debian import deb822
22+
23 from agent_archive import get_agents
24+from build_package import juju_series
25+from make_agent_json import StanzaWriter
26+from utils import temp_dir
27
28
29 # These are the archives that are searched for matching releases.
30@@ -64,6 +72,7 @@
31 def parse_args():
32 parser = ArgumentParser()
33 parser.add_argument('release', help='The juju release to prepare')
34+ parser.add_argument('agent_stream', help='The juju agent-stream.')
35 parser.add_argument('destination', help='The simplestreams destination')
36 parser.add_argument('--upatch', help='Ubuntu patchlevel', default='1')
37 return parser.parse_args()
38@@ -81,6 +90,74 @@
39 return listing.splitlines()
40
41
42+def deb_to_agent(deb_path, dest_dir, agent_stream):
43+ control_str = subprocess.check_output(['dpkg-deb', '-I', deb_path,
44+ 'control'])
45+ control = deb822.Deb822(control_str)
46+ control_version = control['Version']
47+ base_version = re.sub('-0ubuntu.*$', '', control_version)
48+ series = juju_series.get_name_from_package_version(control_version)
49+ architecture = control['Architecture']
50+ with temp_dir() as work_dir:
51+ contents = os.path.join(work_dir, 'contents')
52+ os.mkdir(contents)
53+ subprocess.check_call(['dpkg-deb', '-x', deb_path, contents])
54+ jujud_path = os.path.join(
55+ contents, 'usr', 'lib', 'juju-{}'.format(base_version), 'bin',
56+ 'jujud')
57+ basename = 'juju-{}-{}-{}.tgz'.format(base_version, series,
58+ architecture)
59+ agent_filename = os.path.join(work_dir, basename)
60+ with tarfile.open(agent_filename, 'w:gz') as tf:
61+ tf.add(jujud_path, 'jujud')
62+ writer = StanzaWriter.for_ubuntu(
63+ juju_series.get_version(series), series, architecture,
64+ base_version, agent_filename, agent_stream=agent_stream)
65+ writer.write_stanzas()
66+ shutil.move(writer.filename, dest_dir)
67+ final_agent_path = os.path.join(dest_dir, writer.agent_path)
68+ move_create_parent(agent_filename, final_agent_path)
69+
70+
71+def debs_to_agents(dest_debs, agent_stream):
72+ for deb_path in glob.glob(os.path.join(dest_debs, '*.deb')):
73+ deb_to_agent(deb_path, dest_debs, agent_stream)
74+
75+
76+def move_create_parent(source, target):
77+ try:
78+ os.makedirs(os.path.dirname(target))
79+ except OSError as e:
80+ if e.errno != errno.EEXIST:
81+ raise
82+ shutil.move(source, target)
83+
84+
85+def make_windows_agent(dest_debs, agent_stream, release):
86+ source = os.path.join(
87+ dest_debs, 'juju-{}-win2012-amd64.tgz'.format(release))
88+ target = os.path.join(
89+ dest_debs, 'juju-{}-windows-amd64.tgz'.format(release))
90+ shutil.copy2(source, target)
91+ writer = StanzaWriter.for_windows(
92+ release, target, agent_stream=agent_stream)
93+ writer.write_stanzas()
94+ agent_path = os.path.join(dest_debs, writer.agent_path)
95+ move_create_parent(target, agent_path)
96+ os.rename(writer.filename, os.path.join(dest_debs, writer.filename))
97+
98+
99+def make_centos_agent(dest_debs, agent_stream, release):
100+ tarfile = os.path.join(
101+ dest_debs, 'juju-{}-centos7-amd64.tgz'.format(release))
102+ writer = StanzaWriter.for_centos(release, tarfile,
103+ agent_stream=agent_stream)
104+ writer.write_stanzas()
105+ agent_path = os.path.join(dest_debs, writer.agent_path)
106+ shutil.copy2(tarfile, agent_path)
107+ os.rename(writer.filename, os.path.join(dest_debs, writer.filename))
108+
109+
110 def main():
111 args = parse_args()
112 dest_debs = os.path.abspath(os.path.join(args.destination, 'debs'))
113@@ -95,6 +172,9 @@
114 print("Searching the build archives.")
115 retrieve_packages(args.release, args.upatch, archives, dest_debs,
116 s3_config)
117+ debs_to_agents(dest_debs, args.agent_stream)
118+ make_windows_agent(dest_debs, args.agent_stream, args.release)
119+ make_centos_agent(dest_debs, args.agent_stream, args.release)
120
121
122 if __name__ == '__main__':

Subscribers

People subscribed via source and target branches