~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/soyuz/doc/distroseriesqueue-ddtp-tarball.txt

  • Committer: Launchpad Patch Queue Manager
  • Date: 2011-06-16 12:17:34 UTC
  • mfrom: (13233.1.2 pre-394645)
  • Revision ID: launchpad@pqm.canonical.com-20110616121734-igzzpd482yots7d3
[r=jtv][bug=394645,537335][no-qa] Lint blows but hoover sucks.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
== DDTP-TARBALL upload ==
 
1
DDTP-TARBALL upload
 
2
-------------------
2
3
 
3
4
This test will describe how launchpad treats an upload of DDTP
4
5
tarball.
20
21
For further info about DDTP see:
21
22
  https://wiki.ubuntu.com/TranslatedPackageDescriptionsSpec
22
23
 
23
 
  >>> from lp.registry.interfaces.distribution import IDistributionSet
24
 
 
25
 
  >>> ubuntutest = getUtility(IDistributionSet)['ubuntutest']
26
 
  >>> breezy_autotest = ubuntutest['breezy-autotest']
27
 
 
28
 
  >>> from lp.archiveuploader.nascentupload import NascentUpload
29
 
  >>> from lp.archiveuploader.tests import datadir, getPolicy
30
 
 
31
 
  >>> from canonical.launchpad.ftests import import_public_test_keys
32
 
  >>> import_public_test_keys()
 
24
    >>> from lp.registry.interfaces.distribution import IDistributionSet
 
25
 
 
26
    >>> ubuntutest = getUtility(IDistributionSet)['ubuntutest']
 
27
    >>> breezy_autotest = ubuntutest['breezy-autotest']
 
28
 
 
29
    >>> from lp.archiveuploader.nascentupload import NascentUpload
 
30
    >>> from lp.archiveuploader.tests import datadir, getPolicy
 
31
 
 
32
    >>> from canonical.launchpad.ftests import import_public_test_keys
 
33
    >>> import_public_test_keys()
33
34
 
34
35
Login as an admin (or ubuntutest.archive_admin if we have one), since
35
36
we need to access and modify PackageUpload records and other tables.
36
37
 
37
 
  >>> login('foo.bar@canonical.com')
 
38
    >>> login('foo.bar@canonical.com')
38
39
 
39
40
Set the email address for announcements:
40
41
 
41
 
  >>> breezy_autotest.changeslist = 'test@example.com'
 
42
    >>> breezy_autotest.changeslist = 'test@example.com'
42
43
 
43
44
First, test the rejection of a missapplied changesfile name, which
44
45
doesn't follow the accepted format,  "<pkg>_<version>_<arch>.changes"
45
46
 
46
 
  >>> sync_policy = getPolicy(
47
 
  ...     name='sync', distro='ubuntutest', distroseries=None)
 
47
    >>> sync_policy = getPolicy(
 
48
    ...     name='sync', distro='ubuntutest', distroseries=None)
48
49
 
49
 
  >>> from lp.services.log.logger import DevNullLogger
50
 
  >>> upload = NascentUpload.from_changesfile_path(
51
 
  ...     datadir('ddtp-tarball/translations-main_20060728.changes'),
52
 
  ...     sync_policy, DevNullLogger())
53
 
  >>> upload.process()
54
 
  Traceback (most recent call last):
55
 
  ...
56
 
  EarlyReturnUploadError: An error occurred that prevented further processing.
 
50
    >>> from lp.services.log.logger import DevNullLogger
 
51
    >>> upload = NascentUpload.from_changesfile_path(
 
52
    ...     datadir('ddtp-tarball/translations-main_20060728.changes'),
 
53
    ...     sync_policy, DevNullLogger())
 
54
    >>> upload.process()
 
55
    Traceback (most recent call last):
 
56
    ...
 
57
    EarlyReturnUploadError: An error occurred that prevented further
 
58
    processing.
57
59
 
58
60
Now do a proper upload into the system.
59
61
 
60
 
  >>> insecure_policy = getPolicy(
61
 
  ...     name='insecure', distro='ubuntutest', distroseries=None)
62
 
 
63
 
  >>> from lp.services.log.logger import FakeLogger
64
 
  >>> upload = NascentUpload.from_changesfile_path(
65
 
  ...     datadir('ddtp-tarball/translations-main_20060728_all.changes'),
66
 
  ...     insecure_policy, FakeLogger())
67
 
  DEBUG Verifying signature on translations-main_20060728_all.changes
68
 
 
69
 
  >>> upload.process()
70
 
  DEBUG Beginning processing.
