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

Proposed by Aaron Bentley
Status: Merged
Merged at revision: 222
Proposed branch: lp:~abentley/juju-release-tools/generate-simplestreams
Merge into: lp:juju-release-tools
Prerequisite: lp:~abentley/juju-release-tools/stanzas-to-streams
Diff against target: 205 lines (+171/-0)
7 files modified
agent_paths.py (+48/-0)
copy-agents.bash (+9/-0)
download_agents.py (+45/-0)
make-stanzas.bash (+8/-0)
set_stream.py (+32/-0)
ssquery_json.py (+24/-0)
validate-streams.bash (+5/-0)
To merge this branch: bzr merge lp:~abentley/juju-release-tools/generate-simplestreams
Reviewer Review Type Date Requested Status
Curtis Hovey (community) code Approve
Review via email: mp+274013@code.launchpad.net

Commit message

Additional scripts for generating parallel streams.

Description of the change

This branch provides additional scripts that are used for generating parallel streams.

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

I have a comment, but it doesn't block this branch.

review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'agent_paths.py'
2--- agent_paths.py 1970-01-01 00:00:00 +0000
3+++ agent_paths.py 2015-10-09 18:05:56 +0000
4@@ -0,0 +1,48 @@
5+#!/usr/bin/env python3
6+from argparse import ArgumentParser
7+import json
8+import os.path
9+import re
10+import sys
11+
12+from generate_simplestreams import json_dump
13+
14+
15+def main():
16+ parser = ArgumentParser()
17+ parser.add_argument('input')
18+ parser.add_argument('output')
19+ args = parser.parse_args()
20+ paths_hashes = {}
21+ with open(args.input) as input_file:
22+ stanzas = json.load(input_file)
23+ hashes = {}
24+ old_hash_urls = {}
25+ for stanza in stanzas:
26+ path_hash = stanza['sha256']
27+ old_hash_urls[path_hash] = stanza['item_url']
28+ path = os.path.join('agent', os.path.basename(stanza['path']))
29+ path = re.sub('-win(2012(hv)?(r2)?|7|8|81)-', '-windows-', path)
30+ paths_hashes.setdefault(path, stanza['sha256'])
31+ if paths_hashes[path] != path_hash:
32+ raise ValueError('Conflicting hash')
33+ stanza['path'] = path
34+ hashes[path] = path_hash
35+ ph_list = {}
36+ for path, path_hash in hashes.items():
37+ ph_list.setdefault(path_hash, set()).add(path)
38+ for path_hash, paths in ph_list.items():
39+ if len(paths) > 1:
40+ print(paths)
41+ json_dump(stanzas, args.output)
42+ agent_downloads = []
43+ for stanza in stanzas:
44+ agent_downloads.append({
45+ 'path': stanza['path'],
46+ 'sha256': stanza['sha256'],
47+ 'url': old_hash_urls[stanza['sha256']],
48+ })
49+ json_dump(agent_downloads, 'downloads-' + args.output)
50+
51+if __name__ == '__main__':
52+ sys.exit(main())
53
54=== added file 'copy-agents.bash'
55--- copy-agents.bash 1970-01-01 00:00:00 +0000
56+++ copy-agents.bash 2015-10-09 18:05:56 +0000
57@@ -0,0 +1,9 @@
58+#!/bin/bash
59+set -eux
60+source_streams=$1
61+VERSION=$2
62+agent_path=$3
63+mkdir -p $agent_path
64+for sourcepath in $(sstream-query $1/streams/v1/index.json version=$VERSION --output-format="%(item_url)s"); do
65+ cp $sourcepath $agent_path/$(basename $sourcepath)
66+done
67
68=== added file 'download_agents.py'
69--- download_agents.py 1970-01-01 00:00:00 +0000
70+++ download_agents.py 2015-10-09 18:05:56 +0000
71@@ -0,0 +1,45 @@
72+#!/usr/bin/env python3
73+
74+from argparse import ArgumentParser
75+import json
76+import os
77+from urllib.request import urlopen
78+import subprocess
79+import sys
80+
81+
82+def main():
83+ parser = ArgumentParser()
84+ parser.add_argument('downloads_file', metavar='downloads-file')
85+ args = parser.parse_args()
86+ with open(args.downloads_file) as downloads_file:
87+ downloads = json.load(downloads_file)
88+ for download in downloads:
89+ path = download['path']
90+ if os.path.isfile(path):
91+ print('File already exists: {}'.format(path))
92+ else:
93+ print('Downloading: {}'.format(path), end='')
94+ sys.stdout.flush()
95+ with open(download['path'], 'wb') as target:
96+ with urlopen(download['url']) as source:
97+ while True:
98+ chunk = source.read(102400)
99+ if len(chunk) == 0:
100+ break
101+ target.write(chunk)
102+ print('.', end='', file=sys.stderr)
103+ sys.stderr.flush()
104+ print('')
105+ print('Verifying hash')
106+ hashsum = subprocess.check_output(
107+ ['sha256sum', path]).split(b' ', 1)[0]
108+ hashsum = hashsum.decode('ascii')
109+ expected = download['sha256']
110+ print(' {}\n {}'.format(hashsum, expected))
111+ if hashsum != expected:
112+ raise ValueError('Incorrect hash for {}'.format(path))
113+
114+
115+if __name__ == '__main__':
116+ main()
117
118=== added file 'make-stanzas.bash'
119--- make-stanzas.bash 1970-01-01 00:00:00 +0000
120+++ make-stanzas.bash 2015-10-09 18:05:56 +0000
121@@ -0,0 +1,8 @@
122+#!/bin/bash
123+set -eux
124+revision_build=$1
125+VERSION=$2
126+final_path=$3
127+sstream-query $HOME/streams/juju-dist/testing/tools/streams/v1/index.json version=$VERSION > revision-build-$revision_build.repr
128+ssquery_json.py revision-build-$revision_build.repr revision-build-$revision_build.json
129+set_stream.py revision-build-$revision_build.json $final_path $revision_build --update-path
130
131=== added file 'set_stream.py'
132--- set_stream.py 1970-01-01 00:00:00 +0000
133+++ set_stream.py 2015-10-09 18:05:56 +0000
134@@ -0,0 +1,32 @@
135+#!/usr/bin/env python
136+
137+from argparse import ArgumentParser
138+import json
139+import os
140+
141+from generate_simplestreams import json_dump
142+
143+
144+def main():
145+ parser = ArgumentParser()
146+ parser.add_argument('in_file')
147+ parser.add_argument('out_file')
148+ parser.add_argument('revision_build')
149+ parser.add_argument('--update-path', action='store_true')
150+ args = parser.parse_args()
151+ with open(args.in_file) as in_file:
152+ stanzas = json.load(in_file)
153+ stream = 'revision-build-{}'.format(args.revision_build)
154+ for stanza in stanzas:
155+ stanza['content_id'] = 'com.ubuntu.juju:{}:tools'.format(stream)
156+ if not args.update_path:
157+ continue
158+ path = os.path.join(
159+ 'agent', 'revision-build-{}'.format(args.revision_build),
160+ os.path.basename(stanza['path']))
161+ stanza['path'] = path
162+ json_dump(stanzas, args.out_file)
163+
164+
165+if __name__ == '__main__':
166+ main()
167
168=== added file 'ssquery_json.py'
169--- ssquery_json.py 1970-01-01 00:00:00 +0000
170+++ ssquery_json.py 2015-10-09 18:05:56 +0000
171@@ -0,0 +1,24 @@
172+#!/usr/bin/env python3
173+from argparse import ArgumentParser
174+
175+from generate_simplestreams import json_dump
176+
177+
178+def parse_args():
179+ parser = ArgumentParser(description='Convert sstream-query output to JSON')
180+ parser.add_argument('input')
181+ parser.add_argument('output')
182+ return parser.parse_args()
183+
184+
185+def main():
186+ args = parse_args()
187+ output = []
188+ with open(args.input) as in_file:
189+ for line in in_file:
190+ output.append(eval(line))
191+ json_dump(output, args.output)
192+
193+
194+if __name__ == '__main__':
195+ main()
196
197=== added file 'validate-streams.bash'
198--- validate-streams.bash 1970-01-01 00:00:00 +0000
199+++ validate-streams.bash 2015-10-09 18:05:56 +0000
200@@ -0,0 +1,5 @@
201+#!/bin/bash
202+set -eux
203+testing=$1
204+sstream-query $testing/streams/v1/index2.json content_id="com.ubuntu.juju:revision-build-$revision_build:tools" version=$VERSION --output-format="%(sha256)s %(item_url)s" > sha256sums
205+sha256sum -c sha256sums

Subscribers

People subscribed via source and target branches