71
 
  DEBUG Verifying the changes file.
72
 
  DEBUG Verifying files in upload.
73
 
  DEBUG Single Custom Upload detected.
74
 
  DEBUG Finished checking upload.
 
62
    >>> insecure_policy = getPolicy(
 
63
    ...     name='insecure', distro='ubuntutest', distroseries=None)
 
64
 
 
65
    >>> from lp.services.log.logger import FakeLogger
 
66
    >>> upload = NascentUpload.from_changesfile_path(
 
67
    ...     datadir('ddtp-tarball/translations-main_20060728_all.changes'),
 
68
    ...     insecure_policy, FakeLogger())
 
69
    DEBUG Verifying signature on translations-main_20060728_all.changes
 
70
 
 
71
    >>> upload.process()
 
72
    DEBUG Beginning processing.
 
73
    DEBUG Verifying the changes file.
 
74
    DEBUG Verifying files in upload.
 
75
    DEBUG Single Custom Upload detected.
 
76
    DEBUG Finished checking upload.
75
77
 
76
78
It was not rejected.
77
79
 
78
 
  >>> upload.is_rejected
79
 
  False
 
80
    >>> upload.is_rejected
 
81
    False
80
82
 
81
 
  >>> success = upload.do_accept()
82
 
  DEBUG Creating queue entry
83
 
  ...
84
 
  DEBUG Sent a mail:
85
 
  DEBUG   Subject: [ubuntutest/breezy-autotest] translations_main_20060728.tar.gz - (Accepted)
86
 
  DEBUG   Sender: Root <root@localhost>
87
 
  DEBUG   Recipients: Foo Bar <foo.bar@canonical.com>
88
 
  DEBUG   Bcc: Root <root@localhost>
89
 
  DEBUG   Body:
90
 
  DEBUG .
91
 
  DEBUG * Duhh
92
 
  DEBUG
93
 
  DEBUG
94
 
  DEBUG Date: Thu, 01 Aug 2006 14:20:25 +0300
95
 
  DEBUG Changed-By: Foo Bar <foo.bar@canonical.com>
96
 
  DEBUG Origin: Ubuntu/warty
97
 
  DEBUG
98
 
  DEBUG
99
 
  DEBUG ==
100
 
  DEBUG
101
 
  DEBUG Announcing to test@example.com
102
 
  DEBUG
103
 
  DEBUG Thank you for your contribution to Ubuntu Test.
104
 
  DEBUG
105
 
  DEBUG --
106
 
  DEBUG You are receiving this email because you are the uploader, maintainer or
107
 
  DEBUG signer of the above package.
108
 
  DEBUG Sent a mail:
109
 
  DEBUG   Subject: [ubuntutest/breezy-autotest] translations_main_20060728.tar.gz - (Accepted)
110
 
  DEBUG   Sender: Foo Bar <foo.bar@canonical.com>
111
 
  DEBUG   Recipients: test@example.com
112
 
  DEBUG   Bcc: Root <root@localhost>
113
 
  DEBUG   Body:
114
 
  DEBUG .
115
 
  DEBUG * Duhh
116
 
  DEBUG
117
 
  DEBUG
118
 
  DEBUG Date: Thu, 01 Aug 2006 14:20:25 +0300
119
 
  DEBUG Changed-By: Foo Bar <foo.bar@canonical.com>
120
 
  DEBUG Origin: Ubuntu/warty
121
 
  DEBUG
 
83
    >>> success = upload.do_accept()
 
84
    DEBUG Creating queue entry
 
85
    ...
 
86
    DEBUG Sent a mail:
 
87
    DEBUG   Subject: [ubuntutest/breezy-autotest]
 
88
    translations_main_20060728.tar.gz - (Accepted)
 
89
    DEBUG   Sender: Root <root@localhost>
 
90
    DEBUG   Recipients: Foo Bar <foo.bar@canonical.com>
 
91
    DEBUG   Bcc: Root <root@localhost>
 
92
    DEBUG   Body:
 
93
    DEBUG .
 
94
    DEBUG * Duhh
 
95
    DEBUG
 
96
    DEBUG
 
97
    DEBUG Date: Thu, 01 Aug 2006 14:20:25 +0300
 
98
    DEBUG Changed-By: Foo Bar <foo.bar@canonical.com>
 
99
    DEBUG Origin: Ubuntu/warty
 
100
    DEBUG
 
101
    DEBUG
 
102
    DEBUG ==
 
103
    DEBUG
 
104
    DEBUG Announcing to test@example.com
 
105
    DEBUG
 
106
    DEBUG Thank you for your contribution to Ubuntu Test.
 
107
    DEBUG
 
108
    DEBUG --
 
109
    DEBUG You are receiving this email because you are the uploader,
 
110
    maintainer or
 
111
    DEBUG signer of the above package.
 
112
    DEBUG Sent a mail:
 
113
    DEBUG   Subject: [ubuntutest/breezy-autotest]
 
114
    translations_main_20060728.tar.gz - (Accepted)
 
115
    DEBUG   Sender: Foo Bar <foo.bar@canonical.com>
 
116
    DEBUG   Recipients: test@example.com
 
117
    DEBUG   Bcc: Root <root@localhost>
 
118
    DEBUG   Body:
 
119
    DEBUG .
 
120
    DEBUG * Duhh
 
121
    DEBUG
 
122
    DEBUG
 
123
    DEBUG Date: Thu, 01 Aug 2006 14:20:25 +0300
 
124
    DEBUG Changed-By: Foo Bar <foo.bar@canonical.com>
 
125
    DEBUG Origin: Ubuntu/warty
 
126
    DEBUG
122
127
 
123
128
And all things worked.
124
129
 
125
 
  >>> success
126
 
  True
 
130
    >>> success
 
131
    True
127
132
 
128
 
  >>> not upload.rejection_message
129
 
  True
 
133
    >>> not upload.rejection_message
 
134
    True
130
135
 
131
136
We need to commit the transaction to be able to use the librarian files.
132
137
 
133
 
  >>> flush_database_updates()
134
 
  >>> transaction.commit()
 
138
    >>> flush_database_updates()
 
139
    >>> transaction.commit()
135
140
 
136
141
Let's use the script to fetch the ddtp-tarball upload:
137
142
 
138
 
  >>> import subprocess
139
 
  >>> import os
140
 
  >>> import sys
141
 
  >>> from canonical.config import config
142
 
 
143
 
  >>> script = os.path.join(
144
 
  ...    config.root, "scripts", "ftpmaster-tools", "queue")
145
 
 
146
 
  >>> process = subprocess.Popen([sys.executable, script, "-Q", "accepted",
147
 
  ...                             "-s", "breezy-autotest", "fetch", "trans",
148
 
  ...                             "-d", "ubuntutest"],
149
 
  ...                            stdout=subprocess.PIPE)
150
 
  >>> stdout, stderr = process.communicate()
151
 
  >>> process.returncode
152
 
  0
153
 
  >>> print stdout
154
 
  Initializing connection to queue accepted
155
 
  Running: "fetch trans"
156
 
  Fetching ubuntutest/breezy-autotest (ACCEPTED) 1/1
157
 
  ---------------------------------------------------------------------------
158
 
  Constructing translations-main_20060728_all.changes
159
 
  Constructing translations_main_20060728.tar.gz
160
 
  ---------------------------------------------------------------------------
161
 
                                                                 1/1 total
162
 
  <BLANKLINE>
 
143
    >>> import subprocess
 
144
    >>> import os
 
145
    >>> import sys
 
146
    >>> from canonical.config import config
 
147
 
 
148
    >>> script = os.path.join(
 
149
    ...    config.root, "scripts", "ftpmaster-tools", "queue")
 
150
 
 
151
    >>> process = subprocess.Popen([sys.executable, script, "-Q", "accepted",
 
152
    ...                             "-s", "breezy-autotest", "fetch", "trans",
 
153
    ...                             "-d", "ubuntutest"],
 
154
    ...                            stdout=subprocess.PIPE)
 
155
    >>> stdout, stderr = process.communicate()
 
156
    >>> process.returncode
 
157
    0
 
158
    >>> print stdout
 
159
    Initializing connection to queue accepted
 
160
    Running: "fetch trans"
 
161
    Fetching ubuntutest/breezy-autotest (ACCEPTED) 1/1
 
162
    ---------------------------------------------------------------------------
 
163
    Constructing translations-main_20060728_all.changes
 
164
    Constructing translations_main_20060728.tar.gz
 
165
    ---------------------------------------------------------------------------
 
166
                                                                   1/1 total
 
167
    <BLANKLINE>
163
168
 
164
169
Check if the files were written:
165
170
 
166
 
  >>> os.path.exists('translations-main_20060728_all.changes')
167
 
  True
168
 
  >>> os.path.exists('translations_main_20060728.tar.gz')
169
 
  True
 
171
    >>> os.path.exists('translations-main_20060728_all.changes')
 
172
    True
 
173
    >>> os.path.exists('translations_main_20060728.tar.gz')
 
174
    True
170
175
 
171
176
Cleanup the mess:
172
177
 
173
 
  >>> os.remove('translations-main_20060728_all.changes')
174
 
  >>> os.remove('translations_main_20060728.tar.gz')
 
178
    >>> os.remove('translations-main_20060728_all.changes')
 
179
    >>> os.remove('translations_main_20060728.tar.gz')
175
180
 
176
181
 
177
182
Inspect the QUEUE looking for an ACCEPTED entry corresponding to the
178
183
previous upload:
179
184
 
180
 
  >>> from lp.soyuz.enums import PackageUploadStatus
181
 
  >>> queue_item = breezy_autotest.getQueueItems(
182
 
  ...      status=PackageUploadStatus.ACCEPTED)[0]
183
 
  >>> queue_item.customfiles[0].libraryfilealias.filename
184
 
  u'translations_main_20060728.tar.gz'
 
185
    >>> from lp.soyuz.enums import PackageUploadStatus
 
186
    >>> queue_item = breezy_autotest.getQueueItems(
 
187
    ...      status=PackageUploadStatus.ACCEPTED)[0]
 
188
    >>> queue_item.customfiles[0].libraryfilealias.filename
 
189
    u'translations_main_20060728.tar.gz'
185
190
 
186
191
Do the publish, i.e process the CustomUpload decompressing and writing
187
192
the tarball contents in the archive, collect and check debug message:
188
193
 
189
194
The umask must be 022 in order to perform the upload.
190
195
 
191
 
  >>> old_mask = os.umask(022)
192
 
  >>> pub_records = queue_item.realiseUpload(FakeLogger())
193
 
  DEBUG Publishing custom translations_main_20060728.tar.gz to ubuntutest/breezy-autotest
194
 
  >>> print '%03o' % os.umask(old_mask)
195
 
  022
 
196
    >>> old_mask = os.umask(022)
 
197
    >>> pub_records = queue_item.realiseUpload(FakeLogger())
 
198
    DEBUG Publishing custom translations_main_20060728.tar.gz to
 
199
    ubuntutest/breezy-autotest
 
200
    >>> print '%03o' % os.umask(old_mask)
 
201
    022
196
202
 
197
203
Check what was published in the target directory:
198
204
 
199
 
  >>> import os
200
 
  >>> archive_dir = '/var/tmp/archive/'
 
205
    >>> import os
 
206
    >>> archive_dir = '/var/tmp/archive/'
201
207
 
202
208
DDTP indexes are published in the "i18n" directory inside archive dists:
203
209
 
204
 
  >>> upgrade_dir = 'ubuntutest/dists/breezy-autotest/main/i18n'
205
 
  >>> target_dir = os.path.join(archive_dir, upgrade_dir)
 
210
    >>> upgrade_dir = 'ubuntutest/dists/breezy-autotest/main/i18n'
 
211
    >>> target_dir = os.path.join(archive_dir, upgrade_dir)
206
212
 
207
213
We simply decompress the contents of the tarball, the files follow
208
214
the format:
211
217
 
212
218
We have only used uncompressed files for tests:
213
219
 
214
 
  >>> dir_list = os.listdir(target_dir)
215
 
  >>> for filename in sorted(dir_list):
216
 
  ...    content = open(os.path.join(target_dir, filename), 'rb').read()
217
 
  ...    print filename, len(content)
218
 
  Translation-bn 0
219
 
  Translation-ca 0
220
 
  Translation-en 16
221
 
  Translation-pt_BR 15
 
220
    >>> dir_list = os.listdir(target_dir)
 
221
    >>> for filename in sorted(dir_list):
 
222
    ...    content = open(os.path.join(target_dir, filename), 'rb').read()
 
223
    ...    print filename, len(content)
 
224
    Translation-bn 0
 
225
    Translation-ca 0
 
226
    Translation-en 16
 
227
    Translation-pt_BR 15
222
228
 
223
229
** Note that a incomming directory inside the tarball "i18n" directory
224
230
was skipped by the DDTP processor
228
234
know as "partial update" and will save some storage when fixing specific
229
235
language indexes or adding new ones:
230
236
 
231
 
  >>> insecure_policy = getPolicy(
232
 
  ...     name='insecure', distro='ubuntutest', distroseries=None)
 
237
    >>> insecure_policy = getPolicy(
 
238
    ...     name='insecure', distro='ubuntutest', distroseries=None)
233
239
 
234
 
  >>> upload = NascentUpload.from_changesfile_path(
235
 
  ...     datadir('ddtp-tarball/translations-main_20060817_all.changes'),
236
 
  ...     insecure_policy, DevNullLogger())
237
 
  >>> upload.process()
238
 
  >>> upload.is_rejected
239
 
  False
240
 
  >>> success = upload.do_accept()
241
 
  >>> success
242
 
  True
 
240
    >>> upload = NascentUpload.from_changesfile_path(
 
241
    ...     datadir('ddtp-tarball/translations-main_20060817_all.changes'),
 
242
    ...     insecure_policy, DevNullLogger())
 
243
    >>> upload.process()
 
244
    >>> upload.is_rejected
 
245
    False
 
246
    >>> success = upload.do_accept()
 
247
    >>> success
 
248
    True
243
249
 
244
250
 
245
251
We need to commit the transaction to be able to use the librarian files.
246
252
 
247
 
  >>> flush_database_updates()
248
 
  >>> transaction.commit()
 
253
    >>> flush_database_updates()
 
254
    >>> transaction.commit()
249
255
 
250
256
 
251
257
Our archive uses `dsync` to replace identical files by hard link in
254
260
 
255
261
Create a hard link to "bn" package file.
256
262
 
257
 
  >>> src = os.path.join(target_dir, 'Translation-ca')
258
 
  >>> dest = os.path.join(target_dir, 'Translation-bn')
259
 
  >>> os.remove(dest)
260
 
  >>> os.link(src, dest)
 
263
    >>> src = os.path.join(target_dir, 'Translation-ca')
 
264
    >>> dest = os.path.join(target_dir, 'Translation-bn')
 
265
    >>> os.remove(dest)
 
266
    >>> os.link(src, dest)
261
267
 
262
 
  >>> os.path.exists(dest)
263
 
  True
264
 
  >>> os.stat(dest).st_nlink
265
 
  2
266
 
  >>> os.stat(src).st_nlink
267
 
  2
 
268
    >>> os.path.exists(dest)
 
269
    True
 
270
    >>> os.stat(dest).st_nlink
 
271
    2
 
272
    >>> os.stat(src).st_nlink
 
273
    2
268
274
 
269
275
 
270
276
Retrieve and publish new custom upload:
271
277
 
272
 
  >>> queue_item = breezy_autotest.getQueueItems(
273
 
  ...      status=PackageUploadStatus.ACCEPTED)[0]
 
278
    >>> queue_item = breezy_autotest.getQueueItems(
 
279
    ...      status=PackageUploadStatus.ACCEPTED)[0]
274
280
 
275
 
  >>> pub_records = queue_item.realiseUpload()
 
281
    >>> pub_records = queue_item.realiseUpload()
276
282
 
277
283
 
278
284
Check if there is new content for "bn" index:
279
285
 
280
 
  >>> dir_list = os.listdir(target_dir)
281
 
  >>> for filename in sorted(dir_list):
282
 
  ...    content = open(os.path.join(target_dir, filename), 'rb').read()
283
 
  ...    print filename, len(content)
284
 
  Translation-bn 22
285
 
  Translation-ca 0
286
 
  Translation-en 16
287
 
  Translation-pt_BR 15
 
286
    >>> dir_list = os.listdir(target_dir)
 
287
    >>> for filename in sorted(dir_list):
 
288
    ...    content = open(os.path.join(target_dir, filename), 'rb').read()
 
289
    ...    print filename, len(content)
 
290
    Translation-bn 22
 
291
    Translation-ca 0
 
292
    Translation-en 16
 
293
    Translation-pt_BR 15
288
294
 
289
295
 
290
296
Check if the contents of "ca" were not affected by the "bn" contents
291
297
(this would happen if "bn" was not removed, left as hard link):
292
298
 
293
 
  >>> open(os.path.join(target_dir, 'Translation-bn')).read()
294
 
  'hardlinks are bad !!!\n'
 
299
    >>> open(os.path.join(target_dir, 'Translation-bn')).read()
 
300
    'hardlinks are bad !!!\n'
295
301
 
296
 
  >>> open(os.path.join(target_dir, 'Translation-ca')).read()
297
 
  ''
 
302
    >>> open(os.path.join(target_dir, 'Translation-ca')).read()
 
303
    ''
298
304
 
299
305
Remove the directory to keep the test working.
300
306
 
301
 
  >>> import shutil
302
 
  >>> shutil.rmtree(target_dir)
303
 
 
304
 
 
305
 
 
 
307
    >>> import shutil
 
308
    >>> shutil.rmtree(target_dir)